velocious 1.0.643 → 1.0.645
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -10
- package/build/authorization/ability.js +36 -13
- package/build/background-jobs/adapter.js +9 -0
- package/build/background-jobs/main.js +35 -10
- package/build/background-jobs/store.js +217 -38
- package/build/background-jobs/types.js +15 -0
- package/build/configuration-types.js +1 -1
- package/build/configuration.js +45 -9
- package/build/database/drivers/base-column.js +8 -0
- package/build/database/drivers/mssql/sql/update.js +1 -3
- package/build/database/drivers/mysql/sql/update.js +1 -3
- package/build/database/drivers/pgsql/column.js +22 -0
- package/build/database/drivers/pgsql/sql/update.js +1 -3
- package/build/database/drivers/sqlite/sql/alter-table.js +11 -1
- package/build/database/drivers/sqlite/sql/update.js +1 -3
- package/build/database/query/index.js +2 -2
- package/build/database/query/model-class-query.js +26 -10
- package/build/database/query/preloader/has-many.js +4 -1
- package/build/database/query/query-data.js +2 -1
- package/build/database/query/update-base.js +14 -0
- package/build/database/query/with-count.js +3 -1
- package/build/database/record/acts-as-list.js +37 -13
- package/build/database/record/attachments/store.js +336 -26
- package/build/database/record/auditing.js +6 -3
- package/build/database/record/index.js +197 -42
- package/build/database/record/instance-relationships/belongs-to.js +2 -1
- package/build/database/record/validators/uniqueness.js +8 -5
- package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +24 -8
- package/build/frontend-model-controller.js +136 -53
- package/build/frontend-model-resource/base-resource.js +87 -37
- package/build/frontend-model-resource/velocious-attachment-resource.js +98 -31
- package/build/frontend-models/base.js +307 -59
- package/build/frontend-models/preloader.js +6 -3
- package/build/frontend-models/query.js +15 -6
- package/build/frontend-models/resource-definition.js +21 -2
- package/build/frontend-models/use-destroyed-event.js +1 -1
- package/build/frontend-models/use-model-class-event.js +2 -2
- package/build/frontend-models/use-updated-event.js +1 -1
- package/build/frontend-models/websocket-channel.js +256 -93
- package/build/frontend-models/websocket-publishers.js +218 -18
- package/build/http-server/client/websocket-session.js +13 -1
- package/build/http-server/websocket-channel.js +15 -2
- package/build/src/authorization/ability.d.ts +9 -3
- package/build/src/authorization/ability.d.ts.map +1 -1
- package/build/src/authorization/ability.js +33 -14
- package/build/src/background-jobs/adapter.d.ts +6 -0
- package/build/src/background-jobs/adapter.d.ts.map +1 -1
- package/build/src/background-jobs/adapter.js +9 -1
- package/build/src/background-jobs/main.d.ts +6 -0
- package/build/src/background-jobs/main.d.ts.map +1 -1
- package/build/src/background-jobs/main.js +34 -11
- package/build/src/background-jobs/store.d.ts +66 -12
- package/build/src/background-jobs/store.d.ts.map +1 -1
- package/build/src/background-jobs/store.js +191 -35
- package/build/src/background-jobs/types.d.ts +55 -0
- package/build/src/background-jobs/types.d.ts.map +1 -1
- package/build/src/background-jobs/types.js +16 -1
- package/build/src/configuration-types.d.ts +3 -3
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +2 -2
- package/build/src/configuration.d.ts +18 -8
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +38 -7
- package/build/src/database/drivers/base-column.d.ts +5 -0
- package/build/src/database/drivers/base-column.d.ts.map +1 -1
- package/build/src/database/drivers/base-column.js +8 -1
- package/build/src/database/drivers/mssql/sql/update.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/sql/update.js +2 -4
- package/build/src/database/drivers/mysql/sql/update.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/sql/update.js +2 -4
- package/build/src/database/drivers/pgsql/column.d.ts +5 -0
- package/build/src/database/drivers/pgsql/column.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/column.js +19 -1
- package/build/src/database/drivers/pgsql/sql/update.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/sql/update.js +2 -4
- package/build/src/database/drivers/sqlite/sql/alter-table.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/sql/alter-table.js +6 -2
- package/build/src/database/drivers/sqlite/sql/update.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/sql/update.js +2 -4
- package/build/src/database/query/index.d.ts +4 -4
- package/build/src/database/query/index.d.ts.map +1 -1
- package/build/src/database/query/index.js +3 -3
- package/build/src/database/query/model-class-query.d.ts +8 -2
- package/build/src/database/query/model-class-query.d.ts.map +1 -1
- package/build/src/database/query/model-class-query.js +25 -11
- package/build/src/database/query/preloader/has-many.d.ts.map +1 -1
- package/build/src/database/query/preloader/has-many.js +4 -2
- package/build/src/database/query/query-data.d.ts.map +1 -1
- package/build/src/database/query/query-data.js +3 -2
- package/build/src/database/query/update-base.d.ts +7 -0
- package/build/src/database/query/update-base.d.ts.map +1 -1
- package/build/src/database/query/update-base.js +13 -1
- package/build/src/database/query/with-count.d.ts.map +1 -1
- package/build/src/database/query/with-count.js +3 -2
- package/build/src/database/record/acts-as-list.d.ts.map +1 -1
- package/build/src/database/record/acts-as-list.js +35 -14
- package/build/src/database/record/attachments/store.d.ts +67 -0
- package/build/src/database/record/attachments/store.d.ts.map +1 -1
- package/build/src/database/record/attachments/store.js +301 -25
- package/build/src/database/record/auditing.d.ts.map +1 -1
- package/build/src/database/record/auditing.js +7 -4
- package/build/src/database/record/index.d.ts +78 -26
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +171 -42
- package/build/src/database/record/instance-relationships/belongs-to.d.ts.map +1 -1
- package/build/src/database/record/instance-relationships/belongs-to.js +3 -2
- package/build/src/database/record/validators/uniqueness.d.ts.map +1 -1
- package/build/src/database/record/validators/uniqueness.js +8 -6
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +4 -4
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +24 -12
- package/build/src/frontend-model-controller.d.ts +29 -8
- package/build/src/frontend-model-controller.d.ts.map +1 -1
- package/build/src/frontend-model-controller.js +122 -51
- package/build/src/frontend-model-resource/base-resource.d.ts +51 -24
- package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
- package/build/src/frontend-model-resource/base-resource.js +83 -37
- package/build/src/frontend-model-resource/velocious-attachment-resource.d.ts +45 -26
- package/build/src/frontend-model-resource/velocious-attachment-resource.d.ts.map +1 -1
- package/build/src/frontend-model-resource/velocious-attachment-resource.js +89 -31
- package/build/src/frontend-models/base.d.ts +53 -20
- package/build/src/frontend-models/base.d.ts.map +1 -1
- package/build/src/frontend-models/base.js +275 -59
- package/build/src/frontend-models/preloader.d.ts.map +1 -1
- package/build/src/frontend-models/preloader.js +6 -4
- package/build/src/frontend-models/query.d.ts +2 -2
- package/build/src/frontend-models/query.d.ts.map +1 -1
- package/build/src/frontend-models/query.js +14 -7
- package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
- package/build/src/frontend-models/resource-definition.js +20 -3
- package/build/src/frontend-models/use-destroyed-event.d.ts +1 -1
- package/build/src/frontend-models/use-destroyed-event.d.ts.map +1 -1
- package/build/src/frontend-models/use-destroyed-event.js +2 -2
- package/build/src/frontend-models/use-model-class-event.d.ts +2 -2
- package/build/src/frontend-models/use-model-class-event.d.ts.map +1 -1
- package/build/src/frontend-models/use-model-class-event.js +3 -3
- package/build/src/frontend-models/use-updated-event.d.ts +1 -1
- package/build/src/frontend-models/use-updated-event.d.ts.map +1 -1
- package/build/src/frontend-models/use-updated-event.js +2 -2
- package/build/src/frontend-models/websocket-channel.d.ts +60 -41
- package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
- package/build/src/frontend-models/websocket-channel.js +225 -85
- package/build/src/frontend-models/websocket-publishers.d.ts +9 -0
- package/build/src/frontend-models/websocket-publishers.d.ts.map +1 -1
- package/build/src/frontend-models/websocket-publishers.js +190 -19
- package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
- package/build/src/http-server/client/websocket-session.js +11 -2
- package/build/src/http-server/websocket-channel.d.ts +20 -8
- package/build/src/http-server/websocket-channel.d.ts.map +1 -1
- package/build/src/http-server/websocket-channel.js +15 -3
- package/build/src/sync/assets/cache.d.ts +288 -0
- package/build/src/sync/assets/cache.d.ts.map +1 -0
- package/build/src/sync/assets/cache.js +883 -0
- package/build/src/sync/assets/types.d.ts +199 -0
- package/build/src/sync/assets/types.d.ts.map +1 -0
- package/build/src/sync/assets/types.js +56 -0
- package/build/src/sync/sync-api-client.d.ts.map +1 -1
- package/build/src/sync/sync-api-client.js +4 -3
- package/build/src/sync/sync-client.d.ts.map +1 -1
- package/build/src/sync/sync-client.js +3 -2
- package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
- package/build/src/sync/sync-envelope-replay-service.js +6 -5
- package/build/src/sync/sync-publisher.d.ts.map +1 -1
- package/build/src/sync/sync-publisher.js +4 -3
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts +2 -2
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts.map +1 -1
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.js +3 -3
- package/build/src/testing/test-profiler.d.ts +4 -4
- package/build/src/testing/test-profiler.d.ts.map +1 -1
- package/build/src/testing/test-profiler.js +3 -3
- package/build/src/testing/test-runner.d.ts +279 -117
- package/build/src/testing/test-runner.d.ts.map +1 -1
- package/build/src/testing/test-runner.js +503 -933
- package/build/src/testing/test.d.ts +11 -72
- package/build/src/testing/test.d.ts.map +1 -1
- package/build/src/testing/test.js +131 -284
- package/build/src/testing/velocious-attempt-executor.d.ts +54 -0
- package/build/src/testing/velocious-attempt-executor.d.ts.map +1 -0
- package/build/src/testing/velocious-attempt-executor.js +408 -0
- package/build/src/testing/velocious-runner-reporter.d.ts +67 -0
- package/build/src/testing/velocious-runner-reporter.d.ts.map +1 -0
- package/build/src/testing/velocious-runner-reporter.js +240 -0
- package/build/src/testing/velocious-suite-hook-executor.d.ts +19 -0
- package/build/src/testing/velocious-suite-hook-executor.d.ts.map +1 -0
- package/build/src/testing/velocious-suite-hook-executor.js +41 -0
- package/build/src/testing/velocious-test-arguments.d.ts +39 -0
- package/build/src/testing/velocious-test-arguments.d.ts.map +1 -0
- package/build/src/testing/velocious-test-arguments.js +55 -0
- package/build/src/utils/model-primary-key.d.ts +73 -0
- package/build/src/utils/model-primary-key.d.ts.map +1 -0
- package/build/src/utils/model-primary-key.js +144 -0
- package/build/src/utils/sha256-bytes-hex.d.ts +7 -0
- package/build/src/utils/sha256-bytes-hex.d.ts.map +1 -0
- package/build/src/utils/sha256-bytes-hex.js +117 -0
- package/build/src/utils/sha256-hex.d.ts +2 -4
- package/build/src/utils/sha256-hex.d.ts.map +1 -1
- package/build/src/utils/sha256-hex.js +6 -120
- package/build/sync/assets/cache.js +998 -0
- package/build/sync/assets/types.js +62 -0
- package/build/sync/sync-api-client.js +3 -2
- package/build/sync/sync-client.js +2 -1
- package/build/sync/sync-envelope-replay-service.js +5 -4
- package/build/sync/sync-publisher.js +3 -2
- package/build/testing/browser-frontend-model-event-hook-scenarios.js +2 -2
- package/build/testing/test-profiler.js +2 -2
- package/build/testing/test-runner.js +496 -990
- package/build/testing/test.js +164 -306
- package/build/testing/velocious-attempt-executor.js +441 -0
- package/build/testing/velocious-runner-reporter.js +264 -0
- package/build/testing/velocious-suite-hook-executor.js +43 -0
- package/build/testing/velocious-test-arguments.js +64 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/utils/model-primary-key.js +171 -0
- package/build/utils/sha256-bytes-hex.js +132 -0
- package/build/utils/sha256-hex.js +7 -135
- package/package.json +5 -4
- package/src/authorization/ability.js +36 -13
- package/src/background-jobs/adapter.js +9 -0
- package/src/background-jobs/main.js +35 -10
- package/src/background-jobs/store.js +217 -38
- package/src/background-jobs/types.js +15 -0
- package/src/configuration-types.js +1 -1
- package/src/configuration.js +45 -9
- package/src/database/drivers/base-column.js +8 -0
- package/src/database/drivers/mssql/sql/update.js +1 -3
- package/src/database/drivers/mysql/sql/update.js +1 -3
- package/src/database/drivers/pgsql/column.js +22 -0
- package/src/database/drivers/pgsql/sql/update.js +1 -3
- package/src/database/drivers/sqlite/sql/alter-table.js +11 -1
- package/src/database/drivers/sqlite/sql/update.js +1 -3
- package/src/database/query/index.js +2 -2
- package/src/database/query/model-class-query.js +26 -10
- package/src/database/query/preloader/has-many.js +4 -1
- package/src/database/query/query-data.js +2 -1
- package/src/database/query/update-base.js +14 -0
- package/src/database/query/with-count.js +3 -1
- package/src/database/record/acts-as-list.js +37 -13
- package/src/database/record/attachments/store.js +336 -26
- package/src/database/record/auditing.js +6 -3
- package/src/database/record/index.js +197 -42
- package/src/database/record/instance-relationships/belongs-to.js +2 -1
- package/src/database/record/validators/uniqueness.js +8 -5
- package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +24 -8
- package/src/frontend-model-controller.js +136 -53
- package/src/frontend-model-resource/base-resource.js +87 -37
- package/src/frontend-model-resource/velocious-attachment-resource.js +98 -31
- package/src/frontend-models/base.js +307 -59
- package/src/frontend-models/preloader.js +6 -3
- package/src/frontend-models/query.js +15 -6
- package/src/frontend-models/resource-definition.js +21 -2
- package/src/frontend-models/use-destroyed-event.js +1 -1
- package/src/frontend-models/use-model-class-event.js +2 -2
- package/src/frontend-models/use-updated-event.js +1 -1
- package/src/frontend-models/websocket-channel.js +256 -93
- package/src/frontend-models/websocket-publishers.js +218 -18
- package/src/http-server/client/websocket-session.js +13 -1
- package/src/http-server/websocket-channel.js +15 -2
- package/src/sync/assets/cache.js +998 -0
- package/src/sync/assets/types.js +62 -0
- package/src/sync/sync-api-client.js +3 -2
- package/src/sync/sync-client.js +2 -1
- package/src/sync/sync-envelope-replay-service.js +5 -4
- package/src/sync/sync-publisher.js +3 -2
- package/src/testing/browser-frontend-model-event-hook-scenarios.js +2 -2
- package/src/testing/test-profiler.js +2 -2
- package/src/testing/test-runner.js +496 -990
- package/src/testing/test.js +164 -306
- package/src/testing/velocious-attempt-executor.js +441 -0
- package/src/testing/velocious-runner-reporter.js +264 -0
- package/src/testing/velocious-suite-hook-executor.js +43 -0
- package/src/testing/velocious-test-arguments.js +64 -0
- package/src/utils/model-primary-key.js +171 -0
- package/src/utils/sha256-bytes-hex.js +132 -0
- package/src/utils/sha256-hex.js +7 -135
- package/build/src/testing/testing-package-adapter.d.ts +0 -9
- package/build/src/testing/testing-package-adapter.d.ts.map +0 -1
- package/build/src/testing/testing-package-adapter.js +0 -69
- package/build/testing/testing-package-adapter.js +0 -76
- package/src/testing/testing-package-adapter.js +0 -76
|
@@ -3,6 +3,7 @@ import Configuration from "../configuration.js";
|
|
|
3
3
|
import { isBooleanColumnType } from "../database/column-types.js";
|
|
4
4
|
import Logger from "../logger.js";
|
|
5
5
|
import { captureRemoteRequestContext, mergeRemoteRequestContext } from "../remote-request-context.js";
|
|
6
|
+
import { scalarModelPrimaryKey } from "../utils/model-primary-key.js";
|
|
6
7
|
import restArgsError from "../utils/rest-args-error.js";
|
|
7
8
|
import VelociousWebsocketClient from "../http-client/websocket-client.js";
|
|
8
9
|
import { serializedScopeFromQuery } from "./query-scope.js";
|
|
@@ -1109,7 +1110,7 @@ function derivedSyncAttributes({ modelClass, resourceType }) {
|
|
|
1109
1110
|
/** @type {string[]} */
|
|
1110
1111
|
const localOnlyAttributes = [];
|
|
1111
1112
|
if (modelClass.hasPrimaryKey()) {
|
|
1112
|
-
const primaryKeyColumn = modelClass.primaryKey();
|
|
1113
|
+
const primaryKeyColumn = scalarModelPrimaryKey(modelClass.primaryKey(), `Derived sync attributes for ${resourceType}`);
|
|
1113
1114
|
localOnlyAttributes.push(columnNameToAttributeName[primaryKeyColumn] || primaryKeyColumn);
|
|
1114
1115
|
}
|
|
1115
1116
|
for (const columnName of modelClass.getColumnNames()) {
|
|
@@ -1186,4 +1187,4 @@ export function syncClient(configuration = Configuration.current()) {
|
|
|
1186
1187
|
export async function sync(query) {
|
|
1187
1188
|
return await SyncClient.current().sync(query);
|
|
1188
1189
|
}
|
|
1189
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3luYy9zeW5jLWNsaWVudC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxhQUFhLE1BQU0scUJBQXFCLENBQUE7QUFDL0MsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sNkJBQTZCLENBQUE7QUFDL0QsT0FBTyxNQUFNLE1BQU0sY0FBYyxDQUFBO0FBQ2pDLE9BQU8sRUFBQywyQkFBMkIsRUFBRSx5QkFBeUIsRUFBQyxNQUFNLDhCQUE4QixDQUFBO0FBQ25HLE9BQU8sYUFBYSxNQUFNLDZCQUE2QixDQUFBO0FBQ3ZELE9BQU8sd0JBQXdCLE1BQU0sb0NBQW9DLENBQUE7QUFFekUsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFDekQsT0FBTyxhQUFhLE1BQU0sc0JBQXNCLENBQUE7QUFDaEQsT0FBTyxrQkFBa0IsTUFBTSwyQkFBMkIsQ0FBQTtBQUMxRCxPQUFPLGNBQWMsTUFBTSx1QkFBdUIsQ0FBQTtBQUNsRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQTtBQUVqRixJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUE7QUFFckIsc0ZBQXNGO0FBQ3RGLE1BQU0sc0JBQXNCLEdBQUcsRUFBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBQyxDQUFBO0FBRXRHOzs7OztvREFLb0Q7QUFDcEQsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQTtBQUV2RCxrR0FBa0c7QUFDbEcsTUFBTSxpQ0FBaUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLENBQUMsQ0FBQTtBQUV4RixNQUFNLDBCQUEwQixHQUFHO0lBQ2pDLFNBQVM7SUFDVCxxQkFBcUI7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QUE7UUFDdEosQ0FBQztRQUVELE9BQU8sTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDOUIsQ0FBQyxDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDLE9BQU8sRUFBRTtJQUNoRSxJQUFJLE1BQU0sR0FBRywwQkFBMEIsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7SUFFMUQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osTUFBTSxHQUFHLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUNwRCwwQkFBMEIsQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ3JELE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQTtJQUNyQixDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsSUFBSSxDQUFDLEtBQUs7SUFDOUIsT0FBTyxNQUFNLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDL0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgQ29uZmlndXJhdGlvbiBmcm9tIFwiLi4vY29uZmlndXJhdGlvbi5qc1wiXG5pbXBvcnQge2lzQm9vbGVhbkNvbHVtblR5cGV9IGZyb20gXCIuLi9kYXRhYmFzZS9jb2x1bW4tdHlwZXMuanNcIlxuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vbG9nZ2VyLmpzXCJcbmltcG9ydCB7Y2FwdHVyZVJlbW90ZVJlcXVlc3RDb250ZXh0LCBtZXJnZVJlbW90ZVJlcXVlc3RDb250ZXh0fSBmcm9tIFwiLi4vcmVtb3RlLXJlcXVlc3QtY29udGV4dC5qc1wiXG5pbXBvcnQgcmVzdEFyZ3NFcnJvciBmcm9tIFwiLi4vdXRpbHMvcmVzdC1hcmdzLWVycm9yLmpzXCJcbmltcG9ydCBWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnQgZnJvbSBcIi4uL2h0dHAtY2xpZW50L3dlYnNvY2tldC1jbGllbnQuanNcIlxuXG5pbXBvcnQge3NlcmlhbGl6ZWRTY29wZUZyb21RdWVyeX0gZnJvbSBcIi4vcXVlcnktc2NvcGUuanNcIlxuaW1wb3J0IFN5bmNBcGlDbGllbnQgZnJvbSBcIi4vc3luYy1hcGktY2xpZW50LmpzXCJcbmltcG9ydCBTeW5jUmVhbHRpbWVCcmlkZ2UgZnJvbSBcIi4vc3luYy1yZWFsdGltZS1icmlkZ2UuanNcIlxuaW1wb3J0IFN5bmNTY29wZVN0b3JlIGZyb20gXCIuL3N5bmMtc2NvcGUtc3RvcmUuanNcIlxuaW1wb3J0IHtjdXJyZW50U3luY0NsaWVudCwgc2V0Q3VycmVudFN5bmNDbGllbnR9IGZyb20gXCIuL3N5bmMtY2xpZW50LXJlZ2lzdHJ5LmpzXCJcblxubGV0IGNsaWVudENvdW50ZXIgPSAwXG5cbi8qKiBAdHlwZSB7e2NyZWF0ZTogXCJhZnRlckNyZWF0ZVwiLCB1cGRhdGU6IFwiYWZ0ZXJVcGRhdGVcIiwgZGVzdHJveTogXCJhZnRlckRlc3Ryb3lcIn19ICovXG5jb25zdCBUUkFDS0VEX0NBTExCQUNLX05BTUVTID0ge2NyZWF0ZTogXCJhZnRlckNyZWF0ZVwiLCBkZXN0cm95OiBcImFmdGVyRGVzdHJveVwiLCB1cGRhdGU6IFwiYWZ0ZXJVcGRhdGVcIn1cblxuLyoqXG4gKiBPcGVyYXRpb25zIHRyYWNrZWQgYnkgZGVmYXVsdCBmb3IgbW9kZWxzIGRlY2xhcmluZyBgc3RhdGljIHN5bmNgIHdpdGhvdXQgYVxuICogYHRyYWNrYCBrZXk6IGxvY2FsIGNyZWF0ZXMgYW5kIHVwZGF0ZXMgcXVldWUgYXV0b21hdGljYWxseS4gRGVzdHJveXMgYXJlIG5vdFxuICogdHJhY2tlZCBieSBkZWZhdWx0IGJlY2F1c2UgYSBsb2NhbCBkZXN0cm95IGlzIG9mdGVuIGNhY2hlIGV2aWN0aW9uIHJhdGhlclxuICogdGhhbiBhIHNlcnZlciBkZWxldGU7IG9wdCBpbiB3aXRoIGB0cmFjazogdHJ1ZWAgb3IgYW4gb3BlcmF0aW9ucyBsaXN0LlxuICogQHR5cGUge0FycmF5PFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCI+fSAqL1xuY29uc3QgREVGQVVMVF9UUkFDS0VEX09QRVJBVElPTlMgPSBbXCJjcmVhdGVcIiwgXCJ1cGRhdGVcIl1cblxuLyoqIEF0dHJpYnV0ZSBuYW1lcyB0cmVhdGVkIGFzIGNsaWVudC1sb2NhbCBzeW5jIGJvb2trZWVwaW5nIHdoZW4gZGVyaXZpbmcgbG9jYWxPbmx5QXR0cmlidXRlcy4gKi9cbmNvbnN0IExPQ0FMX0JPT0tLRUVQSU5HX0FUVFJJQlVURV9OQU1FUyA9IFtcImNyZWF0ZWRBdFwiLCBcInVwZGF0ZWRBdFwiLCBcImxhc3RTeW5jQ2hhbmdlQXRcIl1cblxuY29uc3QgU1lOQ19SRVFVRVNUX1JFU0VSVkVEX0tFWVMgPSBbXG4gIFwiYWZ0ZXJJZFwiLFxuICBcImFmdGVyU2VydmVyU2VxdWVuY2VcIixcbiAgXCJhZnRlclVwZGF0ZWRBdFwiLFxuICBcImF1dGhlbnRpY2F0aW9uVG9rZW5cIixcbiAgXCJsaW1pdFwiLFxuICBcInNjb3BlXCIsXG4gIFwic3luY3NcIixcbiAgXCJ1cHN0cmVhbVJlZnJlc2hcIixcbiAgXCJ1cFRvSWRcIixcbiAgXCJ1cFRvU2VydmVyU2VxdWVuY2VcIixcbiAgXCJ1cFRvVXBkYXRlZEF0XCJcbl1cblxuLyoqIEB0eXBlIHtXZWFrTWFwPENvbmZpZ3VyYXRpb24sIFN5bmNDbGllbnQ+fSAqL1xuY29uc3Qgc3luY0NsaWVudHNCeUNvbmZpZ3VyYXRpb24gPSBuZXcgV2Vha01hcCgpXG5cbi8qKlxuICogRGVjbGFyYXRpdmUgY2xpZW50LXNpZGUgc3luYyBkcml2ZXIuXG4gKlxuICogRXZlcnl0aGluZyBpcyBkZXJpdmVkIGZyb20gdGhlIGFwcCdzIFZlbG9jaW91cyBjb25maWd1cmF0aW9uOiBtb2RlbHMgZGVjbGFyZVxuICogYHN0YXRpYyBzeW5jYCwgdHJhbnNwb3J0L2F1dGgvY29ubmVjdGl2aXR5IGNvbWUgZnJvbSB0aGUgYHN5bmMuY2xpZW50YFxuICogY29uZmlndXJhdGlvbiBibG9jaywgYW5kIFZlbG9jaW91cyBvd25zIHNjb3BlIHBlcnNpc3RlbmNlLCBwZXItc2NvcGUgY3Vyc29ycyxcbiAqIHB1bGwgcGFnaW5nL2FwcGx5LCBsb2NhbCBxdWV1ZWluZywgYW5kIG9ubGluZS1nYXRlZCByZXBsYXkuIERlY2xhcmUgc3luY1xuICogaW50ZXJlc3QgZnJvbSBxdWVyaWVzOlxuICpcbiAqICAgICBhd2FpdCBzeW5jQ2xpZW50KCkuc3RhcnQoKVxuICogICAgIGF3YWl0IHN5bmNDbGllbnQoKS5zeW5jKEV2ZW50LndoZXJlKHtwYXJ0bmVySWR9KSlcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3luY0NsaWVudCB7XG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIHN5bmMgY2xpZW50IGJ5IGRlcml2aW5nIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgYXBwJ3MgVmVsb2Npb3VzXG4gICAqIGNvbmZpZ3VyYXRpb246IGV2ZXJ5IHJlZ2lzdGVyZWQgbW9kZWwgZGVjbGFyaW5nIGBzdGF0aWMgc3luY2AgYmVjb21lcyBhXG4gICAqIHJlc291cmNlIHdpdGggYm9vbGVhbkF0dHJpYnV0ZXMgZGVyaXZlZCBmcm9tIGNvbHVtbiB0eXBlcyBhbmRcbiAgICogbG9jYWxPbmx5QXR0cmlidXRlcyBkZXJpdmVkIGZyb20gdGhlIHByaW1hcnkga2V5LCBjcmVhdGVkQXQvdXBkYXRlZEF0LCBhbmRcbiAgICogc3luYyBib29ra2VlcGluZyBjb2x1bW5zOyB0aGUgcGVuZGluZy1zeW5jIG1vZGVsIGlzIHRoZSByZWdpc3RlcmVkIFwiU3luY1wiXG4gICAqIG1vZGVsOyB0cmFuc3BvcnQsIGF1dGgsIGNvbm5lY3Rpdml0eSwgYW5kIGVycm9yIHJlcG9ydGluZyBjb21lIGZyb20gdGhlXG4gICAqIGBzeW5jLmNsaWVudGAgY29uZmlndXJhdGlvbiBibG9jaywgd2l0aCB0aGUgZnJhbWV3b3JrIG93bmluZyB0aGVcbiAgICogYCR7bW91bnRQYXRofS9jaGFuZ2VzYCBhbmQgYCR7bW91bnRQYXRofS9yZXBsYXlgIFBPU1RlcnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50T3B0aW9uc30gW29wdGlvbnNdIC0gT3B0aW9uYWwgb3ZlcnJpZGVzLlxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qge2NvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0aW9uLmN1cnJlbnQoKSwgZGF0YWJhc2VJZGVudGlmaWVyLCBsZWdhY3lDdXJzb3IsIHJlcXVlc3RDb250ZXh0LCBzY29wZVN0b3JlLCBzeW5jTW9kZWwsIHRlbmFudEhhbmRsZSwgLi4ucmVzdE9wdGlvbnN9ID0gb3B0aW9uc1xuXG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0T3B0aW9ucylcblxuICAgIGNvbnN0IGNsaWVudENvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uLmdldFN5bmNDb25maWd1cmF0aW9uKCkuY2xpZW50XG4gICAgY29uc3QgY2FwdHVyZWRSZXF1ZXN0Q29udGV4dCA9IGNhcHR1cmVSZW1vdGVSZXF1ZXN0Q29udGV4dChyZXF1ZXN0Q29udGV4dCwge1xuICAgICAgbGFiZWw6IFwiU3luYyBjbGllbnQgcmVxdWVzdCBjb250ZXh0XCIsXG4gICAgICByZXNlcnZlZEtleXM6IFNZTkNfUkVRVUVTVF9SRVNFUlZFRF9LRVlTXG4gICAgfSlcblxuICAgIGlmICghY2xpZW50Q29uZmlndXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY0NsaWVudCByZXF1aXJlcyBhIHN5bmMuY2xpZW50IGNvbmZpZ3VyYXRpb24gYmxvY2s6IG5ldyBDb25maWd1cmF0aW9uKHtzeW5jOiB7Y2xpZW50OiB7YXV0aGVudGljYXRpb25Ub2tlbiwgdHJhbnNwb3J0fX19KVwiKVxuICAgIH1cblxuICAgIGlmIChCb29sZWFuKHRlbmFudEhhbmRsZSkgIT09IEJvb2xlYW4oZGF0YWJhc2VJZGVudGlmaWVyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY0NsaWVudCB0ZW5hbnRIYW5kbGUgYW5kIGRhdGFiYXNlSWRlbnRpZmllciBtdXN0IGJlIHByb3ZpZGVkIHRvZ2V0aGVyXCIpXG4gICAgfVxuICAgIGlmICh0ZW5hbnRIYW5kbGUpIHtcbiAgICAgIHRlbmFudEhhbmRsZS5hc3NlcnRDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pXG4gICAgICB0ZW5hbnRIYW5kbGUuZGF0YWJhc2VDb25maWd1cmF0aW9uKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGF0YWJhc2VJZGVudGlmaWVyKSlcbiAgICB9XG5cbiAgICBjb25zdCBtb2RlbENsYXNzZXMgPSBjb25maWd1cmF0aW9uLmdldE1vZGVsQ2xhc3NlcygpXG4gICAgY29uc3QgcmVzb2x2ZWRTeW5jTW9kZWwgPSBzeW5jTW9kZWwgfHwgbW9kZWxDbGFzc2VzLlN5bmNcbiAgICBjb25zdCBkYXRhYmFzZUlkZW50aXR5ID0gdGVuYW50SGFuZGxlID8gdGVuYW50SGFuZGxlLmRhdGFiYXNlSWRlbnRpdHkoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkYXRhYmFzZUlkZW50aWZpZXIpKSA6IG51bGxcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudFJlc291cmNlQ29uZmlnPn0gKi9cbiAgICBjb25zdCByZXNvdXJjZXMgPSB7fVxuXG4gICAgZm9yIChjb25zdCBtb2RlbENsYXNzIG9mIE9iamVjdC52YWx1ZXMobW9kZWxDbGFzc2VzKSkge1xuICAgICAgaWYgKCFtb2RlbENsYXNzLnN5bmMpIGNvbnRpbnVlXG4gICAgICBpZiAodGVuYW50SGFuZGxlICYmIG1vZGVsQ2xhc3MuZ2V0RGF0YWJhc2VJZGVudGlmaWVyKHt0ZW5hbnQ6IHRlbmFudEhhbmRsZS50ZW5hbnQoKX0pICE9PSBkYXRhYmFzZUlkZW50aWZpZXIpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IG1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKClcblxuICAgICAgY29uc3QgbWV0YWRhdGFNb2RlbENsYXNzID0gdGVuYW50SGFuZGxlXG4gICAgICAgID8gdGVuYW50SGFuZGxlLm1ldGFkYXRhTW9kZWxDbGFzcyh7ZGF0YWJhc2VJZGVudGlmaWVyOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKGRhdGFiYXNlSWRlbnRpZmllciksIG1vZGVsQ2xhc3N9KVxuICAgICAgICA6IG1vZGVsQ2xhc3NcbiAgICAgIGNvbnN0IHJlc291cmNlQ29uZmlnID0gcmVzb3VyY2VDb25maWdGcm9tU3luY0RlY2xhcmF0aW9uKHtkZWNsYXJhdGlvbjogbW9kZWxDbGFzcy5zeW5jLCBtZXRhZGF0YU1vZGVsQ2xhc3MsIG1vZGVsQ2xhc3MsIHJlc291cmNlVHlwZX0pXG5cbiAgICAgIGlmIChkYXRhYmFzZUlkZW50aXR5ICYmIHJlc291cmNlQ29uZmlnLmNvbmZsaWN0VHJhY2tpbmcpIHtcbiAgICAgICAgcmVzb3VyY2VDb25maWcuY29uZmxpY3RUcmFja2luZyA9IHtcbiAgICAgICAgICAuLi5yZXNvdXJjZUNvbmZpZy5jb25mbGljdFRyYWNraW5nLFxuICAgICAgICAgIG11dGF0aW9uTG9nOiByZXNvdXJjZUNvbmZpZy5jb25mbGljdFRyYWNraW5nLm11dGF0aW9uTG9nLnBhcnRpdGlvbihkYXRhYmFzZUlkZW50aXR5KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlc291cmNlc1tyZXNvdXJjZVR5cGVdID0gcmVzb3VyY2VDb25maWdcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXMocmVzb3VyY2VzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN5bmNDbGllbnQgZm91bmQgbm8gcmVnaXN0ZXJlZCBtb2RlbHMgZGVjbGFyaW5nIHN0YXRpYyBzeW5jIC0gZGVjbGFyZSBgc3RhdGljIHN5bmMgPSB0cnVlYCAob3IgYSBzeW5jIGRlY2xhcmF0aW9uIG9iamVjdCkgb24gdGhlIG1vZGVscyB0aGF0IHNob3VsZCBzeW5jXCIpXG4gICAgfVxuXG4gICAgaWYgKCFyZXNvbHZlZFN5bmNNb2RlbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY0NsaWVudCByZXF1aXJlcyBhIHJlZ2lzdGVyZWQgXFxcIlN5bmNcXFwiIG1vZGVsIGZvciBwZW5kaW5nIGxvY2FsIHN5bmMgcm93cyAob3IgcGFzcyBvcHRpb25zLnN5bmNNb2RlbClcIilcbiAgICB9XG4gICAgaWYgKHRlbmFudEhhbmRsZSAmJiByZXNvbHZlZFN5bmNNb2RlbC5nZXREYXRhYmFzZUlkZW50aWZpZXIoe3RlbmFudDogdGVuYW50SGFuZGxlLnRlbmFudCgpfSkgIT09IGRhdGFiYXNlSWRlbnRpZmllcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTeW5jQ2xpZW50IHN5bmMgbW9kZWwgZG9lcyBub3QgdXNlIHRlbmFudCBkYXRhYmFzZSAke0pTT04uc3RyaW5naWZ5KGRhdGFiYXNlSWRlbnRpZmllcil9YClcbiAgICB9XG5cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudENvbmZpZ30gKi9cbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIGF1dGhlbnRpY2F0aW9uVG9rZW46IGNsaWVudENvbmZpZ3VyYXRpb24uYXV0aGVudGljYXRpb25Ub2tlbixcbiAgICAgIGJhdGNoU2l6ZTogY2xpZW50Q29uZmlndXJhdGlvbi5iYXRjaFNpemUsXG4gICAgICBjb25maWd1cmF0aW9uLFxuICAgICAgZGF0YWJhc2VJZGVudGlmaWVyLFxuICAgICAgaXNPbmxpbmU6IGNsaWVudENvbmZpZ3VyYXRpb24uaXNPbmxpbmUsXG4gICAgICBsZWdhY3lDdXJzb3IsXG4gICAgICBvbkVycm9yOiBjbGllbnRDb25maWd1cmF0aW9uLm9uRXJyb3IsXG4gICAgICBwb3N0Q2hhbmdlczogdHJhbnNwb3J0UG9zdGVyKHtwYXRoOiBgJHtjbGllbnRDb25maWd1cmF0aW9uLm1vdW50UGF0aH0vY2hhbmdlc2AsIHJlcXVlc3RDb250ZXh0OiBjYXB0dXJlZFJlcXVlc3RDb250ZXh0LCB0cmFuc3BvcnQ6IGNsaWVudENvbmZpZ3VyYXRpb24udHJhbnNwb3J0fSksXG4gICAgICBwb3N0UmVwbGF5OiB0cmFuc3BvcnRQb3N0ZXIoe3BhdGg6IGAke2NsaWVudENvbmZpZ3VyYXRpb24ubW91bnRQYXRofS9yZXBsYXlgLCByZXF1ZXN0Q29udGV4dDogY2FwdHVyZWRSZXF1ZXN0Q29udGV4dCwgdHJhbnNwb3J0OiBjbGllbnRDb25maWd1cmF0aW9uLnRyYW5zcG9ydH0pLFxuICAgICAgcmVhbHRpbWU6IGNsaWVudENvbmZpZ3VyYXRpb24ucmVhbHRpbWUsXG4gICAgICByZXF1ZXN0Q29udGV4dDogY2FwdHVyZWRSZXF1ZXN0Q29udGV4dCxcbiAgICAgIHJlc291cmNlcyxcbiAgICAgIHN5bmNNb2RlbDogcmVzb2x2ZWRTeW5jTW9kZWwsXG4gICAgICB0ZW5hbnRIYW5kbGUsXG4gICAgICB3ZWJzb2NrZXRDbGllbnQ6IGNsaWVudENvbmZpZ3VyYXRpb24ud2Vic29ja2V0Q2xpZW50LFxuICAgICAgd2Vic29ja2V0VXJsOiBjbGllbnRDb25maWd1cmF0aW9uLndlYnNvY2tldFVybFxuICAgIH1cbiAgICB0aGlzLl9jbGllbnROdW1iZXIgPSArK2NsaWVudENvdW50ZXJcbiAgICB0aGlzLl9kYXRhYmFzZUlkZW50aXR5ID0gZGF0YWJhc2VJZGVudGl0eVxuICAgIHRoaXMuX3RlbmFudFNjaGVtYUdlbmVyYXRpb24gPSB0ZW5hbnRIYW5kbGVcbiAgICAgID8gdGVuYW50SGFuZGxlLmluc3BlY3Qoe2RhdGFiYXNlSWRlbnRpZmllcjogLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkYXRhYmFzZUlkZW50aWZpZXIpfSkuc2NoZW1hR2VuZXJhdGlvblxuICAgICAgOiBudWxsXG4gICAgLyoqIEB0eXBlIHtTeW5jUmVhbHRpbWVCcmlkZ2UgfCBudWxsfSAqL1xuICAgIHRoaXMuX3JlYWx0aW1lQnJpZGdlID0gbnVsbFxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50U2hhcmVkQ29ubmVjdGlvbiB8IG51bGwgfCB1bmRlZmluZWR9IFNoYXJlZCBhcHAtbGlmZXRpbWUgd2Vic29ja2V0IGNvbm5lY3Rpb24gKHVuZGVmaW5lZCB1bnRpbCBmaXJzdCByZXNvbHZlZCwgbnVsbCB3aGVuIG5vbmUgaXMgY29uZmlndXJlZCkuICovXG4gICAgdGhpcy5fc3luY0Nvbm5lY3Rpb24gPSB1bmRlZmluZWRcbiAgICAvKiogQHR5cGUge1Byb21pc2U8dm9pZD4gfCBudWxsfSAqL1xuICAgIHRoaXMuX3N1YnNjcmliZVVzZXJTY29wZVByb21pc2UgPSBudWxsXG4gICAgLyoqIEB0eXBlIHtcInN1YnNjcmliZWRcIiB8IFwic3Vic2NyaWJpbmdcIiB8IFwidW5zdWJzY3JpYmVkXCJ9ICovXG4gICAgdGhpcy5fdXNlclNjb3BlU3RhdGUgPSBcInVuc3Vic2NyaWJlZFwiXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3N5bmMtc2NvcGUtc3RvcmUuanNcIikuZGVmYXVsdCB8IG51bGx9ICovXG4gICAgdGhpcy5fc2NvcGVTdG9yZSA9IHNjb3BlU3RvcmUgfHwgbnVsbFxuICAgIC8qKiBAdHlwZSB7UHJvbWlzZTx2b2lkPiB8IG51bGx9ICovXG4gICAgdGhpcy5fc2NoZWR1bGVkUmVwbGF5ID0gbnVsbFxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1Jlc291cmNlQ29uZmlnPiB8IG51bGx9ICovXG4gICAgdGhpcy5fcHVsbFJlc291cmNlQ29uZmlncyA9IG51bGxcbiAgICAvKiogQHR5cGUge0FycmF5PHtjYWxsYmFjazogKHJlY29yZDogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkLCBjYWxsYmFja05hbWU6IFwiYWZ0ZXJDcmVhdGVcIiB8IFwiYWZ0ZXJVcGRhdGVcIiB8IFwiYWZ0ZXJEZXN0cm95XCIgfCBcImJlZm9yZVVwZGF0ZVwiIHwgXCJiZWZvcmVEZXN0cm95XCIsIG1vZGVsQ2xhc3M6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fT59ICovXG4gICAgdGhpcy5fdHJhY2tlZENhbGxiYWNrcyA9IFtdXG4gICAgLyoqIEB0eXBlIHtXZWFrU2V0PG9iamVjdD59ICovXG4gICAgdGhpcy5fcmVtb3RlQXBwbHlSZWNvcmRzID0gbmV3IFdlYWtTZXQoKVxuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgbnVtYmVyPn0gKi9cbiAgICB0aGlzLl9yZW1vdGVHZW5lcmF0aW9ucyA9IG5ldyBNYXAoKVxuICAgIC8qKiBAdHlwZSB7V2Vha01hcDxvYmplY3QsIEFycmF5PHN0cmluZyB8IG51bWJlciB8IG51bGw+Pn0gKi9cbiAgICB0aGlzLl9jYXB0dXJlZEJhc2VWZXJzaW9ucyA9IG5ldyBXZWFrTWFwKClcbiAgICB0aGlzLl93aXRob3V0VHJhY2tpbmdEZXB0aCA9IDBcbiAgICAvKiogQHR5cGUge0xvZ2dlciB8IHtlcnJvcjogKC4uLm1lc3NhZ2VzOiBBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4pID0+IFByb21pc2U8dm9pZD59IHwgbnVsbH0gKi9cbiAgICB0aGlzLl9sb2dnZXIgPSBudWxsXG4gICAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGF1dG9tYXRpYyBtdXRhdGlvbiB0cmFja2luZyBmb3IgZXZlcnkgZGVjbGFyZWQgcmVzb3VyY2UgKG9uIGJ5XG4gICAqIGRlZmF1bHQ6IGxvY2FsIGNyZWF0ZXMgYW5kIHVwZGF0ZXMgcXVldWUgcGVuZGluZyBzeW5jIHJvd3Mgb25jZSB0aGVpclxuICAgKiB0cmFuc2FjdGlvbiBjb21taXRzIGFuZCBzY2hlZHVsZSBhbiBpbW1lZGlhdGUgcmVwbGF5IGF0dGVtcHQsIHdpdGhvdXRcbiAgICogYXBwLXNpZGUgcXVldWUgY2FsbHMpLiBgdHJhY2s6IGZhbHNlYCByZXNvdXJjZXMgYXJlIHNraXBwZWQ7IGB0cmFjazogdHJ1ZWBcbiAgICogYWRkcyBkZXN0cm95czsgYW4gb3BlcmF0aW9ucyBsaXN0IG5hcnJvd3MgdGhlIHRyYWNrZWQgb3BlcmF0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdGFydCgpIHtcbiAgICB0aGlzLmFzc2VydFRlbmFudFJlYWR5KClcbiAgICBpZiAodGhpcy5fc3RhcnRlZCkgcmV0dXJuXG5cbiAgICB0aGlzLl9zdGFydGVkID0gdHJ1ZVxuXG4gICAgZm9yIChjb25zdCBbcmVzb3VyY2VUeXBlLCByZXNvdXJjZUNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5jb25maWcucmVzb3VyY2VzKSkge1xuICAgICAgY29uc3Qgb3BlcmF0aW9ucyA9IHRoaXMudHJhY2tlZE9wZXJhdGlvbnMoe3Jlc291cmNlQ29uZmlnLCByZXNvdXJjZVR5cGV9KVxuXG4gICAgICBpZiAocmVzb3VyY2VDb25maWcuY29uZmxpY3RUcmFja2luZykge1xuICAgICAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBvcGVyYXRpb25zLmZpbHRlcigoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUgIT09IFwiY3JlYXRlXCIpKSB7XG4gICAgICAgICAgY29uc3QgY2FsbGJhY2tOYW1lID0gb3BlcmF0aW9uID09PSBcImRlc3Ryb3lcIiA/IFwiYmVmb3JlRGVzdHJveVwiIDogXCJiZWZvcmVVcGRhdGVcIlxuICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gKC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59ICovIHJlY29yZCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLm93bnNSZWNvcmQocmVjb3JkKSkgcmV0dXJuXG4gICAgICAgICAgICBpZiAodGhpcy5pc1RyYWNraW5nU3VwcHJlc3NlZChyZWNvcmQpKSByZXR1cm5cblxuICAgICAgICAgICAgY29uc3QgY2FwdHVyZWRWZXJzaW9ucyA9IHRoaXMuX2NhcHR1cmVkQmFzZVZlcnNpb25zLmdldChyZWNvcmQpIHx8IFtdXG5cbiAgICAgICAgICAgIGNhcHR1cmVkVmVyc2lvbnMucHVzaCh0aGlzLnByZU11dGF0aW9uQmFzZVZlcnNpb25Gb3Ioe29wZXJhdGlvbiwgcmVjb3JkLCByZXNvdXJjZUNvbmZpZ30pKVxuICAgICAgICAgICAgdGhpcy5fY2FwdHVyZWRCYXNlVmVyc2lvbnMuc2V0KHJlY29yZCwgY2FwdHVyZWRWZXJzaW9ucylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvdXJjZUNvbmZpZy5tb2RlbENsYXNzW2NhbGxiYWNrTmFtZV0oY2FsbGJhY2spXG4gICAgICAgICAgdGhpcy5fdHJhY2tlZENhbGxiYWNrcy5wdXNoKHtjYWxsYmFjaywgY2FsbGJhY2tOYW1lLCBtb2RlbENsYXNzOiByZXNvdXJjZUNvbmZpZy5tb2RlbENsYXNzfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBvcGVyYXRpb25zKSB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrTmFtZSA9IFRSQUNLRURfQ0FMTEJBQ0tfTkFNRVNbb3BlcmF0aW9uXVxuICAgICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMudHJhY2tlZE11dGF0aW9uQ2FsbGJhY2soe29wZXJhdGlvbiwgcmVzb3VyY2VDb25maWd9KVxuXG4gICAgICAgIHJlc291cmNlQ29uZmlnLm1vZGVsQ2xhc3NbY2FsbGJhY2tOYW1lXShjYWxsYmFjaylcbiAgICAgICAgdGhpcy5fdHJhY2tlZENhbGxiYWNrcy5wdXNoKHtjYWxsYmFjaywgY2FsbGJhY2tOYW1lLCBtb2RlbENsYXNzOiByZXNvdXJjZUNvbmZpZy5tb2RlbENsYXNzfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYWxsIHRyYWNraW5nIGNhbGxiYWNrcyAodGVzdHMsIHNpZ24tb3V0LCBob3QgcmVsb2FkKS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzdG9wKCkge1xuICAgIGZvciAoY29uc3Qge2NhbGxiYWNrLCBjYWxsYmFja05hbWUsIG1vZGVsQ2xhc3N9IG9mIHRoaXMuX3RyYWNrZWRDYWxsYmFja3MpIHtcbiAgICAgIG1vZGVsQ2xhc3MudW5yZWdpc3RlckxpZmVjeWNsZUNhbGxiYWNrKGNhbGxiYWNrTmFtZSwgY2FsbGJhY2spXG4gICAgfVxuXG4gICAgdGhpcy5fdHJhY2tlZENhbGxiYWNrcyA9IFtdXG4gICAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYW5kIHZhbGlkYXRlcyB0aGUgdHJhY2tlZCBvcGVyYXRpb25zIGZvciBhIHJlc291cmNlIGNvbmZpZy5cbiAgICogVHJhY2tpbmcgaXMgb24gYnkgZGVmYXVsdDogbW9kZWxzIGRlY2xhcmluZyBgc3RhdGljIHN5bmNgIHdpdGhvdXQgYSBgdHJhY2tgXG4gICAqIGtleSBxdWV1ZSBsb2NhbCBjcmVhdGVzIGFuZCB1cGRhdGVzIGF1dG9tYXRpY2FsbHk7IGB0cmFjazogZmFsc2VgIG9wdHMgYVxuICAgKiBtb2RlbCBvdXQgKGZvciBtb2RlbHMgd3JpdHRlbiBieSBub24tdXNlciBmbG93cykuXG4gICAqIEBwYXJhbSB7e3Jlc291cmNlQ29uZmlnOiBpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRSZXNvdXJjZUNvbmZpZywgcmVzb3VyY2VUeXBlOiBzdHJpbmd9fSBhcmdzIC0gUmVzb3VyY2UgY29uZmlnIGFuZCBuYW1lLlxuICAgKiBAcmV0dXJucyB7QXJyYXk8XCJjcmVhdGVcIiB8IFwidXBkYXRlXCIgfCBcImRlc3Ryb3lcIj59IFRyYWNrZWQgb3BlcmF0aW9ucy5cbiAgICovXG4gIHRyYWNrZWRPcGVyYXRpb25zKHtyZXNvdXJjZUNvbmZpZywgcmVzb3VyY2VUeXBlfSkge1xuICAgIGNvbnN0IHRyYWNrID0gcmVzb3VyY2VDb25maWcudHJhY2tcblxuICAgIGlmICh0cmFjayA9PT0gZmFsc2UpIHJldHVybiBbXVxuICAgIGlmICh0cmFjayA9PT0gdW5kZWZpbmVkKSByZXR1cm4gREVGQVVMVF9UUkFDS0VEX09QRVJBVElPTlNcbiAgICBpZiAodHJhY2sgPT09IHRydWUpIHJldHVybiBbXCJjcmVhdGVcIiwgXCJ1cGRhdGVcIiwgXCJkZXN0cm95XCJdXG5cbiAgICBpZiAoIXRyYWNrIHx8IHR5cGVvZiB0cmFjayAhPT0gXCJvYmplY3RcIiB8fCAhQXJyYXkuaXNBcnJheSh0cmFjay5vcGVyYXRpb25zKSB8fCB0cmFjay5vcGVyYXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTeW5jQ2xpZW50IHJlc291cmNlICR7cmVzb3VyY2VUeXBlfSB0cmFjayBtdXN0IGJlIHRydWUgb3Ige29wZXJhdGlvbnM6IFsuLi5dfWApXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2YgdHJhY2sub3BlcmF0aW9ucykge1xuICAgICAgaWYgKCEob3BlcmF0aW9uIGluIFRSQUNLRURfQ0FMTEJBQ0tfTkFNRVMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU3luY0NsaWVudCByZXNvdXJjZSAke3Jlc291cmNlVHlwZX0gdHJhY2sub3BlcmF0aW9ucyBtdXN0IGJlIGNyZWF0ZS91cGRhdGUvZGVzdHJveSwgZ290OiAke1N0cmluZyhvcGVyYXRpb24pfWApXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYWNrLm9wZXJhdGlvbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGxpZmVjeWNsZSBjYWxsYmFjayBxdWV1ZWluZyBvbmUgdHJhY2tlZCBtdXRhdGlvbi4gVGhlIHF1ZXVlZFxuICAgKiBwYXlsb2FkIGFuZCBzeW5jIHR5cGUgYXJlIHNuYXBzaG90dGVkIGF0IG11dGF0aW9uLWNhbGxiYWNrIHRpbWUsIHNvXG4gICAqIGFmdGVyU2F2ZSBob29rcyBhc3NpZ25pbmcgdW5zYXZlZCBhdHRyaWJ1dGVzIChvciBhbnkgbGF0ZXIgZHJpZnQgb24gdGhlXG4gICAqIHJlY29yZCkgY2Fubm90IGNoYW5nZSB3aGF0IGdldHMgcXVldWVkIHZzIHdoYXQgd2FzIGNvbW1pdHRlZC4gUXVldWVpbmcgaXNcbiAgICogZGVmZXJyZWQgdGhyb3VnaCB0aGUgbW9kZWwgY29ubmVjdGlvbidzIGFmdGVyQ29tbWl0IGhvb2sgc28gaXQgb25seSBydW5zXG4gICAqIG9uY2UgdGhlIG11dGF0aW9uJ3MgdHJhbnNhY3Rpb24gaGFzIGNvbW1pdHRlZCAoaW1tZWRpYXRlbHkgd2hlbiBub1xuICAgKiB0cmFuc2FjdGlvbiBpcyBvcGVuKSAtIHF1ZXVlZCBzeW5jcyBuZXZlciByZWZlcmVuY2Ugcm9sbGVkLWJhY2sgcm93cy5cbiAgICogUG9zdC1jb21taXQgcXVldWUgZmFpbHVyZXMgYXJlIHJlcG9ydGVkIHdpdGhvdXQgcmV0aHJvd2luZyBpbnRvIHRoZVxuICAgKiBkcml2ZXIncyBhZnRlckNvbW1pdCBjaGFpbiAoc2VlIHJlcG9ydEFmdGVyQ29tbWl0RXJyb3IpLlxuICAgKiBAcGFyYW0ge3tvcGVyYXRpb246IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIsIHJlc291cmNlQ29uZmlnOiBpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRSZXNvdXJjZUNvbmZpZ319IGFyZ3MgLSBPcGVyYXRpb24gYW5kIHJlc291cmNlIGNvbmZpZy5cbiAgICogQHJldHVybnMgeyhyZWNvcmQ6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+KSA9PiBQcm9taXNlPHZvaWQ+fSBMaWZlY3ljbGUgY2FsbGJhY2suXG4gICAqL1xuICB0cmFja2VkTXV0YXRpb25DYWxsYmFjayh7b3BlcmF0aW9uLCByZXNvdXJjZUNvbmZpZ30pIHtcbiAgICByZXR1cm4gYXN5bmMgKHJlY29yZCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLm93bnNSZWNvcmQocmVjb3JkKSkgcmV0dXJuXG4gICAgICBpZiAodGhpcy5pc1RyYWNraW5nU3VwcHJlc3NlZChyZWNvcmQpKSByZXR1cm5cblxuICAgICAgY29uc3QgZGF0YSA9IFN5bmNBcGlDbGllbnQucXVldWVkU3luY0RhdGEoe1xuICAgICAgICBib29sZWFuQXR0cmlidXRlczogcmVzb3VyY2VDb25maWcuYm9vbGVhbkF0dHJpYnV0ZXMgfHwgW10sXG4gICAgICAgIGRhdGE6IHJlc291cmNlQ29uZmlnLnRyYWNrZWREYXRhID8gcmVzb3VyY2VDb25maWcudHJhY2tlZERhdGEoe29wZXJhdGlvbiwgcmVjb3JkfSkgOiB1bmRlZmluZWQsXG4gICAgICAgIGxvY2FsT25seUF0dHJpYnV0ZXM6IHJlc291cmNlQ29uZmlnLmxvY2FsT25seUF0dHJpYnV0ZXMgfHwgW10sXG4gICAgICAgIHJlc291cmNlOiByZWNvcmRcbiAgICAgIH0pXG4gICAgICBjb25zdCBzeW5jVHlwZSA9IHRoaXMuZGVmYXVsdFN5bmNUeXBlKHtvcGVyYXRpb24sIHJlY29yZCwgcmVzb3VyY2VDb25maWd9KVxuICAgICAgY29uc3QgYmFzZVZlcnNpb24gPSByZXNvdXJjZUNvbmZpZy5jb25mbGljdFRyYWNraW5nXG4gICAgICAgID8gdGhpcy5jYXB0dXJlZEJhc2VWZXJzaW9uRm9yKHtvcGVyYXRpb24sIHJlY29yZCwgcmVzb3VyY2VDb25maWd9KVxuICAgICAgICA6IG51bGxcbiAgICAgIGNvbnN0IGRhdGFiYXNlT3BlcmF0aW9uID0gcmVjb3JkLmRhdGFiYXNlT3BlcmF0aW9uKClcbiAgICAgIGNvbnN0IG9wZXJhdGlvblNjb3BlID0gZGF0YWJhc2VPcGVyYXRpb25cbiAgICAgICAgPyBkYXRhYmFzZU9wZXJhdGlvbi5mb3JNb2RlbCh0aGlzLmNvbmZpZy5zeW5jTW9kZWwpXG4gICAgICAgIDogdGhpcy5jb25maWcuc3luY01vZGVsXG5cbiAgICAgIGF3YWl0IHJlY29yZC5jb25uZWN0aW9uKCkuYWZ0ZXJDb21taXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChyZXNvdXJjZUNvbmZpZy5jb25mbGljdFRyYWNraW5nKSB7XG4gICAgICAgICAgICBhd2FpdCBTeW5jQXBpQ2xpZW50LnF1ZXVlQ29uZmxpY3RUcmFja2VkU3luYyh7XG4gICAgICAgICAgICAgIGJhc2VWZXJzaW9uLFxuICAgICAgICAgICAgICBjb25mbGljdFRyYWNraW5nOiByZXNvdXJjZUNvbmZpZy5jb25mbGljdFRyYWNraW5nLFxuICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICBvcGVyYXRpb24sXG4gICAgICAgICAgICAgIHJlc291cmNlOiByZWNvcmQsXG4gICAgICAgICAgICAgIHJlc291cmNlVHlwZTogcmVjb3JkLmNvbnN0cnVjdG9yLmdldE1vZGVsTmFtZSgpLFxuICAgICAgICAgICAgICBzeW5jVHlwZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgU3luY0FwaUNsaWVudC5xdWV1ZUxvY2FsU3luYyh7ZGF0YSwgcmVzb3VyY2U6IHJlY29yZCwgc3luY01vZGVsOiBvcGVyYXRpb25TY29wZSwgc3luY1R5cGV9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlcG9ydEFmdGVyQ29tbWl0RXJyb3IoLyoqIEB0eXBlIHtFcnJvcn0gKi8gKGVycm9yKSlcblxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zY2hlZHVsZVJlcGxheSgpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnRzIGEgcG9zdC1jb21taXQgdHJhY2tlZC1xdWV1ZWluZyBmYWlsdXJlLiBUaGUgdHJhbnNhY3Rpb24gaGFzIGFscmVhZHlcbiAgICogY29tbWl0dGVkIHdoZW4gYWZ0ZXJDb21taXQgY2FsbGJhY2tzIHJ1biwgc28gcmV0aHJvd2luZyBoZXJlIHdvdWxkIHBvaXNvblxuICAgKiB0aGUgZHJpdmVyJ3MgYXdhaXRlZCBhZnRlckNvbW1pdCBjaGFpbiAoYnJlYWtpbmcgdW5yZWxhdGVkIGNhbGxiYWNrcykgLVxuICAgKiBpbnN0ZWFkIHRoZSBmYWlsdXJlIGdvZXMgdG8gdGhlIGNvbmZpZ3VyZWQgc3luYy5jbGllbnQub25FcnJvciBob29rLCBvciBpc1xuICAgKiBsb2dnZWQgbG91ZGx5IHRocm91Z2ggdGhlIGNsaWVudCdzIGxvZ2dlciB3aGVuIG5vbmUgaXMgY29uZmlndXJlZC5cbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBQb3N0LWNvbW1pdCBxdWV1ZWluZyBmYWlsdXJlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHJlcG9ydEFmdGVyQ29tbWl0RXJyb3IoZXJyb3IpIHtcbiAgICBpZiAodGhpcy5jb25maWcub25FcnJvcikge1xuICAgICAgdGhpcy5jb25maWcub25FcnJvcihlcnJvcilcblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5sb2dnZXIoKS5lcnJvcihcIlN5bmNDbGllbnQgZmFpbGVkIHRvIHF1ZXVlIGEgdHJhY2tlZCBtdXRhdGlvbiBhZnRlciBjb21taXRcIiwgZXJyb3IpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGF6aWx5IGJ1aWx0IGNsaWVudCBsb2dnZXIuXG4gICAqIEByZXR1cm5zIHtMb2dnZXIgfCB7ZXJyb3I6ICguLi5tZXNzYWdlczogQXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+KSA9PiBQcm9taXNlPHZvaWQ+fX0gQ2xpZW50IGxvZ2dlci5cbiAgICovXG4gIGxvZ2dlcigpIHtcbiAgICB0aGlzLl9sb2dnZXIgfHw9IG5ldyBMb2dnZXIoXCJTeW5jQ2xpZW50XCIsIHtjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZy5jb25maWd1cmF0aW9ufSlcblxuICAgIHJldHVybiB0aGlzLl9sb2dnZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgcmVjb3JkIGlzIGN1cnJlbnRseSBiZWluZyB3cml0dGVuIGJ5IHB1bGwtYXBwbHkgKGVjaG8gc3VwcHJlc3Npb24pLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSByZWNvcmQgLSBMb2NhbCBtb2RlbCByZWNvcmQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSByZWNvcmQgd3JpdGUgb3JpZ2luYXRlcyBmcm9tIGEgcmVtb3RlIGNoYW5nZS5cbiAgICovXG4gIGlzUmVtb3RlQXBwbHkocmVjb3JkKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlbW90ZUFwcGx5UmVjb3Jkcy5oYXMocmVjb3JkKVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdHJhY2tlZCBtdXRhdGlvbiBxdWV1ZWluZyBpcyBjdXJyZW50bHkgc3VwcHJlc3NlZCBmb3IgYSByZWNvcmQ6XG4gICAqIGVpdGhlciB0aGUgcmVjb3JkIHdhcyBtYXJrZWQgYXMgYSByZW1vdGUgYXBwbHkgKGBtYXJrUmVtb3RlQXBwbHlgLCB1c2VkIGJ5XG4gICAqIHB1bGwgYW5kIHJlYWx0aW1lIGFwcGxpZXMpIG9yIGEgYHdpdGhvdXRUcmFja2luZ2AgY2FsbGJhY2sgaXMgcnVubmluZyBvblxuICAgKiB0aGlzIGNsaWVudC5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gcmVjb3JkIC0gTG9jYWwgbW9kZWwgcmVjb3JkLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0cmFja2VkIHF1ZXVlaW5nIGlzIHN1cHByZXNzZWQgZm9yIHRoZSByZWNvcmQuXG4gICAqL1xuICBpc1RyYWNraW5nU3VwcHJlc3NlZChyZWNvcmQpIHtcbiAgICByZXR1cm4gdGhpcy5fd2l0aG91dFRyYWNraW5nRGVwdGggPiAwIHx8IHRoaXMuaXNSZW1vdGVBcHBseShyZWNvcmQpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhIGNhbGxiYWNrIHdpdGggdHJhY2tlZCBtdXRhdGlvbiBxdWV1ZWluZyBzdXBwcmVzc2VkIG9uIHRoaXMgY2xpZW50IC1cbiAgICogZm9yIGNvZGUgYXBwbHlpbmcgc2VydmVyLW9yaWdpbmF0ZWQgZGF0YSBvdXRzaWRlIHRoZSBkZXJpdmVkIHB1bGwvcmVhbHRpbWVcbiAgICogYXBwbGllcnMgKGxlZ2FjeSBwdWxsIHBhdGhzLCBpbXBvcnRlcnMsIHNpZ24taW4gYmFja2ZpbGxzKSwgc28gdGhlaXIgd3JpdGVzXG4gICAqIGFyZSBub3QgZWNob2VkIGJhY2sgdG8gdGhlIHNlcnZlciBhcyBkZXZpY2UgY2hhbmdlcy4gU3VwcHJlc3Npb24gY292ZXJzIHRoZVxuICAgKiB3aG9sZSBhc3luYyBkdXJhdGlvbiBvZiB0aGUgY2FsbGJhY2sgKG5lc3RlZCBjYWxscyBzdGFjaykgYW5kIGlzXG4gICAqIGNsaWVudC13aWRlIHdoaWxlIGl0IHJ1bnM6IG11dGF0aW9ucyBmcm9tIGNvbmN1cnJlbnRseSBydW5uaW5nIHRhc2tzIGFyZVxuICAgKiBhbHNvIHN1cHByZXNzZWQgZm9yIHRoYXQgd2luZG93LCBzbyBwcmVmZXIgYG1hcmtSZW1vdGVBcHBseShyZWNvcmQpYCB3aGVuXG4gICAqIHdyaXRlcyBmcm9tIG90aGVyIGZsb3dzIGNhbiBpbnRlcmxlYXZlLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8VD4gfCBUfSBjYWxsYmFjayAtIFdvcmsgd2hvc2UgbW9kZWwgd3JpdGVzIHNob3VsZCBub3QgcXVldWUgdHJhY2tlZCBzeW5jcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IFRoZSBjYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBhc3luYyB3aXRob3V0VHJhY2tpbmcoY2FsbGJhY2spIHtcbiAgICB0aGlzLl93aXRob3V0VHJhY2tpbmdEZXB0aCsrXG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKClcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fd2l0aG91dFRyYWNraW5nRGVwdGgtLVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNYXJrcyBvbmUgcmVjb3JkIGFzIGJlaW5nIHdyaXR0ZW4gZnJvbSBzZXJ2ZXItb3JpZ2luYXRlZCBkYXRhIHNvIHRyYWNrZWRcbiAgICogbXV0YXRpb24gcXVldWVpbmcgc2tpcHMgaXQgKHJlY29yZC1wcmVjaXNlIHN1cHByZXNzaW9uKS4gVGhlIGRlcml2ZWQgcHVsbFxuICAgKiBhbmQgcmVhbHRpbWUgYXBwbGllcnMgdXNlIHRoaXMgaW50ZXJuYWxseSBhcm91bmQgZXZlcnkgYXBwbGllZCB3cml0ZS5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gcmVjb3JkIC0gTG9jYWwgbW9kZWwgcmVjb3JkIGFib3V0IHRvIGJlIHdyaXR0ZW4uXG4gICAqIEByZXR1cm5zIHsoKSA9PiB2b2lkfSBSZWxlYXNlIGNhbGxiYWNrIHJlLWVuYWJsaW5nIHRyYWNraW5nIGZvciB0aGUgcmVjb3JkLlxuICAgKi9cbiAgbWFya1JlbW90ZUFwcGx5KHJlY29yZCkge1xuICAgIHRoaXMuX3JlbW90ZUFwcGx5UmVjb3Jkcy5hZGQocmVjb3JkKVxuXG4gICAgcmV0dXJuICgpID0+IHRoaXMuX3JlbW90ZUFwcGx5UmVjb3Jkcy5kZWxldGUocmVjb3JkKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyB0aGlzIGNsaWVudCBhcyB0aGUgYXBwJ3MgY3VycmVudCBzeW5jIGNsaWVudC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXRDdXJyZW50KCkge1xuICAgIHNldEN1cnJlbnRTeW5jQ2xpZW50KHRoaXMpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYXBwJ3MgY3VycmVudCBzeW5jIGNsaWVudC5cbiAgICogQHJldHVybnMge1N5bmNDbGllbnR9IEN1cnJlbnQgc3luYyBjbGllbnQuXG4gICAqL1xuICBzdGF0aWMgY3VycmVudCgpIHtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtTeW5jQ2xpZW50fSAqLyAoY3VycmVudFN5bmNDbGllbnQoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBzeW5jIGNsaWVudCBkZXJpdmVkIGZyb20gdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uIEFsaWFzIGZvclxuICAgKiBgbmV3IFN5bmNDbGllbnQoe2NvbmZpZ3VyYXRpb24sIC4uLm9wdGlvbnN9KWAuXG4gICAqIEBwYXJhbSB7Q29uZmlndXJhdGlvbn0gW2NvbmZpZ3VyYXRpb25dIC0gQ29uZmlndXJhdGlvbiBvd25pbmcgdGhlIHJlZ2lzdGVyZWQgbW9kZWxzIGFuZCB0aGUgc3luYy5jbGllbnQgYmxvY2suIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7T21pdDxpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRPcHRpb25zLCBcImNvbmZpZ3VyYXRpb25cIj59IFtvcHRpb25zXSAtIE9wdGlvbmFsIG92ZXJyaWRlcy5cbiAgICogQHJldHVybnMge1N5bmNDbGllbnR9IFN5bmMgY2xpZW50IGRlcml2ZWQgZnJvbSB0aGUgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN0YXRpYyBmcm9tQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uID0gQ29uZmlndXJhdGlvbi5jdXJyZW50KCksIG9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBuZXcgU3luY0NsaWVudCh7Li4ub3B0aW9ucywgY29uZmlndXJhdGlvbn0pXG4gIH1cblxuICAvKipcbiAgICogRGVjbGFyZXMgKG9yIHJlLWFjdGl2YXRlcykgYSBzeW5jIHNjb3BlIGZyb20gYSBtb2RlbCBxdWVyeSBhbmQgcHVsbHMgaXQgd2hlbiBvbmxpbmUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdDxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IHF1ZXJ5IC0gUXVlcnkgZGVjbGFyaW5nIHRoZSBzeW5jIHNjb3BlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gU3luYyBvcHRpb25zLlxuICAgKiBAcGFyYW0geyhwcm9ncmVzczogaW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1B1bGxQcm9ncmVzcykgPT4gdm9pZH0gW29wdGlvbnMub25Qcm9ncmVzc10gLSBDYWxsZWQgcGVyIGFwcGxpZWQgcGFnZSBvZiB0aGUgcHVsbCB0aGlzIGRlY2xhcmF0aW9uIHRyaWdnZXJzLCBzbyB0aGUgaW5pdGlhbCBpbXBvcnQgb2YgYSBuZXdseSBkZWNsYXJlZCBzY29wZSBjYW4gZHJpdmUgYSBcInN5bmNlZENvdW50IG9mIHRvdGFsXCIgcHJvZ3Jlc3MgYmFyLiBTZWUgYHB1bGwoKWAuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudXBzdHJlYW1SZWZyZXNoXSAtIE1hcmtzIHRoZSBjaGFuZ2VzIHJlcXVlc3QocykgYXMgYSB1c2VyLWluaXRpYXRlZCByZWZyZXNoLCBzbyB0aGUgc2VydmVyIGNhbiBieXBhc3MgdXBzdHJlYW0taW1wb3J0IHRocm90dGxlIHdpbmRvd3MuIFNlZSBgcHVsbCgpYC5cbiAgICogQHJldHVybnMge1Byb21pc2U8e3Njb3BlOiBpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlNlcmlhbGl6ZWRTeW5jU2NvcGUsIHB1bGxlZDogaW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY0NoYW5nZXNSZXN1bHQgfCBudWxsfT59IERlY2xhcmVkIHNjb3BlIGFuZCBwdWxsIHJlc3VsdCAobnVsbCB3aGlsZSBvZmZsaW5lKS5cbiAgICovXG4gIGFzeW5jIHN5bmMocXVlcnksIHtvblByb2dyZXNzLCB1cHN0cmVhbVJlZnJlc2h9ID0ge30pIHtcbiAgICB0aGlzLmFzc2VydFF1ZXJ5T3duZXJzaGlwKHF1ZXJ5KVxuICAgIGNvbnN0IHNjb3BlID0gc2VyaWFsaXplZFNjb3BlRnJvbVF1ZXJ5KHF1ZXJ5KVxuICAgIGNvbnN0IHNjb3BlU3RvcmUgPSB0aGlzLnNjb3BlU3RvcmUoKVxuICAgIGNvbnN0IHNjb3BlUm93ID0gYXdhaXQgc2NvcGVTdG9yZS5maW5kT3JDcmVhdGVTY29wZShzY29wZSlcblxuICAgIGlmICghc2NvcGVSb3cuY3Vyc29yUGF5bG9hZCAmJiB0aGlzLmNvbmZpZy5sZWdhY3lDdXJzb3IpIHtcbiAgICAgIGNvbnN0IGxlZ2FjeUN1cnNvclBheWxvYWQgPSBhd2FpdCB0aGlzLmNvbmZpZy5sZWdhY3lDdXJzb3Ioe3Njb3BlfSlcbiAgICAgIGNvbnN0IGxlZ2FjeUN1cnNvciA9IFN5bmNBcGlDbGllbnQuc3luY0N1cnNvckZyb21QYXlsb2FkKGxlZ2FjeUN1cnNvclBheWxvYWQpXG5cbiAgICAgIGlmIChsZWdhY3lDdXJzb3IpIGF3YWl0IHNjb3BlU3RvcmUuc2F2ZUN1cnNvcihzY29wZVJvdywgbGVnYWN5Q3Vyc29yKVxuICAgIH1cblxuICAgIHJldHVybiB7cHVsbGVkOiBhd2FpdCB0aGlzLnB1bGwoe29uUHJvZ3Jlc3MsIHVwc3RyZWFtUmVmcmVzaH0pLCBzY29wZX1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWFjdGl2YXRlcyB0aGUgc3luYyBzY29wZSBkZWNsYXJlZCBieSBhIG1vZGVsIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHQ8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBxdWVyeSAtIFF1ZXJ5IHdob3NlIHNjb3BlIHNob3VsZCBzdG9wIHN5bmNpbmcuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgdW5zeW5jKHF1ZXJ5KSB7XG4gICAgdGhpcy5hc3NlcnRRdWVyeU93bmVyc2hpcChxdWVyeSlcbiAgICBhd2FpdCB0aGlzLnNjb3BlU3RvcmUoKS5kZWFjdGl2YXRlKHNlcmlhbGl6ZWRTY29wZUZyb21RdWVyeShxdWVyeSkpXG4gIH1cblxuICAvKipcbiAgICogUHVsbHMgY2hhbmdlcyBmb3IgZXZlcnkgYWN0aXZlIHNjb3BlIHdpdGggcGVyLXNjb3BlIGN1cnNvcnMgKHNpbmdsZS1mbGlnaHRlZCwgb25saW5lLWdhdGVkKS5cbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAtIFB1bGwgb3B0aW9ucy5cbiAgICogQHBhcmFtIHsocHJvZ3Jlc3M6IGltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNQdWxsUHJvZ3Jlc3MpID0+IHZvaWR9IFtvcHRpb25zLm9uUHJvZ3Jlc3NdIC0gQ2FsbGVkIHBlciBhcHBsaWVkIHBhZ2Ugd2l0aCBjdW11bGF0aXZlIGB7cGFnZXMsIHN5bmNlZENvdW50LCB0b3RhbH1gIGFjcm9zcyB0aGUgcHVsbGVkIHNjb3BlcywgZm9yIHJlbmRlcmluZyBhIFwic3luY2VkQ291bnQgb2YgdG90YWxcIiBwcm9ncmVzcyBiYXIgKGUuZy4gYSBmdWxsLWltcG9ydCBzY3JlZW4pLiBPcHRpb25hbDsgb21pdHRpbmcgaXQga2VlcHMgdGhlIGV4aXN0aW5nIGJlaGF2aW9yLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnVwc3RyZWFtUmVmcmVzaF0gLSBTZW5kcyBgdXBzdHJlYW1SZWZyZXNoOiB0cnVlYCBvbiB0aGUgY2hhbmdlcyByZXF1ZXN0KHMpLCB0ZWxsaW5nIHRoZSBzZXJ2ZXIgdGhpcyBwdWxsIGlzIHVzZXItaW5pdGlhdGVkIHNvIGl0IGNhbiBieXBhc3MgdXBzdHJlYW0taW1wb3J0IHRocm90dGxlIHdpbmRvd3MgKHNlZSBkb2NzL3N5bmMtdXBzdHJlYW0taW1wb3J0cy5tZCkuIEJhY2tncm91bmQgcHVsbHMgb21pdCBpdCBhbmQgc3RheSB0aHJvdHRsZWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDaGFuZ2VzUmVzdWx0IHwgbnVsbD59IENvbWJpbmVkIHB1bGwgcmVzdWx0LCBvciBudWxsIHdoaWxlIG9mZmxpbmUuXG4gICAqL1xuICBhc3luYyBwdWxsKHtvblByb2dyZXNzLCB1cHN0cmVhbVJlZnJlc2h9ID0ge30pIHtcbiAgICB0aGlzLmFzc2VydFRlbmFudFJlYWR5KClcbiAgICBpZiAoIShhd2FpdCB0aGlzLmlzT25saW5lKCkpKSByZXR1cm4gbnVsbFxuXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2hhbmdlc1Jlc3VsdCB8IG51bGx9ICovXG4gICAgbGV0IGNvbWJpbmVkUmVzdWx0ID0gbnVsbFxuXG4gICAgYXdhaXQgU3luY0FwaUNsaWVudC5zaW5nbGVGbGlnaHQoYHZlbG9jaW91cy1zeW5jLWNsaWVudC1wdWxsLSR7dGhpcy5fY2xpZW50TnVtYmVyfWAsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGF1dGhlbnRpY2F0aW9uVG9rZW4gPSBhd2FpdCB0aGlzLmNvbmZpZy5hdXRoZW50aWNhdGlvblRva2VuKClcbiAgICAgIGNvbnN0IHNjb3BlU3RvcmUgPSB0aGlzLnNjb3BlU3RvcmUoKVxuICAgICAgY29uc3QgYXBwbHlTeW5jID0gdGhpcy5yZW1vdGVBcHBseVN5bmMoKVxuICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICBjaGFuZ2VkOiBmYWxzZSxcbiAgICAgICAgcGFnZXM6IDAsXG4gICAgICAgIHJlc291cmNlQ2hhbmdlZDogLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBib29sZWFuPn0gKi8gKHt9KSxcbiAgICAgICAgcmVzb3VyY2VDb3VudHM6IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgbnVtYmVyPn0gKi8gKHt9KSxcbiAgICAgICAgc3luY2VkQ291bnQ6IDAsXG4gICAgICAgIHRvdGFsOiAwXG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3Qgc2NvcGVSb3cgb2YgYXdhaXQgc2NvcGVTdG9yZS5hY3RpdmVTY29wZXMoKSkge1xuICAgICAgICAvLyBDdW11bGF0ZSBzY29wZSBwcm9ncmVzcyBvbnRvIHRoZSBjb3VudHMgb2YgdGhlIHNjb3BlcyBhbHJlYWR5IHB1bGxlZCBzbyBhIHNpbmdsZVxuICAgICAgICAvLyBzY29wZSdzIHBlci1wYWdlIHByb2dyZXNzIHJlYWRzIGV4YWN0bHkgaXRzIG93biBjb3VudHMgKGJhc2UgMCksIGFuZCBtdWx0aS1zY29wZVxuICAgICAgICAvLyBwdWxscyByZXBvcnQgYSBydW5uaW5nIGN1bXVsYXRpdmUgdG90YWwgYWNyb3NzIGV2ZXJ5IHNjb3BlLlxuICAgICAgICBjb25zdCBiYXNlUGFnZXMgPSByZXN1bHQucGFnZXNcbiAgICAgICAgY29uc3QgYmFzZVN5bmNlZENvdW50ID0gcmVzdWx0LnN5bmNlZENvdW50XG4gICAgICAgIGNvbnN0IGJhc2VUb3RhbCA9IHJlc3VsdC50b3RhbFxuICAgICAgICBjb25zdCBzY29wZVJlc3VsdCA9IGF3YWl0IFN5bmNBcGlDbGllbnQucHVsbENoYW5nZXMoe1xuICAgICAgICAgIGFwcGx5U3luYyxcbiAgICAgICAgICBhdXRoZW50aWNhdGlvblRva2VuLFxuICAgICAgICAgIGJhdGNoU2l6ZTogdGhpcy5jb25maWcuYmF0Y2hTaXplLFxuICAgICAgICAgIGxvYWRDdXJzb3I6IGFzeW5jICgpID0+IGF3YWl0IHNjb3BlU3RvcmUubG9hZEN1cnNvcihzY29wZVJvdyksXG4gICAgICAgICAgb25Qcm9ncmVzczogb25Qcm9ncmVzcyA/IChwcm9ncmVzcykgPT4gb25Qcm9ncmVzcyh7XG4gICAgICAgICAgICBwYWdlczogYmFzZVBhZ2VzICsgcHJvZ3Jlc3MucGFnZXMsXG4gICAgICAgICAgICBzeW5jZWRDb3VudDogYmFzZVN5bmNlZENvdW50ICsgcHJvZ3Jlc3Muc3luY2VkQ291bnQsXG4gICAgICAgICAgICB0b3RhbDogYmFzZVRvdGFsICsgcHJvZ3Jlc3MudG90YWxcbiAgICAgICAgICB9KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBwb3N0Q2hhbmdlczogYXN5bmMgKHBheWxvYWQpID0+IGF3YWl0IHRoaXMuY29uZmlnLnBvc3RDaGFuZ2VzKHtcbiAgICAgICAgICAgIC4uLnBheWxvYWQsXG4gICAgICAgICAgICAvLyBPbmx5IHRoZSBhbGwtdHlwZXMgc2NvcGUgY2FycmllcyB0aGUgdHlwZSBsaXN0OyBhIHR5cGUtZGVjbGFyZWQgc2NvcGUgbmVlZHMgbm9uZS5cbiAgICAgICAgICAgIHNjb3BlOiB7XG4gICAgICAgICAgICAgIGNvbmRpdGlvbnM6IHNjb3BlUm93LmNvbmRpdGlvbnMsXG4gICAgICAgICAgICAgIHJlc291cmNlVHlwZTogc2NvcGVSb3cucmVzb3VyY2VUeXBlLFxuICAgICAgICAgICAgICAuLi4oc2NvcGVSb3cucmVzb3VyY2VUeXBlID09PSBudWxsID8ge3Jlc291cmNlVHlwZXM6IHRoaXMudXNlclNjb3BlUmVzb3VyY2VUeXBlcygpfSA6IHt9KVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLih1cHN0cmVhbVJlZnJlc2ggPyB7dXBzdHJlYW1SZWZyZXNoOiB0cnVlfSA6IHt9KVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHNhdmVDdXJzb3I6IGFzeW5jIChjdXJzb3IpID0+IGF3YWl0IHNjb3BlU3RvcmUuc2F2ZUN1cnNvcihzY29wZVJvdywgY3Vyc29yKVxuICAgICAgICB9KVxuXG4gICAgICAgIHJlc3VsdC5jaGFuZ2VkIHx8PSBzY29wZVJlc3VsdC5jaGFuZ2VkXG4gICAgICAgIHJlc3VsdC5wYWdlcyArPSBzY29wZVJlc3VsdC5wYWdlc1xuICAgICAgICByZXN1bHQuc3luY2VkQ291bnQgKz0gc2NvcGVSZXN1bHQuc3luY2VkQ291bnRcbiAgICAgICAgcmVzdWx0LnRvdGFsICs9IHNjb3BlUmVzdWx0LnRvdGFsXG5cbiAgICAgICAgZm9yIChjb25zdCBbcmVzb3VyY2VUeXBlLCBjb3VudF0gb2YgT2JqZWN0LmVudHJpZXMoc2NvcGVSZXN1bHQucmVzb3VyY2VDb3VudHMpKSB7XG4gICAgICAgICAgcmVzdWx0LnJlc291cmNlQ291bnRzW3Jlc291cmNlVHlwZV0gPSAocmVzdWx0LnJlc291cmNlQ291bnRzW3Jlc291cmNlVHlwZV0gfHwgMCkgKyBjb3VudFxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgW3Jlc291cmNlVHlwZSwgY2hhbmdlZF0gb2YgT2JqZWN0LmVudHJpZXMoc2NvcGVSZXN1bHQucmVzb3VyY2VDaGFuZ2VkKSkge1xuICAgICAgICAgIHJlc3VsdC5yZXNvdXJjZUNoYW5nZWRbcmVzb3VyY2VUeXBlXSB8fD0gY2hhbmdlZFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbWJpbmVkUmVzdWx0ID0gcmVzdWx0XG4gICAgfSlcblxuICAgIHJldHVybiBjb21iaW5lZFJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZGVyaXZlZCByZW1vdGUtY2hhbmdlIGFwcGxpZXIgc2hhcmVkIGJ5IHB1bGxzIGFuZCByZWFsdGltZSBwdXNoZXM6XG4gICAqIGFwcGxpZXMgdGhyb3VnaCB0aGUgZGVjbGFyZWQgcmVzb3VyY2UgY29uZmlncywgcmVnaXN0ZXJzIGVhY2ggd3JpdHRlbiByZWNvcmRcbiAgICogZm9yIGVjaG8gc3VwcHJlc3Npb24gKHRyYWNrZWQgcmVzb3VyY2VzIGRvIG5vdCByZS1xdWV1ZSBhcHBsaWVkIGNoYW5nZXMpLCBhbmRcbiAgICogZmFpbHMgbG91ZGx5IGluc3RlYWQgb2Ygc2lsZW50bHkgc2tpcHBpbmcgdW5jb25maWd1cmVkIHJlc291cmNlcy5cbiAgICogQHBhcmFtIHt7c291cmNlPzogc3RyaW5nfX0gW2FyZ3NdIC0gRXJyb3IgY29udGV4dCBkZXNjcmliaW5nIHdoZXJlIHRoZSBjaGFuZ2UgY2FtZSBmcm9tLlxuICAgKiBAcmV0dXJucyB7KHN5bmM6IGltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDaGFuZ2VFbnZlbG9wZSkgPT4gUHJvbWlzZTxpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2hhbmdlQXBwbHlSZXN1bHQ+fSBMb3VkIHJlbW90ZS1jaGFuZ2UgYXBwbGllci5cbiAgICovXG4gIHJlbW90ZUFwcGx5U3luYyh7c291cmNlID0gXCJwdWxsZWQgY2hhbmdlXCJ9ID0ge30pIHtcbiAgICByZXR1cm4gYXN5bmMgKHN5bmMpID0+IHtcbiAgICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IHN5bmMucmVzb3VyY2VUeXBlKClcbiAgICAgIGNvbnN0IGNvbmZpZ3VyZWRSZXNvdXJjZSA9IHJlc291cmNlVHlwZSA/IHRoaXMuY29uZmlnLnJlc291cmNlc1tyZXNvdXJjZVR5cGVdIDogdW5kZWZpbmVkXG5cbiAgICAgIGlmICghcmVzb3VyY2VUeXBlIHx8ICFjb25maWd1cmVkUmVzb3VyY2U/LmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBzeW5jIHJlc291cmNlIHdpdGggcHVsbCBhdHRyaWJ1dGVzIGNvbmZpZ3VyZWQgZm9yICR7c291cmNlfTogJHtTdHJpbmcocmVzb3VyY2VUeXBlKX1gKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy53aXRoVGVuYW50T3BlcmF0aW9uKGFzeW5jIChvcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHN5bmMuZGF0YSgpXG4gICAgICAgIGNvbnN0IHZlcnNpb25BdHRyaWJ1dGUgPSB0aGlzLmNvbmZpZy5yZXNvdXJjZXNbcmVzb3VyY2VUeXBlXS5jb25mbGljdFRyYWNraW5nPy52ZXJzaW9uQXR0cmlidXRlXG5cbiAgICAgICAgaWYgKHZlcnNpb25BdHRyaWJ1dGUpIHtcbiAgICAgICAgICBjb25zdCBkYXRhQXR0cmlidXRlcyA9IGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSlcbiAgICAgICAgICAgID8gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovIChkYXRhKVxuICAgICAgICAgICAgOiB7fVxuXG4gICAgICAgICAgdGhpcy5ub3RlUmVtb3RlVmVyc2lvbih7cmVzb3VyY2VJZDogU3RyaW5nKHN5bmMucmVzb3VyY2VJZCgpKSwgcmVzb3VyY2VUeXBlLCB2ZXJzaW9uOiBkYXRhQXR0cmlidXRlc1t2ZXJzaW9uQXR0cmlidXRlXX0pXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwdWxsUmVzb3VyY2VDb25maWdzID0gdGhpcy5wdWxsUmVzb3VyY2VDb25maWdzKG9wZXJhdGlvbilcbiAgICAgICAgY29uc3QgYXBwbGllciA9IFN5bmNBcGlDbGllbnQucmVzb3VyY2VBcHBsaWVyKHB1bGxSZXNvdXJjZUNvbmZpZ3MsIChyZWNvcmQpID0+IHtcbiAgICAgICAgICBpZiAob3BlcmF0aW9uKSB0aGlzLmJpbmRSZW1vdGVSZWNvcmQoe29wZXJhdGlvbiwgcmVjb3JkfSlcblxuICAgICAgICAgIHJldHVybiB0aGlzLm1hcmtSZW1vdGVBcHBseShyZWNvcmQpXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IGFwcGxpZXIoc3luYylcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBzaGFyZWQgYXBwLWxpZmV0aW1lIHdlYnNvY2tldCBjb25uZWN0aW9uIGFsbCBzeW5jIHRyYWZmaWNcbiAgICogcmlkZXMsIG9yIG51bGwgd2hlbiBub25lIGlzIGNvbmZpZ3VyZWQuIEJ1aWx0IG9uY2UgYW5kIG1lbW9pemVkIChwZXJcbiAgICogY2xpZW50KTogYW4gYXBwLXByb3ZpZGVkIGBzeW5jLmNsaWVudC53ZWJzb2NrZXRDbGllbnRgIGluc3RhbmNlIHdpbnMgKHRoZVxuICAgKiBmcm9udGVuZC1tb2RlbCB0cmFuc3BvcnQgY2FuIHBhc3MgaXRzIG93biBjbGllbnQgc28gb25lIHNvY2tldCBjYXJyaWVzXG4gICAqIGV2ZXJ5dGhpbmcpLCBlbHNlIGEgZnJhbWV3b3JrLW93bmVkIHJlY29ubmVjdGluZyB7QGxpbmsgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50fVxuICAgKiBidWlsdCBmcm9tIGBzeW5jLmNsaWVudC53ZWJzb2NrZXRVcmxgLiBUaGUgcmVhbHRpbWUgYnJpZGdlIHJpZGVzIHRoaXNcbiAgICogY29ubmVjdGlvbiB3aXRob3V0IG93bmluZyBpdHMgbGlmZWN5Y2xlOyB3aGVuIG5laXRoZXIgaXMgY29uZmlndXJlZCB0aGVcbiAgICogYnJpZGdlIGZhbGxzIGJhY2sgdG8gdGhlIGRlcHJlY2F0ZWQgcGVyLWN5Y2xlIGByZWFsdGltZS5jcmVhdGVDbGllbnRgLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50U2hhcmVkQ29ubmVjdGlvbiB8IG51bGx9IFNoYXJlZCB3ZWJzb2NrZXQgY29ubmVjdGlvbiwgb3IgbnVsbC5cbiAgICovXG4gIHN5bmNDb25uZWN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9zeW5jQ29ubmVjdGlvbiAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5fc3luY0Nvbm5lY3Rpb25cblxuICAgIGlmICh0aGlzLmNvbmZpZy53ZWJzb2NrZXRDbGllbnQpIHtcbiAgICAgIHRoaXMuX3N5bmNDb25uZWN0aW9uID0gdGhpcy5jb25maWcud2Vic29ja2V0Q2xpZW50XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZy53ZWJzb2NrZXRVcmwpIHtcbiAgICAgIGNvbnN0IHVybCA9IHR5cGVvZiB0aGlzLmNvbmZpZy53ZWJzb2NrZXRVcmwgPT09IFwiZnVuY3Rpb25cIiA/IHRoaXMuY29uZmlnLndlYnNvY2tldFVybCgpIDogdGhpcy5jb25maWcud2Vic29ja2V0VXJsXG5cbiAgICAgIHRoaXMuX3N5bmNDb25uZWN0aW9uID0gdXJsID8gbmV3IFZlbG9jaW91c1dlYnNvY2tldENsaWVudCh7dXJsfSkgOiBudWxsXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3N5bmNDb25uZWN0aW9uID0gbnVsbFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zeW5jQ29ubmVjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgdGhlIGRlcml2ZWQgcmVhbHRpbWUgY2hhbm5lbHMgc28gcHVzaGVkIHdlYnNvY2tldCBjaGFuZ2VzIGFwcGx5XG4gICAqIHRocm91Z2ggdGhlIHNhbWUgZGVyaXZlZCBhcHBsaWVyIGFzIHB1bGxzIChpZGVtcG90ZW50LCBzaW5nbGUtZmxpZ2h0ZWQpLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBbY29udGV4dF0gLSBBcHAgY29udGV4dCBwYXNzZWQgdG8gdGhlIGRlcHJlY2F0ZWQgYHN5bmMuY2xpZW50LnJlYWx0aW1lLmNoYW5uZWxzYCBjYWxsYmFjayAocnVudGltZSBzY29wZSB2YWx1ZXMpLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHN1YnNjcmliZVJlYWx0aW1lKGNvbnRleHQpIHtcbiAgICB0aGlzLmFzc2VydFRlbmFudFJlYWR5KClcbiAgICBhd2FpdCB0aGlzLnJlYWx0aW1lQnJpZGdlKCkuc3Vic2NyaWJlKGNvbnRleHQpXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0aGUgc2VydmVyLWVudW1lcmF0ZWQgdXNlciBzY29wZTogXCJldmVyeXRoaW5nIG15IGFiaWxpdHkgY2FuXG4gICAqIHNlZVwiLiBEZWNsYXJlcyBhIHVzZXIgc2NvcGUgKGVtcHR5IGNvbmRpdGlvbnMpIGZvciBldmVyeSBwdWxsYWJsZSBzeW5jZWRcbiAgICogcmVzb3VyY2UgdHlwZSwgc3Vic2NyaWJlcyByZWFsdGltZSBzbyB0aGVpciBmcmFtZXdvcmsgc3luYyBjaGFubmVsXG4gICAqIHN1YnNjcmlwdGlvbnMgZ28gbGl2ZSwgYW5kIHB1bGxzIHNvIHRoZSBkZXZpY2UgY2F0Y2hlcyB1cC4gVGhlIHNlcnZlclxuICAgKiBhdXRob3JpemVzIGVhY2ggZW1wdHktY29uZGl0aW9ucyBzY29wZSB0aHJvdWdoIHRoZSBhcHAgc3luYyByZXNvdXJjZSdzXG4gICAqIGBhdXRob3JpemVDaGFuZ2VzYCBhbmQgcmUtY2hlY2tzIHJlY29yZCBhY2Nlc3MgcGVyIGRlbGl2ZXJ5LCBzbyB0aGUgY2xpZW50XG4gICAqIHN1YnNjcmliZXMgd2l0aCBqdXN0IGl0cyB0b2tlbiBhbmQgdGhlIHNlcnZlciBkZWNpZGVzIG1lbWJlcnNoaXAuXG4gICAqIElkZW1wb3RlbnQgYW5kIHNpbmdsZS1mbGlnaHRlZCBsaWtlIHtAbGluayBTeW5jQ2xpZW50I3N1YnNjcmliZVJlYWx0aW1lfS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdWJzY3JpYmVVc2VyU2NvcGUoKSB7XG4gICAgaWYgKHRoaXMuX3VzZXJTY29wZVN0YXRlID09PSBcInN1YnNjcmliZWRcIikgcmV0dXJuXG5cbiAgICBpZiAoIXRoaXMuX3N1YnNjcmliZVVzZXJTY29wZVByb21pc2UpIHtcbiAgICAgIHRoaXMuX3N1YnNjcmliZVVzZXJTY29wZVByb21pc2UgPSB0aGlzLl9zdWJzY3JpYmVVc2VyU2NvcGUoKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgdGhpcy5fc3Vic2NyaWJlVXNlclNjb3BlUHJvbWlzZSA9IG51bGxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5fc3Vic2NyaWJlVXNlclNjb3BlUHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIERlY2xhcmVzIGFuZCBhY3RpdmF0ZXMgdGhlIHVzZXIgc2NvcGUgZm9yIGV2ZXJ5IHB1bGxhYmxlIHJlc291cmNlLCB0aGVuXG4gICAqIHN1YnNjcmliZXMgcmVhbHRpbWUgYW5kIHB1bGxzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9zdWJzY3JpYmVVc2VyU2NvcGUoKSB7XG4gICAgdGhpcy5fdXNlclNjb3BlU3RhdGUgPSBcInN1YnNjcmliaW5nXCJcblxuICAgIGF3YWl0IHRoaXMuc2NvcGVTdG9yZSgpLmZpbmRPckNyZWF0ZVNjb3BlKGF3YWl0IHRoaXMudXNlclNjb3BlKCkpXG5cbiAgICBhd2FpdCB0aGlzLnN1YnNjcmliZVJlYWx0aW1lKClcbiAgICBhd2FpdCB0aGlzLnB1bGwoKVxuXG4gICAgdGhpcy5fdXNlclNjb3BlU3RhdGUgPSBcInN1YnNjcmliZWRcIlxuICB9XG5cbiAgLyoqXG4gICAqIFVuc3Vic2NyaWJlcyB0aGUgdXNlciBzY29wZTogZGVhY3RpdmF0ZXMgdGhlIHBlci1yZXNvdXJjZSB1c2VyIHNjb3BlcyBhbmRcbiAgICogY2xvc2VzIHRoZSByZWFsdGltZSBjaGFubmVsIHN1YnNjcmlwdGlvbnMuIFRoZSBzaGFyZWQgd2Vic29ja2V0IGNvbm5lY3Rpb25cbiAgICogc3RheXMgb3BlbiB3aGVuIG9uZSBpcyBjb25maWd1cmVkIChzaWduLW91dCBkcm9wcyBzdWJzY3JpcHRpb25zIHdpdGhvdXRcbiAgICogZGlzY29ubmVjdGluZyksIHNvIGEgc3Vic2VxdWVudCBzaWduLWluIHJlc3Vic2NyaWJlcyBvdmVyIHRoZSBzYW1lIHNvY2tldC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB1bnN1YnNjcmliZVVzZXJTY29wZSgpIHtcbiAgICBhd2FpdCB0aGlzLnNjb3BlU3RvcmUoKS5kZWFjdGl2YXRlKGF3YWl0IHRoaXMudXNlclNjb3BlKCkpXG5cbiAgICBhd2FpdCB0aGlzLnVuc3Vic2NyaWJlUmVhbHRpbWUoKVxuXG4gICAgdGhpcy5fdXNlclNjb3BlU3RhdGUgPSBcInVuc3Vic2NyaWJlZFwiXG4gICAgdGhpcy5fc3Vic2NyaWJlVXNlclNjb3BlUHJvbWlzZSA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdXNlciBzY29wZTogYSBzaW5nbGUgYWxsLXR5cGVzIHNjb3BlIChudWxsIHJlc291cmNlVHlwZSkgd2l0aCBlbXB0eVxuICAgKiBjb25kaXRpb25zLCBwYXJ0aXRpb25lZCBsb2NhbGx5IGJ5IG93bmVyLiBPbmUgc2NvcGUgLSBub3Qgb25lIHBlciByZXNvdXJjZVxuICAgKiB0eXBlIC0gc28gdGhlIHNlcnZlciBhdXRob3JpemVzIHRoZSBjYWxsZXIgb25jZSBwZXIgc3luYyBhbmQgcGVyIHN1YnNjcmliZSxcbiAgICogaG93ZXZlciBtYW55IHJlc291cmNlIHR5cGVzIGl0IHNlcnZlcy4gVGhlIHNlcnZlciBkZWNpZGVzIHdoaWNoIHR5cGVzIHRoZVxuICAgKiBjYWxsZXIgbWF5IHNlZTsgdGhlIGNsaWVudCBhcHBsaWVzIGVhY2ggcHVsbGVkIHJvdyBieSB0aGUgcmVzb3VyY2UgdHlwZSBvblxuICAgKiBpdHMgb3duIGVudmVsb3BlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlNlcmlhbGl6ZWRTeW5jU2NvcGU+fSBUaGUgdXNlciBzY29wZS5cbiAgICovXG4gIGFzeW5jIHVzZXJTY29wZSgpIHtcbiAgICByZXR1cm4ge2NvbmRpdGlvbnM6IHt9LCBvd25lcjogYXdhaXQgdGhpcy51c2VyU2NvcGVPd25lcigpLCByZXNvdXJjZVR5cGU6IG51bGx9XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlc291cmNlIHR5cGVzIHRoZSB1c2VyIHNjb3BlIGNvdmVyczogZXZlcnkgZGVjbGFyZWQgcmVzb3VyY2UgdGhhdFxuICAgKiByZWNlaXZlcyBwdWxsZWQgY2hhbmdlcyAoaGFzIHB1bGwgYGF0dHJpYnV0ZXNgKSwgc28gdGhlIGNsaWVudCBjYW4gYXBwbHlcbiAgICogdGhlbS4gU2VudCB3aXRoIHRoZSBzY29wZSBhcyBhIGRlbGl2ZXJ5L3R5cGUgZmlsdGVyIC0gaXQgbmFycm93cywgbmV2ZXJcbiAgICogd2lkZW5zLCB3aGF0IHRoZSBzZXJ2ZXIncyBhdXRob3JpemF0aW9uIGFscmVhZHkgYWxsb3dzLCBhbmQgaXQga2VlcHMgYVxuICAgKiBicm9hZGNhc3Qgb2YgYSB0eXBlIHRoaXMgY2xpZW50IGNhbm5vdCBhcHBseSBmcm9tIHJlYWNoaW5nIHRoZSBzZXJ2ZXInc1xuICAgKiBwZXItZGVsaXZlcnkgYWNjZXNzIHJlLWNoZWNrIChhIGRhdGFiYXNlIHF1ZXJ5IHBlciBtYXRjaGVkIGJyb2FkY2FzdCwgcGVyXG4gICAqIHN1YnNjcmliZWQgZGV2aWNlKS5cbiAgICogQHJldHVybnMge3N0cmluZ1tdfSBQdWxsYWJsZSByZXNvdXJjZSB0eXBlIG5hbWVzLlxuICAgKi9cbiAgdXNlclNjb3BlUmVzb3VyY2VUeXBlcygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5wdWxsUmVzb3VyY2VDb25maWdzKCkpXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGxvY2FsIHBhcnRpdGlvbiBrZXkgZm9yIHRoZSB1c2VyIHNjb3BlOiB0aGUgY3VycmVudGx5XG4gICAqIGNvbmZpZ3VyZWQgYXV0aGVudGljYXRlZCBpZGVudGl0eSAodGhlIHN5bmMgYXV0aCB0b2tlbikuIFBhcnRpdGlvbmluZyB0aGVcbiAgICogdXNlciBzY29wZSdzIGxvY2FsIHNjb3BlL2N1cnNvciByb3dzIGJ5IHRoaXMgb3duZXIga2VlcHMgdGhlXG4gICAqIGVtcHR5LWNvbmRpdGlvbnMgY3Vyc29yIGZyb20gbGVha2luZyBhY3Jvc3MgYWNjb3VudHMgb24gYSBzaGFyZWQgZGV2aWNlXG4gICAqIChhY2NvdW50IEIgc2lnbmluZyBpbiBhZnRlciBhY2NvdW50IEEgZ2V0cyBhIGZyZXNoIGN1cnNvcikgd2hpbGUgdGhlIHNhbWVcbiAgICogYWNjb3VudCByZWNvbm5lY3Rpbmcga2VlcHMgaXRzIGN1cnNvciBjb250aW51aXR5LiBUaGUgb3duZXIgaXMgYSBsb2NhbFxuICAgKiBwYXJ0aXRpb24ga2V5IG9ubHkg4oCUIHB1bGxzIHN0aWxsIHBvc3QgZW1wdHkgY29uZGl0aW9ucyB0byB0aGUgc2VydmVyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBVc2VyLXNjb3BlIG93bmVyIHBhcnRpdGlvbiBrZXkuXG4gICAqL1xuICBhc3luYyB1c2VyU2NvcGVPd25lcigpIHtcbiAgICByZXR1cm4gU3RyaW5nKGF3YWl0IHRoaXMuY29uZmlnLmF1dGhlbnRpY2F0aW9uVG9rZW4oKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZXMgdGhlIHJlYWx0aW1lIGNoYW5uZWxzIGFuZCBkaXNjb25uZWN0cyB0aGUgd2Vic29ja2V0IGNsaWVudCAoaWRlbXBvdGVudCkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgdW5zdWJzY3JpYmVSZWFsdGltZSgpIHtcbiAgICBhd2FpdCB0aGlzLnJlYWx0aW1lQnJpZGdlKCkudW5zdWJzY3JpYmUoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgdGhlIHJlYWx0aW1lIHN1YnNjcmlwdGlvbiBzdGF0ZSBhbmQgcGVyLWNoYW5uZWwgcmVhZGluZXNzLlxuICAgKiBAcmV0dXJucyB7UmV0dXJuVHlwZTxTeW5jUmVhbHRpbWVCcmlkZ2VbXCJzdGF0dXNcIl0+fSBSZWFsdGltZSBzdGF0dXMuXG4gICAqL1xuICByZWFsdGltZVN0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFsdGltZUJyaWRnZSgpLnN0YXR1cygpXG4gIH1cblxuICAvKipcbiAgICogQXdhaXRzIGFsbCBwZW5kaW5nIHJlYWx0aW1lIG1lc3NhZ2UgYXBwbGllcyBhbmQgYW55IHNjaGVkdWxlZFxuICAgKiBwdWxsLW9uLXJlY29ubmVjdCAodXNlZnVsIGluIHRlc3RzIGFuZCBzaHV0ZG93biBmbG93cykuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvclJlYWx0aW1lQXBwbGllZCgpIHtcbiAgICBhd2FpdCB0aGlzLnJlYWx0aW1lQnJpZGdlKCkud2FpdEZvckFwcGxpZWQoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxhemlseSBidWlsdCByZWFsdGltZSBicmlkZ2UuXG4gICAqIEByZXR1cm5zIHtTeW5jUmVhbHRpbWVCcmlkZ2V9IFJlYWx0aW1lIGJyaWRnZS5cbiAgICovXG4gIHJlYWx0aW1lQnJpZGdlKCkge1xuICAgIHRoaXMuX3JlYWx0aW1lQnJpZGdlIHx8PSBuZXcgU3luY1JlYWx0aW1lQnJpZGdlKHtzeW5jQ2xpZW50OiB0aGlzfSlcblxuICAgIHJldHVybiB0aGlzLl9yZWFsdGltZUJyaWRnZVxuICB9XG5cbiAgLyoqXG4gICAqIFF1ZXVlcyBhIGxvY2FsIG1vZGVsIGNoYW5nZSBhcyBhIHBlbmRpbmcgc3luYyByb3cgYW5kIHNjaGVkdWxlcyBhbiBpbW1lZGlhdGVcbiAgICogcmVwbGF5IGF0dGVtcHQgKGtlcHQgcGVuZGluZyB3aGlsZSBvZmZsaW5lIG9yIHdoZW4gdGhlIGJhY2tlbmQgcmVqZWN0cyBpdCkuXG4gICAqIEBwYXJhbSB7e2Jhc2VWZXJzaW9uPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCwgcmVzb3VyY2U6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBkYXRhPzogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBvcGVyYXRpb24/OiBcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwiLCBzeW5jVHlwZT86IHN0cmluZ319IGFyZ3MgLSBRdWV1ZSBhcmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiB8IGltcG9ydChcIi4vbG9jYWwtbXV0YXRpb24tbG9nLmpzXCIpLkxvY2FsTXV0YXRpb25Mb2dSZWNvcmQ+fSBQZW5kaW5nIGxvY2FsIHN5bmMgcm93IG9yIGR1cmFibGUgY29uZmxpY3QtdHJhY2tlZCBpbnRlbnQuXG4gICAqL1xuICBhc3luYyBxdWV1ZSh7YmFzZVZlcnNpb24sIGRhdGEsIG9wZXJhdGlvbiA9IFwidXBkYXRlXCIsIHJlc291cmNlLCBzeW5jVHlwZX0pIHtcbiAgICB0aGlzLmFzc2VydFRlbmFudFJlYWR5KClcbiAgICB0aGlzLmFzc2VydFJlY29yZE93bmVyc2hpcChyZXNvdXJjZSlcbiAgICBjb25zdCByZXNvdXJjZUNvbmZpZyA9IHRoaXMucmVzb3VyY2VDb25maWdGb3IocmVzb3VyY2UpXG4gICAgY29uc3QgcmVzb2x2ZWRTeW5jVHlwZSA9IHN5bmNUeXBlID8/IHRoaXMuZGVmYXVsdFN5bmNUeXBlKHtvcGVyYXRpb24sIHJlY29yZDogcmVzb3VyY2UsIHJlc291cmNlQ29uZmlnfSlcblxuICAgIGlmIChyZXNvdXJjZUNvbmZpZy5jb25mbGljdFRyYWNraW5nKSB7XG4gICAgICBjb25zdCBxdWV1ZWREYXRhID0gU3luY0FwaUNsaWVudC5xdWV1ZWRTeW5jRGF0YSh7XG4gICAgICAgIGJvb2xlYW5BdHRyaWJ1dGVzOiByZXNvdXJjZUNvbmZpZy5ib29sZWFuQXR0cmlidXRlcyB8fCBbXSxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgbG9jYWxPbmx5QXR0cmlidXRlczogcmVzb3VyY2VDb25maWcubG9jYWxPbmx5QXR0cmlidXRlcyB8fCBbXSxcbiAgICAgICAgcmVzb3VyY2VcbiAgICAgIH0pXG4gICAgICBjb25zdCByZWNvcmQgPSBhd2FpdCBTeW5jQXBpQ2xpZW50LnF1ZXVlQ29uZmxpY3RUcmFja2VkU3luYyh7XG4gICAgICAgIGJhc2VWZXJzaW9uOiBiYXNlVmVyc2lvbiA9PT0gdW5kZWZpbmVkID8gdGhpcy5iYXNlVmVyc2lvbkZvcih7b3BlcmF0aW9uLCByZWNvcmQ6IHJlc291cmNlLCByZXNvdXJjZUNvbmZpZ30pIDogYmFzZVZlcnNpb24sXG4gICAgICAgIGNvbmZsaWN0VHJhY2tpbmc6IHJlc291cmNlQ29uZmlnLmNvbmZsaWN0VHJhY2tpbmcsXG4gICAgICAgIGRhdGE6IHF1ZXVlZERhdGEsXG4gICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgcmVzb3VyY2UsXG4gICAgICAgIHJlc291cmNlVHlwZTogcmVzb3VyY2UuY29uc3RydWN0b3IuZ2V0TW9kZWxOYW1lKCksXG4gICAgICAgIHN5bmNUeXBlOiByZXNvbHZlZFN5bmNUeXBlXG4gICAgICB9KVxuXG4gICAgICB0aGlzLnNjaGVkdWxlUmVwbGF5KClcblxuICAgICAgcmV0dXJuIHJlY29yZFxuICAgIH1cblxuICAgIGNvbnN0IHN5bmNSb3cgPSBhd2FpdCB0aGlzLndpdGhUZW5hbnRPcGVyYXRpb24oYXN5bmMgKGRhdGFiYXNlT3BlcmF0aW9uKSA9PiBhd2FpdCBTeW5jQXBpQ2xpZW50LnF1ZXVlTG9jYWxTeW5jKHtcbiAgICAgIGJvb2xlYW5BdHRyaWJ1dGVzOiByZXNvdXJjZUNvbmZpZy5ib29sZWFuQXR0cmlidXRlcyB8fCBbXSxcbiAgICAgIGRhdGEsXG4gICAgICBsb2NhbE9ubHlBdHRyaWJ1dGVzOiByZXNvdXJjZUNvbmZpZy5sb2NhbE9ubHlBdHRyaWJ1dGVzIHx8IFtdLFxuICAgICAgcmVzb3VyY2UsXG4gICAgICBzeW5jTW9kZWw6IGRhdGFiYXNlT3BlcmF0aW9uID8gZGF0YWJhc2VPcGVyYXRpb24ubW9kZWxDbGFzcyh0aGlzLmNvbmZpZy5zeW5jTW9kZWwpIDogdGhpcy5jb25maWcuc3luY01vZGVsLFxuICAgICAgc3luY1R5cGU6IHJlc29sdmVkU3luY1R5cGVcbiAgICB9KSlcblxuICAgIHRoaXMuc2NoZWR1bGVSZXBsYXkoKVxuXG4gICAgcmV0dXJuIHN5bmNSb3dcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmFpbnMgcGVuZGluZyBsb2NhbCBzeW5jIHJvd3MgdG8gdGhlIGJhY2tlbmQgKHNpbmdsZS1mbGlnaHRlZCwgb25saW5lLWdhdGVkKS5cbiAgICogUm93cyBhcmUgb25seSBtYXJrZWQgc3VjY2Vzc2Z1bCBhZnRlciB0aGUgYmFja2VuZCBhY2tub3dsZWRnZXMgdGhlbS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyByZXBsYXlQZW5kaW5nKCkge1xuICAgIHRoaXMuYXNzZXJ0VGVuYW50UmVhZHkoKVxuICAgIGlmICghKGF3YWl0IHRoaXMuaXNPbmxpbmUoKSkpIHJldHVyblxuXG4gICAgYXdhaXQgU3luY0FwaUNsaWVudC5zaW5nbGVGbGlnaHQoYHZlbG9jaW91cy1zeW5jLWNsaWVudC1yZXBsYXktJHt0aGlzLl9jbGllbnROdW1iZXJ9YCwgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy53aXRoVGVuYW50T3BlcmF0aW9uKGFzeW5jIChvcGVyYXRpb24pID0+IHtcbiAgICAgIGZvciAoY29uc3QgW3Jlc291cmNlVHlwZSwgcmVzb3VyY2VDb25maWddIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuY29uZmlnLnJlc291cmNlcykpIHtcbiAgICAgICAgaWYgKCFyZXNvdXJjZUNvbmZpZy5jb25mbGljdFRyYWNraW5nKSBjb250aW51ZVxuXG4gICAgICAgIGF3YWl0IFN5bmNBcGlDbGllbnQucmVwbGF5Q29uZmxpY3RUcmFja2VkU3luY3Moe1xuICAgICAgICAgIGF1dGhlbnRpY2F0aW9uVG9rZW46IGF3YWl0IHRoaXMuY29uZmlnLmF1dGhlbnRpY2F0aW9uVG9rZW4oKSxcbiAgICAgICAgICBiYXRjaFNpemU6IHRoaXMuY29uZmlnLmJhdGNoU2l6ZSxcbiAgICAgICAgICBjb25mbGljdFRyYWNraW5nOiByZXNvdXJjZUNvbmZpZy5jb25mbGljdFRyYWNraW5nLFxuICAgICAgICAgIHBvc3RSZXBsYXk6IHRoaXMuY29uZmlnLnBvc3RSZXBsYXksXG4gICAgICAgICAgcmVtb3RlR2VuZXJhdGlvbjogKGlkZW50aXR5KSA9PiB0aGlzLl9yZW1vdGVHZW5lcmF0aW9ucy5nZXQoaWRlbnRpdHkpIHx8IDAsXG4gICAgICAgICAgcmVzb3VyY2VUeXBlXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IFN5bmNBcGlDbGllbnQucmVwbGF5TG9jYWxTeW5jcyh7XG4gICAgICAgIGF1dGhlbnRpY2F0aW9uVG9rZW46IGF3YWl0IHRoaXMuY29uZmlnLmF1dGhlbnRpY2F0aW9uVG9rZW4oKSxcbiAgICAgICAgYmF0Y2hTaXplOiB0aGlzLmNvbmZpZy5iYXRjaFNpemUsXG4gICAgICAgIHBvc3RSZXBsYXk6IHRoaXMuY29uZmlnLnBvc3RSZXBsYXksXG4gICAgICAgIHN5bmNNb2RlbDogb3BlcmF0aW9uID8gb3BlcmF0aW9uLm1vZGVsQ2xhc3ModGhpcy5jb25maWcuc3luY01vZGVsKSA6IHRoaXMuY29uZmlnLnN5bmNNb2RlbFxuICAgICAgfSlcbiAgICB9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmRzIGFuIGF1dGhvcml0YXRpdmUgcmVtb3RlIG9ic2VydmF0aW9uIHNvIGFuIGluLWZsaWdodCBhY2tub3dsZWRnZW1lbnRcbiAgICogY2Fubm90IHJlYmFzZSBhIHN1Y2Nlc3NvciBhY3Jvc3MgdGhhdCBvYnNlcnZhdGlvbi5cbiAgICogQHBhcmFtIHt7cmVzb3VyY2VJZDogc3RyaW5nIHwgbnVtYmVyLCByZXNvdXJjZVR5cGU6IHN0cmluZywgdmVyc2lvbj86IHN0cmluZyB8IG51bWJlciB8IG51bGx9fSBhcmdzIC0gUmVtb3RlIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIG5vdGVSZW1vdGVWZXJzaW9uKHtyZXNvdXJjZUlkLCByZXNvdXJjZVR5cGUsIHZlcnNpb259KSB7XG4gICAgdm9pZCB2ZXJzaW9uXG4gICAgY29uc3QgaWRlbnRpdHkgPSBgJHtyZXNvdXJjZVR5cGV9OiR7U3RyaW5nKHJlc291cmNlSWQpfWBcblxuICAgIHRoaXMuX3JlbW90ZUdlbmVyYXRpb25zLnNldChpZGVudGl0eSwgKHRoaXMuX3JlbW90ZUdlbmVyYXRpb25zLmdldChpZGVudGl0eSkgfHwgMCkgKyAxKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIHRoZSBhdXRob3JpdGF0aXZlIGJhc2UgdmVyc2lvbiBvYnNlcnZlZCBiZWZvcmUgYSBsb2NhbCBtdXRhdGlvbi5cbiAgICogQHBhcmFtIHt7b3BlcmF0aW9uOiBcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwiLCByZWNvcmQ6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCByZXNvdXJjZUNvbmZpZzogaW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50UmVzb3VyY2VDb25maWd9fSBhcmdzIC0gVmVyc2lvbiBhcmdzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVtYmVyIHwgbnVsbH0gQmFzZSB2ZXJzaW9uLlxuICAgKi9cbiAgYmFzZVZlcnNpb25Gb3Ioe29wZXJhdGlvbiwgcmVjb3JkLCByZXNvdXJjZUNvbmZpZ30pIHtcbiAgICBpZiAob3BlcmF0aW9uID09PSBcImNyZWF0ZVwiKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgdmVyc2lvbkF0dHJpYnV0ZSA9IHJlc291cmNlQ29uZmlnLmNvbmZsaWN0VHJhY2tpbmc/LnZlcnNpb25BdHRyaWJ1dGVcblxuICAgIGlmICghdmVyc2lvbkF0dHJpYnV0ZSkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IHZhbHVlID0gcmVjb3JkLnJlYWRBdHRyaWJ1dGUodmVyc2lvbkF0dHJpYnV0ZSlcblxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiB2YWx1ZS50b0lTT1N0cmluZygpXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHJldHVybiB2YWx1ZVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBTeW5jIGNvbmZsaWN0IHZlcnNpb24gJHt2ZXJzaW9uQXR0cmlidXRlfSBtdXN0IGJlIGEgRGF0ZSwgc3RyaW5nLCBudW1iZXIsIG9yIG51bGxgKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIHRoZSBwcmUtYXNzaWdubWVudCB2YWx1ZSBleHBvc2VkIGJ5IHJlY29yZCBjaGFuZ2VzIGR1cmluZyBiZWZvcmVVcGRhdGUuXG4gICAqIERlbGV0ZXMgaGF2ZSBubyB2ZXJzaW9uIGNoYW5nZSBwYWlyIGFuZCB1c2UgdGhlIHJlY29yZCdzIGN1cnJlbnQgdmVyc2lvbi5cbiAgICogQHBhcmFtIHt7b3BlcmF0aW9uOiBcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwiLCByZWNvcmQ6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCByZXNvdXJjZUNvbmZpZzogaW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50UmVzb3VyY2VDb25maWd9fSBhcmdzIC0gVmVyc2lvbiBhcmdzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVtYmVyIHwgbnVsbH0gUHJlLW11dGF0aW9uIGJhc2UgdmVyc2lvbi5cbiAgICovXG4gIHByZU11dGF0aW9uQmFzZVZlcnNpb25Gb3Ioe29wZXJhdGlvbiwgcmVjb3JkLCByZXNvdXJjZUNvbmZpZ30pIHtcbiAgICBjb25zdCB2ZXJzaW9uQXR0cmlidXRlID0gcmVzb3VyY2VDb25maWcuY29uZmxpY3RUcmFja2luZz8udmVyc2lvbkF0dHJpYnV0ZVxuICAgIGNvbnN0IHZlcnNpb25Db2x1bW4gPSB2ZXJzaW9uQXR0cmlidXRlXG4gICAgICA/IHJlY29yZC5jb25zdHJ1Y3Rvci5nZXRBdHRyaWJ1dGVOYW1lVG9Db2x1bW5OYW1lTWFwKClbdmVyc2lvbkF0dHJpYnV0ZV1cbiAgICAgIDogdW5kZWZpbmVkXG4gICAgY29uc3QgdmVyc2lvbkNoYW5nZSA9IG9wZXJhdGlvbiA9PT0gXCJ1cGRhdGVcIiAmJiB2ZXJzaW9uQ29sdW1uXG4gICAgICA/IHJlY29yZC5jaGFuZ2VzKClbdmVyc2lvbkNvbHVtbl1cbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICBpZiAoIXZlcnNpb25DaGFuZ2UpIHJldHVybiB0aGlzLmJhc2VWZXJzaW9uRm9yKHtvcGVyYXRpb24sIHJlY29yZCwgcmVzb3VyY2VDb25maWd9KVxuXG4gICAgY29uc3QgdmFsdWUgPSB2ZXJzaW9uQ2hhbmdlWzBdXG5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gdmFsdWUudG9JU09TdHJpbmcoKVxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSByZXR1cm4gdmFsdWVcblxuICAgIHRocm93IG5ldyBFcnJvcihgU3luYyBjb25mbGljdCB2ZXJzaW9uICR7dmVyc2lvbkF0dHJpYnV0ZX0gbXVzdCBiZSBhIERhdGUsIHN0cmluZywgbnVtYmVyLCBvciBudWxsYClcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdW1lcyB0aGUgYmFzZSBjYXB0dXJlZCBmb3IgdGhpcyBsaWZlY3ljbGUgZXZlbnQgYmVmb3JlIGl0cyBhZnRlci1jb21taXRcbiAgICogY2xvc3VyZSBpcyBkZWZlcnJlZCwgcHJlc2VydmluZyByZXBlYXRlZCBzYW1lLXJlY29yZCB3cml0ZXMgaW4gb25lIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge3tvcGVyYXRpb246IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIsIHJlY29yZDogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIHJlc291cmNlQ29uZmlnOiBpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRSZXNvdXJjZUNvbmZpZ319IGFyZ3MgLSBDYXB0dXJlIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudW1iZXIgfCBudWxsfSBDYXB0dXJlZCBiYXNlIHZlcnNpb24uXG4gICAqL1xuICBjYXB0dXJlZEJhc2VWZXJzaW9uRm9yKHtvcGVyYXRpb24sIHJlY29yZCwgcmVzb3VyY2VDb25maWd9KSB7XG4gICAgaWYgKG9wZXJhdGlvbiA9PT0gXCJjcmVhdGVcIikgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IGNhcHR1cmVkVmVyc2lvbnMgPSB0aGlzLl9jYXB0dXJlZEJhc2VWZXJzaW9ucy5nZXQocmVjb3JkKVxuICAgIGNvbnN0IGJhc2VWZXJzaW9uID0gY2FwdHVyZWRWZXJzaW9ucz8uc2hpZnQoKVxuXG4gICAgaWYgKGNhcHR1cmVkVmVyc2lvbnM/Lmxlbmd0aCA9PT0gMCkgdGhpcy5fY2FwdHVyZWRCYXNlVmVyc2lvbnMuZGVsZXRlKHJlY29yZClcbiAgICBpZiAoYmFzZVZlcnNpb24gIT09IHVuZGVmaW5lZCkgcmV0dXJuIGJhc2VWZXJzaW9uXG5cbiAgICByZXR1cm4gdGhpcy5iYXNlVmVyc2lvbkZvcih7b3BlcmF0aW9uLCByZWNvcmQsIHJlc291cmNlQ29uZmlnfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2hlZHVsZXMgYSBiYWNrZ3JvdW5kIHJlcGxheSBhdHRlbXB0IHdpdGhvdXQgYmxvY2tpbmcgdGhlIGNhbGxlci5cbiAgICogRmFpbHVyZXMgZ28gdG8gY29uZmlnLm9uRXJyb3IgKG9yIHJldGhyb3cgd2hlbiBub25lIGlzIGNvbmZpZ3VyZWQpLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNjaGVkdWxlUmVwbGF5KCkge1xuICAgIHRoaXMuX3NjaGVkdWxlZFJlcGxheSA9IChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlcGxheVBlbmRpbmcoKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5yZXBvcnRFcnJvcigvKiogQHR5cGUge0Vycm9yfSAqLyAoZXJyb3IpKVxuICAgICAgfVxuICAgIH0pKClcbiAgfVxuXG4gIC8qKlxuICAgKiBBd2FpdHMgdGhlIGxhc3Qgc2NoZWR1bGVkIGJhY2tncm91bmQgcmVwbGF5ICh1c2VmdWwgaW4gdGVzdHMgYW5kIHNodXRkb3duIGZsb3dzKS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YWl0Rm9yU2NoZWR1bGVkUmVwbGF5KCkge1xuICAgIGlmICh0aGlzLl9zY2hlZHVsZWRSZXBsYXkpIGF3YWl0IHRoaXMuX3NjaGVkdWxlZFJlcGxheVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgYSBiYWNrZ3JvdW5kIHN5bmMgZmFpbHVyZS5cbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBCYWNrZ3JvdW5kIGZhaWx1cmUuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcmVwb3J0RXJyb3IoZXJyb3IpIHtcbiAgICBpZiAodGhpcy5jb25maWcub25FcnJvcikge1xuICAgICAgdGhpcy5jb25maWcub25FcnJvcihlcnJvcilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRocm93IGVycm9yXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgY29ubmVjdGl2aXR5IHRocm91Z2ggdGhlIGNvbmZpZ3VyZWQgZ2F0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IFdoZXRoZXIgdGhlIGJhY2tlbmQgaXMgY29uc2lkZXJlZCByZWFjaGFibGUuXG4gICAqL1xuICBhc3luYyBpc09ubGluZSgpIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmlzT25saW5lKSByZXR1cm4gdHJ1ZVxuXG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmNvbmZpZy5pc09ubGluZSgpKSAhPT0gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzY29wZSBzdG9yZSBiYWNraW5nIGRlY2xhcmVkIHNjb3BlcyBhbmQgY3Vyc29ycy5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vc3luYy1zY29wZS1zdG9yZS5qc1wiKS5kZWZhdWx0fSBTY29wZSBzdG9yZS5cbiAgICovXG4gIHNjb3BlU3RvcmUoKSB7XG4gICAgdGhpcy5hc3NlcnRUZW5hbnRSZWFkeSgpXG5cbiAgICBpZiAodGhpcy5fc2NvcGVTdG9yZSAmJiB0aGlzLl9kYXRhYmFzZUlkZW50aXR5ICYmIHRoaXMuX3Njb3BlU3RvcmUuc3RvcmVJZGVudGl0eSAhPT0gdGhpcy5fZGF0YWJhc2VJZGVudGl0eSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY0NsaWVudCBzY29wZSBzdG9yZSBiZWxvbmdzIHRvIGFub3RoZXIgb3IgdW5yZXNvbHZlZCBwaHlzaWNhbCB0ZW5hbnQgZGF0YWJhc2VcIilcbiAgICB9XG5cbiAgICB0aGlzLl9zY29wZVN0b3JlIHx8PSBuZXcgU3luY1Njb3BlU3RvcmUoe1xuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWcuY29uZmlndXJhdGlvbixcbiAgICAgIGRhdGFiYXNlSWRlbnRpZmllcjogdGhpcy5jb25maWcuZGF0YWJhc2VJZGVudGlmaWVyLFxuICAgICAgdGVuYW50SGFuZGxlOiB0aGlzLmNvbmZpZy50ZW5hbnRIYW5kbGVcbiAgICB9KVxuXG4gICAgcmV0dXJuIHRoaXMuX3Njb3BlU3RvcmVcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgZGVjbGFyZWQgcmVzb3VyY2UgY29uZmlnIGZvciBhIGxvY2FsIHJlY29yZC5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gcmVzb3VyY2UgLSBMb2NhbCBtb2RlbCByZWNvcmQuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRSZXNvdXJjZUNvbmZpZ30gRGVjbGFyZWQgcmVzb3VyY2UgY29uZmlnLlxuICAgKi9cbiAgcmVzb3VyY2VDb25maWdGb3IocmVzb3VyY2UpIHtcbiAgICBjb25zdCBtb2RlbENsYXNzID0gcmVzb3VyY2U/LmNvbnN0cnVjdG9yXG5cbiAgICBpZiAodHlwZW9mIG1vZGVsQ2xhc3M/LmdldE1vZGVsTmFtZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFN5bmMgcmVzb3VyY2VzIG11c3QgYmUgbW9kZWwgcmVjb3JkcyB3aXRoIGEgc3RhdGljIGdldE1vZGVsTmFtZSgpLCBnb3Q6ICR7U3RyaW5nKHJlc291cmNlKX1gKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IG1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKClcbiAgICBjb25zdCByZXNvdXJjZUNvbmZpZyA9IHRoaXMuY29uZmlnLnJlc291cmNlc1tyZXNvdXJjZVR5cGVdXG5cbiAgICBpZiAoIXJlc291cmNlQ29uZmlnKSB0aHJvdyBuZXcgRXJyb3IoYE5vIHN5bmMgcmVzb3VyY2UgY29uZmlndXJlZCBmb3I6ICR7cmVzb3VyY2VUeXBlfWApXG5cbiAgICByZXR1cm4gcmVzb3VyY2VDb25maWdcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgc3luYyB0eXBlIGZvciBhIG11dGF0aW9uIHRocm91Z2ggdGhlIHJlc291cmNlIGNvbmZpZy4gVGhlXG4gICAqIFwidXBzZXJ0XCIgZmxhZyBxdWV1ZXMgY3JlYXRlcyBhbmQgdXBkYXRlcyBhcyBcInVwZGF0ZVwiIHJvd3MgKHRoZSBzZXJ2ZXJcbiAgICogdXBzZXJ0cyBieSByZXNvdXJjZSBpZCkgYW5kIGRlc3Ryb3lzIGFzIFwiZGVsZXRlXCIgcm93cy5cbiAgICogQHBhcmFtIHt7b3BlcmF0aW9uOiBcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwiLCByZWNvcmQ6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCByZXNvdXJjZUNvbmZpZzogaW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50UmVzb3VyY2VDb25maWd9fSBhcmdzIC0gTXV0YXRpb24gYXJncy5cbiAgICogQHJldHVybnMge3N0cmluZ30gU3luYyB0eXBlLlxuICAgKi9cbiAgZGVmYXVsdFN5bmNUeXBlKHtvcGVyYXRpb24sIHJlY29yZCwgcmVzb3VyY2VDb25maWd9KSB7XG4gICAgaWYgKHR5cGVvZiByZXNvdXJjZUNvbmZpZy5zeW5jVHlwZSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gcmVzb3VyY2VDb25maWcuc3luY1R5cGUoe29wZXJhdGlvbiwgcmVjb3JkfSlcbiAgICBpZiAob3BlcmF0aW9uID09PSBcImRlc3Ryb3lcIikgcmV0dXJuIFwiZGVsZXRlXCJcbiAgICBpZiAocmVzb3VyY2VDb25maWcuc3luY1R5cGUgPT09IFwidXBzZXJ0XCIpIHJldHVybiBcInVwZGF0ZVwiXG5cbiAgICByZXR1cm4gb3BlcmF0aW9uXG4gIH1cblxuICAvKipcbiAgICogRGVyaXZlcyB0aGUgcHVsbC1hcHBseSByZXNvdXJjZSBjb25maWdzIGZyb20gdGhlIGRlY2xhcmVkIHJlc291cmNlcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9vcGVyYXRpb24uanNcIikuZGVmYXVsdCB8IG51bGx9IFtvcGVyYXRpb25dIC0gVGVuYW50IG9wZXJhdGlvbiBiaW5kaW5nIHRoZSByZXNvdXJjZSBtb2RlbCBjbGFzc2VzLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1Jlc291cmNlQ29uZmlnPn0gUHVsbC1hcHBseSByZXNvdXJjZSBjb25maWdzLlxuICAgKi9cbiAgcHVsbFJlc291cmNlQ29uZmlncyhvcGVyYXRpb24pIHtcbiAgICBpZiAoIW9wZXJhdGlvbiAmJiB0aGlzLl9wdWxsUmVzb3VyY2VDb25maWdzKSByZXR1cm4gdGhpcy5fcHVsbFJlc291cmNlQ29uZmlnc1xuXG4gICAgY29uc3QgcmVzb3VyY2VDb25maWdzID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jUmVzb3VyY2VDb25maWc+fSAqLyAoT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5jb25maWcucmVzb3VyY2VzKVxuICAgICAgICAuZmlsdGVyKChbLCByZXNvdXJjZV0pID0+IEJvb2xlYW4ocmVzb3VyY2UuYXR0cmlidXRlcykpXG4gICAgICAgIC5tYXAoKFtyZXNvdXJjZVR5cGUsIHJlc291cmNlXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSBvcGVyYXRpb24gPyBvcGVyYXRpb24ubW9kZWxDbGFzcyhyZXNvdXJjZS5tb2RlbENsYXNzKSA6IHJlc291cmNlLm1vZGVsQ2xhc3NcbiAgICAgICAgICBjb25zdCBmaW5kUmVjb3JkID0gcmVzb3VyY2UuZmluZFJlY29yZFxuICAgICAgICAgIGNvbnN0IGZpbmRSZWNvcmRGb3JEZWxldGUgPSByZXNvdXJjZS5maW5kUmVjb3JkRm9yRGVsZXRlXG5cbiAgICAgICAgICByZXR1cm4gW3Jlc291cmNlVHlwZSwge1xuICAgICAgICAgICAgYWZ0ZXJBcHBseTogcmVzb3VyY2UuYWZ0ZXJBcHBseSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1Jlc291cmNlQ29uZmlnW1wiYXR0cmlidXRlc1wiXX0gKi8gKHJlc291cmNlLmF0dHJpYnV0ZXMpLFxuICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIGZpbmRSZWNvcmQ6IG9wZXJhdGlvbiAmJiBmaW5kUmVjb3JkXG4gICAgICAgICAgICAgID8gKGFyZ3MpID0+IGZpbmRSZWNvcmQoey4uLmFyZ3MsIG1vZGVsQ2xhc3MsIG9wZXJhdGlvbjogb3BlcmF0aW9uIHx8IG51bGx9KVxuICAgICAgICAgICAgICA6IGZpbmRSZWNvcmQsXG4gICAgICAgICAgICBmaW5kUmVjb3JkRm9yRGVsZXRlOiBvcGVyYXRpb24gJiYgZmluZFJlY29yZEZvckRlbGV0ZVxuICAgICAgICAgICAgICA/IChhcmdzKSA9PiBmaW5kUmVjb3JkRm9yRGVsZXRlKHsuLi5hcmdzLCBtb2RlbENsYXNzLCBvcGVyYXRpb246IG9wZXJhdGlvbiB8fCBudWxsfSlcbiAgICAgICAgICAgICAgOiBmaW5kUmVjb3JkRm9yRGVsZXRlLFxuICAgICAgICAgICAgbW9kZWxDbGFzc1xuICAgICAgICAgIH1dXG4gICAgICAgIH0pXG4gICAgKSlcblxuICAgIGlmICghb3BlcmF0aW9uKSB0aGlzLl9wdWxsUmVzb3VyY2VDb25maWdzID0gcmVzb3VyY2VDb25maWdzXG5cbiAgICByZXR1cm4gcmVzb3VyY2VDb25maWdzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBsb2NhbCBzdGF0ZSB3b3JrIG9uIHRoaXMgY2xpZW50J3MgY2FwdHVyZWQgdGVuYW50LCBvciBkaXJlY3RseSBmb3IgdGhlIGxlZ2FjeSBkZWZhdWx0LWRhdGFiYXNlIGNsaWVudC5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHsob3BlcmF0aW9uOiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9vcGVyYXRpb24uanNcIikuZGVmYXVsdCB8IG51bGwpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gQm91bmQgd29yay5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHdpdGhUZW5hbnRPcGVyYXRpb24oY2FsbGJhY2spIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLnRlbmFudEhhbmRsZSB8fCAhdGhpcy5jb25maWcuZGF0YWJhc2VJZGVudGlmaWVyKSByZXR1cm4gYXdhaXQgY2FsbGJhY2sobnVsbClcbiAgICB0aGlzLmFzc2VydFRlbmFudFJlYWR5KClcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbmZpZy50ZW5hbnRIYW5kbGUuZGF0YWJhc2VPcGVyYXRpb24oe1xuICAgICAgZGF0YWJhc2VJZGVudGlmaWVyOiB0aGlzLmNvbmZpZy5kYXRhYmFzZUlkZW50aWZpZXIsXG4gICAgICBuYW1lOiBcIlRlbmFudCBTeW5jQ2xpZW50XCJcbiAgICB9LCBhc3luYyAob3BlcmF0aW9uKSA9PiB7XG4gICAgICBhd2FpdCBvcGVyYXRpb24uZW5zdXJlTW9kZWxJbml0aWFsaXplZCh0aGlzLmNvbmZpZy5zeW5jTW9kZWwpXG5cbiAgICAgIHJldHVybiBhd2FpdCBjYWxsYmFjayhvcGVyYXRpb24pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnRzIHdoZXRoZXIgYSByZWNvcmQgYmVsb25ncyB0byB0aGlzIGNsaWVudCdzIHBoeXNpY2FsIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSByZWNvcmQgLSBDYW5kaWRhdGUgcmVjb3JkLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIGNsaWVudCBvd25zIGl0LlxuICAgKi9cbiAgb3duc1JlY29yZChyZWNvcmQpIHtcbiAgICBpZiAoIXRoaXMuX2RhdGFiYXNlSWRlbnRpdHkpIHJldHVybiB0cnVlXG5cbiAgICBjb25zdCBkYXRhYmFzZU9wZXJhdGlvbiA9IHJlY29yZC5kYXRhYmFzZU9wZXJhdGlvbigpXG5cbiAgICByZXR1cm4gcmVjb3JkLmRhdGFiYXNlSWRlbnRpdHkoKSA9PT0gdGhpcy5fZGF0YWJhc2VJZGVudGl0eSAmJlxuICAgICAgZGF0YWJhc2VPcGVyYXRpb24/LnNjaGVtYUdlbmVyYXRpb24oKSA9PT0gdGhpcy5fdGVuYW50U2NoZW1hR2VuZXJhdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIFJlamVjdHMgYSByZWNvcmQgbm90IG93bmVkIGJ5IHRoaXMgY2xpZW50J3MgcGh5c2ljYWwgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHJlY29yZCAtIENhbmRpZGF0ZSByZWNvcmQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYXNzZXJ0UmVjb3JkT3duZXJzaGlwKHJlY29yZCkge1xuICAgIGlmICghdGhpcy5vd25zUmVjb3JkKHJlY29yZCkpIHRocm93IG5ldyBFcnJvcihcIlN5bmNDbGllbnQgcmVzb3VyY2UgYmVsb25ncyB0byBhbm90aGVyIG9yIHVucmVzb2x2ZWQgcGh5c2ljYWwgdGVuYW50IGRhdGFiYXNlXCIpXG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGEgZGVjbGFyZWQgcXVlcnkgYWdhaW5zdCB0aGlzIGNsaWVudCdzIGNhcHR1cmVkIHRlbmFudCBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gcXVlcnkgLSBTY29wZSBxdWVyeS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhc3NlcnRRdWVyeU93bmVyc2hpcChxdWVyeSkge1xuICAgIGlmICghdGhpcy5jb25maWcudGVuYW50SGFuZGxlIHx8ICF0aGlzLmNvbmZpZy5kYXRhYmFzZUlkZW50aWZpZXIpIHJldHVyblxuXG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IHF1ZXJ5LmdldE1vZGVsQ2xhc3MoKVxuICAgIGNvbnN0IGRhdGFiYXNlSWRlbnRpZmllciA9IG1vZGVsQ2xhc3MuZ2V0RGF0YWJhc2VJZGVudGlmaWVyKHt0ZW5hbnQ6IHRoaXMuY29uZmlnLnRlbmFudEhhbmRsZS50ZW5hbnQoKX0pXG4gICAgY29uc3QgcXVlcnlEYXRhYmFzZUlkZW50aXR5ID0gcXVlcnkuX29wZXJhdGlvbj8uZGF0YWJhc2VJZGVudGl0eSgpXG5cbiAgICBpZiAoZGF0YWJhc2VJZGVudGlmaWVyICE9PSB0aGlzLmNvbmZpZy5kYXRhYmFzZUlkZW50aWZpZXIgfHxcbiAgICAgICF0aGlzLmNvbmZpZy5yZXNvdXJjZXNbbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKV0gfHxcbiAgICAgIHF1ZXJ5RGF0YWJhc2VJZGVudGl0eSAhPT0gdGhpcy5fZGF0YWJhc2VJZGVudGl0eSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY0NsaWVudCBzY29wZSBiZWxvbmdzIHRvIGFub3RoZXIgb3IgdW5yZXNvbHZlZCBwaHlzaWNhbCB0ZW5hbnQgZGF0YWJhc2VcIilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVqZWN0cyB3b3JrIGFmdGVyIHRoZSBoYW5kbGUncyByZWFkeSBwaHlzaWNhbCBzY2hlbWEgZ2VuZXJhdGlvbiBjaGFuZ2VkIG9yIGNsb3NlZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhc3NlcnRUZW5hbnRSZWFkeSgpIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLnRlbmFudEhhbmRsZSB8fCAhdGhpcy5jb25maWcuZGF0YWJhc2VJZGVudGlmaWVyKSByZXR1cm5cblxuICAgIGNvbnN0IGxpZmVjeWNsZSA9IHRoaXMuY29uZmlnLnRlbmFudEhhbmRsZS5pbnNwZWN0KHtkYXRhYmFzZUlkZW50aWZpZXI6IHRoaXMuY29uZmlnLmRhdGFiYXNlSWRlbnRpZmllcn0pXG5cbiAgICBpZiAoIWxpZmVjeWNsZS5yZWFkeSB8fCAhbGlmZWN5Y2xlLnNjaGVtYUdlbmVyYXRpb24gfHwgbGlmZWN5Y2xlLnNjaGVtYUdlbmVyYXRpb24gIT09IHRoaXMuX3RlbmFudFNjaGVtYUdlbmVyYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN5bmNDbGllbnQgdGVuYW50IGRhdGFiYXNlIGdlbmVyYXRpb24gaXMgc3RhbGUgb3Igbm90IHJlYWR5XCIpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRzIGEgY3VzdG9tIHJlbW90ZSByZXNvbHZlciByZXN1bHQgdG8gdGhlIGFjdGl2ZSB0ZW5hbnQgb3BlcmF0aW9uIGFmdGVyIHByb3ZpbmcgaXRzIGNhcHR1cmVkIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge3tvcGVyYXRpb246IGltcG9ydChcIi4uL2RhdGFiYXNlL29wZXJhdGlvbi5qc1wiKS5kZWZhdWx0LCByZWNvcmQ6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fX0gYXJncyAtIEJpbmRpbmcgYXJncy5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBiaW5kUmVtb3RlUmVjb3JkKHtvcGVyYXRpb24sIHJlY29yZH0pIHtcbiAgICBpZiAocmVjb3JkLmRhdGFiYXNlT3BlcmF0aW9uPy4oKSA9PT0gb3BlcmF0aW9uKSByZXR1cm5cbiAgICB0aGlzLmFzc2VydFJlY29yZE93bmVyc2hpcChyZWNvcmQpXG4gICAgb3BlcmF0aW9uLmJpbmRSZWNvcmQocmVjb3JkKVxuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIG9uZSByZXNvdXJjZSBjb25maWcgZnJvbSBhIG1vZGVsJ3MgYHN0YXRpYyBzeW5jYCBkZWNsYXJhdGlvbiBwbHVzIGl0c1xuICogZGVyaXZlZCBjb2x1bW4gbWV0YWRhdGEuXG4gKiBAcGFyYW0ge3tkZWNsYXJhdGlvbjogaW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5Nb2RlbFN5bmNEZWNsYXJhdGlvbiwgbWV0YWRhdGFNb2RlbENsYXNzOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgbW9kZWxDbGFzczogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIHJlc291cmNlVHlwZTogc3RyaW5nfX0gYXJncyAtIERlY2xhcmF0aW9uIGFyZ3MuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50UmVzb3VyY2VDb25maWd9IERlcml2ZWQgcmVzb3VyY2UgY29uZmlnLlxuICovXG5mdW5jdGlvbiByZXNvdXJjZUNvbmZpZ0Zyb21TeW5jRGVjbGFyYXRpb24oe2RlY2xhcmF0aW9uLCBtZXRhZGF0YU1vZGVsQ2xhc3MsIG1vZGVsQ2xhc3MsIHJlc291cmNlVHlwZX0pIHtcbiAgY29uc3Qgbm9ybWFsaXplZERlY2xhcmF0aW9uID0gZGVjbGFyYXRpb24gPT09IHRydWUgPyB7fSA6IGRlY2xhcmF0aW9uXG5cbiAgaWYgKCFub3JtYWxpemVkRGVjbGFyYXRpb24gfHwgdHlwZW9mIG5vcm1hbGl6ZWREZWNsYXJhdGlvbiAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KG5vcm1hbGl6ZWREZWNsYXJhdGlvbikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cmVzb3VyY2VUeXBlfSBzdGF0aWMgc3luYyBtdXN0IGJlIHRydWUgb3IgYSBzeW5jIGRlY2xhcmF0aW9uIG9iamVjdCwgZ290OiAke1N0cmluZyhkZWNsYXJhdGlvbil9YClcbiAgfVxuXG4gIGNvbnN0IHthZnRlckFwcGx5LCBhdHRyaWJ1dGVzLCBib29sZWFuQXR0cmlidXRlcywgY29uZmxpY3RUcmFja2luZywgZmluZFJlY29yZCwgZmluZFJlY29yZEZvckRlbGV0ZSwgbG9jYWxPbmx5QXR0cmlidXRlcywgcHVibGlzaCwgcmVhbHRpbWUsIHN5bmNUeXBlLCB0cmFjaywgdHJhY2tlZERhdGEsIC4uLnJlc3REZWNsYXJhdGlvbn0gPSBub3JtYWxpemVkRGVjbGFyYXRpb25cbiAgY29uc3QgdW5rbm93bktleXMgPSBPYmplY3Qua2V5cyhyZXN0RGVjbGFyYXRpb24pXG5cbiAgLy8gYHB1Ymxpc2hgIGlzIHRoZSBzZXJ2ZXItc2lkZSBoYWxmIG9mIHRoZSBzaGFyZWQgYHN0YXRpYyBzeW5jYCBkZWNsYXJhdGlvblxuICAvLyAoY29uc3VtZWQgYnkgU3luY1B1Ymxpc2hlciBvbiB0aGUgYmFja2VuZCkgLSB0aGUgY2xpZW50IGRlcml2ZXMgbm90aGluZ1xuICAvLyBmcm9tIGl0LCBidXQgbW9kZWxzIGRlY2xhcmVkIG9uY2UgZm9yIGJvdGggc2lkZXMgbXVzdCBzdGF5IHZhbGlkIGhlcmUuXG4gIHZvaWQgcHVibGlzaFxuXG4gIGlmICh1bmtub3duS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3Jlc291cmNlVHlwZX0gc3RhdGljIHN5bmMgcmVjZWl2ZWQgdW5rbm93biBrZXlzOiAke3Vua25vd25LZXlzLmpvaW4oXCIsIFwiKX0gKHN1cHBvcnRlZDogYWZ0ZXJBcHBseSwgYXR0cmlidXRlcywgYm9vbGVhbkF0dHJpYnV0ZXMsIGNvbmZsaWN0VHJhY2tpbmcsIGZpbmRSZWNvcmQsIGZpbmRSZWNvcmRGb3JEZWxldGUsIGxvY2FsT25seUF0dHJpYnV0ZXMsIHB1Ymxpc2gsIHJlYWx0aW1lLCBzeW5jVHlwZSwgdHJhY2ssIHRyYWNrZWREYXRhKWApXG4gIH1cbiAgaWYgKHN5bmNUeXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHN5bmNUeXBlICE9PSBcImZ1bmN0aW9uXCIgJiYgc3luY1R5cGUgIT09IFwidXBzZXJ0XCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cmVzb3VyY2VUeXBlfSBzdGF0aWMgc3luYyBzeW5jVHlwZSBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgdGhlIHN0cmluZyBcInVwc2VydFwiLCBnb3Q6ICR7U3RyaW5nKHN5bmNUeXBlKX1gKVxuICB9XG5cbiAgY29uc3QgZGVyaXZlZCA9IGRlcml2ZWRTeW5jQXR0cmlidXRlcyh7bW9kZWxDbGFzczogbWV0YWRhdGFNb2RlbENsYXNzLCByZXNvdXJjZVR5cGV9KVxuXG4gIGlmIChjb25mbGljdFRyYWNraW5nKSB2YWxpZGF0ZUNvbmZsaWN0VHJhY2tpbmcoe2NvbmZsaWN0VHJhY2tpbmcsIGRlcml2ZWQsIHJlc291cmNlVHlwZX0pXG5cbiAgcmV0dXJuIHtcbiAgICBhZnRlckFwcGx5LFxuICAgIGF0dHJpYnV0ZXMsXG4gICAgYm9vbGVhbkF0dHJpYnV0ZXM6IG1lcmdlZEF0dHJpYnV0ZU5hbWVzKGRlcml2ZWQuYm9vbGVhbkF0dHJpYnV0ZXMsIGJvb2xlYW5BdHRyaWJ1dGVzKSxcbiAgICBjb25mbGljdFRyYWNraW5nOiBjb25mbGljdFRyYWNraW5nID8gey4uLmNvbmZsaWN0VHJhY2tpbmcsIHZlcnNpb25BdHRyaWJ1dGU6IGNvbmZsaWN0VHJhY2tpbmcudmVyc2lvbkF0dHJpYnV0ZSB8fCBcInVwZGF0ZWRBdFwifSA6IHVuZGVmaW5lZCxcbiAgICBmaW5kUmVjb3JkLFxuICAgIGZpbmRSZWNvcmRGb3JEZWxldGUsXG4gICAgbG9jYWxPbmx5QXR0cmlidXRlczogbWVyZ2VkQXR0cmlidXRlTmFtZXMoXG4gICAgICBkZXJpdmVkLmxvY2FsT25seUF0dHJpYnV0ZXMsXG4gICAgICBbLi4uKGxvY2FsT25seUF0dHJpYnV0ZXMgfHwgW10pLCAuLi4oY29uZmxpY3RUcmFja2luZyA/IFtjb25mbGljdFRyYWNraW5nLnZlcnNpb25BdHRyaWJ1dGUgfHwgXCJ1cGRhdGVkQXRcIl0gOiBbXSldXG4gICAgKSxcbiAgICBtZXRhZGF0YU1vZGVsQ2xhc3MsXG4gICAgbW9kZWxDbGFzcyxcbiAgICByZWFsdGltZSxcbiAgICBzeW5jVHlwZSxcbiAgICB0cmFjazogbm9ybWFsaXplZFRyYWNrKHRyYWNrKSxcbiAgICB0cmFja2VkRGF0YVxuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIG9uZSByZXNvdXJjZSdzIGR1cmFibGUgY29uZmxpY3QtdHJhY2tpbmcgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge3tjb25mbGljdFRyYWNraW5nOiBpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRDb25mbGljdFRyYWNraW5nQ29uZmlnLCBkZXJpdmVkOiB7Ym9vbGVhbkF0dHJpYnV0ZXM6IHN0cmluZ1tdLCBsb2NhbE9ubHlBdHRyaWJ1dGVzOiBzdHJpbmdbXX0sIHJlc291cmNlVHlwZTogc3RyaW5nfX0gYXJncyAtIFZhbGlkYXRpb24gYXJncy5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUNvbmZsaWN0VHJhY2tpbmcoe2NvbmZsaWN0VHJhY2tpbmcsIGRlcml2ZWQsIHJlc291cmNlVHlwZX0pIHtcbiAgY29uc3QgcmVxdWlyZWRTdHJpbmdzID0ge1xuICAgIGFjdG9yRGV2aWNlSWQ6IGNvbmZsaWN0VHJhY2tpbmcuYWN0b3JEZXZpY2VJZCxcbiAgICBhY3RvclVzZXJJZDogY29uZmxpY3RUcmFja2luZy5hY3RvclVzZXJJZCxcbiAgICBvZmZsaW5lR3JhbnRJZDogY29uZmxpY3RUcmFja2luZy5vZmZsaW5lR3JhbnRJZCxcbiAgICBwb2xpY3lIYXNoOiBjb25mbGljdFRyYWNraW5nLnBvbGljeUhhc2hcbiAgfVxuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlcXVpcmVkU3RyaW5ncykpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCkgdGhyb3cgbmV3IEVycm9yKGAke3Jlc291cmNlVHlwZX0gY29uZmxpY3RUcmFja2luZy4ke2tleX0gbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmdgKVxuICB9XG4gIGlmICghY29uZmxpY3RUcmFja2luZy5tdXRhdGlvbkxvZyB8fCB0eXBlb2YgY29uZmxpY3RUcmFja2luZy5tdXRhdGlvbkxvZy5hcHBlbmQgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yKGAke3Jlc291cmNlVHlwZX0gY29uZmxpY3RUcmFja2luZy5tdXRhdGlvbkxvZyBtdXN0IGJlIGEgTG9jYWxNdXRhdGlvbkxvZ2ApXG4gIGlmICh0eXBlb2YgY29uZmxpY3RUcmFja2luZy5jbGllbnRNdXRhdGlvbklkICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcihgJHtyZXNvdXJjZVR5cGV9IGNvbmZsaWN0VHJhY2tpbmcuY2xpZW50TXV0YXRpb25JZCBtdXN0IGJlIGEgZnVuY3Rpb25gKVxuICBpZiAoIWNvbmZsaWN0VHJhY2tpbmcudmVyc2lvbkF0dHJpYnV0ZSAmJiAhZGVyaXZlZC5sb2NhbE9ubHlBdHRyaWJ1dGVzLmluY2x1ZGVzKFwidXBkYXRlZEF0XCIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3Jlc291cmNlVHlwZX0gY29uZmxpY3RUcmFja2luZyByZXF1aXJlcyB2ZXJzaW9uQXR0cmlidXRlIGJlY2F1c2UgdGhlIG1vZGVsIGhhcyBubyB1cGRhdGVkQXQgY29sdW1uYClcbiAgfVxufVxuXG4vKipcbiAqIERlcml2ZXMgYm9vbGVhbiBhbmQgbG9jYWwtb25seSBhdHRyaWJ1dGUgbmFtZXMgZnJvbSBhIG1vZGVsJ3MgY29sdW1uIG1ldGFkYXRhOlxuICogYm9vbGVhbnMgZnJvbSBib29sZWFuIGNvbHVtbiB0eXBlczsgbG9jYWwtb25seSBmcm9tIHRoZSBwcmltYXJ5IGtleSxcbiAqIGNyZWF0ZWRBdC91cGRhdGVkQXQsIGFuZCBzeW5jIGJvb2trZWVwaW5nIGNvbHVtbnMuXG4gKiBAcGFyYW0ge3ttb2RlbENsYXNzOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgcmVzb3VyY2VUeXBlOiBzdHJpbmd9fSBhcmdzIC0gRGVyaXZhdGlvbiBhcmdzLlxuICogQHJldHVybnMge3tib29sZWFuQXR0cmlidXRlczogc3RyaW5nW10sIGxvY2FsT25seUF0dHJpYnV0ZXM6IHN0cmluZ1tdfX0gRGVyaXZlZCBhdHRyaWJ1dGUgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGRlcml2ZWRTeW5jQXR0cmlidXRlcyh7bW9kZWxDbGFzcywgcmVzb3VyY2VUeXBlfSkge1xuICBpZiAoXG4gICAgdHlwZW9mIG1vZGVsQ2xhc3MuZ2V0Q29sdW1uTmFtZXMgIT09IFwiZnVuY3Rpb25cIiB8fFxuICAgIHR5cGVvZiBtb2RlbENsYXNzLmdldENvbHVtbk5hbWVUb0F0dHJpYnV0ZU5hbWVNYXAgIT09IFwiZnVuY3Rpb25cIiB8fFxuICAgIHR5cGVvZiBtb2RlbENsYXNzLmdldENvbHVtblR5cGVCeU5hbWUgIT09IFwiZnVuY3Rpb25cIiB8fFxuICAgIHR5cGVvZiBtb2RlbENsYXNzLnByaW1hcnlLZXkgIT09IFwiZnVuY3Rpb25cIiB8fFxuICAgIHR5cGVvZiBtb2RlbENsYXNzLmhhc1ByaW1hcnlLZXkgIT09IFwiZnVuY3Rpb25cIlxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cmVzb3VyY2VUeXBlfSBzdGF0aWMgc3luYyByZXF1aXJlcyBhIFZlbG9jaW91cyBtb2RlbCBjbGFzcyB3aXRoIGNvbHVtbiBtZXRhZGF0YSAoZ2V0Q29sdW1uTmFtZXMsIGdldENvbHVtbk5hbWVUb0F0dHJpYnV0ZU5hbWVNYXAsIGdldENvbHVtblR5cGVCeU5hbWUsIHByaW1hcnlLZXksIGhhc1ByaW1hcnlLZXkpYClcbiAgfVxuXG4gIGNvbnN0IGNvbHVtbk5hbWVUb0F0dHJpYnV0ZU5hbWUgPSBtb2RlbENsYXNzLmdldENvbHVtbk5hbWVUb0F0dHJpYnV0ZU5hbWVNYXAoKVxuICAvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuICBjb25zdCBib29sZWFuQXR0cmlidXRlcyA9IFtdXG4gIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gIGNvbnN0IGxvY2FsT25seUF0dHJpYnV0ZXMgPSBbXVxuXG4gIGlmIChtb2RlbENsYXNzLmhhc1ByaW1hcnlLZXkoKSkge1xuICAgIGNvbnN0IHByaW1hcnlLZXlDb2x1bW4gPSBtb2RlbENsYXNzLnByaW1hcnlLZXkoKVxuXG4gICAgbG9jYWxPbmx5QXR0cmlidXRlcy5wdXNoKGNvbHVtbk5hbWVUb0F0dHJpYnV0ZU5hbWVbcHJpbWFyeUtleUNvbHVtbl0gfHwgcHJpbWFyeUtleUNvbHVtbilcbiAgfVxuXG4gIGZvciAoY29uc3QgY29sdW1uTmFtZSBvZiBtb2RlbENsYXNzLmdldENvbHVtbk5hbWVzKCkpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gY29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZVtjb2x1bW5OYW1lXSB8fCBjb2x1bW5OYW1lXG4gICAgY29uc3QgY29sdW1uVHlwZSA9IG1vZGVsQ2xhc3MuZ2V0Q29sdW1uVHlwZUJ5TmFtZShjb2x1bW5OYW1lKVxuXG4gICAgaWYgKExPQ0FMX0JPT0tLRUVQSU5HX0FUVFJJQlVURV9OQU1FUy5pbmNsdWRlcyhhdHRyaWJ1dGVOYW1lKSAmJiAhbG9jYWxPbmx5QXR0cmlidXRlcy5pbmNsdWRlcyhhdHRyaWJ1dGVOYW1lKSkge1xuICAgICAgbG9jYWxPbmx5QXR0cmlidXRlcy5wdXNoKGF0dHJpYnV0ZU5hbWUpXG4gICAgfVxuICAgIGlmIChjb2x1bW5UeXBlICYmIGlzQm9vbGVhbkNvbHVtblR5cGUoY29sdW1uVHlwZSkpIHtcbiAgICAgIGJvb2xlYW5BdHRyaWJ1dGVzLnB1c2goYXR0cmlidXRlTmFtZSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge2Jvb2xlYW5BdHRyaWJ1dGVzLCBsb2NhbE9ubHlBdHRyaWJ1dGVzfVxufVxuXG4vKipcbiAqIE1lcmdlcyBkZXJpdmVkIGF0dHJpYnV0ZSBuYW1lcyB3aXRoIGRlY2xhcmVkIGV4dHJhcyBpbnRvIGEgc29ydGVkLCBkdXBsaWNhdGUtZnJlZSBsaXN0LlxuICogQHBhcmFtIHtzdHJpbmdbXX0gZGVyaXZlZCAtIERlcml2ZWQgYXR0cmlidXRlIG5hbWVzLlxuICogQHBhcmFtIHtzdHJpbmdbXSB8IHVuZGVmaW5lZH0gZGVjbGFyZWQgLSBEZWNsYXJlZCBleHRyYSBhdHRyaWJ1dGUgbmFtZXMuXG4gKiBAcmV0dXJucyB7c3RyaW5nW119IE1lcmdlZCBhdHRyaWJ1dGUgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlZEF0dHJpYnV0ZU5hbWVzKGRlcml2ZWQsIGRlY2xhcmVkKSB7XG4gIHJldHVybiBbLi4ubmV3IFNldChbLi4uZGVyaXZlZCwgLi4uKGRlY2xhcmVkIHx8IFtdKV0pXS5zb3J0KClcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgZGVjbGFyYXRpb24ncyB0cmFjayB2YWx1ZTogYW4gb3BlcmF0aW9ucyBhcnJheSBpcyBzaG9ydGhhbmQgZm9yXG4gKiB0aGUge29wZXJhdGlvbnN9IGZvcm0uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuTW9kZWxTeW5jRGVjbGFyYXRpb25Db25maWdbXCJ0cmFja1wiXX0gdHJhY2sgLSBEZWNsYXJlZCB0cmFjayB2YWx1ZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRSZXNvdXJjZUNvbmZpZ1tcInRyYWNrXCJdfSBOb3JtYWxpemVkIHRyYWNrIHZhbHVlLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVkVHJhY2sodHJhY2spIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodHJhY2spKSByZXR1cm4ge29wZXJhdGlvbnM6IHRyYWNrfVxuXG4gIHJldHVybiB0cmFja1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGZyYW1ld29yay1vd25lZCBzeW5jIGVuZHBvaW50IFBPU1RlciBvdmVyIHRoZSBjb25maWd1cmVkIHRyYW5zcG9ydC5cbiAqIEBwYXJhbSB7e3BhdGg6IHN0cmluZywgcmVxdWVzdENvbnRleHQ6IGltcG9ydChcIi4uL3JlbW90ZS1yZXF1ZXN0LWNvbnRleHQuanNcIikuUmVtb3RlUmVxdWVzdENvbnRleHQsIHRyYW5zcG9ydDogaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5WZWxvY2lvdXNTeW5jQ2xpZW50VHJhbnNwb3J0fX0gYXJncyAtIFBvc3RlciBhcmdzLlxuICogQHJldHVybnMgeyhwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4pID0+IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBTeW5jIGVuZHBvaW50IFBPU1Rlci5cbiAqL1xuZnVuY3Rpb24gdHJhbnNwb3J0UG9zdGVyKHtwYXRoLCByZXF1ZXN0Q29udGV4dCwgdHJhbnNwb3J0fSkge1xuICByZXR1cm4gYXN5bmMgKHBheWxvYWQpID0+IHtcbiAgICBjb25zdCByZXF1ZXN0UGF5bG9hZCA9IG1lcmdlUmVtb3RlUmVxdWVzdENvbnRleHQoe1xuICAgICAgY29udGV4dDogcmVxdWVzdENvbnRleHQsXG4gICAgICBsYWJlbDogXCJTeW5jIGNsaWVudCByZXF1ZXN0IGNvbnRleHRcIixcbiAgICAgIHBhcmFtczogcGF5bG9hZFxuICAgIH0pXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0cmFuc3BvcnQucG9zdChwYXRoLCByZXF1ZXN0UGF5bG9hZClcblxuICAgIGlmICghcmVzcG9uc2UgfHwgdHlwZW9mIHJlc3BvbnNlLmpzb24gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBzeW5jLmNsaWVudCB0cmFuc3BvcnQucG9zdCBtdXN0IHJlc29sdmUgdG8gYSByZXNwb25zZSB3aXRoIGEganNvbigpIG1ldGhvZCBmb3IgJHtwYXRofSAobGlrZSB0aGUgZnJvbnRlbmQtbW9kZWwgd2Vic29ja2V0IGNsaWVudClgKVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgfVxufVxuXG4vKipcbiAqIExhemlseSBidWlsZHMgKGFuZCBtZW1vaXplcyBwZXIgY29uZmlndXJhdGlvbikgdGhlIHN5bmMgY2xpZW50IGRlcml2ZWQgZnJvbSB0aGVcbiAqIGFwcCdzIFZlbG9jaW91cyBjb25maWd1cmF0aW9uIGFuZCByZWdpc3RlcnMgaXQgYXMgdGhlIGN1cnJlbnQgc3luYyBjbGllbnQuXG4gKiBAcGFyYW0ge0NvbmZpZ3VyYXRpb259IFtjb25maWd1cmF0aW9uXSAtIENvbmZpZ3VyYXRpb24gb3duaW5nIHRoZSByZWdpc3RlcmVkIG1vZGVscyBhbmQgdGhlIHN5bmMuY2xpZW50IGJsb2NrLiBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLlxuICogQHJldHVybnMge1N5bmNDbGllbnR9IE1lbW9pemVkIHN5bmMgY2xpZW50IGZvciB0aGUgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN5bmNDbGllbnQoY29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRpb24uY3VycmVudCgpKSB7XG4gIGxldCBjbGllbnQgPSBzeW5jQ2xpZW50c0J5Q29uZmlndXJhdGlvbi5nZXQoY29uZmlndXJhdGlvbilcblxuICBpZiAoIWNsaWVudCkge1xuICAgIGNsaWVudCA9IFN5bmNDbGllbnQuZnJvbUNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbilcbiAgICBzeW5jQ2xpZW50c0J5Q29uZmlndXJhdGlvbi5zZXQoY29uZmlndXJhdGlvbiwgY2xpZW50KVxuICAgIGNsaWVudC5zZXRDdXJyZW50KClcbiAgfVxuXG4gIHJldHVybiBjbGllbnRcbn1cblxuLyoqXG4gKiBEZWNsYXJlcyBhIHN5bmMgc2NvcGUgb24gdGhlIGN1cnJlbnQgc3luYyBjbGllbnQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHQ8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBxdWVyeSAtIFF1ZXJ5IGRlY2xhcmluZyB0aGUgc3luYyBzY29wZS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHtzY29wZTogaW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TZXJpYWxpemVkU3luY1Njb3BlLCBwdWxsZWQ6IGltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDaGFuZ2VzUmVzdWx0IHwgbnVsbH0+fSBEZWNsYXJlZCBzY29wZSBhbmQgcHVsbCByZXN1bHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzeW5jKHF1ZXJ5KSB7XG4gIHJldHVybiBhd2FpdCBTeW5jQ2xpZW50LmN1cnJlbnQoKS5zeW5jKHF1ZXJ5KVxufVxuIl19
|
|
1190
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3luYy9zeW5jLWNsaWVudC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxhQUFhLE1BQU0scUJBQXFCLENBQUE7QUFDL0MsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sNkJBQTZCLENBQUE7QUFDL0QsT0FBTyxNQUFNLE1BQU0sY0FBYyxDQUFBO0FBQ2pDLE9BQU8sRUFBQywyQkFBMkIsRUFBRSx5QkFBeUIsRUFBQyxNQUFNLDhCQUE4QixDQUFBO0FBQ25HLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLCtCQUErQixDQUFBO0FBQ25FLE9BQU8sYUFBYSxNQUFNLDZCQUE2QixDQUFBO0FBQ3ZELE9BQU8sd0JBQXdCLE1BQU0sb0NBQW9DLENBQUE7QUFFekUsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFDekQsT0FBTyxhQUFhLE1BQU0sc0JBQXNCLENBQUE7QUFDaEQsT0FBTyxrQkFBa0IsTUFBTSwyQkFBMkIsQ0FBQTtBQUMxRCxPQUFPLGNBQWMsTUFBTSx1QkFBdUIsQ0FBQTtBQUNsRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQTtBQUVqRixJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUE7QUFFckIsc0ZBQXNGO0FBQ3RGLE1BQU0sc0JBQXNCLEdBQUcsRUFBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBQyxDQUFBO0FBRXRHOzs7OztvREFLb0Q7QUFDcEQsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQTtBQUV2RCxrR0FBa0c7QUFDbEcsTUFBTSxpQ0FBaUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLENBQUMsQ0FBQTtB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USxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNyRCxNQUFNLElBQUksS0FBSyxDQUFDLGtGQUFrRixJQUFJLDZDQUE2QyxDQUFDLENBQUE7UUFDdEosQ0FBQztRQUVELE9BQU8sTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDOUIsQ0FBQyxDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDLE9BQU8sRUFBRTtJQUNoRSxJQUFJLE1BQU0sR0FBRywwQkFBMEIsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7SUFFMUQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osTUFBTSxHQUFHLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUNwRCwwQkFBMEIsQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ3JELE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQTtJQUNyQixDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsSUFBSSxDQUFDLEtBQUs7SUFDOUIsT0FBTyxNQUFNLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDL0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgQ29uZmlndXJhdGlvbiBmcm9tIFwiLi4vY29uZmlndXJhdGlvbi5qc1wiXG5pbXBvcnQge2lzQm9vbGVhbkNvbHVtblR5cGV9IGZyb20gXCIuLi9kYXRhYmFzZS9jb2x1bW4tdHlwZXMuanNcIlxuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vbG9nZ2VyLmpzXCJcbmltcG9ydCB7Y2FwdHVyZVJlbW90ZVJlcXVlc3RDb250ZXh0LCBtZXJnZVJlbW90ZVJlcXVlc3RDb250ZXh0fSBmcm9tIFwiLi4vcmVtb3RlLXJlcXVlc3QtY29udGV4dC5qc1wiXG5pbXBvcnQge3NjYWxhck1vZGVsUHJpbWFyeUtleX0gZnJvbSBcIi4uL3V0aWxzL21vZGVsLXByaW1hcnkta2V5LmpzXCJcbmltcG9ydCByZXN0QXJnc0Vycm9yIGZyb20gXCIuLi91dGlscy9yZXN0LWFyZ3MtZXJyb3IuanNcIlxuaW1wb3J0IFZlbG9jaW91c1dlYnNvY2tldENsaWVudCBmcm9tIFwiLi4vaHR0cC1jbGllbnQvd2Vic29ja2V0LWNsaWVudC5qc1wiXG5cbmltcG9ydCB7c2VyaWFsaXplZFNjb3BlRnJvbVF1ZXJ5fSBmcm9tIFwiLi9xdWVyeS1zY29wZS5qc1wiXG5pbXBvcnQgU3luY0FwaUNsaWVudCBmcm9tIFwiLi9zeW5jLWFwaS1jbGllbnQuanNcIlxuaW1wb3J0IFN5bmNSZWFsdGltZUJyaWRnZSBmcm9tIFwiLi9zeW5jLXJlYWx0aW1lLWJyaWRnZS5qc1wiXG5pbXBvcnQgU3luY1Njb3BlU3RvcmUgZnJvbSBcIi4vc3luYy1zY29wZS1zdG9yZS5qc1wiXG5pbXBvcnQge2N1cnJlbnRTeW5jQ2xpZW50LCBzZXRDdXJyZW50U3luY0NsaWVudH0gZnJvbSBcIi4vc3luYy1jbGllbnQtcmVnaXN0cnkuanNcIlxuXG5sZXQgY2xpZW50Q291bnRlciA9IDBcblxuLyoqIEB0eXBlIHt7Y3JlYXRlOiBcImFmdGVyQ3JlYXRlXCIsIHVwZGF0ZTogXCJhZnRlclVwZGF0ZVwiLCBkZXN0cm95OiBcImFmdGVyRGVzdHJveVwifX0gKi9cbmNvbnN0IFRSQUNLRURfQ0FMTEJBQ0tfTkFNRVMgPSB7Y3JlYXRlOiBcImFmdGVyQ3JlYXRlXCIsIGRlc3Ryb3k6IFwiYWZ0ZXJEZXN0cm95XCIsIHVwZGF0ZTogXCJhZnRlclVwZGF0ZVwifVxuXG4vKipcbiAqIE9wZXJhdGlvbnMgdHJhY2tlZCBieSBkZWZhdWx0IGZvciBtb2RlbHMgZGVjbGFyaW5nIGBzdGF0aWMgc3luY2Agd2l0aG91dCBhXG4gKiBgdHJhY2tgIGtleTogbG9jYWwgY3JlYXRlcyBhbmQgdXBkYXRlcyBxdWV1ZSBhdXRvbWF0aWNhbGx5LiBEZXN0cm95cyBhcmUgbm90XG4gKiB0cmFja2VkIGJ5IGRlZmF1bHQgYmVjYXVzZSBhIGxvY2FsIGRlc3Ryb3kgaXMgb2Z0ZW4gY2FjaGUgZXZpY3Rpb24gcmF0aGVyXG4gKiB0aGFuIGEgc2VydmVyIGRlbGV0ZTsgb3B0IGluIHdpdGggYHRyYWNrOiB0cnVlYCBvciBhbiBvcGVyYXRpb25zIGxpc3QuXG4gKiBAdHlwZSB7QXJyYXk8XCJjcmVhdGVcIiB8IFwidXBkYXRlXCIgfCBcImRlc3Ryb3lcIj59ICovXG5jb25zdCBERUZBVUxUX1RSQUNLRURfT1BFUkFUSU9OUyA9IFtcImNyZWF0ZVwiLCBcInVwZGF0ZVwiXVxuXG4vKiogQXR0cmlidXRlIG5hbWVzIHRyZWF0ZWQgYXMgY2xpZW50LWxvY2FsIHN5bmMgYm9va2tlZXBpbmcgd2hlbiBkZXJpdmluZyBsb2NhbE9ubHlBdHRyaWJ1dGVzLiAqL1xuY29uc3QgTE9DQUxfQk9PS0tFRVBJTkdfQVRUUklCVVRFX05BTUVTID0gW1wiY3JlYXRlZEF0XCIsIFwidXBkYXRlZEF0XCIsIFwibGFzdFN5bmNDaGFuZ2VBdFwiXVxuXG5jb25zdCBTWU5DX1JFUVVFU1RfUkVTRVJWRURfS0VZUyA9IFtcbiAgXCJhZnRlcklkXCIsXG4gIFwiYWZ0ZXJTZXJ2ZXJTZXF1ZW5jZVwiLFxuICBcImFmdGVyVXBkYXRlZEF0XCIsXG4gIFwiYXV0aGVudGljYXRpb25Ub2tlblwiLFxuICBcImxpbWl0XCIsXG4gIFwic2NvcGVcIixcbiAgXCJzeW5jc1wiLFxuICBcInVwc3RyZWFtUmVmcmVzaFwiLFxuICBcInVwVG9JZFwiLFxuICBcInVwVG9TZXJ2ZXJTZXF1ZW5jZVwiLFxuICBcInVwVG9VcGRhdGVkQXRcIlxuXVxuXG4vKiogQHR5cGUge1dlYWtNYXA8Q29uZmlndXJhdGlvbiwgU3luY0NsaWVudD59ICovXG5jb25zdCBzeW5jQ2xpZW50c0J5Q29uZmlndXJhdGlvbiA9IG5ldyBXZWFrTWFwKClcblxuLyoqXG4gKiBEZWNsYXJhdGl2ZSBjbGllbnQtc2lkZSBzeW5jIGRyaXZlci5cbiAqXG4gKiBFdmVyeXRoaW5nIGlzIGRlcml2ZWQgZnJvbSB0aGUgYXBwJ3MgVmVsb2Npb3VzIGNvbmZpZ3VyYXRpb246IG1vZGVscyBkZWNsYXJlXG4gKiBgc3RhdGljIHN5bmNgLCB0cmFuc3BvcnQvYXV0aC9jb25uZWN0aXZpdHkgY29tZSBmcm9tIHRoZSBgc3luYy5jbGllbnRgXG4gKiBjb25maWd1cmF0aW9uIGJsb2NrLCBhbmQgVmVsb2Npb3VzIG93bnMgc2NvcGUgcGVyc2lzdGVuY2UsIHBlci1zY29wZSBjdXJzb3JzLFxuICogcHVsbCBwYWdpbmcvYXBwbHksIGxvY2FsIHF1ZXVlaW5nLCBhbmQgb25saW5lLWdhdGVkIHJlcGxheS4gRGVjbGFyZSBzeW5jXG4gKiBpbnRlcmVzdCBmcm9tIHF1ZXJpZXM6XG4gKlxuICogICAgIGF3YWl0IHN5bmNDbGllbnQoKS5zdGFydCgpXG4gKiAgICAgYXdhaXQgc3luY0NsaWVudCgpLnN5bmMoRXZlbnQud2hlcmUoe3BhcnRuZXJJZH0pKVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTeW5jQ2xpZW50IHtcbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgc3luYyBjbGllbnQgYnkgZGVyaXZpbmcgZXZlcnl0aGluZyBmcm9tIHRoZSBhcHAncyBWZWxvY2lvdXNcbiAgICogY29uZmlndXJhdGlvbjogZXZlcnkgcmVnaXN0ZXJlZCBtb2RlbCBkZWNsYXJpbmcgYHN0YXRpYyBzeW5jYCBiZWNvbWVzIGFcbiAgICogcmVzb3VyY2Ugd2l0aCBib29sZWFuQXR0cmlidXRlcyBkZXJpdmVkIGZyb20gY29sdW1uIHR5cGVzIGFuZFxuICAgKiBsb2NhbE9ubHlBdHRyaWJ1dGVzIGRlcml2ZWQgZnJvbSB0aGUgcHJpbWFyeSBrZXksIGNyZWF0ZWRBdC91cGRhdGVkQXQsIGFuZFxuICAgKiBzeW5jIGJvb2trZWVwaW5nIGNvbHVtbnM7IHRoZSBwZW5kaW5nLXN5bmMgbW9kZWwgaXMgdGhlIHJlZ2lzdGVyZWQgXCJTeW5jXCJcbiAgICogbW9kZWw7IHRyYW5zcG9ydCwgYXV0aCwgY29ubmVjdGl2aXR5LCBhbmQgZXJyb3IgcmVwb3J0aW5nIGNvbWUgZnJvbSB0aGVcbiAgICogYHN5bmMuY2xpZW50YCBjb25maWd1cmF0aW9uIGJsb2NrLCB3aXRoIHRoZSBmcmFtZXdvcmsgb3duaW5nIHRoZVxuICAgKiBgJHttb3VudFBhdGh9L2NoYW5nZXNgIGFuZCBgJHttb3VudFBhdGh9L3JlcGxheWAgUE9TVGVycy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRPcHRpb25zfSBbb3B0aW9uc10gLSBPcHRpb25hbCBvdmVycmlkZXMuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7Y29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRpb24uY3VycmVudCgpLCBkYXRhYmFzZUlkZW50aWZpZXIsIGxlZ2FjeUN1cnNvciwgcmVxdWVzdENvbnRleHQsIHNjb3BlU3RvcmUsIHN5bmNNb2RlbCwgdGVuYW50SGFuZGxlLCAuLi5yZXN0T3B0aW9uc30gPSBvcHRpb25zXG5cbiAgICByZXN0QXJnc0Vycm9yKHJlc3RPcHRpb25zKVxuXG4gICAgY29uc3QgY2xpZW50Q29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb24uZ2V0U3luY0NvbmZpZ3VyYXRpb24oKS5jbGllbnRcbiAgICBjb25zdCBjYXB0dXJlZFJlcXVlc3RDb250ZXh0ID0gY2FwdHVyZVJlbW90ZVJlcXVlc3RDb250ZXh0KHJlcXVlc3RDb250ZXh0LCB7XG4gICAgICBsYWJlbDogXCJTeW5jIGNsaWVudCByZXF1ZXN0IGNvbnRleHRcIixcbiAgICAgIHJlc2VydmVkS2V5czogU1lOQ19SRVFVRVNUX1JFU0VSVkVEX0tFWVNcbiAgICB9KVxuXG4gICAgaWYgKCFjbGllbnRDb25maWd1cmF0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jQ2xpZW50IHJlcXVpcmVzIGEgc3luYy5jbGllbnQgY29uZmlndXJhdGlvbiBibG9jazogbmV3IENvbmZpZ3VyYXRpb24oe3N5bmM6IHtjbGllbnQ6IHthdXRoZW50aWNhdGlvblRva2VuLCB0cmFuc3BvcnR9fX0pXCIpXG4gICAgfVxuXG4gICAgaWYgKEJvb2xlYW4odGVuYW50SGFuZGxlKSAhPT0gQm9vbGVhbihkYXRhYmFzZUlkZW50aWZpZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jQ2xpZW50IHRlbmFudEhhbmRsZSBhbmQgZGF0YWJhc2VJZGVudGlmaWVyIG11c3QgYmUgcHJvdmlkZWQgdG9nZXRoZXJcIilcbiAgICB9XG4gICAgaWYgKHRlbmFudEhhbmRsZSkge1xuICAgICAgdGVuYW50SGFuZGxlLmFzc2VydENvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbilcbiAgICAgIHRlbmFudEhhbmRsZS5kYXRhYmFzZUNvbmZpZ3VyYXRpb24oLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkYXRhYmFzZUlkZW50aWZpZXIpKVxuICAgIH1cblxuICAgIGNvbnN0IG1vZGVsQ2xhc3NlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0TW9kZWxDbGFzc2VzKClcbiAgICBjb25zdCByZXNvbHZlZFN5bmNNb2RlbCA9IHN5bmNNb2RlbCB8fCBtb2RlbENsYXNzZXMuU3luY1xuICAgIGNvbnN0IGRhdGFiYXNlSWRlbnRpdHkgPSB0ZW5hbnRIYW5kbGUgPyB0ZW5hbnRIYW5kbGUuZGF0YWJhc2VJZGVudGl0eSgvKiogQHR5cGUge3N0cmluZ30gKi8gKGRhdGFiYXNlSWRlbnRpZmllcikpIDogbnVsbFxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50UmVzb3VyY2VDb25maWc+fSAqL1xuICAgIGNvbnN0IHJlc291cmNlcyA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgT2JqZWN0LnZhbHVlcyhtb2RlbENsYXNzZXMpKSB7XG4gICAgICBpZiAoIW1vZGVsQ2xhc3Muc3luYykgY29udGludWVcbiAgICAgIGlmICh0ZW5hbnRIYW5kbGUgJiYgbW9kZWxDbGFzcy5nZXREYXRhYmFzZUlkZW50aWZpZXIoe3RlbmFudDogdGVuYW50SGFuZGxlLnRlbmFudCgpfSkgIT09IGRhdGFiYXNlSWRlbnRpZmllcikgY29udGludWVcblxuICAgICAgY29uc3QgcmVzb3VyY2VUeXBlID0gbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKVxuXG4gICAgICBjb25zdCBtZXRhZGF0YU1vZGVsQ2xhc3MgPSB0ZW5hbnRIYW5kbGVcbiAgICAgICAgPyB0ZW5hbnRIYW5kbGUubWV0YWRhdGFNb2RlbENsYXNzKHtkYXRhYmFzZUlkZW50aWZpZXI6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGF0YWJhc2VJZGVudGlmaWVyKSwgbW9kZWxDbGFzc30pXG4gICAgICAgIDogbW9kZWxDbGFzc1xuICAgICAgY29uc3QgcmVzb3VyY2VDb25maWcgPSByZXNvdXJjZUNvbmZpZ0Zyb21TeW5jRGVjbGFyYXRpb24oe2RlY2xhcmF0aW9uOiBtb2RlbENsYXNzLnN5bmMsIG1ldGFkYXRhTW9kZWxDbGFzcywgbW9kZWxDbGFzcywgcmVzb3VyY2VUeXBlfSlcblxuICAgICAgaWYgKGRhdGFiYXNlSWRlbnRpdHkgJiYgcmVzb3VyY2VDb25maWcuY29uZmxpY3RUcmFja2luZykge1xuICAgICAgICByZXNvdXJjZUNvbmZpZy5jb25mbGljdFRyYWNraW5nID0ge1xuICAgICAgICAgIC4uLnJlc291cmNlQ29uZmlnLmNvbmZsaWN0VHJhY2tpbmcsXG4gICAgICAgICAgbXV0YXRpb25Mb2c6IHJlc291cmNlQ29uZmlnLmNvbmZsaWN0VHJhY2tpbmcubXV0YXRpb25Mb2cucGFydGl0aW9uKGRhdGFiYXNlSWRlbnRpdHkpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVzb3VyY2VzW3Jlc291cmNlVHlwZV0gPSByZXNvdXJjZUNvbmZpZ1xuICAgIH1cblxuICAgIGlmIChPYmplY3Qua2V5cyhyZXNvdXJjZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY0NsaWVudCBmb3VuZCBubyByZWdpc3RlcmVkIG1vZGVscyBkZWNsYXJpbmcgc3RhdGljIHN5bmMgLSBkZWNsYXJlIGBzdGF0aWMgc3luYyA9IHRydWVgIChvciBhIHN5bmMgZGVjbGFyYXRpb24gb2JqZWN0KSBvbiB0aGUgbW9kZWxzIHRoYXQgc2hvdWxkIHN5bmNcIilcbiAgICB9XG5cbiAgICBpZiAoIXJlc29sdmVkU3luY01vZGVsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jQ2xpZW50IHJlcXVpcmVzIGEgcmVnaXN0ZXJlZCBcXFwiU3luY1xcXCIgbW9kZWwgZm9yIHBlbmRpbmcgbG9jYWwgc3luYyByb3dzIChvciBwYXNzIG9wdGlvbnMuc3luY01vZGVsKVwiKVxuICAgIH1cbiAgICBpZiAodGVuYW50SGFuZGxlICYmIHJlc29sdmVkU3luY01vZGVsLmdldERhdGFiYXNlSWRlbnRpZmllcih7dGVuYW50OiB0ZW5hbnRIYW5kbGUudGVuYW50KCl9KSAhPT0gZGF0YWJhc2VJZGVudGlmaWVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFN5bmNDbGllbnQgc3luYyBtb2RlbCBkb2VzIG5vdCB1c2UgdGVuYW50IGRhdGFiYXNlICR7SlNPTi5zdHJpbmdpZnkoZGF0YWJhc2VJZGVudGlmaWVyKX1gKVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50Q29uZmlnfSAqL1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgYXV0aGVudGljYXRpb25Ub2tlbjogY2xpZW50Q29uZmlndXJhdGlvbi5hdXRoZW50aWNhdGlvblRva2VuLFxuICAgICAgYmF0Y2hTaXplOiBjbGllbnRDb25maWd1cmF0aW9uLmJhdGNoU2l6ZSxcbiAgICAgIGNvbmZpZ3VyYXRpb24sXG4gICAgICBkYXRhYmFzZUlkZW50aWZpZXIsXG4gICAgICBpc09ubGluZTogY2xpZW50Q29uZmlndXJhdGlvbi5pc09ubGluZSxcbiAgICAgIGxlZ2FjeUN1cnNvcixcbiAgICAgIG9uRXJyb3I6IGNsaWVudENvbmZpZ3VyYXRpb24ub25FcnJvcixcbiAgICAgIHBvc3RDaGFuZ2VzOiB0cmFuc3BvcnRQb3N0ZXIoe3BhdGg6IGAke2NsaWVudENvbmZpZ3VyYXRpb24ubW91bnRQYXRofS9jaGFuZ2VzYCwgcmVxdWVzdENvbnRleHQ6IGNhcHR1cmVkUmVxdWVzdENvbnRleHQsIHRyYW5zcG9ydDogY2xpZW50Q29uZmlndXJhdGlvbi50cmFuc3BvcnR9KSxcbiAgICAgIHBvc3RSZXBsYXk6IHRyYW5zcG9ydFBvc3Rlcih7cGF0aDogYCR7Y2xpZW50Q29uZmlndXJhdGlvbi5tb3VudFBhdGh9L3JlcGxheWAsIHJlcXVlc3RDb250ZXh0OiBjYXB0dXJlZFJlcXVlc3RDb250ZXh0LCB0cmFuc3BvcnQ6IGNsaWVudENvbmZpZ3VyYXRpb24udHJhbnNwb3J0fSksXG4gICAgICByZWFsdGltZTogY2xpZW50Q29uZmlndXJhdGlvbi5yZWFsdGltZSxcbiAgICAgIHJlcXVlc3RDb250ZXh0OiBjYXB0dXJlZFJlcXVlc3RDb250ZXh0LFxuICAgICAgcmVzb3VyY2VzLFxuICAgICAgc3luY01vZGVsOiByZXNvbHZlZFN5bmNNb2RlbCxcbiAgICAgIHRlbmFudEhhbmRsZSxcbiAgICAgIHdlYnNvY2tldENsaWVudDogY2xpZW50Q29uZmlndXJhdGlvbi53ZWJzb2NrZXRDbGllbnQsXG4gICAgICB3ZWJzb2NrZXRVcmw6IGNsaWVudENvbmZpZ3VyYXRpb24ud2Vic29ja2V0VXJsXG4gICAgfVxuICAgIHRoaXMuX2NsaWVudE51bWJlciA9ICsrY2xpZW50Q291bnRlclxuICAgIHRoaXMuX2RhdGFiYXNlSWRlbnRpdHkgPSBkYXRhYmFzZUlkZW50aXR5XG4gICAgdGhpcy5fdGVuYW50U2NoZW1hR2VuZXJhdGlvbiA9IHRlbmFudEhhbmRsZVxuICAgICAgPyB0ZW5hbnRIYW5kbGUuaW5zcGVjdCh7ZGF0YWJhc2VJZGVudGlmaWVyOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKGRhdGFiYXNlSWRlbnRpZmllcil9KS5zY2hlbWFHZW5lcmF0aW9uXG4gICAgICA6IG51bGxcbiAgICAvKiogQHR5cGUge1N5bmNSZWFsdGltZUJyaWRnZSB8IG51bGx9ICovXG4gICAgdGhpcy5fcmVhbHRpbWVCcmlkZ2UgPSBudWxsXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRTaGFyZWRDb25uZWN0aW9uIHwgbnVsbCB8IHVuZGVmaW5lZH0gU2hhcmVkIGFwcC1saWZldGltZSB3ZWJzb2NrZXQgY29ubmVjdGlvbiAodW5kZWZpbmVkIHVudGlsIGZpcnN0IHJlc29sdmVkLCBudWxsIHdoZW4gbm9uZSBpcyBjb25maWd1cmVkKS4gKi9cbiAgICB0aGlzLl9zeW5jQ29ubmVjdGlvbiA9IHVuZGVmaW5lZFxuICAgIC8qKiBAdHlwZSB7UHJvbWlzZTx2b2lkPiB8IG51bGx9ICovXG4gICAgdGhpcy5fc3Vic2NyaWJlVXNlclNjb3BlUHJvbWlzZSA9IG51bGxcbiAgICAvKiogQHR5cGUge1wic3Vic2NyaWJlZFwiIHwgXCJzdWJzY3JpYmluZ1wiIHwgXCJ1bnN1YnNjcmliZWRcIn0gKi9cbiAgICB0aGlzLl91c2VyU2NvcGVTdGF0ZSA9IFwidW5zdWJzY3JpYmVkXCJcbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vc3luYy1zY29wZS1zdG9yZS5qc1wiKS5kZWZhdWx0IHwgbnVsbH0gKi9cbiAgICB0aGlzLl9zY29wZVN0b3JlID0gc2NvcGVTdG9yZSB8fCBudWxsXG4gICAgLyoqIEB0eXBlIHtQcm9taXNlPHZvaWQ+IHwgbnVsbH0gKi9cbiAgICB0aGlzLl9zY2hlZHVsZWRSZXBsYXkgPSBudWxsXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jUmVzb3VyY2VDb25maWc+IHwgbnVsbH0gKi9cbiAgICB0aGlzLl9wdWxsUmVzb3VyY2VDb25maWdzID0gbnVsbFxuICAgIC8qKiBAdHlwZSB7QXJyYXk8e2NhbGxiYWNrOiAocmVjb3JkOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPikgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQsIGNhbGxiYWNrTmFtZTogXCJhZnRlckNyZWF0ZVwiIHwgXCJhZnRlclVwZGF0ZVwiIHwgXCJhZnRlckRlc3Ryb3lcIiB8IFwiYmVmb3JlVXBkYXRlXCIgfCBcImJlZm9yZURlc3Ryb3lcIiwgbW9kZWxDbGFzczogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59Pn0gKi9cbiAgICB0aGlzLl90cmFja2VkQ2FsbGJhY2tzID0gW11cbiAgICAvKiogQHR5cGUge1dlYWtTZXQ8b2JqZWN0Pn0gKi9cbiAgICB0aGlzLl9yZW1vdGVBcHBseVJlY29yZHMgPSBuZXcgV2Vha1NldCgpXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBudW1iZXI+fSAqL1xuICAgIHRoaXMuX3JlbW90ZUdlbmVyYXRpb25zID0gbmV3IE1hcCgpXG4gICAgLyoqIEB0eXBlIHtXZWFrTWFwPG9iamVjdCwgQXJyYXk8c3RyaW5nIHwgbnVtYmVyIHwgbnVsbD4+fSAqL1xuICAgIHRoaXMuX2NhcHR1cmVkQmFzZVZlcnNpb25zID0gbmV3IFdlYWtNYXAoKVxuICAgIHRoaXMuX3dpdGhvdXRUcmFja2luZ0RlcHRoID0gMFxuICAgIC8qKiBAdHlwZSB7TG9nZ2VyIHwge2Vycm9yOiAoLi4ubWVzc2FnZXM6IEFycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PikgPT4gUHJvbWlzZTx2b2lkPn0gfCBudWxsfSAqL1xuICAgIHRoaXMuX2xvZ2dlciA9IG51bGxcbiAgICB0aGlzLl9zdGFydGVkID0gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYXV0b21hdGljIG11dGF0aW9uIHRyYWNraW5nIGZvciBldmVyeSBkZWNsYXJlZCByZXNvdXJjZSAob24gYnlcbiAgICogZGVmYXVsdDogbG9jYWwgY3JlYXRlcyBhbmQgdXBkYXRlcyBxdWV1ZSBwZW5kaW5nIHN5bmMgcm93cyBvbmNlIHRoZWlyXG4gICAqIHRyYW5zYWN0aW9uIGNvbW1pdHMgYW5kIHNjaGVkdWxlIGFuIGltbWVkaWF0ZSByZXBsYXkgYXR0ZW1wdCwgd2l0aG91dFxuICAgKiBhcHAtc2lkZSBxdWV1ZSBjYWxscykuIGB0cmFjazogZmFsc2VgIHJlc291cmNlcyBhcmUgc2tpcHBlZDsgYHRyYWNrOiB0cnVlYFxuICAgKiBhZGRzIGRlc3Ryb3lzOyBhbiBvcGVyYXRpb25zIGxpc3QgbmFycm93cyB0aGUgdHJhY2tlZCBvcGVyYXRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHN0YXJ0KCkge1xuICAgIHRoaXMuYXNzZXJ0VGVuYW50UmVhZHkoKVxuICAgIGlmICh0aGlzLl9zdGFydGVkKSByZXR1cm5cblxuICAgIHRoaXMuX3N0YXJ0ZWQgPSB0cnVlXG5cbiAgICBmb3IgKGNvbnN0IFtyZXNvdXJjZVR5cGUsIHJlc291cmNlQ29uZmlnXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmNvbmZpZy5yZXNvdXJjZXMpKSB7XG4gICAgICBjb25zdCBvcGVyYXRpb25zID0gdGhpcy50cmFja2VkT3BlcmF0aW9ucyh7cmVzb3VyY2VDb25maWcsIHJlc291cmNlVHlwZX0pXG5cbiAgICAgIGlmIChyZXNvdXJjZUNvbmZpZy5jb25mbGljdFRyYWNraW5nKSB7XG4gICAgICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uIG9mIG9wZXJhdGlvbnMuZmlsdGVyKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZSAhPT0gXCJjcmVhdGVcIikpIHtcbiAgICAgICAgICBjb25zdCBjYWxsYmFja05hbWUgPSBvcGVyYXRpb24gPT09IFwiZGVzdHJveVwiID8gXCJiZWZvcmVEZXN0cm95XCIgOiBcImJlZm9yZVVwZGF0ZVwiXG4gICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSAoLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gKi8gcmVjb3JkKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMub3duc1JlY29yZChyZWNvcmQpKSByZXR1cm5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzVHJhY2tpbmdTdXBwcmVzc2VkKHJlY29yZCkpIHJldHVyblxuXG4gICAgICAgICAgICBjb25zdCBjYXB0dXJlZFZlcnNpb25zID0gdGhpcy5fY2FwdHVyZWRCYXNlVmVyc2lvbnMuZ2V0KHJlY29yZCkgfHwgW11cblxuICAgICAgICAgICAgY2FwdHVyZWRWZXJzaW9ucy5wdXNoKHRoaXMucHJlTXV0YXRpb25CYXNlVmVyc2lvbkZvcih7b3BlcmF0aW9uLCByZWNvcmQsIHJlc291cmNlQ29uZmlnfSkpXG4gICAgICAgICAgICB0aGlzLl9jYXB0dXJlZEJhc2VWZXJzaW9ucy5zZXQocmVjb3JkLCBjYXB0dXJlZFZlcnNpb25zKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc291cmNlQ29uZmlnLm1vZGVsQ2xhc3NbY2FsbGJhY2tOYW1lXShjYWxsYmFjaylcbiAgICAgICAgICB0aGlzLl90cmFja2VkQ2FsbGJhY2tzLnB1c2goe2NhbGxiYWNrLCBjYWxsYmFja05hbWUsIG1vZGVsQ2xhc3M6IHJlc291cmNlQ29uZmlnLm1vZGVsQ2xhc3N9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uIG9mIG9wZXJhdGlvbnMpIHtcbiAgICAgICAgY29uc3QgY2FsbGJhY2tOYW1lID0gVFJBQ0tFRF9DQUxMQkFDS19OQU1FU1tvcGVyYXRpb25dXG4gICAgICAgIGNvbnN0IGNhbGxiYWNrID0gdGhpcy50cmFja2VkTXV0YXRpb25DYWxsYmFjayh7b3BlcmF0aW9uLCByZXNvdXJjZUNvbmZpZ30pXG5cbiAgICAgICAgcmVzb3VyY2VDb25maWcubW9kZWxDbGFzc1tjYWxsYmFja05hbWVdKGNhbGxiYWNrKVxuICAgICAgICB0aGlzLl90cmFja2VkQ2FsbGJhY2tzLnB1c2goe2NhbGxiYWNrLCBjYWxsYmFja05hbWUsIG1vZGVsQ2xhc3M6IHJlc291cmNlQ29uZmlnLm1vZGVsQ2xhc3N9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhbGwgdHJhY2tpbmcgY2FsbGJhY2tzICh0ZXN0cywgc2lnbi1vdXQsIGhvdCByZWxvYWQpLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN0b3AoKSB7XG4gICAgZm9yIChjb25zdCB7Y2FsbGJhY2ssIGNhbGxiYWNrTmFtZSwgbW9kZWxDbGFzc30gb2YgdGhpcy5fdHJhY2tlZENhbGxiYWNrcykge1xuICAgICAgbW9kZWxDbGFzcy51bnJlZ2lzdGVyTGlmZWN5Y2xlQ2FsbGJhY2soY2FsbGJhY2tOYW1lLCBjYWxsYmFjaylcbiAgICB9XG5cbiAgICB0aGlzLl90cmFja2VkQ2FsbGJhY2tzID0gW11cbiAgICB0aGlzLl9zdGFydGVkID0gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhbmQgdmFsaWRhdGVzIHRoZSB0cmFja2VkIG9wZXJhdGlvbnMgZm9yIGEgcmVzb3VyY2UgY29uZmlnLlxuICAgKiBUcmFja2luZyBpcyBvbiBieSBkZWZhdWx0OiBtb2RlbHMgZGVjbGFyaW5nIGBzdGF0aWMgc3luY2Agd2l0aG91dCBhIGB0cmFja2BcbiAgICoga2V5IHF1ZXVlIGxvY2FsIGNyZWF0ZXMgYW5kIHVwZGF0ZXMgYXV0b21hdGljYWxseTsgYHRyYWNrOiBmYWxzZWAgb3B0cyBhXG4gICAqIG1vZGVsIG91dCAoZm9yIG1vZGVscyB3cml0dGVuIGJ5IG5vbi11c2VyIGZsb3dzKS5cbiAgICogQHBhcmFtIHt7cmVzb3VyY2VDb25maWc6IGltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudFJlc291cmNlQ29uZmlnLCByZXNvdXJjZVR5cGU6IHN0cmluZ319IGFyZ3MgLSBSZXNvdXJjZSBjb25maWcgYW5kIG5hbWUuXG4gICAqIEByZXR1cm5zIHtBcnJheTxcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwiPn0gVHJhY2tlZCBvcGVyYXRpb25zLlxuICAgKi9cbiAgdHJhY2tlZE9wZXJhdGlvbnMoe3Jlc291cmNlQ29uZmlnLCByZXNvdXJjZVR5cGV9KSB7XG4gICAgY29uc3QgdHJhY2sgPSByZXNvdXJjZUNvbmZpZy50cmFja1xuXG4gICAgaWYgKHRyYWNrID09PSBmYWxzZSkgcmV0dXJuIFtdXG4gICAgaWYgKHRyYWNrID09PSB1bmRlZmluZWQpIHJldHVybiBERUZBVUxUX1RSQUNLRURfT1BFUkFUSU9OU1xuICAgIGlmICh0cmFjayA9PT0gdHJ1ZSkgcmV0dXJuIFtcImNyZWF0ZVwiLCBcInVwZGF0ZVwiLCBcImRlc3Ryb3lcIl1cblxuICAgIGlmICghdHJhY2sgfHwgdHlwZW9mIHRyYWNrICE9PSBcIm9iamVjdFwiIHx8ICFBcnJheS5pc0FycmF5KHRyYWNrLm9wZXJhdGlvbnMpIHx8IHRyYWNrLm9wZXJhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFN5bmNDbGllbnQgcmVzb3VyY2UgJHtyZXNvdXJjZVR5cGV9IHRyYWNrIG11c3QgYmUgdHJ1ZSBvciB7b3BlcmF0aW9uczogWy4uLl19YClcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiB0cmFjay5vcGVyYXRpb25zKSB7XG4gICAgICBpZiAoIShvcGVyYXRpb24gaW4gVFJBQ0tFRF9DQUxMQkFDS19OQU1FUykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTeW5jQ2xpZW50IHJlc291cmNlICR7cmVzb3VyY2VUeXBlfSB0cmFjay5vcGVyYXRpb25zIG11c3QgYmUgY3JlYXRlL3VwZGF0ZS9kZXN0cm95LCBnb3Q6ICR7U3RyaW5nKG9wZXJhdGlvbil9YClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJhY2sub3BlcmF0aW9uc1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgbGlmZWN5Y2xlIGNhbGxiYWNrIHF1ZXVlaW5nIG9uZSB0cmFja2VkIG11dGF0aW9uLiBUaGUgcXVldWVkXG4gICAqIHBheWxvYWQgYW5kIHN5bmMgdHlwZSBhcmUgc25hcHNob3R0ZWQgYXQgbXV0YXRpb24tY2FsbGJhY2sgdGltZSwgc29cbiAgICogYWZ0ZXJTYXZlIGhvb2tzIGFzc2lnbmluZyB1bnNhdmVkIGF0dHJpYnV0ZXMgKG9yIGFueSBsYXRlciBkcmlmdCBvbiB0aGVcbiAgICogcmVjb3JkKSBjYW5ub3QgY2hhbmdlIHdoYXQgZ2V0cyBxdWV1ZWQgdnMgd2hhdCB3YXMgY29tbWl0dGVkLiBRdWV1ZWluZyBpc1xuICAgKiBkZWZlcnJlZCB0aHJvdWdoIHRoZSBtb2RlbCBjb25uZWN0aW9uJ3MgYWZ0ZXJDb21taXQgaG9vayBzbyBpdCBvbmx5IHJ1bnNcbiAgICogb25jZSB0aGUgbXV0YXRpb24ncyB0cmFuc2FjdGlvbiBoYXMgY29tbWl0dGVkIChpbW1lZGlhdGVseSB3aGVuIG5vXG4gICAqIHRyYW5zYWN0aW9uIGlzIG9wZW4pIC0gcXVldWVkIHN5bmNzIG5ldmVyIHJlZmVyZW5jZSByb2xsZWQtYmFjayByb3dzLlxuICAgKiBQb3N0LWNvbW1pdCBxdWV1ZSBmYWlsdXJlcyBhcmUgcmVwb3J0ZWQgd2l0aG91dCByZXRocm93aW5nIGludG8gdGhlXG4gICAqIGRyaXZlcidzIGFmdGVyQ29tbWl0IGNoYWluIChzZWUgcmVwb3J0QWZ0ZXJDb21taXRFcnJvcikuXG4gICAqIEBwYXJhbSB7e29wZXJhdGlvbjogXCJjcmVhdGVcIiB8IFwidXBkYXRlXCIgfCBcImRlc3Ryb3lcIiwgcmVzb3VyY2VDb25maWc6IGltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudFJlc291cmNlQ29uZmlnfX0gYXJncyAtIE9wZXJhdGlvbiBhbmQgcmVzb3VyY2UgY29uZmlnLlxuICAgKiBAcmV0dXJucyB7KHJlY29yZDogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4pID0+IFByb21pc2U8dm9pZD59IExpZmVjeWNsZSBjYWxsYmFjay5cbiAgICovXG4gIHRyYWNrZWRNdXRhdGlvbkNhbGxiYWNrKHtvcGVyYXRpb24sIHJlc291cmNlQ29uZmlnfSkge1xuICAgIHJldHVybiBhc3luYyAocmVjb3JkKSA9PiB7XG4gICAgICBpZiAoIXRoaXMub3duc1JlY29yZChyZWNvcmQpKSByZXR1cm5cbiAgICAgIGlmICh0aGlzLmlzVHJhY2tpbmdTdXBwcmVzc2VkKHJlY29yZCkpIHJldHVyblxuXG4gICAgICBjb25zdCBkYXRhID0gU3luY0FwaUNsaWVudC5xdWV1ZWRTeW5jRGF0YSh7XG4gICAgICAgIGJvb2xlYW5BdHRyaWJ1dGVzOiByZXNvdXJjZUNvbmZpZy5ib29sZWFuQXR0cmlidXRlcyB8fCBbXSxcbiAgICAgICAgZGF0YTogcmVzb3VyY2VDb25maWcudHJhY2tlZERhdGEgPyByZXNvdXJjZUNvbmZpZy50cmFja2VkRGF0YSh7b3BlcmF0aW9uLCByZWNvcmR9KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgbG9jYWxPbmx5QXR0cmlidXRlczogcmVzb3VyY2VDb25maWcubG9jYWxPbmx5QXR0cmlidXRlcyB8fCBbXSxcbiAgICAgICAgcmVzb3VyY2U6IHJlY29yZFxuICAgICAgfSlcbiAgICAgIGNvbnN0IHN5bmNUeXBlID0gdGhpcy5kZWZhdWx0U3luY1R5cGUoe29wZXJhdGlvbiwgcmVjb3JkLCByZXNvdXJjZUNvbmZpZ30pXG4gICAgICBjb25zdCBiYXNlVmVyc2lvbiA9IHJlc291cmNlQ29uZmlnLmNvbmZsaWN0VHJhY2tpbmdcbiAgICAgICAgPyB0aGlzLmNhcHR1cmVkQmFzZVZlcnNpb25Gb3Ioe29wZXJhdGlvbiwgcmVjb3JkLCByZXNvdXJjZUNvbmZpZ30pXG4gICAgICAgIDogbnVsbFxuICAgICAgY29uc3QgZGF0YWJhc2VPcGVyYXRpb24gPSByZWNvcmQuZGF0YWJhc2VPcGVyYXRpb24oKVxuICAgICAgY29uc3Qgb3BlcmF0aW9uU2NvcGUgPSBkYXRhYmFzZU9wZXJhdGlvblxuICAgICAgICA/IGRhdGFiYXNlT3BlcmF0aW9uLmZvck1vZGVsKHRoaXMuY29uZmlnLnN5bmNNb2RlbClcbiAgICAgICAgOiB0aGlzLmNvbmZpZy5zeW5jTW9kZWxcblxuICAgICAgYXdhaXQgcmVjb3JkLmNvbm5lY3Rpb24oKS5hZnRlckNvbW1pdChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHJlc291cmNlQ29uZmlnLmNvbmZsaWN0VHJhY2tpbmcpIHtcbiAgICAgICAgICAgIGF3YWl0IFN5bmNBcGlDbGllbnQucXVldWVDb25mbGljdFRyYWNrZWRTeW5jKHtcbiAgICAgICAgICAgICAgYmFzZVZlcnNpb24sXG4gICAgICAgICAgICAgIGNvbmZsaWN0VHJhY2tpbmc6IHJlc291cmNlQ29uZmlnLmNvbmZsaWN0VHJhY2tpbmcsXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgICAgICAgcmVzb3VyY2U6IHJlY29yZCxcbiAgICAgICAgICAgICAgcmVzb3VyY2VUeXBlOiByZWNvcmQuY29uc3RydWN0b3IuZ2V0TW9kZWxOYW1lKCksXG4gICAgICAgICAgICAgIHN5bmNUeXBlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCBTeW5jQXBpQ2xpZW50LnF1ZXVlTG9jYWxTeW5jKHtkYXRhLCByZXNvdXJjZTogcmVjb3JkLCBzeW5jTW9kZWw6IG9wZXJhdGlvblNjb3BlLCBzeW5jVHlwZX0pXG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGF3YWl0IHRoaXMucmVwb3J0QWZ0ZXJDb21taXRFcnJvcigvKiogQHR5cGUge0Vycm9yfSAqLyAoZXJyb3IpKVxuXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNjaGVkdWxlUmVwbGF5KClcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgYSBwb3N0LWNvbW1pdCB0cmFja2VkLXF1ZXVlaW5nIGZhaWx1cmUuIFRoZSB0cmFuc2FjdGlvbiBoYXMgYWxyZWFkeVxuICAgKiBjb21taXR0ZWQgd2hlbiBhZnRlckNvbW1pdCBjYWxsYmFja3MgcnVuLCBzbyByZXRocm93aW5nIGhlcmUgd291bGQgcG9pc29uXG4gICAqIHRoZSBkcml2ZXIncyBhd2FpdGVkIGFmdGVyQ29tbWl0IGNoYWluIChicmVha2luZyB1bnJlbGF0ZWQgY2FsbGJhY2tzKSAtXG4gICAqIGluc3RlYWQgdGhlIGZhaWx1cmUgZ29lcyB0byB0aGUgY29uZmlndXJlZCBzeW5jLmNsaWVudC5vbkVycm9yIGhvb2ssIG9yIGlzXG4gICAqIGxvZ2dlZCBsb3VkbHkgdGhyb3VnaCB0aGUgY2xpZW50J3MgbG9nZ2VyIHdoZW4gbm9uZSBpcyBjb25maWd1cmVkLlxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIFBvc3QtY29tbWl0IHF1ZXVlaW5nIGZhaWx1cmUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgcmVwb3J0QWZ0ZXJDb21taXRFcnJvcihlcnJvcikge1xuICAgIGlmICh0aGlzLmNvbmZpZy5vbkVycm9yKSB7XG4gICAgICB0aGlzLmNvbmZpZy5vbkVycm9yKGVycm9yKVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmxvZ2dlcigpLmVycm9yKFwiU3luY0NsaWVudCBmYWlsZWQgdG8gcXVldWUgYSB0cmFja2VkIG11dGF0aW9uIGFmdGVyIGNvbW1pdFwiLCBlcnJvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsYXppbHkgYnVpbHQgY2xpZW50IGxvZ2dlci5cbiAgICogQHJldHVybnMge0xvZ2dlciB8IHtlcnJvcjogKC4uLm1lc3NhZ2VzOiBBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4pID0+IFByb21pc2U8dm9pZD59fSBDbGllbnQgbG9nZ2VyLlxuICAgKi9cbiAgbG9nZ2VyKCkge1xuICAgIHRoaXMuX2xvZ2dlciB8fD0gbmV3IExvZ2dlcihcIlN5bmNDbGllbnRcIiwge2NvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlnLmNvbmZpZ3VyYXRpb259KVxuXG4gICAgcmV0dXJuIHRoaXMuX2xvZ2dlclxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSByZWNvcmQgaXMgY3VycmVudGx5IGJlaW5nIHdyaXR0ZW4gYnkgcHVsbC1hcHBseSAoZWNobyBzdXBwcmVzc2lvbikuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHJlY29yZCAtIExvY2FsIG1vZGVsIHJlY29yZC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHJlY29yZCB3cml0ZSBvcmlnaW5hdGVzIGZyb20gYSByZW1vdGUgY2hhbmdlLlxuICAgKi9cbiAgaXNSZW1vdGVBcHBseShyZWNvcmQpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVtb3RlQXBwbHlSZWNvcmRzLmhhcyhyZWNvcmQpXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0cmFja2VkIG11dGF0aW9uIHF1ZXVlaW5nIGlzIGN1cnJlbnRseSBzdXBwcmVzc2VkIGZvciBhIHJlY29yZDpcbiAgICogZWl0aGVyIHRoZSByZWNvcmQgd2FzIG1hcmtlZCBhcyBhIHJlbW90ZSBhcHBseSAoYG1hcmtSZW1vdGVBcHBseWAsIHVzZWQgYnlcbiAgICogcHVsbCBhbmQgcmVhbHRpbWUgYXBwbGllcykgb3IgYSBgd2l0aG91dFRyYWNraW5nYCBjYWxsYmFjayBpcyBydW5uaW5nIG9uXG4gICAqIHRoaXMgY2xpZW50LlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSByZWNvcmQgLSBMb2NhbCBtb2RlbCByZWNvcmQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRyYWNrZWQgcXVldWVpbmcgaXMgc3VwcHJlc3NlZCBmb3IgdGhlIHJlY29yZC5cbiAgICovXG4gIGlzVHJhY2tpbmdTdXBwcmVzc2VkKHJlY29yZCkge1xuICAgIHJldHVybiB0aGlzLl93aXRob3V0VHJhY2tpbmdEZXB0aCA+IDAgfHwgdGhpcy5pc1JlbW90ZUFwcGx5KHJlY29yZClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgY2FsbGJhY2sgd2l0aCB0cmFja2VkIG11dGF0aW9uIHF1ZXVlaW5nIHN1cHByZXNzZWQgb24gdGhpcyBjbGllbnQgLVxuICAgKiBmb3IgY29kZSBhcHBseWluZyBzZXJ2ZXItb3JpZ2luYXRlZCBkYXRhIG91dHNpZGUgdGhlIGRlcml2ZWQgcHVsbC9yZWFsdGltZVxuICAgKiBhcHBsaWVycyAobGVnYWN5IHB1bGwgcGF0aHMsIGltcG9ydGVycywgc2lnbi1pbiBiYWNrZmlsbHMpLCBzbyB0aGVpciB3cml0ZXNcbiAgICogYXJlIG5vdCBlY2hvZWQgYmFjayB0byB0aGUgc2VydmVyIGFzIGRldmljZSBjaGFuZ2VzLiBTdXBwcmVzc2lvbiBjb3ZlcnMgdGhlXG4gICAqIHdob2xlIGFzeW5jIGR1cmF0aW9uIG9mIHRoZSBjYWxsYmFjayAobmVzdGVkIGNhbGxzIHN0YWNrKSBhbmQgaXNcbiAgICogY2xpZW50LXdpZGUgd2hpbGUgaXQgcnVuczogbXV0YXRpb25zIGZyb20gY29uY3VycmVudGx5IHJ1bm5pbmcgdGFza3MgYXJlXG4gICAqIGFsc28gc3VwcHJlc3NlZCBmb3IgdGhhdCB3aW5kb3csIHNvIHByZWZlciBgbWFya1JlbW90ZUFwcGx5KHJlY29yZClgIHdoZW5cbiAgICogd3JpdGVzIGZyb20gb3RoZXIgZmxvd3MgY2FuIGludGVybGVhdmUuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUPiB8IFR9IGNhbGxiYWNrIC0gV29yayB3aG9zZSBtb2RlbCB3cml0ZXMgc2hvdWxkIG5vdCBxdWV1ZSB0cmFja2VkIHN5bmNzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gVGhlIGNhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHdpdGhvdXRUcmFja2luZyhjYWxsYmFjaykge1xuICAgIHRoaXMuX3dpdGhvdXRUcmFja2luZ0RlcHRoKytcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl93aXRob3V0VHJhY2tpbmdEZXB0aC0tXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1hcmtzIG9uZSByZWNvcmQgYXMgYmVpbmcgd3JpdHRlbiBmcm9tIHNlcnZlci1vcmlnaW5hdGVkIGRhdGEgc28gdHJhY2tlZFxuICAgKiBtdXRhdGlvbiBxdWV1ZWluZyBza2lwcyBpdCAocmVjb3JkLXByZWNpc2Ugc3VwcHJlc3Npb24pLiBUaGUgZGVyaXZlZCBwdWxsXG4gICAqIGFuZCByZWFsdGltZSBhcHBsaWVycyB1c2UgdGhpcyBpbnRlcm5hbGx5IGFyb3VuZCBldmVyeSBhcHBsaWVkIHdyaXRlLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSByZWNvcmQgLSBMb2NhbCBtb2RlbCByZWNvcmQgYWJvdXQgdG8gYmUgd3JpdHRlbi5cbiAgICogQHJldHVybnMgeygpID0+IHZvaWR9IFJlbGVhc2UgY2FsbGJhY2sgcmUtZW5hYmxpbmcgdHJhY2tpbmcgZm9yIHRoZSByZWNvcmQuXG4gICAqL1xuICBtYXJrUmVtb3RlQXBwbHkocmVjb3JkKSB7XG4gICAgdGhpcy5fcmVtb3RlQXBwbHlSZWNvcmRzLmFkZChyZWNvcmQpXG5cbiAgICByZXR1cm4gKCkgPT4gdGhpcy5fcmVtb3RlQXBwbHlSZWNvcmRzLmRlbGV0ZShyZWNvcmQpXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIHRoaXMgY2xpZW50IGFzIHRoZSBhcHAncyBjdXJyZW50IHN5bmMgY2xpZW50LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNldEN1cnJlbnQoKSB7XG4gICAgc2V0Q3VycmVudFN5bmNDbGllbnQodGhpcylcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhcHAncyBjdXJyZW50IHN5bmMgY2xpZW50LlxuICAgKiBAcmV0dXJucyB7U3luY0NsaWVudH0gQ3VycmVudCBzeW5jIGNsaWVudC5cbiAgICovXG4gIHN0YXRpYyBjdXJyZW50KCkge1xuICAgIHJldHVybiAvKiogQHR5cGUge1N5bmNDbGllbnR9ICovIChjdXJyZW50U3luY0NsaWVudCgpKVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHN5bmMgY2xpZW50IGRlcml2ZWQgZnJvbSB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbi4gQWxpYXMgZm9yXG4gICAqIGBuZXcgU3luY0NsaWVudCh7Y29uZmlndXJhdGlvbiwgLi4ub3B0aW9uc30pYC5cbiAgICogQHBhcmFtIHtDb25maWd1cmF0aW9ufSBbY29uZmlndXJhdGlvbl0gLSBDb25maWd1cmF0aW9uIG93bmluZyB0aGUgcmVnaXN0ZXJlZCBtb2RlbHMgYW5kIHRoZSBzeW5jLmNsaWVudCBibG9jay4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtPbWl0PGltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudE9wdGlvbnMsIFwiY29uZmlndXJhdGlvblwiPn0gW29wdGlvbnNdIC0gT3B0aW9uYWwgb3ZlcnJpZGVzLlxuICAgKiBAcmV0dXJucyB7U3luY0NsaWVudH0gU3luYyBjbGllbnQgZGVyaXZlZCBmcm9tIHRoZSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgc3RhdGljIGZyb21Db25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0aW9uLmN1cnJlbnQoKSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBTeW5jQ2xpZW50KHsuLi5vcHRpb25zLCBjb25maWd1cmF0aW9ufSlcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNsYXJlcyAob3IgcmUtYWN0aXZhdGVzKSBhIHN5bmMgc2NvcGUgZnJvbSBhIG1vZGVsIHF1ZXJ5IGFuZCBwdWxscyBpdCB3aGVuIG9ubGluZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gcXVlcnkgLSBRdWVyeSBkZWNsYXJpbmcgdGhlIHN5bmMgc2NvcGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSBTeW5jIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7KHByb2dyZXNzOiBpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jUHVsbFByb2dyZXNzKSA9PiB2b2lkfSBbb3B0aW9ucy5vblByb2dyZXNzXSAtIENhbGxlZCBwZXIgYXBwbGllZCBwYWdlIG9mIHRoZSBwdWxsIHRoaXMgZGVjbGFyYXRpb24gdHJpZ2dlcnMsIHNvIHRoZSBpbml0aWFsIGltcG9ydCBvZiBhIG5ld2x5IGRlY2xhcmVkIHNjb3BlIGNhbiBkcml2ZSBhIFwic3luY2VkQ291bnQgb2YgdG90YWxcIiBwcm9ncmVzcyBiYXIuIFNlZSBgcHVsbCgpYC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy51cHN0cmVhbVJlZnJlc2hdIC0gTWFya3MgdGhlIGNoYW5nZXMgcmVxdWVzdChzKSBhcyBhIHVzZXItaW5pdGlhdGVkIHJlZnJlc2gsIHNvIHRoZSBzZXJ2ZXIgY2FuIGJ5cGFzcyB1cHN0cmVhbS1pbXBvcnQgdGhyb3R0bGUgd2luZG93cy4gU2VlIGBwdWxsKClgLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7c2NvcGU6IGltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU2VyaWFsaXplZFN5bmNTY29wZSwgcHVsbGVkOiBpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2hhbmdlc1Jlc3VsdCB8IG51bGx9Pn0gRGVjbGFyZWQgc2NvcGUgYW5kIHB1bGwgcmVzdWx0IChudWxsIHdoaWxlIG9mZmxpbmUpLlxuICAgKi9cbiAgYXN5bmMgc3luYyhxdWVyeSwge29uUHJvZ3Jlc3MsIHVwc3RyZWFtUmVmcmVzaH0gPSB7fSkge1xuICAgIHRoaXMuYXNzZXJ0UXVlcnlPd25lcnNoaXAocXVlcnkpXG4gICAgY29uc3Qgc2NvcGUgPSBzZXJpYWxpemVkU2NvcGVGcm9tUXVlcnkocXVlcnkpXG4gICAgY29uc3Qgc2NvcGVTdG9yZSA9IHRoaXMuc2NvcGVTdG9yZSgpXG4gICAgY29uc3Qgc2NvcGVSb3cgPSBhd2FpdCBzY29wZVN0b3JlLmZpbmRPckNyZWF0ZVNjb3BlKHNjb3BlKVxuXG4gICAgaWYgKCFzY29wZVJvdy5jdXJzb3JQYXlsb2FkICYmIHRoaXMuY29uZmlnLmxlZ2FjeUN1cnNvcikge1xuICAgICAgY29uc3QgbGVnYWN5Q3Vyc29yUGF5bG9hZCA9IGF3YWl0IHRoaXMuY29uZmlnLmxlZ2FjeUN1cnNvcih7c2NvcGV9KVxuICAgICAgY29uc3QgbGVnYWN5Q3Vyc29yID0gU3luY0FwaUNsaWVudC5zeW5jQ3Vyc29yRnJvbVBheWxvYWQobGVnYWN5Q3Vyc29yUGF5bG9hZClcblxuICAgICAgaWYgKGxlZ2FjeUN1cnNvcikgYXdhaXQgc2NvcGVTdG9yZS5zYXZlQ3Vyc29yKHNjb3BlUm93LCBsZWdhY3lDdXJzb3IpXG4gICAgfVxuXG4gICAgcmV0dXJuIHtwdWxsZWQ6IGF3YWl0IHRoaXMucHVsbCh7b25Qcm9ncmVzcywgdXBzdHJlYW1SZWZyZXNofSksIHNjb3BlfVxuICB9XG5cbiAgLyoqXG4gICAqIERlYWN0aXZhdGVzIHRoZSBzeW5jIHNjb3BlIGRlY2xhcmVkIGJ5IGEgbW9kZWwgcXVlcnkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdDxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IHF1ZXJ5IC0gUXVlcnkgd2hvc2Ugc2NvcGUgc2hvdWxkIHN0b3Agc3luY2luZy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB1bnN5bmMocXVlcnkpIHtcbiAgICB0aGlzLmFzc2VydFF1ZXJ5T3duZXJzaGlwKHF1ZXJ5KVxuICAgIGF3YWl0IHRoaXMuc2NvcGVTdG9yZSgpLmRlYWN0aXZhdGUoc2VyaWFsaXplZFNjb3BlRnJvbVF1ZXJ5KHF1ZXJ5KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWxscyBjaGFuZ2VzIGZvciBldmVyeSBhY3RpdmUgc2NvcGUgd2l0aCBwZXItc2NvcGUgY3Vyc29ycyAoc2luZ2xlLWZsaWdodGVkLCBvbmxpbmUtZ2F0ZWQpLlxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gUHVsbCBvcHRpb25zLlxuICAgKiBAcGFyYW0geyhwcm9ncmVzczogaW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1B1bGxQcm9ncmVzcykgPT4gdm9pZH0gW29wdGlvbnMub25Qcm9ncmVzc10gLSBDYWxsZWQgcGVyIGFwcGxpZWQgcGFnZSB3aXRoIGN1bXVsYXRpdmUgYHtwYWdlcywgc3luY2VkQ291bnQsIHRvdGFsfWAgYWNyb3NzIHRoZSBwdWxsZWQgc2NvcGVzLCBmb3IgcmVuZGVyaW5nIGEgXCJzeW5jZWRDb3VudCBvZiB0b3RhbFwiIHByb2dyZXNzIGJhciAoZS5nLiBhIGZ1bGwtaW1wb3J0IHNjcmVlbikuIE9wdGlvbmFsOyBvbWl0dGluZyBpdCBrZWVwcyB0aGUgZXhpc3RpbmcgYmVoYXZpb3IuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudXBzdHJlYW1SZWZyZXNoXSAtIFNlbmRzIGB1cHN0cmVhbVJlZnJlc2g6IHRydWVgIG9uIHRoZSBjaGFuZ2VzIHJlcXVlc3QocyksIHRlbGxpbmcgdGhlIHNlcnZlciB0aGlzIHB1bGwgaXMgdXNlci1pbml0aWF0ZWQgc28gaXQgY2FuIGJ5cGFzcyB1cHN0cmVhbS1pbXBvcnQgdGhyb3R0bGUgd2luZG93cyAoc2VlIGRvY3Mvc3luYy11cHN0cmVhbS1pbXBvcnRzLm1kKS4gQmFja2dyb3VuZCBwdWxscyBvbWl0IGl0IGFuZCBzdGF5IHRocm90dGxlZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY0NoYW5nZXNSZXN1bHQgfCBudWxsPn0gQ29tYmluZWQgcHVsbCByZXN1bHQsIG9yIG51bGwgd2hpbGUgb2ZmbGluZS5cbiAgICovXG4gIGFzeW5jIHB1bGwoe29uUHJvZ3Jlc3MsIHVwc3RyZWFtUmVmcmVzaH0gPSB7fSkge1xuICAgIHRoaXMuYXNzZXJ0VGVuYW50UmVhZHkoKVxuICAgIGlmICghKGF3YWl0IHRoaXMuaXNPbmxpbmUoKSkpIHJldHVybiBudWxsXG5cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDaGFuZ2VzUmVzdWx0IHwgbnVsbH0gKi9cbiAgICBsZXQgY29tYmluZWRSZXN1bHQgPSBudWxsXG5cbiAgICBhd2FpdCBTeW5jQXBpQ2xpZW50LnNpbmdsZUZsaWdodChgdmVsb2Npb3VzLXN5bmMtY2xpZW50LXB1bGwtJHt0aGlzLl9jbGllbnROdW1iZXJ9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYXV0aGVudGljYXRpb25Ub2tlbiA9IGF3YWl0IHRoaXMuY29uZmlnLmF1dGhlbnRpY2F0aW9uVG9rZW4oKVxuICAgICAgY29uc3Qgc2NvcGVTdG9yZSA9IHRoaXMuc2NvcGVTdG9yZSgpXG4gICAgICBjb25zdCBhcHBseVN5bmMgPSB0aGlzLnJlbW90ZUFwcGx5U3luYygpXG4gICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgIGNoYW5nZWQ6IGZhbHNlLFxuICAgICAgICBwYWdlczogMCxcbiAgICAgICAgcmVzb3VyY2VDaGFuZ2VkOiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGJvb2xlYW4+fSAqLyAoe30pLFxuICAgICAgICByZXNvdXJjZUNvdW50czogLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXI+fSAqLyAoe30pLFxuICAgICAgICBzeW5jZWRDb3VudDogMCxcbiAgICAgICAgdG90YWw6IDBcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBzY29wZVJvdyBvZiBhd2FpdCBzY29wZVN0b3JlLmFjdGl2ZVNjb3BlcygpKSB7XG4gICAgICAgIC8vIEN1bXVsYXRlIHNjb3BlIHByb2dyZXNzIG9udG8gdGhlIGNvdW50cyBvZiB0aGUgc2NvcGVzIGFscmVhZHkgcHVsbGVkIHNvIGEgc2luZ2xlXG4gICAgICAgIC8vIHNjb3BlJ3MgcGVyLXBhZ2UgcHJvZ3Jlc3MgcmVhZHMgZXhhY3RseSBpdHMgb3duIGNvdW50cyAoYmFzZSAwKSwgYW5kIG11bHRpLXNjb3BlXG4gICAgICAgIC8vIHB1bGxzIHJlcG9ydCBhIHJ1bm5pbmcgY3VtdWxhdGl2ZSB0b3RhbCBhY3Jvc3MgZXZlcnkgc2NvcGUuXG4gICAgICAgIGNvbnN0IGJhc2VQYWdlcyA9IHJlc3VsdC5wYWdlc1xuICAgICAgICBjb25zdCBiYXNlU3luY2VkQ291bnQgPSByZXN1bHQuc3luY2VkQ291bnRcbiAgICAgICAgY29uc3QgYmFzZVRvdGFsID0gcmVzdWx0LnRvdGFsXG4gICAgICAgIGNvbnN0IHNjb3BlUmVzdWx0ID0gYXdhaXQgU3luY0FwaUNsaWVudC5wdWxsQ2hhbmdlcyh7XG4gICAgICAgICAgYXBwbHlTeW5jLFxuICAgICAgICAgIGF1dGhlbnRpY2F0aW9uVG9rZW4sXG4gICAgICAgICAgYmF0Y2hTaXplOiB0aGlzLmNvbmZpZy5iYXRjaFNpemUsXG4gICAgICAgICAgbG9hZEN1cnNvcjogYXN5bmMgKCkgPT4gYXdhaXQgc2NvcGVTdG9yZS5sb2FkQ3Vyc29yKHNjb3BlUm93KSxcbiAgICAgICAgICBvblByb2dyZXNzOiBvblByb2dyZXNzID8gKHByb2dyZXNzKSA9PiBvblByb2dyZXNzKHtcbiAgICAgICAgICAgIHBhZ2VzOiBiYXNlUGFnZXMgKyBwcm9ncmVzcy5wYWdlcyxcbiAgICAgICAgICAgIHN5bmNlZENvdW50OiBiYXNlU3luY2VkQ291bnQgKyBwcm9ncmVzcy5zeW5jZWRDb3VudCxcbiAgICAgICAgICAgIHRvdGFsOiBiYXNlVG90YWwgKyBwcm9ncmVzcy50b3RhbFxuICAgICAgICAgIH0pIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHBvc3RDaGFuZ2VzOiBhc3luYyAocGF5bG9hZCkgPT4gYXdhaXQgdGhpcy5jb25maWcucG9zdENoYW5nZXMoe1xuICAgICAgICAgICAgLi4ucGF5bG9hZCxcbiAgICAgICAgICAgIC8vIE9ubHkgdGhlIGFsbC10eXBlcyBzY29wZSBjYXJyaWVzIHRoZSB0eXBlIGxpc3Q7IGEgdHlwZS1kZWNsYXJlZCBzY29wZSBuZWVkcyBub25lLlxuICAgICAgICAgICAgc2NvcGU6IHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uczogc2NvcGVSb3cuY29uZGl0aW9ucyxcbiAgICAgICAgICAgICAgcmVzb3VyY2VUeXBlOiBzY29wZVJvdy5yZXNvdXJjZVR5cGUsXG4gICAgICAgICAgICAgIC4uLihzY29wZVJvdy5yZXNvdXJjZVR5cGUgPT09IG51bGwgPyB7cmVzb3VyY2VUeXBlczogdGhpcy51c2VyU2NvcGVSZXNvdXJjZVR5cGVzKCl9IDoge30pXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uKHVwc3RyZWFtUmVmcmVzaCA/IHt1cHN0cmVhbVJlZnJlc2g6IHRydWV9IDoge30pXG4gICAgICAgICAgfSksXG4gICAgICAgICAgc2F2ZUN1cnNvcjogYXN5bmMgKGN1cnNvcikgPT4gYXdhaXQgc2NvcGVTdG9yZS5zYXZlQ3Vyc29yKHNjb3BlUm93LCBjdXJzb3IpXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmVzdWx0LmNoYW5nZWQgfHw9IHNjb3BlUmVzdWx0LmNoYW5nZWRcbiAgICAgICAgcmVzdWx0LnBhZ2VzICs9IHNjb3BlUmVzdWx0LnBhZ2VzXG4gICAgICAgIHJlc3VsdC5zeW5jZWRDb3VudCArPSBzY29wZVJlc3VsdC5zeW5jZWRDb3VudFxuICAgICAgICByZXN1bHQudG90YWwgKz0gc2NvcGVSZXN1bHQudG90YWxcblxuICAgICAgICBmb3IgKGNvbnN0IFtyZXNvdXJjZVR5cGUsIGNvdW50XSBvZiBPYmplY3QuZW50cmllcyhzY29wZVJlc3VsdC5yZXNvdXJjZUNvdW50cykpIHtcbiAgICAgICAgICByZXN1bHQucmVzb3VyY2VDb3VudHNbcmVzb3VyY2VUeXBlXSA9IChyZXN1bHQucmVzb3VyY2VDb3VudHNbcmVzb3VyY2VUeXBlXSB8fCAwKSArIGNvdW50XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBbcmVzb3VyY2VUeXBlLCBjaGFuZ2VkXSBvZiBPYmplY3QuZW50cmllcyhzY29wZVJlc3VsdC5yZXNvdXJjZUNoYW5nZWQpKSB7XG4gICAgICAgICAgcmVzdWx0LnJlc291cmNlQ2hhbmdlZFtyZXNvdXJjZVR5cGVdIHx8PSBjaGFuZ2VkXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29tYmluZWRSZXN1bHQgPSByZXN1bHRcbiAgICB9KVxuXG4gICAgcmV0dXJuIGNvbWJpbmVkUmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBkZXJpdmVkIHJlbW90ZS1jaGFuZ2UgYXBwbGllciBzaGFyZWQgYnkgcHVsbHMgYW5kIHJlYWx0aW1lIHB1c2hlczpcbiAgICogYXBwbGllcyB0aHJvdWdoIHRoZSBkZWNsYXJlZCByZXNvdXJjZSBjb25maWdzLCByZWdpc3RlcnMgZWFjaCB3cml0dGVuIHJlY29yZFxuICAgKiBmb3IgZWNobyBzdXBwcmVzc2lvbiAodHJhY2tlZCByZXNvdXJjZXMgZG8gbm90IHJlLXF1ZXVlIGFwcGxpZWQgY2hhbmdlcyksIGFuZFxuICAgKiBmYWlscyBsb3VkbHkgaW5zdGVhZCBvZiBzaWxlbnRseSBza2lwcGluZyB1bmNvbmZpZ3VyZWQgcmVzb3VyY2VzLlxuICAgKiBAcGFyYW0ge3tzb3VyY2U/OiBzdHJpbmd9fSBbYXJnc10gLSBFcnJvciBjb250ZXh0IGRlc2NyaWJpbmcgd2hlcmUgdGhlIGNoYW5nZSBjYW1lIGZyb20uXG4gICAqIEByZXR1cm5zIHsoc3luYzogaW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY0NoYW5nZUVudmVsb3BlKSA9PiBQcm9taXNlPGltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDaGFuZ2VBcHBseVJlc3VsdD59IExvdWQgcmVtb3RlLWNoYW5nZSBhcHBsaWVyLlxuICAgKi9cbiAgcmVtb3RlQXBwbHlTeW5jKHtzb3VyY2UgPSBcInB1bGxlZCBjaGFuZ2VcIn0gPSB7fSkge1xuICAgIHJldHVybiBhc3luYyAoc3luYykgPT4ge1xuICAgICAgY29uc3QgcmVzb3VyY2VUeXBlID0gc3luYy5yZXNvdXJjZVR5cGUoKVxuICAgICAgY29uc3QgY29uZmlndXJlZFJlc291cmNlID0gcmVzb3VyY2VUeXBlID8gdGhpcy5jb25maWcucmVzb3VyY2VzW3Jlc291cmNlVHlwZV0gOiB1bmRlZmluZWRcblxuICAgICAgaWYgKCFyZXNvdXJjZVR5cGUgfHwgIWNvbmZpZ3VyZWRSZXNvdXJjZT8uYXR0cmlidXRlcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHN5bmMgcmVzb3VyY2Ugd2l0aCBwdWxsIGF0dHJpYnV0ZXMgY29uZmlndXJlZCBmb3IgJHtzb3VyY2V9OiAke1N0cmluZyhyZXNvdXJjZVR5cGUpfWApXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLndpdGhUZW5hbnRPcGVyYXRpb24oYXN5bmMgKG9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gc3luYy5kYXRhKClcbiAgICAgICAgY29uc3QgdmVyc2lvbkF0dHJpYnV0ZSA9IHRoaXMuY29uZmlnLnJlc291cmNlc1tyZXNvdXJjZVR5cGVdLmNvbmZsaWN0VHJhY2tpbmc/LnZlcnNpb25BdHRyaWJ1dGVcblxuICAgICAgICBpZiAodmVyc2lvbkF0dHJpYnV0ZSkge1xuICAgICAgICAgIGNvbnN0IGRhdGFBdHRyaWJ1dGVzID0gZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShkYXRhKVxuICAgICAgICAgICAgPyAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gKGRhdGEpXG4gICAgICAgICAgICA6IHt9XG5cbiAgICAgICAgICB0aGlzLm5vdGVSZW1vdGVWZXJzaW9uKHtyZXNvdXJjZUlkOiBTdHJpbmcoc3luYy5yZXNvdXJjZUlkKCkpLCByZXNvdXJjZVR5cGUsIHZlcnNpb246IGRhdGFBdHRyaWJ1dGVzW3ZlcnNpb25BdHRyaWJ1dGVdfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHB1bGxSZXNvdXJjZUNvbmZpZ3MgPSB0aGlzLnB1bGxSZXNvdXJjZUNvbmZpZ3Mob3BlcmF0aW9uKVxuICAgICAgICBjb25zdCBhcHBsaWVyID0gU3luY0FwaUNsaWVudC5yZXNvdXJjZUFwcGxpZXIocHVsbFJlc291cmNlQ29uZmlncywgKHJlY29yZCkgPT4ge1xuICAgICAgICAgIGlmIChvcGVyYXRpb24pIHRoaXMuYmluZFJlbW90ZVJlY29yZCh7b3BlcmF0aW9uLCByZWNvcmR9KVxuXG4gICAgICAgICAgcmV0dXJuIHRoaXMubWFya1JlbW90ZUFwcGx5KHJlY29yZClcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gYXdhaXQgYXBwbGllcihzeW5jKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHNoYXJlZCBhcHAtbGlmZXRpbWUgd2Vic29ja2V0IGNvbm5lY3Rpb24gYWxsIHN5bmMgdHJhZmZpY1xuICAgKiByaWRlcywgb3IgbnVsbCB3aGVuIG5vbmUgaXMgY29uZmlndXJlZC4gQnVpbHQgb25jZSBhbmQgbWVtb2l6ZWQgKHBlclxuICAgKiBjbGllbnQpOiBhbiBhcHAtcHJvdmlkZWQgYHN5bmMuY2xpZW50LndlYnNvY2tldENsaWVudGAgaW5zdGFuY2Ugd2lucyAodGhlXG4gICAqIGZyb250ZW5kLW1vZGVsIHRyYW5zcG9ydCBjYW4gcGFzcyBpdHMgb3duIGNsaWVudCBzbyBvbmUgc29ja2V0IGNhcnJpZXNcbiAgICogZXZlcnl0aGluZyksIGVsc2UgYSBmcmFtZXdvcmstb3duZWQgcmVjb25uZWN0aW5nIHtAbGluayBWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnR9XG4gICAqIGJ1aWx0IGZyb20gYHN5bmMuY2xpZW50LndlYnNvY2tldFVybGAuIFRoZSByZWFsdGltZSBicmlkZ2UgcmlkZXMgdGhpc1xuICAgKiBjb25uZWN0aW9uIHdpdGhvdXQgb3duaW5nIGl0cyBsaWZlY3ljbGU7IHdoZW4gbmVpdGhlciBpcyBjb25maWd1cmVkIHRoZVxuICAgKiBicmlkZ2UgZmFsbHMgYmFjayB0byB0aGUgZGVwcmVjYXRlZCBwZXItY3ljbGUgYHJlYWx0aW1lLmNyZWF0ZUNsaWVudGAuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRTaGFyZWRDb25uZWN0aW9uIHwgbnVsbH0gU2hhcmVkIHdlYnNvY2tldCBjb25uZWN0aW9uLCBvciBudWxsLlxuICAgKi9cbiAgc3luY0Nvbm5lY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX3N5bmNDb25uZWN0aW9uICE9PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLl9zeW5jQ29ubmVjdGlvblxuXG4gICAgaWYgKHRoaXMuY29uZmlnLndlYnNvY2tldENsaWVudCkge1xuICAgICAgdGhpcy5fc3luY0Nvbm5lY3Rpb24gPSB0aGlzLmNvbmZpZy53ZWJzb2NrZXRDbGllbnRcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLndlYnNvY2tldFVybCkge1xuICAgICAgY29uc3QgdXJsID0gdHlwZW9mIHRoaXMuY29uZmlnLndlYnNvY2tldFVybCA9PT0gXCJmdW5jdGlvblwiID8gdGhpcy5jb25maWcud2Vic29ja2V0VXJsKCkgOiB0aGlzLmNvbmZpZy53ZWJzb2NrZXRVcmxcblxuICAgICAgdGhpcy5fc3luY0Nvbm5lY3Rpb24gPSB1cmwgPyBuZXcgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50KHt1cmx9KSA6IG51bGxcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc3luY0Nvbm5lY3Rpb24gPSBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3N5bmNDb25uZWN0aW9uXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0aGUgZGVyaXZlZCByZWFsdGltZSBjaGFubmVscyBzbyBwdXNoZWQgd2Vic29ja2V0IGNoYW5nZXMgYXBwbHlcbiAgICogdGhyb3VnaCB0aGUgc2FtZSBkZXJpdmVkIGFwcGxpZXIgYXMgcHVsbHMgKGlkZW1wb3RlbnQsIHNpbmdsZS1mbGlnaHRlZCkuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IFtjb250ZXh0XSAtIEFwcCBjb250ZXh0IHBhc3NlZCB0byB0aGUgZGVwcmVjYXRlZCBgc3luYy5jbGllbnQucmVhbHRpbWUuY2hhbm5lbHNgIGNhbGxiYWNrIChydW50aW1lIHNjb3BlIHZhbHVlcykuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3Vic2NyaWJlUmVhbHRpbWUoY29udGV4dCkge1xuICAgIHRoaXMuYXNzZXJ0VGVuYW50UmVhZHkoKVxuICAgIGF3YWl0IHRoaXMucmVhbHRpbWVCcmlkZ2UoKS5zdWJzY3JpYmUoY29udGV4dClcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIHRoZSBzZXJ2ZXItZW51bWVyYXRlZCB1c2VyIHNjb3BlOiBcImV2ZXJ5dGhpbmcgbXkgYWJpbGl0eSBjYW5cbiAgICogc2VlXCIuIERlY2xhcmVzIGEgdXNlciBzY29wZSAoZW1wdHkgY29uZGl0aW9ucykgZm9yIGV2ZXJ5IHB1bGxhYmxlIHN5bmNlZFxuICAgKiByZXNvdXJjZSB0eXBlLCBzdWJzY3JpYmVzIHJlYWx0aW1lIHNvIHRoZWlyIGZyYW1ld29yayBzeW5jIGNoYW5uZWxcbiAgICogc3Vic2NyaXB0aW9ucyBnbyBsaXZlLCBhbmQgcHVsbHMgc28gdGhlIGRldmljZSBjYXRjaGVzIHVwLiBUaGUgc2VydmVyXG4gICAqIGF1dGhvcml6ZXMgZWFjaCBlbXB0eS1jb25kaXRpb25zIHNjb3BlIHRocm91Z2ggdGhlIGFwcCBzeW5jIHJlc291cmNlJ3NcbiAgICogYGF1dGhvcml6ZUNoYW5nZXNgIGFuZCByZS1jaGVja3MgcmVjb3JkIGFjY2VzcyBwZXIgZGVsaXZlcnksIHNvIHRoZSBjbGllbnRcbiAgICogc3Vic2NyaWJlcyB3aXRoIGp1c3QgaXRzIHRva2VuIGFuZCB0aGUgc2VydmVyIGRlY2lkZXMgbWVtYmVyc2hpcC5cbiAgICogSWRlbXBvdGVudCBhbmQgc2luZ2xlLWZsaWdodGVkIGxpa2Uge0BsaW5rIFN5bmNDbGllbnQjc3Vic2NyaWJlUmVhbHRpbWV9LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHN1YnNjcmliZVVzZXJTY29wZSgpIHtcbiAgICBpZiAodGhpcy5fdXNlclNjb3BlU3RhdGUgPT09IFwic3Vic2NyaWJlZFwiKSByZXR1cm5cblxuICAgIGlmICghdGhpcy5fc3Vic2NyaWJlVXNlclNjb3BlUHJvbWlzZSkge1xuICAgICAgdGhpcy5fc3Vic2NyaWJlVXNlclNjb3BlUHJvbWlzZSA9IHRoaXMuX3N1YnNjcmliZVVzZXJTY29wZSgpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICB0aGlzLl9zdWJzY3JpYmVVc2VyU2NvcGVQcm9taXNlID0gbnVsbFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLl9zdWJzY3JpYmVVc2VyU2NvcGVQcm9taXNlXG4gIH1cblxuICAvKipcbiAgICogRGVjbGFyZXMgYW5kIGFjdGl2YXRlcyB0aGUgdXNlciBzY29wZSBmb3IgZXZlcnkgcHVsbGFibGUgcmVzb3VyY2UsIHRoZW5cbiAgICogc3Vic2NyaWJlcyByZWFsdGltZSBhbmQgcHVsbHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX3N1YnNjcmliZVVzZXJTY29wZSgpIHtcbiAgICB0aGlzLl91c2VyU2NvcGVTdGF0ZSA9IFwic3Vic2NyaWJpbmdcIlxuXG4gICAgYXdhaXQgdGhpcy5zY29wZVN0b3JlKCkuZmluZE9yQ3JlYXRlU2NvcGUoYXdhaXQgdGhpcy51c2VyU2NvcGUoKSlcblxuICAgIGF3YWl0IHRoaXMuc3Vic2NyaWJlUmVhbHRpbWUoKVxuICAgIGF3YWl0IHRoaXMucHVsbCgpXG5cbiAgICB0aGlzLl91c2VyU2NvcGVTdGF0ZSA9IFwic3Vic2NyaWJlZFwiXG4gIH1cblxuICAvKipcbiAgICogVW5zdWJzY3JpYmVzIHRoZSB1c2VyIHNjb3BlOiBkZWFjdGl2YXRlcyB0aGUgcGVyLXJlc291cmNlIHVzZXIgc2NvcGVzIGFuZFxuICAgKiBjbG9zZXMgdGhlIHJlYWx0aW1lIGNoYW5uZWwgc3Vic2NyaXB0aW9ucy4gVGhlIHNoYXJlZCB3ZWJzb2NrZXQgY29ubmVjdGlvblxuICAgKiBzdGF5cyBvcGVuIHdoZW4gb25lIGlzIGNvbmZpZ3VyZWQgKHNpZ24tb3V0IGRyb3BzIHN1YnNjcmlwdGlvbnMgd2l0aG91dFxuICAgKiBkaXNjb25uZWN0aW5nKSwgc28gYSBzdWJzZXF1ZW50IHNpZ24taW4gcmVzdWJzY3JpYmVzIG92ZXIgdGhlIHNhbWUgc29ja2V0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHVuc3Vic2NyaWJlVXNlclNjb3BlKCkge1xuICAgIGF3YWl0IHRoaXMuc2NvcGVTdG9yZSgpLmRlYWN0aXZhdGUoYXdhaXQgdGhpcy51c2VyU2NvcGUoKSlcblxuICAgIGF3YWl0IHRoaXMudW5zdWJzY3JpYmVSZWFsdGltZSgpXG5cbiAgICB0aGlzLl91c2VyU2NvcGVTdGF0ZSA9IFwidW5zdWJzY3JpYmVkXCJcbiAgICB0aGlzLl9zdWJzY3JpYmVVc2VyU2NvcGVQcm9taXNlID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB1c2VyIHNjb3BlOiBhIHNpbmdsZSBhbGwtdHlwZXMgc2NvcGUgKG51bGwgcmVzb3VyY2VUeXBlKSB3aXRoIGVtcHR5XG4gICAqIGNvbmRpdGlvbnMsIHBhcnRpdGlvbmVkIGxvY2FsbHkgYnkgb3duZXIuIE9uZSBzY29wZSAtIG5vdCBvbmUgcGVyIHJlc291cmNlXG4gICAqIHR5cGUgLSBzbyB0aGUgc2VydmVyIGF1dGhvcml6ZXMgdGhlIGNhbGxlciBvbmNlIHBlciBzeW5jIGFuZCBwZXIgc3Vic2NyaWJlLFxuICAgKiBob3dldmVyIG1hbnkgcmVzb3VyY2UgdHlwZXMgaXQgc2VydmVzLiBUaGUgc2VydmVyIGRlY2lkZXMgd2hpY2ggdHlwZXMgdGhlXG4gICAqIGNhbGxlciBtYXkgc2VlOyB0aGUgY2xpZW50IGFwcGxpZXMgZWFjaCBwdWxsZWQgcm93IGJ5IHRoZSByZXNvdXJjZSB0eXBlIG9uXG4gICAqIGl0cyBvd24gZW52ZWxvcGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU2VyaWFsaXplZFN5bmNTY29wZT59IFRoZSB1c2VyIHNjb3BlLlxuICAgKi9cbiAgYXN5bmMgdXNlclNjb3BlKCkge1xuICAgIHJldHVybiB7Y29uZGl0aW9uczoge30sIG93bmVyOiBhd2FpdCB0aGlzLnVzZXJTY29wZU93bmVyKCksIHJlc291cmNlVHlwZTogbnVsbH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgdHlwZXMgdGhlIHVzZXIgc2NvcGUgY292ZXJzOiBldmVyeSBkZWNsYXJlZCByZXNvdXJjZSB0aGF0XG4gICAqIHJlY2VpdmVzIHB1bGxlZCBjaGFuZ2VzIChoYXMgcHVsbCBgYXR0cmlidXRlc2ApLCBzbyB0aGUgY2xpZW50IGNhbiBhcHBseVxuICAgKiB0aGVtLiBTZW50IHdpdGggdGhlIHNjb3BlIGFzIGEgZGVsaXZlcnkvdHlwZSBmaWx0ZXIgLSBpdCBuYXJyb3dzLCBuZXZlclxuICAgKiB3aWRlbnMsIHdoYXQgdGhlIHNlcnZlcidzIGF1dGhvcml6YXRpb24gYWxyZWFkeSBhbGxvd3MsIGFuZCBpdCBrZWVwcyBhXG4gICAqIGJyb2FkY2FzdCBvZiBhIHR5cGUgdGhpcyBjbGllbnQgY2Fubm90IGFwcGx5IGZyb20gcmVhY2hpbmcgdGhlIHNlcnZlcidzXG4gICAqIHBlci1kZWxpdmVyeSBhY2Nlc3MgcmUtY2hlY2sgKGEgZGF0YWJhc2UgcXVlcnkgcGVyIG1hdGNoZWQgYnJvYWRjYXN0LCBwZXJcbiAgICogc3Vic2NyaWJlZCBkZXZpY2UpLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IFB1bGxhYmxlIHJlc291cmNlIHR5cGUgbmFtZXMuXG4gICAqL1xuICB1c2VyU2NvcGVSZXNvdXJjZVR5cGVzKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnB1bGxSZXNvdXJjZUNvbmZpZ3MoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgbG9jYWwgcGFydGl0aW9uIGtleSBmb3IgdGhlIHVzZXIgc2NvcGU6IHRoZSBjdXJyZW50bHlcbiAgICogY29uZmlndXJlZCBhdXRoZW50aWNhdGVkIGlkZW50aXR5ICh0aGUgc3luYyBhdXRoIHRva2VuKS4gUGFydGl0aW9uaW5nIHRoZVxuICAgKiB1c2VyIHNjb3BlJ3MgbG9jYWwgc2NvcGUvY3Vyc29yIHJvd3MgYnkgdGhpcyBvd25lciBrZWVwcyB0aGVcbiAgICogZW1wdHktY29uZGl0aW9ucyBjdXJzb3IgZnJvbSBsZWFraW5nIGFjcm9zcyBhY2NvdW50cyBvbiBhIHNoYXJlZCBkZXZpY2VcbiAgICogKGFjY291bnQgQiBzaWduaW5nIGluIGFmdGVyIGFjY291bnQgQSBnZXRzIGEgZnJlc2ggY3Vyc29yKSB3aGlsZSB0aGUgc2FtZVxuICAgKiBhY2NvdW50IHJlY29ubmVjdGluZyBrZWVwcyBpdHMgY3Vyc29yIGNvbnRpbnVpdHkuIFRoZSBvd25lciBpcyBhIGxvY2FsXG4gICAqIHBhcnRpdGlvbiBrZXkgb25seSDigJQgcHVsbHMgc3RpbGwgcG9zdCBlbXB0eSBjb25kaXRpb25zIHRvIHRoZSBzZXJ2ZXIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IFVzZXItc2NvcGUgb3duZXIgcGFydGl0aW9uIGtleS5cbiAgICovXG4gIGFzeW5jIHVzZXJTY29wZU93bmVyKCkge1xuICAgIHJldHVybiBTdHJpbmcoYXdhaXQgdGhpcy5jb25maWcuYXV0aGVudGljYXRpb25Ub2tlbigpKVxuICB9XG5cbiAgLyoqXG4gICAqIFVuc3Vic2NyaWJlcyB0aGUgcmVhbHRpbWUgY2hhbm5lbHMgYW5kIGRpc2Nvbm5lY3RzIHRoZSB3ZWJzb2NrZXQgY2xpZW50IChpZGVtcG90ZW50KS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB1bnN1YnNjcmliZVJlYWx0aW1lKCkge1xuICAgIGF3YWl0IHRoaXMucmVhbHRpbWVCcmlkZ2UoKS51bnN1YnNjcmliZSgpXG4gIH1cblxuICAvKipcbiAgICogUmVwb3J0cyB0aGUgcmVhbHRpbWUgc3Vic2NyaXB0aW9uIHN0YXRlIGFuZCBwZXItY2hhbm5lbCByZWFkaW5lc3MuXG4gICAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPFN5bmNSZWFsdGltZUJyaWRnZVtcInN0YXR1c1wiXT59IFJlYWx0aW1lIHN0YXR1cy5cbiAgICovXG4gIHJlYWx0aW1lU3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLnJlYWx0aW1lQnJpZGdlKCkuc3RhdHVzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBBd2FpdHMgYWxsIHBlbmRpbmcgcmVhbHRpbWUgbWVzc2FnZSBhcHBsaWVzIGFuZCBhbnkgc2NoZWR1bGVkXG4gICAqIHB1bGwtb24tcmVjb25uZWN0ICh1c2VmdWwgaW4gdGVzdHMgYW5kIHNodXRkb3duIGZsb3dzKS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YWl0Rm9yUmVhbHRpbWVBcHBsaWVkKCkge1xuICAgIGF3YWl0IHRoaXMucmVhbHRpbWVCcmlkZ2UoKS53YWl0Rm9yQXBwbGllZCgpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGF6aWx5IGJ1aWx0IHJlYWx0aW1lIGJyaWRnZS5cbiAgICogQHJldHVybnMge1N5bmNSZWFsdGltZUJyaWRnZX0gUmVhbHRpbWUgYnJpZGdlLlxuICAgKi9cbiAgcmVhbHRpbWVCcmlkZ2UoKSB7XG4gICAgdGhpcy5fcmVhbHRpbWVCcmlkZ2UgfHw9IG5ldyBTeW5jUmVhbHRpbWVCcmlkZ2Uoe3N5bmNDbGllbnQ6IHRoaXN9KVxuXG4gICAgcmV0dXJuIHRoaXMuX3JlYWx0aW1lQnJpZGdlXG4gIH1cblxuICAvKipcbiAgICogUXVldWVzIGEgbG9jYWwgbW9kZWwgY2hhbmdlIGFzIGEgcGVuZGluZyBzeW5jIHJvdyBhbmQgc2NoZWR1bGVzIGFuIGltbWVkaWF0ZVxuICAgKiByZXBsYXkgYXR0ZW1wdCAoa2VwdCBwZW5kaW5nIHdoaWxlIG9mZmxpbmUgb3Igd2hlbiB0aGUgYmFja2VuZCByZWplY3RzIGl0KS5cbiAgICogQHBhcmFtIHt7YmFzZVZlcnNpb24/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsLCByZXNvdXJjZTogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIG9wZXJhdGlvbj86IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIsIHN5bmNUeXBlPzogc3RyaW5nfX0gYXJncyAtIFF1ZXVlIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+IHwgaW1wb3J0KFwiLi9sb2NhbC1tdXRhdGlvbi1sb2cuanNcIikuTG9jYWxNdXRhdGlvbkxvZ1JlY29yZD59IFBlbmRpbmcgbG9jYWwgc3luYyByb3cgb3IgZHVyYWJsZSBjb25mbGljdC10cmFja2VkIGludGVudC5cbiAgICovXG4gIGFzeW5jIHF1ZXVlKHtiYXNlVmVyc2lvbiwgZGF0YSwgb3BlcmF0aW9uID0gXCJ1cGRhdGVcIiwgcmVzb3VyY2UsIHN5bmNUeXBlfSkge1xuICAgIHRoaXMuYXNzZXJ0VGVuYW50UmVhZHkoKVxuICAgIHRoaXMuYXNzZXJ0UmVjb3JkT3duZXJzaGlwKHJlc291cmNlKVxuICAgIGNvbnN0IHJlc291cmNlQ29uZmlnID0gdGhpcy5yZXNvdXJjZUNvbmZpZ0ZvcihyZXNvdXJjZSlcbiAgICBjb25zdCByZXNvbHZlZFN5bmNUeXBlID0gc3luY1R5cGUgPz8gdGhpcy5kZWZhdWx0U3luY1R5cGUoe29wZXJhdGlvbiwgcmVjb3JkOiByZXNvdXJjZSwgcmVzb3VyY2VDb25maWd9KVxuXG4gICAgaWYgKHJlc291cmNlQ29uZmlnLmNvbmZsaWN0VHJhY2tpbmcpIHtcbiAgICAgIGNvbnN0IHF1ZXVlZERhdGEgPSBTeW5jQXBpQ2xpZW50LnF1ZXVlZFN5bmNEYXRhKHtcbiAgICAgICAgYm9vbGVhbkF0dHJpYnV0ZXM6IHJlc291cmNlQ29uZmlnLmJvb2xlYW5BdHRyaWJ1dGVzIHx8IFtdLFxuICAgICAgICBkYXRhLFxuICAgICAgICBsb2NhbE9ubHlBdHRyaWJ1dGVzOiByZXNvdXJjZUNvbmZpZy5sb2NhbE9ubHlBdHRyaWJ1dGVzIHx8IFtdLFxuICAgICAgICByZXNvdXJjZVxuICAgICAgfSlcbiAgICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IFN5bmNBcGlDbGllbnQucXVldWVDb25mbGljdFRyYWNrZWRTeW5jKHtcbiAgICAgICAgYmFzZVZlcnNpb246IGJhc2VWZXJzaW9uID09PSB1bmRlZmluZWQgPyB0aGlzLmJhc2VWZXJzaW9uRm9yKHtvcGVyYXRpb24sIHJlY29yZDogcmVzb3VyY2UsIHJlc291cmNlQ29uZmlnfSkgOiBiYXNlVmVyc2lvbixcbiAgICAgICAgY29uZmxpY3RUcmFja2luZzogcmVzb3VyY2VDb25maWcuY29uZmxpY3RUcmFja2luZyxcbiAgICAgICAgZGF0YTogcXVldWVkRGF0YSxcbiAgICAgICAgb3BlcmF0aW9uLFxuICAgICAgICByZXNvdXJjZSxcbiAgICAgICAgcmVzb3VyY2VUeXBlOiByZXNvdXJjZS5jb25zdHJ1Y3Rvci5nZXRNb2RlbE5hbWUoKSxcbiAgICAgICAgc3luY1R5cGU6IHJlc29sdmVkU3luY1R5cGVcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMuc2NoZWR1bGVSZXBsYXkoKVxuXG4gICAgICByZXR1cm4gcmVjb3JkXG4gICAgfVxuXG4gICAgY29uc3Qgc3luY1JvdyA9IGF3YWl0IHRoaXMud2l0aFRlbmFudE9wZXJhdGlvbihhc3luYyAoZGF0YWJhc2VPcGVyYXRpb24pID0+IGF3YWl0IFN5bmNBcGlDbGllbnQucXVldWVMb2NhbFN5bmMoe1xuICAgICAgYm9vbGVhbkF0dHJpYnV0ZXM6IHJlc291cmNlQ29uZmlnLmJvb2xlYW5BdHRyaWJ1dGVzIHx8IFtdLFxuICAgICAgZGF0YSxcbiAgICAgIGxvY2FsT25seUF0dHJpYnV0ZXM6IHJlc291cmNlQ29uZmlnLmxvY2FsT25seUF0dHJpYnV0ZXMgfHwgW10sXG4gICAgICByZXNvdXJjZSxcbiAgICAgIHN5bmNNb2RlbDogZGF0YWJhc2VPcGVyYXRpb24gPyBkYXRhYmFzZU9wZXJhdGlvbi5tb2RlbENsYXNzKHRoaXMuY29uZmlnLnN5bmNNb2RlbCkgOiB0aGlzLmNvbmZpZy5zeW5jTW9kZWwsXG4gICAgICBzeW5jVHlwZTogcmVzb2x2ZWRTeW5jVHlwZVxuICAgIH0pKVxuXG4gICAgdGhpcy5zY2hlZHVsZVJlcGxheSgpXG5cbiAgICByZXR1cm4gc3luY1Jvd1xuICB9XG5cbiAgLyoqXG4gICAqIERyYWlucyBwZW5kaW5nIGxvY2FsIHN5bmMgcm93cyB0byB0aGUgYmFja2VuZCAoc2luZ2xlLWZsaWdodGVkLCBvbmxpbmUtZ2F0ZWQpLlxuICAgKiBSb3dzIGFyZSBvbmx5IG1hcmtlZCBzdWNjZXNzZnVsIGFmdGVyIHRoZSBiYWNrZW5kIGFja25vd2xlZGdlcyB0aGVtLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHJlcGxheVBlbmRpbmcoKSB7XG4gICAgdGhpcy5hc3NlcnRUZW5hbnRSZWFkeSgpXG4gICAgaWYgKCEoYXdhaXQgdGhpcy5pc09ubGluZSgpKSkgcmV0dXJuXG5cbiAgICBhd2FpdCBTeW5jQXBpQ2xpZW50LnNpbmdsZUZsaWdodChgdmVsb2Npb3VzLXN5bmMtY2xpZW50LXJlcGxheS0ke3RoaXMuX2NsaWVudE51bWJlcn1gLCBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLndpdGhUZW5hbnRPcGVyYXRpb24oYXN5bmMgKG9wZXJhdGlvbikgPT4ge1xuICAgICAgZm9yIChjb25zdCBbcmVzb3VyY2VUeXBlLCByZXNvdXJjZUNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5jb25maWcucmVzb3VyY2VzKSkge1xuICAgICAgICBpZiAoIXJlc291cmNlQ29uZmlnLmNvbmZsaWN0VHJhY2tpbmcpIGNvbnRpbnVlXG5cbiAgICAgICAgYXdhaXQgU3luY0FwaUNsaWVudC5yZXBsYXlDb25mbGljdFRyYWNrZWRTeW5jcyh7XG4gICAgICAgICAgYXV0aGVudGljYXRpb25Ub2tlbjogYXdhaXQgdGhpcy5jb25maWcuYXV0aGVudGljYXRpb25Ub2tlbigpLFxuICAgICAgICAgIGJhdGNoU2l6ZTogdGhpcy5jb25maWcuYmF0Y2hTaXplLFxuICAgICAgICAgIGNvbmZsaWN0VHJhY2tpbmc6IHJlc291cmNlQ29uZmlnLmNvbmZsaWN0VHJhY2tpbmcsXG4gICAgICAgICAgcG9zdFJlcGxheTogdGhpcy5jb25maWcucG9zdFJlcGxheSxcbiAgICAgICAgICByZW1vdGVHZW5lcmF0aW9uOiAoaWRlbnRpdHkpID0+IHRoaXMuX3JlbW90ZUdlbmVyYXRpb25zLmdldChpZGVudGl0eSkgfHwgMCxcbiAgICAgICAgICByZXNvdXJjZVR5cGVcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgYXdhaXQgU3luY0FwaUNsaWVudC5yZXBsYXlMb2NhbFN5bmNzKHtcbiAgICAgICAgYXV0aGVudGljYXRpb25Ub2tlbjogYXdhaXQgdGhpcy5jb25maWcuYXV0aGVudGljYXRpb25Ub2tlbigpLFxuICAgICAgICBiYXRjaFNpemU6IHRoaXMuY29uZmlnLmJhdGNoU2l6ZSxcbiAgICAgICAgcG9zdFJlcGxheTogdGhpcy5jb25maWcucG9zdFJlcGxheSxcbiAgICAgICAgc3luY01vZGVsOiBvcGVyYXRpb24gPyBvcGVyYXRpb24ubW9kZWxDbGFzcyh0aGlzLmNvbmZpZy5zeW5jTW9kZWwpIDogdGhpcy5jb25maWcuc3luY01vZGVsXG4gICAgICB9KVxuICAgIH0pKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZHMgYW4gYXV0aG9yaXRhdGl2ZSByZW1vdGUgb2JzZXJ2YXRpb24gc28gYW4gaW4tZmxpZ2h0IGFja25vd2xlZGdlbWVudFxuICAgKiBjYW5ub3QgcmViYXNlIGEgc3VjY2Vzc29yIGFjcm9zcyB0aGF0IG9ic2VydmF0aW9uLlxuICAgKiBAcGFyYW0ge3tyZXNvdXJjZUlkOiBzdHJpbmcgfCBudW1iZXIsIHJlc291cmNlVHlwZTogc3RyaW5nLCB2ZXJzaW9uPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbH19IGFyZ3MgLSBSZW1vdGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgbm90ZVJlbW90ZVZlcnNpb24oe3Jlc291cmNlSWQsIHJlc291cmNlVHlwZSwgdmVyc2lvbn0pIHtcbiAgICB2b2lkIHZlcnNpb25cbiAgICBjb25zdCBpZGVudGl0eSA9IGAke3Jlc291cmNlVHlwZX06JHtTdHJpbmcocmVzb3VyY2VJZCl9YFxuXG4gICAgdGhpcy5fcmVtb3RlR2VuZXJhdGlvbnMuc2V0KGlkZW50aXR5LCAodGhpcy5fcmVtb3RlR2VuZXJhdGlvbnMuZ2V0KGlkZW50aXR5KSB8fCAwKSArIDEpXG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIGF1dGhvcml0YXRpdmUgYmFzZSB2ZXJzaW9uIG9ic2VydmVkIGJlZm9yZSBhIGxvY2FsIG11dGF0aW9uLlxuICAgKiBAcGFyYW0ge3tvcGVyYXRpb246IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIsIHJlY29yZDogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIHJlc291cmNlQ29uZmlnOiBpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRSZXNvdXJjZUNvbmZpZ319IGFyZ3MgLSBWZXJzaW9uIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudW1iZXIgfCBudWxsfSBCYXNlIHZlcnNpb24uXG4gICAqL1xuICBiYXNlVmVyc2lvbkZvcih7b3BlcmF0aW9uLCByZWNvcmQsIHJlc291cmNlQ29uZmlnfSkge1xuICAgIGlmIChvcGVyYXRpb24gPT09IFwiY3JlYXRlXCIpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCB2ZXJzaW9uQXR0cmlidXRlID0gcmVzb3VyY2VDb25maWcuY29uZmxpY3RUcmFja2luZz8udmVyc2lvbkF0dHJpYnV0ZVxuXG4gICAgaWYgKCF2ZXJzaW9uQXR0cmlidXRlKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgdmFsdWUgPSByZWNvcmQucmVhZEF0dHJpYnV0ZSh2ZXJzaW9uQXR0cmlidXRlKVxuXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIHZhbHVlLnRvSVNPU3RyaW5nKClcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHZhbHVlXG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFN5bmMgY29uZmxpY3QgdmVyc2lvbiAke3ZlcnNpb25BdHRyaWJ1dGV9IG11c3QgYmUgYSBEYXRlLCBzdHJpbmcsIG51bWJlciwgb3IgbnVsbGApXG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIHByZS1hc3NpZ25tZW50IHZhbHVlIGV4cG9zZWQgYnkgcmVjb3JkIGNoYW5nZXMgZHVyaW5nIGJlZm9yZVVwZGF0ZS5cbiAgICogRGVsZXRlcyBoYXZlIG5vIHZlcnNpb24gY2hhbmdlIHBhaXIgYW5kIHVzZSB0aGUgcmVjb3JkJ3MgY3VycmVudCB2ZXJzaW9uLlxuICAgKiBAcGFyYW0ge3tvcGVyYXRpb246IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIsIHJlY29yZDogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIHJlc291cmNlQ29uZmlnOiBpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRSZXNvdXJjZUNvbmZpZ319IGFyZ3MgLSBWZXJzaW9uIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudW1iZXIgfCBudWxsfSBQcmUtbXV0YXRpb24gYmFzZSB2ZXJzaW9uLlxuICAgKi9cbiAgcHJlTXV0YXRpb25CYXNlVmVyc2lvbkZvcih7b3BlcmF0aW9uLCByZWNvcmQsIHJlc291cmNlQ29uZmlnfSkge1xuICAgIGNvbnN0IHZlcnNpb25BdHRyaWJ1dGUgPSByZXNvdXJjZUNvbmZpZy5jb25mbGljdFRyYWNraW5nPy52ZXJzaW9uQXR0cmlidXRlXG4gICAgY29uc3QgdmVyc2lvbkNvbHVtbiA9IHZlcnNpb25BdHRyaWJ1dGVcbiAgICAgID8gcmVjb3JkLmNvbnN0cnVjdG9yLmdldEF0dHJpYnV0ZU5hbWVUb0NvbHVtbk5hbWVNYXAoKVt2ZXJzaW9uQXR0cmlidXRlXVxuICAgICAgOiB1bmRlZmluZWRcbiAgICBjb25zdCB2ZXJzaW9uQ2hhbmdlID0gb3BlcmF0aW9uID09PSBcInVwZGF0ZVwiICYmIHZlcnNpb25Db2x1bW5cbiAgICAgID8gcmVjb3JkLmNoYW5nZXMoKVt2ZXJzaW9uQ29sdW1uXVxuICAgICAgOiB1bmRlZmluZWRcblxuICAgIGlmICghdmVyc2lvbkNoYW5nZSkgcmV0dXJuIHRoaXMuYmFzZVZlcnNpb25Gb3Ioe29wZXJhdGlvbiwgcmVjb3JkLCByZXNvdXJjZUNvbmZpZ30pXG5cbiAgICBjb25zdCB2YWx1ZSA9IHZlcnNpb25DaGFuZ2VbMF1cblxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiB2YWx1ZS50b0lTT1N0cmluZygpXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHJldHVybiB2YWx1ZVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBTeW5jIGNvbmZsaWN0IHZlcnNpb24gJHt2ZXJzaW9uQXR0cmlidXRlfSBtdXN0IGJlIGEgRGF0ZSwgc3RyaW5nLCBudW1iZXIsIG9yIG51bGxgKVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnN1bWVzIHRoZSBiYXNlIGNhcHR1cmVkIGZvciB0aGlzIGxpZmVjeWNsZSBldmVudCBiZWZvcmUgaXRzIGFmdGVyLWNvbW1pdFxuICAgKiBjbG9zdXJlIGlzIGRlZmVycmVkLCBwcmVzZXJ2aW5nIHJlcGVhdGVkIHNhbWUtcmVjb3JkIHdyaXRlcyBpbiBvbmUgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSB7e29wZXJhdGlvbjogXCJjcmVhdGVcIiB8IFwidXBkYXRlXCIgfCBcImRlc3Ryb3lcIiwgcmVjb3JkOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgcmVzb3VyY2VDb25maWc6IGltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudFJlc291cmNlQ29uZmlnfX0gYXJncyAtIENhcHR1cmUgYXJncy5cbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bWJlciB8IG51bGx9IENhcHR1cmVkIGJhc2UgdmVyc2lvbi5cbiAgICovXG4gIGNhcHR1cmVkQmFzZVZlcnNpb25Gb3Ioe29wZXJhdGlvbiwgcmVjb3JkLCByZXNvdXJjZUNvbmZpZ30pIHtcbiAgICBpZiAob3BlcmF0aW9uID09PSBcImNyZWF0ZVwiKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgY2FwdHVyZWRWZXJzaW9ucyA9IHRoaXMuX2NhcHR1cmVkQmFzZVZlcnNpb25zLmdldChyZWNvcmQpXG4gICAgY29uc3QgYmFzZVZlcnNpb24gPSBjYXB0dXJlZFZlcnNpb25zPy5zaGlmdCgpXG5cbiAgICBpZiAoY2FwdHVyZWRWZXJzaW9ucz8ubGVuZ3RoID09PSAwKSB0aGlzLl9jYXB0dXJlZEJhc2VWZXJzaW9ucy5kZWxldGUocmVjb3JkKVxuICAgIGlmIChiYXNlVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYmFzZVZlcnNpb25cblxuICAgIHJldHVybiB0aGlzLmJhc2VWZXJzaW9uRm9yKHtvcGVyYXRpb24sIHJlY29yZCwgcmVzb3VyY2VDb25maWd9KVxuICB9XG5cbiAgLyoqXG4gICAqIFNjaGVkdWxlcyBhIGJhY2tncm91bmQgcmVwbGF5IGF0dGVtcHQgd2l0aG91dCBibG9ja2luZyB0aGUgY2FsbGVyLlxuICAgKiBGYWlsdXJlcyBnbyB0byBjb25maWcub25FcnJvciAob3IgcmV0aHJvdyB3aGVuIG5vbmUgaXMgY29uZmlndXJlZCkuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2NoZWR1bGVSZXBsYXkoKSB7XG4gICAgdGhpcy5fc2NoZWR1bGVkUmVwbGF5ID0gKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVwbGF5UGVuZGluZygpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLnJlcG9ydEVycm9yKC8qKiBAdHlwZSB7RXJyb3J9ICovIChlcnJvcikpXG4gICAgICB9XG4gICAgfSkoKVxuICB9XG5cbiAgLyoqXG4gICAqIEF3YWl0cyB0aGUgbGFzdCBzY2hlZHVsZWQgYmFja2dyb3VuZCByZXBsYXkgKHVzZWZ1bCBpbiB0ZXN0cyBhbmQgc2h1dGRvd24gZmxvd3MpLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHdhaXRGb3JTY2hlZHVsZWRSZXBsYXkoKSB7XG4gICAgaWYgKHRoaXMuX3NjaGVkdWxlZFJlcGxheSkgYXdhaXQgdGhpcy5fc2NoZWR1bGVkUmVwbGF5XG4gIH1cblxuICAvKipcbiAgICogUmVwb3J0cyBhIGJhY2tncm91bmQgc3luYyBmYWlsdXJlLlxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIEJhY2tncm91bmQgZmFpbHVyZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICByZXBvcnRFcnJvcihlcnJvcikge1xuICAgIGlmICh0aGlzLmNvbmZpZy5vbkVycm9yKSB7XG4gICAgICB0aGlzLmNvbmZpZy5vbkVycm9yKGVycm9yKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhyb3cgZXJyb3JcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBjb25uZWN0aXZpdHkgdGhyb3VnaCB0aGUgY29uZmlndXJlZCBnYXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gV2hldGhlciB0aGUgYmFja2VuZCBpcyBjb25zaWRlcmVkIHJlYWNoYWJsZS5cbiAgICovXG4gIGFzeW5jIGlzT25saW5lKCkge1xuICAgIGlmICghdGhpcy5jb25maWcuaXNPbmxpbmUpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuY29uZmlnLmlzT25saW5lKCkpICE9PSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNjb3BlIHN0b3JlIGJhY2tpbmcgZGVjbGFyZWQgc2NvcGVzIGFuZCBjdXJzb3JzLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zeW5jLXNjb3BlLXN0b3JlLmpzXCIpLmRlZmF1bHR9IFNjb3BlIHN0b3JlLlxuICAgKi9cbiAgc2NvcGVTdG9yZSgpIHtcbiAgICB0aGlzLmFzc2VydFRlbmFudFJlYWR5KClcblxuICAgIGlmICh0aGlzLl9zY29wZVN0b3JlICYmIHRoaXMuX2RhdGFiYXNlSWRlbnRpdHkgJiYgdGhpcy5fc2NvcGVTdG9yZS5zdG9yZUlkZW50aXR5ICE9PSB0aGlzLl9kYXRhYmFzZUlkZW50aXR5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jQ2xpZW50IHNjb3BlIHN0b3JlIGJlbG9uZ3MgdG8gYW5vdGhlciBvciB1bnJlc29sdmVkIHBoeXNpY2FsIHRlbmFudCBkYXRhYmFzZVwiKVxuICAgIH1cblxuICAgIHRoaXMuX3Njb3BlU3RvcmUgfHw9IG5ldyBTeW5jU2NvcGVTdG9yZSh7XG4gICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZy5jb25maWd1cmF0aW9uLFxuICAgICAgZGF0YWJhc2VJZGVudGlmaWVyOiB0aGlzLmNvbmZpZy5kYXRhYmFzZUlkZW50aWZpZXIsXG4gICAgICB0ZW5hbnRIYW5kbGU6IHRoaXMuY29uZmlnLnRlbmFudEhhbmRsZVxuICAgIH0pXG5cbiAgICByZXR1cm4gdGhpcy5fc2NvcGVTdG9yZVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBkZWNsYXJlZCByZXNvdXJjZSBjb25maWcgZm9yIGEgbG9jYWwgcmVjb3JkLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSByZXNvdXJjZSAtIExvY2FsIG1vZGVsIHJlY29yZC5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudFJlc291cmNlQ29uZmlnfSBEZWNsYXJlZCByZXNvdXJjZSBjb25maWcuXG4gICAqL1xuICByZXNvdXJjZUNvbmZpZ0ZvcihyZXNvdXJjZSkge1xuICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSByZXNvdXJjZT8uY29uc3RydWN0b3JcblxuICAgIGlmICh0eXBlb2YgbW9kZWxDbGFzcz8uZ2V0TW9kZWxOYW1lICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU3luYyByZXNvdXJjZXMgbXVzdCBiZSBtb2RlbCByZWNvcmRzIHdpdGggYSBzdGF0aWMgZ2V0TW9kZWxOYW1lKCksIGdvdDogJHtTdHJpbmcocmVzb3VyY2UpfWApXG4gICAgfVxuXG4gICAgY29uc3QgcmVzb3VyY2VUeXBlID0gbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKVxuICAgIGNvbnN0IHJlc291cmNlQ29uZmlnID0gdGhpcy5jb25maWcucmVzb3VyY2VzW3Jlc291cmNlVHlwZV1cblxuICAgIGlmICghcmVzb3VyY2VDb25maWcpIHRocm93IG5ldyBFcnJvcihgTm8gc3luYyByZXNvdXJjZSBjb25maWd1cmVkIGZvcjogJHtyZXNvdXJjZVR5cGV9YClcblxuICAgIHJldHVybiByZXNvdXJjZUNvbmZpZ1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBzeW5jIHR5cGUgZm9yIGEgbXV0YXRpb24gdGhyb3VnaCB0aGUgcmVzb3VyY2UgY29uZmlnLiBUaGVcbiAgICogXCJ1cHNlcnRcIiBmbGFnIHF1ZXVlcyBjcmVhdGVzIGFuZCB1cGRhdGVzIGFzIFwidXBkYXRlXCIgcm93cyAodGhlIHNlcnZlclxuICAgKiB1cHNlcnRzIGJ5IHJlc291cmNlIGlkKSBhbmQgZGVzdHJveXMgYXMgXCJkZWxldGVcIiByb3dzLlxuICAgKiBAcGFyYW0ge3tvcGVyYXRpb246IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIsIHJlY29yZDogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIHJlc291cmNlQ29uZmlnOiBpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRSZXNvdXJjZUNvbmZpZ319IGFyZ3MgLSBNdXRhdGlvbiBhcmdzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBTeW5jIHR5cGUuXG4gICAqL1xuICBkZWZhdWx0U3luY1R5cGUoe29wZXJhdGlvbiwgcmVjb3JkLCByZXNvdXJjZUNvbmZpZ30pIHtcbiAgICBpZiAodHlwZW9mIHJlc291cmNlQ29uZmlnLnN5bmNUeXBlID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiByZXNvdXJjZUNvbmZpZy5zeW5jVHlwZSh7b3BlcmF0aW9uLCByZWNvcmR9KVxuICAgIGlmIChvcGVyYXRpb24gPT09IFwiZGVzdHJveVwiKSByZXR1cm4gXCJkZWxldGVcIlxuICAgIGlmIChyZXNvdXJjZUNvbmZpZy5zeW5jVHlwZSA9PT0gXCJ1cHNlcnRcIikgcmV0dXJuIFwidXBkYXRlXCJcblxuICAgIHJldHVybiBvcGVyYXRpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXJpdmVzIHRoZSBwdWxsLWFwcGx5IHJlc291cmNlIGNvbmZpZ3MgZnJvbSB0aGUgZGVjbGFyZWQgcmVzb3VyY2VzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL29wZXJhdGlvbi5qc1wiKS5kZWZhdWx0IHwgbnVsbH0gW29wZXJhdGlvbl0gLSBUZW5hbnQgb3BlcmF0aW9uIGJpbmRpbmcgdGhlIHJlc291cmNlIG1vZGVsIGNsYXNzZXMuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jUmVzb3VyY2VDb25maWc+fSBQdWxsLWFwcGx5IHJlc291cmNlIGNvbmZpZ3MuXG4gICAqL1xuICBwdWxsUmVzb3VyY2VDb25maWdzKG9wZXJhdGlvbikge1xuICAgIGlmICghb3BlcmF0aW9uICYmIHRoaXMuX3B1bGxSZXNvdXJjZUNvbmZpZ3MpIHJldHVybiB0aGlzLl9wdWxsUmVzb3VyY2VDb25maWdzXG5cbiAgICBjb25zdCByZXNvdXJjZUNvbmZpZ3MgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNSZXNvdXJjZUNvbmZpZz59ICovIChPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLmNvbmZpZy5yZXNvdXJjZXMpXG4gICAgICAgIC5maWx0ZXIoKFssIHJlc291cmNlXSkgPT4gQm9vbGVhbihyZXNvdXJjZS5hdHRyaWJ1dGVzKSlcbiAgICAgICAgLm1hcCgoW3Jlc291cmNlVHlwZSwgcmVzb3VyY2VdKSA9PiB7XG4gICAgICAgICAgY29uc3QgbW9kZWxDbGFzcyA9IG9wZXJhdGlvbiA/IG9wZXJhdGlvbi5tb2RlbENsYXNzKHJlc291cmNlLm1vZGVsQ2xhc3MpIDogcmVzb3VyY2UubW9kZWxDbGFzc1xuICAgICAgICAgIGNvbnN0IGZpbmRSZWNvcmQgPSByZXNvdXJjZS5maW5kUmVjb3JkXG4gICAgICAgICAgY29uc3QgZmluZFJlY29yZEZvckRlbGV0ZSA9IHJlc291cmNlLmZpbmRSZWNvcmRGb3JEZWxldGVcblxuICAgICAgICAgIHJldHVybiBbcmVzb3VyY2VUeXBlLCB7XG4gICAgICAgICAgICBhZnRlckFwcGx5OiByZXNvdXJjZS5hZnRlckFwcGx5LFxuICAgICAgICAgICAgYXR0cmlidXRlczogLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jUmVzb3VyY2VDb25maWdbXCJhdHRyaWJ1dGVzXCJdfSAqLyAocmVzb3VyY2UuYXR0cmlidXRlcyksXG4gICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgZmluZFJlY29yZDogb3BlcmF0aW9uICYmIGZpbmRSZWNvcmRcbiAgICAgICAgICAgICAgPyAoYXJncykgPT4gZmluZFJlY29yZCh7Li4uYXJncywgbW9kZWxDbGFzcywgb3BlcmF0aW9uOiBvcGVyYXRpb24gfHwgbnVsbH0pXG4gICAgICAgICAgICAgIDogZmluZFJlY29yZCxcbiAgICAgICAgICAgIGZpbmRSZWNvcmRGb3JEZWxldGU6IG9wZXJhdGlvbiAmJiBmaW5kUmVjb3JkRm9yRGVsZXRlXG4gICAgICAgICAgICAgID8gKGFyZ3MpID0+IGZpbmRSZWNvcmRGb3JEZWxldGUoey4uLmFyZ3MsIG1vZGVsQ2xhc3MsIG9wZXJhdGlvbjogb3BlcmF0aW9uIHx8IG51bGx9KVxuICAgICAgICAgICAgICA6IGZpbmRSZWNvcmRGb3JEZWxldGUsXG4gICAgICAgICAgICBtb2RlbENsYXNzXG4gICAgICAgICAgfV1cbiAgICAgICAgfSlcbiAgICApKVxuXG4gICAgaWYgKCFvcGVyYXRpb24pIHRoaXMuX3B1bGxSZXNvdXJjZUNvbmZpZ3MgPSByZXNvdXJjZUNvbmZpZ3NcblxuICAgIHJldHVybiByZXNvdXJjZUNvbmZpZ3NcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGxvY2FsIHN0YXRlIHdvcmsgb24gdGhpcyBjbGllbnQncyBjYXB0dXJlZCB0ZW5hbnQsIG9yIGRpcmVjdGx5IGZvciB0aGUgbGVnYWN5IGRlZmF1bHQtZGF0YWJhc2UgY2xpZW50LlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0geyhvcGVyYXRpb246IGltcG9ydChcIi4uL2RhdGFiYXNlL29wZXJhdGlvbi5qc1wiKS5kZWZhdWx0IHwgbnVsbCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBCb3VuZCB3b3JrLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gQ2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgd2l0aFRlbmFudE9wZXJhdGlvbihjYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5jb25maWcudGVuYW50SGFuZGxlIHx8ICF0aGlzLmNvbmZpZy5kYXRhYmFzZUlkZW50aWZpZXIpIHJldHVybiBhd2FpdCBjYWxsYmFjayhudWxsKVxuICAgIHRoaXMuYXNzZXJ0VGVuYW50UmVhZHkoKVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY29uZmlnLnRlbmFudEhhbmRsZS5kYXRhYmFzZU9wZXJhdGlvbih7XG4gICAgICBkYXRhYmFzZUlkZW50aWZpZXI6IHRoaXMuY29uZmlnLmRhdGFiYXNlSWRlbnRpZmllcixcbiAgICAgIG5hbWU6IFwiVGVuYW50IFN5bmNDbGllbnRcIlxuICAgIH0sIGFzeW5jIChvcGVyYXRpb24pID0+IHtcbiAgICAgIGF3YWl0IG9wZXJhdGlvbi5lbnN1cmVNb2RlbEluaXRpYWxpemVkKHRoaXMuY29uZmlnLnN5bmNNb2RlbClcblxuICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKG9wZXJhdGlvbilcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgd2hldGhlciBhIHJlY29yZCBiZWxvbmdzIHRvIHRoaXMgY2xpZW50J3MgcGh5c2ljYWwgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHJlY29yZCAtIENhbmRpZGF0ZSByZWNvcmQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoaXMgY2xpZW50IG93bnMgaXQuXG4gICAqL1xuICBvd25zUmVjb3JkKHJlY29yZCkge1xuICAgIGlmICghdGhpcy5fZGF0YWJhc2VJZGVudGl0eSkgcmV0dXJuIHRydWVcblxuICAgIGNvbnN0IGRhdGFiYXNlT3BlcmF0aW9uID0gcmVjb3JkLmRhdGFiYXNlT3BlcmF0aW9uKClcblxuICAgIHJldHVybiByZWNvcmQuZGF0YWJhc2VJZGVudGl0eSgpID09PSB0aGlzLl9kYXRhYmFzZUlkZW50aXR5ICYmXG4gICAgICBkYXRhYmFzZU9wZXJhdGlvbj8uc2NoZW1hR2VuZXJhdGlvbigpID09PSB0aGlzLl90ZW5hbnRTY2hlbWFHZW5lcmF0aW9uXG4gIH1cblxuICAvKipcbiAgICogUmVqZWN0cyBhIHJlY29yZCBub3Qgb3duZWQgYnkgdGhpcyBjbGllbnQncyBwaHlzaWNhbCBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gcmVjb3JkIC0gQ2FuZGlkYXRlIHJlY29yZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhc3NlcnRSZWNvcmRPd25lcnNoaXAocmVjb3JkKSB7XG4gICAgaWYgKCF0aGlzLm93bnNSZWNvcmQocmVjb3JkKSkgdGhyb3cgbmV3IEVycm9yKFwiU3luY0NsaWVudCByZXNvdXJjZSBiZWxvbmdzIHRvIGFub3RoZXIgb3IgdW5yZXNvbHZlZCBwaHlzaWNhbCB0ZW5hbnQgZGF0YWJhc2VcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYSBkZWNsYXJlZCBxdWVyeSBhZ2FpbnN0IHRoaXMgY2xpZW50J3MgY2FwdHVyZWQgdGVuYW50IGRhdGFiYXNlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHQ8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBxdWVyeSAtIFNjb3BlIHF1ZXJ5LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFzc2VydFF1ZXJ5T3duZXJzaGlwKHF1ZXJ5KSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy50ZW5hbnRIYW5kbGUgfHwgIXRoaXMuY29uZmlnLmRhdGFiYXNlSWRlbnRpZmllcikgcmV0dXJuXG5cbiAgICBjb25zdCBtb2RlbENsYXNzID0gcXVlcnkuZ2V0TW9kZWxDbGFzcygpXG4gICAgY29uc3QgZGF0YWJhc2VJZGVudGlmaWVyID0gbW9kZWxDbGFzcy5nZXREYXRhYmFzZUlkZW50aWZpZXIoe3RlbmFudDogdGhpcy5jb25maWcudGVuYW50SGFuZGxlLnRlbmFudCgpfSlcbiAgICBjb25zdCBxdWVyeURhdGFiYXNlSWRlbnRpdHkgPSBxdWVyeS5fb3BlcmF0aW9uPy5kYXRhYmFzZUlkZW50aXR5KClcblxuICAgIGlmIChkYXRhYmFzZUlkZW50aWZpZXIgIT09IHRoaXMuY29uZmlnLmRhdGFiYXNlSWRlbnRpZmllciB8fFxuICAgICAgIXRoaXMuY29uZmlnLnJlc291cmNlc1ttb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpXSB8fFxuICAgICAgcXVlcnlEYXRhYmFzZUlkZW50aXR5ICE9PSB0aGlzLl9kYXRhYmFzZUlkZW50aXR5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jQ2xpZW50IHNjb3BlIGJlbG9uZ3MgdG8gYW5vdGhlciBvciB1bnJlc29sdmVkIHBoeXNpY2FsIHRlbmFudCBkYXRhYmFzZVwiKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWplY3RzIHdvcmsgYWZ0ZXIgdGhlIGhhbmRsZSdzIHJlYWR5IHBoeXNpY2FsIHNjaGVtYSBnZW5lcmF0aW9uIGNoYW5nZWQgb3IgY2xvc2VkLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFzc2VydFRlbmFudFJlYWR5KCkge1xuICAgIGlmICghdGhpcy5jb25maWcudGVuYW50SGFuZGxlIHx8ICF0aGlzLmNvbmZpZy5kYXRhYmFzZUlkZW50aWZpZXIpIHJldHVyblxuXG4gICAgY29uc3QgbGlmZWN5Y2xlID0gdGhpcy5jb25maWcudGVuYW50SGFuZGxlLmluc3BlY3Qoe2RhdGFiYXNlSWRlbnRpZmllcjogdGhpcy5jb25maWcuZGF0YWJhc2VJZGVudGlmaWVyfSlcblxuICAgIGlmICghbGlmZWN5Y2xlLnJlYWR5IHx8ICFsaWZlY3ljbGUuc2NoZW1hR2VuZXJhdGlvbiB8fCBsaWZlY3ljbGUuc2NoZW1hR2VuZXJhdGlvbiAhPT0gdGhpcy5fdGVuYW50U2NoZW1hR2VuZXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY0NsaWVudCB0ZW5hbnQgZGF0YWJhc2UgZ2VuZXJhdGlvbiBpcyBzdGFsZSBvciBub3QgcmVhZHlcIilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQmluZHMgYSBjdXN0b20gcmVtb3RlIHJlc29sdmVyIHJlc3VsdCB0byB0aGUgYWN0aXZlIHRlbmFudCBvcGVyYXRpb24gYWZ0ZXIgcHJvdmluZyBpdHMgY2FwdHVyZWQgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7e29wZXJhdGlvbjogaW1wb3J0KFwiLi4vZGF0YWJhc2Uvb3BlcmF0aW9uLmpzXCIpLmRlZmF1bHQsIHJlY29yZDogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59fSBhcmdzIC0gQmluZGluZyBhcmdzLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGJpbmRSZW1vdGVSZWNvcmQoe29wZXJhdGlvbiwgcmVjb3JkfSkge1xuICAgIGlmIChyZWNvcmQuZGF0YWJhc2VPcGVyYXRpb24/LigpID09PSBvcGVyYXRpb24pIHJldHVyblxuICAgIHRoaXMuYXNzZXJ0UmVjb3JkT3duZXJzaGlwKHJlY29yZClcbiAgICBvcGVyYXRpb24uYmluZFJlY29yZChyZWNvcmQpXG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgb25lIHJlc291cmNlIGNvbmZpZyBmcm9tIGEgbW9kZWwncyBgc3RhdGljIHN5bmNgIGRlY2xhcmF0aW9uIHBsdXMgaXRzXG4gKiBkZXJpdmVkIGNvbHVtbiBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7e2RlY2xhcmF0aW9uOiBpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLk1vZGVsU3luY0RlY2xhcmF0aW9uLCBtZXRhZGF0YU1vZGVsQ2xhc3M6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBtb2RlbENsYXNzOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgcmVzb3VyY2VUeXBlOiBzdHJpbmd9fSBhcmdzIC0gRGVjbGFyYXRpb24gYXJncy5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRSZXNvdXJjZUNvbmZpZ30gRGVyaXZlZCByZXNvdXJjZSBjb25maWcuXG4gKi9cbmZ1bmN0aW9uIHJlc291cmNlQ29uZmlnRnJvbVN5bmNEZWNsYXJhdGlvbih7ZGVjbGFyYXRpb24sIG1ldGFkYXRhTW9kZWxDbGFzcywgbW9kZWxDbGFzcywgcmVzb3VyY2VUeXBlfSkge1xuICBjb25zdCBub3JtYWxpemVkRGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbiA9PT0gdHJ1ZSA/IHt9IDogZGVjbGFyYXRpb25cblxuICBpZiAoIW5vcm1hbGl6ZWREZWNsYXJhdGlvbiB8fCB0eXBlb2Ygbm9ybWFsaXplZERlY2xhcmF0aW9uICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkobm9ybWFsaXplZERlY2xhcmF0aW9uKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtyZXNvdXJjZVR5cGV9IHN0YXRpYyBzeW5jIG11c3QgYmUgdHJ1ZSBvciBhIHN5bmMgZGVjbGFyYXRpb24gb2JqZWN0LCBnb3Q6ICR7U3RyaW5nKGRlY2xhcmF0aW9uKX1gKVxuICB9XG5cbiAgY29uc3Qge2FmdGVyQXBwbHksIGF0dHJpYnV0ZXMsIGJvb2xlYW5BdHRyaWJ1dGVzLCBjb25mbGljdFRyYWNraW5nLCBmaW5kUmVjb3JkLCBmaW5kUmVjb3JkRm9yRGVsZXRlLCBsb2NhbE9ubHlBdHRyaWJ1dGVzLCBwdWJsaXNoLCByZWFsdGltZSwgc3luY1R5cGUsIHRyYWNrLCB0cmFja2VkRGF0YSwgLi4ucmVzdERlY2xhcmF0aW9ufSA9IG5vcm1hbGl6ZWREZWNsYXJhdGlvblxuICBjb25zdCB1bmtub3duS2V5cyA9IE9iamVjdC5rZXlzKHJlc3REZWNsYXJhdGlvbilcblxuICAvLyBgcHVibGlzaGAgaXMgdGhlIHNlcnZlci1zaWRlIGhhbGYgb2YgdGhlIHNoYXJlZCBgc3RhdGljIHN5bmNgIGRlY2xhcmF0aW9uXG4gIC8vIChjb25zdW1lZCBieSBTeW5jUHVibGlzaGVyIG9uIHRoZSBiYWNrZW5kKSAtIHRoZSBjbGllbnQgZGVyaXZlcyBub3RoaW5nXG4gIC8vIGZyb20gaXQsIGJ1dCBtb2RlbHMgZGVjbGFyZWQgb25jZSBmb3IgYm90aCBzaWRlcyBtdXN0IHN0YXkgdmFsaWQgaGVyZS5cbiAgdm9pZCBwdWJsaXNoXG5cbiAgaWYgKHVua25vd25LZXlzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cmVzb3VyY2VUeXBlfSBzdGF0aWMgc3luYyByZWNlaXZlZCB1bmtub3duIGtleXM6ICR7dW5rbm93bktleXMuam9pbihcIiwgXCIpfSAoc3VwcG9ydGVkOiBhZnRlckFwcGx5LCBhdHRyaWJ1dGVzLCBib29sZWFuQXR0cmlidXRlcywgY29uZmxpY3RUcmFja2luZywgZmluZFJlY29yZCwgZmluZFJlY29yZEZvckRlbGV0ZSwgbG9jYWxPbmx5QXR0cmlidXRlcywgcHVibGlzaCwgcmVhbHRpbWUsIHN5bmNUeXBlLCB0cmFjaywgdHJhY2tlZERhdGEpYClcbiAgfVxuICBpZiAoc3luY1R5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygc3luY1R5cGUgIT09IFwiZnVuY3Rpb25cIiAmJiBzeW5jVHlwZSAhPT0gXCJ1cHNlcnRcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtyZXNvdXJjZVR5cGV9IHN0YXRpYyBzeW5jIHN5bmNUeXBlIG11c3QgYmUgYSBmdW5jdGlvbiBvciB0aGUgc3RyaW5nIFwidXBzZXJ0XCIsIGdvdDogJHtTdHJpbmcoc3luY1R5cGUpfWApXG4gIH1cblxuICBjb25zdCBkZXJpdmVkID0gZGVyaXZlZFN5bmNBdHRyaWJ1dGVzKHttb2RlbENsYXNzOiBtZXRhZGF0YU1vZGVsQ2xhc3MsIHJlc291cmNlVHlwZX0pXG5cbiAgaWYgKGNvbmZsaWN0VHJhY2tpbmcpIHZhbGlkYXRlQ29uZmxpY3RUcmFja2luZyh7Y29uZmxpY3RUcmFja2luZywgZGVyaXZlZCwgcmVzb3VyY2VUeXBlfSlcblxuICByZXR1cm4ge1xuICAgIGFmdGVyQXBwbHksXG4gICAgYXR0cmlidXRlcyxcbiAgICBib29sZWFuQXR0cmlidXRlczogbWVyZ2VkQXR0cmlidXRlTmFtZXMoZGVyaXZlZC5ib29sZWFuQXR0cmlidXRlcywgYm9vbGVhbkF0dHJpYnV0ZXMpLFxuICAgIGNvbmZsaWN0VHJhY2tpbmc6IGNvbmZsaWN0VHJhY2tpbmcgPyB7Li4uY29uZmxpY3RUcmFja2luZywgdmVyc2lvbkF0dHJpYnV0ZTogY29uZmxpY3RUcmFja2luZy52ZXJzaW9uQXR0cmlidXRlIHx8IFwidXBkYXRlZEF0XCJ9IDogdW5kZWZpbmVkLFxuICAgIGZpbmRSZWNvcmQsXG4gICAgZmluZFJlY29yZEZvckRlbGV0ZSxcbiAgICBsb2NhbE9ubHlBdHRyaWJ1dGVzOiBtZXJnZWRBdHRyaWJ1dGVOYW1lcyhcbiAgICAgIGRlcml2ZWQubG9jYWxPbmx5QXR0cmlidXRlcyxcbiAgICAgIFsuLi4obG9jYWxPbmx5QXR0cmlidXRlcyB8fCBbXSksIC4uLihjb25mbGljdFRyYWNraW5nID8gW2NvbmZsaWN0VHJhY2tpbmcudmVyc2lvbkF0dHJpYnV0ZSB8fCBcInVwZGF0ZWRBdFwiXSA6IFtdKV1cbiAgICApLFxuICAgIG1ldGFkYXRhTW9kZWxDbGFzcyxcbiAgICBtb2RlbENsYXNzLFxuICAgIHJlYWx0aW1lLFxuICAgIHN5bmNUeXBlLFxuICAgIHRyYWNrOiBub3JtYWxpemVkVHJhY2sodHJhY2spLFxuICAgIHRyYWNrZWREYXRhXG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgb25lIHJlc291cmNlJ3MgZHVyYWJsZSBjb25mbGljdC10cmFja2luZyBkZWNsYXJhdGlvbi5cbiAqIEBwYXJhbSB7e2NvbmZsaWN0VHJhY2tpbmc6IGltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudENvbmZsaWN0VHJhY2tpbmdDb25maWcsIGRlcml2ZWQ6IHtib29sZWFuQXR0cmlidXRlczogc3RyaW5nW10sIGxvY2FsT25seUF0dHJpYnV0ZXM6IHN0cmluZ1tdfSwgcmVzb3VyY2VUeXBlOiBzdHJpbmd9fSBhcmdzIC0gVmFsaWRhdGlvbiBhcmdzLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQ29uZmxpY3RUcmFja2luZyh7Y29uZmxpY3RUcmFja2luZywgZGVyaXZlZCwgcmVzb3VyY2VUeXBlfSkge1xuICBjb25zdCByZXF1aXJlZFN0cmluZ3MgPSB7XG4gICAgYWN0b3JEZXZpY2VJZDogY29uZmxpY3RUcmFja2luZy5hY3RvckRldmljZUlkLFxuICAgIGFjdG9yVXNlcklkOiBjb25mbGljdFRyYWNraW5nLmFjdG9yVXNlcklkLFxuICAgIG9mZmxpbmVHcmFudElkOiBjb25mbGljdFRyYWNraW5nLm9mZmxpbmVHcmFudElkLFxuICAgIHBvbGljeUhhc2g6IGNvbmZsaWN0VHJhY2tpbmcucG9saWN5SGFzaFxuICB9XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVxdWlyZWRTdHJpbmdzKSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgfHwgdmFsdWUubGVuZ3RoID09PSAwKSB0aHJvdyBuZXcgRXJyb3IoYCR7cmVzb3VyY2VUeXBlfSBjb25mbGljdFRyYWNraW5nLiR7a2V5fSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZ2ApXG4gIH1cbiAgaWYgKCFjb25mbGljdFRyYWNraW5nLm11dGF0aW9uTG9nIHx8IHR5cGVvZiBjb25mbGljdFRyYWNraW5nLm11dGF0aW9uTG9nLmFwcGVuZCAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3IoYCR7cmVzb3VyY2VUeXBlfSBjb25mbGljdFRyYWNraW5nLm11dGF0aW9uTG9nIG11c3QgYmUgYSBMb2NhbE11dGF0aW9uTG9nYClcbiAgaWYgKHR5cGVvZiBjb25mbGljdFRyYWNraW5nLmNsaWVudE11dGF0aW9uSWQgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yKGAke3Jlc291cmNlVHlwZX0gY29uZmxpY3RUcmFja2luZy5jbGllbnRNdXRhdGlvbklkIG11c3QgYmUgYSBmdW5jdGlvbmApXG4gIGlmICghY29uZmxpY3RUcmFja2luZy52ZXJzaW9uQXR0cmlidXRlICYmICFkZXJpdmVkLmxvY2FsT25seUF0dHJpYnV0ZXMuaW5jbHVkZXMoXCJ1cGRhdGVkQXRcIikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cmVzb3VyY2VUeXBlfSBjb25mbGljdFRyYWNraW5nIHJlcXVpcmVzIHZlcnNpb25BdHRyaWJ1dGUgYmVjYXVzZSB0aGUgbW9kZWwgaGFzIG5vIHVwZGF0ZWRBdCBjb2x1bW5gKVxuICB9XG59XG5cbi8qKlxuICogRGVyaXZlcyBib29sZWFuIGFuZCBsb2NhbC1vbmx5IGF0dHJpYnV0ZSBuYW1lcyBmcm9tIGEgbW9kZWwncyBjb2x1bW4gbWV0YWRhdGE6XG4gKiBib29sZWFucyBmcm9tIGJvb2xlYW4gY29sdW1uIHR5cGVzOyBsb2NhbC1vbmx5IGZyb20gdGhlIHByaW1hcnkga2V5LFxuICogY3JlYXRlZEF0L3VwZGF0ZWRBdCwgYW5kIHN5bmMgYm9va2tlZXBpbmcgY29sdW1ucy5cbiAqIEBwYXJhbSB7e21vZGVsQ2xhc3M6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCByZXNvdXJjZVR5cGU6IHN0cmluZ319IGFyZ3MgLSBEZXJpdmF0aW9uIGFyZ3MuXG4gKiBAcmV0dXJucyB7e2Jvb2xlYW5BdHRyaWJ1dGVzOiBzdHJpbmdbXSwgbG9jYWxPbmx5QXR0cmlidXRlczogc3RyaW5nW119fSBEZXJpdmVkIGF0dHJpYnV0ZSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gZGVyaXZlZFN5bmNBdHRyaWJ1dGVzKHttb2RlbENsYXNzLCByZXNvdXJjZVR5cGV9KSB7XG4gIGlmIChcbiAgICB0eXBlb2YgbW9kZWxDbGFzcy5nZXRDb2x1bW5OYW1lcyAhPT0gXCJmdW5jdGlvblwiIHx8XG4gICAgdHlwZW9mIG1vZGVsQ2xhc3MuZ2V0Q29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZU1hcCAhPT0gXCJmdW5jdGlvblwiIHx8XG4gICAgdHlwZW9mIG1vZGVsQ2xhc3MuZ2V0Q29sdW1uVHlwZUJ5TmFtZSAhPT0gXCJmdW5jdGlvblwiIHx8XG4gICAgdHlwZW9mIG1vZGVsQ2xhc3MucHJpbWFyeUtleSAhPT0gXCJmdW5jdGlvblwiIHx8XG4gICAgdHlwZW9mIG1vZGVsQ2xhc3MuaGFzUHJpbWFyeUtleSAhPT0gXCJmdW5jdGlvblwiXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtyZXNvdXJjZVR5cGV9IHN0YXRpYyBzeW5jIHJlcXVpcmVzIGEgVmVsb2Npb3VzIG1vZGVsIGNsYXNzIHdpdGggY29sdW1uIG1ldGFkYXRhIChnZXRDb2x1bW5OYW1lcywgZ2V0Q29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZU1hcCwgZ2V0Q29sdW1uVHlwZUJ5TmFtZSwgcHJpbWFyeUtleSwgaGFzUHJpbWFyeUtleSlgKVxuICB9XG5cbiAgY29uc3QgY29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZSA9IG1vZGVsQ2xhc3MuZ2V0Q29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZU1hcCgpXG4gIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gIGNvbnN0IGJvb2xlYW5BdHRyaWJ1dGVzID0gW11cbiAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgY29uc3QgbG9jYWxPbmx5QXR0cmlidXRlcyA9IFtdXG5cbiAgaWYgKG1vZGVsQ2xhc3MuaGFzUHJpbWFyeUtleSgpKSB7XG4gICAgY29uc3QgcHJpbWFyeUtleUNvbHVtbiA9IHNjYWxhck1vZGVsUHJpbWFyeUtleShtb2RlbENsYXNzLnByaW1hcnlLZXkoKSwgYERlcml2ZWQgc3luYyBhdHRyaWJ1dGVzIGZvciAke3Jlc291cmNlVHlwZX1gKVxuXG4gICAgbG9jYWxPbmx5QXR0cmlidXRlcy5wdXNoKGNvbHVtbk5hbWVUb0F0dHJpYnV0ZU5hbWVbcHJpbWFyeUtleUNvbHVtbl0gfHwgcHJpbWFyeUtleUNvbHVtbilcbiAgfVxuXG4gIGZvciAoY29uc3QgY29sdW1uTmFtZSBvZiBtb2RlbENsYXNzLmdldENvbHVtbk5hbWVzKCkpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gY29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZVtjb2x1bW5OYW1lXSB8fCBjb2x1bW5OYW1lXG4gICAgY29uc3QgY29sdW1uVHlwZSA9IG1vZGVsQ2xhc3MuZ2V0Q29sdW1uVHlwZUJ5TmFtZShjb2x1bW5OYW1lKVxuXG4gICAgaWYgKExPQ0FMX0JPT0tLRUVQSU5HX0FUVFJJQlVURV9OQU1FUy5pbmNsdWRlcyhhdHRyaWJ1dGVOYW1lKSAmJiAhbG9jYWxPbmx5QXR0cmlidXRlcy5pbmNsdWRlcyhhdHRyaWJ1dGVOYW1lKSkge1xuICAgICAgbG9jYWxPbmx5QXR0cmlidXRlcy5wdXNoKGF0dHJpYnV0ZU5hbWUpXG4gICAgfVxuICAgIGlmIChjb2x1bW5UeXBlICYmIGlzQm9vbGVhbkNvbHVtblR5cGUoY29sdW1uVHlwZSkpIHtcbiAgICAgIGJvb2xlYW5BdHRyaWJ1dGVzLnB1c2goYXR0cmlidXRlTmFtZSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge2Jvb2xlYW5BdHRyaWJ1dGVzLCBsb2NhbE9ubHlBdHRyaWJ1dGVzfVxufVxuXG4vKipcbiAqIE1lcmdlcyBkZXJpdmVkIGF0dHJpYnV0ZSBuYW1lcyB3aXRoIGRlY2xhcmVkIGV4dHJhcyBpbnRvIGEgc29ydGVkLCBkdXBsaWNhdGUtZnJlZSBsaXN0LlxuICogQHBhcmFtIHtzdHJpbmdbXX0gZGVyaXZlZCAtIERlcml2ZWQgYXR0cmlidXRlIG5hbWVzLlxuICogQHBhcmFtIHtzdHJpbmdbXSB8IHVuZGVmaW5lZH0gZGVjbGFyZWQgLSBEZWNsYXJlZCBleHRyYSBhdHRyaWJ1dGUgbmFtZXMuXG4gKiBAcmV0dXJucyB7c3RyaW5nW119IE1lcmdlZCBhdHRyaWJ1dGUgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlZEF0dHJpYnV0ZU5hbWVzKGRlcml2ZWQsIGRlY2xhcmVkKSB7XG4gIHJldHVybiBbLi4ubmV3IFNldChbLi4uZGVyaXZlZCwgLi4uKGRlY2xhcmVkIHx8IFtdKV0pXS5zb3J0KClcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgZGVjbGFyYXRpb24ncyB0cmFjayB2YWx1ZTogYW4gb3BlcmF0aW9ucyBhcnJheSBpcyBzaG9ydGhhbmQgZm9yXG4gKiB0aGUge29wZXJhdGlvbnN9IGZvcm0uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuTW9kZWxTeW5jRGVjbGFyYXRpb25Db25maWdbXCJ0cmFja1wiXX0gdHJhY2sgLSBEZWNsYXJlZCB0cmFjayB2YWx1ZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRSZXNvdXJjZUNvbmZpZ1tcInRyYWNrXCJdfSBOb3JtYWxpemVkIHRyYWNrIHZhbHVlLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVkVHJhY2sodHJhY2spIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodHJhY2spKSByZXR1cm4ge29wZXJhdGlvbnM6IHRyYWNrfVxuXG4gIHJldHVybiB0cmFja1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGZyYW1ld29yay1vd25lZCBzeW5jIGVuZHBvaW50IFBPU1RlciBvdmVyIHRoZSBjb25maWd1cmVkIHRyYW5zcG9ydC5cbiAqIEBwYXJhbSB7e3BhdGg6IHN0cmluZywgcmVxdWVzdENvbnRleHQ6IGltcG9ydChcIi4uL3JlbW90ZS1yZXF1ZXN0LWNvbnRleHQuanNcIikuUmVtb3RlUmVxdWVzdENvbnRleHQsIHRyYW5zcG9ydDogaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5WZWxvY2lvdXNTeW5jQ2xpZW50VHJhbnNwb3J0fX0gYXJncyAtIFBvc3RlciBhcmdzLlxuICogQHJldHVybnMgeyhwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4pID0+IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBTeW5jIGVuZHBvaW50IFBPU1Rlci5cbiAqL1xuZnVuY3Rpb24gdHJhbnNwb3J0UG9zdGVyKHtwYXRoLCByZXF1ZXN0Q29udGV4dCwgdHJhbnNwb3J0fSkge1xuICByZXR1cm4gYXN5bmMgKHBheWxvYWQpID0+IHtcbiAgICBjb25zdCByZXF1ZXN0UGF5bG9hZCA9IG1lcmdlUmVtb3RlUmVxdWVzdENvbnRleHQoe1xuICAgICAgY29udGV4dDogcmVxdWVzdENvbnRleHQsXG4gICAgICBsYWJlbDogXCJTeW5jIGNsaWVudCByZXF1ZXN0IGNvbnRleHRcIixcbiAgICAgIHBhcmFtczogcGF5bG9hZFxuICAgIH0pXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0cmFuc3BvcnQucG9zdChwYXRoLCByZXF1ZXN0UGF5bG9hZClcblxuICAgIGlmICghcmVzcG9uc2UgfHwgdHlwZW9mIHJlc3BvbnNlLmpzb24gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBzeW5jLmNsaWVudCB0cmFuc3BvcnQucG9zdCBtdXN0IHJlc29sdmUgdG8gYSByZXNwb25zZSB3aXRoIGEganNvbigpIG1ldGhvZCBmb3IgJHtwYXRofSAobGlrZSB0aGUgZnJvbnRlbmQtbW9kZWwgd2Vic29ja2V0IGNsaWVudClgKVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgfVxufVxuXG4vKipcbiAqIExhemlseSBidWlsZHMgKGFuZCBtZW1vaXplcyBwZXIgY29uZmlndXJhdGlvbikgdGhlIHN5bmMgY2xpZW50IGRlcml2ZWQgZnJvbSB0aGVcbiAqIGFwcCdzIFZlbG9jaW91cyBjb25maWd1cmF0aW9uIGFuZCByZWdpc3RlcnMgaXQgYXMgdGhlIGN1cnJlbnQgc3luYyBjbGllbnQuXG4gKiBAcGFyYW0ge0NvbmZpZ3VyYXRpb259IFtjb25maWd1cmF0aW9uXSAtIENvbmZpZ3VyYXRpb24gb3duaW5nIHRoZSByZWdpc3RlcmVkIG1vZGVscyBhbmQgdGhlIHN5bmMuY2xpZW50IGJsb2NrLiBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLlxuICogQHJldHVybnMge1N5bmNDbGllbnR9IE1lbW9pemVkIHN5bmMgY2xpZW50IGZvciB0aGUgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN5bmNDbGllbnQoY29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRpb24uY3VycmVudCgpKSB7XG4gIGxldCBjbGllbnQgPSBzeW5jQ2xpZW50c0J5Q29uZmlndXJhdGlvbi5nZXQoY29uZmlndXJhdGlvbilcblxuICBpZiAoIWNsaWVudCkge1xuICAgIGNsaWVudCA9IFN5bmNDbGllbnQuZnJvbUNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbilcbiAgICBzeW5jQ2xpZW50c0J5Q29uZmlndXJhdGlvbi5zZXQoY29uZmlndXJhdGlvbiwgY2xpZW50KVxuICAgIGNsaWVudC5zZXRDdXJyZW50KClcbiAgfVxuXG4gIHJldHVybiBjbGllbnRcbn1cblxuLyoqXG4gKiBEZWNsYXJlcyBhIHN5bmMgc2NvcGUgb24gdGhlIGN1cnJlbnQgc3luYyBjbGllbnQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHQ8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBxdWVyeSAtIFF1ZXJ5IGRlY2xhcmluZyB0aGUgc3luYyBzY29wZS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHtzY29wZTogaW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TZXJpYWxpemVkU3luY1Njb3BlLCBwdWxsZWQ6IGltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDaGFuZ2VzUmVzdWx0IHwgbnVsbH0+fSBEZWNsYXJlZCBzY29wZSBhbmQgcHVsbCByZXN1bHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzeW5jKHF1ZXJ5KSB7XG4gIHJldHVybiBhd2FpdCBTeW5jQ2xpZW50LmN1cnJlbnQoKS5zeW5jKHF1ZXJ5KVxufVxuIl19
|