velocious 1.0.577 → 1.0.579
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 +12 -6
- package/build/application.js +3 -3
- package/build/authorization/ability.js +6 -6
- package/build/authorization/base-resource.js +1 -1
- package/build/background-jobs/client.js +2 -2
- package/build/background-jobs/forked-runner-child.js +4 -4
- package/build/background-jobs/job-runner.js +2 -2
- package/build/background-jobs/job.js +6 -6
- package/build/background-jobs/json-socket.js +1 -1
- package/build/background-jobs/main.js +13 -13
- package/build/background-jobs/normalize-error.js +2 -2
- package/build/background-jobs/pooled-runner-child.js +3 -3
- package/build/background-jobs/scheduler.js +1 -1
- package/build/background-jobs/status-reporter.js +2 -2
- package/build/background-jobs/store.js +23 -23
- package/build/background-jobs/types.js +6 -6
- package/build/background-jobs/web/controller.js +6 -6
- package/build/background-jobs/web/counts-channel.js +1 -1
- package/build/background-jobs/worker.js +8 -8
- package/build/beacon/client.js +3 -3
- package/build/beacon/in-process-client.js +3 -3
- package/build/beacon/types.js +1 -1
- package/build/cli/base-command.js +1 -1
- package/build/cli/commands/console.js +1 -1
- package/build/cli/commands/db/schema/dump.js +1 -1
- package/build/cli/commands/db/schema/load.js +1 -1
- package/build/cli/commands/db/seed.js +1 -1
- package/build/cli/commands/generate/frontend-models.js +1 -1
- package/build/cli/commands/lint/relationships.js +1 -1
- package/build/cli/commands/run-script.js +1 -1
- package/build/cli/commands/runner.js +1 -1
- package/build/cli/index.js +2 -2
- package/build/cli/tenant-database-command-helper.js +2 -2
- package/build/configuration-types.js +48 -47
- package/build/configuration.js +150 -65
- package/build/controller.js +11 -8
- package/build/current.js +2 -2
- package/build/database/annotations-async-hooks.js +3 -3
- package/build/database/annotations.js +1 -1
- package/build/database/drivers/base-column.js +1 -1
- package/build/database/drivers/base-foreign-key.js +1 -1
- package/build/database/drivers/base-table.js +1 -1
- package/build/database/drivers/base.js +18 -18
- package/build/database/drivers/mssql/column.js +1 -1
- package/build/database/drivers/mssql/index.js +2 -2
- package/build/database/drivers/mssql/options.js +1 -1
- package/build/database/drivers/mssql/structure-sql.js +1 -1
- package/build/database/drivers/mssql/table.js +1 -1
- package/build/database/drivers/mysql/column.js +1 -1
- package/build/database/drivers/mysql/index.js +4 -4
- package/build/database/drivers/mysql/options.js +1 -1
- package/build/database/drivers/mysql/query.js +7 -7
- package/build/database/drivers/mysql/structure-sql.js +71 -10
- package/build/database/drivers/pgsql/column.js +1 -1
- package/build/database/drivers/pgsql/index.js +6 -6
- package/build/database/drivers/pgsql/structure-sql.js +1 -1
- package/build/database/drivers/sqlite/base.js +7 -7
- package/build/database/drivers/sqlite/column.js +1 -1
- package/build/database/drivers/sqlite/connection-sql-js.js +1 -1
- package/build/database/drivers/sqlite/foreign-key.js +1 -1
- package/build/database/drivers/sqlite/index.js +1 -1
- package/build/database/drivers/sqlite/index.native.js +2 -2
- package/build/database/drivers/sqlite/index.web.js +2 -2
- package/build/database/drivers/sqlite/query.js +2 -2
- package/build/database/drivers/sqlite/query.native.js +2 -2
- package/build/database/drivers/sqlite/query.web.js +2 -2
- package/build/database/drivers/sqlite/table-rebuilder.js +1 -1
- package/build/database/migration/index.js +2 -2
- package/build/database/migrator/types.js +2 -2
- package/build/database/operation.js +59 -6
- package/build/database/pool/async-tracked-multi-connection.js +75 -24
- package/build/database/pool/base-methods-forward.js +2 -2
- package/build/database/pool/base.js +48 -17
- package/build/database/pool/single-multi-use.js +501 -103
- package/build/database/query/delete-base.js +1 -1
- package/build/database/query/index.js +3 -3
- package/build/database/query/insert-base.js +4 -4
- package/build/database/query/model-class-query.js +39 -39
- package/build/database/query/preloader/belongs-to.js +2 -2
- package/build/database/query/preloader/ensure-model-class-initialized.js +3 -2
- package/build/database/query/preloader/has-many.js +3 -3
- package/build/database/query/preloader/has-one.js +1 -1
- package/build/database/query/preloader.js +9 -2
- package/build/database/query/query-data.js +7 -7
- package/build/database/query/update-base.js +3 -3
- package/build/database/query/upsert-base.js +2 -2
- package/build/database/query/where-model-class-hash.js +13 -13
- package/build/database/query/with-count.js +12 -12
- package/build/database/query-parser/options.js +2 -2
- package/build/database/query-parser/select-parser.js +1 -1
- package/build/database/record/acts-as-list.js +2 -2
- package/build/database/record/attachments/handle.js +6 -6
- package/build/database/record/attachments/normalize-input.js +11 -11
- package/build/database/record/attachments/storage-drivers/filesystem.js +1 -1
- package/build/database/record/attachments/storage-drivers/native.js +5 -5
- package/build/database/record/attachments/storage-drivers/s3.js +10 -10
- package/build/database/record/attachments/store.js +24 -20
- package/build/database/record/auditing.js +123 -29
- package/build/database/record/counter-cache-magnitude.js +11 -11
- package/build/database/record/index.js +227 -174
- package/build/database/record/instance-relationships/base.js +4 -4
- package/build/database/record/instance-relationships/belongs-to.js +1 -1
- package/build/database/record/instance-relationships/has-many.js +3 -3
- package/build/database/record/instance-relationships/has-one.js +1 -1
- package/build/database/record/record-not-found-error.js +1 -0
- package/build/database/record/relationships/base.js +22 -0
- package/build/database/record/state-machine.js +6 -6
- package/build/database/record/validators/base.js +1 -1
- package/build/database/structure-sql-loader.js +3 -3
- package/build/database/table-data/table-column.js +3 -3
- package/build/database/use-live-query.js +3 -3
- package/build/environment-handlers/base.js +56 -37
- package/build/environment-handlers/browser.js +1 -1
- package/build/environment-handlers/node/cli/commands/console.js +4 -4
- package/build/environment-handlers/node/cli/commands/db/seed.js +2 -2
- package/build/environment-handlers/node/cli/commands/generate/base-models.js +1 -1
- package/build/environment-handlers/node/cli/commands/run-script.js +2 -2
- package/build/environment-handlers/node/cli/commands/runner.js +2 -2
- package/build/environment-handlers/node/cli/commands/server.js +1 -1
- package/build/environment-handlers/node.js +36 -36
- package/build/error-logger.js +2 -2
- package/build/error-reporting/request-details.js +32 -32
- package/build/frontend-model-controller.js +215 -213
- package/build/frontend-model-resource/base-resource.js +44 -44
- package/build/frontend-model-resource/velocious-attachment-resource.js +1 -1
- package/build/frontend-models/base.js +146 -142
- package/build/frontend-models/clear-pending-debounced-callback.js +2 -2
- package/build/frontend-models/model-registry.js +4 -4
- package/build/frontend-models/outgoing-event-buffer.js +1 -1
- package/build/frontend-models/preloader.js +1 -1
- package/build/frontend-models/query.js +60 -60
- package/build/frontend-models/resource-definition.js +9 -9
- package/build/frontend-models/transport-serialization.js +27 -27
- package/build/frontend-models/websocket-channel.js +4 -4
- package/build/frontend-models/websocket-publishers.js +1 -1
- package/build/http-client/request.js +1 -1
- package/build/http-client/response.js +1 -1
- package/build/http-server/client/index.js +4 -4
- package/build/http-server/client/params-to-object.js +16 -16
- package/build/http-server/client/request-buffer/index.js +5 -2
- package/build/http-server/client/request-parser.js +2 -2
- package/build/http-server/client/request-runner.js +2 -2
- package/build/http-server/client/request.js +2 -2
- package/build/http-server/client/websocket-request.js +6 -6
- package/build/http-server/client/websocket-session.js +28 -28
- package/build/http-server/cookie.js +2 -2
- package/build/http-server/development-reloader.js +1 -1
- package/build/http-server/index.js +5 -5
- package/build/http-server/remote-address.js +1 -1
- package/build/http-server/server-lock.js +4 -4
- package/build/http-server/websocket-channel-subscribers.js +4 -4
- package/build/http-server/websocket-channel.js +1 -1
- package/build/http-server/websocket-connection.js +3 -3
- package/build/http-server/websocket-event-log-store.js +9 -9
- package/build/http-server/websocket-events-host.js +7 -7
- package/build/http-server/websocket-events.js +4 -4
- package/build/http-server/worker-handler/channel-subscriber-dispatch.js +1 -1
- package/build/http-server/worker-handler/in-process.js +5 -5
- package/build/http-server/worker-handler/index.js +10 -10
- package/build/http-server/worker-handler/worker-thread.js +8 -8
- package/build/index.d.ts.map +1 -1
- package/build/logger/base-logger.js +1 -1
- package/build/logger.js +12 -12
- package/build/mailer/backends/smtp.js +3 -3
- package/build/mailer/base.js +14 -14
- package/build/mailer/delivery.js +3 -3
- package/build/mailer/index.js +1 -1
- package/build/mailer.js +1 -1
- package/build/plugins/sqljs-wasm-route-controller.js +1 -1
- package/build/record-payload-values.js +3 -3
- package/build/routes/base-route.js +5 -5
- package/build/routes/basic-route.js +4 -4
- package/build/routes/get-route.js +2 -2
- package/build/routes/hooks/frontend-model-command-route-hook.js +1 -1
- package/build/routes/index.js +3 -3
- package/build/routes/namespace-route.js +1 -1
- package/build/routes/plugin-routes.js +1 -1
- package/build/routes/post-route.js +2 -2
- package/build/routes/resolver.js +5 -5
- package/build/routes/resource-route.js +1 -1
- package/build/src/application.d.ts +26 -29
- package/build/src/application.d.ts.map +1 -1
- package/build/src/application.js +4 -4
- package/build/src/authorization/ability.d.ts +47 -53
- package/build/src/authorization/ability.d.ts.map +1 -1
- package/build/src/authorization/ability.js +7 -7
- package/build/src/authorization/base-resource.d.ts +13 -13
- package/build/src/authorization/base-resource.d.ts.map +1 -1
- package/build/src/authorization/base-resource.js +2 -2
- package/build/src/background-jobs/client.d.ts +9 -9
- package/build/src/background-jobs/client.d.ts.map +1 -1
- package/build/src/background-jobs/client.js +3 -3
- package/build/src/background-jobs/cron-expression.d.ts +25 -16
- package/build/src/background-jobs/cron-expression.d.ts.map +1 -1
- package/build/src/background-jobs/forked-runner-child.js +5 -5
- package/build/src/background-jobs/job-record.d.ts +4 -3
- package/build/src/background-jobs/job-record.d.ts.map +1 -1
- package/build/src/background-jobs/job-registry.d.ts +6 -6
- package/build/src/background-jobs/job-registry.d.ts.map +1 -1
- package/build/src/background-jobs/job-runner.d.ts +9 -9
- package/build/src/background-jobs/job-runner.d.ts.map +1 -1
- package/build/src/background-jobs/job-runner.js +3 -3
- package/build/src/background-jobs/job.d.ts +14 -14
- package/build/src/background-jobs/job.d.ts.map +1 -1
- package/build/src/background-jobs/job.js +7 -7
- package/build/src/background-jobs/json-socket.d.ts +9 -10
- package/build/src/background-jobs/json-socket.d.ts.map +1 -1
- package/build/src/background-jobs/json-socket.js +2 -2
- package/build/src/background-jobs/main.d.ts +56 -59
- package/build/src/background-jobs/main.d.ts.map +1 -1
- package/build/src/background-jobs/main.js +14 -14
- package/build/src/background-jobs/normalize-error.d.ts +2 -2
- package/build/src/background-jobs/normalize-error.d.ts.map +1 -1
- package/build/src/background-jobs/normalize-error.js +3 -3
- package/build/src/background-jobs/pooled-runner-child.js +4 -4
- package/build/src/background-jobs/runner-graceful-shutdown.d.ts +7 -12
- package/build/src/background-jobs/runner-graceful-shutdown.d.ts.map +1 -1
- package/build/src/background-jobs/runner-process-title.d.ts.map +1 -1
- package/build/src/background-jobs/scheduler.d.ts +41 -41
- package/build/src/background-jobs/scheduler.d.ts.map +1 -1
- package/build/src/background-jobs/scheduler.js +2 -2
- package/build/src/background-jobs/socket-request.d.ts +14 -14
- package/build/src/background-jobs/socket-request.d.ts.map +1 -1
- package/build/src/background-jobs/status-reporter.d.ts +28 -28
- package/build/src/background-jobs/status-reporter.d.ts.map +1 -1
- package/build/src/background-jobs/status-reporter.js +3 -3
- package/build/src/background-jobs/store.d.ts +100 -103
- package/build/src/background-jobs/store.d.ts.map +1 -1
- package/build/src/background-jobs/store.js +24 -24
- package/build/src/background-jobs/types.d.ts +124 -124
- package/build/src/background-jobs/types.d.ts.map +1 -1
- package/build/src/background-jobs/types.js +7 -7
- package/build/src/background-jobs/web/authorization.d.ts +2 -2
- package/build/src/background-jobs/web/authorization.d.ts.map +1 -1
- package/build/src/background-jobs/web/controller.d.ts +13 -13
- package/build/src/background-jobs/web/controller.d.ts.map +1 -1
- package/build/src/background-jobs/web/controller.js +7 -7
- package/build/src/background-jobs/web/counts-channel.d.ts +8 -8
- package/build/src/background-jobs/web/counts-channel.d.ts.map +1 -1
- package/build/src/background-jobs/web/counts-channel.js +2 -2
- package/build/src/background-jobs/web/index.d.ts +4 -4
- package/build/src/background-jobs/web/index.d.ts.map +1 -1
- package/build/src/background-jobs/web/path-matcher.d.ts +18 -13
- package/build/src/background-jobs/web/path-matcher.d.ts.map +1 -1
- package/build/src/background-jobs/web/registry.d.ts +21 -24
- package/build/src/background-jobs/web/registry.d.ts.map +1 -1
- package/build/src/background-jobs/worker.d.ts +74 -77
- package/build/src/background-jobs/worker.d.ts.map +1 -1
- package/build/src/background-jobs/worker.js +9 -9
- package/build/src/beacon/client.d.ts +30 -34
- package/build/src/beacon/client.d.ts.map +1 -1
- package/build/src/beacon/client.js +4 -4
- package/build/src/beacon/in-process-broker.d.ts +6 -9
- package/build/src/beacon/in-process-broker.d.ts.map +1 -1
- package/build/src/beacon/in-process-client.d.ts +17 -21
- package/build/src/beacon/in-process-client.d.ts.map +1 -1
- package/build/src/beacon/in-process-client.js +4 -4
- package/build/src/beacon/server.d.ts +15 -15
- package/build/src/beacon/server.d.ts.map +1 -1
- package/build/src/beacon/types.d.ts +21 -46
- package/build/src/beacon/types.d.ts.map +1 -1
- package/build/src/beacon/types.js +2 -2
- package/build/src/cli/base-command.d.ts +25 -28
- package/build/src/cli/base-command.d.ts.map +1 -1
- package/build/src/cli/base-command.js +2 -2
- package/build/src/cli/browser-cli.d.ts +1 -1
- package/build/src/cli/browser-cli.d.ts.map +1 -1
- package/build/src/cli/commands/background-jobs-main.d.ts +2 -1
- package/build/src/cli/commands/background-jobs-main.d.ts.map +1 -1
- package/build/src/cli/commands/background-jobs-runner.d.ts +2 -1
- package/build/src/cli/commands/background-jobs-runner.d.ts.map +1 -1
- package/build/src/cli/commands/background-jobs-worker.d.ts +2 -1
- package/build/src/cli/commands/background-jobs-worker.d.ts.map +1 -1
- package/build/src/cli/commands/beacon.d.ts +2 -1
- package/build/src/cli/commands/beacon.d.ts.map +1 -1
- package/build/src/cli/commands/console.d.ts +6 -1
- package/build/src/cli/commands/console.d.ts.map +1 -1
- package/build/src/cli/commands/console.js +2 -2
- package/build/src/cli/commands/db/base-command.d.ts +1 -1
- package/build/src/cli/commands/db/base-command.d.ts.map +1 -1
- package/build/src/cli/commands/db/create.d.ts +1 -1
- package/build/src/cli/commands/db/create.d.ts.map +1 -1
- package/build/src/cli/commands/db/drop.d.ts +1 -1
- package/build/src/cli/commands/db/drop.d.ts.map +1 -1
- package/build/src/cli/commands/db/migrate.d.ts +1 -1
- package/build/src/cli/commands/db/migrate.d.ts.map +1 -1
- package/build/src/cli/commands/db/reset.d.ts +1 -1
- package/build/src/cli/commands/db/reset.d.ts.map +1 -1
- package/build/src/cli/commands/db/rollback.d.ts +1 -1
- package/build/src/cli/commands/db/rollback.d.ts.map +1 -1
- package/build/src/cli/commands/db/schema/dump.d.ts +6 -1
- package/build/src/cli/commands/db/schema/dump.d.ts.map +1 -1
- package/build/src/cli/commands/db/schema/dump.js +2 -2
- package/build/src/cli/commands/db/schema/load.d.ts +6 -1
- package/build/src/cli/commands/db/schema/load.d.ts.map +1 -1
- package/build/src/cli/commands/db/schema/load.js +2 -2
- package/build/src/cli/commands/db/seed.d.ts +6 -1
- package/build/src/cli/commands/db/seed.d.ts.map +1 -1
- package/build/src/cli/commands/db/seed.js +2 -2
- package/build/src/cli/commands/db/tenants/check.d.ts +1 -1
- package/build/src/cli/commands/db/tenants/check.d.ts.map +1 -1
- package/build/src/cli/commands/db/tenants/create.d.ts +1 -1
- package/build/src/cli/commands/db/tenants/create.d.ts.map +1 -1
- package/build/src/cli/commands/db/tenants/drop.d.ts +1 -1
- package/build/src/cli/commands/db/tenants/drop.d.ts.map +1 -1
- package/build/src/cli/commands/db/tenants/migrate.d.ts +1 -1
- package/build/src/cli/commands/db/tenants/migrate.d.ts.map +1 -1
- package/build/src/cli/commands/destroy/migration.d.ts +2 -1
- package/build/src/cli/commands/destroy/migration.d.ts.map +1 -1
- package/build/src/cli/commands/generate/base-models.d.ts +2 -1
- package/build/src/cli/commands/generate/base-models.d.ts.map +1 -1
- package/build/src/cli/commands/generate/frontend-models.d.ts +6 -1
- package/build/src/cli/commands/generate/frontend-models.d.ts.map +1 -1
- package/build/src/cli/commands/generate/frontend-models.js +2 -2
- package/build/src/cli/commands/generate/migration.d.ts +2 -1
- package/build/src/cli/commands/generate/migration.d.ts.map +1 -1
- package/build/src/cli/commands/generate/model.d.ts +2 -1
- package/build/src/cli/commands/generate/model.d.ts.map +1 -1
- package/build/src/cli/commands/init.d.ts +4 -2
- package/build/src/cli/commands/init.d.ts.map +1 -1
- package/build/src/cli/commands/lint/relationships.d.ts +6 -1
- package/build/src/cli/commands/lint/relationships.d.ts.map +1 -1
- package/build/src/cli/commands/lint/relationships.js +2 -2
- package/build/src/cli/commands/routes.d.ts +2 -1
- package/build/src/cli/commands/routes.d.ts.map +1 -1
- package/build/src/cli/commands/run-script.d.ts +6 -1
- package/build/src/cli/commands/run-script.d.ts.map +1 -1
- package/build/src/cli/commands/run-script.js +2 -2
- package/build/src/cli/commands/runner.d.ts +6 -1
- package/build/src/cli/commands/runner.d.ts.map +1 -1
- package/build/src/cli/commands/runner.js +2 -2
- package/build/src/cli/commands/server.d.ts +2 -1
- package/build/src/cli/commands/server.d.ts.map +1 -1
- package/build/src/cli/commands/test.d.ts +2 -1
- package/build/src/cli/commands/test.d.ts.map +1 -1
- package/build/src/cli/index.d.ts +20 -20
- package/build/src/cli/index.d.ts.map +1 -1
- package/build/src/cli/index.js +3 -3
- package/build/src/cli/tenant-database-command-helper.d.ts +13 -13
- package/build/src/cli/tenant-database-command-helper.d.ts.map +1 -1
- package/build/src/cli/tenant-database-command-helper.js +3 -3
- package/build/src/cli/use-browser-cli.d.ts +1 -1
- package/build/src/cli/use-browser-cli.d.ts.map +1 -1
- package/build/src/configuration-resolver.d.ts +1 -1
- package/build/src/configuration-resolver.d.ts.map +1 -1
- package/build/src/configuration-types.d.ts +947 -1038
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +49 -48
- package/build/src/configuration.d.ts +145 -139
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +149 -66
- package/build/src/controller.d.ts +37 -35
- package/build/src/controller.d.ts.map +1 -1
- package/build/src/controller.js +11 -9
- package/build/src/current-configuration.d.ts +5 -4
- package/build/src/current-configuration.d.ts.map +1 -1
- package/build/src/current.d.ts +3 -3
- package/build/src/current.d.ts.map +1 -1
- package/build/src/current.js +3 -3
- package/build/src/database/advisory-lock-runner.d.ts +61 -60
- package/build/src/database/advisory-lock-runner.d.ts.map +1 -1
- package/build/src/database/annotations-async-hooks.js +4 -4
- package/build/src/database/annotations.d.ts +4 -6
- package/build/src/database/annotations.d.ts.map +1 -1
- package/build/src/database/annotations.js +2 -2
- package/build/src/database/column-types.d.ts +1 -1
- package/build/src/database/column-types.d.ts.map +1 -1
- package/build/src/database/datetime-storage.d.ts +6 -6
- package/build/src/database/datetime-storage.d.ts.map +1 -1
- package/build/src/database/drivers/base-column.d.ts +3 -3
- package/build/src/database/drivers/base-column.d.ts.map +1 -1
- package/build/src/database/drivers/base-column.js +2 -2
- package/build/src/database/drivers/base-columns-index.d.ts +2 -2
- package/build/src/database/drivers/base-columns-index.d.ts.map +1 -1
- package/build/src/database/drivers/base-foreign-key.d.ts +7 -7
- package/build/src/database/drivers/base-foreign-key.d.ts.map +1 -1
- package/build/src/database/drivers/base-foreign-key.js +2 -2
- package/build/src/database/drivers/base-table.d.ts +3 -3
- package/build/src/database/drivers/base-table.d.ts.map +1 -1
- package/build/src/database/drivers/base-table.js +2 -2
- package/build/src/database/drivers/base.d.ts +297 -342
- package/build/src/database/drivers/base.d.ts.map +1 -1
- package/build/src/database/drivers/base.js +19 -19
- package/build/src/database/drivers/index-metadata.d.ts +15 -18
- package/build/src/database/drivers/index-metadata.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/column.d.ts +10 -5
- package/build/src/database/drivers/mssql/column.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/column.js +2 -2
- package/build/src/database/drivers/mssql/columns-index.d.ts +30 -22
- package/build/src/database/drivers/mssql/columns-index.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/connect-connection.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/foreign-key.d.ts +1 -1
- package/build/src/database/drivers/mssql/foreign-key.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/index.d.ts +250 -9
- package/build/src/database/drivers/mssql/index.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/index.js +3 -3
- package/build/src/database/drivers/mssql/options.d.ts +31 -1
- package/build/src/database/drivers/mssql/options.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/options.js +2 -2
- package/build/src/database/drivers/mssql/query-parser.d.ts +1 -1
- package/build/src/database/drivers/mssql/query-parser.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/sql/alter-table.d.ts +1 -1
- package/build/src/database/drivers/mssql/sql/alter-table.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/sql/create-database.d.ts +3 -2
- package/build/src/database/drivers/mssql/sql/create-database.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/sql/create-index.d.ts +1 -1
- package/build/src/database/drivers/mssql/sql/create-index.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/sql/create-table.d.ts +1 -1
- package/build/src/database/drivers/mssql/sql/create-table.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/sql/delete.d.ts +1 -1
- package/build/src/database/drivers/mssql/sql/delete.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/sql/drop-database.d.ts +14 -1
- package/build/src/database/drivers/mssql/sql/drop-database.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/sql/drop-table.d.ts +1 -1
- package/build/src/database/drivers/mssql/sql/drop-table.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/sql/insert.d.ts +1 -1
- package/build/src/database/drivers/mssql/sql/insert.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/sql/remove-index.d.ts +1 -1
- package/build/src/database/drivers/mssql/sql/remove-index.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/sql/update.d.ts +1 -1
- package/build/src/database/drivers/mssql/sql/update.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/sql/upsert.d.ts +1 -1
- package/build/src/database/drivers/mssql/sql/upsert.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/structure-sql.d.ts +3 -3
- package/build/src/database/drivers/mssql/structure-sql.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/structure-sql.js +2 -2
- package/build/src/database/drivers/mssql/table.d.ts +39 -29
- package/build/src/database/drivers/mssql/table.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/table.js +2 -2
- package/build/src/database/drivers/mysql/column.d.ts +10 -6
- package/build/src/database/drivers/mysql/column.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/column.js +2 -2
- package/build/src/database/drivers/mysql/columns-index.d.ts +3 -1
- package/build/src/database/drivers/mysql/columns-index.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/foreign-key.d.ts +1 -1
- package/build/src/database/drivers/mysql/foreign-key.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/index.d.ts +225 -6
- package/build/src/database/drivers/mysql/index.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/index.js +5 -5
- package/build/src/database/drivers/mysql/options.d.ts +7 -1
- package/build/src/database/drivers/mysql/options.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/options.js +2 -2
- package/build/src/database/drivers/mysql/query-parser.d.ts +1 -1
- package/build/src/database/drivers/mysql/query-parser.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/query-stream.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/query.d.ts +2 -2
- package/build/src/database/drivers/mysql/query.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/query.js +8 -8
- package/build/src/database/drivers/mysql/sql/alter-table.d.ts +12 -1
- package/build/src/database/drivers/mysql/sql/alter-table.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/sql/create-database.d.ts +6 -1
- package/build/src/database/drivers/mysql/sql/create-database.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/sql/create-index.d.ts +1 -1
- package/build/src/database/drivers/mysql/sql/create-index.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/sql/create-table.d.ts +1 -1
- package/build/src/database/drivers/mysql/sql/create-table.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/sql/delete.d.ts +1 -1
- package/build/src/database/drivers/mysql/sql/delete.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/sql/drop-database.d.ts +1 -1
- package/build/src/database/drivers/mysql/sql/drop-database.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/sql/drop-table.d.ts +1 -1
- package/build/src/database/drivers/mysql/sql/drop-table.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/sql/insert.d.ts +1 -1
- package/build/src/database/drivers/mysql/sql/insert.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/sql/remove-index.d.ts +1 -1
- package/build/src/database/drivers/mysql/sql/remove-index.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/sql/update.d.ts +1 -1
- package/build/src/database/drivers/mysql/sql/update.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/sql/upsert.d.ts +1 -1
- package/build/src/database/drivers/mysql/sql/upsert.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/structure-sql.d.ts +14 -3
- package/build/src/database/drivers/mysql/structure-sql.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/structure-sql.js +62 -11
- package/build/src/database/drivers/mysql/table.d.ts +11 -6
- package/build/src/database/drivers/mysql/table.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/column.d.ts +10 -5
- package/build/src/database/drivers/pgsql/column.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/column.js +2 -2
- package/build/src/database/drivers/pgsql/columns-index.d.ts +30 -22
- package/build/src/database/drivers/pgsql/columns-index.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/foreign-key.d.ts +1 -1
- package/build/src/database/drivers/pgsql/foreign-key.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/index.d.ts +157 -6
- package/build/src/database/drivers/pgsql/index.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/index.js +7 -7
- package/build/src/database/drivers/pgsql/options.d.ts +1 -1
- package/build/src/database/drivers/pgsql/options.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/query-parser.d.ts +1 -1
- package/build/src/database/drivers/pgsql/query-parser.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/sql/alter-table.d.ts +1 -1
- package/build/src/database/drivers/pgsql/sql/alter-table.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/sql/create-database.d.ts +2 -1
- package/build/src/database/drivers/pgsql/sql/create-database.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/sql/create-index.d.ts +1 -1
- package/build/src/database/drivers/pgsql/sql/create-index.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/sql/create-table.d.ts +1 -1
- package/build/src/database/drivers/pgsql/sql/create-table.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/sql/delete.d.ts +1 -1
- package/build/src/database/drivers/pgsql/sql/delete.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/sql/drop-database.d.ts +1 -1
- package/build/src/database/drivers/pgsql/sql/drop-database.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/sql/drop-table.d.ts +1 -1
- package/build/src/database/drivers/pgsql/sql/drop-table.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/sql/insert.d.ts +1 -1
- package/build/src/database/drivers/pgsql/sql/insert.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/sql/remove-index.d.ts +1 -1
- package/build/src/database/drivers/pgsql/sql/remove-index.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/sql/update.d.ts +1 -1
- package/build/src/database/drivers/pgsql/sql/update.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/sql/upsert.d.ts +1 -1
- package/build/src/database/drivers/pgsql/sql/upsert.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/structure-sql.d.ts +3 -3
- package/build/src/database/drivers/pgsql/structure-sql.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/structure-sql.js +2 -2
- package/build/src/database/drivers/pgsql/table.d.ts +33 -31
- package/build/src/database/drivers/pgsql/table.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/base.d.ts +162 -12
- package/build/src/database/drivers/sqlite/base.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/base.js +8 -8
- package/build/src/database/drivers/sqlite/column.d.ts +12 -6
- package/build/src/database/drivers/sqlite/column.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/column.js +2 -2
- package/build/src/database/drivers/sqlite/columns-index.d.ts +5 -1
- package/build/src/database/drivers/sqlite/columns-index.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/connection-sql-js.d.ts +9 -9
- package/build/src/database/drivers/sqlite/connection-sql-js.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/connection-sql-js.js +2 -2
- package/build/src/database/drivers/sqlite/foreign-key.d.ts +5 -4
- package/build/src/database/drivers/sqlite/foreign-key.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/foreign-key.js +2 -2
- package/build/src/database/drivers/sqlite/index.d.ts +53 -3
- package/build/src/database/drivers/sqlite/index.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/index.js +2 -2
- package/build/src/database/drivers/sqlite/index.native.d.ts +13 -5
- package/build/src/database/drivers/sqlite/index.native.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/index.native.js +3 -3
- package/build/src/database/drivers/sqlite/index.web.d.ts +48 -14
- package/build/src/database/drivers/sqlite/index.web.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/index.web.js +3 -3
- package/build/src/database/drivers/sqlite/options.d.ts +1 -1
- package/build/src/database/drivers/sqlite/options.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/query-parser.d.ts +1 -1
- package/build/src/database/drivers/sqlite/query-parser.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/query.d.ts +2 -2
- package/build/src/database/drivers/sqlite/query.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/query.js +3 -3
- package/build/src/database/drivers/sqlite/query.native.d.ts +4 -4
- package/build/src/database/drivers/sqlite/query.native.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/query.native.js +3 -3
- package/build/src/database/drivers/sqlite/query.web.d.ts +2 -2
- package/build/src/database/drivers/sqlite/query.web.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/query.web.js +3 -3
- package/build/src/database/drivers/sqlite/sql/alter-table.d.ts +19 -4
- package/build/src/database/drivers/sqlite/sql/alter-table.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/sql/create-index.d.ts +1 -1
- package/build/src/database/drivers/sqlite/sql/create-index.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/sql/create-table.d.ts +1 -1
- package/build/src/database/drivers/sqlite/sql/create-table.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/sql/delete.d.ts +1 -1
- package/build/src/database/drivers/sqlite/sql/delete.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/sql/drop-table.d.ts +1 -1
- package/build/src/database/drivers/sqlite/sql/drop-table.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/sql/insert.d.ts +1 -1
- package/build/src/database/drivers/sqlite/sql/insert.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/sql/remove-index.d.ts +1 -1
- package/build/src/database/drivers/sqlite/sql/remove-index.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/sql/update.d.ts +1 -1
- package/build/src/database/drivers/sqlite/sql/update.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/sql/upsert.d.ts +1 -1
- package/build/src/database/drivers/sqlite/sql/upsert.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/structure-sql.d.ts +1 -1
- package/build/src/database/drivers/sqlite/structure-sql.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/table-rebuilder.d.ts +5 -5
- package/build/src/database/drivers/sqlite/table-rebuilder.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/table-rebuilder.js +2 -2
- package/build/src/database/drivers/sqlite/table.d.ts +15 -5
- package/build/src/database/drivers/sqlite/table.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/web-persistence.d.ts +28 -34
- package/build/src/database/drivers/sqlite/web-persistence.d.ts.map +1 -1
- package/build/src/database/drivers/structure-sql/utils.d.ts +2 -2
- package/build/src/database/drivers/structure-sql/utils.d.ts.map +1 -1
- package/build/src/database/handler.d.ts.map +1 -1
- package/build/src/database/initializer-from-require-context.d.ts +18 -16
- package/build/src/database/initializer-from-require-context.d.ts.map +1 -1
- package/build/src/database/live-query.d.ts +13 -24
- package/build/src/database/live-query.d.ts.map +1 -1
- package/build/src/database/migration/index.d.ts +146 -169
- package/build/src/database/migration/index.d.ts.map +1 -1
- package/build/src/database/migration/index.js +3 -3
- package/build/src/database/migrations-ledger.d.ts.map +1 -1
- package/build/src/database/migrator/files-finder.d.ts +1 -1
- package/build/src/database/migrator/files-finder.d.ts.map +1 -1
- package/build/src/database/migrator/types.d.ts +26 -2
- package/build/src/database/migrator/types.d.ts.map +1 -1
- package/build/src/database/migrator/types.js +24 -1
- package/build/src/database/migrator.d.ts +10 -10
- package/build/src/database/migrator.d.ts.map +1 -1
- package/build/src/database/operation-connection.d.ts +3 -3
- package/build/src/database/operation-connection.d.ts.map +1 -1
- package/build/src/database/operation-lease.d.ts +4 -4
- package/build/src/database/operation-lease.d.ts.map +1 -1
- package/build/src/database/operation.d.ts +38 -7
- package/build/src/database/operation.d.ts.map +1 -1
- package/build/src/database/operation.js +55 -8
- package/build/src/database/pool/async-tracked-multi-connection.d.ts +174 -79
- package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
- package/build/src/database/pool/async-tracked-multi-connection.js +70 -25
- package/build/src/database/pool/base-methods-forward.d.ts.map +1 -1
- package/build/src/database/pool/base-methods-forward.js +3 -3
- package/build/src/database/pool/base.d.ts +93 -71
- package/build/src/database/pool/base.d.ts.map +1 -1
- package/build/src/database/pool/base.js +47 -17
- package/build/src/database/pool/single-multi-use.d.ts +243 -10
- package/build/src/database/pool/single-multi-use.d.ts.map +1 -1
- package/build/src/database/pool/single-multi-use.js +467 -103
- package/build/src/database/query/alter-table-base.d.ts +8 -3
- package/build/src/database/query/alter-table-base.d.ts.map +1 -1
- package/build/src/database/query/base.d.ts +3 -3
- package/build/src/database/query/base.d.ts.map +1 -1
- package/build/src/database/query/create-database-base.d.ts +28 -22
- package/build/src/database/query/create-database-base.d.ts.map +1 -1
- package/build/src/database/query/create-index-base.d.ts +32 -30
- package/build/src/database/query/create-index-base.d.ts.map +1 -1
- package/build/src/database/query/create-table-base.d.ts +7 -7
- package/build/src/database/query/create-table-base.d.ts.map +1 -1
- package/build/src/database/query/delete-base.d.ts +5 -5
- package/build/src/database/query/delete-base.d.ts.map +1 -1
- package/build/src/database/query/delete-base.js +2 -2
- package/build/src/database/query/drop-database-base.d.ts +22 -18
- package/build/src/database/query/drop-database-base.d.ts.map +1 -1
- package/build/src/database/query/drop-table-base.d.ts +11 -6
- package/build/src/database/query/drop-table-base.d.ts.map +1 -1
- package/build/src/database/query/from-base.d.ts.map +1 -1
- package/build/src/database/query/from-plain.d.ts +3 -2
- package/build/src/database/query/from-plain.d.ts.map +1 -1
- package/build/src/database/query/from-table.d.ts +3 -2
- package/build/src/database/query/from-table.d.ts.map +1 -1
- package/build/src/database/query/index.d.ts +92 -107
- package/build/src/database/query/index.d.ts.map +1 -1
- package/build/src/database/query/index.js +4 -4
- package/build/src/database/query/insert-base.d.ts +18 -18
- package/build/src/database/query/insert-base.d.ts.map +1 -1
- package/build/src/database/query/insert-base.js +5 -5
- package/build/src/database/query/join-base.d.ts +1 -1
- package/build/src/database/query/join-base.d.ts.map +1 -1
- package/build/src/database/query/join-object.d.ts +9 -15
- package/build/src/database/query/join-object.d.ts.map +1 -1
- package/build/src/database/query/join-plain.d.ts +2 -2
- package/build/src/database/query/join-plain.d.ts.map +1 -1
- package/build/src/database/query/join-tracker.d.ts +3 -3
- package/build/src/database/query/join-tracker.d.ts.map +1 -1
- package/build/src/database/query/model-class-query.d.ts +39 -36
- package/build/src/database/query/model-class-query.d.ts.map +1 -1
- package/build/src/database/query/model-class-query.js +40 -40
- package/build/src/database/query/order-base.d.ts +1 -1
- package/build/src/database/query/order-base.d.ts.map +1 -1
- package/build/src/database/query/order-column.d.ts +19 -22
- package/build/src/database/query/order-column.d.ts.map +1 -1
- package/build/src/database/query/order-plain.d.ts +3 -3
- package/build/src/database/query/order-plain.d.ts.map +1 -1
- package/build/src/database/query/preloader/belongs-to.d.ts +5 -5
- package/build/src/database/query/preloader/belongs-to.d.ts.map +1 -1
- package/build/src/database/query/preloader/belongs-to.js +3 -3
- package/build/src/database/query/preloader/ensure-model-class-initialized.d.ts +2 -1
- package/build/src/database/query/preloader/ensure-model-class-initialized.d.ts.map +1 -1
- package/build/src/database/query/preloader/ensure-model-class-initialized.js +4 -3
- package/build/src/database/query/preloader/has-many.d.ts +6 -6
- package/build/src/database/query/preloader/has-many.d.ts.map +1 -1
- package/build/src/database/query/preloader/has-many.js +4 -4
- package/build/src/database/query/preloader/has-one.d.ts +5 -5
- package/build/src/database/query/preloader/has-one.d.ts.map +1 -1
- package/build/src/database/query/preloader/has-one.js +2 -2
- package/build/src/database/query/preloader/query-for-model.d.ts.map +1 -1
- package/build/src/database/query/preloader/selection.d.ts +6 -6
- package/build/src/database/query/preloader/selection.d.ts.map +1 -1
- package/build/src/database/query/preloader.d.ts +8 -8
- package/build/src/database/query/preloader.d.ts.map +1 -1
- package/build/src/database/query/preloader.js +9 -3
- package/build/src/database/query/query-data.d.ts +43 -55
- package/build/src/database/query/query-data.d.ts.map +1 -1
- package/build/src/database/query/query-data.js +8 -8
- package/build/src/database/query/remove-index-base.d.ts +21 -19
- package/build/src/database/query/remove-index-base.d.ts.map +1 -1
- package/build/src/database/query/select-base.d.ts +1 -1
- package/build/src/database/query/select-base.d.ts.map +1 -1
- package/build/src/database/query/select-plain.d.ts +3 -2
- package/build/src/database/query/select-plain.d.ts.map +1 -1
- package/build/src/database/query/select-table-and-column.d.ts +4 -3
- package/build/src/database/query/select-table-and-column.d.ts.map +1 -1
- package/build/src/database/query/update-base.d.ts +10 -10
- package/build/src/database/query/update-base.d.ts.map +1 -1
- package/build/src/database/query/update-base.js +4 -4
- package/build/src/database/query/upsert-base.d.ts +9 -9
- package/build/src/database/query/upsert-base.d.ts.map +1 -1
- package/build/src/database/query/upsert-base.js +3 -3
- package/build/src/database/query/where-base.d.ts +1 -1
- package/build/src/database/query/where-base.d.ts.map +1 -1
- package/build/src/database/query/where-combinator.d.ts +9 -4
- package/build/src/database/query/where-combinator.d.ts.map +1 -1
- package/build/src/database/query/where-hash.d.ts +11 -9
- package/build/src/database/query/where-hash.d.ts.map +1 -1
- package/build/src/database/query/where-model-class-hash.d.ts +28 -26
- package/build/src/database/query/where-model-class-hash.d.ts.map +1 -1
- package/build/src/database/query/where-model-class-hash.js +14 -14
- package/build/src/database/query/where-not.d.ts +8 -3
- package/build/src/database/query/where-not.d.ts.map +1 -1
- package/build/src/database/query/where-plain.d.ts +4 -3
- package/build/src/database/query/where-plain.d.ts.map +1 -1
- package/build/src/database/query/with-count.d.ts +22 -28
- package/build/src/database/query/with-count.d.ts.map +1 -1
- package/build/src/database/query/with-count.js +12 -12
- package/build/src/database/query-aborted-error.d.ts +5 -5
- package/build/src/database/query-aborted-error.d.ts.map +1 -1
- package/build/src/database/query-parser/base-query-parser.d.ts +3 -3
- package/build/src/database/query-parser/base-query-parser.d.ts.map +1 -1
- package/build/src/database/query-parser/from-parser.d.ts +2 -2
- package/build/src/database/query-parser/from-parser.d.ts.map +1 -1
- package/build/src/database/query-parser/group-parser.d.ts +2 -2
- package/build/src/database/query-parser/group-parser.d.ts.map +1 -1
- package/build/src/database/query-parser/joins-parser.d.ts +3 -3
- package/build/src/database/query-parser/joins-parser.d.ts.map +1 -1
- package/build/src/database/query-parser/limit-parser.d.ts +2 -2
- package/build/src/database/query-parser/limit-parser.d.ts.map +1 -1
- package/build/src/database/query-parser/options.d.ts +31 -34
- package/build/src/database/query-parser/options.d.ts.map +1 -1
- package/build/src/database/query-parser/options.js +3 -3
- package/build/src/database/query-parser/order-parser.d.ts +2 -2
- package/build/src/database/query-parser/order-parser.d.ts.map +1 -1
- package/build/src/database/query-parser/select-parser.d.ts +2 -2
- package/build/src/database/query-parser/select-parser.d.ts.map +1 -1
- package/build/src/database/query-parser/select-parser.js +2 -2
- package/build/src/database/query-parser/where-parser.d.ts +2 -2
- package/build/src/database/query-parser/where-parser.d.ts.map +1 -1
- package/build/src/database/record/acts-as-list.d.ts.map +1 -1
- package/build/src/database/record/acts-as-list.js +3 -3
- package/build/src/database/record/attachments/attachment-record.d.ts +7 -3
- package/build/src/database/record/attachments/attachment-record.d.ts.map +1 -1
- package/build/src/database/record/attachments/download.d.ts +9 -9
- package/build/src/database/record/attachments/download.d.ts.map +1 -1
- package/build/src/database/record/attachments/handle.d.ts +12 -12
- package/build/src/database/record/attachments/handle.d.ts.map +1 -1
- package/build/src/database/record/attachments/handle.js +7 -7
- package/build/src/database/record/attachments/normalize-input.d.ts +16 -22
- package/build/src/database/record/attachments/normalize-input.d.ts.map +1 -1
- package/build/src/database/record/attachments/normalize-input.js +12 -12
- package/build/src/database/record/attachments/storage-drivers/filesystem.d.ts +4 -4
- package/build/src/database/record/attachments/storage-drivers/filesystem.d.ts.map +1 -1
- package/build/src/database/record/attachments/storage-drivers/filesystem.js +2 -2
- package/build/src/database/record/attachments/storage-drivers/native.d.ts +12 -12
- package/build/src/database/record/attachments/storage-drivers/native.d.ts.map +1 -1
- package/build/src/database/record/attachments/storage-drivers/native.js +6 -6
- package/build/src/database/record/attachments/storage-drivers/s3.d.ts +17 -17
- package/build/src/database/record/attachments/storage-drivers/s3.d.ts.map +1 -1
- package/build/src/database/record/attachments/storage-drivers/s3.js +11 -11
- package/build/src/database/record/attachments/store.d.ts +38 -41
- package/build/src/database/record/attachments/store.d.ts.map +1 -1
- package/build/src/database/record/attachments/store.js +24 -21
- package/build/src/database/record/auditing.d.ts +67 -87
- package/build/src/database/record/auditing.d.ts.map +1 -1
- package/build/src/database/record/auditing.js +109 -30
- package/build/src/database/record/counter-cache-magnitude.d.ts +15 -35
- package/build/src/database/record/counter-cache-magnitude.d.ts.map +1 -1
- package/build/src/database/record/counter-cache-magnitude.js +12 -12
- package/build/src/database/record/index.d.ts +2390 -488
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +222 -172
- package/build/src/database/record/instance-relationships/base.d.ts +20 -23
- package/build/src/database/record/instance-relationships/base.d.ts.map +1 -1
- package/build/src/database/record/instance-relationships/base.js +5 -5
- package/build/src/database/record/instance-relationships/belongs-to.d.ts +9 -1
- package/build/src/database/record/instance-relationships/belongs-to.d.ts.map +1 -1
- package/build/src/database/record/instance-relationships/belongs-to.js +2 -2
- package/build/src/database/record/instance-relationships/has-many.d.ts +15 -3
- package/build/src/database/record/instance-relationships/has-many.d.ts.map +1 -1
- package/build/src/database/record/instance-relationships/has-many.js +4 -4
- package/build/src/database/record/instance-relationships/has-one.d.ts +19 -1
- package/build/src/database/record/instance-relationships/has-one.d.ts.map +1 -1
- package/build/src/database/record/instance-relationships/has-one.js +2 -2
- package/build/src/database/record/record-not-found-error.d.ts +1 -0
- package/build/src/database/record/record-not-found-error.d.ts.map +1 -1
- package/build/src/database/record/record-not-found-error.js +2 -1
- package/build/src/database/record/relationships/base.d.ts +83 -71
- package/build/src/database/record/relationships/base.d.ts.map +1 -1
- package/build/src/database/record/relationships/base.js +21 -1
- package/build/src/database/record/relationships/belongs-to.d.ts +11 -1
- package/build/src/database/record/relationships/belongs-to.d.ts.map +1 -1
- package/build/src/database/record/relationships/has-many.d.ts +11 -1
- package/build/src/database/record/relationships/has-many.d.ts.map +1 -1
- package/build/src/database/record/relationships/has-one.d.ts +11 -1
- package/build/src/database/record/relationships/has-one.d.ts.map +1 -1
- package/build/src/database/record/state-machine.d.ts +20 -29
- package/build/src/database/record/state-machine.d.ts.map +1 -1
- package/build/src/database/record/state-machine.js +7 -7
- package/build/src/database/record/user-module.d.ts +1 -1
- package/build/src/database/record/user-module.d.ts.map +1 -1
- package/build/src/database/record/validation-messages.d.ts +19 -22
- package/build/src/database/record/validation-messages.d.ts.map +1 -1
- package/build/src/database/record/validators/base.d.ts +4 -4
- package/build/src/database/record/validators/base.d.ts.map +1 -1
- package/build/src/database/record/validators/base.js +2 -2
- package/build/src/database/record/validators/format.d.ts +12 -1
- package/build/src/database/record/validators/format.d.ts.map +1 -1
- package/build/src/database/record/validators/length.d.ts +14 -1
- package/build/src/database/record/validators/length.d.ts.map +1 -1
- package/build/src/database/record/validators/presence.d.ts +11 -1
- package/build/src/database/record/validators/presence.d.ts.map +1 -1
- package/build/src/database/record/validators/uniqueness.d.ts +12 -1
- package/build/src/database/record/validators/uniqueness.d.ts.map +1 -1
- package/build/src/database/record-changes.d.ts +7 -18
- package/build/src/database/record-changes.d.ts.map +1 -1
- package/build/src/database/structure-sql-loader.d.ts +2 -2
- package/build/src/database/structure-sql-loader.d.ts.map +1 -1
- package/build/src/database/structure-sql-loader.js +4 -4
- package/build/src/database/table-data/index.d.ts +21 -24
- package/build/src/database/table-data/index.d.ts.map +1 -1
- package/build/src/database/table-data/table-column.d.ts +74 -80
- package/build/src/database/table-data/table-column.d.ts.map +1 -1
- package/build/src/database/table-data/table-column.js +4 -4
- package/build/src/database/table-data/table-foreign-key.d.ts +10 -10
- package/build/src/database/table-data/table-foreign-key.d.ts.map +1 -1
- package/build/src/database/table-data/table-index.d.ts +12 -15
- package/build/src/database/table-data/table-index.d.ts.map +1 -1
- package/build/src/database/table-data/table-reference.d.ts +2 -2
- package/build/src/database/table-data/table-reference.d.ts.map +1 -1
- package/build/src/database/tenants/data-copier.d.ts +7 -7
- package/build/src/database/tenants/data-copier.d.ts.map +1 -1
- package/build/src/database/tenants/schema-cloner.d.ts +3 -3
- package/build/src/database/tenants/schema-cloner.d.ts.map +1 -1
- package/build/src/database/tenants/tenant-table-plan.d.ts +20 -14
- package/build/src/database/tenants/tenant-table-plan.d.ts.map +1 -1
- package/build/src/database/tenants/tenant-table-plan.js +17 -1
- package/build/src/database/use-database.d.ts.map +1 -1
- package/build/src/database/use-live-query.d.ts +17 -29
- package/build/src/database/use-live-query.d.ts.map +1 -1
- package/build/src/database/use-live-query.js +4 -4
- package/build/src/environment-handlers/base.d.ts +112 -103
- package/build/src/environment-handlers/base.d.ts.map +1 -1
- package/build/src/environment-handlers/base.js +54 -38
- package/build/src/environment-handlers/browser.d.ts +63 -56
- package/build/src/environment-handlers/browser.d.ts.map +1 -1
- package/build/src/environment-handlers/browser.js +2 -2
- package/build/src/environment-handlers/node/attachment-path-source.d.ts +9 -9
- package/build/src/environment-handlers/node/attachment-path-source.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/background-jobs-main.d.ts +1 -1
- package/build/src/environment-handlers/node/cli/commands/background-jobs-main.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/background-jobs-runner.d.ts +1 -1
- package/build/src/environment-handlers/node/cli/commands/background-jobs-runner.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/background-jobs-worker.d.ts +1 -1
- package/build/src/environment-handlers/node/cli/commands/background-jobs-worker.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/beacon.d.ts +1 -1
- package/build/src/environment-handlers/node/cli/commands/beacon.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/cli-command-context.d.ts +7 -10
- package/build/src/environment-handlers/node/cli/commands/cli-command-context.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/console.d.ts +9 -7
- package/build/src/environment-handlers/node/cli/commands/console.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/console.js +5 -5
- package/build/src/environment-handlers/node/cli/commands/db/schema/dump.d.ts +1 -1
- package/build/src/environment-handlers/node/cli/commands/db/schema/dump.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/db/schema/load.d.ts +1 -1
- package/build/src/environment-handlers/node/cli/commands/db/schema/load.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/db/seed.d.ts +7 -5
- package/build/src/environment-handlers/node/cli/commands/db/seed.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/db/seed.js +3 -3
- package/build/src/environment-handlers/node/cli/commands/destroy/migration.d.ts +4 -7
- package/build/src/environment-handlers/node/cli/commands/destroy/migration.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts +1 -1
- package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/generate/base-models.js +2 -2
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +93 -108
- 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/generated-file-banner.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/generate/migration.d.ts +9 -12
- package/build/src/environment-handlers/node/cli/commands/generate/migration.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/generate/model.d.ts +8 -11
- package/build/src/environment-handlers/node/cli/commands/generate/model.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/init.d.ts +7 -9
- package/build/src/environment-handlers/node/cli/commands/init.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/lint/relationships.d.ts +7 -7
- package/build/src/environment-handlers/node/cli/commands/lint/relationships.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/routes.d.ts +1 -1
- package/build/src/environment-handlers/node/cli/commands/routes.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/run-script.d.ts +7 -5
- package/build/src/environment-handlers/node/cli/commands/run-script.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/run-script.js +3 -3
- package/build/src/environment-handlers/node/cli/commands/runner.d.ts +9 -7
- package/build/src/environment-handlers/node/cli/commands/runner.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/runner.js +3 -3
- package/build/src/environment-handlers/node/cli/commands/server.d.ts +24 -30
- package/build/src/environment-handlers/node/cli/commands/server.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/server.js +2 -2
- package/build/src/environment-handlers/node/cli/commands/test.d.ts +5 -5
- package/build/src/environment-handlers/node/cli/commands/test.d.ts.map +1 -1
- package/build/src/environment-handlers/node/source-peer-package.d.ts +5 -7
- package/build/src/environment-handlers/node/source-peer-package.d.ts.map +1 -1
- package/build/src/environment-handlers/node/source-peer-package.js +1 -1
- package/build/src/environment-handlers/node.d.ts +362 -13
- package/build/src/environment-handlers/node.d.ts.map +1 -1
- package/build/src/environment-handlers/node.js +37 -37
- package/build/src/error-logger.d.ts +3 -3
- package/build/src/error-logger.d.ts.map +1 -1
- package/build/src/error-logger.js +3 -3
- package/build/src/error-reporting/request-details.d.ts +1 -1
- package/build/src/error-reporting/request-details.d.ts.map +1 -1
- package/build/src/error-reporting/request-details.js +33 -33
- package/build/src/frontend-model-controller.d.ts +216 -230
- package/build/src/frontend-model-controller.d.ts.map +1 -1
- package/build/src/frontend-model-controller.js +217 -211
- package/build/src/frontend-model-resource/base-resource.d.ts +315 -365
- package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
- package/build/src/frontend-model-resource/base-resource.js +45 -45
- package/build/src/frontend-model-resource/velocious-attachment-resource.d.ts +11 -5
- package/build/src/frontend-model-resource/velocious-attachment-resource.d.ts.map +1 -1
- package/build/src/frontend-model-resource/velocious-attachment-resource.js +2 -2
- package/build/src/frontend-models/base.d.ts +632 -726
- package/build/src/frontend-models/base.d.ts.map +1 -1
- package/build/src/frontend-models/base.js +147 -143
- package/build/src/frontend-models/built-in-resources.d.ts +2 -2
- package/build/src/frontend-models/built-in-resources.d.ts.map +1 -1
- package/build/src/frontend-models/clear-pending-debounced-callback.d.ts +2 -2
- package/build/src/frontend-models/clear-pending-debounced-callback.d.ts.map +1 -1
- package/build/src/frontend-models/clear-pending-debounced-callback.js +3 -3
- package/build/src/frontend-models/event-hook-models.d.ts +3 -6
- package/build/src/frontend-models/event-hook-models.d.ts.map +1 -1
- package/build/src/frontend-models/model-registry.d.ts +5 -5
- package/build/src/frontend-models/model-registry.d.ts.map +1 -1
- package/build/src/frontend-models/model-registry.js +5 -5
- package/build/src/frontend-models/outgoing-event-buffer.d.ts +20 -17
- package/build/src/frontend-models/outgoing-event-buffer.d.ts.map +1 -1
- package/build/src/frontend-models/outgoing-event-buffer.js +2 -2
- package/build/src/frontend-models/preloader.d.ts.map +1 -1
- package/build/src/frontend-models/preloader.js +2 -2
- package/build/src/frontend-models/query.d.ts +286 -331
- package/build/src/frontend-models/query.d.ts.map +1 -1
- package/build/src/frontend-models/query.js +61 -61
- package/build/src/frontend-models/resource-config-validation.d.ts +2 -2
- package/build/src/frontend-models/resource-config-validation.d.ts.map +1 -1
- package/build/src/frontend-models/resource-definition.d.ts +30 -33
- package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
- package/build/src/frontend-models/resource-definition.js +10 -10
- package/build/src/frontend-models/transport-deadline.d.ts.map +1 -1
- package/build/src/frontend-models/transport-serialization.d.ts +26 -32
- package/build/src/frontend-models/transport-serialization.d.ts.map +1 -1
- package/build/src/frontend-models/transport-serialization.js +28 -28
- package/build/src/frontend-models/use-created-event.d.ts +4 -4
- package/build/src/frontend-models/use-created-event.d.ts.map +1 -1
- package/build/src/frontend-models/use-destroyed-event.d.ts +8 -29
- package/build/src/frontend-models/use-destroyed-event.d.ts.map +1 -1
- package/build/src/frontend-models/use-model-class-event.d.ts +9 -33
- package/build/src/frontend-models/use-model-class-event.d.ts.map +1 -1
- package/build/src/frontend-models/use-updated-event.d.ts +8 -29
- package/build/src/frontend-models/use-updated-event.d.ts.map +1 -1
- package/build/src/frontend-models/websocket-channel.d.ts +30 -34
- package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
- package/build/src/frontend-models/websocket-channel.js +5 -5
- package/build/src/frontend-models/websocket-publishers.d.ts +4 -4
- package/build/src/frontend-models/websocket-publishers.d.ts.map +1 -1
- package/build/src/frontend-models/websocket-publishers.js +2 -2
- package/build/src/http-client/header.d.ts +2 -2
- package/build/src/http-client/header.d.ts.map +1 -1
- package/build/src/http-client/index.d.ts +23 -23
- package/build/src/http-client/index.d.ts.map +1 -1
- package/build/src/http-client/request.d.ts +9 -9
- package/build/src/http-client/request.d.ts.map +1 -1
- package/build/src/http-client/request.js +2 -2
- package/build/src/http-client/response.d.ts +12 -12
- package/build/src/http-client/response.d.ts.map +1 -1
- package/build/src/http-client/response.js +2 -2
- package/build/src/http-client/websocket-client.d.ts +20 -4
- package/build/src/http-client/websocket-client.d.ts.map +1 -1
- package/build/src/http-server/client/index.d.ts +26 -26
- package/build/src/http-server/client/index.d.ts.map +1 -1
- package/build/src/http-server/client/index.js +5 -5
- package/build/src/http-server/client/params-to-object.d.ts +11 -11
- package/build/src/http-server/client/params-to-object.d.ts.map +1 -1
- package/build/src/http-server/client/params-to-object.js +17 -17
- package/build/src/http-server/client/request-buffer/form-data-part.d.ts +9 -9
- package/build/src/http-server/client/request-buffer/form-data-part.d.ts.map +1 -1
- package/build/src/http-server/client/request-buffer/header.d.ts +3 -3
- package/build/src/http-server/client/request-buffer/header.d.ts.map +1 -1
- package/build/src/http-server/client/request-buffer/index.d.ts +28 -30
- package/build/src/http-server/client/request-buffer/index.d.ts.map +1 -1
- package/build/src/http-server/client/request-buffer/index.js +5 -3
- package/build/src/http-server/client/request-parser.d.ts +11 -11
- package/build/src/http-server/client/request-parser.d.ts.map +1 -1
- package/build/src/http-server/client/request-parser.js +3 -3
- package/build/src/http-server/client/request-runner.d.ts +11 -11
- package/build/src/http-server/client/request-runner.d.ts.map +1 -1
- package/build/src/http-server/client/request-runner.js +3 -3
- package/build/src/http-server/client/request-timing.d.ts +5 -11
- package/build/src/http-server/client/request-timing.d.ts.map +1 -1
- package/build/src/http-server/client/request.d.ts +10 -10
- package/build/src/http-server/client/request.d.ts.map +1 -1
- package/build/src/http-server/client/request.js +3 -3
- package/build/src/http-server/client/response-compression.d.ts +5 -5
- package/build/src/http-server/client/response-compression.d.ts.map +1 -1
- package/build/src/http-server/client/response.d.ts +13 -13
- package/build/src/http-server/client/response.d.ts.map +1 -1
- package/build/src/http-server/client/uploaded-file/memory-uploaded-file.d.ts +8 -2
- package/build/src/http-server/client/uploaded-file/memory-uploaded-file.d.ts.map +1 -1
- package/build/src/http-server/client/uploaded-file/temporary-uploaded-file.d.ts +8 -2
- package/build/src/http-server/client/uploaded-file/temporary-uploaded-file.d.ts.map +1 -1
- package/build/src/http-server/client/uploaded-file/uploaded-file.d.ts +4 -4
- package/build/src/http-server/client/uploaded-file/uploaded-file.d.ts.map +1 -1
- package/build/src/http-server/client/websocket-request.d.ts +26 -26
- package/build/src/http-server/client/websocket-request.d.ts.map +1 -1
- package/build/src/http-server/client/websocket-request.js +7 -7
- package/build/src/http-server/client/websocket-session.d.ts +105 -108
- package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
- package/build/src/http-server/client/websocket-session.js +29 -29
- package/build/src/http-server/client-delivery-queue.d.ts +30 -30
- package/build/src/http-server/client-delivery-queue.d.ts.map +1 -1
- package/build/src/http-server/cookie.d.ts +80 -108
- package/build/src/http-server/cookie.d.ts.map +1 -1
- package/build/src/http-server/cookie.js +3 -3
- package/build/src/http-server/development-reloader.d.ts +24 -24
- package/build/src/http-server/development-reloader.d.ts.map +1 -1
- package/build/src/http-server/development-reloader.js +2 -2
- package/build/src/http-server/index.d.ts +66 -72
- package/build/src/http-server/index.d.ts.map +1 -1
- package/build/src/http-server/index.js +6 -6
- package/build/src/http-server/remote-address.d.ts.map +1 -1
- package/build/src/http-server/remote-address.js +2 -2
- package/build/src/http-server/server-client.d.ts +9 -9
- package/build/src/http-server/server-client.d.ts.map +1 -1
- package/build/src/http-server/server-lock.d.ts +11 -11
- package/build/src/http-server/server-lock.d.ts.map +1 -1
- package/build/src/http-server/server-lock.js +5 -5
- package/build/src/http-server/websocket-channel-subscribers.d.ts +11 -10
- package/build/src/http-server/websocket-channel-subscribers.d.ts.map +1 -1
- package/build/src/http-server/websocket-channel-subscribers.js +6 -6
- package/build/src/http-server/websocket-channel.d.ts +8 -14
- package/build/src/http-server/websocket-channel.d.ts.map +1 -1
- package/build/src/http-server/websocket-channel.js +2 -2
- package/build/src/http-server/websocket-connection.d.ts +10 -10
- package/build/src/http-server/websocket-connection.d.ts.map +1 -1
- package/build/src/http-server/websocket-connection.js +4 -4
- package/build/src/http-server/websocket-event-log-store.d.ts +58 -64
- package/build/src/http-server/websocket-event-log-store.d.ts.map +1 -1
- package/build/src/http-server/websocket-event-log-store.js +10 -10
- package/build/src/http-server/websocket-events-host.d.ts +17 -16
- package/build/src/http-server/websocket-events-host.d.ts.map +1 -1
- package/build/src/http-server/websocket-events-host.js +8 -8
- package/build/src/http-server/websocket-events.d.ts +9 -9
- package/build/src/http-server/websocket-events.d.ts.map +1 -1
- package/build/src/http-server/websocket-events.js +5 -5
- package/build/src/http-server/worker-handler/channel-subscriber-dispatch.d.ts +2 -2
- package/build/src/http-server/worker-handler/channel-subscriber-dispatch.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/channel-subscriber-dispatch.js +2 -2
- package/build/src/http-server/worker-handler/in-process.d.ts +22 -22
- package/build/src/http-server/worker-handler/in-process.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/in-process.js +6 -6
- package/build/src/http-server/worker-handler/index.d.ts +50 -50
- package/build/src/http-server/worker-handler/index.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/index.js +11 -11
- package/build/src/http-server/worker-handler/worker-thread.d.ts +61 -61
- package/build/src/http-server/worker-handler/worker-thread.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/worker-thread.js +9 -9
- package/build/src/initializer.d.ts +2 -2
- package/build/src/initializer.d.ts.map +1 -1
- package/build/src/jobs/mail-delivery.d.ts +7 -2
- package/build/src/jobs/mail-delivery.d.ts.map +1 -1
- package/build/src/jobs/prune-terminal-background-jobs.d.ts +15 -2
- package/build/src/jobs/prune-terminal-background-jobs.d.ts.map +1 -1
- package/build/src/jobs/prune-terminal-background-jobs.js +1 -1
- package/build/src/logger/base-logger.d.ts.map +1 -1
- package/build/src/logger/base-logger.js +2 -2
- package/build/src/logger/console-logger.d.ts +3 -3
- package/build/src/logger/console-logger.d.ts.map +1 -1
- package/build/src/logger/file-logger.d.ts +4 -4
- package/build/src/logger/file-logger.d.ts.map +1 -1
- package/build/src/logger/outputs/array-output.d.ts +9 -12
- package/build/src/logger/outputs/array-output.d.ts.map +1 -1
- package/build/src/logger/outputs/console-output.d.ts +1 -4
- package/build/src/logger/outputs/console-output.d.ts.map +1 -1
- package/build/src/logger/outputs/file-output.d.ts +13 -16
- package/build/src/logger/outputs/file-output.d.ts.map +1 -1
- package/build/src/logger/outputs/stdout-output.d.ts +1 -4
- package/build/src/logger/outputs/stdout-output.d.ts.map +1 -1
- package/build/src/logger.d.ts +30 -29
- package/build/src/logger.d.ts.map +1 -1
- package/build/src/logger.js +13 -13
- package/build/src/mailer/backends/smtp.d.ts +8 -11
- package/build/src/mailer/backends/smtp.d.ts.map +1 -1
- package/build/src/mailer/backends/smtp.js +4 -4
- package/build/src/mailer/base.d.ts +61 -61
- package/build/src/mailer/base.d.ts.map +1 -1
- package/build/src/mailer/base.js +15 -15
- package/build/src/mailer/delivery.d.ts +16 -16
- package/build/src/mailer/delivery.d.ts.map +1 -1
- package/build/src/mailer/delivery.js +4 -4
- package/build/src/mailer/index.d.ts +8 -13
- package/build/src/mailer/index.d.ts.map +1 -1
- package/build/src/mailer/index.js +2 -2
- package/build/src/mailer.d.ts +9 -7
- package/build/src/mailer.d.ts.map +1 -1
- package/build/src/mailer.js +2 -2
- package/build/src/packages/velocious-package.d.ts +5 -5
- package/build/src/packages/velocious-package.d.ts.map +1 -1
- package/build/src/plugins/sqljs-wasm-route-controller.d.ts +1 -1
- package/build/src/plugins/sqljs-wasm-route-controller.d.ts.map +1 -1
- package/build/src/plugins/sqljs-wasm-route-controller.js +2 -2
- package/build/src/plugins/sqljs-wasm-route.d.ts +14 -20
- package/build/src/plugins/sqljs-wasm-route.d.ts.map +1 -1
- package/build/src/plugins/sqljs-wasm-route.js +1 -1
- package/build/src/record-payload-values.d.ts +14 -14
- package/build/src/record-payload-values.d.ts.map +1 -1
- package/build/src/record-payload-values.js +4 -4
- package/build/src/routes/app-routes.d.ts.map +1 -1
- package/build/src/routes/base-route.d.ts +11 -10
- package/build/src/routes/base-route.d.ts.map +1 -1
- package/build/src/routes/base-route.js +6 -6
- package/build/src/routes/basic-route.d.ts +36 -3
- package/build/src/routes/basic-route.d.ts.map +1 -1
- package/build/src/routes/basic-route.js +5 -5
- package/build/src/routes/built-in/api-manifest/controller.d.ts +1 -1
- package/build/src/routes/built-in/api-manifest/controller.d.ts.map +1 -1
- package/build/src/routes/built-in/debug/controller.d.ts +1 -1
- package/build/src/routes/built-in/debug/controller.d.ts.map +1 -1
- package/build/src/routes/built-in/errors/controller.d.ts +1 -1
- package/build/src/routes/built-in/errors/controller.d.ts.map +1 -1
- package/build/src/routes/get-route.d.ts +19 -4
- package/build/src/routes/get-route.d.ts.map +1 -1
- package/build/src/routes/get-route.js +3 -3
- package/build/src/routes/hooks/frontend-model-command-route-hook.d.ts +1 -1
- package/build/src/routes/hooks/frontend-model-command-route-hook.d.ts.map +1 -1
- package/build/src/routes/hooks/frontend-model-command-route-hook.js +2 -2
- package/build/src/routes/index.d.ts +5 -5
- package/build/src/routes/index.d.ts.map +1 -1
- package/build/src/routes/index.js +4 -4
- package/build/src/routes/namespace-route.d.ts +19 -4
- package/build/src/routes/namespace-route.d.ts.map +1 -1
- package/build/src/routes/namespace-route.js +2 -2
- package/build/src/routes/plugin-routes.d.ts +16 -19
- package/build/src/routes/plugin-routes.d.ts.map +1 -1
- package/build/src/routes/plugin-routes.js +2 -2
- package/build/src/routes/post-route.d.ts +19 -4
- package/build/src/routes/post-route.d.ts.map +1 -1
- package/build/src/routes/post-route.js +3 -3
- package/build/src/routes/resolver.d.ts +16 -16
- package/build/src/routes/resolver.d.ts.map +1 -1
- package/build/src/routes/resolver.js +6 -6
- package/build/src/routes/resource-route.d.ts +23 -8
- package/build/src/routes/resource-route.d.ts.map +1 -1
- package/build/src/routes/resource-route.js +2 -2
- package/build/src/routes/root-route.d.ts +1 -1
- package/build/src/routes/root-route.d.ts.map +1 -1
- package/build/src/sync/conflict-strategy.d.ts +50 -35
- package/build/src/sync/conflict-strategy.d.ts.map +1 -1
- package/build/src/sync/conflict-strategy.js +2 -2
- package/build/src/sync/device-identity.d.ts +109 -79
- package/build/src/sync/device-identity.d.ts.map +1 -1
- package/build/src/sync/local-mutation-log.d.ts +115 -92
- package/build/src/sync/local-mutation-log.d.ts.map +1 -1
- package/build/src/sync/offline-grant.d.ts +80 -63
- package/build/src/sync/offline-grant.d.ts.map +1 -1
- package/build/src/sync/peer-mutation-bundle.d.ts +33 -39
- package/build/src/sync/peer-mutation-bundle.d.ts.map +1 -1
- package/build/src/sync/query-scope.d.ts +3 -3
- package/build/src/sync/query-scope.d.ts.map +1 -1
- package/build/src/sync/query-scope.js +8 -8
- package/build/src/sync/server-change-feed.d.ts +129 -129
- package/build/src/sync/server-change-feed.d.ts.map +1 -1
- package/build/src/sync/server-change-feed.js +14 -14
- package/build/src/sync/server-sequence-allocator.d.ts +36 -36
- package/build/src/sync/server-sequence-allocator.d.ts.map +1 -1
- package/build/src/sync/server-sequence-allocator.js +6 -6
- package/build/src/sync/signed-sync-envelope-replay-service.d.ts +60 -48
- package/build/src/sync/signed-sync-envelope-replay-service.d.ts.map +1 -1
- package/build/src/sync/signed-sync-envelope-replay-service.js +21 -21
- package/build/src/sync/stable-json.d.ts +2 -2
- package/build/src/sync/stable-json.d.ts.map +1 -1
- package/build/src/sync/stable-json.js +5 -5
- package/build/src/sync/sync-api-client-types.d.ts +98 -25
- package/build/src/sync/sync-api-client-types.d.ts.map +1 -1
- package/build/src/sync/sync-api-client-types.js +73 -1
- package/build/src/sync/sync-api-client.d.ts +71 -71
- package/build/src/sync/sync-api-client.d.ts.map +1 -1
- package/build/src/sync/sync-api-client.js +30 -30
- package/build/src/sync/sync-api-controller.d.ts +23 -23
- package/build/src/sync/sync-api-controller.d.ts.map +1 -1
- package/build/src/sync/sync-change-fanout.d.ts +32 -38
- package/build/src/sync/sync-change-fanout.d.ts.map +1 -1
- package/build/src/sync/sync-change-fanout.js +7 -7
- package/build/src/sync/sync-channel-name.d.ts +1 -1
- package/build/src/sync/sync-channel-name.d.ts.map +1 -1
- package/build/src/sync/sync-client-registry.d.ts +4 -4
- package/build/src/sync/sync-client-registry.d.ts.map +1 -1
- package/build/src/sync/sync-client-registry.js +4 -4
- package/build/src/sync/sync-client-types.d.ts +130 -82
- package/build/src/sync/sync-client-types.d.ts.map +1 -1
- package/build/src/sync/sync-client-types.js +89 -1
- package/build/src/sync/sync-client.d.ts +76 -76
- package/build/src/sync/sync-client.d.ts.map +1 -1
- package/build/src/sync/sync-client.js +19 -19
- package/build/src/sync/sync-envelope-replay-service.d.ts +266 -298
- package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
- package/build/src/sync/sync-envelope-replay-service.js +77 -77
- package/build/src/sync/sync-model-change-feed-service.d.ts +23 -23
- package/build/src/sync/sync-model-change-feed-service.d.ts.map +1 -1
- package/build/src/sync/sync-model-change-feed-service.js +8 -8
- package/build/src/sync/sync-publish-suppression.d.ts +5 -5
- package/build/src/sync/sync-publish-suppression.d.ts.map +1 -1
- package/build/src/sync/sync-publish-suppression.js +3 -3
- package/build/src/sync/sync-publisher-types.d.ts +98 -55
- package/build/src/sync/sync-publisher-types.d.ts.map +1 -1
- package/build/src/sync/sync-publisher-types.js +75 -1
- package/build/src/sync/sync-publisher.d.ts +43 -43
- package/build/src/sync/sync-publisher.d.ts.map +1 -1
- package/build/src/sync/sync-publisher.js +20 -20
- package/build/src/sync/sync-realtime-bridge.d.ts +23 -23
- package/build/src/sync/sync-realtime-bridge.d.ts.map +1 -1
- package/build/src/sync/sync-realtime-bridge.js +9 -9
- package/build/src/sync/sync-replay-upsert-applier.d.ts +70 -70
- package/build/src/sync/sync-replay-upsert-applier.d.ts.map +1 -1
- package/build/src/sync/sync-replay-upsert-applier.js +17 -17
- package/build/src/sync/sync-resource-base.d.ts +52 -51
- package/build/src/sync/sync-resource-base.d.ts.map +1 -1
- package/build/src/sync/sync-resource-base.js +15 -15
- package/build/src/sync/sync-scope-attributes.d.ts +2 -2
- package/build/src/sync/sync-scope-attributes.d.ts.map +1 -1
- package/build/src/sync/sync-scope-attributes.js +2 -2
- package/build/src/sync/sync-scope-store.d.ts +36 -36
- package/build/src/sync/sync-scope-store.d.ts.map +1 -1
- package/build/src/sync/sync-scope-store.js +6 -6
- package/build/src/sync/sync-websocket-channel.d.ts +11 -6
- package/build/src/sync/sync-websocket-channel.d.ts.map +1 -1
- package/build/src/sync/sync-websocket-channel.js +6 -6
- package/build/src/tenants/default-tenant-database-provisioning.d.ts +4 -4
- package/build/src/tenants/default-tenant-database-provisioning.d.ts.map +1 -1
- package/build/src/tenants/default-tenant-database-provisioning.js +2 -2
- package/build/src/tenants/tenant-aggregator.d.ts +81 -81
- package/build/src/tenants/tenant-aggregator.d.ts.map +1 -1
- package/build/src/tenants/tenant-aggregator.js +13 -13
- package/build/src/tenants/tenant-handle.d.ts +64 -0
- package/build/src/tenants/tenant-handle.d.ts.map +1 -0
- package/build/src/tenants/tenant-handle.js +221 -0
- package/build/src/tenants/tenant-iterator.d.ts +17 -17
- package/build/src/tenants/tenant-iterator.d.ts.map +1 -1
- package/build/src/tenants/tenant-iterator.js +7 -7
- package/build/src/tenants/tenant-model-scope.d.ts +73 -0
- package/build/src/tenants/tenant-model-scope.d.ts.map +1 -0
- package/build/src/tenants/tenant-model-scope.js +115 -0
- package/build/src/tenants/tenant.d.ts +16 -6
- package/build/src/tenants/tenant.d.ts.map +1 -1
- package/build/src/tenants/tenant.js +15 -3
- package/build/src/testing/base-expect.d.ts.map +1 -1
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts +19 -31
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts.map +1 -1
- package/build/src/testing/browser-test-app.js +6 -6
- package/build/src/testing/expect-to-change.d.ts +9 -7
- package/build/src/testing/expect-to-change.d.ts.map +1 -1
- package/build/src/testing/expect-to-change.js +2 -2
- package/build/src/testing/expect-utils.d.ts +30 -29
- package/build/src/testing/expect-utils.d.ts.map +1 -1
- package/build/src/testing/expect-utils.js +30 -30
- package/build/src/testing/expect.d.ts +30 -30
- package/build/src/testing/expect.d.ts.map +1 -1
- package/build/src/testing/expect.js +19 -19
- package/build/src/testing/factory/association-declaration.d.ts +16 -16
- package/build/src/testing/factory/association-declaration.d.ts.map +1 -1
- package/build/src/testing/factory/association-declaration.js +3 -3
- package/build/src/testing/factory/declarations.d.ts +90 -115
- package/build/src/testing/factory/declarations.d.ts.map +1 -1
- package/build/src/testing/factory/declarations.js +6 -6
- package/build/src/testing/factory/definition-builder.d.ts +72 -70
- package/build/src/testing/factory/definition-builder.d.ts.map +1 -1
- package/build/src/testing/factory/definition-builder.js +40 -40
- package/build/src/testing/factory/errors.d.ts +30 -29
- package/build/src/testing/factory/errors.d.ts.map +1 -1
- package/build/src/testing/factory/evaluation-context.d.ts +29 -29
- package/build/src/testing/factory/evaluation-context.d.ts.map +1 -1
- package/build/src/testing/factory/evaluation-context.js +17 -17
- package/build/src/testing/factory/events.d.ts +4 -5
- package/build/src/testing/factory/events.d.ts.map +1 -1
- package/build/src/testing/factory/factory-definition.d.ts +14 -14
- package/build/src/testing/factory/factory-definition.d.ts.map +1 -1
- package/build/src/testing/factory/factory-definition.js +3 -3
- package/build/src/testing/factory/factory-registry.d.ts +56 -54
- package/build/src/testing/factory/factory-registry.d.ts.map +1 -1
- package/build/src/testing/factory/factory-registry.js +35 -35
- package/build/src/testing/factory/factory-runner.d.ts +67 -73
- package/build/src/testing/factory/factory-runner.d.ts.map +1 -1
- package/build/src/testing/factory/factory-runner.js +9 -9
- package/build/src/testing/factory/index.d.ts +7 -7
- package/build/src/testing/factory/index.d.ts.map +1 -1
- package/build/src/testing/factory/linter.d.ts +7 -7
- package/build/src/testing/factory/linter.d.ts.map +1 -1
- package/build/src/testing/factory/linter.js +3 -3
- package/build/src/testing/factory/model-contract.d.ts +3 -3
- package/build/src/testing/factory/model-contract.d.ts.map +1 -1
- package/build/src/testing/factory/model-contract.js +4 -4
- package/build/src/testing/factory/node/load-definitions.d.ts +2 -2
- package/build/src/testing/factory/node/load-definitions.d.ts.map +1 -1
- package/build/src/testing/factory/sequence.d.ts +19 -23
- package/build/src/testing/factory/sequence.d.ts.map +1 -1
- package/build/src/testing/factory/sequence.js +3 -3
- package/build/src/testing/factory/strategies/attributes-for.d.ts +3 -3
- package/build/src/testing/factory/strategies/attributes-for.d.ts.map +1 -1
- package/build/src/testing/factory/strategies/attributes-for.js +2 -2
- package/build/src/testing/factory/strategies/base.d.ts +32 -32
- package/build/src/testing/factory/strategies/base.d.ts.map +1 -1
- package/build/src/testing/factory/strategies/base.js +25 -25
- package/build/src/testing/factory/strategies/build.d.ts +3 -3
- package/build/src/testing/factory/strategies/build.d.ts.map +1 -1
- package/build/src/testing/factory/strategies/build.js +3 -3
- package/build/src/testing/factory/strategies/create.d.ts +6 -6
- package/build/src/testing/factory/strategies/create.d.ts.map +1 -1
- package/build/src/testing/factory/strategies/create.js +5 -5
- package/build/src/testing/factory/trait-definition.d.ts +4 -4
- package/build/src/testing/factory/trait-definition.d.ts.map +1 -1
- package/build/src/testing/request-client.d.ts +19 -19
- package/build/src/testing/request-client.d.ts.map +1 -1
- package/build/src/testing/test-files-finder.d.ts +15 -15
- package/build/src/testing/test-files-finder.d.ts.map +1 -1
- package/build/src/testing/test-files-finder.js +2 -2
- package/build/src/testing/test-filter-parser.d.ts +19 -12
- package/build/src/testing/test-filter-parser.d.ts.map +1 -1
- package/build/src/testing/test-runner.d.ts +204 -251
- package/build/src/testing/test-runner.d.ts.map +1 -1
- package/build/src/testing/test-runner.js +15 -15
- package/build/src/testing/test-suite-splitter.d.ts +25 -31
- package/build/src/testing/test-suite-splitter.d.ts.map +1 -1
- package/build/src/testing/test.d.ts +51 -55
- package/build/src/testing/test.d.ts.map +1 -1
- package/build/src/testing/test.js +20 -18
- package/build/src/testing/wait-for-event.d.ts +25 -25
- package/build/src/testing/wait-for-event.d.ts.map +1 -1
- package/build/src/testing/wait-for-event.js +6 -6
- package/build/src/time-zone.d.ts +3 -3
- package/build/src/time-zone.d.ts.map +1 -1
- package/build/src/utils/backtrace-cleaner-node.d.ts +35 -2
- package/build/src/utils/backtrace-cleaner-node.d.ts.map +1 -1
- package/build/src/utils/backtrace-cleaner-node.js +1 -1
- package/build/src/utils/backtrace-cleaner.d.ts +33 -28
- package/build/src/utils/backtrace-cleaner.d.ts.map +1 -1
- package/build/src/utils/bearer-token.d.ts +2 -2
- package/build/src/utils/bearer-token.d.ts.map +1 -1
- package/build/src/utils/deburr-column-name.d.ts.map +1 -1
- package/build/src/utils/event-emitter.d.ts +1 -1
- package/build/src/utils/event-emitter.d.ts.map +1 -1
- package/build/src/utils/event-emitter.js +2 -2
- package/build/src/utils/file-exists.d.ts.map +1 -1
- package/build/src/utils/format-value.d.ts +9 -8
- package/build/src/utils/format-value.d.ts.map +1 -1
- package/build/src/utils/format-value.js +7 -7
- package/build/src/utils/is-date.d.ts +2 -2
- package/build/src/utils/is-date.d.ts.map +1 -1
- package/build/src/utils/is-date.js +2 -2
- package/build/src/utils/model-scope.d.ts +29 -24
- package/build/src/utils/model-scope.d.ts.map +1 -1
- package/build/src/utils/model-scope.js +11 -11
- package/build/src/utils/mount-prefix.d.ts +2 -2
- package/build/src/utils/mount-prefix.d.ts.map +1 -1
- package/build/src/utils/nest-callbacks.d.ts.map +1 -1
- package/build/src/utils/plain-object.d.ts +3 -3
- package/build/src/utils/plain-object.d.ts.map +1 -1
- package/build/src/utils/plain-object.js +3 -3
- package/build/src/utils/ransack.d.ts +69 -90
- package/build/src/utils/ransack.d.ts.map +1 -1
- package/build/src/utils/ransack.js +36 -36
- package/build/src/utils/rest-args-error.d.ts.map +1 -1
- package/build/src/utils/sha256-hex.d.ts.map +1 -1
- package/build/src/utils/shutdown-lifecycle.d.ts +1 -1
- package/build/src/utils/shutdown-lifecycle.d.ts.map +1 -1
- package/build/src/utils/singularize-model-name.d.ts.map +1 -1
- package/build/src/utils/split-sql-statements.d.ts.map +1 -1
- package/build/src/utils/to-import-specifier.d.ts.map +1 -1
- package/build/src/utils/with-tracked-stack-async-hooks.d.ts +6 -5
- package/build/src/utils/with-tracked-stack-async-hooks.d.ts.map +1 -1
- package/build/src/utils/with-tracked-stack-async-hooks.js +9 -9
- package/build/src/utils/with-tracked-stack.d.ts +6 -5
- package/build/src/utils/with-tracked-stack.d.ts.map +1 -1
- package/build/src/utils/with-tracked-stack.js +7 -7
- package/build/src/velocious-error.d.ts +27 -17
- package/build/src/velocious-error.d.ts.map +1 -1
- package/build/src/velocious-error.js +10 -4
- package/build/sync/conflict-strategy.js +1 -1
- package/build/sync/query-scope.js +7 -7
- package/build/sync/server-change-feed.js +13 -13
- package/build/sync/server-sequence-allocator.js +5 -5
- package/build/sync/signed-sync-envelope-replay-service.js +20 -20
- package/build/sync/stable-json.js +4 -4
- package/build/sync/sync-api-client-types.js +7 -7
- package/build/sync/sync-api-client.js +26 -26
- package/build/sync/sync-change-fanout.js +6 -6
- package/build/sync/sync-client-registry.js +3 -3
- package/build/sync/sync-client-types.js +10 -10
- package/build/sync/sync-client.js +18 -18
- package/build/sync/sync-envelope-replay-service.js +76 -76
- package/build/sync/sync-model-change-feed-service.js +7 -7
- package/build/sync/sync-publish-suppression.js +2 -2
- package/build/sync/sync-publisher-types.js +11 -11
- package/build/sync/sync-publisher.js +19 -19
- package/build/sync/sync-realtime-bridge.js +8 -8
- package/build/sync/sync-replay-upsert-applier.js +16 -16
- package/build/sync/sync-resource-base.js +14 -14
- package/build/sync/sync-scope-attributes.js +1 -1
- package/build/sync/sync-scope-store.js +5 -5
- package/build/sync/sync-websocket-channel.js +5 -5
- package/build/tenants/default-tenant-database-provisioning.js +1 -1
- package/build/tenants/tenant-aggregator.js +13 -13
- package/build/tenants/tenant-handle.js +252 -0
- package/build/tenants/tenant-iterator.js +6 -6
- package/build/tenants/tenant-model-scope.js +132 -0
- package/build/tenants/tenant.js +15 -2
- package/build/testing/browser-test-app.js +2 -2
- package/build/testing/expect-to-change.js +1 -1
- package/build/testing/expect-utils.js +29 -29
- package/build/testing/expect.js +18 -18
- package/build/testing/factory/association-declaration.js +2 -2
- package/build/testing/factory/declarations.js +5 -5
- package/build/testing/factory/definition-builder.js +39 -39
- package/build/testing/factory/evaluation-context.js +16 -16
- package/build/testing/factory/factory-definition.js +2 -2
- package/build/testing/factory/factory-registry.js +34 -34
- package/build/testing/factory/factory-runner.js +8 -8
- package/build/testing/factory/linter.js +2 -2
- package/build/testing/factory/model-contract.js +3 -3
- package/build/testing/factory/sequence.js +2 -2
- package/build/testing/factory/strategies/attributes-for.js +1 -1
- package/build/testing/factory/strategies/base.js +24 -24
- package/build/testing/factory/strategies/build.js +2 -2
- package/build/testing/factory/strategies/create.js +4 -4
- package/build/testing/test-files-finder.js +1 -1
- package/build/testing/test-runner.js +14 -14
- package/build/testing/test.js +19 -17
- package/build/testing/wait-for-event.js +5 -5
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/utils/event-emitter.js +1 -1
- package/build/utils/format-value.js +6 -6
- package/build/utils/is-date.js +1 -1
- package/build/utils/model-scope.js +10 -10
- package/build/utils/plain-object.js +2 -2
- package/build/utils/ransack.js +35 -35
- package/build/utils/with-tracked-stack-async-hooks.js +8 -8
- package/build/utils/with-tracked-stack.js +6 -6
- package/build/velocious-error.js +9 -3
- package/package.json +3 -3
- package/src/application.js +3 -3
- package/src/authorization/ability.js +6 -6
- package/src/authorization/base-resource.js +1 -1
- package/src/background-jobs/client.js +2 -2
- package/src/background-jobs/forked-runner-child.js +4 -4
- package/src/background-jobs/job-runner.js +2 -2
- package/src/background-jobs/job.js +6 -6
- package/src/background-jobs/json-socket.js +1 -1
- package/src/background-jobs/main.js +13 -13
- package/src/background-jobs/normalize-error.js +2 -2
- package/src/background-jobs/pooled-runner-child.js +3 -3
- package/src/background-jobs/scheduler.js +1 -1
- package/src/background-jobs/status-reporter.js +2 -2
- package/src/background-jobs/store.js +23 -23
- package/src/background-jobs/types.js +6 -6
- package/src/background-jobs/web/controller.js +6 -6
- package/src/background-jobs/web/counts-channel.js +1 -1
- package/src/background-jobs/worker.js +8 -8
- package/src/beacon/client.js +3 -3
- package/src/beacon/in-process-client.js +3 -3
- package/src/beacon/types.js +1 -1
- package/src/cli/base-command.js +1 -1
- package/src/cli/commands/console.js +1 -1
- package/src/cli/commands/db/schema/dump.js +1 -1
- package/src/cli/commands/db/schema/load.js +1 -1
- package/src/cli/commands/db/seed.js +1 -1
- package/src/cli/commands/generate/frontend-models.js +1 -1
- package/src/cli/commands/lint/relationships.js +1 -1
- package/src/cli/commands/run-script.js +1 -1
- package/src/cli/commands/runner.js +1 -1
- package/src/cli/index.js +2 -2
- package/src/cli/tenant-database-command-helper.js +2 -2
- package/src/configuration-types.js +48 -47
- package/src/configuration.js +150 -65
- package/src/controller.js +11 -8
- package/src/current.js +2 -2
- package/src/database/annotations-async-hooks.js +3 -3
- package/src/database/annotations.js +1 -1
- package/src/database/drivers/base-column.js +1 -1
- package/src/database/drivers/base-foreign-key.js +1 -1
- package/src/database/drivers/base-table.js +1 -1
- package/src/database/drivers/base.js +18 -18
- package/src/database/drivers/mssql/column.js +1 -1
- package/src/database/drivers/mssql/index.js +2 -2
- package/src/database/drivers/mssql/options.js +1 -1
- package/src/database/drivers/mssql/structure-sql.js +1 -1
- package/src/database/drivers/mssql/table.js +1 -1
- package/src/database/drivers/mysql/column.js +1 -1
- package/src/database/drivers/mysql/index.js +4 -4
- package/src/database/drivers/mysql/options.js +1 -1
- package/src/database/drivers/mysql/query.js +7 -7
- package/src/database/drivers/mysql/structure-sql.js +71 -10
- package/src/database/drivers/pgsql/column.js +1 -1
- package/src/database/drivers/pgsql/index.js +6 -6
- package/src/database/drivers/pgsql/structure-sql.js +1 -1
- package/src/database/drivers/sqlite/base.js +7 -7
- package/src/database/drivers/sqlite/column.js +1 -1
- package/src/database/drivers/sqlite/connection-sql-js.js +1 -1
- package/src/database/drivers/sqlite/foreign-key.js +1 -1
- package/src/database/drivers/sqlite/index.js +1 -1
- package/src/database/drivers/sqlite/index.native.js +2 -2
- package/src/database/drivers/sqlite/index.web.js +2 -2
- package/src/database/drivers/sqlite/query.js +2 -2
- package/src/database/drivers/sqlite/query.native.js +2 -2
- package/src/database/drivers/sqlite/query.web.js +2 -2
- package/src/database/drivers/sqlite/table-rebuilder.js +1 -1
- package/src/database/migration/index.js +2 -2
- package/src/database/migrator/types.js +2 -2
- package/src/database/operation.js +59 -6
- package/src/database/pool/async-tracked-multi-connection.js +75 -24
- package/src/database/pool/base-methods-forward.js +2 -2
- package/src/database/pool/base.js +48 -17
- package/src/database/pool/single-multi-use.js +501 -103
- package/src/database/query/delete-base.js +1 -1
- package/src/database/query/index.js +3 -3
- package/src/database/query/insert-base.js +4 -4
- package/src/database/query/model-class-query.js +39 -39
- package/src/database/query/preloader/belongs-to.js +2 -2
- package/src/database/query/preloader/ensure-model-class-initialized.js +3 -2
- package/src/database/query/preloader/has-many.js +3 -3
- package/src/database/query/preloader/has-one.js +1 -1
- package/src/database/query/preloader.js +9 -2
- package/src/database/query/query-data.js +7 -7
- package/src/database/query/update-base.js +3 -3
- package/src/database/query/upsert-base.js +2 -2
- package/src/database/query/where-model-class-hash.js +13 -13
- package/src/database/query/with-count.js +12 -12
- package/src/database/query-parser/options.js +2 -2
- package/src/database/query-parser/select-parser.js +1 -1
- package/src/database/record/acts-as-list.js +2 -2
- package/src/database/record/attachments/handle.js +6 -6
- package/src/database/record/attachments/normalize-input.js +11 -11
- package/src/database/record/attachments/storage-drivers/filesystem.js +1 -1
- package/src/database/record/attachments/storage-drivers/native.js +5 -5
- package/src/database/record/attachments/storage-drivers/s3.js +10 -10
- package/src/database/record/attachments/store.js +24 -20
- package/src/database/record/auditing.js +123 -29
- package/src/database/record/counter-cache-magnitude.js +11 -11
- package/src/database/record/index.js +227 -174
- package/src/database/record/instance-relationships/base.js +4 -4
- package/src/database/record/instance-relationships/belongs-to.js +1 -1
- package/src/database/record/instance-relationships/has-many.js +3 -3
- package/src/database/record/instance-relationships/has-one.js +1 -1
- package/src/database/record/record-not-found-error.js +1 -0
- package/src/database/record/relationships/base.js +22 -0
- package/src/database/record/state-machine.js +6 -6
- package/src/database/record/validators/base.js +1 -1
- package/src/database/structure-sql-loader.js +3 -3
- package/src/database/table-data/table-column.js +3 -3
- package/src/database/use-live-query.js +3 -3
- package/src/environment-handlers/base.js +56 -37
- package/src/environment-handlers/browser.js +1 -1
- package/src/environment-handlers/node/cli/commands/console.js +4 -4
- package/src/environment-handlers/node/cli/commands/db/seed.js +2 -2
- package/src/environment-handlers/node/cli/commands/generate/base-models.js +1 -1
- package/src/environment-handlers/node/cli/commands/run-script.js +2 -2
- package/src/environment-handlers/node/cli/commands/runner.js +2 -2
- package/src/environment-handlers/node/cli/commands/server.js +1 -1
- package/src/environment-handlers/node.js +36 -36
- package/src/error-logger.js +2 -2
- package/src/error-reporting/request-details.js +32 -32
- package/src/frontend-model-controller.js +215 -213
- package/src/frontend-model-resource/base-resource.js +44 -44
- package/src/frontend-model-resource/velocious-attachment-resource.js +1 -1
- package/src/frontend-models/base.js +146 -142
- package/src/frontend-models/clear-pending-debounced-callback.js +2 -2
- package/src/frontend-models/model-registry.js +4 -4
- package/src/frontend-models/outgoing-event-buffer.js +1 -1
- package/src/frontend-models/preloader.js +1 -1
- package/src/frontend-models/query.js +60 -60
- package/src/frontend-models/resource-definition.js +9 -9
- package/src/frontend-models/transport-serialization.js +27 -27
- package/src/frontend-models/websocket-channel.js +4 -4
- package/src/frontend-models/websocket-publishers.js +1 -1
- package/src/http-client/request.js +1 -1
- package/src/http-client/response.js +1 -1
- package/src/http-server/client/index.js +4 -4
- package/src/http-server/client/params-to-object.js +16 -16
- package/src/http-server/client/request-buffer/index.js +5 -2
- package/src/http-server/client/request-parser.js +2 -2
- package/src/http-server/client/request-runner.js +2 -2
- package/src/http-server/client/request.js +2 -2
- package/src/http-server/client/websocket-request.js +6 -6
- package/src/http-server/client/websocket-session.js +28 -28
- package/src/http-server/cookie.js +2 -2
- package/src/http-server/development-reloader.js +1 -1
- package/src/http-server/index.js +5 -5
- package/src/http-server/remote-address.js +1 -1
- package/src/http-server/server-lock.js +4 -4
- package/src/http-server/websocket-channel-subscribers.js +4 -4
- package/src/http-server/websocket-channel.js +1 -1
- package/src/http-server/websocket-connection.js +3 -3
- package/src/http-server/websocket-event-log-store.js +9 -9
- package/src/http-server/websocket-events-host.js +7 -7
- package/src/http-server/websocket-events.js +4 -4
- package/src/http-server/worker-handler/channel-subscriber-dispatch.js +1 -1
- package/src/http-server/worker-handler/in-process.js +5 -5
- package/src/http-server/worker-handler/index.js +10 -10
- package/src/http-server/worker-handler/worker-thread.js +8 -8
- package/src/logger/base-logger.js +1 -1
- package/src/logger.js +12 -12
- package/src/mailer/backends/smtp.js +3 -3
- package/src/mailer/base.js +14 -14
- package/src/mailer/delivery.js +3 -3
- package/src/mailer/index.js +1 -1
- package/src/mailer.js +1 -1
- package/src/plugins/sqljs-wasm-route-controller.js +1 -1
- package/src/record-payload-values.js +3 -3
- package/src/routes/base-route.js +5 -5
- package/src/routes/basic-route.js +4 -4
- package/src/routes/get-route.js +2 -2
- package/src/routes/hooks/frontend-model-command-route-hook.js +1 -1
- package/src/routes/index.js +3 -3
- package/src/routes/namespace-route.js +1 -1
- package/src/routes/plugin-routes.js +1 -1
- package/src/routes/post-route.js +2 -2
- package/src/routes/resolver.js +5 -5
- package/src/routes/resource-route.js +1 -1
- package/src/sync/conflict-strategy.js +1 -1
- package/src/sync/query-scope.js +7 -7
- package/src/sync/server-change-feed.js +13 -13
- package/src/sync/server-sequence-allocator.js +5 -5
- package/src/sync/signed-sync-envelope-replay-service.js +20 -20
- package/src/sync/stable-json.js +4 -4
- package/src/sync/sync-api-client-types.js +7 -7
- package/src/sync/sync-api-client.js +26 -26
- package/src/sync/sync-change-fanout.js +6 -6
- package/src/sync/sync-client-registry.js +3 -3
- package/src/sync/sync-client-types.js +10 -10
- package/src/sync/sync-client.js +18 -18
- package/src/sync/sync-envelope-replay-service.js +76 -76
- package/src/sync/sync-model-change-feed-service.js +7 -7
- package/src/sync/sync-publish-suppression.js +2 -2
- package/src/sync/sync-publisher-types.js +11 -11
- package/src/sync/sync-publisher.js +19 -19
- package/src/sync/sync-realtime-bridge.js +8 -8
- package/src/sync/sync-replay-upsert-applier.js +16 -16
- package/src/sync/sync-resource-base.js +14 -14
- package/src/sync/sync-scope-attributes.js +1 -1
- package/src/sync/sync-scope-store.js +5 -5
- package/src/sync/sync-websocket-channel.js +5 -5
- package/src/tenants/default-tenant-database-provisioning.js +1 -1
- package/src/tenants/tenant-aggregator.js +13 -13
- package/src/tenants/tenant-handle.js +252 -0
- package/src/tenants/tenant-iterator.js +6 -6
- package/src/tenants/tenant-model-scope.js +132 -0
- package/src/tenants/tenant.js +15 -2
- package/src/testing/browser-test-app.js +2 -2
- package/src/testing/expect-to-change.js +1 -1
- package/src/testing/expect-utils.js +29 -29
- package/src/testing/expect.js +18 -18
- package/src/testing/factory/association-declaration.js +2 -2
- package/src/testing/factory/declarations.js +5 -5
- package/src/testing/factory/definition-builder.js +39 -39
- package/src/testing/factory/evaluation-context.js +16 -16
- package/src/testing/factory/factory-definition.js +2 -2
- package/src/testing/factory/factory-registry.js +34 -34
- package/src/testing/factory/factory-runner.js +8 -8
- package/src/testing/factory/linter.js +2 -2
- package/src/testing/factory/model-contract.js +3 -3
- package/src/testing/factory/sequence.js +2 -2
- package/src/testing/factory/strategies/attributes-for.js +1 -1
- package/src/testing/factory/strategies/base.js +24 -24
- package/src/testing/factory/strategies/build.js +2 -2
- package/src/testing/factory/strategies/create.js +4 -4
- package/src/testing/test-files-finder.js +1 -1
- package/src/testing/test-runner.js +14 -14
- package/src/testing/test.js +19 -17
- package/src/testing/wait-for-event.js +5 -5
- package/src/utils/event-emitter.js +1 -1
- package/src/utils/format-value.js +6 -6
- package/src/utils/is-date.js +1 -1
- package/src/utils/model-scope.js +10 -10
- package/src/utils/plain-object.js +2 -2
- package/src/utils/ransack.js +35 -35
- package/src/utils/with-tracked-stack-async-hooks.js +8 -8
- package/src/utils/with-tracked-stack.js +6 -6
- package/src/velocious-error.js +9 -3
|
@@ -12,7 +12,7 @@ import RequestRunner from "./request-runner.js";
|
|
|
12
12
|
import WebsocketRequest from "./websocket-request.js";
|
|
13
13
|
/**
|
|
14
14
|
* Defines this typedef.
|
|
15
|
-
* @typedef {{type: "subscribe", channel: string, lastEventId?: string, params?: Record<string,
|
|
15
|
+
* @typedef {{type: "subscribe", channel: string, lastEventId?: string, params?: Record<string, ReturnType<typeof JSON.parse>>} | {type: "metadata", data?: Record<string, ReturnType<typeof JSON.parse>>} | {type?: "request", body?: ReturnType<typeof JSON.parse>, headers?: Record<string, ReturnType<typeof JSON.parse>>, id?: string | number | null, method: string, path: string} | Record<string, ReturnType<typeof JSON.parse>>} WebsocketSessionMessage
|
|
16
16
|
*/
|
|
17
17
|
/**
|
|
18
18
|
* @typedef {object} InboundMessageAdmission
|
|
@@ -47,30 +47,30 @@ const WEBSOCKET_MAX_FRAGMENTED_MESSAGE_FRAGMENTS = 1024;
|
|
|
47
47
|
/**
|
|
48
48
|
* Runs subscribe message.
|
|
49
49
|
* @param {WebsocketSessionMessage} message - Raw websocket message.
|
|
50
|
-
* @returns {{type: "subscribe", channel: string, lastEventId?: string, params?: Record<string,
|
|
50
|
+
* @returns {{type: "subscribe", channel: string, lastEventId?: string, params?: Record<string, ReturnType<typeof JSON.parse>>} | null} - Subscribe message when matched.
|
|
51
51
|
*/
|
|
52
52
|
function subscribeMessage(message) {
|
|
53
53
|
return message.type === "subscribe"
|
|
54
|
-
? /** @type {{type: "subscribe", channel: string, lastEventId?: string, params?: Record<string,
|
|
54
|
+
? /** @type {{type: "subscribe", channel: string, lastEventId?: string, params?: Record<string, ReturnType<typeof JSON.parse>>}} */ (message)
|
|
55
55
|
: null;
|
|
56
56
|
}
|
|
57
57
|
/**
|
|
58
58
|
* Runs request message.
|
|
59
59
|
* @param {WebsocketSessionMessage} message - Raw websocket message.
|
|
60
|
-
* @returns {{type?: "request", body?:
|
|
60
|
+
* @returns {{type?: "request", body?: ReturnType<typeof JSON.parse>, headers?: Record<string, ReturnType<typeof JSON.parse>>, id?: string | number | null, method: string, path: string} | null} - Request message when matched.
|
|
61
61
|
*/
|
|
62
62
|
function requestMessage(message) {
|
|
63
63
|
if (message.type && message.type !== "request")
|
|
64
64
|
return null;
|
|
65
|
-
return /** @type {{type?: "request", body?:
|
|
65
|
+
return /** @type {{type?: "request", body?: ReturnType<typeof JSON.parse>, headers?: Record<string, ReturnType<typeof JSON.parse>>, id?: string | number | null, method: string, path: string}} */ (message);
|
|
66
66
|
}
|
|
67
67
|
/**
|
|
68
68
|
* Compares two identity values from `getWebsocketSessionIdentityResolver`.
|
|
69
69
|
* Nullish values compare equal to each other but not to a real identity.
|
|
70
70
|
* Plain objects are compared via JSON round-trip so apps can return a
|
|
71
71
|
* `{userId, tenantId}`-style object without building their own equality.
|
|
72
|
-
* @param {
|
|
73
|
-
* @param {
|
|
72
|
+
* @param {ReturnType<typeof JSON.parse>} a - Paused-time identity.
|
|
73
|
+
* @param {ReturnType<typeof JSON.parse>} b - Resume-time identity.
|
|
74
74
|
* @returns {boolean} - True when the two identities are considered the same caller.
|
|
75
75
|
*/
|
|
76
76
|
function identitiesMatch(a, b) {
|
|
@@ -132,13 +132,13 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
132
132
|
this._inboundBacklogOverloaded = false;
|
|
133
133
|
/**
|
|
134
134
|
* Narrows the runtime value to the documented type.
|
|
135
|
-
* @type {Record<string,
|
|
135
|
+
* @type {Record<string, ReturnType<typeof JSON.parse>>} */
|
|
136
136
|
this._metadata = {};
|
|
137
137
|
/**
|
|
138
138
|
* Long-lived per-session state bag. Stable across reconnects once
|
|
139
139
|
* grace-period resumption lands in Phase 2; today it just lives
|
|
140
140
|
* for the duration of the underlying socket.
|
|
141
|
-
* @type {Record<string,
|
|
141
|
+
* @type {Record<string, ReturnType<typeof JSON.parse>>}
|
|
142
142
|
*/
|
|
143
143
|
this.data = {};
|
|
144
144
|
/**
|
|
@@ -164,7 +164,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
164
164
|
this._paused = false;
|
|
165
165
|
/**
|
|
166
166
|
* Narrows the runtime value to the documented type.
|
|
167
|
-
* @type {Array
|
|
167
|
+
* @type {Array<ReturnType<typeof JSON.parse>>} - frames produced while paused; flushed on resume.
|
|
168
168
|
*/
|
|
169
169
|
this._outboundQueue = [];
|
|
170
170
|
/**
|
|
@@ -185,7 +185,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
185
185
|
* time by `getWebsocketSessionIdentityResolver`. Awaited at resume
|
|
186
186
|
* time to compare against the fresh caller's identity. Undefined
|
|
187
187
|
* on a live (non-paused) session.
|
|
188
|
-
* @type {Promise
|
|
188
|
+
* @type {Promise<ReturnType<typeof JSON.parse>> | undefined}
|
|
189
189
|
*/
|
|
190
190
|
this._resumeIdentityPromise = undefined;
|
|
191
191
|
/**
|
|
@@ -253,7 +253,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
253
253
|
}
|
|
254
254
|
/**
|
|
255
255
|
* Runs get metadata.
|
|
256
|
-
* @returns {Record<string,
|
|
256
|
+
* @returns {Record<string, ReturnType<typeof JSON.parse>>} - Client-provided metadata (defensive copy).
|
|
257
257
|
*/
|
|
258
258
|
getMetadata() {
|
|
259
259
|
return { ...this._metadata };
|
|
@@ -313,7 +313,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
313
313
|
/**
|
|
314
314
|
* Runs send event.
|
|
315
315
|
* @param {string} channel - Channel name.
|
|
316
|
-
* @param {
|
|
316
|
+
* @param {ReturnType<typeof JSON.parse>} payload - Payload data.
|
|
317
317
|
* @param {{createdAt?: string, eventId?: string, replayed?: boolean, sequence?: number}} [options] - Event metadata.
|
|
318
318
|
* @returns {Promise<void>} - Resolves when complete.
|
|
319
319
|
*/
|
|
@@ -435,15 +435,15 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
435
435
|
return true;
|
|
436
436
|
if (error instanceof VelociousError && error.safeToExpose)
|
|
437
437
|
return true;
|
|
438
|
-
const annotatedError = /** @type {Error & {errorType?: string, velocious?: Record<string,
|
|
438
|
+
const annotatedError = /** @type {Error & {errorType?: string, velocious?: Record<string, ReturnType<typeof JSON.parse>>}} */ (error);
|
|
439
439
|
if (isPlainObject(annotatedError.velocious))
|
|
440
440
|
return true;
|
|
441
441
|
return typeof annotatedError.errorType === "string" && annotatedError.errorType.length > 0;
|
|
442
442
|
}
|
|
443
443
|
/**
|
|
444
444
|
* Reports one unexpected WebSocket dispatch failure and returns its normalized Error.
|
|
445
|
-
* @param {
|
|
446
|
-
* @param {Record<string,
|
|
445
|
+
* @param {ReturnType<typeof JSON.parse>} caughtError - Caught dispatch failure.
|
|
446
|
+
* @param {Record<string, ReturnType<typeof JSON.parse>>} context - Structured dispatch context.
|
|
447
447
|
* @returns {Error} - Normalized error for existing logs and client responses.
|
|
448
448
|
*/
|
|
449
449
|
_reportUnexpectedDispatchError(caughtError, context) {
|
|
@@ -552,7 +552,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
552
552
|
return;
|
|
553
553
|
}
|
|
554
554
|
if (message.type === "metadata") {
|
|
555
|
-
const metadataPayload = /** @type {{data?: Record<string,
|
|
555
|
+
const metadataPayload = /** @type {{data?: Record<string, ReturnType<typeof JSON.parse>>}} */ (message);
|
|
556
556
|
this._metadata = metadataPayload.data && typeof metadataPayload.data === "object" ? { ...metadataPayload.data } : {};
|
|
557
557
|
for (const { subscription } of this._channelSubscriptions.values()) {
|
|
558
558
|
if (typeof subscription.onMetadataChanged === "function") {
|
|
@@ -1097,7 +1097,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1097
1097
|
/**
|
|
1098
1098
|
* Runs subscribe to channel.
|
|
1099
1099
|
* @param {string} channel - Channel name.
|
|
1100
|
-
* @param {{acknowledge?: boolean, channelHandler?: import("../websocket-channel.js").default, lastEventId?: string, params?: Record<string,
|
|
1100
|
+
* @param {{acknowledge?: boolean, channelHandler?: import("../websocket-channel.js").default, lastEventId?: string, params?: Record<string, ReturnType<typeof JSON.parse>>, subscriptionChannel?: string}} [options] - Subscribe options.
|
|
1101
1101
|
* @returns {Promise<boolean>} - Whether the subscription was added.
|
|
1102
1102
|
*/
|
|
1103
1103
|
async subscribeToChannel(channel, { acknowledge = true, channelHandler, lastEventId, params, subscriptionChannel } = {}) {
|
|
@@ -1199,7 +1199,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1199
1199
|
* The returned promise is stored at pause time and awaited at
|
|
1200
1200
|
* resume time so we can reject resume attempts from a different
|
|
1201
1201
|
* authenticated caller (signed out, swapped user, expired cookie).
|
|
1202
|
-
* @returns {Promise
|
|
1202
|
+
* @returns {Promise<ReturnType<typeof JSON.parse>>} - Captured authenticated identity for resume validation.
|
|
1203
1203
|
*/
|
|
1204
1204
|
async _captureResumeIdentity() {
|
|
1205
1205
|
const resolver = this.configuration.getWebsocketSessionIdentityResolver?.();
|
|
@@ -1272,7 +1272,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1272
1272
|
* created one whose socket just connected) transfers state from
|
|
1273
1273
|
* the paused session and instructs the client via
|
|
1274
1274
|
* `session-resumed` or `session-gone`.
|
|
1275
|
-
* @param {Record<string,
|
|
1275
|
+
* @param {Record<string, ReturnType<typeof JSON.parse>>} message - Session-resume frame containing the paused session identifier.
|
|
1276
1276
|
* @returns {Promise<void>}
|
|
1277
1277
|
*/
|
|
1278
1278
|
async _handleSessionResume(message) {
|
|
@@ -1371,7 +1371,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1371
1371
|
* registered connection class, stores it on `_connections`, and
|
|
1372
1372
|
* fires `onConnect()`. Sends `connection-opened` on success or
|
|
1373
1373
|
* `connection-error` on failure.
|
|
1374
|
-
* @param {Record<string,
|
|
1374
|
+
* @param {Record<string, ReturnType<typeof JSON.parse>>} message - Connection-open frame naming the connection type and identifier.
|
|
1375
1375
|
* @returns {Promise<void>}
|
|
1376
1376
|
*/
|
|
1377
1377
|
async _handleConnectionOpen(message) {
|
|
@@ -1418,7 +1418,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1418
1418
|
}
|
|
1419
1419
|
/**
|
|
1420
1420
|
* Handles a `{type: "connection-message"}` from the client.
|
|
1421
|
-
* @param {Record<string,
|
|
1421
|
+
* @param {Record<string, ReturnType<typeof JSON.parse>>} message - Connection-message frame containing the target identifier and body.
|
|
1422
1422
|
* @returns {Promise<void>}
|
|
1423
1423
|
*/
|
|
1424
1424
|
async _handleConnectionMessage(message) {
|
|
@@ -1446,7 +1446,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1446
1446
|
/**
|
|
1447
1447
|
* Handles a `{type: "connection-close"}` from the client — fires
|
|
1448
1448
|
* `onClose("client_close")` and confirms with `connection-closed`.
|
|
1449
|
-
* @param {Record<string,
|
|
1449
|
+
* @param {Record<string, ReturnType<typeof JSON.parse>>} message - Connection-close frame containing the target identifier.
|
|
1450
1450
|
* @returns {Promise<void>}
|
|
1451
1451
|
*/
|
|
1452
1452
|
async _handleConnectionClose(message) {
|
|
@@ -1476,7 +1476,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1476
1476
|
* Handles `{type: "channel-subscribe"}` — runs `canSubscribe()`,
|
|
1477
1477
|
* registers with the Configuration's global routing registry on
|
|
1478
1478
|
* success, and sends `channel-subscribed` or `channel-error`.
|
|
1479
|
-
* @param {Record<string,
|
|
1479
|
+
* @param {Record<string, ReturnType<typeof JSON.parse>>} message - Channel-subscribe frame describing the requested subscription.
|
|
1480
1480
|
* @returns {Promise<void>}
|
|
1481
1481
|
*/
|
|
1482
1482
|
async _handleChannelSubscribe(message) {
|
|
@@ -1586,7 +1586,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1586
1586
|
/**
|
|
1587
1587
|
* Handles `{type: "channel-unsubscribe"}` from the client — calls
|
|
1588
1588
|
* `unsubscribed()` and sends `channel-unsubscribed`.
|
|
1589
|
-
* @param {Record<string,
|
|
1589
|
+
* @param {Record<string, ReturnType<typeof JSON.parse>>} message - Channel-unsubscribe frame containing the subscription identifier.
|
|
1590
1590
|
* @returns {Promise<void>}
|
|
1591
1591
|
*/
|
|
1592
1592
|
async _handleChannelUnsubscribe(message) {
|
|
@@ -1706,7 +1706,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1706
1706
|
}
|
|
1707
1707
|
/**
|
|
1708
1708
|
* Runs handle channel subscription.
|
|
1709
|
-
* @param {{channel: string, lastEventId?: string, params?: Record<string,
|
|
1709
|
+
* @param {{channel: string, lastEventId?: string, params?: Record<string, ReturnType<typeof JSON.parse>>}} args - Subscription args.
|
|
1710
1710
|
* @returns {Promise<void>} - Resolves when complete.
|
|
1711
1711
|
*/
|
|
1712
1712
|
async _handleChannelSubscription({ channel, lastEventId, params }) {
|
|
@@ -1764,7 +1764,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1764
1764
|
* @param {string} args.channel - Internal channel name.
|
|
1765
1765
|
* @param {string | undefined} args.lastEventId - Last received event id.
|
|
1766
1766
|
* @param {string} args.subscriptionChannel - Client-facing channel name.
|
|
1767
|
-
* @param {Record<string,
|
|
1767
|
+
* @param {Record<string, ReturnType<typeof JSON.parse>> | undefined} args.subscriptionParams - Client-facing params.
|
|
1768
1768
|
* @returns {Promise<false | {buffered: boolean, ceilingSequence: number, checkpointSequence: number, replaying: boolean} | null>} - Replay state.
|
|
1769
1769
|
*/
|
|
1770
1770
|
async _prepareReplayState({ channel, lastEventId, subscriptionChannel, subscriptionParams }) {
|
|
@@ -1832,7 +1832,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
1832
1832
|
}
|
|
1833
1833
|
/**
|
|
1834
1834
|
* Runs resolve tenant.
|
|
1835
|
-
* @param {{channel?: string, params?: Record<string,
|
|
1835
|
+
* @param {{channel?: string, params?: Record<string, ReturnType<typeof JSON.parse>>}} args - Tenant resolution args.
|
|
1836
1836
|
* @returns {Promise<string | null | undefined>} - Resolved tenant.
|
|
1837
1837
|
*/
|
|
1838
1838
|
async _resolveTenant({ channel, params }) {
|
|
@@ -2041,4 +2041,4 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
2041
2041
|
}
|
|
2042
2042
|
}
|
|
2043
2043
|
}
|
|
2044
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LXNlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1zZXNzaW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ3hDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFFckMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFBO0FBQ2hFLE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sWUFBWSxNQUFNLDhCQUE4QixDQUFBO0FBQ3ZELE9BQU8sYUFBYSxNQUFNLDZCQUE2QixDQUFBO0FBQ3ZELE9BQU8sY0FBYyxNQUFNLDBCQUEwQixDQUFBO0FBQ3JELE9BQU8sZ0JBQWdCLE1BQU0seUJBQXlCLENBQUE7QUFDdEQsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0saUNBQWlDLENBQUE7QUFDeEYsT0FBTyxhQUFhLE1BQU0scUJBQXFCLENBQUE7QUFDL0MsT0FBTyxnQkFBZ0IsTUFBTSx3QkFBd0IsQ0FBQTtBQUVyRDs7O0dBR0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7O0dBSUc7QUFFSCxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQTtBQUNsQyxNQUFNLDZCQUE2QixHQUFHLEdBQUcsQ0FBQTtBQUN6QyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUNqQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQTtBQUNuQyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQTtBQUNsQyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUNqQyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUVqQyxNQUFNLGdDQUFnQyxHQUFHLElBQUksQ0FBQTtBQUM3QyxNQUFNLHNDQUFzQyxHQUFHLGtDQUFrQyxD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QUksVUFBVSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDdEMsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUNwRCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUMzQyxDQUFDO1lBQ0gsQ0FBQztZQUFDLE9BQU8sV0FBVyxFQUFFLENBQUM7Z0JBQ3JCLE1BQU0sa0JBQWtCLEdBQUcsV0FBVyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFBO2dCQUNuRyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsV0FBVyxFQUFFO29CQUM3RCxLQUFLLEVBQUUsNEJBQTRCO2lCQUNwQyxDQUFDLENBQUE7Z0JBRUYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxrQ0FBa0MsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO2dCQUNwRSxJQUFJLENBQUMsUUFBUSxDQUFDO29CQUNaLEtBQUssRUFBRSxrQkFBa0I7b0JBQ3pCLElBQUksRUFBRSxPQUFPO2lCQUNkLENBQUMsQ0FBQTtZQUNKLENBQUM7b0JBQVMsQ0FBQztnQkFDVCxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQy9DLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tIFwibm9kZTpjcnlwdG9cIlxuaW1wb3J0IHsgZW5zdXJlRXJyb3IgfSBmcm9tIFwidHlwYW5pY1wiXG5cbmltcG9ydCB7IFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCIuLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIlxuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vLi4vbG9nZ2VyLmpzXCJcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcIi4uLy4uL3V0aWxzL2V2ZW50LWVtaXR0ZXIuanNcIlxuaW1wb3J0IGlzUGxhaW5PYmplY3QgZnJvbSBcIi4uLy4uL3V0aWxzL3BsYWluLW9iamVjdC5qc1wiXG5pbXBvcnQgVmVsb2Npb3VzRXJyb3IgZnJvbSBcIi4uLy4uL3ZlbG9jaW91cy1lcnJvci5qc1wiXG5pbXBvcnQgV2Vic29ja2V0Q2hhbm5lbCBmcm9tIFwiLi4vd2Vic29ja2V0LWNoYW5uZWwuanNcIlxuaW1wb3J0IHsgd2Vic29ja2V0RXZlbnRMb2dTdG9yZUZvckNvbmZpZ3VyYXRpb24gfSBmcm9tIFwiLi4vd2Vic29ja2V0LWV2ZW50LWxvZy1zdG9yZS5qc1wiXG5pbXBvcnQgUmVxdWVzdFJ1bm5lciBmcm9tIFwiLi9yZXF1ZXN0LXJ1bm5lci5qc1wiXG5pbXBvcnQgV2Vic29ja2V0UmVxdWVzdCBmcm9tIFwiLi93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiXG5cbi8qKlxuICogRGVmaW5lcyB0aGlzIHR5cGVkZWYuXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwic3Vic2NyaWJlXCIsIGNoYW5uZWw6IHN0cmluZywgbGFzdEV2ZW50SWQ/OiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsID8+fSB8IHt0eXBlOiBcIm1ldGFkYXRhXCIsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCA/Pn0gfCB7dHlwZT86IFwicmVxdWVzdFwiLCBib2R5PzogPywgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsID8+LCBpZD86IHN0cmluZyB8IG51bWJlciB8IG51bGwsIG1ldGhvZDogc3RyaW5nLCBwYXRoOiBzdHJpbmd9IHwgUmVjb3JkPHN0cmluZywgPz59IFdlYnNvY2tldFNlc3Npb25NZXNzYWdlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJbmJvdW5kTWVzc2FnZUFkbWlzc2lvblxuICogQHByb3BlcnR5IHtudW1iZXJ9IGJ5dGVMZW5ndGggLSBFeGFjdCByYXcgdGV4dCBwYXlsb2FkIGJ5dGVzIGNoYXJnZWQgdG8gdGhpcyBhZG1pc3Npb24uXG4gKiBAcHJvcGVydHkge251bWJlcn0gZ2VuZXJhdGlvbiAtIEFjY291bnRpbmcgZ2VuZXJhdGlvbiBhY3RpdmUgd2hlbiBhZG1pdHRlZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVsZWFzZWQgLSBXaGV0aGVyIHRoaXMgYWRtaXNzaW9uIGhhcyBhbHJlYWR5IGJlZW4gcmVsZWFzZWQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJbmJvdW5kTWVzc2FnZVdvcmtcbiAqIEBwcm9wZXJ0eSB7SW5ib3VuZE1lc3NhZ2VBZG1pc3Npb259IGFkbWlzc2lvbiAtIEFkbWlzc2lvbiBvd25lcnNoaXAuXG4gKiBAcHJvcGVydHkge1dlYnNvY2tldFNlc3Npb25NZXNzYWdlfSBtZXNzYWdlIC0gRGVjb2RlZCBjbGllbnQgbWVzc2FnZS5cbiAqL1xuXG5jb25zdCBXRUJTT0NLRVRfRklOQUxfRlJBTUUgPSAweDgwXG5jb25zdCBXRUJTT0NLRVRfT1BDT0RFX0NPTlRJTlVBVElPTiA9IDB4MFxuY29uc3QgV0VCU09DS0VUX09QQ09ERV9URVhUID0gMHgxXG5jb25zdCBXRUJTT0NLRVRfT1BDT0RFX0JJTkFSWSA9IDB4MlxuY29uc3QgV0VCU09DS0VUX09QQ09ERV9DTE9TRSA9IDB4OFxuY29uc3QgV0VCU09DS0VUX09QQ09ERV9QSU5HID0gMHg5XG5jb25zdCBXRUJTT0NLRVRfT1BDT0RFX1BPTkcgPSAweEFcblxuY29uc3QgV0VCU09DS0VUX0NMT1NFX1BPTElDWV9WSU9MQVRJT04gPSAxMDA4XG5jb25zdCBXRUJTT0NLRVRfSU5CT1VORF9CQUNLTE9HX0NMT1NFX1JFQVNPTiA9IFwiSW5ib3VuZCBtZXNzYWdlIGJhY2tsb2cgZXhjZWVkZWRcIlxuY29uc3QgV0VCU09DS0VUX01BWF9DTE9TRV9SRUFTT05fQllURVMgPSAxMjNcblxuLyoqIENhcCBvbiB0aGUgcGF1c2VkIG91dGJvdW5kIHF1ZXVlOyBvbGRlc3QgZnJhbWVzIGRyb3Agb24gb3ZlcmZsb3cuICovXG5jb25zdCBXRUJTT0NLRVRfUEFVU0VEX1FVRVVFX0NBUCA9IDEwMDBcblxuLyoqIENhcCBvbiB0b3RhbCBieXRlcyBidWZmZXJlZCBmb3IgYSBzaW5nbGUgZnJhZ21lbnRlZCBtZXNzYWdlLiAqL1xuY29uc3QgV0VCU09DS0VUX01BWF9GUkFHTUVOVEVEX01FU1NBR0VfQllURVMgPSAxNiAqIDEwMjQgKiAxMDI0XG5cbi8qKiBDYXAgb24gcGF5bG9hZCBieXRlcyBidWZmZXJlZCBmb3IgYSBzaW5nbGUgZmluYWwgZGF0YSBmcmFtZS4gKi9cbmNvbnN0IFdFQlNPQ0tFVF9NQVhfRklOQUxfRlJBTUVfQllURVMgPSBXRUJTT0NLRVRfTUFYX0ZSQUdNRU5URURfTUVTU0FHRV9CWVRFU1xuXG5jb25zdCBXRUJTT0NLRVRfTUFYX0lOQk9VTkRfRlJBTUVfQllURVNfQklHSU5UID0gQmlnSW50KFdFQlNPQ0tFVF9NQVhfRklOQUxfRlJBTUVfQllURVMpXG5cbi8qKiBDYXAgb24gZnJhZ21lbnQgY291bnQgZm9yIGEgc2luZ2xlIGZyYWdtZW50ZWQgbWVzc2FnZS4gKi9cbmNvbnN0IFdFQlNPQ0tFVF9NQVhfRlJBR01FTlRFRF9NRVNTQUdFX0ZSQUdNRU5UUyA9IDEwMjRcblxuLyoqXG4gKiBSdW5zIHN1YnNjcmliZSBtZXNzYWdlLlxuICogQHBhcmFtIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZX0gbWVzc2FnZSAtIFJhdyB3ZWJzb2NrZXQgbWVzc2FnZS5cbiAqIEByZXR1cm5zIHt7dHlwZTogXCJzdWJzY3JpYmVcIiwgY2hhbm5lbDogc3RyaW5nLCBsYXN0RXZlbnRJZD86IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgPz59IHwgbnVsbH0gLSBTdWJzY3JpYmUgbWVzc2FnZSB3aGVuIG1hdGNoZWQuXG4gKi9cbmZ1bmN0aW9uIHN1YnNjcmliZU1lc3NhZ2UobWVzc2FnZSkge1xuICByZXR1cm4gbWVzc2FnZS50eXBlID09PSBcInN1YnNjcmliZVwiXG4gICAgPyAvKiogQHR5cGUge3t0eXBlOiBcInN1YnNjcmliZVwiLCBjaGFubmVsOiBzdHJpbmcsIGxhc3RFdmVudElkPzogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCA/Pn19ICovIChtZXNzYWdlKVxuICAgIDogbnVsbFxufVxuXG4vKipcbiAqIFJ1bnMgcmVxdWVzdCBtZXNzYWdlLlxuICogQHBhcmFtIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZX0gbWVzc2FnZSAtIFJhdyB3ZWJzb2NrZXQgbWVzc2FnZS5cbiAqIEByZXR1cm5zIHt7dHlwZT86IFwicmVxdWVzdFwiLCBib2R5PzogPywgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsID8+LCBpZD86IHN0cmluZyB8IG51bWJlciB8IG51bGwsIG1ldGhvZDogc3RyaW5nLCBwYXRoOiBzdHJpbmd9IHwgbnVsbH0gLSBSZXF1ZXN0IG1lc3NhZ2Ugd2hlbiBtYXRjaGVkLlxuICovXG5mdW5jdGlvbiByZXF1ZXN0TWVzc2FnZShtZXNzYWdlKSB7XG4gIGlmIChtZXNzYWdlLnR5cGUgJiYgbWVzc2FnZS50eXBlICE9PSBcInJlcXVlc3RcIikgcmV0dXJuIG51bGxcblxuICByZXR1cm4gLyoqIEB0eXBlIHt7dHlwZT86IFwicmVxdWVzdFwiLCBib2R5PzogPywgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsID8+LCBpZD86IHN0cmluZyB8IG51bWJlciB8IG51bGwsIG1ldGhvZDogc3RyaW5nLCBwYXRoOiBzdHJpbmd9fSAqLyAobWVzc2FnZSlcbn1cblxuLyoqXG4gKiBDb21wYXJlcyB0d28gaWRlbnRpdHkgdmFsdWVzIGZyb20gYGdldFdlYnNvY2tldFNlc3Npb25JZGVudGl0eVJlc29sdmVyYC5cbiAqIE51bGxpc2ggdmFsdWVzIGNvbXBhcmUgZXF1YWwgdG8gZWFjaCBvdGhlciBidXQgbm90IHRvIGEgcmVhbCBpZGVudGl0eS5cbiAqIFBsYWluIG9iamVjdHMgYXJlIGNvbXBhcmVkIHZpYSBKU09OIHJvdW5kLXRyaXAgc28gYXBwcyBjYW4gcmV0dXJuIGFcbiAqIGB7dXNlcklkLCB0ZW5hbnRJZH1gLXN0eWxlIG9iamVjdCB3aXRob3V0IGJ1aWxkaW5nIHRoZWlyIG93biBlcXVhbGl0eS5cbiAqIEBwYXJhbSB7P30gYSAtIFBhdXNlZC10aW1lIGlkZW50aXR5LlxuICogQHBhcmFtIHs/fSBiIC0gUmVzdW1lLXRpbWUgaWRlbnRpdHkuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUcnVlIHdoZW4gdGhlIHR3byBpZGVudGl0aWVzIGFyZSBjb25zaWRlcmVkIHRoZSBzYW1lIGNhbGxlci5cbiAqL1xuZnVuY3Rpb24gaWRlbnRpdGllc01hdGNoKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlXG4gIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gZmFsc2VcbiAgaWYgKHR5cGVvZiBhICE9PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBiICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2VcblxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhKSA9PT0gSlNPTi5zdHJpbmdpZnkoYilcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzSHR0cFNlcnZlckNsaWVudFdlYnNvY2tldFNlc3Npb24ge1xuICBldmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKClcbiAgc3Vic2NyaXB0aW9ucyA9IG5ldyBTZXQoKVxuICBjaGFubmVscyA9IG5ldyBTZXQoKVxuICBzdWJzY3JpcHRpb25IYW5kbGVycyA9IG5ldyBNYXAoKVxuICBoYW5kbGVyU3Vic2NyaXB0aW9ucyA9IG5ldyBNYXAoKVxuICBjaGFubmVsVGVuYW50cyA9IG5ldyBNYXAoKVxuICBjaGFubmVsUmVwbGF5U3RhdGVzID0gbmV3IE1hcCgpXG4gIC8qKlxuICAgKiBNZXNzYWdlIHF1ZXVlLlxuICAgKiBAdHlwZSB7SW5ib3VuZE1lc3NhZ2VXb3JrW119ICovXG4gIG1lc3NhZ2VRdWV1ZSA9IFtdXG5cbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5jbGllbnQgLSBDbGllbnQgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuL3dlYnNvY2tldC1yZXF1ZXN0LmpzXCIpLmRlZmF1bHR9IFthcmdzLnVwZ3JhZGVSZXF1ZXN0XSAtIEluaXRpYWwgd2Vic29ja2V0IHVwZ3JhZGUgcmVxdWVzdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLldlYnNvY2tldE1lc3NhZ2VIYW5kbGVyfSBbYXJncy5tZXNzYWdlSGFuZGxlcl0gLSBPcHRpb25hbCByYXcgbWVzc2FnZSBoYW5kbGVyLlxuICAgKiBAcGFyYW0ge1Byb21pc2U8aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5XZWJzb2NrZXRNZXNzYWdlSGFuZGxlciB8IHZvaWQ+fSBbYXJncy5tZXNzYWdlSGFuZGxlclByb21pc2VdIC0gT3B0aW9uYWwgcmF3IG1lc3NhZ2UgaGFuZGxlciBwcm9taXNlLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NsaWVudCwgY29uZmlndXJhdGlvbiwgdXBncmFkZVJlcXVlc3QsIG1lc3NhZ2VIYW5kbGVyLCBtZXNzYWdlSGFuZGxlclByb21pc2V9KSB7XG4gICAgLyoqIEB0eXBlIHtCdWZmZXJbXX0gKi9cbiAgICB0aGlzLl9idWZmZXJDaHVua3MgPSBbXVxuICAgIHRoaXMuX2J1ZmZlckNodW5rSW5kZXggPSAwXG4gICAgdGhpcy5fYnVmZmVyQ2h1bmtPZmZzZXQgPSAwXG4gICAgdGhpcy5fYnVmZmVyZWRCeXRlcyA9IDBcbiAgICB0aGlzLl9idWZmZXJlZEZyYW1lQ29weUJ5dGVzID0gMFxuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50XG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblxuICAgIHRoaXMudXBncmFkZVJlcXVlc3QgPSB1cGdyYWRlUmVxdWVzdFxuICAgIHRoaXMubWVzc2FnZUhhbmRsZXIgPSBtZXNzYWdlSGFuZGxlclxuICAgIHRoaXMubWVzc2FnZUhhbmRsZXJQcm9taXNlID0gbWVzc2FnZUhhbmRsZXJQcm9taXNlXG4gICAgdGhpcy5wZW5kaW5nTWVzc2FnZUhhbmRsZXIgPSBCb29sZWFuKG1lc3NhZ2VIYW5kbGVyUHJvbWlzZSlcbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcylcbiAgICBjb25zdCBpbmJvdW5kUXVldWVMaW1pdHMgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0SW5ib3VuZFF1ZXVlTGltaXRzKClcblxuICAgIHRoaXMuX2luYm91bmRNYXhQZW5kaW5nQnl0ZXMgPSBpbmJvdW5kUXVldWVMaW1pdHMubWF4Qnl0ZXNcbiAgICB0aGlzLl9pbmJvdW5kTWF4UGVuZGluZ01lc3NhZ2VzID0gaW5ib3VuZFF1ZXVlTGltaXRzLm1heE1lc3NhZ2VzXG4gICAgdGhpcy5faW5ib3VuZFBlbmRpbmdCeXRlcyA9IDBcbiAgICB0aGlzLl9pbmJvdW5kUGVuZGluZ01lc3NhZ2VzID0gMFxuICAgIHRoaXMuX2luYm91bmRBY2NvdW50aW5nR2VuZXJhdGlvbiA9IDBcbiAgICB0aGlzLl9pbmJvdW5kQ2xvc2VkID0gZmFsc2VcbiAgICB0aGlzLl9pbmJvdW5kQmFja2xvZ092ZXJsb2FkZWQgPSBmYWxzZVxuXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi9cbiAgICB0aGlzLl9tZXRhZGF0YSA9IHt9XG5cbiAgICAvKipcbiAgICAgKiBMb25nLWxpdmVkIHBlci1zZXNzaW9uIHN0YXRlIGJhZy4gU3RhYmxlIGFjcm9zcyByZWNvbm5lY3RzIG9uY2VcbiAgICAgKiBncmFjZS1wZXJpb2QgcmVzdW1wdGlvbiBsYW5kcyBpbiBQaGFzZSAyOyB0b2RheSBpdCBqdXN0IGxpdmVzXG4gICAgICogZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQuXG4gICAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fVxuICAgICAqL1xuICAgIHRoaXMuZGF0YSA9IHt9XG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3dlYnNvY2tldC1jb25uZWN0aW9uLmpzXCIpLmRlZmF1bHQ+fSAqL1xuICAgIHRoaXMuX2Nvbm5lY3Rpb25zID0gbmV3IE1hcCgpXG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge01hcDxzdHJpbmcsIHtjaGFubmVsVHlwZTogc3RyaW5nLCBzdWJzY3JpcHRpb246IGltcG9ydChcIi4uL3dlYnNvY2tldC1jaGFubmVsLmpzXCIpLmRlZmF1bHR9Pn0gKi9cbiAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucyA9IG5ldyBNYXAoKVxuXG4gICAgLyoqXG4gICAgICogVW5pcXVlIGlkIGFzc2lnbmVkIHRvIHRoaXMgc2Vzc2lvbiBvbiBmaXJzdCBjb25uZWN0LiBTZW50IHRvIHRoZVxuICAgICAqIGNsaWVudCB2aWEgYHNlc3Npb24tZXN0YWJsaXNoZWRgOyB0aGUgY2xpZW50IGVjaG9lcyBpdCBiYWNrIHZpYVxuICAgICAqIGBzZXNzaW9uLXJlc3VtZWAgYWZ0ZXIgYSBXUyBkcm9wIHRvIHJlYXR0YWNoIHRvIHRoaXMgc2Vzc2lvblxuICAgICAqIHdpdGhpbiB0aGUgZ3JhY2UgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5zZXNzaW9uSWQgPSByYW5kb21VVUlEKClcblxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn0gLSB0cnVlIGFmdGVyIGBfaGFuZGxlQ2xvc2VgIHBhdXNlcyBpbnN0ZWFkIG9mIHRlYXJpbmcgZG93bi5cbiAgICAgKi9cbiAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZVxuXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAqIEB0eXBlIHtBcnJheTw/Pn0gLSBmcmFtZXMgcHJvZHVjZWQgd2hpbGUgcGF1c2VkOyBmbHVzaGVkIG9uIHJlc3VtZS5cbiAgICAgKi9cbiAgICB0aGlzLl9vdXRib3VuZFF1ZXVlID0gW11cblxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0IHwgbnVsbH0gKi9cbiAgICB0aGlzLnNvY2tldCA9IG51bGxcblxuICAgIC8qKlxuICAgICAqIFRhaWwgb2YgYSBwZXItc2Vzc2lvbiBwcm9taXNlIGNoYWluIHRoYXQgc2VyaWFsaXplcyBtZXNzYWdlXG4gICAgICogaGFuZGxpbmcuIFByZXZlbnRzIHJhY2VzIHdoZXJlIG1lc3NhZ2UgQiByZWFkcyBgc2Vzc2lvbi5kYXRhYFxuICAgICAqIGJlZm9yZSBtZXNzYWdlIEEncyBoYW5kbGVyIGZpbmlzaGVzIHdyaXRpbmcgaXQgKGUuZy4gYVxuICAgICAqIGNvbm5lY3Rpb24tbWVzc2FnZSBzZXR0aW5nIHRoZSBsb2NhbGUgdnMuIGEgc3Vic2VxdWVudCByZXF1ZXN0XG4gICAgICogd2hvc2UgYXJvdW5kUmVxdWVzdCB3cmFwcGVyIHJlYWRzIGl0KS5cbiAgICAgKiBAdHlwZSB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKi9cbiAgICB0aGlzLl9tZXNzYWdlQ2hhaW4gPSBQcm9taXNlLnJlc29sdmUoKVxuXG4gICAgLyoqXG4gICAgICogUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBhdXRoIGlkZW50aXR5IGNhcHR1cmVkIGF0IHBhdXNlXG4gICAgICogdGltZSBieSBgZ2V0V2Vic29ja2V0U2Vzc2lvbklkZW50aXR5UmVzb2x2ZXJgLiBBd2FpdGVkIGF0IHJlc3VtZVxuICAgICAqIHRpbWUgdG8gY29tcGFyZSBhZ2FpbnN0IHRoZSBmcmVzaCBjYWxsZXIncyBpZGVudGl0eS4gVW5kZWZpbmVkXG4gICAgICogb24gYSBsaXZlIChub24tcGF1c2VkKSBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtQcm9taXNlPD8+IHwgdW5kZWZpbmVkfVxuICAgICAqL1xuICAgIHRoaXMuX3Jlc3VtZUlkZW50aXR5UHJvbWlzZSA9IHVuZGVmaW5lZFxuXG4gICAgLyoqXG4gICAgICogQWNjdW11bGF0ZXMgcGF5bG9hZHMgZm9yIGEgZnJhZ21lbnRlZCB3ZWJzb2NrZXQgbWVzc2FnZSBwZXJcbiAgICAgKiBSRkMgNjQ1NS4gTm9uLW51bGwgd2hpbGUgbWlkLWZyYWdtZW50OyBjbGVhcmVkIHdoZW4gdGhlIGZyYW1lXG4gICAgICogd2l0aCBGSU49MSBjb21wbGV0ZXMgYW5kIHRoZSBtZXNzYWdlIGlzIGRpc3BhdGNoZWQuXG4gICAgICogQHR5cGUge0J1ZmZlcltdIHwgbnVsbH1cbiAgICAgKi9cbiAgICB0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHMgPSBudWxsXG5cbiAgICAvKipcbiAgICAgKiBPcGNvZGUgKFRFWFQvQklOQVJZKSBjYXB0dXJlZCBmcm9tIHRoZSBmaXJzdCBmcmFtZSBvZiBhXG4gICAgICogZnJhZ21lbnRlZCBtZXNzYWdlLiBDb250aW51YXRpb24gZnJhbWVzIChvcGNvZGUgMCkgaW5oZXJpdCBpdFxuICAgICAqIGF0IHJlYXNzZW1ibHkgdGltZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyIHwgbnVsbH1cbiAgICAgKi9cbiAgICB0aGlzLl9mcmFnbWVudGVkT3Bjb2RlID0gbnVsbFxuXG4gICAgLyoqXG4gICAgICogUnVubmluZyBieXRlIHRvdGFsIGZvciBgX2ZyYWdtZW50ZWRQYXlsb2Fkc2AuIFVzZWQgdG8gZW5mb3JjZVxuICAgICAqIGBXRUJTT0NLRVRfTUFYX0ZSQUdNRU5URURfTUVTU0FHRV9CWVRFU2Agc28gYSBwZWVyIGNhbm5vdFxuICAgICAqIGV4aGF1c3QgbWVtb3J5IGJ5IHN0cmVhbWluZyBub24tZmluYWwgZnJhZ21lbnRzIGluZGVmaW5pdGVseS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMuX2ZyYWdtZW50ZWRCeXRlcyA9IDBcblxuICAgIHRoaXMuY29uZmlndXJhdGlvbi5fd2Vic29ja2V0U2Vzc2lvbnMuYWRkKHRoaXMpXG5cbiAgICAvKipcbiAgICAgKiBIZWFydGJlYXQgbGl2ZW5lc3MgZmxhZy4gU2V0IHRydWUgb24gZXZlcnkgaW5ib3VuZCBmcmFtZVxuICAgICAqIChpbmNsdWRpbmcgdGhlIGNsaWVudCdzIGF1dG8tcG9uZykgYW5kIGNsZWFyZWQgZWFjaCB0aW1lIGEgcGluZ1xuICAgICAqIGlzIHNlbnQ7IGEgc3RpbGwtZmFsc2UgZmxhZyBhdCB0aGUgbmV4dCB0aWNrIG1lYW5zIHRoZSBzb2NrZXRcbiAgICAgKiBoYXMgZ29uZSBzaWxlbnQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgdGhpcy5faGVhcnRiZWF0QWxpdmUgPSB0cnVlXG5cbiAgICAvKipcbiAgICAgKiBQZXItc2Vzc2lvbiBoZWFydGJlYXQgaW50ZXJ2YWwgaGFuZGxlLiBTdGFydGVkIGZyb21cbiAgICAgKiBgc2VuZFNlc3Npb25Fc3RhYmxpc2hlZGAgb25jZSB0aGUgc29ja2V0IGlzIGxpdmUsIG5vdCBhdFxuICAgICAqIGNvbnN0cnVjdGlvbiwgc28gZGlyZWN0bHktY29uc3RydWN0ZWQgc2Vzc2lvbnMgaW4gdGVzdHMgZG9uJ3RcbiAgICAgKiBzcGluIHVwIGEgYmFja2dyb3VuZCB0aW1lci5cbiAgICAgKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbH1cbiAgICAgKi9cbiAgICB0aGlzLl9oZWFydGJlYXRUaW1lciA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyB0aGUgY2xpZW50IGl0cyBzZXNzaW9uSWQgKyBncmFjZSB3aW5kb3cuIENhbGxlZCBieVxuICAgKiBgVmVsb2Npb3VzSHR0cFNlcnZlckNsaWVudGAgYWZ0ZXIgdGhlIFdTIHVwZ3JhZGUgY29tcGxldGVzLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNlbmRTZXNzaW9uRXN0YWJsaXNoZWQoKSB7XG4gICAgdGhpcy5zZW5kSnNvbih7XG4gICAgICB0eXBlOiBcInNlc3Npb24tZXN0YWJsaXNoZWRcIixcbiAgICAgIHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICBncmFjZVNlY29uZHM6IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRTZXNzaW9uR3JhY2VTZWNvbmRzPy4oKSB8fCAzMDBcbiAgICB9KVxuXG4gICAgLy8gVGhlIHNvY2tldCBpcyBsaXZlIG5vdywgc28gYmVnaW4gcmVhcGluZyBpdCBpZiBpdCBnb2VzIHNpbGVudC5cbiAgICB0aGlzLl9zdGFydEhlYXJ0YmVhdCgpXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGNsb3NlZCBjb25uZWN0aW9uIGZyb20gdGhlIHNlc3Npb24gcmVnaXN0cnkuIENhbGxlZCBieVxuICAgKiBgVmVsb2Npb3VzV2Vic29ja2V0Q29ubmVjdGlvbi5jbG9zZSgpYCBhZnRlciBpdCBzZW5kcyB0aGUgZmluYWxcbiAgICogYGNvbm5lY3Rpb24tY2xvc2VkYCBmcmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbm5lY3Rpb25JZCAtIENsb3NlZCBjb25uZWN0aW9uIGlkZW50aWZpZXIgdG8gcmVtb3ZlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9yZW1vdmVDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCkge1xuICAgIHRoaXMuX2Nvbm5lY3Rpb25zLmRlbGV0ZShjb25uZWN0aW9uSWQpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgbWV0YWRhdGEuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gLSBDbGllbnQtcHJvdmlkZWQgbWV0YWRhdGEgKGRlZmVuc2l2ZSBjb3B5KS5cbiAgICovXG4gIGdldE1ldGFkYXRhKCkge1xuICAgIHJldHVybiB7Li4udGhpcy5fbWV0YWRhdGF9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBpcyBwYXVzZWQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIHRydWUgd2hpbGUgdGhlIHNlc3Npb24gaXMgaW4gdGhlIHBhdXNlZC9ncmFjZSByZWdpc3RyeS5cbiAgICovXG4gIGlzUGF1c2VkKCkge1xuICAgIHJldHVybiB0aGlzLl9wYXVzZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFkZCBzdWJzY3JpcHRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBhZGRTdWJzY3JpcHRpb24oY2hhbm5lbCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoY2hhbm5lbClcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fc3RvcEhlYXJ0YmVhdCgpXG4gICAgdGhpcy5fcmVzZXRGcmFnbWVudEJ1ZmZlcigpXG4gICAgdGhpcy5fY2xlYXJCdWZmZXJlZEZyYW1lQ2h1bmtzKClcbiAgICB0aGlzLl9hYmFuZG9uSW5ib3VuZE1lc3NhZ2VzKClcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3dlYnNvY2tldFNlc3Npb25zLmRlbGV0ZSh0aGlzKVxuICAgIHRoaXMuX3BhdXNlZCA9IGZhbHNlXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWwoKVxuICAgIHZvaWQgdGhpcy5fdGVhcmRvd25Db25uZWN0aW9ucyhcInNlc3Npb25fZGVzdHJveWVkXCIpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWxTdWJzY3JpcHRpb25zKClcbiAgICB0aGlzLmV2ZW50cy5yZW1vdmVBbGxMaXN0ZW5lcnMoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaGFzIHN1YnNjcmlwdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgaXQgaGFzIHN1YnNjcmlwdGlvbi5cbiAgICovXG4gIGhhc1N1YnNjcmlwdGlvbihjaGFubmVsKSB7XG4gICAgcmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9ucy5oYXMoY2hhbm5lbClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIG9uIGRhdGEuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIC0gRGF0YSBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBvbkRhdGEoZGF0YSkge1xuICAgIC8vIEFueSBpbmJvdW5kIGJ5dGVzIOKAlCBhIGRhdGEgZnJhbWUsIHRoZSBhdXRvLXBvbmcgYW5zd2VyaW5nIG91clxuICAgIC8vIGhlYXJ0YmVhdCwgb3IgYSBwYXJ0aWFsIGZyYW1lIHN0aWxsIGJlaW5nIHVwbG9hZGVkIOKAlCBwcm92ZSB0aGVcbiAgICAvLyBzb2NrZXQgaXMgYWxpdmUuIE1hcmsgaXQgaGVyZSwgYmVmb3JlIGBfcHJvY2Vzc0J1ZmZlcmAgbWF5IHJldHVyblxuICAgIC8vIGVhcmx5IHdhaXRpbmcgZm9yIHRoZSByZXN0IG9mIGFuIGluY29tcGxldGUgZnJhbWUuXG4gICAgdGhpcy5faGVhcnRiZWF0QWxpdmUgPSB0cnVlXG4gICAgaWYgKHRoaXMuX2luYm91bmRDbG9zZWQgfHwgZGF0YS5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgdGhpcy5fYnVmZmVyQ2h1bmtzLnB1c2goZGF0YSlcbiAgICB0aGlzLl9idWZmZXJlZEJ5dGVzICs9IGRhdGEubGVuZ3RoXG4gICAgdGhpcy5fcHJvY2Vzc0J1ZmZlcigpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZW5kIGV2ZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHs/fSBwYXlsb2FkIC0gUGF5bG9hZCBkYXRhLlxuICAgKiBAcGFyYW0ge3tjcmVhdGVkQXQ/OiBzdHJpbmcsIGV2ZW50SWQ/OiBzdHJpbmcsIHJlcGxheWVkPzogYm9vbGVhbiwgc2VxdWVuY2U/OiBudW1iZXJ9fSBbb3B0aW9uc10gLSBFdmVudCBtZXRhZGF0YS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIHNlbmRFdmVudChjaGFubmVsLCBwYXlsb2FkLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBjaGFubmVsSGFuZGxlcnMgPSB0aGlzLnN1YnNjcmlwdGlvbkhhbmRsZXJzLmdldChjaGFubmVsKVxuICAgIGNvbnN0IGhhc0NoYW5uZWxIYW5kbGVycyA9IEJvb2xlYW4oY2hhbm5lbEhhbmRsZXJzICYmIGNoYW5uZWxIYW5kbGVycy5zaXplID4gMClcbiAgICBjb25zdCByZXBsYXlTdGF0ZSA9IHRoaXMuY2hhbm5lbFJlcGxheVN0YXRlcy5nZXQoY2hhbm5lbClcblxuICAgIGlmIChyZXBsYXlTdGF0ZT8ucmVwbGF5aW5nICYmICFvcHRpb25zLnJlcGxheWVkKSB7XG4gICAgICByZXBsYXlTdGF0ZS5idWZmZXJlZCA9IHRydWVcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghdGhpcy5oYXNTdWJzY3JpcHRpb24oY2hhbm5lbCkgJiYgIWhhc0NoYW5uZWxIYW5kbGVycykgcmV0dXJuXG5cbiAgICBpZiAoaGFzQ2hhbm5lbEhhbmRsZXJzKSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChBcnJheS5mcm9tKGNoYW5uZWxIYW5kbGVycykubWFwKGFzeW5jIChoYW5kbGVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHRlbmFudCA9IHRoaXMuY2hhbm5lbFRlbmFudHMuZ2V0KGhhbmRsZXIpXG5cbiAgICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJ1bldpdGhUZW5hbnQodGVuYW50LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IGhhbmRsZXIucmVjZWl2ZWRCcm9hZGNhc3Qoe1xuICAgICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgICBjcmVhdGVkQXQ6IG9wdGlvbnMuY3JlYXRlZEF0LFxuICAgICAgICAgICAgICBldmVudElkOiBvcHRpb25zLmV2ZW50SWQsXG4gICAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICAgICAgIHJlcGxheWVkOiBvcHRpb25zLnJlcGxheWVkLFxuICAgICAgICAgICAgICBzZXF1ZW5jZTogb3B0aW9ucy5zZXF1ZW5jZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLnNlbmRKc29uKHtcbiAgICAgIGNoYW5uZWwsXG4gICAgICBjcmVhdGVkQXQ6IG9wdGlvbnMuY3JlYXRlZEF0LFxuICAgICAgZXZlbnRJZDogb3B0aW9ucy5ldmVudElkLFxuICAgICAgcGF5bG9hZCxcbiAgICAgIHJlcGxheWVkOiBvcHRpb25zLnJlcGxheWVkLFxuICAgICAgc2VxdWVuY2U6IG9wdGlvbnMuc2VxdWVuY2UsXG4gICAgICB0eXBlOiBcImV2ZW50XCJcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaW5pdGlhbGl6ZSBjaGFubmVsLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZUNoYW5uZWwoKSB7XG4gICAgaWYgKHRoaXMubWVzc2FnZUhhbmRsZXJQcm9taXNlKSB7XG4gICAgICBhd2FpdCB0aGlzLl9yZXNvbHZlTWVzc2FnZUhhbmRsZXJQcm9taXNlKClcblxuICAgICAgaWYgKHRoaXMubWVzc2FnZUhhbmRsZXIpIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICBhd2FpdCB0aGlzLl9ydW5NZXNzYWdlSGFuZGxlck9wZW4oKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcmVzb2x2ZXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0Q2hhbm5lbFJlc29sdmVyPy4oKVxuXG4gICAgaWYgKCFyZXNvbHZlcikgcmV0dXJuXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdGVuYW50ID0gYXdhaXQgdGhpcy5fcmVzb2x2ZVRlbmFudCh7fSlcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJ1bldpdGhUZW5hbnQodGVuYW50LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXNvbHZlcih7XG4gICAgICAgICAgY2xpZW50OiB0aGlzLmNsaWVudCxcbiAgICAgICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgcmVxdWVzdDogdGhpcy51cGdyYWRlUmVxdWVzdCxcbiAgICAgICAgICB3ZWJzb2NrZXRTZXNzaW9uOiB0aGlzXG4gICAgICAgIH0pXG4gICAgICB9KVxuXG4gICAgICBpZiAoIXJlc29sdmVkKSByZXR1cm5cblxuICAgICAgY29uc3QgY2hhbm5lbCA9IHR5cGVvZiByZXNvbHZlZCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gbmV3IHJlc29sdmVkKHtjbGllbnQ6IHRoaXMuY2xpZW50LCBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sIHJlcXVlc3Q6IHRoaXMudXBncmFkZVJlcXVlc3QsIHdlYnNvY2tldFNlc3Npb246IHRoaXN9KVxuICAgICAgICA6IHJlc29sdmVkXG5cbiAgICAgIGlmIChjaGFubmVsICYmICEoY2hhbm5lbCBpbnN0YW5jZW9mIFdlYnNvY2tldENoYW5uZWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlc29sdmVkIHdlYnNvY2tldCBjaGFubmVsIG11c3QgZXh0ZW5kIFdlYnNvY2tldENoYW5uZWxcIilcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5fcmVnaXN0ZXJDaGFubmVsKGNoYW5uZWwsIHRlbmFudClcbiAgICB9IGNhdGNoIChjYXVnaHRFcnJvcikge1xuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLl9yZXBvcnRVbmV4cGVjdGVkRGlzcGF0Y2hFcnJvcihjYXVnaHRFcnJvciwge1xuICAgICAgICBzdGFnZTogXCJ3ZWJzb2NrZXQtY2hhbm5lbC1pbml0aWFsaXplXCJcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIkZhaWxlZCB0byBpbml0aWFsaXplIHdlYnNvY2tldCBjaGFubmVsXCIsIGVycm9yXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZW5kIGdvb2RieWUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSBjbGllbnQgLSBDbGllbnQgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7e2NvZGU/OiBudW1iZXIsIHJlYXNvbj86IHN0cmluZ319IFtvcHRpb25zXSAtIE9wdGlvbmFsIGNsb3NlIHN0YXR1cy5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2VuZEdvb2RieWUoY2xpZW50LCB7Y29kZSwgcmVhc29uID0gXCJcIn0gPSB7fSkge1xuICAgIGxldCBwYXlsb2FkXG5cbiAgICBpZiAoY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXlsb2FkID0gQnVmZmVyLmFsbG9jKDApXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlYXNvbkJ5dGVzID0gQnVmZmVyLmZyb20ocmVhc29uLCBcInV0Zi04XCIpXG5cbiAgICAgIGlmIChyZWFzb25CeXRlcy5sZW5ndGggPiBXRUJTT0NLRVRfTUFYX0NMT1NFX1JFQVNPTl9CWVRFUykge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIldlYlNvY2tldCBjbG9zZSByZWFzb24gbXVzdCBub3QgZXhjZWVkIDEyMyBVVEYtOCBieXRlc1wiKVxuICAgICAgfVxuXG4gICAgICBwYXlsb2FkID0gQnVmZmVyLmFsbG9jVW5zYWZlKDIgKyByZWFzb25CeXRlcy5sZW5ndGgpXG4gICAgICBwYXlsb2FkLndyaXRlVUludDE2QkUoY29kZSwgMClcbiAgICAgIHJlYXNvbkJ5dGVzLmNvcHkocGF5bG9hZCwgMilcbiAgICB9XG5cbiAgICBjb25zdCBmcmFtZSA9IEJ1ZmZlci5jb25jYXQoW1xuICAgICAgQnVmZmVyLmZyb20oW1dFQlNPQ0tFVF9GSU5BTF9GUkFNRSB8IFdFQlNPQ0tFVF9PUENPREVfQ0xPU0UsIHBheWxvYWQubGVuZ3RoXSksXG4gICAgICBwYXlsb2FkXG4gICAgXSlcblxuICAgIGNsaWVudC5ldmVudHMuZW1pdChcIm91dHB1dFwiLCBmcmFtZSwge3dlYnNvY2tldEZyYW1lOiB0cnVlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgY2F1Z2h0IGRpc3BhdGNoIGVycm9yIGlzIGFuIGV4cGVjdGVkIGNsaWVudC1mbG93IGZhaWx1cmUuXG4gICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gTm9ybWFsaXplZCBkaXNwYXRjaCBlcnJvci5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBmcmFtZXdvcmsgZXJyb3IgcmVwb3J0ZXJzIHNob3VsZCBpZ25vcmUgaXQuXG4gICAqL1xuICBfZXhwZWN0ZWRDbGllbnRFcnJvcihlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFZhbGlkYXRpb25FcnJvcikgcmV0dXJuIHRydWVcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBWZWxvY2lvdXNFcnJvciAmJiBlcnJvci5zYWZlVG9FeHBvc2UpIHJldHVybiB0cnVlXG5cbiAgICBjb25zdCBhbm5vdGF0ZWRFcnJvciA9IC8qKiBAdHlwZSB7RXJyb3IgJiB7ZXJyb3JUeXBlPzogc3RyaW5nLCB2ZWxvY2lvdXM/OiBSZWNvcmQ8c3RyaW5nLCA/Pn19ICovIChlcnJvcilcblxuICAgIGlmIChpc1BsYWluT2JqZWN0KGFubm90YXRlZEVycm9yLnZlbG9jaW91cykpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gdHlwZW9mIGFubm90YXRlZEVycm9yLmVycm9yVHlwZSA9PT0gXCJzdHJpbmdcIiAmJiBhbm5vdGF0ZWRFcnJvci5lcnJvclR5cGUubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgb25lIHVuZXhwZWN0ZWQgV2ViU29ja2V0IGRpc3BhdGNoIGZhaWx1cmUgYW5kIHJldHVybnMgaXRzIG5vcm1hbGl6ZWQgRXJyb3IuXG4gICAqIEBwYXJhbSB7P30gY2F1Z2h0RXJyb3IgLSBDYXVnaHQgZGlzcGF0Y2ggZmFpbHVyZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gY29udGV4dCAtIFN0cnVjdHVyZWQgZGlzcGF0Y2ggY29udGV4dC5cbiAgICogQHJldHVybnMge0Vycm9yfSAtIE5vcm1hbGl6ZWQgZXJyb3IgZm9yIGV4aXN0aW5nIGxvZ3MgYW5kIGNsaWVudCByZXNwb25zZXMuXG4gICAqL1xuICBfcmVwb3J0VW5leHBlY3RlZERpc3BhdGNoRXJyb3IoY2F1Z2h0RXJyb3IsIGNvbnRleHQpIHtcbiAgICBjb25zdCBlcnJvciA9IGVuc3VyZUVycm9yKGNhdWdodEVycm9yKVxuXG4gICAgaWYgKHRoaXMuX2V4cGVjdGVkQ2xpZW50RXJyb3IoZXJyb3IpKSByZXR1cm4gZXJyb3JcblxuICAgIGNvbnN0IGVycm9yUGF5bG9hZCA9IHtcbiAgICAgIGNvbnRleHQsXG4gICAgICBlcnJvcixcbiAgICAgIHJlcXVlc3Q6IHRoaXMudXBncmFkZVJlcXVlc3RcbiAgICB9XG4gICAgY29uc3QgZXJyb3JFdmVudHMgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RXJyb3JFdmVudHMoKVxuXG4gICAgZXJyb3JFdmVudHMuZW1pdChcImZyYW1ld29yay1lcnJvclwiLCBlcnJvclBheWxvYWQpXG4gICAgZXJyb3JFdmVudHMuZW1pdChcImFsbC1lcnJvclwiLCB7Li4uZXJyb3JQYXlsb2FkLCBlcnJvclR5cGU6IFwiZnJhbWV3b3JrLWVycm9yXCJ9KVxuXG4gICAgcmV0dXJuIGVycm9yXG4gIH1cblxuICAvKipcbiAgICogUnVucyBoYW5kbGUgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZX0gbWVzc2FnZSAtIE1lc3NhZ2UgdGV4dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICBjb25zdCBhZG1pc3Npb24gPSB0aGlzLl9hZG1pdEluYm91bmRNZXNzYWdlKDApXG5cbiAgICBpZiAoIWFkbWlzc2lvbikgcmV0dXJuXG4gICAgYXdhaXQgdGhpcy5faGFuZGxlTWVzc2FnZVdvcmsoe2FkbWlzc2lvbiwgbWVzc2FnZX0pXG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyBhbiBhZG1pdHRlZCBtZXNzYWdlIHRvIHRoZSBwZXItc2Vzc2lvbiBGSUZPIGNoYWluLlxuICAgKiBAcGFyYW0ge0luYm91bmRNZXNzYWdlV29ya30gd29yayAtIEFkbWl0dGVkIGRlY29kZWQgbWVzc2FnZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVNZXNzYWdlV29yayh3b3JrKSB7XG4gICAgLy8gU2VyaWFsaXplIHBlci1zZXNzaW9uOiBjaGFpbiBvbnRvIGBfbWVzc2FnZUNoYWluYCBzbyBtZXNzYWdlc1xuICAgIC8vIGFyZSBwcm9jZXNzZWQgb25lIGF0IGEgdGltZS4gV2l0aG91dCB0aGlzLCBmaXJlLWFuZC1mb3JnZXRcbiAgICAvLyBkaXNwYXRjaCBmcm9tIGBfcHJvY2Vzc0J1ZmZlcmAgbGV0cyBtZXNzYWdlIEIgcmVhZFxuICAgIC8vIGBzZXNzaW9uLmRhdGFgIGJlZm9yZSBBIGhhcyBmaW5pc2hlZCB3cml0aW5nIGl0LlxuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5fbWVzc2FnZUNoYWluXG4gICAgY29uc3QgbmV4dCA9IHByZXZpb3VzLnRoZW4oKCkgPT4gdGhpcy5fcnVuTWVzc2FnZVdvcmsod29yaykpXG5cbiAgICB0aGlzLl9tZXNzYWdlQ2hhaW4gPSBuZXh0LmNhdGNoKCgpID0+IHt9KVxuICAgIGF3YWl0IG5leHRcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIG9yIHRyYW5zZmVycyBvbmUgYWRtaXR0ZWQgbWVzc2FnZSB3aGlsZSByZXRhaW5pbmcgaXRzIGFjY291bnRpbmcuXG4gICAqIEBwYXJhbSB7SW5ib3VuZE1lc3NhZ2VXb3JrfSB3b3JrIC0gQWRtaXR0ZWQgZGVjb2RlZCBtZXNzYWdlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciBkaXNwYXRjaCBvciByZXNvbHZlci1xdWV1ZSB0cmFuc2Zlci5cbiAgICovXG4gIGFzeW5jIF9ydW5NZXNzYWdlV29yayh3b3JrKSB7XG4gICAgaWYgKHRoaXMuX2luYm91bmRDbG9zZWQpIHtcbiAgICAgIHRoaXMuX3JlbGVhc2VJbmJvdW5kQWRtaXNzaW9uKHdvcmsuYWRtaXNzaW9uKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGVuZGluZ01lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VRdWV1ZS5wdXNoKHdvcmspXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fZGlzcGF0Y2hNZXNzYWdlKHdvcmsubWVzc2FnZSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fcmVsZWFzZUluYm91bmRBZG1pc3Npb24od29yay5hZG1pc3Npb24pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZGlzcGF0Y2ggbWVzc2FnZS5cbiAgICogQHBhcmFtIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZX0gbWVzc2FnZSAtIE1lc3NhZ2UgdGV4dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9kaXNwYXRjaE1lc3NhZ2UobWVzc2FnZSkge1xuICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0QXJvdW5kUmVxdWVzdD8uKClcblxuICAgIGlmICh3cmFwcGVyKSB7XG4gICAgICBhd2FpdCB3cmFwcGVyKHRoaXMsICgpID0+IHRoaXMuX2hhbmRsZU1lc3NhZ2VJbm5lcihtZXNzYWdlKSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuX2hhbmRsZU1lc3NhZ2VJbm5lcihtZXNzYWdlKVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBhY3R1YWwgbWVzc2FnZSBkaXNwYXRjaCwgZXh0cmFjdGVkIHNvXG4gICAqIGBjb25maWd1cmF0aW9uLmdldFdlYnNvY2tldEFyb3VuZFJlcXVlc3QoKWAgY2FuIHdyYXAgaXQgaW4gYW55XG4gICAqIHBlci1yZXF1ZXN0IGNvbnRleHQgKEFzeW5jTG9jYWxTdG9yYWdlLCB0cmFjaW5nLCBldGMuKS5cbiAgICogQHBhcmFtIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZX0gbWVzc2FnZSAtIERlY29kZWQgY2xpZW50IGZyYW1lIHRvIGRpc3BhdGNoIGJ5IG1lc3NhZ2UgdHlwZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfaGFuZGxlTWVzc2FnZUlubmVyKG1lc3NhZ2UpIHtcbiAgICAvLyBUaGUgbWVzc2FnZUhhbmRsZXIgc2hvcnQtY2lyY3VpdHMgZGVmYXVsdCByb3V0aW5nIG9ubHkgd2hlbiB0aGVcbiAgICAvLyBhcHAgYWN0dWFsbHkgZGVjbGFyZWQgYW4gYG9uTWVzc2FnZWAgaG9vay4gQXBwcyB0aGF0IG9ubHkgd2FudFxuICAgIC8vIHNlc3Npb24tbGlmZWN5Y2xlIHRyYWNraW5nIChgb25PcGVuYC9gb25DbG9zZWApIHN0aWxsIG5lZWQgdGhlXG4gICAgLy8gYnVpbHQtaW4gc3Vic2NyaWJlL2Nvbm5lY3Rpb24vY2hhbm5lbC1zdWJzY3JpYmUgcm91dGluZyBiZWxvdyxcbiAgICAvLyBvdGhlcndpc2UgZXZlcnkgaW5jb21pbmcgbWVzc2FnZSBpcyBzaWxlbnRseSBkcm9wcGVkLlxuICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyICYmIHR5cGVvZiB0aGlzLm1lc3NhZ2VIYW5kbGVyLm9uTWVzc2FnZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBhd2FpdCB0aGlzLl9ydW5NZXNzYWdlSGFuZGxlck1lc3NhZ2UobWVzc2FnZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHN1YnNjcmliZVBheWxvYWQgPSBzdWJzY3JpYmVNZXNzYWdlKG1lc3NhZ2UpXG5cbiAgICBpZiAoc3Vic2NyaWJlUGF5bG9hZCkge1xuICAgICAgY29uc3Qge2NoYW5uZWwsIGxhc3RFdmVudElkLCBwYXJhbXN9ID0gc3Vic2NyaWJlUGF5bG9hZFxuXG4gICAgICBpZiAoIWNoYW5uZWwpIHRocm93IFZlbG9jaW91c0Vycm9yLnNhZmUoXCJjaGFubmVsIGlzIHJlcXVpcmVkIGZvciBzdWJzY3JpYmVcIilcbiAgICAgIGNvbnN0IHJlc29sdmVyID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldENoYW5uZWxSZXNvbHZlcj8uKClcblxuICAgICAgaWYgKHJlc29sdmVyKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZUNoYW5uZWxTdWJzY3JpcHRpb24oe2NoYW5uZWwsIGxhc3RFdmVudElkLCBwYXJhbXN9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdWJzY3JpYmVUb0NoYW5uZWwoY2hhbm5lbCwge2Fja25vd2xlZGdlOiB0cnVlLCBsYXN0RXZlbnRJZCwgcGFyYW1zfSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJtZXRhZGF0YVwiKSB7XG4gICAgICBjb25zdCBtZXRhZGF0YVBheWxvYWQgPSAvKiogQHR5cGUge3tkYXRhPzogUmVjb3JkPHN0cmluZywgPz59fSAqLyAobWVzc2FnZSlcblxuICAgICAgdGhpcy5fbWV0YWRhdGEgPSBtZXRhZGF0YVBheWxvYWQuZGF0YSAmJiB0eXBlb2YgbWV0YWRhdGFQYXlsb2FkLmRhdGEgPT09IFwib2JqZWN0XCIgPyB7Li4ubWV0YWRhdGFQYXlsb2FkLmRhdGF9IDoge31cblxuICAgICAgZm9yIChjb25zdCB7c3Vic2NyaXB0aW9ufSBvZiB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgICBpZiAodHlwZW9mIHN1YnNjcmlwdGlvbi5vbk1ldGFkYXRhQ2hhbmdlZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHN1YnNjcmlwdGlvbi5vbk1ldGFkYXRhQ2hhbmdlZCh0aGlzLl9tZXRhZGF0YSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwic2Vzc2lvbi1yZXN1bWVcIikge1xuICAgICAgYXdhaXQgdGhpcy5faGFuZGxlU2Vzc2lvblJlc3VtZShtZXNzYWdlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJjb25uZWN0aW9uLW9wZW5cIikge1xuICAgICAgYXdhaXQgdGhpcy5faGFuZGxlQ29ubmVjdGlvbk9wZW4obWVzc2FnZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY29ubmVjdGlvbi1tZXNzYWdlXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZUNvbm5lY3Rpb25NZXNzYWdlKG1lc3NhZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBcImNvbm5lY3Rpb24tY2xvc2VcIikge1xuICAgICAgYXdhaXQgdGhpcy5faGFuZGxlQ29ubmVjdGlvbkNsb3NlKG1lc3NhZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBcImNoYW5uZWwtc3Vic2NyaWJlXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZUNoYW5uZWxTdWJzY3JpYmUobWVzc2FnZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY2hhbm5lbC11bnN1YnNjcmliZVwiKSB7XG4gICAgICBhd2FpdCB0aGlzLl9oYW5kbGVDaGFubmVsVW5zdWJzY3JpYmUobWVzc2FnZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgJiYgbWVzc2FnZS50eXBlICE9PSBcInJlcXVlc3RcIikge1xuICAgICAgdGhpcy5zZW5kSnNvbih7ZXJyb3I6IGBVbmtub3duIG1lc3NhZ2UgdHlwZTogJHttZXNzYWdlLnR5cGV9YCwgdHlwZTogXCJlcnJvclwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RQYXlsb2FkID0gcmVxdWVzdE1lc3NhZ2UobWVzc2FnZSlcblxuICAgIGlmICghcmVxdWVzdFBheWxvYWQpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe2Vycm9yOiBgVW5rbm93biBtZXNzYWdlIHR5cGU6ICR7bWVzc2FnZS50eXBlfWAsIHR5cGU6IFwiZXJyb3JcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB7Ym9keSwgaGVhZGVycywgaWQsIG1ldGhvZCwgcGF0aH0gPSByZXF1ZXN0UGF5bG9hZFxuXG4gICAgaWYgKCFtZXRob2QpIHRocm93IFZlbG9jaW91c0Vycm9yLnNhZmUoXCJtZXRob2QgaXMgcmVxdWlyZWRcIilcbiAgICBpZiAoIXBhdGgpIHRocm93IFZlbG9jaW91c0Vycm9yLnNhZmUoXCJwYXRoIGlzIHJlcXVpcmVkXCIpXG5cbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFdlYnNvY2tldFJlcXVlc3Qoe1xuICAgICAgYm9keSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRhZGF0YTogdGhpcy5nZXRNZXRhZGF0YSgpLFxuICAgICAgbWV0aG9kLFxuICAgICAgcGF0aCxcbiAgICAgIHJlbW90ZUFkZHJlc3M6IHRoaXMucmVtb3RlQWRkcmVzcygpXG4gICAgfSlcbiAgICBjb25zdCByZXF1ZXN0UnVubmVyID0gbmV3IFJlcXVlc3RSdW5uZXIoe1xuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgcmVxdWVzdFxuICAgIH0pXG5cbiAgICByZXF1ZXN0UnVubmVyLmV2ZW50cy5vbihcImRvbmVcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXF1ZXN0UnVubmVyLnJlc3BvbnNlXG4gICAgICBjb25zdCBib2R5ID0gcmVzcG9uc2UuZ2V0Qm9keSgpXG4gICAgICBjb25zdCBoZWFkZXJzID0gcmVzcG9uc2UuaGVhZGVyc1xuXG4gICAgICB0aGlzLnNlbmRKc29uKHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgaWQsXG4gICAgICAgIHN0YXR1c0NvZGU6IHJlc3BvbnNlLmdldFN0YXR1c0NvZGUoKSxcbiAgICAgICAgc3RhdHVzTWVzc2FnZTogcmVzcG9uc2UuZ2V0U3RhdHVzTWVzc2FnZSgpLFxuICAgICAgICB0eXBlOiBcInJlc3BvbnNlXCJcbiAgICAgIH0pXG4gICAgICB2b2lkIHJlcXVlc3RSdW5uZXIubG9nQ29tcGxldGVkUmVxdWVzdCgpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiRmFpbGVkIHRvIGxvZyBjb21wbGV0ZWQgcmVxdWVzdFwiLCBlcnJvcilcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGF3YWl0IHJlcXVlc3RSdW5uZXIucnVuKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHByb2Nlc3MgYnVmZmVyLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBfcHJvY2Vzc0J1ZmZlcigpIHtcbiAgICB3aGlsZSAodGhpcy5fYnVmZmVyZWRCeXRlcyA+PSAyKSB7XG4gICAgICBjb25zdCBpbml0aWFsSGVhZGVyID0gdGhpcy5fcGVla0J1ZmZlcmVkQnl0ZXMoMilcbiAgICAgIGNvbnN0IGZpcnN0Qnl0ZSA9IGluaXRpYWxIZWFkZXJbMF1cbiAgICAgIGNvbnN0IHNlY29uZEJ5dGUgPSBpbml0aWFsSGVhZGVyWzFdXG4gICAgICBjb25zdCBpc0ZpbmFsID0gKGZpcnN0Qnl0ZSAmIFdFQlNPQ0tFVF9GSU5BTF9GUkFNRSkgPT09IFdFQlNPQ0tFVF9GSU5BTF9GUkFNRVxuICAgICAgY29uc3Qgb3Bjb2RlID0gZmlyc3RCeXRlICYgMHgwRlxuICAgICAgY29uc3QgaXNNYXNrZWQgPSAoc2Vjb25kQnl0ZSAmIDB4ODApID09PSAweDgwXG4gICAgICBsZXQgcGF5bG9hZExlbmd0aCA9IHNlY29uZEJ5dGUgJiAweDdGXG4gICAgICBsZXQgb2Zmc2V0ID0gMlxuXG4gICAgICBpZiAocGF5bG9hZExlbmd0aCA9PT0gMTI2KSB7XG4gICAgICAgIGlmICh0aGlzLl9idWZmZXJlZEJ5dGVzIDwgb2Zmc2V0ICsgMikgcmV0dXJuXG4gICAgICAgIHBheWxvYWRMZW5ndGggPSB0aGlzLl9wZWVrQnVmZmVyZWRCeXRlcyhvZmZzZXQgKyAyKS5yZWFkVUludDE2QkUob2Zmc2V0KVxuICAgICAgICBvZmZzZXQgKz0gMlxuICAgICAgfSBlbHNlIGlmIChwYXlsb2FkTGVuZ3RoID09PSAxMjcpIHtcbiAgICAgICAgaWYgKHRoaXMuX2J1ZmZlcmVkQnl0ZXMgPCBvZmZzZXQgKyA4KSByZXR1cm5cbiAgICAgICAgY29uc3QgYmlnTGVuZ3RoID0gdGhpcy5fcGVla0J1ZmZlcmVkQnl0ZXMob2Zmc2V0ICsgOCkucmVhZEJpZ1VJbnQ2NEJFKG9mZnNldClcblxuICAgICAgICBpZiAoYmlnTGVuZ3RoID4gV0VCU09DS0VUX01BWF9JTkJPVU5EX0ZSQU1FX0JZVEVTX0JJR0lOVCkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oKCkgPT4gW1xuICAgICAgICAgICAgXCJXZWJzb2NrZXQgZnJhbWUgZXhjZWVkZWQgYnl0ZSBjYXA7IGNsb3NpbmcgY29ubmVjdGlvblwiLFxuICAgICAgICAgICAge2ZyYW1lQnl0ZXM6IGJpZ0xlbmd0aC50b1N0cmluZygpLCBtYXhCeXRlczogV0VCU09DS0VUX01BWF9GSU5BTF9GUkFNRV9CWVRFU31cbiAgICAgICAgICBdKVxuICAgICAgICAgIHRoaXMuX2Nsb3NlRm9ySW5ib3VuZExpbWl0KClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHBheWxvYWRMZW5ndGggPSBOdW1iZXIoYmlnTGVuZ3RoKVxuICAgICAgICBvZmZzZXQgKz0gOFxuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXNrTGVuZ3RoID0gaXNNYXNrZWQgPyA0IDogMFxuXG4gICAgICBjb25zdCBmcmFtZUxlbmd0aCA9IG9mZnNldCArIG1hc2tMZW5ndGggKyBwYXlsb2FkTGVuZ3RoXG5cbiAgICAgIGlmICh0aGlzLl9idWZmZXJlZEJ5dGVzIDwgZnJhbWVMZW5ndGgpIHJldHVyblxuXG4gICAgICBjb25zdCBmcmFtZSA9IHRoaXMuX2NvbnN1bWVCdWZmZXJlZEJ5dGVzKGZyYW1lTGVuZ3RoKVxuXG4gICAgICAvKiogQHR5cGUge0J1ZmZlcn0gKi9cbiAgICAgIGxldCBwYXlsb2FkID0gZnJhbWUuc3ViYXJyYXkob2Zmc2V0ICsgbWFza0xlbmd0aCwgZnJhbWVMZW5ndGgpXG5cbiAgICAgIGlmIChpc01hc2tlZCkge1xuICAgICAgICBjb25zdCBtYXNrID0gZnJhbWUuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBtYXNrTGVuZ3RoKVxuICAgICAgICB0aGlzLl91bm1hc2tQYXlsb2FkKHBheWxvYWQsIG1hc2spXG4gICAgICB9XG5cbiAgICAgIC8vIENvbnRyb2wgZnJhbWVzIChvcGNvZGUgPj0gMHg4KSBtdXN0IG5vdCBiZSBmcmFnbWVudGVkIHBlclxuICAgICAgLy8gUkZDIDY0NTUgYW5kIGNhbiBhcnJpdmUgaW50ZXJsZWF2ZWQgd2l0aCBhIGZyYWdtZW50ZWQgZGF0YVxuICAgICAgLy8gbWVzc2FnZS4gSGFuZGxlIHRoZW0gZmlyc3Qgd2l0aG91dCB0b3VjaGluZyB0aGUgZnJhZ21lbnRcbiAgICAgIC8vIGFjY3VtdWxhdG9yLlxuICAgICAgaWYgKG9wY29kZSA9PT0gV0VCU09DS0VUX09QQ09ERV9QSU5HKSB7XG4gICAgICAgIHRoaXMuX3NlbmRDb250cm9sRnJhbWUoV0VCU09DS0VUX09QQ09ERV9QT05HLCBwYXlsb2FkKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAob3Bjb2RlID09PSBXRUJTT0NLRVRfT1BDT0RFX0NMT1NFKSB7XG4gICAgICAgIHRoaXMuc2VuZEdvb2RieWUodGhpcy5jbGllbnQpXG4gICAgICAgIHRoaXMuX2hhbmRsZUNsb3NlKClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKG9wY29kZSA9PT0gV0VCU09DS0VUX09QQ09ERV9QT05HKSB7XG4gICAgICAgIC8vIEFuc3dlciB0byBhIGhlYXJ0YmVhdCBwaW5nOyBsaXZlbmVzcyBpcyByZWNvcmRlZCBpbiBvbkRhdGEuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChvcGNvZGUgPj0gMHg4KSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYFVuc3VwcG9ydGVkIHdlYnNvY2tldCBjb250cm9sIG9wY29kZTogJHtvcGNvZGV9YClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gRGF0YSBmcmFtZSAoVEVYVC9CSU5BUlkvQ09OVElOVUFUSU9OKS4gUmVhc3NlbWJsZSBmcmFnbWVudHNcbiAgICAgIC8vIGJlZm9yZSBkaXNwYXRjaGluZy4gQnJvd3NlcnMgKENocm9tZSkgbGVnaXRpbWF0ZWx5IGZyYWdtZW50XG4gICAgICAvLyBsb25nZXIgY2xpZW504oaSc2VydmVyIHRleHQgZnJhbWVzOyBhIHByaW9yIHZlcnNpb24gZHJvcHBlZFxuICAgICAgLy8gZXZlcnkgZnJhZ21lbnRlZCBtZXNzYWdlIHNpbGVudGx5LCBzbyBhbnkgcGF5bG9hZCBsYXJnZVxuICAgICAgLy8gZW5vdWdoIHRvIGhpdCB0aGUgYnJvd3NlcidzIGZyYWdtZW50YXRpb24gdGhyZXNob2xkXG4gICAgICAvLyAoZS5nLiBhIGNoYW5uZWwtc3Vic2NyaWJlIHdpdGggYW4gYXV0aCB0b2tlbikgbmV2ZXIgcmVhY2hlZFxuICAgICAgLy8gdGhlIGhhbmRsZXIuXG4gICAgICBpZiAob3Bjb2RlID09PSBXRUJTT0NLRVRfT1BDT0RFX0NPTlRJTlVBVElPTikge1xuICAgICAgICBpZiAodGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzID09PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIlJlY2VpdmVkIGNvbnRpbnVhdGlvbiBmcmFtZSB3aXRoIG5vIGZyYWdtZW50ZWQgbWVzc2FnZSBpbiBwcm9ncmVzc1wiKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX2FwcGVuZEZyYWdtZW50KHBheWxvYWQpKSByZXR1cm5cblxuICAgICAgICBpZiAoIWlzRmluYWwpIGNvbnRpbnVlXG4gICAgICB9IGVsc2UgaWYgKG9wY29kZSA9PT0gV0VCU09DS0VUX09QQ09ERV9URVhUIHx8IG9wY29kZSA9PT0gV0VCU09DS0VUX09QQ09ERV9CSU5BUlkpIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2FkcyAhPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJSZWNlaXZlZCBuZXcgZGF0YSBmcmFtZSB3aGlsZSBhIGZyYWdtZW50ZWQgbWVzc2FnZSB3YXMgaW4gcHJvZ3Jlc3M7IGRpc2NhcmRpbmcgcHJpb3IgZnJhZ21lbnRzXCIpXG4gICAgICAgICAgdGhpcy5fcmVzZXRGcmFnbWVudEJ1ZmZlcigpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzRmluYWwpIHtcbiAgICAgICAgICB0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHMgPSBbcGF5bG9hZF1cbiAgICAgICAgICB0aGlzLl9mcmFnbWVudGVkT3Bjb2RlID0gb3Bjb2RlXG4gICAgICAgICAgdGhpcy5fZnJhZ21lbnRlZEJ5dGVzID0gcGF5bG9hZC5sZW5ndGhcblxuICAgICAgICAgIGlmICghdGhpcy5fZW5mb3JjZUZyYWdtZW50TGltaXRzKCkpIHJldHVyblxuXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihgVW5zdXBwb3J0ZWQgd2Vic29ja2V0IGRhdGEgb3Bjb2RlOiAke29wY29kZX1gKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIERlZmluZXMgZmluYWxQYXlsb2FkLlxuICAgICAgICogQHR5cGUge0J1ZmZlcn0gKi9cbiAgICAgIGxldCBmaW5hbFBheWxvYWRcbiAgICAgIC8qKlxuICAgICAgICogRGVmaW5lcyBmaW5hbE9wY29kZS5cbiAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICBsZXQgZmluYWxPcGNvZGVcblxuICAgICAgaWYgKHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2FkcyAhPT0gbnVsbCkge1xuICAgICAgICBpZiAob3Bjb2RlID09PSBXRUJTT0NLRVRfT1BDT0RFX0NPTlRJTlVBVElPTikge1xuICAgICAgICAgIGZpbmFsUGF5bG9hZCA9IEJ1ZmZlci5jb25jYXQodGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzKVxuICAgICAgICAgIGZpbmFsT3Bjb2RlID0gdGhpcy5fZnJhZ21lbnRlZE9wY29kZSA/PyBXRUJTT0NLRVRfT1BDT0RFX1RFWFRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaW5hbFBheWxvYWQgPSBwYXlsb2FkXG4gICAgICAgICAgZmluYWxPcGNvZGUgPSBvcGNvZGVcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZXNldEZyYWdtZW50QnVmZmVyKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbmFsUGF5bG9hZCA9IHBheWxvYWRcbiAgICAgICAgZmluYWxPcGNvZGUgPSBvcGNvZGVcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmFsT3Bjb2RlICE9PSBXRUJTT0NLRVRfT1BDT0RFX1RFWFQpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihgVW5zdXBwb3J0ZWQgd2Vic29ja2V0IGRhdGEgb3Bjb2RlIGFmdGVyIHJlYXNzZW1ibHk6ICR7ZmluYWxPcGNvZGV9YClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgYWRtaXNzaW9uID0gdGhpcy5fYWRtaXRJbmJvdW5kTWVzc2FnZShmaW5hbFBheWxvYWQubGVuZ3RoKVxuXG4gICAgICBpZiAoIWFkbWlzc2lvbikgcmV0dXJuXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBKU09OLnBhcnNlKGZpbmFsUGF5bG9hZC50b1N0cmluZyhcInV0Zi04XCIpKVxuXG4gICAgICAgIHRoaXMuX2hhbmRsZU1lc3NhZ2VXb3JrKHthZG1pc3Npb24sIG1lc3NhZ2V9KS5jYXRjaCgoY2F1Z2h0RXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zdCBjbGllbnRFcnJvck1lc3NhZ2UgPSBjYXVnaHRFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gY2F1Z2h0RXJyb3IubWVzc2FnZSA6IFN0cmluZyhjYXVnaHRFcnJvcilcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuX3JlcG9ydFVuZXhwZWN0ZWREaXNwYXRjaEVycm9yKGNhdWdodEVycm9yLCB7XG4gICAgICAgICAgICBzdGFnZTogXCJ3ZWJzb2NrZXQtbWVzc2FnZS1kaXNwYXRjaFwiXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBtZXNzYWdlIGhhbmRsZXIgZmFpbGVkXCIsIGVycm9yXSlcbiAgICAgICAgICB0aGlzLnNlbmRKc29uKHtcbiAgICAgICAgICAgIGVycm9yOiBjbGllbnRFcnJvck1lc3NhZ2UsXG4gICAgICAgICAgICB0eXBlOiBcImVycm9yXCJcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fcmVsZWFzZUluYm91bmRBZG1pc3Npb24oYWRtaXNzaW9uKVxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJGYWlsZWQgdG8gcGFyc2Ugd2Vic29ja2V0IG1lc3NhZ2VcIiwgZXJyb3JdKVxuICAgICAgICB0aGlzLnNlbmRKc29uKHtlcnJvcjogXCJJbnZhbGlkIHdlYnNvY2tldCBtZXNzYWdlXCIsIHR5cGU6IFwiZXJyb3JcIn0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvcGllcyB0aGUgbGVhZGluZyBidWZmZXJlZCBieXRlcyB3aXRob3V0IGNvbnN1bWluZyB0aGVtLiBIZWFkZXJcbiAgICogaW5zcGVjdGlvbiBpcyBib3VuZGVkIHRvIHRoZSB3ZWJzb2NrZXQgaGVhZGVyIHNpemUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBieXRlQ291bnQgLSBOdW1iZXIgb2YgbGVhZGluZyBieXRlcyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7QnVmZmVyfSAtIENvcGllZCBwcmVmaXguXG4gICAqL1xuICBfcGVla0J1ZmZlcmVkQnl0ZXMoYnl0ZUNvdW50KSB7XG4gICAgY29uc3QgcHJlZml4ID0gQnVmZmVyLmFsbG9jVW5zYWZlKGJ5dGVDb3VudClcbiAgICBsZXQgY29waWVkQnl0ZXMgPSAwXG4gICAgbGV0IGNodW5rT2Zmc2V0ID0gdGhpcy5fYnVmZmVyQ2h1bmtPZmZzZXRcblxuICAgIGZvciAobGV0IGNodW5rSW5kZXggPSB0aGlzLl9idWZmZXJDaHVua0luZGV4OyBjaHVua0luZGV4IDwgdGhpcy5fYnVmZmVyQ2h1bmtzLmxlbmd0aDsgY2h1bmtJbmRleCArPSAxKSB7XG4gICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2J1ZmZlckNodW5rc1tjaHVua0luZGV4XVxuICAgICAgY29uc3QgYnl0ZXNGcm9tQ2h1bmsgPSBNYXRoLm1pbihjaHVuay5sZW5ndGggLSBjaHVua09mZnNldCwgYnl0ZUNvdW50IC0gY29waWVkQnl0ZXMpXG5cbiAgICAgIGNodW5rLmNvcHkocHJlZml4LCBjb3BpZWRCeXRlcywgY2h1bmtPZmZzZXQsIGNodW5rT2Zmc2V0ICsgYnl0ZXNGcm9tQ2h1bmspXG4gICAgICBjb3BpZWRCeXRlcyArPSBieXRlc0Zyb21DaHVua1xuICAgICAgY2h1bmtPZmZzZXQgPSAwXG4gICAgICBpZiAoY29waWVkQnl0ZXMgPT09IGJ5dGVDb3VudCkgYnJlYWtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJlZml4XG4gIH1cblxuICAvKipcbiAgICogQ29uc3VtZXMgYSBjb21wbGV0ZSBmcmFtZSBmcm9tIHRoZSBjaHVuayBxdWV1ZSB3aXRoIG9uZSBib3VuZGVkIGNvcHkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBieXRlQ291bnQgLSBDb21wbGV0ZSBmcmFtZSBieXRlIGNvdW50LlxuICAgKiBAcmV0dXJucyB7QnVmZmVyfSAtIENvbnRpZ3VvdXMgZnJhbWUgYnl0ZXMuXG4gICAqL1xuICBfY29uc3VtZUJ1ZmZlcmVkQnl0ZXMoYnl0ZUNvdW50KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKGJ5dGVDb3VudClcbiAgICBsZXQgY29waWVkQnl0ZXMgPSAwXG5cbiAgICB3aGlsZSAoY29waWVkQnl0ZXMgPCBieXRlQ291bnQpIHtcbiAgICAgIGNvbnN0IGNodW5rID0gdGhpcy5fYnVmZmVyQ2h1bmtzW3RoaXMuX2J1ZmZlckNodW5rSW5kZXhdXG4gICAgICBjb25zdCBieXRlc0Zyb21DaHVuayA9IE1hdGgubWluKGNodW5rLmxlbmd0aCAtIHRoaXMuX2J1ZmZlckNodW5rT2Zmc2V0LCBieXRlQ291bnQgLSBjb3BpZWRCeXRlcylcblxuICAgICAgY2h1bmsuY29weShcbiAgICAgICAgcmVzdWx0LFxuICAgICAgICBjb3BpZWRCeXRlcyxcbiAgICAgICAgdGhpcy5fYnVmZmVyQ2h1bmtPZmZzZXQsXG4gICAgICAgIHRoaXMuX2J1ZmZlckNodW5rT2Zmc2V0ICsgYnl0ZXNGcm9tQ2h1bmtcbiAgICAgIClcbiAgICAgIGNvcGllZEJ5dGVzICs9IGJ5dGVzRnJvbUNodW5rXG4gICAgICB0aGlzLl9idWZmZXJDaHVua09mZnNldCArPSBieXRlc0Zyb21DaHVua1xuXG4gICAgICBpZiAodGhpcy5fYnVmZmVyQ2h1bmtPZmZzZXQgPT09IGNodW5rLmxlbmd0aCkge1xuICAgICAgICB0aGlzLl9idWZmZXJDaHVua0luZGV4ICs9IDFcbiAgICAgICAgdGhpcy5fYnVmZmVyQ2h1bmtPZmZzZXQgPSAwXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2J1ZmZlckNodW5rSW5kZXggPT09IHRoaXMuX2J1ZmZlckNodW5rcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2J1ZmZlckNodW5rcyA9IFtdXG4gICAgICB0aGlzLl9idWZmZXJDaHVua0luZGV4ID0gMFxuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLl9idWZmZXJDaHVua0luZGV4ID49IDY0ICYmXG4gICAgICB0aGlzLl9idWZmZXJDaHVua0luZGV4ICogMiA+PSB0aGlzLl9idWZmZXJDaHVua3MubGVuZ3RoXG4gICAgKSB7XG4gICAgICB0aGlzLl9idWZmZXJDaHVua3MgPSB0aGlzLl9idWZmZXJDaHVua3Muc2xpY2UodGhpcy5fYnVmZmVyQ2h1bmtJbmRleClcbiAgICAgIHRoaXMuX2J1ZmZlckNodW5rSW5kZXggPSAwXG4gICAgfVxuXG4gICAgdGhpcy5fYnVmZmVyZWRCeXRlcyAtPSBieXRlQ291bnRcbiAgICB0aGlzLl9idWZmZXJlZEZyYW1lQ29weUJ5dGVzICs9IGJ5dGVDb3VudFxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIERyb3BzIGFsbCBpbmNvbXBsZXRlIGZyYW1lIGNodW5rcy5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfY2xlYXJCdWZmZXJlZEZyYW1lQ2h1bmtzKCkge1xuICAgIHRoaXMuX2J1ZmZlckNodW5rcyA9IFtdXG4gICAgdGhpcy5fYnVmZmVyQ2h1bmtJbmRleCA9IDBcbiAgICB0aGlzLl9idWZmZXJDaHVua09mZnNldCA9IDBcbiAgICB0aGlzLl9idWZmZXJlZEJ5dGVzID0gMFxuICB9XG5cbiAgLyoqXG4gICAqIFRlbnRhdGl2ZWx5IGFkbWl0cyBvbmUgY29tcGxldGUgdGV4dCBtZXNzYWdlIGJlZm9yZSBkZWNvZGluZyBpdC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGJ5dGVMZW5ndGggLSBFeGFjdCBjb21wbGV0ZSByYXcgdGV4dCBwYXlsb2FkIGJ5dGVzLlxuICAgKiBAcmV0dXJucyB7SW5ib3VuZE1lc3NhZ2VBZG1pc3Npb24gfCBudWxsfSAtIEFkbWlzc2lvbiBvd25lcnNoaXAsIG9yIG51bGwgYWZ0ZXIgb3ZlcmxvYWQvY2xvc2UuXG4gICAqL1xuICBfYWRtaXRJbmJvdW5kTWVzc2FnZShieXRlTGVuZ3RoKSB7XG4gICAgaWYgKHRoaXMuX2luYm91bmRDbG9zZWQpIHJldHVybiBudWxsXG5cbiAgICBpZiAoXG4gICAgICB0aGlzLl9pbmJvdW5kUGVuZGluZ01lc3NhZ2VzICsgMSA+IHRoaXMuX2luYm91bmRNYXhQZW5kaW5nTWVzc2FnZXMgfHxcbiAgICAgIHRoaXMuX2luYm91bmRQZW5kaW5nQnl0ZXMgKyBieXRlTGVuZ3RoID4gdGhpcy5faW5ib3VuZE1heFBlbmRpbmdCeXRlc1xuICAgICkge1xuICAgICAgdGhpcy5fY2xvc2VGb3JJbmJvdW5kQmFja2xvZyhieXRlTGVuZ3RoKVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICB0aGlzLl9pbmJvdW5kUGVuZGluZ01lc3NhZ2VzICs9IDFcbiAgICB0aGlzLl9pbmJvdW5kUGVuZGluZ0J5dGVzICs9IGJ5dGVMZW5ndGhcblxuICAgIHJldHVybiB7XG4gICAgICBieXRlTGVuZ3RoLFxuICAgICAgZ2VuZXJhdGlvbjogdGhpcy5faW5ib3VuZEFjY291bnRpbmdHZW5lcmF0aW9uLFxuICAgICAgcmVsZWFzZWQ6IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIG9uZSBhZG1pc3Npb24gZXhhY3RseSBvbmNlLlxuICAgKiBAcGFyYW0ge0luYm91bmRNZXNzYWdlQWRtaXNzaW9ufSBhZG1pc3Npb24gLSBBZG1pc3Npb24gb3duZXJzaGlwLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9yZWxlYXNlSW5ib3VuZEFkbWlzc2lvbihhZG1pc3Npb24pIHtcbiAgICBpZiAoYWRtaXNzaW9uLnJlbGVhc2VkKSByZXR1cm5cblxuICAgIGFkbWlzc2lvbi5yZWxlYXNlZCA9IHRydWVcbiAgICBpZiAoYWRtaXNzaW9uLmdlbmVyYXRpb24gIT09IHRoaXMuX2luYm91bmRBY2NvdW50aW5nR2VuZXJhdGlvbikgcmV0dXJuXG5cbiAgICB0aGlzLl9pbmJvdW5kUGVuZGluZ01lc3NhZ2VzIC09IDFcbiAgICB0aGlzLl9pbmJvdW5kUGVuZGluZ0J5dGVzIC09IGFkbWlzc2lvbi5ieXRlTGVuZ3RoXG4gIH1cblxuICAvKipcbiAgICogQWJhbmRvbnMgYWxsIGFkbWl0dGVkIGlucHV0IGFuZCBpbnZhbGlkYXRlcyBsYXRlIHNldHRsZW1lbnRzLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9hYmFuZG9uSW5ib3VuZE1lc3NhZ2VzKCkge1xuICAgIHRoaXMuX2luYm91bmRDbG9zZWQgPSB0cnVlXG4gICAgdGhpcy5faW5ib3VuZEFjY291bnRpbmdHZW5lcmF0aW9uICs9IDFcbiAgICB0aGlzLl9pbmJvdW5kUGVuZGluZ0J5dGVzID0gMFxuICAgIHRoaXMuX2luYm91bmRQZW5kaW5nTWVzc2FnZXMgPSAwXG4gICAgdGhpcy5tZXNzYWdlUXVldWUgPSBbXVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcm1hbmVudGx5IGNsb3NlcyBhIHNlc3Npb24gd2hvc2UgbmV4dCBtZXNzYWdlIGV4Y2VlZGVkIGl0cyBiYWNrbG9nIGJ1ZGdldC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlamVjdGVkQnl0ZXMgLSBSYXcgcGF5bG9hZCBieXRlcyByZWplY3RlZCBhdCBhZG1pc3Npb24uXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX2Nsb3NlRm9ySW5ib3VuZEJhY2tsb2cocmVqZWN0ZWRCeXRlcykge1xuICAgIGlmICh0aGlzLl9pbmJvdW5kQmFja2xvZ092ZXJsb2FkZWQgfHwgdGhpcy5faW5ib3VuZENsb3NlZCkgcmV0dXJuXG5cbiAgICB0aGlzLl9pbmJvdW5kQmFja2xvZ092ZXJsb2FkZWQgPSB0cnVlXG4gICAgdGhpcy5sb2dnZXIud2FybigoKSA9PiBbXG4gICAgICBcIkluYm91bmQgd2Vic29ja2V0IG1lc3NhZ2UgYmFja2xvZyBleGNlZWRlZDsgY2xvc2luZyBjb25uZWN0aW9uXCIsXG4gICAgICB7XG4gICAgICAgIG1heEJ5dGVzOiB0aGlzLl9pbmJvdW5kTWF4UGVuZGluZ0J5dGVzLFxuICAgICAgICBtYXhNZXNzYWdlczogdGhpcy5faW5ib3VuZE1heFBlbmRpbmdNZXNzYWdlcyxcbiAgICAgICAgcGVuZGluZ0J5dGVzOiB0aGlzLl9pbmJvdW5kUGVuZGluZ0J5dGVzLFxuICAgICAgICBwZW5kaW5nTWVzc2FnZXM6IHRoaXMuX2luYm91bmRQZW5kaW5nTWVzc2FnZXMsXG4gICAgICAgIHJlamVjdGVkQnl0ZXNcbiAgICAgIH1cbiAgICBdKVxuICAgIHRoaXMuc2VuZEdvb2RieWUodGhpcy5jbGllbnQsIHtcbiAgICAgIGNvZGU6IFdFQlNPQ0tFVF9DTE9TRV9QT0xJQ1lfVklPTEFUSU9OLFxuICAgICAgcmVhc29uOiBXRUJTT0NLRVRfSU5CT1VORF9CQUNLTE9HX0NMT1NFX1JFQVNPTlxuICAgIH0pXG4gICAgdGhpcy5faGFuZGxlQ2xvc2Uoe2FsbG93UmVzdW1lOiBmYWxzZX0pXG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIGFmdGVyIGFuIGluYm91bmQgYnVmZmVyaW5nIGxpbWl0IGFuZCByZWxlYXNlcyBhbGwgcGFyc2VyLW93bmVkIGlucHV0LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9jbG9zZUZvckluYm91bmRMaW1pdCgpIHtcbiAgICB0aGlzLl9yZXNldEZyYWdtZW50QnVmZmVyKClcbiAgICB0aGlzLl9jbGVhckJ1ZmZlcmVkRnJhbWVDaHVua3MoKVxuICAgIHRoaXMuc2VuZEdvb2RieWUodGhpcy5jbGllbnQpXG4gICAgdGhpcy5faGFuZGxlQ2xvc2UoKVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSBjb250aW51YXRpb24tZnJhbWUgcGF5bG9hZCB0byB0aGUgaW4tcHJvZ3Jlc3NcbiAgICogZnJhZ21lbnRlZCBtZXNzYWdlLiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgZnJhZ21lbnQgd2FzIGFjY2VwdGVkXG4gICAqIGFuZCBmYWxzZSB3aGVuIHRoZSBwZXItbWVzc2FnZSBjYXAgd2FzIGhpdCBhbmQgdGhlIHNvY2tldCBoYXNcbiAgICogYmVlbiBjbG9zZWQuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBwYXlsb2FkIC0gQ29udGludWF0aW9uLWZyYW1lIGJ5dGVzIHRvIGFwcGVuZC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgZnJhZ21lbnQgd2FzIGFjY2VwdGVkLlxuICAgKi9cbiAgX2FwcGVuZEZyYWdtZW50KHBheWxvYWQpIHtcbiAgICAvLyBHdWFyZCBwdXNoaW5nIGZpcnN0IHNvIGBfZW5mb3JjZUZyYWdtZW50TGltaXRzYCBzZWVzIHRoZSBmaW5hbFxuICAgIC8vIHN0YXRlOyBvbiBvdmVyZmxvdyB0aGUgcmVzZXQgaW5zaWRlIHRoZSBlbmZvcmNlciBkcm9wcyB0aGVcbiAgICAvLyBidWZmZXJlZCBmcmFnbWVudHMuXG4gICAgdGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzPy5wdXNoKHBheWxvYWQpXG4gICAgdGhpcy5fZnJhZ21lbnRlZEJ5dGVzICs9IHBheWxvYWQubGVuZ3RoXG5cbiAgICByZXR1cm4gdGhpcy5fZW5mb3JjZUZyYWdtZW50TGltaXRzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgZnJhZ21lbnRlZCBtZXNzYWdlIGhhcyBub3QgZXhjZWVkZWQgdGhlIGJ5dGUgb3JcbiAgICogZnJhZ21lbnQtY291bnQgY2Fwcy4gT24gb3ZlcmZsb3csIGNsZWFycyB0aGUgYnVmZmVyLCBzZW5kcyBhXG4gICAqIGNsb3NlIGZyYW1lLCBhbmQgdGVhcnMgdGhlIHNlc3Npb24gZG93bi4gUmV0dXJucyB0cnVlIHdoZW4gdGhlXG4gICAqIGNhbGxlciBjYW4gY29udGludWUgcHJvY2Vzc2luZywgZmFsc2Ugd2hlbiB0aGUgc2Vzc2lvbiBpcyBiZWluZ1xuICAgKiBjbG9zZWQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgZnJhZ21lbnQgcHJvY2Vzc2luZyBtYXkgY29udGludWUuXG4gICAqL1xuICBfZW5mb3JjZUZyYWdtZW50TGltaXRzKCkge1xuICAgIGlmICh0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHMgPT09IG51bGwpIHJldHVybiB0cnVlXG5cbiAgICBjb25zdCBmcmFnbWVudENvdW50ID0gdGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzLmxlbmd0aFxuICAgIGNvbnN0IG92ZXJCeXRlcyA9IHRoaXMuX2ZyYWdtZW50ZWRCeXRlcyA+IFdFQlNPQ0tFVF9NQVhfRlJBR01FTlRFRF9NRVNTQUdFX0JZVEVTXG4gICAgY29uc3Qgb3ZlckZyYWdtZW50cyA9IGZyYWdtZW50Q291bnQgPiBXRUJTT0NLRVRfTUFYX0ZSQUdNRU5URURfTUVTU0FHRV9GUkFHTUVOVFNcblxuICAgIGlmICghb3ZlckJ5dGVzICYmICFvdmVyRnJhZ21lbnRzKSByZXR1cm4gdHJ1ZVxuXG4gICAgdGhpcy5sb2dnZXIud2FybigoKSA9PiBbXG4gICAgICBcIkZyYWdtZW50ZWQgd2Vic29ja2V0IG1lc3NhZ2UgZXhjZWVkZWQgY2FwczsgY2xvc2luZyBjb25uZWN0aW9uXCIsXG4gICAgICB7XG4gICAgICAgIGZyYWdtZW50Qnl0ZXM6IHRoaXMuX2ZyYWdtZW50ZWRCeXRlcyxcbiAgICAgICAgZnJhZ21lbnRDb3VudCxcbiAgICAgICAgbWF4Qnl0ZXM6IFdFQlNPQ0tFVF9NQVhfRlJBR01FTlRFRF9NRVNTQUdFX0JZVEVTLFxuICAgICAgICBtYXhGcmFnbWVudHM6IFdFQlNPQ0tFVF9NQVhfRlJBR01FTlRFRF9NRVNTQUdFX0ZSQUdNRU5UU1xuICAgICAgfVxuICAgIF0pXG5cbiAgICB0aGlzLl9jbG9zZUZvckluYm91bmRMaW1pdCgpXG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc2V0IGZyYWdtZW50IGJ1ZmZlci5cbiAgICogQHJldHVybnMge3ZvaWR9ICovXG4gIF9yZXNldEZyYWdtZW50QnVmZmVyKCkge1xuICAgIHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2FkcyA9IG51bGxcbiAgICB0aGlzLl9mcmFnbWVudGVkT3Bjb2RlID0gbnVsbFxuICAgIHRoaXMuX2ZyYWdtZW50ZWRCeXRlcyA9IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHBlci1zZXNzaW9uIGhlYXJ0YmVhdC4gRWFjaCB0aWNrIHBpbmdzIHRoZSBjbGllbnQgYW5kXG4gICAqIHJlYXBzIHRoZSBzZXNzaW9uIGlmIHRoZSBwcmV2aW91cyBwaW5nIHdlbnQgdW5hbnN3ZXJlZCwgc28gYVxuICAgKiBoYWxmLW9wZW4gc29ja2V0IChjbGllbnQgZ29uZSB3aXRob3V0IGEgVENQIEZJTiAvIGNsb3NlIGZyYW1lKVxuICAgKiBjYW5ub3QgbGluZ2VyIGZvcmV2ZXIgaG9sZGluZyBjaGFubmVsIHN1YnNjcmlwdGlvbnMuIERpc2FibGVkIHdoZW5cbiAgICogdGhlIGNvbmZpZ3VyZWQgaW50ZXJ2YWwgaXMgMC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfc3RhcnRIZWFydGJlYXQoKSB7XG4gICAgY29uc3QgaW50ZXJ2YWxTZWNvbmRzID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldFNlc3Npb25IZWFydGJlYXRTZWNvbmRzKClcblxuICAgIGlmICghaW50ZXJ2YWxTZWNvbmRzIHx8IGludGVydmFsU2Vjb25kcyA8PSAwKSByZXR1cm5cblxuICAgIHRoaXMuX2hlYXJ0YmVhdFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5faGVhcnRiZWF0VGljaygpLCBpbnRlcnZhbFNlY29uZHMgKiAxMDAwKVxuXG4gICAgLy8gRG9uJ3QgbGV0IHRoZSBoZWFydGJlYXQgdGltZXIga2VlcCB0aGUgcHJvY2VzcyBhbGl2ZS5cbiAgICBpZiAodHlwZW9mIHRoaXMuX2hlYXJ0YmVhdFRpbWVyLnVucmVmID09PSBcImZ1bmN0aW9uXCIpIHRoaXMuX2hlYXJ0YmVhdFRpbWVyLnVucmVmKClcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmUgaGVhcnRiZWF0IGN5Y2xlLiBSZWFwcyB0aGUgc2Vzc2lvbiB2aWEgdGhlIG5vcm1hbCBjbG9zZSBwYXRoXG4gICAqIHdoZW4gdGhlIHByZXZpb3VzIHBpbmcgd2FzIG5vdCBhbnN3ZXJlZDsgb3RoZXJ3aXNlIG1hcmtzIGl0XG4gICAqIHBlbmRpbmcgYW5kIHBpbmdzIGFnYWluLiBCcm93c2VycyBhbmQgUmVhY3QgTmF0aXZlIHNvY2tldHMgYW5zd2VyXG4gICAqIHNlcnZlciBwaW5ncyB3aXRoIGFuIGF1dG9tYXRpYyBwb25nLCB3aGljaCBsYW5kcyBpbiBgX3Byb2Nlc3NCdWZmZXJgXG4gICAqIGFuZCByZS1tYXJrcyB0aGUgc2Vzc2lvbiBhbGl2ZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfaGVhcnRiZWF0VGljaygpIHtcbiAgICBpZiAodGhpcy5fcGF1c2VkIHx8ICF0aGlzLmNsaWVudD8uZXZlbnRzKSByZXR1cm5cblxuICAgIGlmICghdGhpcy5faGVhcnRiZWF0QWxpdmUpIHtcbiAgICAgIC8vIE5vIGZyYW1lIGFycml2ZWQgc2luY2UgdGhlIGxhc3QgcGluZyDigJQgdGhlIHNvY2tldCBpcyBkZWFkLlxuICAgICAgLy8gUm91dGUgdGhyb3VnaCBgX2hhbmRsZUNsb3NlYCBzbyByZXN1bWFibGUgc3RhdGUgc3RpbGwgcGF1c2VzXG4gICAgICAvLyBmb3IgdGhlIGdyYWNlIHdpbmRvdyBhbmQgZXZlcnl0aGluZyBlbHNlIGlzIHRvcm4gZG93bi5cbiAgICAgIHRoaXMuX3N0b3BIZWFydGJlYXQoKVxuICAgICAgdGhpcy5faGFuZGxlQ2xvc2UoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5faGVhcnRiZWF0QWxpdmUgPSBmYWxzZVxuICAgIHRoaXMuX3NlbmRDb250cm9sRnJhbWUoV0VCU09DS0VUX09QQ09ERV9QSU5HLCBCdWZmZXIuYWxsb2MoMCkpXG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIHBlci1zZXNzaW9uIGhlYXJ0YmVhdCB0aW1lciwgaWYgYW55LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9zdG9wSGVhcnRiZWF0KCkge1xuICAgIGlmICh0aGlzLl9oZWFydGJlYXRUaW1lcikge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9oZWFydGJlYXRUaW1lcilcbiAgICAgIHRoaXMuX2hlYXJ0YmVhdFRpbWVyID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNlbmQgY29udHJvbCBmcmFtZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG9wY29kZSAtIE9wY29kZS5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IHBheWxvYWQgLSBQYXlsb2FkIGRhdGEuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIF9zZW5kQ29udHJvbEZyYW1lKG9wY29kZSwgcGF5bG9hZCkge1xuICAgIGNvbnN0IGhlYWRlciA9IEJ1ZmZlci5hbGxvYygyKVxuXG4gICAgaGVhZGVyWzBdID0gV0VCU09DS0VUX0ZJTkFMX0ZSQU1FIHwgb3Bjb2RlXG4gICAgaGVhZGVyWzFdID0gcGF5bG9hZC5sZW5ndGhcblxuICAgIHRoaXMuY2xpZW50LmV2ZW50cy5lbWl0KFwib3V0cHV0XCIsIEJ1ZmZlci5jb25jYXQoW2hlYWRlciwgcGF5bG9hZF0pLCB7d2Vic29ja2V0RnJhbWU6IHRydWV9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2VuZCBqc29uLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYm9keSAtIFJlcXVlc3QgYm9keS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2VuZEpzb24oYm9keSkge1xuICAgIC8vIFdoaWxlIHBhdXNlZCAod2FpdGluZyBmb3IgYSByZXN1bWUpLCBzdGFzaCBmcmFtZXMgaW4gYW5cbiAgICAvLyBvdXRib3VuZCBxdWV1ZSBhbmQgZmx1c2ggdGhlbSBpbiBvcmRlciBvbiByZXN1bWUuIENhcHBlZCB0b1xuICAgIC8vIHByZXZlbnQgcnVuYXdheSBtZW1vcnkgdXNlIHdoaWxlIHRoZSBjbGllbnQgaXMgb2ZmbGluZS5cbiAgICBpZiAodGhpcy5fcGF1c2VkKSB7XG4gICAgICB0aGlzLl9vdXRib3VuZFF1ZXVlIHx8PSBbXVxuXG4gICAgICBpZiAodGhpcy5fb3V0Ym91bmRRdWV1ZS5sZW5ndGggPj0gV0VCU09DS0VUX1BBVVNFRF9RVUVVRV9DQVApIHtcbiAgICAgICAgLy8gRHJvcCBvbGRlc3Qgc28gdGhlIG1vc3QgcmVjZW50IGFjdGl2aXR5IHdpbnMgb24gcmVzdW1lLlxuICAgICAgICB0aGlzLl9vdXRib3VuZFF1ZXVlLnNoaWZ0KClcbiAgICAgIH1cblxuICAgICAgdGhpcy5fb3V0Ym91bmRRdWV1ZS5wdXNoKGJvZHkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY2xpZW50Py5ldmVudHMpIHJldHVyblxuXG4gICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KGJvZHkpXG4gICAgY29uc3QgcGF5bG9hZCA9IEJ1ZmZlci5mcm9tKGpzb24sIFwidXRmLThcIilcbiAgICBsZXQgaGVhZGVyXG5cbiAgICBpZiAocGF5bG9hZC5sZW5ndGggPCAxMjYpIHtcbiAgICAgIGhlYWRlciA9IEJ1ZmZlci5hbGxvYygyKVxuICAgICAgaGVhZGVyWzFdID0gcGF5bG9hZC5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKHBheWxvYWQubGVuZ3RoIDwgNjU1MzYpIHtcbiAgICAgIGhlYWRlciA9IEJ1ZmZlci5hbGxvYyg0KVxuICAgICAgaGVhZGVyWzFdID0gMTI2XG4gICAgICBoZWFkZXIud3JpdGVVSW50MTZCRShwYXlsb2FkLmxlbmd0aCwgMilcbiAgICB9IGVsc2Uge1xuICAgICAgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDEwKVxuICAgICAgaGVhZGVyWzFdID0gMTI3XG4gICAgICBoZWFkZXIud3JpdGVCaWdVSW50NjRCRShCaWdJbnQocGF5bG9hZC5sZW5ndGgpLCAyKVxuICAgIH1cblxuICAgIGhlYWRlclswXSA9IFdFQlNPQ0tFVF9GSU5BTF9GUkFNRSB8IFdFQlNPQ0tFVF9PUENPREVfVEVYVFxuXG4gICAgdGhpcy5jbGllbnQuZXZlbnRzLmVtaXQoXCJvdXRwdXRcIiwgQnVmZmVyLmNvbmNhdChbaGVhZGVyLCBwYXlsb2FkXSksIHt3ZWJzb2NrZXRGcmFtZTogdHJ1ZX0pXG4gIH1cblxuICAvKipcbiAgICogRmx1c2hlcyB0aGUgcGF1c2VkIG91dGJvdW5kIHF1ZXVlIG92ZXIgdGhlIGN1cnJlbnQgc29ja2V0LlxuICAgKiBDYWxsZWQgZHVyaW5nIHJlc3VtZSBhZnRlciBgc2Vzc2lvbi1yZXN1bWVkYCBoYXMgYmVlbiBzZW50IG9uXG4gICAqIHRoZSBORVcgc2Vzc2lvbidzIHNvY2tldCAobm90IHRoaXMgc2Vzc2lvbidzKS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfZmx1c2hPdXRib3VuZFF1ZXVlKCkge1xuICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5fb3V0Ym91bmRRdWV1ZSB8fCBbXVxuXG4gICAgdGhpcy5fb3V0Ym91bmRRdWV1ZSA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGJvZHkgb2YgcXVldWUpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oYm9keSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBzdWJzY3JpYmUgdG8gY2hhbm5lbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7e2Fja25vd2xlZGdlPzogYm9vbGVhbiwgY2hhbm5lbEhhbmRsZXI/OiBpbXBvcnQoXCIuLi93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiKS5kZWZhdWx0LCBsYXN0RXZlbnRJZD86IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgPz4sIHN1YnNjcmlwdGlvbkNoYW5uZWw/OiBzdHJpbmd9fSBbb3B0aW9uc10gLSBTdWJzY3JpYmUgb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciB0aGUgc3Vic2NyaXB0aW9uIHdhcyBhZGRlZC5cbiAgICovXG4gIGFzeW5jIHN1YnNjcmliZVRvQ2hhbm5lbChjaGFubmVsLCB7YWNrbm93bGVkZ2UgPSB0cnVlLCBjaGFubmVsSGFuZGxlciwgbGFzdEV2ZW50SWQsIHBhcmFtcywgc3Vic2NyaXB0aW9uQ2hhbm5lbH0gPSB7fSkge1xuICAgIGF3YWl0IHdlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9uKHRoaXMuY29uZmlndXJhdGlvbikubWFya0NoYW5uZWxJbnRlcmVzdGVkKGNoYW5uZWwpXG5cbiAgICBjb25zdCByZXBsYXlTdGF0ZSA9IGF3YWl0IHRoaXMuX3ByZXBhcmVSZXBsYXlTdGF0ZSh7XG4gICAgICBjaGFubmVsLFxuICAgICAgbGFzdEV2ZW50SWQsXG4gICAgICBzdWJzY3JpcHRpb25DaGFubmVsOiBzdWJzY3JpcHRpb25DaGFubmVsIHx8IGNoYW5uZWwsXG4gICAgICBzdWJzY3JpcHRpb25QYXJhbXM6IHBhcmFtc1xuICAgIH0pXG5cbiAgICBpZiAocmVwbGF5U3RhdGUgPT09IGZhbHNlKSByZXR1cm4gZmFsc2VcbiAgICBpZiAocmVwbGF5U3RhdGUpIHtcbiAgICAgIHRoaXMuY2hhbm5lbFJlcGxheVN0YXRlcy5zZXQoY2hhbm5lbCwgcmVwbGF5U3RhdGUpXG4gICAgfVxuXG4gICAgdGhpcy5hZGRTdWJzY3JpcHRpb24oY2hhbm5lbClcblxuICAgIGlmIChjaGFubmVsSGFuZGxlcikge1xuICAgICAgaWYgKCF0aGlzLnN1YnNjcmlwdGlvbkhhbmRsZXJzLmhhcyhjaGFubmVsKSkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbkhhbmRsZXJzLnNldChjaGFubmVsLCBuZXcgU2V0KCkpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSGFuZGxlcnMuZ2V0KGNoYW5uZWwpPy5hZGQoY2hhbm5lbEhhbmRsZXIpXG5cbiAgICAgIGlmICghdGhpcy5oYW5kbGVyU3Vic2NyaXB0aW9ucy5oYXMoY2hhbm5lbEhhbmRsZXIpKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlclN1YnNjcmlwdGlvbnMuc2V0KGNoYW5uZWxIYW5kbGVyLCBuZXcgU2V0KCkpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuaGFuZGxlclN1YnNjcmlwdGlvbnMuZ2V0KGNoYW5uZWxIYW5kbGVyKT8uYWRkKGNoYW5uZWwpXG4gICAgfVxuXG4gICAgaWYgKHJlcGxheVN0YXRlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLl9yZXBsYXlDaGFubmVsRXZlbnRzKHtjaGFubmVsLCByZXBsYXlTdGF0ZX0pXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCB0aGlzLl9maW5pc2hSZXBsYXlTdGF0ZShjaGFubmVsLCByZXBsYXlTdGF0ZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYWNrbm93bGVkZ2UpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe2NoYW5uZWwsIHR5cGU6IFwic3Vic2NyaWJlZFwifSlcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHNvY2tldCBjbG9zdXJlIGFuZCBvcHRpb25hbGx5IHJldGFpbnMgcmVzdW1hYmxlIHN0YXRlLlxuICAgKiBAcGFyYW0ge3thbGxvd1Jlc3VtZT86IGJvb2xlYW59fSBbb3B0aW9uc10gLSBDbG9zdXJlIGJlaGF2aW9yLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9oYW5kbGVDbG9zZSh7YWxsb3dSZXN1bWUgPSB0cnVlfSA9IHt9KSB7XG4gICAgdGhpcy5fcmVzZXRGcmFnbWVudEJ1ZmZlcigpXG4gICAgdGhpcy5fY2xlYXJCdWZmZXJlZEZyYW1lQ2h1bmtzKClcbiAgICB0aGlzLl9hYmFuZG9uSW5ib3VuZE1lc3NhZ2VzKClcblxuICAgIC8vIElmIHRoZSBzZXNzaW9uIGhhcyByZXN1bWFibGUgc3RhdGUgKGxpdmUgQ29ubmVjdGlvbiBvclxuICAgIC8vIENoYW5uZWxWMiBzdWJzY3JpcHRpb24pLCBtb3ZlIGl0IGludG8gdGhlIHBhdXNlZCByZWdpc3RyeVxuICAgIC8vIGluc3RlYWQgb2YgdGVhcmluZyBkb3duOyBhIG5ldyBzb2NrZXQgcHJlc2VudGluZyB0aGUgc2Vzc2lvbklkXG4gICAgLy8gdmlhIGBzZXNzaW9uLXJlc3VtZWAgd2l0aGluIHRoZSBncmFjZSB3aW5kb3cgd2lsbCByZWF0dGFjaC5cbiAgICBjb25zdCBoYXNSZXN1bWFibGVTdGF0ZSA9IHRoaXMuX2Nvbm5lY3Rpb25zLnNpemUgPiAwIHx8IHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnNpemUgPiAwXG5cbiAgICBpZiAoYWxsb3dSZXN1bWUgJiYgaGFzUmVzdW1hYmxlU3RhdGUgJiYgIXRoaXMuX3BhdXNlZCkge1xuICAgICAgLy8gUGF1c2VkIHNlc3Npb25zIGhhdmUgbm8gbGl2ZSBzb2NrZXQgdG8gcGluZzsgdGhlIGdyYWNlIHRpbWVyXG4gICAgICAvLyBvd25zIHRoZWlyIGV2ZW50dWFsIHRlYXJkb3duIGZyb20gaGVyZS5cbiAgICAgIHRoaXMuX3N0b3BIZWFydGJlYXQoKVxuICAgICAgdGhpcy5fcGF1c2VkID0gdHJ1ZVxuICAgICAgdGhpcy5zb2NrZXQgPSBudWxsXG4gICAgICAvLyBLaWNrIG9mZiBhdXRoLWlkZW50aXR5IGNhcHR1cmUgZm9yIHJlc3VtZSB2ZXJpZmljYXRpb24uIFJ1bnNcbiAgICAgIC8vIGluIHRoZSBiYWNrZ3JvdW5kIOKAlCBgX2hhbmRsZVNlc3Npb25SZXN1bWVgIGF3YWl0c1xuICAgICAgLy8gYF9yZXN1bWVJZGVudGl0eVByb21pc2VgIGJlZm9yZSBjb21wYXJpbmcuIFBhdXNlIHJlZ2lzdHJhdGlvblxuICAgICAgLy8gaXMgc3luY2hyb25vdXMgc28gYSByZXN1bWUgYXJyaXZpbmcgaW1tZWRpYXRlbHkgc3RpbGwgZmluZHNcbiAgICAgIC8vIHRoZSBzZXNzaW9uLlxuICAgICAgdGhpcy5fcmVzdW1lSWRlbnRpdHlQcm9taXNlID0gdGhpcy5fY2FwdHVyZVJlc3VtZUlkZW50aXR5KClcbiAgICAgIHZvaWQgdGhpcy5fZmlyZU9uRGlzY29ubmVjdCgpXG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3BhdXNlV2Vic29ja2V0U2Vzc2lvbih0aGlzKVxuICAgICAgdGhpcy5ldmVudHMuZW1pdChcImNsb3NlXCIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9zdG9wSGVhcnRiZWF0KClcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3dlYnNvY2tldFNlc3Npb25zLmRlbGV0ZSh0aGlzKVxuICAgIHZvaWQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJDbG9zZSgpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWwoKVxuICAgIHZvaWQgdGhpcy5fdGVhcmRvd25Db25uZWN0aW9ucyhcInNlc3Npb25fZGVzdHJveWVkXCIpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWxTdWJzY3JpcHRpb25zKClcbiAgICB0aGlzLmV2ZW50cy5lbWl0KFwiY2xvc2VcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYnkgdGhlIGdyYWNlIHRpbWVyIHdoZW4gdGhlIHBhdXNlZCBwZXJpb2QgZXhwaXJlcyB3aXRob3V0XG4gICAqIGEgcmVzdW1lLiBUZWFycyBkb3duIGFsbCBsaXZlIENvbm5lY3Rpb25zICsgQ2hhbm5lbCBzdWJzIGFuZFxuICAgKiBkcm9wcyB0aGUgc2Vzc2lvbi5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfZmluYWxpemVHcmFjZUV4cGlyeSgpIHtcbiAgICB0aGlzLl9zdG9wSGVhcnRiZWF0KClcbiAgICB0aGlzLl9yZXNldEZyYWdtZW50QnVmZmVyKClcbiAgICB0aGlzLl9jbGVhckJ1ZmZlcmVkRnJhbWVDaHVua3MoKVxuICAgIHRoaXMuX2FiYW5kb25JbmJvdW5kTWVzc2FnZXMoKVxuICAgIHRoaXMuY29uZmlndXJhdGlvbi5fd2Vic29ja2V0U2Vzc2lvbnMuZGVsZXRlKHRoaXMpXG4gICAgdm9pZCB0aGlzLl9ydW5NZXNzYWdlSGFuZGxlckNsb3NlKClcbiAgICB2b2lkIHRoaXMuX3RlYXJkb3duQ2hhbm5lbCgpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNvbm5lY3Rpb25zKFwiZ3JhY2VfZXhwaXJlZFwiKVxuICAgIHZvaWQgdGhpcy5fdGVhcmRvd25DaGFubmVsU3Vic2NyaXB0aW9ucygpXG4gICAgdGhpcy5ldmVudHMuZW1pdChcImNsb3NlXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB0aGUgY29uZmlndXJlZCBpZGVudGl0eSByZXNvbHZlciBhZ2FpbnN0IHRoaXMgc2Vzc2lvbi5cbiAgICogVGhlIHJldHVybmVkIHByb21pc2UgaXMgc3RvcmVkIGF0IHBhdXNlIHRpbWUgYW5kIGF3YWl0ZWQgYXRcbiAgICogcmVzdW1lIHRpbWUgc28gd2UgY2FuIHJlamVjdCByZXN1bWUgYXR0ZW1wdHMgZnJvbSBhIGRpZmZlcmVudFxuICAgKiBhdXRoZW50aWNhdGVkIGNhbGxlciAoc2lnbmVkIG91dCwgc3dhcHBlZCB1c2VyLCBleHBpcmVkIGNvb2tpZSkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPD8+fSAtIENhcHR1cmVkIGF1dGhlbnRpY2F0ZWQgaWRlbnRpdHkgZm9yIHJlc3VtZSB2YWxpZGF0aW9uLlxuICAgKi9cbiAgYXN5bmMgX2NhcHR1cmVSZXN1bWVJZGVudGl0eSgpIHtcbiAgICBjb25zdCByZXNvbHZlciA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRTZXNzaW9uSWRlbnRpdHlSZXNvbHZlcj8uKClcblxuICAgIGlmICh0eXBlb2YgcmVzb2x2ZXIgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCByZXNvbHZlcih0aGlzKVxuICAgIH0gY2F0Y2ggKGNhdWdodEVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHRoaXMuX3JlcG9ydFVuZXhwZWN0ZWREaXNwYXRjaEVycm9yKGNhdWdodEVycm9yLCB7XG4gICAgICAgIHN0YWdlOiBcIndlYnNvY2tldC1zZXNzaW9uLWlkZW50aXR5LXBhdXNlXCJcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBzZXNzaW9uIGlkZW50aXR5IHJlc29sdmVyIGZhaWxlZCBhdCBwYXVzZVwiLCBlcnJvcl0pXG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIGBvbkRpc2Nvbm5lY3RgIG9uIGV2ZXJ5IGxpdmUgQ29ubmVjdGlvbiBhbmQgQ2hhbm5lbCBzdWIgc29cbiAgICogYXBwcyBjYW4gcGF1c2UgcGVyLWluc3RhbmNlIHdvcmsgd2hpbGUgdGhlIHNlc3Npb24gaXMgcGF1c2VkLlxuICAgKiBFcnJvcnMgYXJlIGxvZ2dlZCwgbm90IHJldGhyb3duIOKAlCBvbmUgYnJva2VuIGhhbmRsZXIgbXVzdCBub3RcbiAgICogYmxvY2sgdGhlIHJlc3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2ZpcmVPbkRpc2Nvbm5lY3QoKSB7XG4gICAgYXdhaXQgdGhpcy5fZmlyZUxpZmVjeWNsZUNhbGxiYWNrKFwib25EaXNjb25uZWN0XCIpXG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgYG9uUmVzdW1lYCBvbiBldmVyeSBsaXZlIENvbm5lY3Rpb24gYW5kIENoYW5uZWwgc3ViIGFmdGVyXG4gICAqIGEgc3VjY2Vzc2Z1bCBgc2Vzc2lvbi1yZXN1bWVgIGhhbmRvZmYuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2ZpcmVPblJlc3VtZSgpIHtcbiAgICBhd2FpdCB0aGlzLl9maXJlTGlmZWN5Y2xlQ2FsbGJhY2soXCJvblJlc3VtZVwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZmlyZSBsaWZlY3ljbGUgY2FsbGJhY2suXG4gICAqIEBwYXJhbSB7XCJvbkRpc2Nvbm5lY3RcIiB8IFwib25SZXN1bWVcIn0gY2FsbGJhY2tOYW1lIExpZmVjeWNsZSBjYWxsYmFjayB0byBmaXJlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgd2hlbiBldmVyeSBsaXZlIGhhbmRsZXIgaGFzIGJlZW4gYXR0ZW1wdGVkLlxuICAgKi9cbiAgYXN5bmMgX2ZpcmVMaWZlY3ljbGVDYWxsYmFjayhjYWxsYmFja05hbWUpIHtcbiAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgdGhpcy5fY29ubmVjdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb25bY2FsbGJhY2tOYW1lXT8uKClcbiAgICAgIH0gY2F0Y2ggKGNhdWdodEVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fcmVwb3J0VW5leHBlY3RlZERpc3BhdGNoRXJyb3IoY2F1Z2h0RXJyb3IsIHtcbiAgICAgICAgICBjYWxsYmFja05hbWUsXG4gICAgICAgICAgY29ubmVjdGlvbklkOiBjb25uZWN0aW9uLmNvbm5lY3Rpb25JZCxcbiAgICAgICAgICBzdGFnZTogXCJ3ZWJzb2NrZXQtY29ubmVjdGlvbi1saWZlY3ljbGVcIlxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgJHtjYWxsYmFja05hbWV9IGZhaWxlZCBmb3IgJHtjb25uZWN0aW9uLmNvbm5lY3Rpb25JZH1gLCBlcnJvcl0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB7c3Vic2NyaXB0aW9ufSBvZiB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc3Vic2NyaXB0aW9uW2NhbGxiYWNrTmFtZV0/LigpXG4gICAgICB9IGNhdGNoIChjYXVnaHRFcnJvcikge1xuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuX3JlcG9ydFVuZXhwZWN0ZWREaXNwYXRjaEVycm9yKGNhdWdodEVycm9yLCB7XG4gICAgICAgICAgY2FsbGJhY2tOYW1lLFxuICAgICAgICAgIHN0YWdlOiBcIndlYnNvY2tldC1jaGFubmVsLWxpZmVjeWNsZVwiLFxuICAgICAgICAgIHN1YnNjcmlwdGlvbklkOiBzdWJzY3JpcHRpb24uc3Vic2NyaXB0aW9uSWRcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbYCR7Y2FsbGJhY2tOYW1lfSBmYWlsZWQgZm9yIGNoYW5uZWwgc3ViICR7c3Vic2NyaXB0aW9uLnN1YnNjcmlwdGlvbklkfWAsIGVycm9yXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBge3R5cGU6IFwic2Vzc2lvbi1yZXN1bWVcIn1gLiBUaGlzIHNlc3Npb24gKHRoZSBuZXdseS1cbiAgICogY3JlYXRlZCBvbmUgd2hvc2Ugc29ja2V0IGp1c3QgY29ubmVjdGVkKSB0cmFuc2ZlcnMgc3RhdGUgZnJvbVxuICAgKiB0aGUgcGF1c2VkIHNlc3Npb24gYW5kIGluc3RydWN0cyB0aGUgY2xpZW50IHZpYVxuICAgKiBgc2Vzc2lvbi1yZXN1bWVkYCBvciBgc2Vzc2lvbi1nb25lYC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gbWVzc2FnZSAtIFNlc3Npb24tcmVzdW1lIGZyYW1lIGNvbnRhaW5pbmcgdGhlIHBhdXNlZCBzZXNzaW9uIGlkZW50aWZpZXIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZVNlc3Npb25SZXN1bWUobWVzc2FnZSkge1xuICAgIGNvbnN0IHJlc3VtZVNlc3Npb25JZCA9IG1lc3NhZ2Uuc2Vzc2lvbklkXG5cbiAgICBpZiAodHlwZW9mIHJlc3VtZVNlc3Npb25JZCAhPT0gXCJzdHJpbmdcIiB8fCAhcmVzdW1lU2Vzc2lvbklkKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcInNlc3Npb24tZ29uZVwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHBhdXNlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5fZmluZFBhdXNlZFdlYnNvY2tldFNlc3Npb24ocmVzdW1lU2Vzc2lvbklkKVxuXG4gICAgaWYgKCFwYXVzZWQpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwic2Vzc2lvbi1nb25lXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gQXV0aCByZS12ZXJpZnk6IGNvbXBhcmUgdGhlIGZyZXNoIGNhbGxlcidzIGlkZW50aXR5IGFnYWluc3QgdGhlXG4gICAgLy8gb25lIGNhcHR1cmVkIGF0IHBhdXNlLiBNaXNtYXRjaCBtZWFucyBhIGRpZmZlcmVudCB1c2VyIChvciBhXG4gICAgLy8gc2lnbmVkLW91dCBzZXNzaW9uKSBpcyB0cnlpbmcgdG8gcmVjbGFpbSBzdGF0ZSB0aGF0IGlzbid0XG4gICAgLy8gdGhlaXJzIOKAlCBkZXN0cm95IHRoZSBwYXVzZWQgc2Vzc2lvbiBvdXRyaWdodC5cbiAgICBjb25zdCByZXNvbHZlciA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRTZXNzaW9uSWRlbnRpdHlSZXNvbHZlcj8uKClcblxuICAgIGlmICh0eXBlb2YgcmVzb2x2ZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3QgcGF1c2VkSWRlbnRpdHkgPSBhd2FpdCBwYXVzZWQuX3Jlc3VtZUlkZW50aXR5UHJvbWlzZVxuICAgICAgbGV0IGZyZXNoSWRlbnRpdHlcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZnJlc2hJZGVudGl0eSA9IGF3YWl0IHJlc29sdmVyKHRoaXMpXG4gICAgICB9IGNhdGNoIChjYXVnaHRFcnJvcikge1xuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuX3JlcG9ydFVuZXhwZWN0ZWREaXNwYXRjaEVycm9yKGNhdWdodEVycm9yLCB7XG4gICAgICAgICAgc3RhZ2U6IFwid2Vic29ja2V0LXNlc3Npb24taWRlbnRpdHktcmVzdW1lXCJcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJXZWJzb2NrZXQgc2Vzc2lvbiBpZGVudGl0eSByZXNvbHZlciBmYWlsZWQgYXQgcmVzdW1lXCIsIGVycm9yXSlcbiAgICAgICAgZnJlc2hJZGVudGl0eSA9IHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICBpZiAoIWlkZW50aXRpZXNNYXRjaChwYXVzZWRJZGVudGl0eSwgZnJlc2hJZGVudGl0eSkpIHtcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLl9jbGVhclBhdXNlZFdlYnNvY2tldFNlc3Npb24ocmVzdW1lU2Vzc2lvbklkKVxuICAgICAgICBwYXVzZWQuX2ZpbmFsaXplR3JhY2VFeHBpcnkoKVxuICAgICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcInNlc3Npb24tZ29uZVwifSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jb25maWd1cmF0aW9uLl9jbGVhclBhdXNlZFdlYnNvY2tldFNlc3Npb24ocmVzdW1lU2Vzc2lvbklkKVxuXG4gICAgLy8gVHJhbnNmZXIgcmVzdW1hYmxlIHN0YXRlIG9udG8gdGhpcyAobGl2ZSkgc2Vzc2lvbi4gVGhlIHBhdXNlZFxuICAgIC8vIHNlc3Npb24gc2hlbGwgaXMgZGlzY2FyZGVkIGFmdGVyIHRoZSB0cmFuc2Zlci5cbiAgICBmb3IgKGNvbnN0IFtjb25uZWN0aW9uSWQsIGNvbm5lY3Rpb25dIG9mIHBhdXNlZC5fY29ubmVjdGlvbnMpIHtcbiAgICAgIGNvbm5lY3Rpb24uc2Vzc2lvbiA9IHRoaXNcbiAgICAgIHRoaXMuX2Nvbm5lY3Rpb25zLnNldChjb25uZWN0aW9uSWQsIGNvbm5lY3Rpb24pXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbc3ViSWQsIGVudHJ5XSBvZiBwYXVzZWQuX2NoYW5uZWxTdWJzY3JpcHRpb25zKSB7XG4gICAgICBlbnRyeS5zdWJzY3JpcHRpb24uc2Vzc2lvbiA9IHRoaXNcbiAgICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnNldChzdWJJZCwgZW50cnkpXG4gICAgfVxuXG4gICAgdGhpcy5fbWV0YWRhdGEgPSB7Li4ucGF1c2VkLl9tZXRhZGF0YX1cbiAgICB0aGlzLmRhdGEgPSBwYXVzZWQuZGF0YVxuICAgIHRoaXMuc2Vzc2lvbklkID0gcmVzdW1lU2Vzc2lvbklkXG5cbiAgICAvLyBUcmFuc2ZlciBhbnkgZnJhbWVzIHF1ZXVlZCB3aGlsZSB0aGUgcGF1c2VkIHNlc3Npb24gaGFkIG5vXG4gICAgLy8gc29ja2V0LiBUaGV5IGZsdXNoIEFGVEVSIHNlc3Npb24tcmVzdW1lZCBzbyB0aGUgY2xpZW50IGtub3dzXG4gICAgLy8gd2hpY2ggc2Vzc2lvbiB0aGV5IGJlbG9uZyB0by5cbiAgICBjb25zdCBxdWV1ZWQgPSBwYXVzZWQuX291dGJvdW5kUXVldWUgfHwgW11cblxuICAgIHBhdXNlZC5fb3V0Ym91bmRRdWV1ZSA9IFtdXG4gICAgcGF1c2VkLl9jb25uZWN0aW9ucy5jbGVhcigpXG4gICAgcGF1c2VkLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5jbGVhcigpXG4gICAgcGF1c2VkLl9wYXVzZWQgPSBmYWxzZVxuICAgIHBhdXNlZC5kZXN0cm95KClcblxuICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwic2Vzc2lvbi1yZXN1bWVkXCIsIHNlc3Npb25JZDogcmVzdW1lU2Vzc2lvbklkfSlcbiAgICBmb3IgKGNvbnN0IGJvZHkgb2YgcXVldWVkKSB0aGlzLnNlbmRKc29uKGJvZHkpXG4gICAgYXdhaXQgdGhpcy5fZmlyZU9uUmVzdW1lKClcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyBgb25DbG9zZShyZWFzb24pYCBvbiBldmVyeSBsaXZlIGFwcC1kZWZpbmVkIGNvbm5lY3Rpb24sIHRoZW5cbiAgICogZHJvcHMgdGhlbSBmcm9tIHRoZSByZWdpc3RyeS4gTm8gbmV0d29yayBmcmFtZSBpcyBzZW50IOKAlCB0aGVcbiAgICogc29ja2V0IGlzIGFscmVhZHkgZ29pbmcgYXdheS5cbiAgICogQHBhcmFtIHtcInNlc3Npb25fZGVzdHJveWVkXCIgfCBcImdyYWNlX2V4cGlyZWRcIiB8IFwiZXJyb3JcIn0gcmVhc29uIC0gUGVybWFuZW50IHRlYXJkb3duIHJlYXNvbiBwYXNzZWQgdG8gZWFjaCBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF90ZWFyZG93bkNvbm5lY3Rpb25zKHJlYXNvbikge1xuICAgIGNvbnN0IGNvbm5lY3Rpb25zID0gWy4uLnRoaXMuX2Nvbm5lY3Rpb25zLnZhbHVlcygpXVxuXG4gICAgdGhpcy5fY29ubmVjdGlvbnMuY2xlYXIoKVxuXG4gICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIGNvbm5lY3Rpb25zKSB7XG4gICAgICBjb25uZWN0aW9uLl9jbG9zZWQgPSB0cnVlXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgY29ubmVjdGlvbi5vbkNsb3NlKHJlYXNvbilcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGNhdWdodEVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fcmVwb3J0VW5leHBlY3RlZERpc3BhdGNoRXJyb3IoY2F1Z2h0RXJyb3IsIHtcbiAgICAgICAgICBjb25uZWN0aW9uSWQ6IGNvbm5lY3Rpb24uY29ubmVjdGlvbklkLFxuICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICBzdGFnZTogXCJ3ZWJzb2NrZXQtY29ubmVjdGlvbi10ZWFyZG93blwiXG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gdGVhciBkb3duIGNvbm5lY3Rpb24gJHtjb25uZWN0aW9uLmNvbm5lY3Rpb25JZH1gLCBlcnJvcl0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYSBge3R5cGU6IFwiY29ubmVjdGlvbi1vcGVuXCJ9YCBtZXNzYWdlIOKAlCBpbnN0YW50aWF0ZXMgdGhlXG4gICAqIHJlZ2lzdGVyZWQgY29ubmVjdGlvbiBjbGFzcywgc3RvcmVzIGl0IG9uIGBfY29ubmVjdGlvbnNgLCBhbmRcbiAgICogZmlyZXMgYG9uQ29ubmVjdCgpYC4gU2VuZHMgYGNvbm5lY3Rpb24tb3BlbmVkYCBvbiBzdWNjZXNzIG9yXG4gICAqIGBjb25uZWN0aW9uLWVycm9yYCBvbiBmYWlsdXJlLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBtZXNzYWdlIC0gQ29ubmVjdGlvbi1vcGVuIGZyYW1lIG5hbWluZyB0aGUgY29ubmVjdGlvbiB0eXBlIGFuZCBpZGVudGlmaWVyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVDb25uZWN0aW9uT3BlbihtZXNzYWdlKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbklkID0gbWVzc2FnZS5jb25uZWN0aW9uSWRcbiAgICBjb25zdCBjb25uZWN0aW9uVHlwZSA9IG1lc3NhZ2UuY29ubmVjdGlvblR5cGVcbiAgICBjb25zdCBwYXJhbXMgPSBtZXNzYWdlLnBhcmFtcyB8fCB7fVxuXG4gICAgaWYgKHR5cGVvZiBjb25uZWN0aW9uSWQgIT09IFwic3RyaW5nXCIgfHwgIWNvbm5lY3Rpb25JZCkge1xuICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJlcnJvclwiLCBlcnJvcjogXCJjb25uZWN0aW9uLW9wZW4gcmVxdWlyZXMgY29ubmVjdGlvbklkXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb25uZWN0aW9uVHlwZSAhPT0gXCJzdHJpbmdcIiB8fCAhY29ubmVjdGlvblR5cGUpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IFwiY29ubmVjdGlvblR5cGUgaXMgcmVxdWlyZWRcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29ubmVjdGlvbnMuaGFzKGNvbm5lY3Rpb25JZCkpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IFwiQ29ubmVjdGlvbiBpZCBhbHJlYWR5IGluIHVzZVwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IENvbm5lY3Rpb25DbGFzcyA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRDb25uZWN0aW9uQ2xhc3M/Lihjb25uZWN0aW9uVHlwZSlcblxuICAgIGlmICghQ29ubmVjdGlvbkNsYXNzKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNvbm5lY3Rpb24tZXJyb3JcIiwgY29ubmVjdGlvbklkLCBtZXNzYWdlOiBgVW5rbm93biBjb25uZWN0aW9uIHR5cGU6ICR7Y29ubmVjdGlvblR5cGV9YH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb25DbGFzcyh7Y29ubmVjdGlvbklkLCBwYXJhbXMsIHNlc3Npb246IHRoaXN9KVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb24ub25Db25uZWN0KClcbiAgICAgIH0pXG4gICAgICAvLyBSZWdpc3RlciBvbmx5IGFmdGVyIG9uQ29ubmVjdCByZXNvbHZlcyBzbyBhIGNvbm5lY3Rpb24tbWVzc2FnZVxuICAgICAgLy8gY2FuIG5ldmVyIGJlIHJvdXRlZCB0byBhIHBhcnRpYWxseSBpbml0aWFsaXplZCBjb25uZWN0aW9uLlxuICAgICAgdGhpcy5fY29ubmVjdGlvbnMuc2V0KGNvbm5lY3Rpb25JZCwgY29ubmVjdGlvbilcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1vcGVuZWRcIiwgY29ubmVjdGlvbklkfSlcbiAgICB9IGNhdGNoIChjYXVnaHRFcnJvcikge1xuICAgICAgY29uc3QgY2xpZW50RXJyb3JNZXNzYWdlID0gY2F1Z2h0RXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGNhdWdodEVycm9yLm1lc3NhZ2UgOiBcIlwiXG4gICAgICBjb25zdCBlcnJvciA9IHRoaXMuX3JlcG9ydFVuZXhwZWN0ZWREaXNwYXRjaEVycm9yKGNhdWdodEVycm9yLCB7XG4gICAgICAgIGNvbm5lY3Rpb25JZCxcbiAgICAgICAgY29ubmVjdGlvblR5cGUsXG4gICAgICAgIHN0YWdlOiBcIndlYnNvY2tldC1jb25uZWN0aW9uLW9wZW5cIlxuICAgICAgfSlcblxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gb3BlbiBjb25uZWN0aW9uICR7Y29ubmVjdGlvblR5cGV9OiR7Y29ubmVjdGlvbklkfWAsIGVycm9yXSlcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IGNsaWVudEVycm9yTWVzc2FnZSB8fCBcIkZhaWxlZCB0byBvcGVuIGNvbm5lY3Rpb25cIn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYSBge3R5cGU6IFwiY29ubmVjdGlvbi1tZXNzYWdlXCJ9YCBmcm9tIHRoZSBjbGllbnQuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IG1lc3NhZ2UgLSBDb25uZWN0aW9uLW1lc3NhZ2UgZnJhbWUgY29udGFpbmluZyB0aGUgdGFyZ2V0IGlkZW50aWZpZXIgYW5kIGJvZHkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZUNvbm5lY3Rpb25NZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICBjb25zdCBjb25uZWN0aW9uSWQgPSBtZXNzYWdlLmNvbm5lY3Rpb25JZFxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0eXBlb2YgY29ubmVjdGlvbklkID09PSBcInN0cmluZ1wiID8gdGhpcy5fY29ubmVjdGlvbnMuZ2V0KGNvbm5lY3Rpb25JZCkgOiBudWxsXG5cbiAgICBpZiAoIWNvbm5lY3Rpb24pIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IFwiVW5rbm93biBjb25uZWN0aW9uIGlkXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb24ub25NZXNzYWdlKG1lc3NhZ2UuYm9keSlcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoY2F1Z2h0RXJyb3IpIHtcbiAgICAgIGNvbnN0IGNsaWVudEVycm9yTWVzc2FnZSA9IGNhdWdodEVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBjYXVnaHRFcnJvci5tZXNzYWdlIDogXCJcIlxuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLl9yZXBvcnRVbmV4cGVjdGVkRGlzcGF0Y2hFcnJvcihjYXVnaHRFcnJvciwge1xuICAgICAgICBjb25uZWN0aW9uSWQsXG4gICAgICAgIHN0YWdlOiBcIndlYnNvY2tldC1jb25uZWN0aW9uLW1lc3NhZ2VcIlxuICAgICAgfSlcblxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gaGFuZGxlIGNvbm5lY3Rpb24tbWVzc2FnZSBmb3IgJHtjb25uZWN0aW9uSWR9YCwgZXJyb3JdKVxuICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjb25uZWN0aW9uLWVycm9yXCIsIGNvbm5lY3Rpb25JZCwgbWVzc2FnZTogY2xpZW50RXJyb3JNZXNzYWdlIHx8IFwiRmFpbGVkIHRvIGhhbmRsZSBtZXNzYWdlXCJ9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGEgYHt0eXBlOiBcImNvbm5lY3Rpb24tY2xvc2VcIn1gIGZyb20gdGhlIGNsaWVudCDigJQgZmlyZXNcbiAgICogYG9uQ2xvc2UoXCJjbGllbnRfY2xvc2VcIilgIGFuZCBjb25maXJtcyB3aXRoIGBjb25uZWN0aW9uLWNsb3NlZGAuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IG1lc3NhZ2UgLSBDb25uZWN0aW9uLWNsb3NlIGZyYW1lIGNvbnRhaW5pbmcgdGhlIHRhcmdldCBpZGVudGlmaWVyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVDb25uZWN0aW9uQ2xvc2UobWVzc2FnZSkge1xuICAgIGNvbnN0IGNvbm5lY3Rpb25JZCA9IG1lc3NhZ2UuY29ubmVjdGlvbklkXG4gICAgY29uc3QgY29ubmVjdGlvbiA9IHR5cGVvZiBjb25uZWN0aW9uSWQgPT09IFwic3RyaW5nXCIgPyB0aGlzLl9jb25uZWN0aW9ucy5nZXQoY29ubmVjdGlvbklkKSA6IG51bGxcblxuICAgIGlmICghY29ubmVjdGlvbikgcmV0dXJuXG5cbiAgICB0aGlzLl9jb25uZWN0aW9ucy5kZWxldGUoY29ubmVjdGlvbklkKVxuICAgIC8vIE1hcmsgY2xvc2VkIGJlZm9yZSBmaXJpbmcgb25DbG9zZSBzbyBhcHAgY29kZSBob2xkaW5nIHRoZVxuICAgIC8vIGhhbmRsZSBzZWVzIGBpc0Nsb3NlZCgpID09PSB0cnVlYCBhbmQgY2FuJ3QgcmUtZW50ZXIgc2VuZE1lc3NhZ2UuXG4gICAgY29ubmVjdGlvbi5fY2xvc2VkID0gdHJ1ZVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb24ub25DbG9zZShcImNsaWVudF9jbG9zZVwiKVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChjYXVnaHRFcnJvcikge1xuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLl9yZXBvcnRVbmV4cGVjdGVkRGlzcGF0Y2hFcnJvcihjYXVnaHRFcnJvciwge1xuICAgICAgICBjb25uZWN0aW9uSWQsXG4gICAgICAgIHN0YWdlOiBcIndlYnNvY2tldC1jb25uZWN0aW9uLWNsb3NlXCJcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgRmFpbGVkIHRvIHRlYXIgZG93biBjb25uZWN0aW9uICR7Y29ubmVjdGlvbklkfWAsIGVycm9yXSlcbiAgICB9XG5cbiAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNvbm5lY3Rpb24tY2xvc2VkXCIsIGNvbm5lY3Rpb25JZCwgcmVhc29uOiBcImNsaWVudF9jbG9zZVwifSlcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGB7dHlwZTogXCJjaGFubmVsLXN1YnNjcmliZVwifWAg4oCUIHJ1bnMgYGNhblN1YnNjcmliZSgpYCxcbiAgICogcmVnaXN0ZXJzIHdpdGggdGhlIENvbmZpZ3VyYXRpb24ncyBnbG9iYWwgcm91dGluZyByZWdpc3RyeSBvblxuICAgKiBzdWNjZXNzLCBhbmQgc2VuZHMgYGNoYW5uZWwtc3Vic2NyaWJlZGAgb3IgYGNoYW5uZWwtZXJyb3JgLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBtZXNzYWdlIC0gQ2hhbm5lbC1zdWJzY3JpYmUgZnJhbWUgZGVzY3JpYmluZyB0aGUgcmVxdWVzdGVkIHN1YnNjcmlwdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfaGFuZGxlQ2hhbm5lbFN1YnNjcmliZShtZXNzYWdlKSB7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uSWQgPSBtZXNzYWdlLnN1YnNjcmlwdGlvbklkXG4gICAgY29uc3QgY2hhbm5lbFR5cGUgPSBtZXNzYWdlLmNoYW5uZWxUeXBlXG4gICAgY29uc3QgcGFyYW1zID0gbWVzc2FnZS5wYXJhbXMgfHwge31cbiAgICBjb25zdCBsYXN0RXZlbnRJZCA9IG1lc3NhZ2UubGFzdEV2ZW50SWRcblxuICAgIGlmICh0eXBlb2Ygc3Vic2NyaXB0aW9uSWQgIT09IFwic3RyaW5nXCIgfHwgIXN1YnNjcmlwdGlvbklkKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImVycm9yXCIsIGVycm9yOiBcImNoYW5uZWwtc3Vic2NyaWJlIHJlcXVpcmVzIHN1YnNjcmlwdGlvbklkXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjaGFubmVsVHlwZSAhPT0gXCJzdHJpbmdcIiB8fCAhY2hhbm5lbFR5cGUpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY2hhbm5lbC1lcnJvclwiLCBzdWJzY3JpcHRpb25JZCwgbWVzc2FnZTogXCJjaGFubmVsVHlwZSBpcyByZXF1aXJlZFwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5oYXMoc3Vic2NyaXB0aW9uSWQpKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtZXJyb3JcIiwgc3Vic2NyaXB0aW9uSWQsIG1lc3NhZ2U6IFwiU3Vic2NyaXB0aW9uIGlkIGFscmVhZHkgaW4gdXNlXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgQ2hhbm5lbENsYXNzID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldENoYW5uZWxDbGFzcz8uKGNoYW5uZWxUeXBlKVxuXG4gICAgaWYgKCFDaGFubmVsQ2xhc3MpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY2hhbm5lbC1lcnJvclwiLCBzdWJzY3JpcHRpb25JZCwgbWVzc2FnZTogYFVua25vd24gY2hhbm5lbCB0eXBlOiAke2NoYW5uZWxUeXBlfWB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gbmV3IENoYW5uZWxDbGFzcyh7c3Vic2NyaXB0aW9uSWQsIHBhcmFtcywgc2Vzc2lvbjogdGhpc30pXG5cbiAgICB0cnkge1xuICAgICAgLy8gUmVzb2x2aW5nIHRoZSB0ZW5hbnQgY2FuIHJ1biBkYXRhYmFzZSBxdWVyaWVzIChlLmcuIGxvb2tpbmcgdXAgdGhlXG4gICAgICAvLyByZWNvcmQncyBwcm9qZWN0IGFuZCB0aGUgY2FsbGVyJ3MgYWNjZXNzKSwgc28gaXQgbXVzdCBoYXBwZW4gaW5zaWRlIGFcbiAgICAgIC8vIGNvbm5lY3Rpb24gc2NvcGUuIFdpdGhvdXQgdGhpcyB0aGUgcmVzb2x2ZXIgYm9ycm93cyBhIGNvbm5lY3Rpb24gdGhhdFxuICAgICAgLy8gaXMgY2hlY2tlZCBiYWNrIGluIGJlZm9yZS93aGlsZSBpdCBxdWVyaWVzLCBpbnRlcm1pdHRlbnRseSBzdXJmYWNpbmcgYXNcbiAgICAgIC8vIFwiQ29ubmVjdGlvbiDigKYgZG9lc24ndCBleGlzdCBhbnkgbW9yZVwiIG9yIGEgZmFsc2VseSB1bmF1dGhvcml6ZWRcbiAgICAgIC8vIHN1YnNjcmlwdGlvbi5cbiAgICAgIGxldCB0ZW5hbnRcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIHRlbmFudCA9IGF3YWl0IHRoaXMuX3Jlc29sdmVUZW5hbnQoe2NoYW5uZWw6IGNoYW5uZWxUeXBlLCBwYXJhbXN9KVxuICAgICAgfSlcblxuICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJ1bldpdGhUZW5hbnQodGVuYW50LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBhbGxvd2VkID0gZmFsc2VcblxuICAgICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGFsbG93ZWQgPSBCb29sZWFuKGF3YWl0IHN1YnNjcmlwdGlvbi5jYW5TdWJzY3JpYmUoKSlcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoIWFsbG93ZWQpIHtcbiAgICAgICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtZXJyb3JcIiwgc3Vic2NyaXB0aW9uSWQsIG1lc3NhZ2U6IFwiU3Vic2NyaXB0aW9uIG5vdCBhdXRob3JpemVkXCJ9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuc2V0KHN1YnNjcmlwdGlvbklkLCB7Y2hhbm5lbFR5cGUsIHN1YnNjcmlwdGlvbn0pXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5fcmVnaXN0ZXJXZWJzb2NrZXRDaGFubmVsU3Vic2NyaXB0aW9uKGNoYW5uZWxUeXBlLCBzdWJzY3JpcHRpb24pXG5cbiAgICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IGF3YWl0IHN1YnNjcmlwdGlvbi5zdWJzY3JpYmVkKCkpXG5cbiAgICAgICAgLy8gUmVwbGF5IG1pc3NlZCBldmVudHMgQkVGT1JFIHNlbmRpbmcgY2hhbm5lbC1zdWJzY3JpYmVkIHNvXG4gICAgICAgIC8vIHRoZSBjbGllbnQga25vd3M6IGV2ZXJ5dGhpbmcgYmVmb3JlIHRoZSBjb25maXJtYXRpb24gaXNcbiAgICAgICAgLy8gcmVwbGF5ZWQsIGV2ZXJ5dGhpbmcgYWZ0ZXIgaXMgbGl2ZS5cbiAgICAgICAgaWYgKHR5cGVvZiBsYXN0RXZlbnRJZCA9PT0gXCJzdHJpbmdcIiAmJiBsYXN0RXZlbnRJZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fcmVwbGF5Q2hhbm5lbEV2ZW50c0ZvclN1YnNjcmlwdGlvbih7Y2hhbm5lbFR5cGUsIGxhc3RFdmVudElkLCBzdWJzY3JpcHRpb259KVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjaGFubmVsLXN1YnNjcmliZWRcIiwgc3Vic2NyaXB0aW9uSWR9KVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChjYXVnaHRFcnJvcikge1xuICAgICAgY29uc3QgY2xpZW50RXJyb3JNZXNzYWdlID0gY2F1Z2h0RXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGNhdWdodEVycm9yLm1lc3NhZ2UgOiBcIlwiXG5cbiAgICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmRlbGV0ZShzdWJzY3JpcHRpb25JZClcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5fdW5yZWdpc3RlcldlYnNvY2tldENoYW5uZWxTdWJzY3JpcHRpb24oY2hhbm5lbFR5cGUsIHN1YnNjcmlwdGlvbilcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fcmVwb3J0VW5leHBlY3RlZERpc3BhdGNoRXJyb3IoY2F1Z2h0RXJyb3IsIHtcbiAgICAgICAgY2hhbm5lbFR5cGUsXG4gICAgICAgIHN0YWdlOiBcIndlYnNvY2tldC1jaGFubmVsLXN1YnNjcmliZVwiLFxuICAgICAgICBzdWJzY3JpcHRpb25JZFxuICAgICAgfSlcblxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gc3Vic2NyaWJlIGNoYW5uZWwgJHtjaGFubmVsVHlwZX06JHtzdWJzY3JpcHRpb25JZH1gLCBlcnJvcl0pXG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtZXJyb3JcIiwgc3Vic2NyaXB0aW9uSWQsIG1lc3NhZ2U6IGNsaWVudEVycm9yTWVzc2FnZSB8fCBcIkZhaWxlZCB0byBzdWJzY3JpYmVcIn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxheXMgbWlzc2VkIGV2ZW50cyBmcm9tIHRoZSBwZXJzaXN0ZW50IGV2ZW50LWxvZyBzdG9yZSBmb3IgYVxuICAgKiBjaGFubmVsIHN1YnNjcmlwdGlvbiB0aGF0IHByb3ZpZGVkIGBsYXN0RXZlbnRJZGAuIFNlbmRzIGVhY2hcbiAgICogbWlzc2VkIGV2ZW50IGFzIGEgYGNoYW5uZWwtbWVzc2FnZWAgd2l0aCBgcmVwbGF5ZWQ6IHRydWVgLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWxUeXBlIC0gQ2hhbm5lbCB0eXBlIG5hbWUgKGV2ZW50LWxvZyBrZXkpLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5sYXN0RXZlbnRJZCAtIENsaWVudCdzIGxhc3Qtc2VlbiBldmVudCBpZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiKS5kZWZhdWx0fSBhcmdzLnN1YnNjcmlwdGlvbiAtIExpdmUgc3Vic2NyaXB0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9yZXBsYXlDaGFubmVsRXZlbnRzRm9yU3Vic2NyaXB0aW9uKHtjaGFubmVsVHlwZSwgbGFzdEV2ZW50SWQsIHN1YnNjcmlwdGlvbn0pIHtcbiAgICBjb25zdCBzdG9yZSA9IHdlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9uKHRoaXMuY29uZmlndXJhdGlvbilcblxuICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5hd2FpdFBlbmRpbmdCcm9hZGNhc3RzKClcblxuICAgIGNvbnN0IGNoZWNrcG9pbnQgPSBhd2FpdCBzdG9yZS5nZXRFdmVudEJ5SWQoe2NoYW5uZWw6IGNoYW5uZWxUeXBlLCBpZDogbGFzdEV2ZW50SWR9KVxuXG4gICAgaWYgKCFjaGVja3BvaW50KSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHtcbiAgICAgICAgdHlwZTogXCJjaGFubmVsLXJlcGxheS1nYXBcIixcbiAgICAgICAgc3Vic2NyaXB0aW9uSWQ6IHN1YnNjcmlwdGlvbi5zdWJzY3JpcHRpb25JZCxcbiAgICAgICAgbGFzdEV2ZW50SWRcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjZWlsaW5nID0gYXdhaXQgc3RvcmUubGF0ZXN0U2VxdWVuY2UoY2hhbm5lbFR5cGUpXG5cbiAgICBpZiAoIWNlaWxpbmcgfHwgY2VpbGluZyA8PSBjaGVja3BvaW50LnNlcXVlbmNlKSByZXR1cm5cblxuICAgIGNvbnN0IGV2ZW50cyA9IGF3YWl0IHN0b3JlLmdldEV2ZW50c0FmdGVyKHtcbiAgICAgIGNoYW5uZWw6IGNoYW5uZWxUeXBlLFxuICAgICAgc2VxdWVuY2U6IGNoZWNrcG9pbnQuc2VxdWVuY2UsXG4gICAgICB1cFRvU2VxdWVuY2U6IGNlaWxpbmdcbiAgICB9KVxuXG4gICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgIGlmIChzdWJzY3JpcHRpb24uaXNDbG9zZWQoKSkgYnJlYWtcblxuICAgICAgc3Vic2NyaXB0aW9uLnNlbmRNZXNzYWdlKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vd2Vic29ja2V0LWNoYW5uZWwuanNcIikuV2Vic29ja2V0SnNvblZhbHVlfSAqLyAoZXZlbnQucGF5bG9hZCkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYHt0eXBlOiBcImNoYW5uZWwtdW5zdWJzY3JpYmVcIn1gIGZyb20gdGhlIGNsaWVudCDigJQgY2FsbHNcbiAgICogYHVuc3Vic2NyaWJlZCgpYCBhbmQgc2VuZHMgYGNoYW5uZWwtdW5zdWJzY3JpYmVkYC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gbWVzc2FnZSAtIENoYW5uZWwtdW5zdWJzY3JpYmUgZnJhbWUgY29udGFpbmluZyB0aGUgc3Vic2NyaXB0aW9uIGlkZW50aWZpZXIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZUNoYW5uZWxVbnN1YnNjcmliZShtZXNzYWdlKSB7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uSWQgPSBtZXNzYWdlLnN1YnNjcmlwdGlvbklkXG5cbiAgICBpZiAodHlwZW9mIHN1YnNjcmlwdGlvbklkICE9PSBcInN0cmluZ1wiKSByZXR1cm5cblxuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuZ2V0KHN1YnNjcmlwdGlvbklkKVxuXG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuXG5cbiAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5kZWxldGUoc3Vic2NyaXB0aW9uSWQpXG4gICAgdGhpcy5jb25maWd1cmF0aW9uLl91bnJlZ2lzdGVyV2Vic29ja2V0Q2hhbm5lbFN1YnNjcmlwdGlvbihlbnRyeS5jaGFubmVsVHlwZSwgZW50cnkuc3Vic2NyaXB0aW9uKVxuICAgIGVudHJ5LnN1YnNjcmlwdGlvbi5fY2xvc2VkID0gdHJ1ZVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiBhd2FpdCBlbnRyeS5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmVkKCkpXG4gICAgfSBjYXRjaCAoY2F1Z2h0RXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fcmVwb3J0VW5leHBlY3RlZERpc3BhdGNoRXJyb3IoY2F1Z2h0RXJyb3IsIHtcbiAgICAgICAgY2hhbm5lbFR5cGU6IGVudHJ5LmNoYW5uZWxUeXBlLFxuICAgICAgICBzdGFnZTogXCJ3ZWJzb2NrZXQtY2hhbm5lbC11bnN1YnNjcmliZVwiLFxuICAgICAgICBzdWJzY3JpcHRpb25JZFxuICAgICAgfSlcblxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gdW5zdWJzY3JpYmUgY2hhbm5lbCAke2VudHJ5LmNoYW5uZWxUeXBlfToke3N1YnNjcmlwdGlvbklkfWAsIGVycm9yXSlcbiAgICB9XG5cbiAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtdW5zdWJzY3JpYmVkXCIsIHN1YnNjcmlwdGlvbklkfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyBgdW5zdWJzY3JpYmVkKClgIG9uIGV2ZXJ5IGxpdmUgY2hhbm5lbC12MiBzdWJzY3JpcHRpb24sXG4gICAqIHJlbW92ZXMgdGhlbSBmcm9tIHRoZSBDb25maWd1cmF0aW9uJ3MgZ2xvYmFsIHJlZ2lzdHJ5LCBhbmRcbiAgICogZHJvcHMgdGhlIHNlc3Npb24ncyBvd24gbWFwLiBObyBuZXR3b3JrIGZyYW1lcyDigJQgdGhlIHNvY2tldFxuICAgKiBpcyBhbHJlYWR5IGdvaW5nIGF3YXkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX3RlYXJkb3duQ2hhbm5lbFN1YnNjcmlwdGlvbnMoKSB7XG4gICAgY29uc3QgZW50cmllcyA9IFsuLi50aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy52YWx1ZXMoKV1cblxuICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmNsZWFyKClcblxuICAgIGZvciAoY29uc3Qge2NoYW5uZWxUeXBlLCBzdWJzY3JpcHRpb259IG9mIGVudHJpZXMpIHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5fdW5yZWdpc3RlcldlYnNvY2tldENoYW5uZWxTdWJzY3JpcHRpb24oY2hhbm5lbFR5cGUsIHN1YnNjcmlwdGlvbilcbiAgICAgIHN1YnNjcmlwdGlvbi5fY2xvc2VkID0gdHJ1ZVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4gYXdhaXQgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlZCgpKVxuICAgICAgfSBjYXRjaCAoY2F1Z2h0RXJyb3IpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLl9yZXBvcnRVbmV4cGVjdGVkRGlzcGF0Y2hFcnJvcihjYXVnaHRFcnJvciwge1xuICAgICAgICAgIGNoYW5uZWxUeXBlLFxuICAgICAgICAgIHN0YWdlOiBcIndlYnNvY2tldC1jaGFubmVsLXRlYXJkb3duXCIsXG4gICAgICAgICAgc3Vic2NyaXB0aW9uSWQ6IHN1YnNjcmlwdGlvbi5zdWJzY3JpcHRpb25JZFxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgRmFpbGVkIHRvIHRlYXIgZG93biBjaGFubmVsLXYyICR7Y2hhbm5lbFR5cGV9OiR7c3Vic2NyaXB0aW9uLnN1YnNjcmlwdGlvbklkfWAsIGVycm9yXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBfdGVhcmRvd25DaGFubmVsKCkge1xuICAgIGZvciAoY29uc3QgY2hhbm5lbCBvZiB0aGlzLmNoYW5uZWxzKSB7XG4gICAgICBhd2FpdCB0aGlzLl90ZWFyZG93blNpbmdsZUNoYW5uZWwoY2hhbm5lbClcbiAgICB9XG4gICAgdGhpcy5jaGFubmVscy5jbGVhcigpXG4gICAgdGhpcy5jaGFubmVsUmVwbGF5U3RhdGVzLmNsZWFyKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRlYXJkb3duIHNpbmdsZSBjaGFubmVsLlxuICAgKiBAcGFyYW0ge1dlYnNvY2tldENoYW5uZWx9IGNoYW5uZWwgLSBDaGFubmVsIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX3RlYXJkb3duU2luZ2xlQ2hhbm5lbChjaGFubmVsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRlbmFudCA9IHRoaXMuY2hhbm5lbFRlbmFudHMuZ2V0KGNoYW5uZWwpXG5cbiAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5ydW5XaXRoVGVuYW50KHRlbmFudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IGNoYW5uZWw/LnVuc3Vic2NyaWJlZD8uKClcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoY2F1Z2h0RXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fcmVwb3J0VW5leHBlY3RlZERpc3BhdGNoRXJyb3IoY2F1Z2h0RXJyb3IsIHtcbiAgICAgICAgc3RhZ2U6IFwid2Vic29ja2V0LWNoYW5uZWwtdGVhcmRvd25cIlxuICAgICAgfSlcblxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiRmFpbGVkIHRvIHRlYXJkb3duIHdlYnNvY2tldCBjaGFubmVsXCIsIGVycm9yXSlcbiAgICB9XG5cbiAgICBjb25zdCBzdWJzY3JpcHRpb25zID0gdGhpcy5oYW5kbGVyU3Vic2NyaXB0aW9ucy5nZXQoY2hhbm5lbClcblxuICAgIGlmIChzdWJzY3JpcHRpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IHN1YnNjcmlwdGlvbkNoYW5uZWwgb2Ygc3Vic2NyaXB0aW9ucykge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbkhhbmRsZXJzLmdldChzdWJzY3JpcHRpb25DaGFubmVsKT8uZGVsZXRlKGNoYW5uZWwpXG5cbiAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uSGFuZGxlcnMuZ2V0KHN1YnNjcmlwdGlvbkNoYW5uZWwpPy5zaXplID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25IYW5kbGVycy5kZWxldGUoc3Vic2NyaXB0aW9uQ2hhbm5lbClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmhhbmRsZXJTdWJzY3JpcHRpb25zLmRlbGV0ZShjaGFubmVsKVxuICAgIH1cblxuICAgIHRoaXMuY2hhbm5lbFRlbmFudHMuZGVsZXRlKGNoYW5uZWwpXG4gIH1cblxuICAvKipcbiAgICogUnVucyByZWdpc3RlciBjaGFubmVsLlxuICAgKiBAcGFyYW0ge1dlYnNvY2tldENoYW5uZWwgfCB1bmRlZmluZWR9IGNoYW5uZWwgLSBDaGFubmVsIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IHRlbmFudCAtIFRlbmFudCBrZXkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfcmVnaXN0ZXJDaGFubmVsKGNoYW5uZWwsIHRlbmFudCkge1xuICAgIGlmICghY2hhbm5lbCkgcmV0dXJuXG5cbiAgICB0aGlzLmNoYW5uZWxzLmFkZChjaGFubmVsKVxuICAgIHRoaXMuY2hhbm5lbFRlbmFudHMuc2V0KGNoYW5uZWwsIHRlbmFudClcbiAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNoYW5uZWw/LnN1YnNjcmliZWQ/LigpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyB3aXRoIGNvbm5lY3Rpb25zLlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8dm9pZD59IGNhbGxiYWNrIC0gQ2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfd2l0aENvbm5lY3Rpb25zKGNhbGxiYWNrKSB7XG4gICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmVuc3VyZUNvbm5lY3Rpb25zKHtuYW1lOiBcIldlYnNvY2tldCBzZXNzaW9uXCJ9LCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBjYWxsYmFjaygpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGhhbmRsZSBjaGFubmVsIHN1YnNjcmlwdGlvbi5cbiAgICogQHBhcmFtIHt7Y2hhbm5lbDogc3RyaW5nLCBsYXN0RXZlbnRJZD86IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgPz59fSBhcmdzIC0gU3Vic2NyaXB0aW9uIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfaGFuZGxlQ2hhbm5lbFN1YnNjcmlwdGlvbih7Y2hhbm5lbCwgbGFzdEV2ZW50SWQsIHBhcmFtc30pIHtcbiAgICBjb25zdCByZXNvbHZlciA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRDaGFubmVsUmVzb2x2ZXI/LigpXG5cbiAgICBpZiAoIXJlc29sdmVyKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICAvLyBUZW5hbnQgcmVzb2x1dGlvbiBjYW4gcnVuIGRhdGFiYXNlIHF1ZXJpZXMsIHNvIGl0IG11c3QgaGFwcGVuIGluc2lkZSBhXG4gICAgICAvLyBjb25uZWN0aW9uIHNjb3BlIChzZWUgX2hhbmRsZUNoYW5uZWxTdWJzY3JpYmUpLlxuICAgICAgbGV0IHRlbmFudFxuICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgICAgdGVuYW50ID0gYXdhaXQgdGhpcy5fcmVzb2x2ZVRlbmFudCh7Y2hhbm5lbCwgcGFyYW1zfSlcbiAgICAgIH0pXG4gICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5ydW5XaXRoVGVuYW50KHRlbmFudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzb2x2ZXIoe1xuICAgICAgICAgIGNsaWVudDogdGhpcy5jbGllbnQsXG4gICAgICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgICAgIHJlcXVlc3Q6IHRoaXMudXBncmFkZVJlcXVlc3QsXG4gICAgICAgICAgc3Vic2NyaXB0aW9uOiB7Y2hhbm5lbCwgcGFyYW1zfSxcbiAgICAgICAgICB3ZWJzb2NrZXRTZXNzaW9uOiB0aGlzXG4gICAgICAgIH0pXG4gICAgICB9KVxuXG4gICAgICBpZiAoIXJlc29sdmVkKSB7XG4gICAgICAgIHRoaXMuc2VuZEpzb24oe2NoYW5uZWwsIGVycm9yOiBcIlN1YnNjcmlwdGlvbiByZWplY3RlZFwiLCB0eXBlOiBcImVycm9yXCJ9KVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hhbm5lbEluc3RhbmNlID0gdHlwZW9mIHJlc29sdmVkID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBuZXcgcmVzb2x2ZWQoe1xuICAgICAgICAgIGNsaWVudDogdGhpcy5jbGllbnQsXG4gICAgICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgICAgIGxhc3RFdmVudElkLFxuICAgICAgICAgIHJlcXVlc3Q6IHRoaXMudXBncmFkZVJlcXVlc3QsXG4gICAgICAgICAgc3Vic2NyaXB0aW9uQ2hhbm5lbDogY2hhbm5lbCxcbiAgICAgICAgICBzdWJzY3JpcHRpb25QYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgICB3ZWJzb2NrZXRTZXNzaW9uOiB0aGlzXG4gICAgICAgIH0pXG4gICAgICAgIDogcmVzb2x2ZWRcblxuICAgICAgaWYgKGNoYW5uZWxJbnN0YW5jZSAmJiAhKGNoYW5uZWxJbnN0YW5jZSBpbnN0YW5jZW9mIFdlYnNvY2tldENoYW5uZWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlc29sdmVkIHdlYnNvY2tldCBjaGFubmVsIG11c3QgZXh0ZW5kIFdlYnNvY2tldENoYW5uZWxcIilcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5fcmVnaXN0ZXJDaGFubmVsKGNoYW5uZWxJbnN0YW5jZSwgdGVuYW50KVxuICAgIH0gY2F0Y2ggKGNhdWdodEVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHRoaXMuX3JlcG9ydFVuZXhwZWN0ZWREaXNwYXRjaEVycm9yKGNhdWdodEVycm9yLCB7XG4gICAgICAgIGNoYW5uZWwsXG4gICAgICAgIHN0YWdlOiBcIndlYnNvY2tldC1jaGFubmVsLXN1YnNjcmlwdGlvblwiXG4gICAgICB9KVxuXG4gICAgICB0aGlzLmxvZ2dlci53YXJuKCgpID0+IFtcIldlYnNvY2tldCBjaGFubmVsIHN1YnNjcmlwdGlvbiBmYWlsZWRcIiwgZXJyb3JdKVxuICAgICAgdGhpcy5zZW5kSnNvbih7Y2hhbm5lbCwgZXJyb3I6IFwiU3Vic2NyaXB0aW9uIHJlamVjdGVkXCIsIHR5cGU6IFwiZXJyb3JcIn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcHJlcGFyZSByZXBsYXkgc3RhdGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2hhbm5lbCAtIEludGVybmFsIGNoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IGFyZ3MubGFzdEV2ZW50SWQgLSBMYXN0IHJlY2VpdmVkIGV2ZW50IGlkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zdWJzY3JpcHRpb25DaGFubmVsIC0gQ2xpZW50LWZhY2luZyBjaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz4gfCB1bmRlZmluZWR9IGFyZ3Muc3Vic2NyaXB0aW9uUGFyYW1zIC0gQ2xpZW50LWZhY2luZyBwYXJhbXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGZhbHNlIHwge2J1ZmZlcmVkOiBib29sZWFuLCBjZWlsaW5nU2VxdWVuY2U6IG51bWJlciwgY2hlY2twb2ludFNlcXVlbmNlOiBudW1iZXIsIHJlcGxheWluZzogYm9vbGVhbn0gfCBudWxsPn0gLSBSZXBsYXkgc3RhdGUuXG4gICAqL1xuICBhc3luYyBfcHJlcGFyZVJlcGxheVN0YXRlKHtjaGFubmVsLCBsYXN0RXZlbnRJZCwgc3Vic2NyaXB0aW9uQ2hhbm5lbCwgc3Vic2NyaXB0aW9uUGFyYW1zfSkge1xuICAgIGlmICghbGFzdEV2ZW50SWQpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBzdG9yZSA9IHdlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9uKHRoaXMuY29uZmlndXJhdGlvbilcbiAgICBjb25zdCBjaGVja3BvaW50ID0gYXdhaXQgc3RvcmUuZ2V0RXZlbnRCeUlkKHtjaGFubmVsLCBpZDogbGFzdEV2ZW50SWR9KVxuXG4gICAgaWYgKCFjaGVja3BvaW50KSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHtjaGFubmVsOiBzdWJzY3JpcHRpb25DaGFubmVsLCBsYXN0RXZlbnRJZCwgcGFyYW1zOiBzdWJzY3JpcHRpb25QYXJhbXMsIHR5cGU6IFwicmVwbGF5LWdhcFwifSlcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBidWZmZXJlZDogZmFsc2UsXG4gICAgICBjZWlsaW5nU2VxdWVuY2U6IChhd2FpdCBzdG9yZS5sYXRlc3RTZXF1ZW5jZShjaGFubmVsKSkgfHwgY2hlY2twb2ludC5zZXF1ZW5jZSxcbiAgICAgIGNoZWNrcG9pbnRTZXF1ZW5jZTogY2hlY2twb2ludC5zZXF1ZW5jZSxcbiAgICAgIHJlcGxheWluZzogdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlcGxheSBjaGFubmVsIGV2ZW50cy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge3tidWZmZXJlZDogYm9vbGVhbiwgY2VpbGluZ1NlcXVlbmNlOiBudW1iZXIsIGNoZWNrcG9pbnRTZXF1ZW5jZTogbnVtYmVyLCByZXBsYXlpbmc6IGJvb2xlYW59fSBhcmdzLnJlcGxheVN0YXRlIC0gUmVwbGF5IHN0YXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHJlcGxheSBjb21wbGV0ZXMuXG4gICAqL1xuICBhc3luYyBfcmVwbGF5Q2hhbm5lbEV2ZW50cyh7Y2hhbm5lbCwgcmVwbGF5U3RhdGV9KSB7XG4gICAgY29uc3Qgc3RvcmUgPSB3ZWJzb2NrZXRFdmVudExvZ1N0b3JlRm9yQ29uZmlndXJhdGlvbih0aGlzLmNvbmZpZ3VyYXRpb24pXG4gICAgY29uc3QgZXZlbnRzID0gYXdhaXQgc3RvcmUuZ2V0RXZlbnRzQWZ0ZXIoe1xuICAgICAgY2hhbm5lbCxcbiAgICAgIHNlcXVlbmNlOiByZXBsYXlTdGF0ZS5jaGVja3BvaW50U2VxdWVuY2UsXG4gICAgICB1cFRvU2VxdWVuY2U6IHJlcGxheVN0YXRlLmNlaWxpbmdTZXF1ZW5jZVxuICAgIH0pXG5cbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgYXdhaXQgdGhpcy5zZW5kRXZlbnQoY2hhbm5lbCwgZXZlbnQucGF5bG9hZCwge1xuICAgICAgICBjcmVhdGVkQXQ6IGV2ZW50LmNyZWF0ZWRBdCxcbiAgICAgICAgZXZlbnRJZDogZXZlbnQuaWQsXG4gICAgICAgIHJlcGxheWVkOiB0cnVlLFxuICAgICAgICBzZXF1ZW5jZTogZXZlbnQuc2VxdWVuY2VcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZmluaXNoIHJlcGxheSBzdGF0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7e2J1ZmZlcmVkOiBib29sZWFuLCBjZWlsaW5nU2VxdWVuY2U6IG51bWJlciwgY2hlY2twb2ludFNlcXVlbmNlOiBudW1iZXIsIHJlcGxheWluZzogYm9vbGVhbn19IHJlcGxheVN0YXRlIC0gUmVwbGF5IHN0YXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGJ1ZmZlcmVkIGV2ZW50cyBhcmUgZmx1c2hlZC5cbiAgICovXG4gIGFzeW5jIF9maW5pc2hSZXBsYXlTdGF0ZShjaGFubmVsLCByZXBsYXlTdGF0ZSkge1xuICAgIGNvbnN0IHN0b3JlID0gd2Vic29ja2V0RXZlbnRMb2dTdG9yZUZvckNvbmZpZ3VyYXRpb24odGhpcy5jb25maWd1cmF0aW9uKVxuXG4gICAgcmVwbGF5U3RhdGUucmVwbGF5aW5nID0gZmFsc2VcbiAgICB0aGlzLmNoYW5uZWxSZXBsYXlTdGF0ZXMuZGVsZXRlKGNoYW5uZWwpXG5cbiAgICBpZiAoIXJlcGxheVN0YXRlLmJ1ZmZlcmVkKSByZXR1cm5cblxuICAgIGNvbnN0IGxpdmVFdmVudHMgPSBhd2FpdCBzdG9yZS5nZXRFdmVudHNBZnRlcih7XG4gICAgICBjaGFubmVsLFxuICAgICAgc2VxdWVuY2U6IHJlcGxheVN0YXRlLmNlaWxpbmdTZXF1ZW5jZVxuICAgIH0pXG5cbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGxpdmVFdmVudHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZEV2ZW50KGNoYW5uZWwsIGV2ZW50LnBheWxvYWQsIHtcbiAgICAgICAgY3JlYXRlZEF0OiBldmVudC5jcmVhdGVkQXQsXG4gICAgICAgIGV2ZW50SWQ6IGV2ZW50LmlkLFxuICAgICAgICBzZXF1ZW5jZTogZXZlbnQuc2VxdWVuY2VcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVzb2x2ZSB0ZW5hbnQuXG4gICAqIEBwYXJhbSB7e2NoYW5uZWw/OiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsID8+fX0gYXJncyAtIFRlbmFudCByZXNvbHV0aW9uIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+fSAtIFJlc29sdmVkIHRlbmFudC5cbiAgICovXG4gIGFzeW5jIF9yZXNvbHZlVGVuYW50KHtjaGFubmVsLCBwYXJhbXN9KSB7XG4gICAgY29uc3QgcmVxdWVzdFBhcmFtcyA9IHRoaXMudXBncmFkZVJlcXVlc3Q/LnBhcmFtcz8uKClcbiAgICBjb25zdCBtZXJnZWRQYXJhbXMgPSB7XG4gICAgICAuLi4ocmVxdWVzdFBhcmFtcyAmJiB0eXBlb2YgcmVxdWVzdFBhcmFtcyA9PT0gXCJvYmplY3RcIiA/IHJlcXVlc3RQYXJhbXMgOiB7fSksXG4gICAgICAuLi4ocGFyYW1zICYmIHR5cGVvZiBwYXJhbXMgPT09IFwib2JqZWN0XCIgPyBwYXJhbXMgOiB7fSlcbiAgICB9XG5cbiAgICByZXR1cm4gLyoqIEB0eXBlIHtQcm9taXNlPHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+fSAqLyAodGhpcy5jb25maWd1cmF0aW9uLnJlc29sdmVUZW5hbnQoe1xuICAgICAgcGFyYW1zOiBtZXJnZWRQYXJhbXMsXG4gICAgICByZXF1ZXN0OiB0aGlzLnVwZ3JhZGVSZXF1ZXN0LFxuICAgICAgcmVzcG9uc2U6IHVuZGVmaW5lZCxcbiAgICAgIHN1YnNjcmlwdGlvbjogY2hhbm5lbCA/IHtjaGFubmVsLCBwYXJhbXN9IDogdW5kZWZpbmVkXG4gICAgfSkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB1bm1hc2sgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IHBheWxvYWQgLSBQYXlsb2FkIGRhdGEuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBtYXNrIC0gTWFzay5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgX3VubWFza1BheWxvYWQocGF5bG9hZCwgbWFzaykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF5bG9hZC5sZW5ndGg7IGkrKykge1xuICAgICAgcGF5bG9hZFtpXSBePSBtYXNrW2kgJSA0XVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIF9ydW5NZXNzYWdlSGFuZGxlck9wZW4oKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyXG4gICAgICBjb25zdCBvbk9wZW4gPSBoYW5kbGVyID8gaGFuZGxlci5vbk9wZW4gOiBudWxsXG5cbiAgICAgIGlmIChvbk9wZW4pIHtcbiAgICAgICAgYXdhaXQgb25PcGVuKHtzZXNzaW9uOiB0aGlzfSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChjYXVnaHRFcnJvcikge1xuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLl9yZXBvcnRVbmV4cGVjdGVkRGlzcGF0Y2hFcnJvcihjYXVnaHRFcnJvciwge1xuICAgICAgICBzdGFnZTogXCJ3ZWJzb2NrZXQtbWVzc2FnZS1oYW5kbGVyLW9wZW5cIlxuICAgICAgfSlcblxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiV2Vic29ja2V0IG9wZW4gaGFuZGxlciBmYWlsZWRcIiwgZXJyb3JdKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJ1biBtZXNzYWdlIGhhbmRsZXIgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtXZWJzb2NrZXRTZXNzaW9uTWVzc2FnZX0gbWVzc2FnZSAtIEluY29taW5nIHdlYnNvY2tldCBtZXNzYWdlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX3J1bk1lc3NhZ2VIYW5kbGVyTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyXG4gICAgICBjb25zdCBvbk1lc3NhZ2UgPSBoYW5kbGVyID8gaGFuZGxlci5vbk1lc3NhZ2UgOiBudWxsXG5cbiAgICAgIGlmIChvbk1lc3NhZ2UpIHtcbiAgICAgICAgYXdhaXQgb25NZXNzYWdlKHttZXNzYWdlLCBzZXNzaW9uOiB0aGlzfSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChjYXVnaHRFcnJvcikge1xuICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMubWVzc2FnZUhhbmRsZXJcbiAgICAgIGNvbnN0IG9uRXJyb3IgPSBoYW5kbGVyID8gaGFuZGxlci5vbkVycm9yIDogbnVsbFxuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLl9yZXBvcnRVbmV4cGVjdGVkRGlzcGF0Y2hFcnJvcihjYXVnaHRFcnJvciwge1xuICAgICAgICBzdGFnZTogXCJ3ZWJzb2NrZXQtbWVzc2FnZS1oYW5kbGVyXCJcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBtZXNzYWdlIGhhbmRsZXIgZmFpbGVkXCIsIGVycm9yXSlcbiAgICAgIGlmICghb25FcnJvcikgcmV0dXJuXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IG9uRXJyb3Ioe2Vycm9yLCBzZXNzaW9uOiB0aGlzfSlcbiAgICAgIH0gY2F0Y2ggKG9uRXJyb3JDYXVnaHRFcnJvcikge1xuICAgICAgICBjb25zdCBjbGllbnRFcnJvck1lc3NhZ2UgPSBvbkVycm9yQ2F1Z2h0RXJyb3IgaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgID8gb25FcnJvckNhdWdodEVycm9yLm1lc3NhZ2VcbiAgICAgICAgICA6IFN0cmluZyhvbkVycm9yQ2F1Z2h0RXJyb3IpXG4gICAgICAgIGNvbnN0IG9uRXJyb3JFcnJvciA9IHRoaXMuX3JlcG9ydFVuZXhwZWN0ZWREaXNwYXRjaEVycm9yKG9uRXJyb3JDYXVnaHRFcnJvciwge1xuICAgICAgICAgIHN0YWdlOiBcIndlYnNvY2tldC1tZXNzYWdlLWhhbmRsZXItZXJyb3JcIlxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBtZXNzYWdlIGVycm9yIGhhbmRsZXIgZmFpbGVkXCIsIG9uRXJyb3JFcnJvcl0pXG4gICAgICAgIHRoaXMuc2VuZEpzb24oe1xuICAgICAgICAgIGVycm9yOiBjbGllbnRFcnJvck1lc3NhZ2UsXG4gICAgICAgICAgdHlwZTogXCJlcnJvclwiXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX3J1bk1lc3NhZ2VIYW5kbGVyQ2xvc2UoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyXG4gICAgICBjb25zdCBvbkNsb3NlID0gaGFuZGxlciA/IGhhbmRsZXIub25DbG9zZSA6IG51bGxcblxuICAgICAgaWYgKG9uQ2xvc2UpIHtcbiAgICAgICAgYXdhaXQgb25DbG9zZSh7c2Vzc2lvbjogdGhpc30pXG4gICAgICB9XG4gICAgfSBjYXRjaCAoY2F1Z2h0RXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fcmVwb3J0VW5leHBlY3RlZERpc3BhdGNoRXJyb3IoY2F1Z2h0RXJyb3IsIHtcbiAgICAgICAgc3RhZ2U6IFwid2Vic29ja2V0LW1lc3NhZ2UtaGFuZGxlci1jbG9zZVwiXG4gICAgICB9KVxuXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJXZWJzb2NrZXQgY2xvc2UgaGFuZGxlciBmYWlsZWRcIiwgZXJyb3JdKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlbW90ZSBhZGRyZXNzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAtIFJlbW90ZSBhZGRyZXNzIHJlc29sdmVkIGZyb20gdGhlIHdlYnNvY2tldCB1cGdyYWRlIHJlcXVlc3QuXG4gICAqL1xuICByZW1vdGVBZGRyZXNzKCkge1xuICAgIHJldHVybiB0aGlzLnVwZ3JhZGVSZXF1ZXN0Py5yZW1vdGVBZGRyZXNzKCkgfHwgdGhpcy5jbGllbnQucmVtb3RlQWRkcmVzc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2V0IG1lc3NhZ2UgaGFuZGxlci5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLldlYnNvY2tldE1lc3NhZ2VIYW5kbGVyfSBoYW5kbGVyIC0gSGFuZGxlciBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXRNZXNzYWdlSGFuZGxlcihoYW5kbGVyKSB7XG4gICAgdGhpcy5tZXNzYWdlSGFuZGxlciA9IGhhbmRsZXJcbiAgICB2b2lkIHRoaXMuX3J1bk1lc3NhZ2VIYW5kbGVyT3BlbigpXG4gIH1cblxuICBhc3luYyBfcmVzb2x2ZU1lc3NhZ2VIYW5kbGVyUHJvbWlzZSgpIHtcbiAgICBpZiAoIXRoaXMubWVzc2FnZUhhbmRsZXJQcm9taXNlKSByZXR1cm5cblxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5XZWJzb2NrZXRNZXNzYWdlSGFuZGxlciB8IHZvaWR9ICovXG4gICAgbGV0IGhhbmRsZXJcblxuICAgIHRyeSB7XG4gICAgICBoYW5kbGVyID0gYXdhaXQgdGhpcy5tZXNzYWdlSGFuZGxlclByb21pc2VcbiAgICB9IGNhdGNoIChjYXVnaHRFcnJvcikge1xuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLl9yZXBvcnRVbmV4cGVjdGVkRGlzcGF0Y2hFcnJvcihjYXVnaHRFcnJvciwge1xuICAgICAgICBzdGFnZTogXCJ3ZWJzb2NrZXQtbWVzc2FnZS1oYW5kbGVyLXJlc29sdmVyXCJcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBtZXNzYWdlIGhhbmRsZXIgcmVzb2x2ZXIgZmFpbGVkXCIsIGVycm9yXSlcbiAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJQcm9taXNlID0gdW5kZWZpbmVkXG4gICAgICBhd2FpdCB0aGlzLl9maW5pc2hNZXNzYWdlSGFuZGxlclJlc29sdXRpb24oe3VzZUhhbmRsZXI6IGZhbHNlfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMubWVzc2FnZUhhbmRsZXJQcm9taXNlID0gdW5kZWZpbmVkXG4gICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICBhd2FpdCB0aGlzLl9maW5pc2hNZXNzYWdlSGFuZGxlclJlc29sdXRpb24oe3VzZUhhbmRsZXI6IGZhbHNlfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9pbmJvdW5kQ2xvc2VkKSB7XG4gICAgICB0aGlzLnBlbmRpbmdNZXNzYWdlSGFuZGxlciA9IGZhbHNlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBJbnN0YWxsIGhhbmRsZXIgYW5kIGRyYWluIG9uT3BlbiBiZWZvcmUgcmVwbGF5aW5nIHF1ZXVlZFxuICAgIC8vIG1lc3NhZ2VzLiBzZXRNZXNzYWdlSGFuZGxlcigpIGZpcmVzIG9uT3BlbiBhcyBmaXJlLWFuZC1mb3JnZXQ7XG4gICAgLy8gYXdhaXRpbmcgX3J1bk1lc3NhZ2VIYW5kbGVyT3BlbigpIGRpcmVjdGx5IGhlcmUgY2xvc2VzIHRoZVxuICAgIC8vIHJhY2Ugd2hlcmUgcXVldWVkIHN1YnNjcmliZS9jb25uZWN0aW9uLSogZnJhbWVzIHdvdWxkXG4gICAgLy8gZGlzcGF0Y2ggd2hpbGUgYW4gYXN5bmMgb25PcGVuIGlzIHN0aWxsIHNldHRpbmcgdXAgc2Vzc2lvblxuICAgIC8vIHN0YXRlLlxuICAgIHRoaXMubWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyXG4gICAgYXdhaXQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJPcGVuKClcbiAgICBhd2FpdCB0aGlzLl9maW5pc2hNZXNzYWdlSGFuZGxlclJlc29sdXRpb24oe1xuICAgICAgdXNlSGFuZGxlcjogdHlwZW9mIGhhbmRsZXIub25NZXNzYWdlID09PSBcImZ1bmN0aW9uXCJcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydHMgcmVzb2x2ZXIgY29tcGxldGlvbiBpbnRvIHRoZSBGSUZPIGNoYWluIGJlZm9yZSBhbGxvd2luZyBuZXcgZGlzcGF0Y2guXG4gICAqIEBwYXJhbSB7e3VzZUhhbmRsZXI6IGJvb2xlYW59fSBhcmdzIC0gUmVzb2x2ZXIgcmVzdWx0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciBxdWV1ZWQgbWVzc2FnZXMgZHJhaW4uXG4gICAqL1xuICBhc3luYyBfZmluaXNoTWVzc2FnZUhhbmRsZXJSZXNvbHV0aW9uKHt1c2VIYW5kbGVyfSkge1xuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5fbWVzc2FnZUNoYWluXG4gICAgY29uc3QgZHJhaW4gPSBwcmV2aW91cy50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZ01lc3NhZ2VIYW5kbGVyID0gZmFsc2VcbiAgICAgIGlmICh0aGlzLl9pbmJvdW5kQ2xvc2VkKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZVF1ZXVlID0gW11cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuX2ZsdXNoUXVldWVkTWVzc2FnZXMoe3VzZUhhbmRsZXJ9KVxuICAgIH0pXG5cbiAgICB0aGlzLl9tZXNzYWdlQ2hhaW4gPSBkcmFpbi5jYXRjaCgoKSA9PiB7fSlcbiAgICBhd2FpdCBkcmFpblxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZmx1c2ggcXVldWVkIG1lc3NhZ2VzLlxuICAgKiBAcGFyYW0ge3t1c2VIYW5kbGVyOiBib29sZWFufX0gYXJncyAtIEFyZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfZmx1c2hRdWV1ZWRNZXNzYWdlcyh7dXNlSGFuZGxlcn0pIHtcbiAgICBpZiAodGhpcy5tZXNzYWdlUXVldWUubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICAgIGNvbnN0IHF1ZXVlZCA9IHRoaXMubWVzc2FnZVF1ZXVlXG4gICAgdGhpcy5tZXNzYWdlUXVldWUgPSBbXVxuXG4gICAgZm9yIChjb25zdCB3b3JrIG9mIHF1ZXVlZCkge1xuICAgICAgaWYgKHRoaXMuX2luYm91bmRDbG9zZWQpIHtcbiAgICAgICAgdGhpcy5fcmVsZWFzZUluYm91bmRBZG1pc3Npb24od29yay5hZG1pc3Npb24pXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh1c2VIYW5kbGVyICYmIHRoaXMubWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLl9ydW5NZXNzYWdlSGFuZGxlck1lc3NhZ2Uod29yay5tZXNzYWdlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IHRoaXMuX2Rpc3BhdGNoTWVzc2FnZSh3b3JrLm1lc3NhZ2UpXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGNhdWdodEVycm9yKSB7XG4gICAgICAgIGNvbnN0IGNsaWVudEVycm9yTWVzc2FnZSA9IGNhdWdodEVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBjYXVnaHRFcnJvci5tZXNzYWdlIDogU3RyaW5nKGNhdWdodEVycm9yKVxuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuX3JlcG9ydFVuZXhwZWN0ZWREaXNwYXRjaEVycm9yKGNhdWdodEVycm9yLCB7XG4gICAgICAgICAgc3RhZ2U6IFwid2Vic29ja2V0LW1lc3NhZ2UtZGlzcGF0Y2hcIlxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBtZXNzYWdlIGhhbmRsZXIgZmFpbGVkXCIsIGVycm9yXSlcbiAgICAgICAgdGhpcy5zZW5kSnNvbih7XG4gICAgICAgICAgZXJyb3I6IGNsaWVudEVycm9yTWVzc2FnZSxcbiAgICAgICAgICB0eXBlOiBcImVycm9yXCJcbiAgICAgICAgfSlcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuX3JlbGVhc2VJbmJvdW5kQWRtaXNzaW9uKHdvcmsuYWRtaXNzaW9uKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
|
|
2044
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LXNlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1zZXNzaW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ3hDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFFckMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFBO0FBQ2hFLE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sWUFBWSxNQUFNLDhCQUE4QixDQUFBO0FBQ3ZELE9BQU8sYUFBYSxNQUFNLDZCQUE2QixDQUFBO0FBQ3ZELE9BQU8sY0FBYyxNQUFNLDBCQUEwQixDQUFBO0FBQ3JELE9BQU8sZ0JBQWdCLE1BQU0seUJBQXlCLENBQUE7QUFDdEQsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0saUNBQWlDLENBQUE7QUFDeEYsT0FBTyxhQUFhLE1BQU0scUJBQXFCLENBQUE7QUFDL0MsT0FBTyxnQkFBZ0IsTUFBTSx3QkFBd0IsQ0FBQTtBQUVyRDs7O0dBR0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7O0dBSUc7QUFFSCxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQTtBQUNsQyxNQUFNLDZCQUE2QixHQUFHLEdBQUcsQ0FBQTtBQUN6QyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUNqQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQTtBQUNuQyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQTtBQUNsQyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUNqQyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUVqQyxNQUFNLGdDQUFnQyxHQUFHLElBQUksQ0FBQTtBQUM3QyxNQUFNLHNDQUFzQyxHQUFHLGtDQUFrQyxDQUFBO0FBQ2pGLE1BQU0sZ0NBQWdDLEdBQUcsR0FBRyxDQUFBO0FBRTVDLHdFQUF3RTtBQUN4RSxNQUFNLDBCQUEwQixHQUFHLElBQUksQ0FBQTtBQUV2QyxtRUFBbUU7QUFDbkUsTUFBTSxzQ0FBc0MsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQTtBQUUvRCxtRUFBbUU7QUFDbkUsTUFBTSwrQkFBK0IsR0FBRyxzQ0FBc0MsQ0FBQTtBQUU5RSxNQUFNLHdDQUF3QyxHQUFHLE1BQU0sQ0FBQywrQkFBK0IsQ0FBQyxDQUFBO0FBRXhGLDZEQUE2RDtBQUM3RCxNQUFNLDBDQUEwQyxHQUFHLElBQUksQ0FBQTtBQUV2RDs7OztHQUlHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxPQUFPO0lBQy9CLE9BQU8sT0FBTyxDQUFDLElBQUksS0FBSyxXQUFXO1FBQ2pDLENBQUMsQ0FBQyxpSUFBaUksQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUM3SSxDQUFDLENBQUMsSUFBSSxDQUFBO0FBQ1YsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxPQUFPO0lBQzdCLElBQUksT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVM7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUUzRCxPQUFPLDJMQUEyTCxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDOU0sQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxlQUFlLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFBO0lBQ3hCLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSTtRQUFFLE9BQU8sS0FBSyxDQUFBO0lBQ3hDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUVoRSxJQUFJLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNoRCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxPQUFPLE9BQU8seUNBQXlDO0lBQzVELE1BQU0sR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFBO0lBQzNCLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBQ3pCLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBQ3BCLG9CQUFvQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7SUFDaEMsb0JBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUNoQyxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUMxQixtQkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBQy9COztzQ0FFa0M7SUFDbEMsWUFBWSxHQUFHLEVBQUUsQ0FBQTtJQUVqQjs7Ozs7Ozs7T0FRRztJQUNILFlBQVksRUFBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUscUJBQXFCLEVBQUM7UUFDeEYsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFBO1FBQ3ZCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUE7UUFDMUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQTtRQUMzQixJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQTtRQUN2QixJQUFJLENBQUMsdUJBQXVCLEdBQUcsQ0FBQyxDQUFBO1FBQ2hDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO1FBQ3BCLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFBO1FBQ2xDLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFBO1FBQ3BDLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFBO1FBQ3BDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxxQkFBcUIsQ0FBQTtRQUNsRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUE7UUFDM0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM5QixNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsOEJBQThCLEVBQUUsQ0FBQTtRQUU5RSxJQUFJLENBQUMsdUJBQXVCLEdBQUcsa0JBQWtCLENBQUMsUUFBUSxDQUFBO1FBQzFELElBQUksQ0FBQywwQkFBMEIsR0FBRyxrQkFBa0IsQ0FBQyxXQUFXLENBQUE7UUFDaEUsSUFBSSxDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQTtRQUM3QixJQUFJLENBQUMsdUJBQXVCLEdBQUcsQ0FBQyxDQUFBO1FBQ2hDLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxDQUFDLENBQUE7UUFDckMsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUE7UUFDM0IsSUFBSSxDQUFDLHlCQUF5QixHQUFHLEtBQUssQ0FBQTtRQUV0Qzs7bUVBRTJEO1FBQzNELElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFBO1FBRW5COzs7OztXQUtHO1FBQ0gsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUE7UUFFZDs7K0VBRXVFO1FBQ3ZFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUU3Qjs7aUhBRXlHO1FBQ3pHLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBRXRDOzs7Ozs7V0FNRztRQUNILElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBVSxFQUFFLENBQUE7UUFFN0I7OztXQUdHO1FBQ0gsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUE7UUFFcEI7OztXQUdHO1FBQ0gsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUE7UUFFeEI7O3lEQUVpRDtRQUNqRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQTtRQUVsQjs7Ozs7OztXQU9HO1FBQ0gsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7UUFFdEM7Ozs7OztXQU1HO1FBQ0gsSUFBSSxDQUFDLHNCQUFzQixHQUFHLFNBQVMsQ0FBQTtRQUV2Qzs7Ozs7V0FLRztRQUNILElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUE7UUFFL0I7Ozs7O1dBS0c7UUFDSCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFBO1FBRTdCOzs7OztXQUtHO1FBQ0gsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQTtRQUV6QixJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUUvQzs7Ozs7O1dBTUc7UUFDSCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQTtRQUUzQjs7Ozs7O1dBTUc7UUFDSCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQTtJQUM3QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILHNCQUFzQjtRQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ1osSUFBSSxFQUFFLHFCQUFxQjtZQUMzQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDekIsWUFBWSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsK0JBQStCLEVBQUUsRUFBRSxJQUFJLEdBQUc7U0FDNUUsQ0FBQyxDQUFBO1FBRUYsaUVBQWlFO1FBQ2pFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQTtJQUN4QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsaUJBQWlCLENBQUMsWUFBWTtRQUM1QixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUN4QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVztRQUNULE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUMsQ0FBQTtJQUM1QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQTtJQUNyQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGVBQWUsQ0FBQyxPQUFPO1FBQ3JCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ2pDLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFBO1FBQ3JCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFBO1FBQzNCLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFBO1FBQ2hDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFBO1FBQzlCLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2xELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFBO1FBQ3BCLEtBQUssSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUE7UUFDNUIsS0FBSyxJQUFJLENBQUMsb0JBQW9CLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtRQUNuRCxLQUFLLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFBO1FBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtJQUNsQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGVBQWUsQ0FBQyxPQUFPO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDeEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsSUFBSTtRQUNULGdFQUFnRTtRQUNoRSxpRUFBaUU7UUFDakUsb0VBQW9FO1FBQ3BFLHFEQUFxRDtRQUNyRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQTtRQUMzQixJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTTtRQUVwRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM3QixJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUE7UUFDbEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFBO0lBQ3ZCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxHQUFHLEVBQUU7UUFDNUMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUM5RCxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxlQUFlLElBQUksZUFBZSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUMvRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBRXpELElBQUksV0FBVyxFQUFFLFNBQVMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoRCxXQUFXLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQTtZQUMzQixPQUFNO1FBQ1IsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsa0JBQWtCO1lBQUUsT0FBTTtRQUVqRSxJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDdkIsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtnQkFDbEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7Z0JBRS9DLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxFQUFFO29CQUN4RCxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLElBQUksRUFBRTt3QkFDckMsTUFBTSxPQUFPLENBQUMsaUJBQWlCLENBQUM7NEJBQzlCLE9BQU87NEJBQ1AsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTOzRCQUM1QixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87NEJBQ3hCLE9BQU87NEJBQ1AsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFROzRCQUMxQixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7eUJBQzNCLENBQUMsQ0FBQTtvQkFDSixDQUFDLENBQUMsQ0FBQTtnQkFDSixDQUFDLENBQUMsQ0FBQTtZQUNKLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDSCxPQUFNO1FBQ1IsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLENBQUM7WUFDWixPQUFPO1lBQ1AsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1lBQzVCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztZQUN4QixPQUFPO1lBQ1AsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1lBQzFCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtZQUMxQixJQUFJLEVBQUUsT0FBTztTQUNkLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsaUJBQWlCO1FBQ3JCLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDL0IsTUFBTSxJQUFJLENBQUMsNkJBQTZCLEVBQUUsQ0FBQTtZQUUxQyxJQUFJLElBQUksQ0FBQyxjQUFjO2dCQUFFLE9BQU07UUFDakMsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUE7WUFDbkMsT0FBTTtRQUNSLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLDJCQUEyQixFQUFFLEVBQUUsQ0FBQTtRQUVuRSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU07UUFFckIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQzVDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUN6RSxPQUFPLE1BQU0sUUFBUSxDQUFDO29CQUNwQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07b0JBQ25CLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtvQkFDakMsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjO29CQUM1QixnQkFBZ0IsRUFBRSxJQUFJO2lCQUN2QixDQUFDLENBQUE7WUFDSixDQUFDLENBQUMsQ0FBQTtZQUVGLElBQUksQ0FBQyxRQUFRO2dCQUFFLE9BQU07WUFFckIsTUFBTSxPQUFPLEdBQUcsT0FBTyxRQUFRLEtBQUssVUFBVTtnQkFDNUMsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLEVBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFDLENBQUM7Z0JBQzlILENBQUMsQ0FBQyxRQUFRLENBQUE7WUFFWixJQUFJLE9BQU8sSUFBSSxDQUFDLENBQUMsT0FBTyxZQUFZLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztnQkFDdEQsTUFBTSxJQUFJLEtBQUssQ0FBQyx5REFBeUQsQ0FBQyxDQUFBO1lBQzVFLENBQUM7WUFFRCxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDOUMsQ0FBQztRQUFDLE9BQU8sV0FBVyxFQUFFLENBQUM7WUFDckIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixDQUFDLFdBQVcsRUFBRTtnQkFDN0QsS0FBSyxFQUFFLDhCQUE4QjthQUN0QyxDQUFDLENBQUE7WUFFRixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLHdDQUF3QyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDNUUsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFdBQVcsQ0FBQyxNQUFNLEVBQUUsRUFBQyxJQUFJLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBQyxHQUFHLEVBQUU7UUFDMUMsSUFBSSxPQUFPLENBQUE7UUFFWCxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN2QixPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUMzQixDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1lBRWhELElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxnQ0FBZ0MsRUFBRSxDQUFDO2dCQUMxRCxNQUFNLElBQUksVUFBVSxDQUFDLHdEQUF3RCxDQUFDLENBQUE7WUFDaEYsQ0FBQztZQUVELE9BQU8sR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDcEQsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUE7WUFDOUIsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDOUIsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDMUIsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLHFCQUFxQixHQUFHLHNCQUFzQixFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3RSxPQUFPO1NBQ1IsQ0FBQyxDQUFBO1FBRUYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO0lBQzdELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsb0JBQW9CLENBQUMsS0FBSztRQUN4QixJQUFJLEtBQUssWUFBWSxlQUFlO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFDakQsSUFBSSxLQUFLLFlBQVksY0FBYyxJQUFJLEtBQUssQ0FBQyxZQUFZO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFFdEUsTUFBTSxjQUFjLEdBQUcsc0dBQXNHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUVySSxJQUFJLGFBQWEsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFFeEQsT0FBTyxPQUFPLGNBQWMsQ0FBQyxTQUFTLEtBQUssUUFBUSxJQUFJLGNBQWMsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQTtJQUM1RixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCw4QkFBOEIsQ0FBQyxXQUFXLEVBQUUsT0FBTztRQUNqRCxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUE7UUFFdEMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUE7UUFFbEQsTUFBTSxZQUFZLEdBQUc7WUFDbkIsT0FBTztZQUNQLEtBQUs7WUFDTCxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWM7U0FDN0IsQ0FBQTtRQUNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUE7UUFFdkQsV0FBVyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxZQUFZLENBQUMsQ0FBQTtRQUNqRCxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFDLEdBQUcsWUFBWSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBQyxDQUFDLENBQUE7UUFFOUUsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBTztRQUMxQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFOUMsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFNO1FBQ3RCLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUMsU0FBUyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUE7SUFDckQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBSTtRQUMzQixnRUFBZ0U7UUFDaEUsNkRBQTZEO1FBQzdELHFEQUFxRDtRQUNyRCxtREFBbUQ7UUFDbkQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQTtRQUNuQyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUU1RCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUE7UUFDekMsTUFBTSxJQUFJLENBQUE7SUFDWixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSTtRQUN4QixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQzdDLE9BQU07UUFDUixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUM1QixPQUFNO1FBQ1IsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUMzQyxDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQy9DLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPO1FBQzVCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMseUJBQXlCLEVBQUUsRUFBRSxDQUFBO1FBRWhFLElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixNQUFNLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7WUFDNUQsT0FBTTtRQUNSLENBQUM7UUFFRCxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN6QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLG1CQUFtQixDQUFDLE9BQU87UUFDL0Isa0VBQWtFO1FBQ2xFLGlFQUFpRTtRQUNqRSxpRUFBaUU7UUFDakUsaUVBQWlFO1FBQ2pFLHdEQUF3RDtRQUN4RCxJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUMvRSxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUM3QyxPQUFNO1FBQ1IsQ0FBQztRQUVELE1BQU0sZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFbEQsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sRUFBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBQyxHQUFHLGdCQUFnQixDQUFBO1lBRXZELElBQUksQ0FBQyxPQUFPO2dCQUFFLE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFBO1lBQzVFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsMkJBQTJCLEVBQUUsRUFBRSxDQUFBO1lBRW5FLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxJQUFJLENBQUMsMEJBQTBCLENBQUMsRUFBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUE7WUFDdkUsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxFQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUE7WUFDbEYsQ0FBQztZQUVELE9BQU07UUFDUixDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sZUFBZSxHQUFHLHFFQUFxRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUE7WUFFdkcsSUFBSSxDQUFDLFNBQVMsR0FBRyxlQUFlLENBQUMsSUFBSSxJQUFJLE9BQU8sZUFBZSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUMsR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtZQUVsSCxLQUFLLE1BQU0sRUFBQyxZQUFZLEVBQUMsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztnQkFDakUsSUFBSSxPQUFPLFlBQVksQ0FBQyxpQkFBaUIsS0FBSyxVQUFVLEVBQUUsQ0FBQztvQkFDekQsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxJQUFJLEVBQUU7d0JBQ3JDLE1BQU0sWUFBWSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtvQkFDdEQsQ0FBQyxDQUFDLENBQUE7Z0JBQ0osQ0FBQztZQUNILENBQUM7WUFFRCxPQUFNO1FBQ1IsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ3hDLE9BQU07UUFDUixDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGlCQUFpQixFQUFFLENBQUM7WUFDdkMsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDekMsT0FBTTtRQUNSLENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssb0JBQW9CLEVBQUUsQ0FBQztZQUMxQyxNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUM1QyxPQUFNO1FBQ1IsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQzFDLE9BQU07UUFDUixDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLG1CQUFtQixFQUFFLENBQUM7WUFDekMsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDM0MsT0FBTTtRQUNSLENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUsscUJBQXFCLEVBQUUsQ0FBQztZQUMzQyxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUM3QyxPQUFNO1FBQ1IsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxLQUFLLEVBQUUseUJBQXlCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQTtZQUM5RSxPQUFNO1FBQ1IsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUU5QyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFDLEtBQUssRUFBRSx5QkFBeUIsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFBO1lBQzlFLE9BQU07UUFDUixDQUFDO1FBRUQsTUFBTSxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUMsR0FBRyxjQUFjLENBQUE7UUFFeEQsSUFBSSxDQUFDLE1BQU07WUFBRSxNQUFNLGNBQWMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtRQUM1RCxJQUFJLENBQUMsSUFBSTtZQUFFLE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1FBRXhELE1BQU0sT0FBTyxHQUFHLElBQUksZ0JBQWdCLENBQUM7WUFDbkMsSUFBSTtZQUNKLE9BQU87WUFDUCxRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUM1QixNQUFNO1lBQ04sSUFBSTtZQUNKLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFO1NBQ3BDLENBQUMsQ0FBQTtRQUNGLE1BQU0sYUFBYSxHQUFHLElBQUksYUFBYSxDQUFDO1lBQ3RDLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtZQUNqQyxPQUFPO1NBQ1IsQ0FBQyxDQUFBO1FBRUYsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRTtZQUNuQyxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFBO1lBQ3ZDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtZQUMvQixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFBO1lBRWhDLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ1osSUFBSTtnQkFDSixPQUFPO2dCQUNQLEVBQUU7Z0JBQ0YsVUFBVSxFQUFFLFFBQVEsQ0FBQyxhQUFhLEVBQUU7Z0JBQ3BDLGFBQWEsRUFBRSxRQUFRLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQzFDLElBQUksRUFBRSxVQUFVO2FBQ2pCLENBQUMsQ0FBQTtZQUNGLEtBQUssYUFBYSxDQUFDLG1CQUFtQixFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ3ZELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxFQUFFLEtBQUssQ0FBQyxDQUFBO1lBQzVELENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUE7UUFFRixNQUFNLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQTtJQUMzQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNoQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDaEQsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ2xDLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUNuQyxNQUFNLE9BQU8sR0FBRyxDQUFDLFNBQVMsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLHFCQUFxQixDQUFBO1lBQzdFLE1BQU0sTUFBTSxHQUFHLFNBQVMsR0FBRyxJQUFJLENBQUE7WUFDL0IsTUFBTSxRQUFRLEdBQUcsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFBO1lBQzdDLElBQUksYUFBYSxHQUFHLFVBQVUsR0FBRyxJQUFJLENBQUE7WUFDckMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFBO1lBRWQsSUFBSSxhQUFhLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQzFCLElBQUksSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLEdBQUcsQ0FBQztvQkFBRSxPQUFNO2dCQUM1QyxhQUFhLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUE7Z0JBQ3hFLE1BQU0sSUFBSSxDQUFDLENBQUE7WUFDYixDQUFDO2lCQUFNLElBQUksYUFBYSxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUNqQyxJQUFJLElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxHQUFHLENBQUM7b0JBQUUsT0FBTTtnQkFDNUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUE7Z0JBRTdFLElBQUksU0FBUyxHQUFHLHdDQUF3QyxFQUFFLENBQUM7b0JBQ3pELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNyQix1REFBdUQ7d0JBQ3ZELEVBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsK0JBQStCLEVBQUM7cUJBQzlFLENBQUMsQ0FBQTtvQkFDRixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQTtvQkFDNUIsT0FBTTtnQkFDUixDQUFDO2dCQUVELGFBQWEsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7Z0JBQ2pDLE1BQU0sSUFBSSxDQUFDLENBQUE7WUFDYixDQUFDO1lBRUQsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUVuQyxNQUFNLFdBQVcsR0FBRyxNQUFNLEdBQUcsVUFBVSxHQUFHLGFBQWEsQ0FBQTtZQUV2RCxJQUFJLElBQUksQ0FBQyxjQUFjLEdBQUcsV0FBVztnQkFBRSxPQUFNO1lBRTdDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUVyRCxxQkFBcUI7WUFDckIsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFBO1lBRTlELElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLFVBQVUsQ0FBQyxDQUFBO2dCQUN4RCxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUNwQyxDQUFDO1lBRUQsNERBQTREO1lBQzVELDZEQUE2RDtZQUM3RCwyREFBMkQ7WUFDM0QsZUFBZTtZQUNmLElBQUksTUFBTSxLQUFLLHFCQUFxQixFQUFFLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsRUFBRSxPQUFPLENBQUMsQ0FBQTtnQkFDdEQsU0FBUTtZQUNWLENBQUM7WUFFRCxJQUFJLE1BQU0sS0FBSyxzQkFBc0IsRUFBRSxDQUFDO2dCQUN0QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtnQkFDN0IsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFBO2dCQUNuQixTQUFRO1lBQ1YsQ0FBQztZQUVELElBQUksTUFBTSxLQUFLLHFCQUFxQixFQUFFLENBQUM7Z0JBQ3JDLDhEQUE4RDtnQkFDOUQsU0FBUTtZQUNWLENBQUM7WUFFRCxJQUFJLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDbEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMseUNBQXlDLE1BQU0sRUFBRSxDQUFDLENBQUE7Z0JBQ25FLFNBQVE7WUFDVixDQUFDO1lBRUQsOERBQThEO1lBQzlELDhEQUE4RDtZQUM5RCw0REFBNEQ7WUFDNUQsMERBQTBEO1lBQzFELHNEQUFzRDtZQUN0RCw4REFBOEQ7WUFDOUQsZUFBZTtZQUNmLElBQUksTUFBTSxLQUFLLDZCQUE2QixFQUFFLENBQUM7Z0JBQzdDLElBQUksSUFBSSxDQUFDLG1CQUFtQixLQUFLLElBQUksRUFBRSxDQUFDO29CQUN0QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxvRUFBb0UsQ0FBQyxDQUFBO29CQUN0RixTQUFRO2dCQUNWLENBQUM7Z0JBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDO29CQUFFLE9BQU07Z0JBRTFDLElBQUksQ0FBQyxPQUFPO29CQUFFLFNBQVE7WUFDeEIsQ0FBQztpQkFBTSxJQUFJLE1BQU0sS0FBSyxxQkFBcUIsSUFBSSxNQUFNLEtBQUssdUJBQXVCLEVBQUUsQ0FBQztnQkFDbEYsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEtBQUssSUFBSSxFQUFFLENBQUM7b0JBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdHQUFnRyxDQUFDLENBQUE7b0JBQ2xILElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFBO2dCQUM3QixDQUFDO2dCQUVELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDYixJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtvQkFDcEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQTtvQkFDL0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUE7b0JBRXRDLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUU7d0JBQUUsT0FBTTtvQkFFMUMsU0FBUTtnQkFDVixDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHNDQUFzQyxNQUFNLEVBQUUsQ0FBQyxDQUFBO2dCQUNoRSxTQUFRO1lBQ1YsQ0FBQztZQUVEOztnQ0FFb0I7WUFDcEIsSUFBSSxZQUFZLENBQUE7WUFDaEI7O2dDQUVvQjtZQUNwQixJQUFJLFdBQVcsQ0FBQTtZQUVmLElBQUksSUFBSSxDQUFDLG1CQUFtQixLQUFLLElBQUksRUFBRSxDQUFDO2dCQUN0QyxJQUFJLE1BQU0sS0FBSyw2QkFBNkIsRUFBRSxDQUFDO29CQUM3QyxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtvQkFDdEQsV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxxQkFBcUIsQ0FBQTtnQkFDL0QsQ0FBQztxQkFBTSxDQUFDO29CQUNOLFlBQVksR0FBRyxPQUFPLENBQUE7b0JBQ3RCLFdBQVcsR0FBRyxNQUFNLENBQUE7Z0JBQ3RCLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUE7WUFDN0IsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFlBQVksR0FBRyxPQUFPLENBQUE7Z0JBQ3RCLFdBQVcsR0FBRyxNQUFNLENBQUE7WUFDdEIsQ0FBQztZQUVELElBQUksV0FBVyxLQUFLLHFCQUFxQixFQUFFLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHVEQUF1RCxXQUFXLEVBQUUsQ0FBQyxDQUFBO2dCQUN0RixTQUFRO1lBQ1YsQ0FBQztZQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUE7WUFFaEUsSUFBSSxDQUFDLFNBQVM7Z0JBQUUsT0FBTTtZQUV0QixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7Z0JBRTFELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFO29CQUNsRSxNQUFNLGtCQUFrQixHQUFHLFdBQVcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQTtvQkFDbkcsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixDQUFDLFdBQVcsRUFBRTt3QkFDN0QsS0FBSyxFQUFFLDRCQUE0QjtxQkFDcEMsQ0FBQyxDQUFBO29CQUVGLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsa0NBQWtDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtvQkFDcEUsSUFBSSxDQUFDLFFBQVEsQ0FBQzt3QkFDWixLQUFLLEVBQUUsa0JBQWtCO3dCQUN6QixJQUFJLEVBQUUsT0FBTztxQkFDZCxDQUFDLENBQUE7Z0JBQ0osQ0FBQyxDQUFDLENBQUE7WUFDSixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsd0JBQXdCLENBQUMsU0FBUyxDQUFDLENBQUE7Z0JBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsbUNBQW1DLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtnQkFDckUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFDLEtBQUssRUFBRSwyQkFBMkIsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQTtZQUNwRSxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGtCQUFrQixDQUFDLFNBQVM7UUFDMUIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUM1QyxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUE7UUFDbkIsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFBO1FBRXpDLEtBQUssSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxVQUFVLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdEcsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUM1QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsV0FBVyxFQUFFLFNBQVMsR0FBRyxXQUFXLENBQUMsQ0FBQTtZQUVwRixLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFdBQVcsR0FBRyxjQUFjLENBQUMsQ0FBQTtZQUMxRSxXQUFXLElBQUksY0FBYyxDQUFBO1lBQzdCLFdBQVcsR0FBRyxDQUFDLENBQUE7WUFDZixJQUFJLFdBQVcsS0FBSyxTQUFTO2dCQUFFLE1BQUs7UUFDdEMsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFBO0lBQ2YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxxQkFBcUIsQ0FBQyxTQUFTO1FBQzdCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDNUMsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFBO1FBRW5CLE9BQU8sV0FBVyxHQUFHLFNBQVMsRUFBRSxDQUFDO1lBQy9CLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUE7WUFDeEQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxTQUFTLEdBQUcsV0FBVyxDQUFDLENBQUE7WUFFaEcsS0FBSyxDQUFDLElBQUksQ0FDUixNQUFNLEVBQ04sV0FBVyxFQUNYLElBQUksQ0FBQyxrQkFBa0IsRUFDdkIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGNBQWMsQ0FDekMsQ0FBQTtZQUNELFdBQVcsSUFBSSxjQUFjLENBQUE7WUFDN0IsSUFBSSxDQUFDLGtCQUFrQixJQUFJLGNBQWMsQ0FBQTtZQUV6QyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLENBQUE7Z0JBQzNCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUE7WUFDN0IsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3pELElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFBO1lBQ3ZCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUE7UUFDNUIsQ0FBQzthQUFNLElBQ0wsSUFBSSxDQUFDLGlCQUFpQixJQUFJLEVBQUU7WUFDNUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFDdkQsQ0FBQztZQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUE7WUFDckUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQTtRQUM1QixDQUFDO1FBRUQsSUFBSSxDQUFDLGNBQWMsSUFBSSxTQUFTLENBQUE7UUFDaEMsSUFBSSxDQUFDLHVCQUF1QixJQUFJLFNBQVMsQ0FBQTtRQUV6QyxPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUM7SUFFRDs7O09BR0c7SUFDSCx5QkFBeUI7UUFDdkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUE7UUFDdkIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQTtRQUMxQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFBO1FBQzNCLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFBO0lBQ3pCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsb0JBQW9CLENBQUMsVUFBVTtRQUM3QixJQUFJLElBQUksQ0FBQyxjQUFjO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFFcEMsSUFDRSxJQUFJLENBQUMsdUJBQXVCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQywwQkFBMEI7WUFDbEUsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFVBQVUsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEVBQ3JFLENBQUM7WUFDRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsVUFBVSxDQUFDLENBQUE7WUFDeEMsT0FBTyxJQUFJLENBQUE7UUFDYixDQUFDO1FBRUQsSUFBSSxDQUFDLHVCQUF1QixJQUFJLENBQUMsQ0FBQTtRQUNqQyxJQUFJLENBQUMsb0JBQW9CLElBQUksVUFBVSxDQUFBO1FBRXZDLE9BQU87WUFDTCxVQUFVO1lBQ1YsVUFBVSxFQUFFLElBQUksQ0FBQyw0QkFBNEI7WUFDN0MsUUFBUSxFQUFFLEtBQUs7U0FDaEIsQ0FBQTtJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsd0JBQXdCLENBQUMsU0FBUztRQUNoQyxJQUFJLFNBQVMsQ0FBQyxRQUFRO1lBQUUsT0FBTTtRQUU5QixTQUFTLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQTtRQUN6QixJQUFJLFNBQVMsQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLDRCQUE0QjtZQUFFLE9BQU07UUFFdEUsSUFBSSxDQUFDLHVCQUF1QixJQUFJLENBQUMsQ0FBQTtRQUNqQyxJQUFJLENBQUMsb0JBQW9CLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQTtJQUNuRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsdUJBQXVCO1FBQ3JCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFBO1FBQzFCLElBQUksQ0FBQyw0QkFBNEIsSUFBSSxDQUFDLENBQUE7UUFDdEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQTtRQUM3QixJQUFJLENBQUMsdUJBQXVCLEdBQUcsQ0FBQyxDQUFBO1FBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFBO0lBQ3hCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsdUJBQXVCLENBQUMsYUFBYTtRQUNuQyxJQUFJLElBQUksQ0FBQyx5QkFBeUIsSUFBSSxJQUFJLENBQUMsY0FBYztZQUFFLE9BQU07UUFFakUsSUFBSSxDQUFDLHlCQUF5QixHQUFHLElBQUksQ0FBQTtRQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNyQixnRUFBZ0U7WUFDaEU7Z0JBQ0UsUUFBUSxFQUFFLElBQUksQ0FBQyx1QkFBdUI7Z0JBQ3RDLFdBQVcsRUFBRSxJQUFJLENBQUMsMEJBQTBCO2dCQUM1QyxZQUFZLEVBQUUsSUFBSSxDQUFDLG9CQUFvQjtnQkFDdkMsZUFBZSxFQUFFLElBQUksQ0FBQyx1QkFBdUI7Z0JBQzdDLGFBQWE7YUFDZDtTQUNGLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUM1QixJQUFJLEVBQUUsZ0NBQWdDO1lBQ3RDLE1BQU0sRUFBRSxzQ0FBc0M7U0FDL0MsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO0lBQ3pDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxxQkFBcUI7UUFDbkIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUE7UUFDM0IsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUE7UUFDaEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDN0IsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFBO0lBQ3JCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsZUFBZSxDQUFDLE9BQU87UUFDckIsaUVBQWlFO1FBQ2pFLDZEQUE2RDtRQUM3RCxzQkFBc0I7UUFDdEIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUN2QyxJQUFJLENBQUMsZ0JBQWdCLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQTtRQUV2QyxPQUFPLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFBO0lBQ3RDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsc0JBQXNCO1FBQ3BCLElBQUksSUFBSSxDQUFDLG1CQUFtQixLQUFLLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQTtRQUVsRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFBO1FBQ3JELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxzQ0FBc0MsQ0FBQTtRQUNoRixNQUFNLGFBQWEsR0FBRyxhQUFhLEdBQUcsMENBQTBDLENBQUE7UUFFaEYsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLGFBQWE7WUFBRSxPQUFPLElBQUksQ0FBQTtRQUU3QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNyQixnRUFBZ0U7WUFDaEU7Z0JBQ0UsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7Z0JBQ3BDLGFBQWE7Z0JBQ2IsUUFBUSxFQUFFLHNDQUFzQztnQkFDaEQsWUFBWSxFQUFFLDBDQUEwQzthQUN6RDtTQUNGLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFBO1FBRTVCLE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUVEOzt5QkFFcUI7SUFDckIsb0JBQW9CO1FBQ2xCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUE7UUFDL0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQTtRQUM3QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFBO0lBQzNCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsZUFBZTtRQUNiLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsbUNBQW1DLEVBQUUsQ0FBQTtRQUVoRixJQUFJLENBQUMsZUFBZSxJQUFJLGVBQWUsSUFBSSxDQUFDO1lBQUUsT0FBTTtRQUVwRCxJQUFJLENBQUMsZUFBZSxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsZUFBZSxHQUFHLElBQUksQ0FBQyxDQUFBO1FBRXZGLHdEQUF3RDtRQUN4RCxJQUFJLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEtBQUssVUFBVTtZQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUE7SUFDcEYsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxjQUFjO1FBQ1osSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNO1lBQUUsT0FBTTtRQUVoRCxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzFCLDZEQUE2RDtZQUM3RCwrREFBK0Q7WUFDL0QseURBQXlEO1lBQ3pELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQTtZQUNyQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUE7WUFDbkIsT0FBTTtRQUNSLENBQUM7UUFFRCxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQTtRQUM1QixJQUFJLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ2hFLENBQUM7SUFFRDs7O09BR0c7SUFDSCxjQUFjO1FBQ1osSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDekIsYUFBYSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQTtZQUNuQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQTtRQUM3QixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsaUJBQWlCLENBQUMsTUFBTSxFQUFFLE9BQU87UUFDL0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUU5QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcscUJBQXFCLEdBQUcsTUFBTSxDQUFBO1FBQzFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFBO1FBRTFCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUMsY0FBYyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7SUFDN0YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxRQUFRLENBQUMsSUFBSTtRQUNYLDBEQUEwRDtRQUMxRCw4REFBOEQ7UUFDOUQsMERBQTBEO1FBQzFELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxjQUFjLEtBQUssRUFBRSxDQUFBO1lBRTFCLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLElBQUksMEJBQTBCLEVBQUUsQ0FBQztnQkFDN0QsMERBQTBEO2dCQUMxRCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFBO1lBQzdCLENBQUM7WUFFRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUM5QixPQUFNO1FBQ1IsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU07WUFBRSxPQUFNO1FBRWhDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDakMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDMUMsSUFBSSxNQUFNLENBQUE7UUFFVixJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDekIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDeEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUE7UUFDNUIsQ0FBQzthQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxLQUFLLEVBQUUsQ0FBQztZQUNsQyxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUN4QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFBO1lBQ2YsTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ3pDLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDekIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQTtZQUNmLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ3BELENBQUM7UUFFRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcscUJBQXFCLEdBQUcscUJBQXFCLENBQUE7UUFFekQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBQyxjQUFjLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtJQUM3RixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxtQkFBbUI7UUFDakIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUE7UUFFdkMsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUE7UUFFeEIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3JCLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLEVBQUMsV0FBVyxHQUFHLElBQUksRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsRUFBQyxHQUFHLEVBQUU7UUFDbkgsTUFBTSxzQ0FBc0MsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFL0YsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUM7WUFDakQsT0FBTztZQUNQLFdBQVc7WUFDWCxtQkFBbUIsRUFBRSxtQkFBbUIsSUFBSSxPQUFPO1lBQ25ELGtCQUFrQixFQUFFLE1BQU07U0FDM0IsQ0FBQyxDQUFBO1FBRUYsSUFBSSxXQUFXLEtBQUssS0FBSztZQUFFLE9BQU8sS0FBSyxDQUFBO1FBQ3ZDLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUE7UUFDcEQsQ0FBQztRQUVELElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFN0IsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUM1QyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUE7WUFDbkQsQ0FBQztZQUVELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFBO1lBRTNELElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQ25ELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQTtZQUMxRCxDQUFDO1lBRUQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDN0QsQ0FBQztRQUVELElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDO2dCQUNILE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLEVBQUMsT0FBTyxFQUFFLFdBQVcsRUFBQyxDQUFDLENBQUE7WUFDekQsQ0FBQztvQkFBUyxDQUFDO2dCQUNULE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQTtZQUNyRCxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFDLENBQUMsQ0FBQTtRQUM5QyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFlBQVksQ0FBQyxFQUFDLFdBQVcsR0FBRyxJQUFJLEVBQUMsR0FBRyxFQUFFO1FBQ3BDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFBO1FBQzNCLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFBO1FBQ2hDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFBO1FBRTlCLHlEQUF5RDtRQUN6RCw0REFBNEQ7UUFDNUQsaUVBQWlFO1FBQ2pFLDhEQUE4RDtRQUM5RCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQTtRQUUzRixJQUFJLFdBQVcsSUFBSSxpQkFBaUIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN0RCwrREFBK0Q7WUFDL0QsMENBQTBDO1lBQzFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQTtZQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQTtZQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQTtZQUNsQiwrREFBK0Q7WUFDL0Qsb0RBQW9EO1lBQ3BELGdFQUFnRTtZQUNoRSw4REFBOEQ7WUFDOUQsZUFBZTtZQUNmLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQTtZQUMzRCxLQUFLLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO1lBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDekIsT0FBTTtRQUNSLENBQUM7UUFFRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUE7UUFDckIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDbEQsS0FBSyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQTtRQUNuQyxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1FBQzVCLEtBQUssSUFBSSxDQUFDLG9CQUFvQixDQUFDLG1CQUFtQixDQUFDLENBQUE7UUFDbkQsS0FBSyxJQUFJLENBQUMsNkJBQTZCLEVBQUUsQ0FBQTtRQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUMzQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxvQkFBb0I7UUFDbEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFBO1FBQ3JCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFBO1FBQzNCLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFBO1FBQ2hDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFBO1FBQzlCLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2xELEtBQUssSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUE7UUFDbkMsS0FBSyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTtRQUM1QixLQUFLLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsQ0FBQTtRQUMvQyxLQUFLLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFBO1FBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQzNCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsc0JBQXNCO1FBQzFCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsbUNBQW1DLEVBQUUsRUFBRSxDQUFBO1FBRTNFLElBQUksT0FBTyxRQUFRLEtBQUssVUFBVTtZQUFFLE9BQU8sU0FBUyxDQUFBO1FBRXBELElBQUksQ0FBQztZQUNILE9BQU8sTUFBTSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDN0IsQ0FBQztRQUFDLE9BQU8sV0FBVyxFQUFFLENBQUM7WUFDckIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixDQUFDLFdBQVcsRUFBRTtnQkFDN0QsS0FBSyxFQUFFLGtDQUFrQzthQUMxQyxDQUFDLENBQUE7WUFFRixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLHFEQUFxRCxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7WUFDdkYsT0FBTyxTQUFTLENBQUE7UUFDbEIsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsaUJBQWlCO1FBQ3JCLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLGNBQWMsQ0FBQyxDQUFBO0lBQ25ELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGFBQWE7UUFDakIsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDL0MsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsc0JBQXNCLENBQUMsWUFBWTtRQUN2QyxLQUFLLE1BQU0sVUFBVSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUNwRCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxVQUFVLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxDQUFBO1lBQ3BDLENBQUM7WUFBQyxPQUFPLFdBQVcsRUFBRSxDQUFDO2dCQUNyQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsV0FBVyxFQUFFO29CQUM3RCxZQUFZO29CQUNaLFlBQVksRUFBRSxVQUFVLENBQUMsWUFBWTtvQkFDckMsS0FBSyxFQUFFLGdDQUFnQztpQkFDeEMsQ0FBQyxDQUFBO2dCQUVGLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxZQUFZLGVBQWUsVUFBVSxDQUFDLFlBQVksRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7WUFDM0YsQ0FBQztRQUNILENBQUM7UUFFRCxLQUFLLE1BQU0sRUFBQyxZQUFZLEVBQUMsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUNqRSxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxZQUFZLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxDQUFBO1lBQ3RDLENBQUM7WUFBQyxPQUFPLFdBQVcsRUFBRSxDQUFDO2dCQUNyQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsV0FBVyxFQUFFO29CQUM3RCxZQUFZO29CQUNaLEtBQUssRUFBRSw2QkFBNkI7b0JBQ3BDLGNBQWMsRUFBRSxZQUFZLENBQUMsY0FBYztpQkFDNUMsQ0FBQyxDQUFBO2dCQUVGLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxZQUFZLDJCQUEyQixZQUFZLENBQUMsY0FBYyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtZQUMzRyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLG9CQUFvQixDQUFDLE9BQU87UUFDaEMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQTtRQUV6QyxJQUFJLE9BQU8sZUFBZSxLQUFLLFFBQVEsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzVELElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxJQUFJLEVBQUUsY0FBYyxFQUFDLENBQUMsQ0FBQTtZQUNyQyxPQUFNO1FBQ1IsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsMkJBQTJCLENBQUMsZUFBZSxDQUFDLENBQUE7UUFFOUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFDLElBQUksRUFBRSxjQUFjLEVBQUMsQ0FBQyxDQUFBO1lBQ3JDLE9BQU07UUFDUixDQUFDO1FBRUQsa0VBQWtFO1FBQ2xFLCtEQUErRDtRQUMvRCw0REFBNEQ7UUFDNUQsZ0RBQWdEO1FBQ2hELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsbUNBQW1DLEVBQUUsRUFBRSxDQUFBO1FBRTNFLElBQUksT0FBTyxRQUFRLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDbkMsTUFBTSxjQUFjLEdBQUcsTUFBTSxNQUFNLENBQUMsc0JBQXNCLENBQUE7WUFDMUQsSUFBSSxhQUFhLENBQUE7WUFFakIsSUFBSSxDQUFDO2dCQUNILGFBQWEsR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUN0QyxDQUFDO1lBQUMsT0FBTyxXQUFXLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixDQUFDLFdBQVcsRUFBRTtvQkFDN0QsS0FBSyxFQUFFLG1DQUFtQztpQkFDM0MsQ0FBQyxDQUFBO2dCQUVGLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsc0RBQXNELEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtnQkFDeEYsYUFBYSxHQUFHLFNBQVMsQ0FBQTtZQUMzQixDQUFDO1lBRUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLEVBQUUsYUFBYSxDQUFDLEVBQUUsQ0FBQztnQkFDcEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQyxlQUFlLENBQUMsQ0FBQTtnQkFDaEUsTUFBTSxDQUFDLG9CQUFvQixFQUFFLENBQUE7Z0JBQzdCLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxJQUFJLEVBQUUsY0FBYyxFQUFDLENBQUMsQ0FBQTtnQkFDckMsT0FBTTtZQUNSLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQyxlQUFlLENBQUMsQ0FBQTtRQUVoRSxnRUFBZ0U7UUFDaEUsaURBQWlEO1FBQ2pELEtBQUssTUFBTSxDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDN0QsVUFBVSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUE7WUFDekIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFBO1FBQ2pELENBQUM7UUFFRCxLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDMUQsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFBO1lBQ2pDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQzlDLENBQUM7UUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUMsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFDLENBQUE7UUFDdEMsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFBO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsZUFBZSxDQUFBO1FBRWhDLDZEQUE2RDtRQUM3RCwrREFBK0Q7UUFDL0QsZ0NBQWdDO1FBQ2hDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFBO1FBRTFDLE1BQU0sQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFBO1FBQzFCLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDM0IsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ3BDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFBO1FBQ3RCLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUVoQixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUMsSUFBSSxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUMsQ0FBQyxDQUFBO1FBQ3BFLEtBQUssTUFBTSxJQUFJLElBQUksTUFBTTtZQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDOUMsTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUE7SUFDNUIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNO1FBQy9CLE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFFbkQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUV6QixLQUFLLE1BQU0sVUFBVSxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ3JDLFVBQVUsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFBO1lBRXpCLElBQUksQ0FBQztnQkFDSCxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLElBQUksRUFBRTtvQkFDckMsTUFBTSxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO2dCQUNsQyxDQUFDLENBQUMsQ0FBQTtZQUNKLENBQUM7WUFBQyxPQUFPLFdBQVcsRUFBRSxDQUFDO2dCQUNyQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsV0FBVyxFQUFFO29CQUM3RCxZQUFZLEVBQUUsVUFBVSxDQUFDLFlBQVk7b0JBQ3JDLE1BQU07b0JBQ04sS0FBSyxFQUFFLCtCQUErQjtpQkFDdkMsQ0FBQyxDQUFBO2dCQUVGLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsa0NBQWtDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1lBQy9GLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMscUJBQXFCLENBQUMsT0FBTztRQUNqQyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFBO1FBQ3pDLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUE7UUFDN0MsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUE7UUFFbkMsSUFBSSxPQUFPLFlBQVksS0FBSyxRQUFRLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0RCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsdUNBQXVDLEVBQUMsQ0FBQyxDQUFBO1lBQzlFLE9BQU07UUFDUixDQUFDO1FBRUQsSUFBSSxPQUFPLGNBQWMsS0FBSyxRQUFRLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMxRCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsNEJBQTRCLEVBQUMsQ0FBQyxDQUFBO1lBQzlGLE9BQU07UUFDUixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSw4QkFBOEIsRUFBQyxDQUFDLENBQUE7WUFDaEcsT0FBTTtRQUNSLENBQUM7UUFFRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLDJCQUEyQixFQUFFLENBQUMsY0FBYyxDQUFDLENBQUE7UUFFeEYsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSw0QkFBNEIsY0FBYyxFQUFFLEVBQUMsQ0FBQyxDQUFBO1lBQzlHLE9BQU07UUFDUixDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxlQUFlLENBQUMsRUFBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO1FBRTdFLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUNyQyxNQUFNLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQTtZQUM5QixDQUFDLENBQUMsQ0FBQTtZQUNGLGlFQUFpRTtZQUNqRSw2REFBNkQ7WUFDN0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFBO1lBQy9DLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxFQUFDLENBQUMsQ0FBQTtRQUMxRCxDQUFDO1FBQUMsT0FBTyxXQUFXLEVBQUUsQ0FBQztZQUNyQixNQUFNLGtCQUFrQixHQUFHLFdBQVcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtZQUNsRixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsV0FBVyxFQUFFO2dCQUM3RCxZQUFZO2dCQUNaLGNBQWM7Z0JBQ2QsS0FBSyxFQUFFLDJCQUEyQjthQUNuQyxDQUFDLENBQUE7WUFFRixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLDZCQUE2QixjQUFjLElBQUksWUFBWSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtZQUMvRixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsa0JBQWtCLElBQUksMkJBQTJCLEVBQUMsQ0FBQyxDQUFBO1FBQ3JILENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPO1FBQ3BDLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUE7UUFDekMsTUFBTSxVQUFVLEdBQUcsT0FBTyxZQUFZLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO1FBRWhHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUMsQ0FBQyxDQUFBO1lBQ3pGLE9BQU07UUFDUixDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQ3JDLE1BQU0sVUFBVSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDMUMsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDO1FBQUMsT0FBTyxXQUFXLEVBQUUsQ0FBQztZQUNyQixNQUFNLGtCQUFrQixHQUFHLFdBQVcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtZQUNsRixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsV0FBVyxFQUFFO2dCQUM3RCxZQUFZO2dCQUNaLEtBQUssRUFBRSw4QkFBOEI7YUFDdEMsQ0FBQyxDQUFBO1lBRUYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQywyQ0FBMkMsWUFBWSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtZQUMzRixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsa0JBQWtCLElBQUksMEJBQTBCLEVBQUMsQ0FBQyxDQUFBO1FBQ3BILENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsc0JBQXNCLENBQUMsT0FBTztRQUNsQyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFBO1FBQ3pDLE1BQU0sVUFBVSxHQUFHLE9BQU8sWUFBWSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtRQUVoRyxJQUFJLENBQUMsVUFBVTtZQUFFLE9BQU07UUFFdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDdEMsNERBQTREO1FBQzVELG9FQUFvRTtRQUNwRSxVQUFVLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQTtRQUV6QixJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDckMsTUFBTSxVQUFVLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFBO1lBQzFDLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUFDLE9BQU8sV0FBVyxFQUFFLENBQUM7WUFDckIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixDQUFDLFdBQVcsRUFBRTtnQkFDN0QsWUFBWTtnQkFDWixLQUFLLEVBQUUsNEJBQTRCO2FBQ3BDLENBQUMsQ0FBQTtZQUVGLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsa0NBQWtDLFlBQVksRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDcEYsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUMsQ0FBQyxDQUFBO0lBQ2xGLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsdUJBQXVCLENBQUMsT0FBTztRQUNuQyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFBO1FBQzdDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUE7UUFDdkMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUE7UUFDbkMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQTtRQUV2QyxJQUFJLE9BQU8sY0FBYyxLQUFLLFFBQVEsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzFELElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSwyQ0FBMkMsRUFBQyxDQUFDLENBQUE7WUFDbEYsT0FBTTtRQUNSLENBQUM7UUFFRCxJQUFJLE9BQU8sV0FBVyxLQUFLLFFBQVEsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3BELElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUseUJBQXlCLEVBQUMsQ0FBQyxDQUFBO1lBQzFGLE9BQU07UUFDUixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7WUFDbkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBQyxDQUFDLENBQUE7WUFDakcsT0FBTTtRQUNSLENBQUM7UUFFRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLHdCQUF3QixFQUFFLENBQUMsV0FBVyxDQUFDLENBQUE7UUFFL0UsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUseUJBQXlCLFdBQVcsRUFBRSxFQUFDLENBQUMsQ0FBQTtZQUN2RyxPQUFNO1FBQ1IsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLElBQUksWUFBWSxDQUFDLEVBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtRQUU5RSxJQUFJLENBQUM7WUFDSCxxRUFBcUU7WUFDckUsd0VBQXdFO1lBQ3hFLHdFQUF3RTtZQUN4RSwwRUFBMEU7WUFDMUUsa0VBQWtFO1lBQ2xFLGdCQUFnQjtZQUNoQixJQUFJLE1BQU0sQ0FBQTtZQUNWLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUNyQyxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFBO1lBQ3BFLENBQUMsQ0FBQyxDQUFBO1lBRUYsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ3hELElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQTtnQkFFbkIsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxJQUFJLEVBQUU7b0JBQ3JDLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQTtnQkFDdEQsQ0FBQyxDQUFDLENBQUE7Z0JBRUYsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNiLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUMsQ0FBQyxDQUFBO29CQUM5RixPQUFNO2dCQUNSLENBQUM7Z0JBRUQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsRUFBQyxXQUFXLEVBQUUsWUFBWSxFQUFDLENBQUMsQ0FBQTtnQkFDM0UsSUFBSSxDQUFDLGFBQWEsQ0FBQyxxQ0FBcUMsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUE7Z0JBRW5GLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsTUFBTSxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQTtnQkFFeEUsNERBQTREO2dCQUM1RCwwREFBMEQ7Z0JBQzFELHNDQUFzQztnQkFDdEMsSUFBSSxPQUFPLFdBQVcsS0FBSyxRQUFRLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDOUQsTUFBTSxJQUFJLENBQUMsbUNBQW1DLENBQUMsRUFBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBQyxDQUFDLENBQUE7Z0JBQzFGLENBQUM7Z0JBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFDLElBQUksRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQUMsQ0FBQyxDQUFBO1lBQzdELENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUFDLE9BQU8sV0FBVyxFQUFFLENBQUM7WUFDckIsTUFBTSxrQkFBa0IsR0FBRyxXQUFXLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7WUFFbEYsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQTtZQUNqRCxJQUFJLENBQUMsYUFBYSxDQUFDLHVDQUF1QyxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQTtZQUNyRixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsV0FBVyxFQUFFO2dCQUM3RCxXQUFXO2dCQUNYLEtBQUssRUFBRSw2QkFBNkI7Z0JBQ3BDLGNBQWM7YUFDZixDQUFDLENBQUE7WUFFRixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLCtCQUErQixXQUFXLElBQUksY0FBYyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtZQUNoRyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixJQUFJLHFCQUFxQixFQUFDLENBQUMsQ0FBQTtRQUM5RyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxFQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFDO1FBQ2hGLE1BQU0sS0FBSyxHQUFHLHNDQUFzQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUV4RSxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsc0JBQXNCLEVBQUUsQ0FBQTtRQUVqRCxNQUFNLFVBQVUsR0FBRyxNQUFNLEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFBO1FBRXBGLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNaLElBQUksRUFBRSxvQkFBb0I7Z0JBQzFCLGNBQWMsRUFBRSxZQUFZLENBQUMsY0FBYztnQkFDM0MsV0FBVzthQUNaLENBQUMsQ0FBQTtZQUNGLE9BQU07UUFDUixDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxLQUFLLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBRXZELElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxJQUFJLFVBQVUsQ0FBQyxRQUFRO1lBQUUsT0FBTTtRQUV0RCxNQUFNLE1BQU0sR0FBRyxNQUFNLEtBQUssQ0FBQyxjQUFjLENBQUM7WUFDeEMsT0FBTyxFQUFFLFdBQVc7WUFDcEIsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRO1lBQzdCLFlBQVksRUFBRSxPQUFPO1NBQ3RCLENBQUMsQ0FBQTtRQUVGLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7WUFDM0IsSUFBSSxZQUFZLENBQUMsUUFBUSxFQUFFO2dCQUFFLE1BQUs7WUFFbEMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO1FBQy9HLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMseUJBQXlCLENBQUMsT0FBTztRQUNyQyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFBO1FBRTdDLElBQUksT0FBTyxjQUFjLEtBQUssUUFBUTtZQUFFLE9BQU07UUFFOUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUU1RCxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU07UUFFbEIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUNqRCxJQUFJLENBQUMsYUFBYSxDQUFDLHVDQUF1QyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQ2pHLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQTtRQUVqQyxJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFBO1FBQ2xGLENBQUM7UUFBQyxPQUFPLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxXQUFXLEVBQUU7Z0JBQzdELFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztnQkFDOUIsS0FBSyxFQUFFLCtCQUErQjtnQkFDdEMsY0FBYzthQUNmLENBQUMsQ0FBQTtZQUVGLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsaUNBQWlDLEtBQUssQ0FBQyxXQUFXLElBQUksY0FBYyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtRQUMxRyxDQUFDO1FBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFDLElBQUksRUFBRSxzQkFBc0IsRUFBRSxjQUFjLEVBQUMsQ0FBQyxDQUFBO0lBQy9ELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsNkJBQTZCO1FBQ2pDLE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtRQUV4RCxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxFQUFFLENBQUE7UUFFbEMsS0FBSyxNQUFNLEVBQUMsV0FBVyxFQUFFLFlBQVksRUFBQyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ2xELElBQUksQ0FBQyxhQUFhLENBQUMsdUNBQXVDLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFBO1lBQ3JGLFlBQVksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFBO1lBRTNCLElBQUksQ0FBQztnQkFDSCxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLE1BQU0sWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUE7WUFDNUUsQ0FBQztZQUFDLE9BQU8sV0FBVyxFQUFFLENBQUM7Z0JBQ3JCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxXQUFXLEVBQUU7b0JBQzdELFdBQVc7b0JBQ1gsS0FBSyxFQUFFLDRCQUE0QjtvQkFDbkMsY0FBYyxFQUFFLFlBQVksQ0FBQyxjQUFjO2lCQUM1QyxDQUFDLENBQUE7Z0JBRUYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxrQ0FBa0MsV0FBVyxJQUFJLFlBQVksQ0FBQyxjQUFjLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1lBQ2xILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxnQkFBZ0I7UUFDcEIsS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEMsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDNUMsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDckIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxDQUFBO0lBQ2xDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLHNCQUFzQixDQUFDLE9BQU87UUFDbEMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7WUFFL0MsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ3hELE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssSUFBSSxFQUFFO29CQUNyQyxNQUFNLE9BQU8sRUFBRSxZQUFZLEVBQUUsRUFBRSxDQUFBO2dCQUNqQyxDQUFDLENBQUMsQ0FBQTtZQUNKLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUFDLE9BQU8sV0FBVyxFQUFFLENBQUM7WUFDckIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixDQUFDLFdBQVcsRUFBRTtnQkFDN0QsS0FBSyxFQUFFLDRCQUE0QjthQUNwQyxDQUFDLENBQUE7WUFFRixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLHNDQUFzQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDMUUsQ0FBQztRQUVELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFNUQsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixLQUFLLE1BQU0sbUJBQW1CLElBQUksYUFBYSxFQUFFLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7Z0JBRW5FLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDbkUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO2dCQUN2RCxDQUFDO1lBQ0gsQ0FBQztZQUVELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDM0MsQ0FBQztRQUVELElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3JDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsTUFBTTtRQUNwQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU07UUFFcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDMUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ3hDLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3hELE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUNyQyxNQUFNLE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFBO1lBQy9CLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRO1FBQzdCLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFDLElBQUksRUFBRSxtQkFBbUIsRUFBQyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ2pGLE1BQU0sUUFBUSxFQUFFLENBQUE7UUFDbEIsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxFQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFDO1FBQzdELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsMkJBQTJCLEVBQUUsRUFBRSxDQUFBO1FBRW5FLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTTtRQUVyQixJQUFJLENBQUM7WUFDSCx5RUFBeUU7WUFDekUsa0RBQWtEO1lBQ2xELElBQUksTUFBTSxDQUFBO1lBQ1YsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQ3JDLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBQyxPQUFPLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtZQUN2RCxDQUFDLENBQUMsQ0FBQTtZQUNGLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUN6RSxPQUFPLE1BQU0sUUFBUSxDQUFDO29CQUNwQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07b0JBQ25CLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtvQkFDakMsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjO29CQUM1QixZQUFZLEVBQUUsRUFBQyxPQUFPLEVBQUUsTUFBTSxFQUFDO29CQUMvQixnQkFBZ0IsRUFBRSxJQUFJO2lCQUN2QixDQUFDLENBQUE7WUFDSixDQUFDLENBQUMsQ0FBQTtZQUVGLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDZCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQTtnQkFDdkUsT0FBTTtZQUNSLENBQUM7WUFFRCxNQUFNLGVBQWUsR0FBRyxPQUFPLFFBQVEsS0FBSyxVQUFVO2dCQUNwRCxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUM7b0JBQ2IsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO29CQUNuQixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7b0JBQ2pDLFdBQVc7b0JBQ1gsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjO29CQUM1QixtQkFBbUIsRUFBRSxPQUFPO29CQUM1QixrQkFBa0IsRUFBRSxNQUFNO29CQUMxQixnQkFBZ0IsRUFBRSxJQUFJO2lCQUN2QixDQUFDO2dCQUNGLENBQUMsQ0FBQyxRQUFRLENBQUE7WUFFWixJQUFJLGVBQWUsSUFBSSxDQUFDLENBQUMsZUFBZSxZQUFZLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztnQkFDdEUsTUFBTSxJQUFJLEtBQUssQ0FBQyx5REFBeUQsQ0FBQyxDQUFBO1lBQzVFLENBQUM7WUFFRCxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDdEQsQ0FBQztRQUFDLE9BQU8sV0FBVyxFQUFFLENBQUM7WUFDckIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixDQUFDLFdBQVcsRUFBRTtnQkFDN0QsT0FBTztnQkFDUCxLQUFLLEVBQUUsZ0NBQWdDO2FBQ3hDLENBQUMsQ0FBQTtZQUVGLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsdUNBQXVDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtZQUN4RSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQTtRQUN6RSxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsS0FBSyxDQUFDLG1CQUFtQixDQUFDLEVBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBQztRQUN2RixJQUFJLENBQUMsV0FBVztZQUFFLE9BQU8sSUFBSSxDQUFBO1FBRTdCLE1BQU0sS0FBSyxHQUFHLHNDQUFzQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUN4RSxNQUFNLFVBQVUsR0FBRyxNQUFNLEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBQyxDQUFDLENBQUE7UUFFdkUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFDLENBQUMsQ0FBQTtZQUMxRyxPQUFPLEtBQUssQ0FBQTtRQUNkLENBQUM7UUFFRCxPQUFPO1lBQ0wsUUFBUSxFQUFFLEtBQUs7WUFDZixlQUFlLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsUUFBUTtZQUM3RSxrQkFBa0IsRUFBRSxVQUFVLENBQUMsUUFBUTtZQUN2QyxTQUFTLEVBQUUsSUFBSTtTQUNoQixDQUFBO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxFQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUM7UUFDL0MsTUFBTSxLQUFLLEdBQUcsc0NBQXNDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBQ3hFLE1BQU0sTUFBTSxHQUFHLE1BQU0sS0FBSyxDQUFDLGNBQWMsQ0FBQztZQUN4QyxPQUFPO1lBQ1AsUUFBUSxFQUFFLFdBQVcsQ0FBQyxrQkFBa0I7WUFDeEMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxlQUFlO1NBQzFDLENBQUMsQ0FBQTtRQUVGLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFO2dCQUMzQyxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7Z0JBQzFCLE9BQU8sRUFBRSxLQUFLLENBQUMsRUFBRTtnQkFDakIsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO2FBQ3pCLENBQUMsQ0FBQTtRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLFdBQVc7UUFDM0MsTUFBTSxLQUFLLEdBQUcsc0NBQXNDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBRXhFLFdBQVcsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFBO1FBQzdCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFeEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRO1lBQUUsT0FBTTtRQUVqQyxNQUFNLFVBQVUsR0FBRyxNQUFNLEtBQUssQ0FBQyxjQUFjLENBQUM7WUFDNUMsT0FBTztZQUNQLFFBQVEsRUFBRSxXQUFXLENBQUMsZUFBZTtTQUN0QyxDQUFDLENBQUE7UUFFRixLQUFLLE1BQU0sS0FBSyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQy9CLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRTtnQkFDM0MsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO2dCQUMxQixPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUU7Z0JBQ2pCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTthQUN6QixDQUFDLENBQUE7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsY0FBYyxDQUFDLEVBQUMsT0FBTyxFQUFFLE1BQU0sRUFBQztRQUNwQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUE7UUFDckQsTUFBTSxZQUFZLEdBQUc7WUFDbkIsR0FBRyxDQUFDLGFBQWEsSUFBSSxPQUFPLGFBQWEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzVFLEdBQUcsQ0FBQyxNQUFNLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUN4RCxDQUFBO1FBRUQsT0FBTyxpREFBaUQsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDO1lBQ3pGLE1BQU0sRUFBRSxZQUFZO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYztZQUM1QixRQUFRLEVBQUUsU0FBUztZQUNuQixZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztTQUN0RCxDQUFDLENBQUMsQ0FBQTtJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGNBQWMsQ0FBQyxPQUFPLEVBQUUsSUFBSTtRQUMxQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBQzNCLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLHNCQUFzQjtRQUMxQixJQUFJLENBQUM7WUFDSCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFBO1lBQ25DLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO1lBRTlDLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1gsTUFBTSxNQUFNLENBQUMsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtZQUMvQixDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sV0FBVyxFQUFFLENBQUM7WUFDckIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixDQUFDLFdBQVcsRUFBRTtnQkFDN0QsS0FBSyxFQUFFLGdDQUFnQzthQUN4QyxDQUFDLENBQUE7WUFFRixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLCtCQUErQixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDbkUsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLHlCQUF5QixDQUFDLE9BQU87UUFDckMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQTtZQUNuQyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtZQUVwRCxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNkLE1BQU0sU0FBUyxDQUFDLEVBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO1lBQzNDLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxXQUFXLEVBQUUsQ0FBQztZQUNyQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFBO1lBQ25DLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO1lBQ2hELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxXQUFXLEVBQUU7Z0JBQzdELEtBQUssRUFBRSwyQkFBMkI7YUFDbkMsQ0FBQyxDQUFBO1lBRUYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxrQ0FBa0MsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1lBQ3BFLElBQUksQ0FBQyxPQUFPO2dCQUFFLE9BQU07WUFFcEIsSUFBSSxDQUFDO2dCQUNILE1BQU0sT0FBTyxDQUFDLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO1lBQ3ZDLENBQUM7WUFBQyxPQUFPLGtCQUFrQixFQUFFLENBQUM7Z0JBQzVCLE1BQU0sa0JBQWtCLEdBQUcsa0JBQWtCLFlBQVksS0FBSztvQkFDNUQsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLE9BQU87b0JBQzVCLENBQUMsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtnQkFDOUIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixDQUFDLGtCQUFrQixFQUFFO29CQUMzRSxLQUFLLEVBQUUsaUNBQWlDO2lCQUN6QyxDQUFDLENBQUE7Z0JBRUYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyx3Q0FBd0MsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFBO2dCQUNqRixJQUFJLENBQUMsUUFBUSxDQUFDO29CQUNaLEtBQUssRUFBRSxrQkFBa0I7b0JBQ3pCLElBQUksRUFBRSxPQUFPO2lCQUNkLENBQUMsQ0FBQTtZQUNKLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyx1QkFBdUI7UUFDM0IsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQTtZQUNuQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtZQUVoRCxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNaLE1BQU0sT0FBTyxDQUFDLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7WUFDaEMsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxXQUFXLEVBQUU7Z0JBQzdELEtBQUssRUFBRSxpQ0FBaUM7YUFDekMsQ0FBQyxDQUFBO1lBRUYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxnQ0FBZ0MsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQ3BFLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxhQUFhLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQTtJQUMxRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGlCQUFpQixDQUFDLE9BQU87UUFDdkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUE7UUFDN0IsS0FBSyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQTtJQUNwQyxDQUFDO0lBRUQsS0FBSyxDQUFDLDZCQUE2QjtRQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQjtZQUFFLE9BQU07UUFFdkMsb0ZBQW9GO1FBQ3BGLElBQUksT0FBTyxDQUFBO1FBRVgsSUFBSSxDQUFDO1lBQ0gsT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFBO1FBQzVDLENBQUM7UUFBQyxPQUFPLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxXQUFXLEVBQUU7Z0JBQzdELEtBQUssRUFBRSxvQ0FBb0M7YUFDNUMsQ0FBQyxDQUFBO1lBRUYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQywyQ0FBMkMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1lBQzdFLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxTQUFTLENBQUE7WUFDdEMsTUFBTSxJQUFJLENBQUMsK0JBQStCLENBQUMsRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQTtZQUMvRCxPQUFNO1FBQ1IsQ0FBQztRQUVELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxTQUFTLENBQUE7UUFDdEMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLENBQUMsK0JBQStCLENBQUMsRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQTtZQUMvRCxPQUFNO1FBQ1IsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUE7WUFDbEMsT0FBTTtRQUNSLENBQUM7UUFFRCwyREFBMkQ7UUFDM0QsaUVBQWlFO1FBQ2pFLDZEQUE2RDtRQUM3RCx3REFBd0Q7UUFDeEQsNkRBQTZEO1FBQzdELFNBQVM7UUFDVCxJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQTtRQUM3QixNQUFNLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFBO1FBQ25DLE1BQU0sSUFBSSxDQUFDLCtCQUErQixDQUFDO1lBQ3pDLFVBQVUsRUFBRSxPQUFPLE9BQU8sQ0FBQyxTQUFTLEtBQUssVUFBVTtTQUNwRCxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxFQUFDLFVBQVUsRUFBQztRQUNoRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFBO1FBQ25DLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDckMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQTtZQUNsQyxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUE7Z0JBQ3RCLE9BQU07WUFDUixDQUFDO1lBRUQsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsRUFBQyxVQUFVLEVBQUMsQ0FBQyxDQUFBO1FBQy9DLENBQUMsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFBO1FBQzFDLE1BQU0sS0FBSyxDQUFBO0lBQ2IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsb0JBQW9CLENBQUMsRUFBQyxVQUFVLEVBQUM7UUFDckMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTTtRQUUxQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFBO1FBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFBO1FBRXRCLEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxFQUFFLENBQUM7WUFDMUIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7Z0JBQzdDLFNBQVE7WUFDVixDQUFDO1lBRUQsSUFBSSxDQUFDO2dCQUNILElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDdEMsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUNwRCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUMzQyxDQUFDO1lBQ0gsQ0FBQztZQUFDLE9BQU8sV0FBVyxFQUFFLENBQUM7Z0JBQ3JCLE1BQU0sa0JBQWtCLEdBQUcsV0FBVyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFBO2dCQUNuRyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsV0FBVyxFQUFFO29CQUM3RCxLQUFLLEVBQUUsNEJBQTRCO2lCQUNwQyxDQUFDLENBQUE7Z0JBRUYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxrQ0FBa0MsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO2dCQUNwRSxJQUFJLENBQUMsUUFBUSxDQUFDO29CQUNaLEtBQUssRUFBRSxrQkFBa0I7b0JBQ3pCLElBQUksRUFBRSxPQUFPO2lCQUNkLENBQUMsQ0FBQTtZQUNKLENBQUM7b0JBQVMsQ0FBQztnQkFDVCxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQy9DLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tIFwibm9kZTpjcnlwdG9cIlxuaW1wb3J0IHsgZW5zdXJlRXJyb3IgfSBmcm9tIFwidHlwYW5pY1wiXG5cbmltcG9ydCB7IFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCIuLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIlxuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vLi4vbG9nZ2VyLmpzXCJcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcIi4uLy4uL3V0aWxzL2V2ZW50LWVtaXR0ZXIuanNcIlxuaW1wb3J0IGlzUGxhaW5PYmplY3QgZnJvbSBcIi4uLy4uL3V0aWxzL3BsYWluLW9iamVjdC5qc1wiXG5pbXBvcnQgVmVsb2Npb3VzRXJyb3IgZnJvbSBcIi4uLy4uL3ZlbG9jaW91cy1lcnJvci5qc1wiXG5pbXBvcnQgV2Vic29ja2V0Q2hhbm5lbCBmcm9tIFwiLi4vd2Vic29ja2V0LWNoYW5uZWwuanNcIlxuaW1wb3J0IHsgd2Vic29ja2V0RXZlbnRMb2dTdG9yZUZvckNvbmZpZ3VyYXRpb24gfSBmcm9tIFwiLi4vd2Vic29ja2V0LWV2ZW50LWxvZy1zdG9yZS5qc1wiXG5pbXBvcnQgUmVxdWVzdFJ1bm5lciBmcm9tIFwiLi9yZXF1ZXN0LXJ1bm5lci5qc1wiXG5pbXBvcnQgV2Vic29ja2V0UmVxdWVzdCBmcm9tIFwiLi93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiXG5cbi8qKlxuICogRGVmaW5lcyB0aGlzIHR5cGVkZWYuXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwic3Vic2NyaWJlXCIsIGNoYW5uZWw6IHN0cmluZywgbGFzdEV2ZW50SWQ/OiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gfCB7dHlwZTogXCJtZXRhZGF0YVwiLCBkYXRhPzogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSB8IHt0eXBlPzogXCJyZXF1ZXN0XCIsIGJvZHk/OiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiwgaWQ/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsLCBtZXRob2Q6IHN0cmluZywgcGF0aDogc3RyaW5nfSB8IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gV2Vic29ja2V0U2Vzc2lvbk1lc3NhZ2VcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEluYm91bmRNZXNzYWdlQWRtaXNzaW9uXG4gKiBAcHJvcGVydHkge251bWJlcn0gYnl0ZUxlbmd0aCAtIEV4YWN0IHJhdyB0ZXh0IHBheWxvYWQgYnl0ZXMgY2hhcmdlZCB0byB0aGlzIGFkbWlzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBnZW5lcmF0aW9uIC0gQWNjb3VudGluZyBnZW5lcmF0aW9uIGFjdGl2ZSB3aGVuIGFkbWl0dGVkLlxuICogQHByb3BlcnR5IHtib29sZWFufSByZWxlYXNlZCAtIFdoZXRoZXIgdGhpcyBhZG1pc3Npb24gaGFzIGFscmVhZHkgYmVlbiByZWxlYXNlZC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEluYm91bmRNZXNzYWdlV29ya1xuICogQHByb3BlcnR5IHtJbmJvdW5kTWVzc2FnZUFkbWlzc2lvbn0gYWRtaXNzaW9uIC0gQWRtaXNzaW9uIG93bmVyc2hpcC5cbiAqIEBwcm9wZXJ0eSB7V2Vic29ja2V0U2Vzc2lvbk1lc3NhZ2V9IG1lc3NhZ2UgLSBEZWNvZGVkIGNsaWVudCBtZXNzYWdlLlxuICovXG5cbmNvbnN0IFdFQlNPQ0tFVF9GSU5BTF9GUkFNRSA9IDB4ODBcbmNvbnN0IFdFQlNPQ0tFVF9PUENPREVfQ09OVElOVUFUSU9OID0gMHgwXG5jb25zdCBXRUJTT0NLRVRfT1BDT0RFX1RFWFQgPSAweDFcbmNvbnN0IFdFQlNPQ0tFVF9PUENPREVfQklOQVJZID0gMHgyXG5jb25zdCBXRUJTT0NLRVRfT1BDT0RFX0NMT1NFID0gMHg4XG5jb25zdCBXRUJTT0NLRVRfT1BDT0RFX1BJTkcgPSAweDlcbmNvbnN0IFdFQlNPQ0tFVF9PUENPREVfUE9ORyA9IDB4QVxuXG5jb25zdCBXRUJTT0NLRVRfQ0xPU0VfUE9MSUNZX1ZJT0xBVElPTiA9IDEwMDhcbmNvbnN0IFdFQlNPQ0tFVF9JTkJPVU5EX0JBQ0tMT0dfQ0xPU0VfUkVBU09OID0gXCJJbmJvdW5kIG1lc3NhZ2UgYmFja2xvZyBleGNlZWRlZFwiXG5jb25zdCBXRUJTT0NLRVRfTUFYX0NMT1NFX1JFQVNPTl9CWVRFUyA9IDEyM1xuXG4vKiogQ2FwIG9uIHRoZSBwYXVzZWQgb3V0Ym91bmQgcXVldWU7IG9sZGVzdCBmcmFtZXMgZHJvcCBvbiBvdmVyZmxvdy4gKi9cbmNvbnN0IFdFQlNPQ0tFVF9QQVVTRURfUVVFVUVfQ0FQID0gMTAwMFxuXG4vKiogQ2FwIG9uIHRvdGFsIGJ5dGVzIGJ1ZmZlcmVkIGZvciBhIHNpbmdsZSBmcmFnbWVudGVkIG1lc3NhZ2UuICovXG5jb25zdCBXRUJTT0NLRVRfTUFYX0ZSQUdNRU5URURfTUVTU0FHRV9CWVRFUyA9IDE2ICogMTAyNCAqIDEwMjRcblxuLyoqIENhcCBvbiBwYXlsb2FkIGJ5dGVzIGJ1ZmZlcmVkIGZvciBhIHNpbmdsZSBmaW5hbCBkYXRhIGZyYW1lLiAqL1xuY29uc3QgV0VCU09DS0VUX01BWF9GSU5BTF9GUkFNRV9CWVRFUyA9IFdFQlNPQ0tFVF9NQVhfRlJBR01FTlRFRF9NRVNTQUdFX0JZVEVTXG5cbmNvbnN0IFdFQlNPQ0tFVF9NQVhfSU5CT1VORF9GUkFNRV9CWVRFU19CSUdJTlQgPSBCaWdJbnQoV0VCU09DS0VUX01BWF9GSU5BTF9GUkFNRV9CWVRFUylcblxuLyoqIENhcCBvbiBmcmFnbWVudCBjb3VudCBmb3IgYSBzaW5nbGUgZnJhZ21lbnRlZCBtZXNzYWdlLiAqL1xuY29uc3QgV0VCU09DS0VUX01BWF9GUkFHTUVOVEVEX01FU1NBR0VfRlJBR01FTlRTID0gMTAyNFxuXG4vKipcbiAqIFJ1bnMgc3Vic2NyaWJlIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge1dlYnNvY2tldFNlc3Npb25NZXNzYWdlfSBtZXNzYWdlIC0gUmF3IHdlYnNvY2tldCBtZXNzYWdlLlxuICogQHJldHVybnMge3t0eXBlOiBcInN1YnNjcmliZVwiLCBjaGFubmVsOiBzdHJpbmcsIGxhc3RFdmVudElkPzogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IHwgbnVsbH0gLSBTdWJzY3JpYmUgbWVzc2FnZSB3aGVuIG1hdGNoZWQuXG4gKi9cbmZ1bmN0aW9uIHN1YnNjcmliZU1lc3NhZ2UobWVzc2FnZSkge1xuICByZXR1cm4gbWVzc2FnZS50eXBlID09PSBcInN1YnNjcmliZVwiXG4gICAgPyAvKiogQHR5cGUge3t0eXBlOiBcInN1YnNjcmliZVwiLCBjaGFubmVsOiBzdHJpbmcsIGxhc3RFdmVudElkPzogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59fSAqLyAobWVzc2FnZSlcbiAgICA6IG51bGxcbn1cblxuLyoqXG4gKiBSdW5zIHJlcXVlc3QgbWVzc2FnZS5cbiAqIEBwYXJhbSB7V2Vic29ja2V0U2Vzc2lvbk1lc3NhZ2V9IG1lc3NhZ2UgLSBSYXcgd2Vic29ja2V0IG1lc3NhZ2UuXG4gKiBAcmV0dXJucyB7e3R5cGU/OiBcInJlcXVlc3RcIiwgYm9keT86IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBpZD86IHN0cmluZyB8IG51bWJlciB8IG51bGwsIG1ldGhvZDogc3RyaW5nLCBwYXRoOiBzdHJpbmd9IHwgbnVsbH0gLSBSZXF1ZXN0IG1lc3NhZ2Ugd2hlbiBtYXRjaGVkLlxuICovXG5mdW5jdGlvbiByZXF1ZXN0TWVzc2FnZShtZXNzYWdlKSB7XG4gIGlmIChtZXNzYWdlLnR5cGUgJiYgbWVzc2FnZS50eXBlICE9PSBcInJlcXVlc3RcIikgcmV0dXJuIG51bGxcblxuICByZXR1cm4gLyoqIEB0eXBlIHt7dHlwZT86IFwicmVxdWVzdFwiLCBib2R5PzogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIGlkPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCwgbWV0aG9kOiBzdHJpbmcsIHBhdGg6IHN0cmluZ319ICovIChtZXNzYWdlKVxufVxuXG4vKipcbiAqIENvbXBhcmVzIHR3byBpZGVudGl0eSB2YWx1ZXMgZnJvbSBgZ2V0V2Vic29ja2V0U2Vzc2lvbklkZW50aXR5UmVzb2x2ZXJgLlxuICogTnVsbGlzaCB2YWx1ZXMgY29tcGFyZSBlcXVhbCB0byBlYWNoIG90aGVyIGJ1dCBub3QgdG8gYSByZWFsIGlkZW50aXR5LlxuICogUGxhaW4gb2JqZWN0cyBhcmUgY29tcGFyZWQgdmlhIEpTT04gcm91bmQtdHJpcCBzbyBhcHBzIGNhbiByZXR1cm4gYVxuICogYHt1c2VySWQsIHRlbmFudElkfWAtc3R5bGUgb2JqZWN0IHdpdGhvdXQgYnVpbGRpbmcgdGhlaXIgb3duIGVxdWFsaXR5LlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gYSAtIFBhdXNlZC10aW1lIGlkZW50aXR5LlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gYiAtIFJlc3VtZS10aW1lIGlkZW50aXR5LlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gVHJ1ZSB3aGVuIHRoZSB0d28gaWRlbnRpdGllcyBhcmUgY29uc2lkZXJlZCB0aGUgc2FtZSBjYWxsZXIuXG4gKi9cbmZ1bmN0aW9uIGlkZW50aXRpZXNNYXRjaChhLCBiKSB7XG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZVxuICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlXG4gIGlmICh0eXBlb2YgYSAhPT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgYiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlXG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYSkgPT09IEpTT04uc3RyaW5naWZ5KGIpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0h0dHBTZXJ2ZXJDbGllbnRXZWJzb2NrZXRTZXNzaW9uIHtcbiAgZXZlbnRzID0gbmV3IEV2ZW50RW1pdHRlcigpXG4gIHN1YnNjcmlwdGlvbnMgPSBuZXcgU2V0KClcbiAgY2hhbm5lbHMgPSBuZXcgU2V0KClcbiAgc3Vic2NyaXB0aW9uSGFuZGxlcnMgPSBuZXcgTWFwKClcbiAgaGFuZGxlclN1YnNjcmlwdGlvbnMgPSBuZXcgTWFwKClcbiAgY2hhbm5lbFRlbmFudHMgPSBuZXcgTWFwKClcbiAgY2hhbm5lbFJlcGxheVN0YXRlcyA9IG5ldyBNYXAoKVxuICAvKipcbiAgICogTWVzc2FnZSBxdWV1ZS5cbiAgICogQHR5cGUge0luYm91bmRNZXNzYWdlV29ya1tdfSAqL1xuICBtZXNzYWdlUXVldWUgPSBbXVxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MuY2xpZW50IC0gQ2xpZW50IGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiKS5kZWZhdWx0fSBbYXJncy51cGdyYWRlUmVxdWVzdF0gLSBJbml0aWFsIHdlYnNvY2tldCB1cGdyYWRlIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5XZWJzb2NrZXRNZXNzYWdlSGFuZGxlcn0gW2FyZ3MubWVzc2FnZUhhbmRsZXJdIC0gT3B0aW9uYWwgcmF3IG1lc3NhZ2UgaGFuZGxlci5cbiAgICogQHBhcmFtIHtQcm9taXNlPGltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuV2Vic29ja2V0TWVzc2FnZUhhbmRsZXIgfCB2b2lkPn0gW2FyZ3MubWVzc2FnZUhhbmRsZXJQcm9taXNlXSAtIE9wdGlvbmFsIHJhdyBtZXNzYWdlIGhhbmRsZXIgcHJvbWlzZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjbGllbnQsIGNvbmZpZ3VyYXRpb24sIHVwZ3JhZGVSZXF1ZXN0LCBtZXNzYWdlSGFuZGxlciwgbWVzc2FnZUhhbmRsZXJQcm9taXNlfSkge1xuICAgIC8qKiBAdHlwZSB7QnVmZmVyW119ICovXG4gICAgdGhpcy5fYnVmZmVyQ2h1bmtzID0gW11cbiAgICB0aGlzLl9idWZmZXJDaHVua0luZGV4ID0gMFxuICAgIHRoaXMuX2J1ZmZlckNodW5rT2Zmc2V0ID0gMFxuICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgPSAwXG4gICAgdGhpcy5fYnVmZmVyZWRGcmFtZUNvcHlCeXRlcyA9IDBcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudFxuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLnVwZ3JhZGVSZXF1ZXN0ID0gdXBncmFkZVJlcXVlc3RcbiAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyID0gbWVzc2FnZUhhbmRsZXJcbiAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyUHJvbWlzZSA9IG1lc3NhZ2VIYW5kbGVyUHJvbWlzZVxuICAgIHRoaXMucGVuZGluZ01lc3NhZ2VIYW5kbGVyID0gQm9vbGVhbihtZXNzYWdlSGFuZGxlclByb21pc2UpXG4gICAgdGhpcy5sb2dnZXIgPSBuZXcgTG9nZ2VyKHRoaXMpXG4gICAgY29uc3QgaW5ib3VuZFF1ZXVlTGltaXRzID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldEluYm91bmRRdWV1ZUxpbWl0cygpXG5cbiAgICB0aGlzLl9pbmJvdW5kTWF4UGVuZGluZ0J5dGVzID0gaW5ib3VuZFF1ZXVlTGltaXRzLm1heEJ5dGVzXG4gICAgdGhpcy5faW5ib3VuZE1heFBlbmRpbmdNZXNzYWdlcyA9IGluYm91bmRRdWV1ZUxpbWl0cy5tYXhNZXNzYWdlc1xuICAgIHRoaXMuX2luYm91bmRQZW5kaW5nQnl0ZXMgPSAwXG4gICAgdGhpcy5faW5ib3VuZFBlbmRpbmdNZXNzYWdlcyA9IDBcbiAgICB0aGlzLl9pbmJvdW5kQWNjb3VudGluZ0dlbmVyYXRpb24gPSAwXG4gICAgdGhpcy5faW5ib3VuZENsb3NlZCA9IGZhbHNlXG4gICAgdGhpcy5faW5ib3VuZEJhY2tsb2dPdmVybG9hZGVkID0gZmFsc2VcblxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqL1xuICAgIHRoaXMuX21ldGFkYXRhID0ge31cblxuICAgIC8qKlxuICAgICAqIExvbmctbGl2ZWQgcGVyLXNlc3Npb24gc3RhdGUgYmFnLiBTdGFibGUgYWNyb3NzIHJlY29ubmVjdHMgb25jZVxuICAgICAqIGdyYWNlLXBlcmlvZCByZXN1bXB0aW9uIGxhbmRzIGluIFBoYXNlIDI7IHRvZGF5IGl0IGp1c3QgbGl2ZXNcbiAgICAgKiBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB1bmRlcmx5aW5nIHNvY2tldC5cbiAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fVxuICAgICAqL1xuICAgIHRoaXMuZGF0YSA9IHt9XG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3dlYnNvY2tldC1jb25uZWN0aW9uLmpzXCIpLmRlZmF1bHQ+fSAqL1xuICAgIHRoaXMuX2Nvbm5lY3Rpb25zID0gbmV3IE1hcCgpXG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge01hcDxzdHJpbmcsIHtjaGFubmVsVHlwZTogc3RyaW5nLCBzdWJzY3JpcHRpb246IGltcG9ydChcIi4uL3dlYnNvY2tldC1jaGFubmVsLmpzXCIpLmRlZmF1bHR9Pn0gKi9cbiAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucyA9IG5ldyBNYXAoKVxuXG4gICAgLyoqXG4gICAgICogVW5pcXVlIGlkIGFzc2lnbmVkIHRvIHRoaXMgc2Vzc2lvbiBvbiBmaXJzdCBjb25uZWN0LiBTZW50IHRvIHRoZVxuICAgICAqIGNsaWVudCB2aWEgYHNlc3Npb24tZXN0YWJsaXNoZWRgOyB0aGUgY2xpZW50IGVjaG9lcyBpdCBiYWNrIHZpYVxuICAgICAqIGBzZXNzaW9uLXJlc3VtZWAgYWZ0ZXIgYSBXUyBkcm9wIHRvIHJlYXR0YWNoIHRvIHRoaXMgc2Vzc2lvblxuICAgICAqIHdpdGhpbiB0aGUgZ3JhY2UgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5zZXNzaW9uSWQgPSByYW5kb21VVUlEKClcblxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn0gLSB0cnVlIGFmdGVyIGBfaGFuZGxlQ2xvc2VgIHBhdXNlcyBpbnN0ZWFkIG9mIHRlYXJpbmcgZG93bi5cbiAgICAgKi9cbiAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZVxuXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAqIEB0eXBlIHtBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IC0gZnJhbWVzIHByb2R1Y2VkIHdoaWxlIHBhdXNlZDsgZmx1c2hlZCBvbiByZXN1bWUuXG4gICAgICovXG4gICAgdGhpcy5fb3V0Ym91bmRRdWV1ZSA9IFtdXG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdCB8IG51bGx9ICovXG4gICAgdGhpcy5zb2NrZXQgPSBudWxsXG5cbiAgICAvKipcbiAgICAgKiBUYWlsIG9mIGEgcGVyLXNlc3Npb24gcHJvbWlzZSBjaGFpbiB0aGF0IHNlcmlhbGl6ZXMgbWVzc2FnZVxuICAgICAqIGhhbmRsaW5nLiBQcmV2ZW50cyByYWNlcyB3aGVyZSBtZXNzYWdlIEIgcmVhZHMgYHNlc3Npb24uZGF0YWBcbiAgICAgKiBiZWZvcmUgbWVzc2FnZSBBJ3MgaGFuZGxlciBmaW5pc2hlcyB3cml0aW5nIGl0IChlLmcuIGFcbiAgICAgKiBjb25uZWN0aW9uLW1lc3NhZ2Ugc2V0dGluZyB0aGUgbG9jYWxlIHZzLiBhIHN1YnNlcXVlbnQgcmVxdWVzdFxuICAgICAqIHdob3NlIGFyb3VuZFJlcXVlc3Qgd3JhcHBlciByZWFkcyBpdCkuXG4gICAgICogQHR5cGUge1Byb21pc2U8dm9pZD59XG4gICAgICovXG4gICAgdGhpcy5fbWVzc2FnZUNoYWluID0gUHJvbWlzZS5yZXNvbHZlKClcblxuICAgIC8qKlxuICAgICAqIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgYXV0aCBpZGVudGl0eSBjYXB0dXJlZCBhdCBwYXVzZVxuICAgICAqIHRpbWUgYnkgYGdldFdlYnNvY2tldFNlc3Npb25JZGVudGl0eVJlc29sdmVyYC4gQXdhaXRlZCBhdCByZXN1bWVcbiAgICAgKiB0aW1lIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgZnJlc2ggY2FsbGVyJ3MgaWRlbnRpdHkuIFVuZGVmaW5lZFxuICAgICAqIG9uIGEgbGl2ZSAobm9uLXBhdXNlZCkgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4gfCB1bmRlZmluZWR9XG4gICAgICovXG4gICAgdGhpcy5fcmVzdW1lSWRlbnRpdHlQcm9taXNlID0gdW5kZWZpbmVkXG5cbiAgICAvKipcbiAgICAgKiBBY2N1bXVsYXRlcyBwYXlsb2FkcyBmb3IgYSBmcmFnbWVudGVkIHdlYnNvY2tldCBtZXNzYWdlIHBlclxuICAgICAqIFJGQyA2NDU1LiBOb24tbnVsbCB3aGlsZSBtaWQtZnJhZ21lbnQ7IGNsZWFyZWQgd2hlbiB0aGUgZnJhbWVcbiAgICAgKiB3aXRoIEZJTj0xIGNvbXBsZXRlcyBhbmQgdGhlIG1lc3NhZ2UgaXMgZGlzcGF0Y2hlZC5cbiAgICAgKiBAdHlwZSB7QnVmZmVyW10gfCBudWxsfVxuICAgICAqL1xuICAgIHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2FkcyA9IG51bGxcblxuICAgIC8qKlxuICAgICAqIE9wY29kZSAoVEVYVC9CSU5BUlkpIGNhcHR1cmVkIGZyb20gdGhlIGZpcnN0IGZyYW1lIG9mIGFcbiAgICAgKiBmcmFnbWVudGVkIG1lc3NhZ2UuIENvbnRpbnVhdGlvbiBmcmFtZXMgKG9wY29kZSAwKSBpbmhlcml0IGl0XG4gICAgICogYXQgcmVhc3NlbWJseSB0aW1lLlxuICAgICAqIEB0eXBlIHtudW1iZXIgfCBudWxsfVxuICAgICAqL1xuICAgIHRoaXMuX2ZyYWdtZW50ZWRPcGNvZGUgPSBudWxsXG5cbiAgICAvKipcbiAgICAgKiBSdW5uaW5nIGJ5dGUgdG90YWwgZm9yIGBfZnJhZ21lbnRlZFBheWxvYWRzYC4gVXNlZCB0byBlbmZvcmNlXG4gICAgICogYFdFQlNPQ0tFVF9NQVhfRlJBR01FTlRFRF9NRVNTQUdFX0JZVEVTYCBzbyBhIHBlZXIgY2Fubm90XG4gICAgICogZXhoYXVzdCBtZW1vcnkgYnkgc3RyZWFtaW5nIG5vbi1maW5hbCBmcmFnbWVudHMgaW5kZWZpbml0ZWx5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5fZnJhZ21lbnRlZEJ5dGVzID0gMFxuXG4gICAgdGhpcy5jb25maWd1cmF0aW9uLl93ZWJzb2NrZXRTZXNzaW9ucy5hZGQodGhpcylcblxuICAgIC8qKlxuICAgICAqIEhlYXJ0YmVhdCBsaXZlbmVzcyBmbGFnLiBTZXQgdHJ1ZSBvbiBldmVyeSBpbmJvdW5kIGZyYW1lXG4gICAgICogKGluY2x1ZGluZyB0aGUgY2xpZW50J3MgYXV0by1wb25nKSBhbmQgY2xlYXJlZCBlYWNoIHRpbWUgYSBwaW5nXG4gICAgICogaXMgc2VudDsgYSBzdGlsbC1mYWxzZSBmbGFnIGF0IHRoZSBuZXh0IHRpY2sgbWVhbnMgdGhlIHNvY2tldFxuICAgICAqIGhhcyBnb25lIHNpbGVudC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICB0aGlzLl9oZWFydGJlYXRBbGl2ZSA9IHRydWVcblxuICAgIC8qKlxuICAgICAqIFBlci1zZXNzaW9uIGhlYXJ0YmVhdCBpbnRlcnZhbCBoYW5kbGUuIFN0YXJ0ZWQgZnJvbVxuICAgICAqIGBzZW5kU2Vzc2lvbkVzdGFibGlzaGVkYCBvbmNlIHRoZSBzb2NrZXQgaXMgbGl2ZSwgbm90IGF0XG4gICAgICogY29uc3RydWN0aW9uLCBzbyBkaXJlY3RseS1jb25zdHJ1Y3RlZCBzZXNzaW9ucyBpbiB0ZXN0cyBkb24ndFxuICAgICAqIHNwaW4gdXAgYSBiYWNrZ3JvdW5kIHRpbWVyLlxuICAgICAqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsfVxuICAgICAqL1xuICAgIHRoaXMuX2hlYXJ0YmVhdFRpbWVyID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIHRoZSBjbGllbnQgaXRzIHNlc3Npb25JZCArIGdyYWNlIHdpbmRvdy4gQ2FsbGVkIGJ5XG4gICAqIGBWZWxvY2lvdXNIdHRwU2VydmVyQ2xpZW50YCBhZnRlciB0aGUgV1MgdXBncmFkZSBjb21wbGV0ZXMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2VuZFNlc3Npb25Fc3RhYmxpc2hlZCgpIHtcbiAgICB0aGlzLnNlbmRKc29uKHtcbiAgICAgIHR5cGU6IFwic2Vzc2lvbi1lc3RhYmxpc2hlZFwiLFxuICAgICAgc2Vzc2lvbklkOiB0aGlzLnNlc3Npb25JZCxcbiAgICAgIGdyYWNlU2Vjb25kczogdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldFNlc3Npb25HcmFjZVNlY29uZHM/LigpIHx8IDMwMFxuICAgIH0pXG5cbiAgICAvLyBUaGUgc29ja2V0IGlzIGxpdmUgbm93LCBzbyBiZWdpbiByZWFwaW5nIGl0IGlmIGl0IGdvZXMgc2lsZW50LlxuICAgIHRoaXMuX3N0YXJ0SGVhcnRiZWF0KClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY2xvc2VkIGNvbm5lY3Rpb24gZnJvbSB0aGUgc2Vzc2lvbiByZWdpc3RyeS4gQ2FsbGVkIGJ5XG4gICAqIGBWZWxvY2lvdXNXZWJzb2NrZXRDb25uZWN0aW9uLmNsb3NlKClgIGFmdGVyIGl0IHNlbmRzIHRoZSBmaW5hbFxuICAgKiBgY29ubmVjdGlvbi1jbG9zZWRgIGZyYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29ubmVjdGlvbklkIC0gQ2xvc2VkIGNvbm5lY3Rpb24gaWRlbnRpZmllciB0byByZW1vdmUuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX3JlbW92ZUNvbm5lY3Rpb24oY29ubmVjdGlvbklkKSB7XG4gICAgdGhpcy5fY29ubmVjdGlvbnMuZGVsZXRlKGNvbm5lY3Rpb25JZClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBtZXRhZGF0YS5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gLSBDbGllbnQtcHJvdmlkZWQgbWV0YWRhdGEgKGRlZmVuc2l2ZSBjb3B5KS5cbiAgICovXG4gIGdldE1ldGFkYXRhKCkge1xuICAgIHJldHVybiB7Li4udGhpcy5fbWV0YWRhdGF9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBpcyBwYXVzZWQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIHRydWUgd2hpbGUgdGhlIHNlc3Npb24gaXMgaW4gdGhlIHBhdXNlZC9ncmFjZSByZWdpc3RyeS5cbiAgICovXG4gIGlzUGF1c2VkKCkge1xuICAgIHJldHVybiB0aGlzLl9wYXVzZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFkZCBzdWJzY3JpcHRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBhZGRTdWJzY3JpcHRpb24oY2hhbm5lbCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoY2hhbm5lbClcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fc3RvcEhlYXJ0YmVhdCgpXG4gICAgdGhpcy5fcmVzZXRGcmFnbWVudEJ1ZmZlcigpXG4gICAgdGhpcy5fY2xlYXJCdWZmZXJlZEZyYW1lQ2h1bmtzKClcbiAgICB0aGlzLl9hYmFuZG9uSW5ib3VuZE1lc3NhZ2VzKClcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3dlYnNvY2tldFNlc3Npb25zLmRlbGV0ZSh0aGlzKVxuICAgIHRoaXMuX3BhdXNlZCA9IGZhbHNlXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWwoKVxuICAgIHZvaWQgdGhpcy5fdGVhcmRvd25Db25uZWN0aW9ucyhcInNlc3Npb25fZGVzdHJveWVkXCIpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWxTdWJzY3JpcHRpb25zKClcbiAgICB0aGlzLmV2ZW50cy5yZW1vdmVBbGxMaXN0ZW5lcnMoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaGFzIHN1YnNjcmlwdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgaXQgaGFzIHN1YnNjcmlwdGlvbi5cbiAgICovXG4gIGhhc1N1YnNjcmlwdGlvbihjaGFubmVsKSB7XG4gICAgcmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9ucy5oYXMoY2hhbm5lbClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIG9uIGRhdGEuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIC0gRGF0YSBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBvbkRhdGEoZGF0YSkge1xuICAgIC8vIEFueSBpbmJvdW5kIGJ5dGVzIOKAlCBhIGRhdGEgZnJhbWUsIHRoZSBhdXRvLXBvbmcgYW5zd2VyaW5nIG91clxuICAgIC8vIGhlYXJ0YmVhdCwgb3IgYSBwYXJ0aWFsIGZyYW1lIHN0aWxsIGJlaW5nIHVwbG9hZGVkIOKAlCBwcm92ZSB0aGVcbiAgICAvLyBzb2NrZXQgaXMgYWxpdmUuIE1hcmsgaXQgaGVyZSwgYmVmb3JlIGBfcHJvY2Vzc0J1ZmZlcmAgbWF5IHJldHVyblxuICAgIC8vIGVhcmx5IHdhaXRpbmcgZm9yIHRoZSByZXN0IG9mIGFuIGluY29tcGxldGUgZnJhbWUuXG4gICAgdGhpcy5faGVhcnRiZWF0QWxpdmUgPSB0cnVlXG4gICAgaWYgKHRoaXMuX2luYm91bmRDbG9zZWQgfHwgZGF0YS5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgdGhpcy5fYnVmZmVyQ2h1bmtzLnB1c2goZGF0YSlcbiAgICB0aGlzLl9idWZmZXJlZEJ5dGVzICs9IGRhdGEubGVuZ3RoXG4gICAgdGhpcy5fcHJvY2Vzc0J1ZmZlcigpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZW5kIGV2ZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gcGF5bG9hZCAtIFBheWxvYWQgZGF0YS5cbiAgICogQHBhcmFtIHt7Y3JlYXRlZEF0Pzogc3RyaW5nLCBldmVudElkPzogc3RyaW5nLCByZXBsYXllZD86IGJvb2xlYW4sIHNlcXVlbmNlPzogbnVtYmVyfX0gW29wdGlvbnNdIC0gRXZlbnQgbWV0YWRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBzZW5kRXZlbnQoY2hhbm5lbCwgcGF5bG9hZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgY2hhbm5lbEhhbmRsZXJzID0gdGhpcy5zdWJzY3JpcHRpb25IYW5kbGVycy5nZXQoY2hhbm5lbClcbiAgICBjb25zdCBoYXNDaGFubmVsSGFuZGxlcnMgPSBCb29sZWFuKGNoYW5uZWxIYW5kbGVycyAmJiBjaGFubmVsSGFuZGxlcnMuc2l6ZSA+IDApXG4gICAgY29uc3QgcmVwbGF5U3RhdGUgPSB0aGlzLmNoYW5uZWxSZXBsYXlTdGF0ZXMuZ2V0KGNoYW5uZWwpXG5cbiAgICBpZiAocmVwbGF5U3RhdGU/LnJlcGxheWluZyAmJiAhb3B0aW9ucy5yZXBsYXllZCkge1xuICAgICAgcmVwbGF5U3RhdGUuYnVmZmVyZWQgPSB0cnVlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaGFzU3Vic2NyaXB0aW9uKGNoYW5uZWwpICYmICFoYXNDaGFubmVsSGFuZGxlcnMpIHJldHVyblxuXG4gICAgaWYgKGhhc0NoYW5uZWxIYW5kbGVycykge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbShjaGFubmVsSGFuZGxlcnMpLm1hcChhc3luYyAoaGFuZGxlcikgPT4ge1xuICAgICAgICBjb25zdCB0ZW5hbnQgPSB0aGlzLmNoYW5uZWxUZW5hbnRzLmdldChoYW5kbGVyKVxuXG4gICAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5ydW5XaXRoVGVuYW50KHRlbmFudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBoYW5kbGVyLnJlY2VpdmVkQnJvYWRjYXN0KHtcbiAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgY3JlYXRlZEF0OiBvcHRpb25zLmNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgZXZlbnRJZDogb3B0aW9ucy5ldmVudElkLFxuICAgICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICAgICAgICByZXBsYXllZDogb3B0aW9ucy5yZXBsYXllZCxcbiAgICAgICAgICAgICAgc2VxdWVuY2U6IG9wdGlvbnMuc2VxdWVuY2VcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0pKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5zZW5kSnNvbih7XG4gICAgICBjaGFubmVsLFxuICAgICAgY3JlYXRlZEF0OiBvcHRpb25zLmNyZWF0ZWRBdCxcbiAgICAgIGV2ZW50SWQ6IG9wdGlvbnMuZXZlbnRJZCxcbiAgICAgIHBheWxvYWQsXG4gICAgICByZXBsYXllZDogb3B0aW9ucy5yZXBsYXllZCxcbiAgICAgIHNlcXVlbmNlOiBvcHRpb25zLnNlcXVlbmNlLFxuICAgICAgdHlwZTogXCJldmVudFwiXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGluaXRpYWxpemUgY2hhbm5lbC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGluaXRpYWxpemVDaGFubmVsKCkge1xuICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyUHJvbWlzZSkge1xuICAgICAgYXdhaXQgdGhpcy5fcmVzb2x2ZU1lc3NhZ2VIYW5kbGVyUHJvbWlzZSgpXG5cbiAgICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyKSByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5tZXNzYWdlSGFuZGxlcikge1xuICAgICAgYXdhaXQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJPcGVuKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVyID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldENoYW5uZWxSZXNvbHZlcj8uKClcblxuICAgIGlmICghcmVzb2x2ZXIpIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRlbmFudCA9IGF3YWl0IHRoaXMuX3Jlc29sdmVUZW5hbnQoe30pXG4gICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5ydW5XaXRoVGVuYW50KHRlbmFudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzb2x2ZXIoe1xuICAgICAgICAgIGNsaWVudDogdGhpcy5jbGllbnQsXG4gICAgICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgICAgIHJlcXVlc3Q6IHRoaXMudXBncmFkZVJlcXVlc3QsXG4gICAgICAgICAgd2Vic29ja2V0U2Vzc2lvbjogdGhpc1xuICAgICAgICB9KVxuICAgICAgfSlcblxuICAgICAgaWYgKCFyZXNvbHZlZCkgcmV0dXJuXG5cbiAgICAgIGNvbnN0IGNoYW5uZWwgPSB0eXBlb2YgcmVzb2x2ZWQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IG5ldyByZXNvbHZlZCh7Y2xpZW50OiB0aGlzLmNsaWVudCwgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLCByZXF1ZXN0OiB0aGlzLnVwZ3JhZGVSZXF1ZXN0LCB3ZWJzb2NrZXRTZXNzaW9uOiB0aGlzfSlcbiAgICAgICAgOiByZXNvbHZlZFxuXG4gICAgICBpZiAoY2hhbm5lbCAmJiAhKGNoYW5uZWwgaW5zdGFuY2VvZiBXZWJzb2NrZXRDaGFubmVsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZXNvbHZlZCB3ZWJzb2NrZXQgY2hhbm5lbCBtdXN0IGV4dGVuZCBXZWJzb2NrZXRDaGFubmVsXCIpXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuX3JlZ2lzdGVyQ2hhbm5lbChjaGFubmVsLCB0ZW5hbnQpXG4gICAgfSBjYXRjaCAoY2F1Z2h0RXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fcmVwb3J0VW5leHBlY3RlZERpc3BhdGNoRXJyb3IoY2F1Z2h0RXJyb3IsIHtcbiAgICAgICAgc3RhZ2U6IFwid2Vic29ja2V0LWNoYW5uZWwtaW5pdGlhbGl6ZVwiXG4gICAgICB9KVxuXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSB3ZWJzb2NrZXQgY2hhbm5lbFwiLCBlcnJvcl0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2VuZCBnb29kYnllLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gY2xpZW50IC0gQ2xpZW50IGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge3tjb2RlPzogbnVtYmVyLCByZWFzb24/OiBzdHJpbmd9fSBbb3B0aW9uc10gLSBPcHRpb25hbCBjbG9zZSBzdGF0dXMuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNlbmRHb29kYnllKGNsaWVudCwge2NvZGUsIHJlYXNvbiA9IFwiXCJ9ID0ge30pIHtcbiAgICBsZXQgcGF5bG9hZFxuXG4gICAgaWYgKGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcGF5bG9hZCA9IEJ1ZmZlci5hbGxvYygwKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByZWFzb25CeXRlcyA9IEJ1ZmZlci5mcm9tKHJlYXNvbiwgXCJ1dGYtOFwiKVxuXG4gICAgICBpZiAocmVhc29uQnl0ZXMubGVuZ3RoID4gV0VCU09DS0VUX01BWF9DTE9TRV9SRUFTT05fQllURVMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJXZWJTb2NrZXQgY2xvc2UgcmVhc29uIG11c3Qgbm90IGV4Y2VlZCAxMjMgVVRGLTggYnl0ZXNcIilcbiAgICAgIH1cblxuICAgICAgcGF5bG9hZCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgyICsgcmVhc29uQnl0ZXMubGVuZ3RoKVxuICAgICAgcGF5bG9hZC53cml0ZVVJbnQxNkJFKGNvZGUsIDApXG4gICAgICByZWFzb25CeXRlcy5jb3B5KHBheWxvYWQsIDIpXG4gICAgfVxuXG4gICAgY29uc3QgZnJhbWUgPSBCdWZmZXIuY29uY2F0KFtcbiAgICAgIEJ1ZmZlci5mcm9tKFtXRUJTT0NLRVRfRklOQUxfRlJBTUUgfCBXRUJTT0NLRVRfT1BDT0RFX0NMT1NFLCBwYXlsb2FkLmxlbmd0aF0pLFxuICAgICAgcGF5bG9hZFxuICAgIF0pXG5cbiAgICBjbGllbnQuZXZlbnRzLmVtaXQoXCJvdXRwdXRcIiwgZnJhbWUsIHt3ZWJzb2NrZXRGcmFtZTogdHJ1ZX0pXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBhIGNhdWdodCBkaXNwYXRjaCBlcnJvciBpcyBhbiBleHBlY3RlZCBjbGllbnQtZmxvdyBmYWlsdXJlLlxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIE5vcm1hbGl6ZWQgZGlzcGF0Y2ggZXJyb3IuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgZnJhbWV3b3JrIGVycm9yIHJlcG9ydGVycyBzaG91bGQgaWdub3JlIGl0LlxuICAgKi9cbiAgX2V4cGVjdGVkQ2xpZW50RXJyb3IoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpIHJldHVybiB0cnVlXG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVmVsb2Npb3VzRXJyb3IgJiYgZXJyb3Iuc2FmZVRvRXhwb3NlKSByZXR1cm4gdHJ1ZVxuXG4gICAgY29uc3QgYW5ub3RhdGVkRXJyb3IgPSAvKiogQHR5cGUge0Vycm9yICYge2Vycm9yVHlwZT86IHN0cmluZywgdmVsb2Npb3VzPzogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fX0gKi8gKGVycm9yKVxuXG4gICAgaWYgKGlzUGxhaW5PYmplY3QoYW5ub3RhdGVkRXJyb3IudmVsb2Npb3VzKSkgcmV0dXJuIHRydWVcblxuICAgIHJldHVybiB0eXBlb2YgYW5ub3RhdGVkRXJyb3IuZXJyb3JUeXBlID09PSBcInN0cmluZ1wiICYmIGFubm90YXRlZEVycm9yLmVycm9yVHlwZS5sZW5ndGggPiAwXG4gIH1cblxuICAvKipcbiAgICogUmVwb3J0cyBvbmUgdW5leHBlY3RlZCBXZWJTb2NrZXQgZGlzcGF0Y2ggZmFpbHVyZSBhbmQgcmV0dXJucyBpdHMgbm9ybWFsaXplZCBFcnJvci5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gY2F1Z2h0RXJyb3IgLSBDYXVnaHQgZGlzcGF0Y2ggZmFpbHVyZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGNvbnRleHQgLSBTdHJ1Y3R1cmVkIGRpc3BhdGNoIGNvbnRleHQuXG4gICAqIEByZXR1cm5zIHtFcnJvcn0gLSBOb3JtYWxpemVkIGVycm9yIGZvciBleGlzdGluZyBsb2dzIGFuZCBjbGllbnQgcmVzcG9uc2VzLlxuICAgKi9cbiAgX3JlcG9ydFVuZXhwZWN0ZWREaXNwYXRjaEVycm9yKGNhdWdodEVycm9yLCBjb250ZXh0KSB7XG4gICAgY29uc3QgZXJyb3IgPSBlbnN1cmVFcnJvcihjYXVnaHRFcnJvcilcblxuICAgIGlmICh0aGlzLl9leHBlY3RlZENsaWVudEVycm9yKGVycm9yKSkgcmV0dXJuIGVycm9yXG5cbiAgICBjb25zdCBlcnJvclBheWxvYWQgPSB7XG4gICAgICBjb250ZXh0LFxuICAgICAgZXJyb3IsXG4gICAgICByZXF1ZXN0OiB0aGlzLnVwZ3JhZGVSZXF1ZXN0XG4gICAgfVxuICAgIGNvbnN0IGVycm9yRXZlbnRzID0gdGhpcy5jb25maWd1cmF0aW9uLmdldEVycm9yRXZlbnRzKClcblxuICAgIGVycm9yRXZlbnRzLmVtaXQoXCJmcmFtZXdvcmstZXJyb3JcIiwgZXJyb3JQYXlsb2FkKVxuICAgIGVycm9yRXZlbnRzLmVtaXQoXCJhbGwtZXJyb3JcIiwgey4uLmVycm9yUGF5bG9hZCwgZXJyb3JUeXBlOiBcImZyYW1ld29yay1lcnJvclwifSlcblxuICAgIHJldHVybiBlcnJvclxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaGFuZGxlIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB7V2Vic29ja2V0U2Vzc2lvbk1lc3NhZ2V9IG1lc3NhZ2UgLSBNZXNzYWdlIHRleHQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfaGFuZGxlTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgY29uc3QgYWRtaXNzaW9uID0gdGhpcy5fYWRtaXRJbmJvdW5kTWVzc2FnZSgwKVxuXG4gICAgaWYgKCFhZG1pc3Npb24pIHJldHVyblxuICAgIGF3YWl0IHRoaXMuX2hhbmRsZU1lc3NhZ2VXb3JrKHthZG1pc3Npb24sIG1lc3NhZ2V9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYW4gYWRtaXR0ZWQgbWVzc2FnZSB0byB0aGUgcGVyLXNlc3Npb24gRklGTyBjaGFpbi5cbiAgICogQHBhcmFtIHtJbmJvdW5kTWVzc2FnZVdvcmt9IHdvcmsgLSBBZG1pdHRlZCBkZWNvZGVkIG1lc3NhZ2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfaGFuZGxlTWVzc2FnZVdvcmsod29yaykge1xuICAgIC8vIFNlcmlhbGl6ZSBwZXItc2Vzc2lvbjogY2hhaW4gb250byBgX21lc3NhZ2VDaGFpbmAgc28gbWVzc2FnZXNcbiAgICAvLyBhcmUgcHJvY2Vzc2VkIG9uZSBhdCBhIHRpbWUuIFdpdGhvdXQgdGhpcywgZmlyZS1hbmQtZm9yZ2V0XG4gICAgLy8gZGlzcGF0Y2ggZnJvbSBgX3Byb2Nlc3NCdWZmZXJgIGxldHMgbWVzc2FnZSBCIHJlYWRcbiAgICAvLyBgc2Vzc2lvbi5kYXRhYCBiZWZvcmUgQSBoYXMgZmluaXNoZWQgd3JpdGluZyBpdC5cbiAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMuX21lc3NhZ2VDaGFpblxuICAgIGNvbnN0IG5leHQgPSBwcmV2aW91cy50aGVuKCgpID0+IHRoaXMuX3J1bk1lc3NhZ2VXb3JrKHdvcmspKVxuXG4gICAgdGhpcy5fbWVzc2FnZUNoYWluID0gbmV4dC5jYXRjaCgoKSA9PiB7fSlcbiAgICBhd2FpdCBuZXh0XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2hlcyBvciB0cmFuc2ZlcnMgb25lIGFkbWl0dGVkIG1lc3NhZ2Ugd2hpbGUgcmV0YWluaW5nIGl0cyBhY2NvdW50aW5nLlxuICAgKiBAcGFyYW0ge0luYm91bmRNZXNzYWdlV29ya30gd29yayAtIEFkbWl0dGVkIGRlY29kZWQgbWVzc2FnZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgZGlzcGF0Y2ggb3IgcmVzb2x2ZXItcXVldWUgdHJhbnNmZXIuXG4gICAqL1xuICBhc3luYyBfcnVuTWVzc2FnZVdvcmsod29yaykge1xuICAgIGlmICh0aGlzLl9pbmJvdW5kQ2xvc2VkKSB7XG4gICAgICB0aGlzLl9yZWxlYXNlSW5ib3VuZEFkbWlzc2lvbih3b3JrLmFkbWlzc2lvbilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLnBlbmRpbmdNZXNzYWdlSGFuZGxlcikge1xuICAgICAgdGhpcy5tZXNzYWdlUXVldWUucHVzaCh3b3JrKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX2Rpc3BhdGNoTWVzc2FnZSh3b3JrLm1lc3NhZ2UpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX3JlbGVhc2VJbmJvdW5kQWRtaXNzaW9uKHdvcmsuYWRtaXNzaW9uKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGRpc3BhdGNoIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB7V2Vic29ja2V0U2Vzc2lvbk1lc3NhZ2V9IG1lc3NhZ2UgLSBNZXNzYWdlIHRleHQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfZGlzcGF0Y2hNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldEFyb3VuZFJlcXVlc3Q/LigpXG5cbiAgICBpZiAod3JhcHBlcikge1xuICAgICAgYXdhaXQgd3JhcHBlcih0aGlzLCAoKSA9PiB0aGlzLl9oYW5kbGVNZXNzYWdlSW5uZXIobWVzc2FnZSkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLl9oYW5kbGVNZXNzYWdlSW5uZXIobWVzc2FnZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYWN0dWFsIG1lc3NhZ2UgZGlzcGF0Y2gsIGV4dHJhY3RlZCBzb1xuICAgKiBgY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRBcm91bmRSZXF1ZXN0KClgIGNhbiB3cmFwIGl0IGluIGFueVxuICAgKiBwZXItcmVxdWVzdCBjb250ZXh0IChBc3luY0xvY2FsU3RvcmFnZSwgdHJhY2luZywgZXRjLikuXG4gICAqIEBwYXJhbSB7V2Vic29ja2V0U2Vzc2lvbk1lc3NhZ2V9IG1lc3NhZ2UgLSBEZWNvZGVkIGNsaWVudCBmcmFtZSB0byBkaXNwYXRjaCBieSBtZXNzYWdlIHR5cGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZU1lc3NhZ2VJbm5lcihtZXNzYWdlKSB7XG4gICAgLy8gVGhlIG1lc3NhZ2VIYW5kbGVyIHNob3J0LWNpcmN1aXRzIGRlZmF1bHQgcm91dGluZyBvbmx5IHdoZW4gdGhlXG4gICAgLy8gYXBwIGFjdHVhbGx5IGRlY2xhcmVkIGFuIGBvbk1lc3NhZ2VgIGhvb2suIEFwcHMgdGhhdCBvbmx5IHdhbnRcbiAgICAvLyBzZXNzaW9uLWxpZmVjeWNsZSB0cmFja2luZyAoYG9uT3BlbmAvYG9uQ2xvc2VgKSBzdGlsbCBuZWVkIHRoZVxuICAgIC8vIGJ1aWx0LWluIHN1YnNjcmliZS9jb25uZWN0aW9uL2NoYW5uZWwtc3Vic2NyaWJlIHJvdXRpbmcgYmVsb3csXG4gICAgLy8gb3RoZXJ3aXNlIGV2ZXJ5IGluY29taW5nIG1lc3NhZ2UgaXMgc2lsZW50bHkgZHJvcHBlZC5cbiAgICBpZiAodGhpcy5tZXNzYWdlSGFuZGxlciAmJiB0eXBlb2YgdGhpcy5tZXNzYWdlSGFuZGxlci5vbk1lc3NhZ2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgYXdhaXQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJNZXNzYWdlKG1lc3NhZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzdWJzY3JpYmVQYXlsb2FkID0gc3Vic2NyaWJlTWVzc2FnZShtZXNzYWdlKVxuXG4gICAgaWYgKHN1YnNjcmliZVBheWxvYWQpIHtcbiAgICAgIGNvbnN0IHtjaGFubmVsLCBsYXN0RXZlbnRJZCwgcGFyYW1zfSA9IHN1YnNjcmliZVBheWxvYWRcblxuICAgICAgaWYgKCFjaGFubmVsKSB0aHJvdyBWZWxvY2lvdXNFcnJvci5zYWZlKFwiY2hhbm5lbCBpcyByZXF1aXJlZCBmb3Igc3Vic2NyaWJlXCIpXG4gICAgICBjb25zdCByZXNvbHZlciA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRDaGFubmVsUmVzb2x2ZXI/LigpXG5cbiAgICAgIGlmIChyZXNvbHZlcikge1xuICAgICAgICBhd2FpdCB0aGlzLl9oYW5kbGVDaGFubmVsU3Vic2NyaXB0aW9uKHtjaGFubmVsLCBsYXN0RXZlbnRJZCwgcGFyYW1zfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3Vic2NyaWJlVG9DaGFubmVsKGNoYW5uZWwsIHthY2tub3dsZWRnZTogdHJ1ZSwgbGFzdEV2ZW50SWQsIHBhcmFtc30pXG4gICAgICB9XG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwibWV0YWRhdGFcIikge1xuICAgICAgY29uc3QgbWV0YWRhdGFQYXlsb2FkID0gLyoqIEB0eXBlIHt7ZGF0YT86IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn19ICovIChtZXNzYWdlKVxuXG4gICAgICB0aGlzLl9tZXRhZGF0YSA9IG1ldGFkYXRhUGF5bG9hZC5kYXRhICYmIHR5cGVvZiBtZXRhZGF0YVBheWxvYWQuZGF0YSA9PT0gXCJvYmplY3RcIiA/IHsuLi5tZXRhZGF0YVBheWxvYWQuZGF0YX0gOiB7fVxuXG4gICAgICBmb3IgKGNvbnN0IHtzdWJzY3JpcHRpb259IG9mIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnZhbHVlcygpKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc3Vic2NyaXB0aW9uLm9uTWV0YWRhdGFDaGFuZ2VkID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgc3Vic2NyaXB0aW9uLm9uTWV0YWRhdGFDaGFuZ2VkKHRoaXMuX21ldGFkYXRhKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJzZXNzaW9uLXJlc3VtZVwiKSB7XG4gICAgICBhd2FpdCB0aGlzLl9oYW5kbGVTZXNzaW9uUmVzdW1lKG1lc3NhZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBcImNvbm5lY3Rpb24tb3BlblwiKSB7XG4gICAgICBhd2FpdCB0aGlzLl9oYW5kbGVDb25uZWN0aW9uT3BlbihtZXNzYWdlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJjb25uZWN0aW9uLW1lc3NhZ2VcIikge1xuICAgICAgYXdhaXQgdGhpcy5faGFuZGxlQ29ubmVjdGlvbk1lc3NhZ2UobWVzc2FnZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY29ubmVjdGlvbi1jbG9zZVwiKSB7XG4gICAgICBhd2FpdCB0aGlzLl9oYW5kbGVDb25uZWN0aW9uQ2xvc2UobWVzc2FnZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY2hhbm5lbC1zdWJzY3JpYmVcIikge1xuICAgICAgYXdhaXQgdGhpcy5faGFuZGxlQ2hhbm5lbFN1YnNjcmliZShtZXNzYWdlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJjaGFubmVsLXVuc3Vic2NyaWJlXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZUNoYW5uZWxVbnN1YnNjcmliZShtZXNzYWdlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UudHlwZSAmJiBtZXNzYWdlLnR5cGUgIT09IFwicmVxdWVzdFwiKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHtlcnJvcjogYFVua25vd24gbWVzc2FnZSB0eXBlOiAke21lc3NhZ2UudHlwZX1gLCB0eXBlOiBcImVycm9yXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdFBheWxvYWQgPSByZXF1ZXN0TWVzc2FnZShtZXNzYWdlKVxuXG4gICAgaWYgKCFyZXF1ZXN0UGF5bG9hZCkge1xuICAgICAgdGhpcy5zZW5kSnNvbih7ZXJyb3I6IGBVbmtub3duIG1lc3NhZ2UgdHlwZTogJHttZXNzYWdlLnR5cGV9YCwgdHlwZTogXCJlcnJvclwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHtib2R5LCBoZWFkZXJzLCBpZCwgbWV0aG9kLCBwYXRofSA9IHJlcXVlc3RQYXlsb2FkXG5cbiAgICBpZiAoIW1ldGhvZCkgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShcIm1ldGhvZCBpcyByZXF1aXJlZFwiKVxuICAgIGlmICghcGF0aCkgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShcInBhdGggaXMgcmVxdWlyZWRcIilcblxuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgV2Vic29ja2V0UmVxdWVzdCh7XG4gICAgICBib2R5LFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGFkYXRhOiB0aGlzLmdldE1ldGFkYXRhKCksXG4gICAgICBtZXRob2QsXG4gICAgICBwYXRoLFxuICAgICAgcmVtb3RlQWRkcmVzczogdGhpcy5yZW1vdGVBZGRyZXNzKClcbiAgICB9KVxuICAgIGNvbnN0IHJlcXVlc3RSdW5uZXIgPSBuZXcgUmVxdWVzdFJ1bm5lcih7XG4gICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICByZXF1ZXN0XG4gICAgfSlcblxuICAgIHJlcXVlc3RSdW5uZXIuZXZlbnRzLm9uKFwiZG9uZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IHJlcXVlc3RSdW5uZXIucmVzcG9uc2VcbiAgICAgIGNvbnN0IGJvZHkgPSByZXNwb25zZS5nZXRCb2R5KClcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSByZXNwb25zZS5oZWFkZXJzXG5cbiAgICAgIHRoaXMuc2VuZEpzb24oe1xuICAgICAgICBib2R5LFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBpZCxcbiAgICAgICAgc3RhdHVzQ29kZTogcmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpLFxuICAgICAgICBzdGF0dXNNZXNzYWdlOiByZXNwb25zZS5nZXRTdGF0dXNNZXNzYWdlKCksXG4gICAgICAgIHR5cGU6IFwicmVzcG9uc2VcIlxuICAgICAgfSlcbiAgICAgIHZvaWQgcmVxdWVzdFJ1bm5lci5sb2dDb21wbGV0ZWRSZXF1ZXN0KCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJGYWlsZWQgdG8gbG9nIGNvbXBsZXRlZCByZXF1ZXN0XCIsIGVycm9yKVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgYXdhaXQgcmVxdWVzdFJ1bm5lci5ydW4oKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcHJvY2VzcyBidWZmZXIuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIF9wcm9jZXNzQnVmZmVyKCkge1xuICAgIHdoaWxlICh0aGlzLl9idWZmZXJlZEJ5dGVzID49IDIpIHtcbiAgICAgIGNvbnN0IGluaXRpYWxIZWFkZXIgPSB0aGlzLl9wZWVrQnVmZmVyZWRCeXRlcygyKVxuICAgICAgY29uc3QgZmlyc3RCeXRlID0gaW5pdGlhbEhlYWRlclswXVxuICAgICAgY29uc3Qgc2Vjb25kQnl0ZSA9IGluaXRpYWxIZWFkZXJbMV1cbiAgICAgIGNvbnN0IGlzRmluYWwgPSAoZmlyc3RCeXRlICYgV0VCU09DS0VUX0ZJTkFMX0ZSQU1FKSA9PT0gV0VCU09DS0VUX0ZJTkFMX0ZSQU1FXG4gICAgICBjb25zdCBvcGNvZGUgPSBmaXJzdEJ5dGUgJiAweDBGXG4gICAgICBjb25zdCBpc01hc2tlZCA9IChzZWNvbmRCeXRlICYgMHg4MCkgPT09IDB4ODBcbiAgICAgIGxldCBwYXlsb2FkTGVuZ3RoID0gc2Vjb25kQnl0ZSAmIDB4N0ZcbiAgICAgIGxldCBvZmZzZXQgPSAyXG5cbiAgICAgIGlmIChwYXlsb2FkTGVuZ3RoID09PSAxMjYpIHtcbiAgICAgICAgaWYgKHRoaXMuX2J1ZmZlcmVkQnl0ZXMgPCBvZmZzZXQgKyAyKSByZXR1cm5cbiAgICAgICAgcGF5bG9hZExlbmd0aCA9IHRoaXMuX3BlZWtCdWZmZXJlZEJ5dGVzKG9mZnNldCArIDIpLnJlYWRVSW50MTZCRShvZmZzZXQpXG4gICAgICAgIG9mZnNldCArPSAyXG4gICAgICB9IGVsc2UgaWYgKHBheWxvYWRMZW5ndGggPT09IDEyNykge1xuICAgICAgICBpZiAodGhpcy5fYnVmZmVyZWRCeXRlcyA8IG9mZnNldCArIDgpIHJldHVyblxuICAgICAgICBjb25zdCBiaWdMZW5ndGggPSB0aGlzLl9wZWVrQnVmZmVyZWRCeXRlcyhvZmZzZXQgKyA4KS5yZWFkQmlnVUludDY0QkUob2Zmc2V0KVxuXG4gICAgICAgIGlmIChiaWdMZW5ndGggPiBXRUJTT0NLRVRfTUFYX0lOQk9VTkRfRlJBTUVfQllURVNfQklHSU5UKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybigoKSA9PiBbXG4gICAgICAgICAgICBcIldlYnNvY2tldCBmcmFtZSBleGNlZWRlZCBieXRlIGNhcDsgY2xvc2luZyBjb25uZWN0aW9uXCIsXG4gICAgICAgICAgICB7ZnJhbWVCeXRlczogYmlnTGVuZ3RoLnRvU3RyaW5nKCksIG1heEJ5dGVzOiBXRUJTT0NLRVRfTUFYX0ZJTkFMX0ZSQU1FX0JZVEVTfVxuICAgICAgICAgIF0pXG4gICAgICAgICAgdGhpcy5fY2xvc2VGb3JJbmJvdW5kTGltaXQoKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgcGF5bG9hZExlbmd0aCA9IE51bWJlcihiaWdMZW5ndGgpXG4gICAgICAgIG9mZnNldCArPSA4XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hc2tMZW5ndGggPSBpc01hc2tlZCA/IDQgOiAwXG5cbiAgICAgIGNvbnN0IGZyYW1lTGVuZ3RoID0gb2Zmc2V0ICsgbWFza0xlbmd0aCArIHBheWxvYWRMZW5ndGhcblxuICAgICAgaWYgKHRoaXMuX2J1ZmZlcmVkQnl0ZXMgPCBmcmFtZUxlbmd0aCkgcmV0dXJuXG5cbiAgICAgIGNvbnN0IGZyYW1lID0gdGhpcy5fY29uc3VtZUJ1ZmZlcmVkQnl0ZXMoZnJhbWVMZW5ndGgpXG5cbiAgICAgIC8qKiBAdHlwZSB7QnVmZmVyfSAqL1xuICAgICAgbGV0IHBheWxvYWQgPSBmcmFtZS5zdWJhcnJheShvZmZzZXQgKyBtYXNrTGVuZ3RoLCBmcmFtZUxlbmd0aClcblxuICAgICAgaWYgKGlzTWFza2VkKSB7XG4gICAgICAgIGNvbnN0IG1hc2sgPSBmcmFtZS5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIG1hc2tMZW5ndGgpXG4gICAgICAgIHRoaXMuX3VubWFza1BheWxvYWQocGF5bG9hZCwgbWFzaylcbiAgICAgIH1cblxuICAgICAgLy8gQ29udHJvbCBmcmFtZXMgKG9wY29kZSA+PSAweDgpIG11c3Qgbm90IGJlIGZyYWdtZW50ZWQgcGVyXG4gICAgICAvLyBSRkMgNjQ1NSBhbmQgY2FuIGFycml2ZSBpbnRlcmxlYXZlZCB3aXRoIGEgZnJhZ21lbnRlZCBkYXRhXG4gICAgICAvLyBtZXNzYWdlLiBIYW5kbGUgdGhlbSBmaXJzdCB3aXRob3V0IHRvdWNoaW5nIHRoZSBmcmFnbWVudFxuICAgICAgLy8gYWNjdW11bGF0b3IuXG4gICAgICBpZiAob3Bjb2RlID09PSBXRUJTT0NLRVRfT1BDT0RFX1BJTkcpIHtcbiAgICAgICAgdGhpcy5fc2VuZENvbnRyb2xGcmFtZShXRUJTT0NLRVRfT1BDT0RFX1BPTkcsIHBheWxvYWQpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChvcGNvZGUgPT09IFdFQlNPQ0tFVF9PUENPREVfQ0xPU0UpIHtcbiAgICAgICAgdGhpcy5zZW5kR29vZGJ5ZSh0aGlzLmNsaWVudClcbiAgICAgICAgdGhpcy5faGFuZGxlQ2xvc2UoKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAob3Bjb2RlID09PSBXRUJTT0NLRVRfT1BDT0RFX1BPTkcpIHtcbiAgICAgICAgLy8gQW5zd2VyIHRvIGEgaGVhcnRiZWF0IHBpbmc7IGxpdmVuZXNzIGlzIHJlY29yZGVkIGluIG9uRGF0YS5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKG9wY29kZSA+PSAweDgpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihgVW5zdXBwb3J0ZWQgd2Vic29ja2V0IGNvbnRyb2wgb3Bjb2RlOiAke29wY29kZX1gKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyBEYXRhIGZyYW1lIChURVhUL0JJTkFSWS9DT05USU5VQVRJT04pLiBSZWFzc2VtYmxlIGZyYWdtZW50c1xuICAgICAgLy8gYmVmb3JlIGRpc3BhdGNoaW5nLiBCcm93c2VycyAoQ2hyb21lKSBsZWdpdGltYXRlbHkgZnJhZ21lbnRcbiAgICAgIC8vIGxvbmdlciBjbGllbnTihpJzZXJ2ZXIgdGV4dCBmcmFtZXM7IGEgcHJpb3IgdmVyc2lvbiBkcm9wcGVkXG4gICAgICAvLyBldmVyeSBmcmFnbWVudGVkIG1lc3NhZ2Ugc2lsZW50bHksIHNvIGFueSBwYXlsb2FkIGxhcmdlXG4gICAgICAvLyBlbm91Z2ggdG8gaGl0IHRoZSBicm93c2VyJ3MgZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGRcbiAgICAgIC8vIChlLmcuIGEgY2hhbm5lbC1zdWJzY3JpYmUgd2l0aCBhbiBhdXRoIHRva2VuKSBuZXZlciByZWFjaGVkXG4gICAgICAvLyB0aGUgaGFuZGxlci5cbiAgICAgIGlmIChvcGNvZGUgPT09IFdFQlNPQ0tFVF9PUENPREVfQ09OVElOVUFUSU9OKSB7XG4gICAgICAgIGlmICh0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHMgPT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiUmVjZWl2ZWQgY29udGludWF0aW9uIGZyYW1lIHdpdGggbm8gZnJhZ21lbnRlZCBtZXNzYWdlIGluIHByb2dyZXNzXCIpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fYXBwZW5kRnJhZ21lbnQocGF5bG9hZCkpIHJldHVyblxuXG4gICAgICAgIGlmICghaXNGaW5hbCkgY29udGludWVcbiAgICAgIH0gZWxzZSBpZiAob3Bjb2RlID09PSBXRUJTT0NLRVRfT1BDT0RFX1RFWFQgfHwgb3Bjb2RlID09PSBXRUJTT0NLRVRfT1BDT0RFX0JJTkFSWSkge1xuICAgICAgICBpZiAodGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIlJlY2VpdmVkIG5ldyBkYXRhIGZyYW1lIHdoaWxlIGEgZnJhZ21lbnRlZCBtZXNzYWdlIHdhcyBpbiBwcm9ncmVzczsgZGlzY2FyZGluZyBwcmlvciBmcmFnbWVudHNcIilcbiAgICAgICAgICB0aGlzLl9yZXNldEZyYWdtZW50QnVmZmVyKClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNGaW5hbCkge1xuICAgICAgICAgIHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2FkcyA9IFtwYXlsb2FkXVxuICAgICAgICAgIHRoaXMuX2ZyYWdtZW50ZWRPcGNvZGUgPSBvcGNvZGVcbiAgICAgICAgICB0aGlzLl9mcmFnbWVudGVkQnl0ZXMgPSBwYXlsb2FkLmxlbmd0aFxuXG4gICAgICAgICAgaWYgKCF0aGlzLl9lbmZvcmNlRnJhZ21lbnRMaW1pdHMoKSkgcmV0dXJuXG5cbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBVbnN1cHBvcnRlZCB3ZWJzb2NrZXQgZGF0YSBvcGNvZGU6ICR7b3Bjb2RlfWApXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogRGVmaW5lcyBmaW5hbFBheWxvYWQuXG4gICAgICAgKiBAdHlwZSB7QnVmZmVyfSAqL1xuICAgICAgbGV0IGZpbmFsUGF5bG9hZFxuICAgICAgLyoqXG4gICAgICAgKiBEZWZpbmVzIGZpbmFsT3Bjb2RlLlxuICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgIGxldCBmaW5hbE9wY29kZVxuXG4gICAgICBpZiAodGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChvcGNvZGUgPT09IFdFQlNPQ0tFVF9PUENPREVfQ09OVElOVUFUSU9OKSB7XG4gICAgICAgICAgZmluYWxQYXlsb2FkID0gQnVmZmVyLmNvbmNhdCh0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHMpXG4gICAgICAgICAgZmluYWxPcGNvZGUgPSB0aGlzLl9mcmFnbWVudGVkT3Bjb2RlID8/IFdFQlNPQ0tFVF9PUENPREVfVEVYVFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbmFsUGF5bG9hZCA9IHBheWxvYWRcbiAgICAgICAgICBmaW5hbE9wY29kZSA9IG9wY29kZVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Jlc2V0RnJhZ21lbnRCdWZmZXIoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmluYWxQYXlsb2FkID0gcGF5bG9hZFxuICAgICAgICBmaW5hbE9wY29kZSA9IG9wY29kZVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxPcGNvZGUgIT09IFdFQlNPQ0tFVF9PUENPREVfVEVYVCkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBVbnN1cHBvcnRlZCB3ZWJzb2NrZXQgZGF0YSBvcGNvZGUgYWZ0ZXIgcmVhc3NlbWJseTogJHtmaW5hbE9wY29kZX1gKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBhZG1pc3Npb24gPSB0aGlzLl9hZG1pdEluYm91bmRNZXNzYWdlKGZpbmFsUGF5bG9hZC5sZW5ndGgpXG5cbiAgICAgIGlmICghYWRtaXNzaW9uKSByZXR1cm5cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IEpTT04ucGFyc2UoZmluYWxQYXlsb2FkLnRvU3RyaW5nKFwidXRmLThcIikpXG5cbiAgICAgICAgdGhpcy5faGFuZGxlTWVzc2FnZVdvcmsoe2FkbWlzc2lvbiwgbWVzc2FnZX0pLmNhdGNoKChjYXVnaHRFcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnN0IGNsaWVudEVycm9yTWVzc2FnZSA9IGNhdWdodEVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBjYXVnaHRFcnJvci5tZXNzYWdlIDogU3RyaW5nKGNhdWdodEVycm9yKVxuICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fcmVwb3J0VW5leHBlY3RlZERpc3BhdGNoRXJyb3IoY2F1Z2h0RXJyb3IsIHtcbiAgICAgICAgICAgIHN0YWdlOiBcIndlYnNvY2tldC1tZXNzYWdlLWRpc3BhdGNoXCJcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiV2Vic29ja2V0IG1lc3NhZ2UgaGFuZGxlciBmYWlsZWRcIiwgZXJyb3JdKVxuICAgICAgICAgIHRoaXMuc2VuZEpzb24oe1xuICAgICAgICAgICAgZXJyb3I6IGNsaWVudEVycm9yTWVzc2FnZSxcbiAgICAgICAgICAgIHR5cGU6IFwiZXJyb3JcIlxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLl9yZWxlYXNlSW5ib3VuZEFkbWlzc2lvbihhZG1pc3Npb24pXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIkZhaWxlZCB0byBwYXJzZSB3ZWJzb2NrZXQgbWVzc2FnZVwiLCBlcnJvcl0pXG4gICAgICAgIHRoaXMuc2VuZEpzb24oe2Vycm9yOiBcIkludmFsaWQgd2Vic29ja2V0IG1lc3NhZ2VcIiwgdHlwZTogXCJlcnJvclwifSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29waWVzIHRoZSBsZWFkaW5nIGJ1ZmZlcmVkIGJ5dGVzIHdpdGhvdXQgY29uc3VtaW5nIHRoZW0uIEhlYWRlclxuICAgKiBpbnNwZWN0aW9uIGlzIGJvdW5kZWQgdG8gdGhlIHdlYnNvY2tldCBoZWFkZXIgc2l6ZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGJ5dGVDb3VudCAtIE51bWJlciBvZiBsZWFkaW5nIGJ5dGVzIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtCdWZmZXJ9IC0gQ29waWVkIHByZWZpeC5cbiAgICovXG4gIF9wZWVrQnVmZmVyZWRCeXRlcyhieXRlQ291bnQpIHtcbiAgICBjb25zdCBwcmVmaXggPSBCdWZmZXIuYWxsb2NVbnNhZmUoYnl0ZUNvdW50KVxuICAgIGxldCBjb3BpZWRCeXRlcyA9IDBcbiAgICBsZXQgY2h1bmtPZmZzZXQgPSB0aGlzLl9idWZmZXJDaHVua09mZnNldFxuXG4gICAgZm9yIChsZXQgY2h1bmtJbmRleCA9IHRoaXMuX2J1ZmZlckNodW5rSW5kZXg7IGNodW5rSW5kZXggPCB0aGlzLl9idWZmZXJDaHVua3MubGVuZ3RoOyBjaHVua0luZGV4ICs9IDEpIHtcbiAgICAgIGNvbnN0IGNodW5rID0gdGhpcy5fYnVmZmVyQ2h1bmtzW2NodW5rSW5kZXhdXG4gICAgICBjb25zdCBieXRlc0Zyb21DaHVuayA9IE1hdGgubWluKGNodW5rLmxlbmd0aCAtIGNodW5rT2Zmc2V0LCBieXRlQ291bnQgLSBjb3BpZWRCeXRlcylcblxuICAgICAgY2h1bmsuY29weShwcmVmaXgsIGNvcGllZEJ5dGVzLCBjaHVua09mZnNldCwgY2h1bmtPZmZzZXQgKyBieXRlc0Zyb21DaHVuaylcbiAgICAgIGNvcGllZEJ5dGVzICs9IGJ5dGVzRnJvbUNodW5rXG4gICAgICBjaHVua09mZnNldCA9IDBcbiAgICAgIGlmIChjb3BpZWRCeXRlcyA9PT0gYnl0ZUNvdW50KSBicmVha1xuICAgIH1cblxuICAgIHJldHVybiBwcmVmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdW1lcyBhIGNvbXBsZXRlIGZyYW1lIGZyb20gdGhlIGNodW5rIHF1ZXVlIHdpdGggb25lIGJvdW5kZWQgY29weS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGJ5dGVDb3VudCAtIENvbXBsZXRlIGZyYW1lIGJ5dGUgY291bnQuXG4gICAqIEByZXR1cm5zIHtCdWZmZXJ9IC0gQ29udGlndW91cyBmcmFtZSBieXRlcy5cbiAgICovXG4gIF9jb25zdW1lQnVmZmVyZWRCeXRlcyhieXRlQ291bnQpIHtcbiAgICBjb25zdCByZXN1bHQgPSBCdWZmZXIuYWxsb2NVbnNhZmUoYnl0ZUNvdW50KVxuICAgIGxldCBjb3BpZWRCeXRlcyA9IDBcblxuICAgIHdoaWxlIChjb3BpZWRCeXRlcyA8IGJ5dGVDb3VudCkge1xuICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9idWZmZXJDaHVua3NbdGhpcy5fYnVmZmVyQ2h1bmtJbmRleF1cbiAgICAgIGNvbnN0IGJ5dGVzRnJvbUNodW5rID0gTWF0aC5taW4oY2h1bmsubGVuZ3RoIC0gdGhpcy5fYnVmZmVyQ2h1bmtPZmZzZXQsIGJ5dGVDb3VudCAtIGNvcGllZEJ5dGVzKVxuXG4gICAgICBjaHVuay5jb3B5KFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIGNvcGllZEJ5dGVzLFxuICAgICAgICB0aGlzLl9idWZmZXJDaHVua09mZnNldCxcbiAgICAgICAgdGhpcy5fYnVmZmVyQ2h1bmtPZmZzZXQgKyBieXRlc0Zyb21DaHVua1xuICAgICAgKVxuICAgICAgY29waWVkQnl0ZXMgKz0gYnl0ZXNGcm9tQ2h1bmtcbiAgICAgIHRoaXMuX2J1ZmZlckNodW5rT2Zmc2V0ICs9IGJ5dGVzRnJvbUNodW5rXG5cbiAgICAgIGlmICh0aGlzLl9idWZmZXJDaHVua09mZnNldCA9PT0gY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuX2J1ZmZlckNodW5rSW5kZXggKz0gMVxuICAgICAgICB0aGlzLl9idWZmZXJDaHVua09mZnNldCA9IDBcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fYnVmZmVyQ2h1bmtJbmRleCA9PT0gdGhpcy5fYnVmZmVyQ2h1bmtzLmxlbmd0aCkge1xuICAgICAgdGhpcy5fYnVmZmVyQ2h1bmtzID0gW11cbiAgICAgIHRoaXMuX2J1ZmZlckNodW5rSW5kZXggPSAwXG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHRoaXMuX2J1ZmZlckNodW5rSW5kZXggPj0gNjQgJiZcbiAgICAgIHRoaXMuX2J1ZmZlckNodW5rSW5kZXggKiAyID49IHRoaXMuX2J1ZmZlckNodW5rcy5sZW5ndGhcbiAgICApIHtcbiAgICAgIHRoaXMuX2J1ZmZlckNodW5rcyA9IHRoaXMuX2J1ZmZlckNodW5rcy5zbGljZSh0aGlzLl9idWZmZXJDaHVua0luZGV4KVxuICAgICAgdGhpcy5fYnVmZmVyQ2h1bmtJbmRleCA9IDBcbiAgICB9XG5cbiAgICB0aGlzLl9idWZmZXJlZEJ5dGVzIC09IGJ5dGVDb3VudFxuICAgIHRoaXMuX2J1ZmZlcmVkRnJhbWVDb3B5Qnl0ZXMgKz0gYnl0ZUNvdW50XG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogRHJvcHMgYWxsIGluY29tcGxldGUgZnJhbWUgY2h1bmtzLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9jbGVhckJ1ZmZlcmVkRnJhbWVDaHVua3MoKSB7XG4gICAgdGhpcy5fYnVmZmVyQ2h1bmtzID0gW11cbiAgICB0aGlzLl9idWZmZXJDaHVua0luZGV4ID0gMFxuICAgIHRoaXMuX2J1ZmZlckNodW5rT2Zmc2V0ID0gMFxuICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgPSAwXG4gIH1cblxuICAvKipcbiAgICogVGVudGF0aXZlbHkgYWRtaXRzIG9uZSBjb21wbGV0ZSB0ZXh0IG1lc3NhZ2UgYmVmb3JlIGRlY29kaW5nIGl0LlxuICAgKiBAcGFyYW0ge251bWJlcn0gYnl0ZUxlbmd0aCAtIEV4YWN0IGNvbXBsZXRlIHJhdyB0ZXh0IHBheWxvYWQgYnl0ZXMuXG4gICAqIEByZXR1cm5zIHtJbmJvdW5kTWVzc2FnZUFkbWlzc2lvbiB8IG51bGx9IC0gQWRtaXNzaW9uIG93bmVyc2hpcCwgb3IgbnVsbCBhZnRlciBvdmVybG9hZC9jbG9zZS5cbiAgICovXG4gIF9hZG1pdEluYm91bmRNZXNzYWdlKGJ5dGVMZW5ndGgpIHtcbiAgICBpZiAodGhpcy5faW5ib3VuZENsb3NlZCkgcmV0dXJuIG51bGxcblxuICAgIGlmIChcbiAgICAgIHRoaXMuX2luYm91bmRQZW5kaW5nTWVzc2FnZXMgKyAxID4gdGhpcy5faW5ib3VuZE1heFBlbmRpbmdNZXNzYWdlcyB8fFxuICAgICAgdGhpcy5faW5ib3VuZFBlbmRpbmdCeXRlcyArIGJ5dGVMZW5ndGggPiB0aGlzLl9pbmJvdW5kTWF4UGVuZGluZ0J5dGVzXG4gICAgKSB7XG4gICAgICB0aGlzLl9jbG9zZUZvckluYm91bmRCYWNrbG9nKGJ5dGVMZW5ndGgpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHRoaXMuX2luYm91bmRQZW5kaW5nTWVzc2FnZXMgKz0gMVxuICAgIHRoaXMuX2luYm91bmRQZW5kaW5nQnl0ZXMgKz0gYnl0ZUxlbmd0aFxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGJ5dGVMZW5ndGgsXG4gICAgICBnZW5lcmF0aW9uOiB0aGlzLl9pbmJvdW5kQWNjb3VudGluZ0dlbmVyYXRpb24sXG4gICAgICByZWxlYXNlZDogZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZXMgb25lIGFkbWlzc2lvbiBleGFjdGx5IG9uY2UuXG4gICAqIEBwYXJhbSB7SW5ib3VuZE1lc3NhZ2VBZG1pc3Npb259IGFkbWlzc2lvbiAtIEFkbWlzc2lvbiBvd25lcnNoaXAuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX3JlbGVhc2VJbmJvdW5kQWRtaXNzaW9uKGFkbWlzc2lvbikge1xuICAgIGlmIChhZG1pc3Npb24ucmVsZWFzZWQpIHJldHVyblxuXG4gICAgYWRtaXNzaW9uLnJlbGVhc2VkID0gdHJ1ZVxuICAgIGlmIChhZG1pc3Npb24uZ2VuZXJhdGlvbiAhPT0gdGhpcy5faW5ib3VuZEFjY291bnRpbmdHZW5lcmF0aW9uKSByZXR1cm5cblxuICAgIHRoaXMuX2luYm91bmRQZW5kaW5nTWVzc2FnZXMgLT0gMVxuICAgIHRoaXMuX2luYm91bmRQZW5kaW5nQnl0ZXMgLT0gYWRtaXNzaW9uLmJ5dGVMZW5ndGhcbiAgfVxuXG4gIC8qKlxuICAgKiBBYmFuZG9ucyBhbGwgYWRtaXR0ZWQgaW5wdXQgYW5kIGludmFsaWRhdGVzIGxhdGUgc2V0dGxlbWVudHMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX2FiYW5kb25JbmJvdW5kTWVzc2FnZXMoKSB7XG4gICAgdGhpcy5faW5ib3VuZENsb3NlZCA9IHRydWVcbiAgICB0aGlzLl9pbmJvdW5kQWNjb3VudGluZ0dlbmVyYXRpb24gKz0gMVxuICAgIHRoaXMuX2luYm91bmRQZW5kaW5nQnl0ZXMgPSAwXG4gICAgdGhpcy5faW5ib3VuZFBlbmRpbmdNZXNzYWdlcyA9IDBcbiAgICB0aGlzLm1lc3NhZ2VRdWV1ZSA9IFtdXG4gIH1cblxuICAvKipcbiAgICogUGVybWFuZW50bHkgY2xvc2VzIGEgc2Vzc2lvbiB3aG9zZSBuZXh0IG1lc3NhZ2UgZXhjZWVkZWQgaXRzIGJhY2tsb2cgYnVkZ2V0LlxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVqZWN0ZWRCeXRlcyAtIFJhdyBwYXlsb2FkIGJ5dGVzIHJlamVjdGVkIGF0IGFkbWlzc2lvbi5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfY2xvc2VGb3JJbmJvdW5kQmFja2xvZyhyZWplY3RlZEJ5dGVzKSB7XG4gICAgaWYgKHRoaXMuX2luYm91bmRCYWNrbG9nT3ZlcmxvYWRlZCB8fCB0aGlzLl9pbmJvdW5kQ2xvc2VkKSByZXR1cm5cblxuICAgIHRoaXMuX2luYm91bmRCYWNrbG9nT3ZlcmxvYWRlZCA9IHRydWVcbiAgICB0aGlzLmxvZ2dlci53YXJuKCgpID0+IFtcbiAgICAgIFwiSW5ib3VuZCB3ZWJzb2NrZXQgbWVzc2FnZSBiYWNrbG9nIGV4Y2VlZGVkOyBjbG9zaW5nIGNvbm5lY3Rpb25cIixcbiAgICAgIHtcbiAgICAgICAgbWF4Qnl0ZXM6IHRoaXMuX2luYm91bmRNYXhQZW5kaW5nQnl0ZXMsXG4gICAgICAgIG1heE1lc3NhZ2VzOiB0aGlzLl9pbmJvdW5kTWF4UGVuZGluZ01lc3NhZ2VzLFxuICAgICAgICBwZW5kaW5nQnl0ZXM6IHRoaXMuX2luYm91bmRQZW5kaW5nQnl0ZXMsXG4gICAgICAgIHBlbmRpbmdNZXNzYWdlczogdGhpcy5faW5ib3VuZFBlbmRpbmdNZXNzYWdlcyxcbiAgICAgICAgcmVqZWN0ZWRCeXRlc1xuICAgICAgfVxuICAgIF0pXG4gICAgdGhpcy5zZW5kR29vZGJ5ZSh0aGlzLmNsaWVudCwge1xuICAgICAgY29kZTogV0VCU09DS0VUX0NMT1NFX1BPTElDWV9WSU9MQVRJT04sXG4gICAgICByZWFzb246IFdFQlNPQ0tFVF9JTkJPVU5EX0JBQ0tMT0dfQ0xPU0VfUkVBU09OXG4gICAgfSlcbiAgICB0aGlzLl9oYW5kbGVDbG9zZSh7YWxsb3dSZXN1bWU6IGZhbHNlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgYWZ0ZXIgYW4gaW5ib3VuZCBidWZmZXJpbmcgbGltaXQgYW5kIHJlbGVhc2VzIGFsbCBwYXJzZXItb3duZWQgaW5wdXQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX2Nsb3NlRm9ySW5ib3VuZExpbWl0KCkge1xuICAgIHRoaXMuX3Jlc2V0RnJhZ21lbnRCdWZmZXIoKVxuICAgIHRoaXMuX2NsZWFyQnVmZmVyZWRGcmFtZUNodW5rcygpXG4gICAgdGhpcy5zZW5kR29vZGJ5ZSh0aGlzLmNsaWVudClcbiAgICB0aGlzLl9oYW5kbGVDbG9zZSgpXG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyBhIGNvbnRpbnVhdGlvbi1mcmFtZSBwYXlsb2FkIHRvIHRoZSBpbi1wcm9ncmVzc1xuICAgKiBmcmFnbWVudGVkIG1lc3NhZ2UuIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBmcmFnbWVudCB3YXMgYWNjZXB0ZWRcbiAgICogYW5kIGZhbHNlIHdoZW4gdGhlIHBlci1tZXNzYWdlIGNhcCB3YXMgaGl0IGFuZCB0aGUgc29ja2V0IGhhc1xuICAgKiBiZWVuIGNsb3NlZC5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IHBheWxvYWQgLSBDb250aW51YXRpb24tZnJhbWUgYnl0ZXMgdG8gYXBwZW5kLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBmcmFnbWVudCB3YXMgYWNjZXB0ZWQuXG4gICAqL1xuICBfYXBwZW5kRnJhZ21lbnQocGF5bG9hZCkge1xuICAgIC8vIEd1YXJkIHB1c2hpbmcgZmlyc3Qgc28gYF9lbmZvcmNlRnJhZ21lbnRMaW1pdHNgIHNlZXMgdGhlIGZpbmFsXG4gICAgLy8gc3RhdGU7IG9uIG92ZXJmbG93IHRoZSByZXNldCBpbnNpZGUgdGhlIGVuZm9yY2VyIGRyb3BzIHRoZVxuICAgIC8vIGJ1ZmZlcmVkIGZyYWdtZW50cy5cbiAgICB0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHM/LnB1c2gocGF5bG9hZClcbiAgICB0aGlzLl9mcmFnbWVudGVkQnl0ZXMgKz0gcGF5bG9hZC5sZW5ndGhcblxuICAgIHJldHVybiB0aGlzLl9lbmZvcmNlRnJhZ21lbnRMaW1pdHMoKVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBmcmFnbWVudGVkIG1lc3NhZ2UgaGFzIG5vdCBleGNlZWRlZCB0aGUgYnl0ZSBvclxuICAgKiBmcmFnbWVudC1jb3VudCBjYXBzLiBPbiBvdmVyZmxvdywgY2xlYXJzIHRoZSBidWZmZXIsIHNlbmRzIGFcbiAgICogY2xvc2UgZnJhbWUsIGFuZCB0ZWFycyB0aGUgc2Vzc2lvbiBkb3duLiBSZXR1cm5zIHRydWUgd2hlbiB0aGVcbiAgICogY2FsbGVyIGNhbiBjb250aW51ZSBwcm9jZXNzaW5nLCBmYWxzZSB3aGVuIHRoZSBzZXNzaW9uIGlzIGJlaW5nXG4gICAqIGNsb3NlZC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBmcmFnbWVudCBwcm9jZXNzaW5nIG1heSBjb250aW51ZS5cbiAgICovXG4gIF9lbmZvcmNlRnJhZ21lbnRMaW1pdHMoKSB7XG4gICAgaWYgKHRoaXMuX2ZyYWdtZW50ZWRQYXlsb2FkcyA9PT0gbnVsbCkgcmV0dXJuIHRydWVcblxuICAgIGNvbnN0IGZyYWdtZW50Q291bnQgPSB0aGlzLl9mcmFnbWVudGVkUGF5bG9hZHMubGVuZ3RoXG4gICAgY29uc3Qgb3ZlckJ5dGVzID0gdGhpcy5fZnJhZ21lbnRlZEJ5dGVzID4gV0VCU09DS0VUX01BWF9GUkFHTUVOVEVEX01FU1NBR0VfQllURVNcbiAgICBjb25zdCBvdmVyRnJhZ21lbnRzID0gZnJhZ21lbnRDb3VudCA+IFdFQlNPQ0tFVF9NQVhfRlJBR01FTlRFRF9NRVNTQUdFX0ZSQUdNRU5UU1xuXG4gICAgaWYgKCFvdmVyQnl0ZXMgJiYgIW92ZXJGcmFnbWVudHMpIHJldHVybiB0cnVlXG5cbiAgICB0aGlzLmxvZ2dlci53YXJuKCgpID0+IFtcbiAgICAgIFwiRnJhZ21lbnRlZCB3ZWJzb2NrZXQgbWVzc2FnZSBleGNlZWRlZCBjYXBzOyBjbG9zaW5nIGNvbm5lY3Rpb25cIixcbiAgICAgIHtcbiAgICAgICAgZnJhZ21lbnRCeXRlczogdGhpcy5fZnJhZ21lbnRlZEJ5dGVzLFxuICAgICAgICBmcmFnbWVudENvdW50LFxuICAgICAgICBtYXhCeXRlczogV0VCU09DS0VUX01BWF9GUkFHTUVOVEVEX01FU1NBR0VfQllURVMsXG4gICAgICAgIG1heEZyYWdtZW50czogV0VCU09DS0VUX01BWF9GUkFHTUVOVEVEX01FU1NBR0VfRlJBR01FTlRTXG4gICAgICB9XG4gICAgXSlcblxuICAgIHRoaXMuX2Nsb3NlRm9ySW5ib3VuZExpbWl0KClcblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVzZXQgZnJhZ21lbnQgYnVmZmVyLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgX3Jlc2V0RnJhZ21lbnRCdWZmZXIoKSB7XG4gICAgdGhpcy5fZnJhZ21lbnRlZFBheWxvYWRzID0gbnVsbFxuICAgIHRoaXMuX2ZyYWdtZW50ZWRPcGNvZGUgPSBudWxsXG4gICAgdGhpcy5fZnJhZ21lbnRlZEJ5dGVzID0gMFxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgcGVyLXNlc3Npb24gaGVhcnRiZWF0LiBFYWNoIHRpY2sgcGluZ3MgdGhlIGNsaWVudCBhbmRcbiAgICogcmVhcHMgdGhlIHNlc3Npb24gaWYgdGhlIHByZXZpb3VzIHBpbmcgd2VudCB1bmFuc3dlcmVkLCBzbyBhXG4gICAqIGhhbGYtb3BlbiBzb2NrZXQgKGNsaWVudCBnb25lIHdpdGhvdXQgYSBUQ1AgRklOIC8gY2xvc2UgZnJhbWUpXG4gICAqIGNhbm5vdCBsaW5nZXIgZm9yZXZlciBob2xkaW5nIGNoYW5uZWwgc3Vic2NyaXB0aW9ucy4gRGlzYWJsZWQgd2hlblxuICAgKiB0aGUgY29uZmlndXJlZCBpbnRlcnZhbCBpcyAwLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9zdGFydEhlYXJ0YmVhdCgpIHtcbiAgICBjb25zdCBpbnRlcnZhbFNlY29uZHMgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0U2Vzc2lvbkhlYXJ0YmVhdFNlY29uZHMoKVxuXG4gICAgaWYgKCFpbnRlcnZhbFNlY29uZHMgfHwgaW50ZXJ2YWxTZWNvbmRzIDw9IDApIHJldHVyblxuXG4gICAgdGhpcy5faGVhcnRiZWF0VGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLl9oZWFydGJlYXRUaWNrKCksIGludGVydmFsU2Vjb25kcyAqIDEwMDApXG5cbiAgICAvLyBEb24ndCBsZXQgdGhlIGhlYXJ0YmVhdCB0aW1lciBrZWVwIHRoZSBwcm9jZXNzIGFsaXZlLlxuICAgIGlmICh0eXBlb2YgdGhpcy5faGVhcnRiZWF0VGltZXIudW5yZWYgPT09IFwiZnVuY3Rpb25cIikgdGhpcy5faGVhcnRiZWF0VGltZXIudW5yZWYoKVxuICB9XG5cbiAgLyoqXG4gICAqIE9uZSBoZWFydGJlYXQgY3ljbGUuIFJlYXBzIHRoZSBzZXNzaW9uIHZpYSB0aGUgbm9ybWFsIGNsb3NlIHBhdGhcbiAgICogd2hlbiB0aGUgcHJldmlvdXMgcGluZyB3YXMgbm90IGFuc3dlcmVkOyBvdGhlcndpc2UgbWFya3MgaXRcbiAgICogcGVuZGluZyBhbmQgcGluZ3MgYWdhaW4uIEJyb3dzZXJzIGFuZCBSZWFjdCBOYXRpdmUgc29ja2V0cyBhbnN3ZXJcbiAgICogc2VydmVyIHBpbmdzIHdpdGggYW4gYXV0b21hdGljIHBvbmcsIHdoaWNoIGxhbmRzIGluIGBfcHJvY2Vzc0J1ZmZlcmBcbiAgICogYW5kIHJlLW1hcmtzIHRoZSBzZXNzaW9uIGFsaXZlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9oZWFydGJlYXRUaWNrKCkge1xuICAgIGlmICh0aGlzLl9wYXVzZWQgfHwgIXRoaXMuY2xpZW50Py5ldmVudHMpIHJldHVyblxuXG4gICAgaWYgKCF0aGlzLl9oZWFydGJlYXRBbGl2ZSkge1xuICAgICAgLy8gTm8gZnJhbWUgYXJyaXZlZCBzaW5jZSB0aGUgbGFzdCBwaW5nIOKAlCB0aGUgc29ja2V0IGlzIGRlYWQuXG4gICAgICAvLyBSb3V0ZSB0aHJvdWdoIGBfaGFuZGxlQ2xvc2VgIHNvIHJlc3VtYWJsZSBzdGF0ZSBzdGlsbCBwYXVzZXNcbiAgICAgIC8vIGZvciB0aGUgZ3JhY2Ugd2luZG93IGFuZCBldmVyeXRoaW5nIGVsc2UgaXMgdG9ybiBkb3duLlxuICAgICAgdGhpcy5fc3RvcEhlYXJ0YmVhdCgpXG4gICAgICB0aGlzLl9oYW5kbGVDbG9zZSgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9oZWFydGJlYXRBbGl2ZSA9IGZhbHNlXG4gICAgdGhpcy5fc2VuZENvbnRyb2xGcmFtZShXRUJTT0NLRVRfT1BDT0RFX1BJTkcsIEJ1ZmZlci5hbGxvYygwKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wcyB0aGUgcGVyLXNlc3Npb24gaGVhcnRiZWF0IHRpbWVyLCBpZiBhbnkuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX3N0b3BIZWFydGJlYXQoKSB7XG4gICAgaWYgKHRoaXMuX2hlYXJ0YmVhdFRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuX2hlYXJ0YmVhdFRpbWVyKVxuICAgICAgdGhpcy5faGVhcnRiZWF0VGltZXIgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2VuZCBjb250cm9sIGZyYW1lLlxuICAgKiBAcGFyYW0ge251bWJlcn0gb3Bjb2RlIC0gT3Bjb2RlLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gcGF5bG9hZCAtIFBheWxvYWQgZGF0YS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgX3NlbmRDb250cm9sRnJhbWUob3Bjb2RlLCBwYXlsb2FkKSB7XG4gICAgY29uc3QgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDIpXG5cbiAgICBoZWFkZXJbMF0gPSBXRUJTT0NLRVRfRklOQUxfRlJBTUUgfCBvcGNvZGVcbiAgICBoZWFkZXJbMV0gPSBwYXlsb2FkLmxlbmd0aFxuXG4gICAgdGhpcy5jbGllbnQuZXZlbnRzLmVtaXQoXCJvdXRwdXRcIiwgQnVmZmVyLmNvbmNhdChbaGVhZGVyLCBwYXlsb2FkXSksIHt3ZWJzb2NrZXRGcmFtZTogdHJ1ZX0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZW5kIGpzb24uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBib2R5IC0gUmVxdWVzdCBib2R5LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZW5kSnNvbihib2R5KSB7XG4gICAgLy8gV2hpbGUgcGF1c2VkICh3YWl0aW5nIGZvciBhIHJlc3VtZSksIHN0YXNoIGZyYW1lcyBpbiBhblxuICAgIC8vIG91dGJvdW5kIHF1ZXVlIGFuZCBmbHVzaCB0aGVtIGluIG9yZGVyIG9uIHJlc3VtZS4gQ2FwcGVkIHRvXG4gICAgLy8gcHJldmVudCBydW5hd2F5IG1lbW9yeSB1c2Ugd2hpbGUgdGhlIGNsaWVudCBpcyBvZmZsaW5lLlxuICAgIGlmICh0aGlzLl9wYXVzZWQpIHtcbiAgICAgIHRoaXMuX291dGJvdW5kUXVldWUgfHw9IFtdXG5cbiAgICAgIGlmICh0aGlzLl9vdXRib3VuZFF1ZXVlLmxlbmd0aCA+PSBXRUJTT0NLRVRfUEFVU0VEX1FVRVVFX0NBUCkge1xuICAgICAgICAvLyBEcm9wIG9sZGVzdCBzbyB0aGUgbW9zdCByZWNlbnQgYWN0aXZpdHkgd2lucyBvbiByZXN1bWUuXG4gICAgICAgIHRoaXMuX291dGJvdW5kUXVldWUuc2hpZnQoKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9vdXRib3VuZFF1ZXVlLnB1c2goYm9keSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghdGhpcy5jbGllbnQ/LmV2ZW50cykgcmV0dXJuXG5cbiAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkoYm9keSlcbiAgICBjb25zdCBwYXlsb2FkID0gQnVmZmVyLmZyb20oanNvbiwgXCJ1dGYtOFwiKVxuICAgIGxldCBoZWFkZXJcblxuICAgIGlmIChwYXlsb2FkLmxlbmd0aCA8IDEyNikge1xuICAgICAgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDIpXG4gICAgICBoZWFkZXJbMV0gPSBwYXlsb2FkLmxlbmd0aFxuICAgIH0gZWxzZSBpZiAocGF5bG9hZC5sZW5ndGggPCA2NTUzNikge1xuICAgICAgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDQpXG4gICAgICBoZWFkZXJbMV0gPSAxMjZcbiAgICAgIGhlYWRlci53cml0ZVVJbnQxNkJFKHBheWxvYWQubGVuZ3RoLCAyKVxuICAgIH0gZWxzZSB7XG4gICAgICBoZWFkZXIgPSBCdWZmZXIuYWxsb2MoMTApXG4gICAgICBoZWFkZXJbMV0gPSAxMjdcbiAgICAgIGhlYWRlci53cml0ZUJpZ1VJbnQ2NEJFKEJpZ0ludChwYXlsb2FkLmxlbmd0aCksIDIpXG4gICAgfVxuXG4gICAgaGVhZGVyWzBdID0gV0VCU09DS0VUX0ZJTkFMX0ZSQU1FIHwgV0VCU09DS0VUX09QQ09ERV9URVhUXG5cbiAgICB0aGlzLmNsaWVudC5ldmVudHMuZW1pdChcIm91dHB1dFwiLCBCdWZmZXIuY29uY2F0KFtoZWFkZXIsIHBheWxvYWRdKSwge3dlYnNvY2tldEZyYW1lOiB0cnVlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBGbHVzaGVzIHRoZSBwYXVzZWQgb3V0Ym91bmQgcXVldWUgb3ZlciB0aGUgY3VycmVudCBzb2NrZXQuXG4gICAqIENhbGxlZCBkdXJpbmcgcmVzdW1lIGFmdGVyIGBzZXNzaW9uLXJlc3VtZWRgIGhhcyBiZWVuIHNlbnQgb25cbiAgICogdGhlIE5FVyBzZXNzaW9uJ3Mgc29ja2V0IChub3QgdGhpcyBzZXNzaW9uJ3MpLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9mbHVzaE91dGJvdW5kUXVldWUoKSB7XG4gICAgY29uc3QgcXVldWUgPSB0aGlzLl9vdXRib3VuZFF1ZXVlIHx8IFtdXG5cbiAgICB0aGlzLl9vdXRib3VuZFF1ZXVlID0gW11cblxuICAgIGZvciAoY29uc3QgYm9keSBvZiBxdWV1ZSkge1xuICAgICAgdGhpcy5zZW5kSnNvbihib2R5KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHN1YnNjcmliZSB0byBjaGFubmVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHt7YWNrbm93bGVkZ2U/OiBib29sZWFuLCBjaGFubmVsSGFuZGxlcj86IGltcG9ydChcIi4uL3dlYnNvY2tldC1jaGFubmVsLmpzXCIpLmRlZmF1bHQsIGxhc3RFdmVudElkPzogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIHN1YnNjcmlwdGlvbkNoYW5uZWw/OiBzdHJpbmd9fSBbb3B0aW9uc10gLSBTdWJzY3JpYmUgb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciB0aGUgc3Vic2NyaXB0aW9uIHdhcyBhZGRlZC5cbiAgICovXG4gIGFzeW5jIHN1YnNjcmliZVRvQ2hhbm5lbChjaGFubmVsLCB7YWNrbm93bGVkZ2UgPSB0cnVlLCBjaGFubmVsSGFuZGxlciwgbGFzdEV2ZW50SWQsIHBhcmFtcywgc3Vic2NyaXB0aW9uQ2hhbm5lbH0gPSB7fSkge1xuICAgIGF3YWl0IHdlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9uKHRoaXMuY29uZmlndXJhdGlvbikubWFya0NoYW5uZWxJbnRlcmVzdGVkKGNoYW5uZWwpXG5cbiAgICBjb25zdCByZXBsYXlTdGF0ZSA9IGF3YWl0IHRoaXMuX3ByZXBhcmVSZXBsYXlTdGF0ZSh7XG4gICAgICBjaGFubmVsLFxuICAgICAgbGFzdEV2ZW50SWQsXG4gICAgICBzdWJzY3JpcHRpb25DaGFubmVsOiBzdWJzY3JpcHRpb25DaGFubmVsIHx8IGNoYW5uZWwsXG4gICAgICBzdWJzY3JpcHRpb25QYXJhbXM6IHBhcmFtc1xuICAgIH0pXG5cbiAgICBpZiAocmVwbGF5U3RhdGUgPT09IGZhbHNlKSByZXR1cm4gZmFsc2VcbiAgICBpZiAocmVwbGF5U3RhdGUpIHtcbiAgICAgIHRoaXMuY2hhbm5lbFJlcGxheVN0YXRlcy5zZXQoY2hhbm5lbCwgcmVwbGF5U3RhdGUpXG4gICAgfVxuXG4gICAgdGhpcy5hZGRTdWJzY3JpcHRpb24oY2hhbm5lbClcblxuICAgIGlmIChjaGFubmVsSGFuZGxlcikge1xuICAgICAgaWYgKCF0aGlzLnN1YnNjcmlwdGlvbkhhbmRsZXJzLmhhcyhjaGFubmVsKSkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbkhhbmRsZXJzLnNldChjaGFubmVsLCBuZXcgU2V0KCkpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSGFuZGxlcnMuZ2V0KGNoYW5uZWwpPy5hZGQoY2hhbm5lbEhhbmRsZXIpXG5cbiAgICAgIGlmICghdGhpcy5oYW5kbGVyU3Vic2NyaXB0aW9ucy5oYXMoY2hhbm5lbEhhbmRsZXIpKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlclN1YnNjcmlwdGlvbnMuc2V0KGNoYW5uZWxIYW5kbGVyLCBuZXcgU2V0KCkpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuaGFuZGxlclN1YnNjcmlwdGlvbnMuZ2V0KGNoYW5uZWxIYW5kbGVyKT8uYWRkKGNoYW5uZWwpXG4gICAgfVxuXG4gICAgaWYgKHJlcGxheVN0YXRlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLl9yZXBsYXlDaGFubmVsRXZlbnRzKHtjaGFubmVsLCByZXBsYXlTdGF0ZX0pXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCB0aGlzLl9maW5pc2hSZXBsYXlTdGF0ZShjaGFubmVsLCByZXBsYXlTdGF0ZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYWNrbm93bGVkZ2UpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe2NoYW5uZWwsIHR5cGU6IFwic3Vic2NyaWJlZFwifSlcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHNvY2tldCBjbG9zdXJlIGFuZCBvcHRpb25hbGx5IHJldGFpbnMgcmVzdW1hYmxlIHN0YXRlLlxuICAgKiBAcGFyYW0ge3thbGxvd1Jlc3VtZT86IGJvb2xlYW59fSBbb3B0aW9uc10gLSBDbG9zdXJlIGJlaGF2aW9yLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9oYW5kbGVDbG9zZSh7YWxsb3dSZXN1bWUgPSB0cnVlfSA9IHt9KSB7XG4gICAgdGhpcy5fcmVzZXRGcmFnbWVudEJ1ZmZlcigpXG4gICAgdGhpcy5fY2xlYXJCdWZmZXJlZEZyYW1lQ2h1bmtzKClcbiAgICB0aGlzLl9hYmFuZG9uSW5ib3VuZE1lc3NhZ2VzKClcblxuICAgIC8vIElmIHRoZSBzZXNzaW9uIGhhcyByZXN1bWFibGUgc3RhdGUgKGxpdmUgQ29ubmVjdGlvbiBvclxuICAgIC8vIENoYW5uZWxWMiBzdWJzY3JpcHRpb24pLCBtb3ZlIGl0IGludG8gdGhlIHBhdXNlZCByZWdpc3RyeVxuICAgIC8vIGluc3RlYWQgb2YgdGVhcmluZyBkb3duOyBhIG5ldyBzb2NrZXQgcHJlc2VudGluZyB0aGUgc2Vzc2lvbklkXG4gICAgLy8gdmlhIGBzZXNzaW9uLXJlc3VtZWAgd2l0aGluIHRoZSBncmFjZSB3aW5kb3cgd2lsbCByZWF0dGFjaC5cbiAgICBjb25zdCBoYXNSZXN1bWFibGVTdGF0ZSA9IHRoaXMuX2Nvbm5lY3Rpb25zLnNpemUgPiAwIHx8IHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnNpemUgPiAwXG5cbiAgICBpZiAoYWxsb3dSZXN1bWUgJiYgaGFzUmVzdW1hYmxlU3RhdGUgJiYgIXRoaXMuX3BhdXNlZCkge1xuICAgICAgLy8gUGF1c2VkIHNlc3Npb25zIGhhdmUgbm8gbGl2ZSBzb2NrZXQgdG8gcGluZzsgdGhlIGdyYWNlIHRpbWVyXG4gICAgICAvLyBvd25zIHRoZWlyIGV2ZW50dWFsIHRlYXJkb3duIGZyb20gaGVyZS5cbiAgICAgIHRoaXMuX3N0b3BIZWFydGJlYXQoKVxuICAgICAgdGhpcy5fcGF1c2VkID0gdHJ1ZVxuICAgICAgdGhpcy5zb2NrZXQgPSBudWxsXG4gICAgICAvLyBLaWNrIG9mZiBhdXRoLWlkZW50aXR5IGNhcHR1cmUgZm9yIHJlc3VtZSB2ZXJpZmljYXRpb24uIFJ1bnNcbiAgICAgIC8vIGluIHRoZSBiYWNrZ3JvdW5kIOKAlCBgX2hhbmRsZVNlc3Npb25SZXN1bWVgIGF3YWl0c1xuICAgICAgLy8gYF9yZXN1bWVJZGVudGl0eVByb21pc2VgIGJlZm9yZSBjb21wYXJpbmcuIFBhdXNlIHJlZ2lzdHJhdGlvblxuICAgICAgLy8gaXMgc3luY2hyb25vdXMgc28gYSByZXN1bWUgYXJyaXZpbmcgaW1tZWRpYXRlbHkgc3RpbGwgZmluZHNcbiAgICAgIC8vIHRoZSBzZXNzaW9uLlxuICAgICAgdGhpcy5fcmVzdW1lSWRlbnRpdHlQcm9taXNlID0gdGhpcy5fY2FwdHVyZVJlc3VtZUlkZW50aXR5KClcbiAgICAgIHZvaWQgdGhpcy5fZmlyZU9uRGlzY29ubmVjdCgpXG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3BhdXNlV2Vic29ja2V0U2Vzc2lvbih0aGlzKVxuICAgICAgdGhpcy5ldmVudHMuZW1pdChcImNsb3NlXCIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9zdG9wSGVhcnRiZWF0KClcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3dlYnNvY2tldFNlc3Npb25zLmRlbGV0ZSh0aGlzKVxuICAgIHZvaWQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJDbG9zZSgpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWwoKVxuICAgIHZvaWQgdGhpcy5fdGVhcmRvd25Db25uZWN0aW9ucyhcInNlc3Npb25fZGVzdHJveWVkXCIpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWxTdWJzY3JpcHRpb25zKClcbiAgICB0aGlzLmV2ZW50cy5lbWl0KFwiY2xvc2VcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYnkgdGhlIGdyYWNlIHRpbWVyIHdoZW4gdGhlIHBhdXNlZCBwZXJpb2QgZXhwaXJlcyB3aXRob3V0XG4gICAqIGEgcmVzdW1lLiBUZWFycyBkb3duIGFsbCBsaXZlIENvbm5lY3Rpb25zICsgQ2hhbm5lbCBzdWJzIGFuZFxuICAgKiBkcm9wcyB0aGUgc2Vzc2lvbi5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfZmluYWxpemVHcmFjZUV4cGlyeSgpIHtcbiAgICB0aGlzLl9zdG9wSGVhcnRiZWF0KClcbiAgICB0aGlzLl9yZXNldEZyYWdtZW50QnVmZmVyKClcbiAgICB0aGlzLl9jbGVhckJ1ZmZlcmVkRnJhbWVDaHVua3MoKVxuICAgIHRoaXMuX2FiYW5kb25JbmJvdW5kTWVzc2FnZXMoKVxuICAgIHRoaXMuY29uZmlndXJhdGlvbi5fd2Vic29ja2V0U2Vzc2lvbnMuZGVsZXRlKHRoaXMpXG4gICAgdm9pZCB0aGlzLl9ydW5NZXNzYWdlSGFuZGxlckNsb3NlKClcbiAgICB2b2lkIHRoaXMuX3RlYXJkb3duQ2hhbm5lbCgpXG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNvbm5lY3Rpb25zKFwiZ3JhY2VfZXhwaXJlZFwiKVxuICAgIHZvaWQgdGhpcy5fdGVhcmRvd25DaGFubmVsU3Vic2NyaXB0aW9ucygpXG4gICAgdGhpcy5ldmVudHMuZW1pdChcImNsb3NlXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB0aGUgY29uZmlndXJlZCBpZGVudGl0eSByZXNvbHZlciBhZ2FpbnN0IHRoaXMgc2Vzc2lvbi5cbiAgICogVGhlIHJldHVybmVkIHByb21pc2UgaXMgc3RvcmVkIGF0IHBhdXNlIHRpbWUgYW5kIGF3YWl0ZWQgYXRcbiAgICogcmVzdW1lIHRpbWUgc28gd2UgY2FuIHJlamVjdCByZXN1bWUgYXR0ZW1wdHMgZnJvbSBhIGRpZmZlcmVudFxuICAgKiBhdXRoZW50aWNhdGVkIGNhbGxlciAoc2lnbmVkIG91dCwgc3dhcHBlZCB1c2VyLCBleHBpcmVkIGNvb2tpZSkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gLSBDYXB0dXJlZCBhdXRoZW50aWNhdGVkIGlkZW50aXR5IGZvciByZXN1bWUgdmFsaWRhdGlvbi5cbiAgICovXG4gIGFzeW5jIF9jYXB0dXJlUmVzdW1lSWRlbnRpdHkoKSB7XG4gICAgY29uc3QgcmVzb2x2ZXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V2Vic29ja2V0U2Vzc2lvbklkZW50aXR5UmVzb2x2ZXI/LigpXG5cbiAgICBpZiAodHlwZW9mIHJlc29sdmVyICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiB1bmRlZmluZWRcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzb2x2ZXIodGhpcylcbiAgICB9IGNhdGNoIChjYXVnaHRFcnJvcikge1xuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLl9yZXBvcnRVbmV4cGVjdGVkRGlzcGF0Y2hFcnJvcihjYXVnaHRFcnJvciwge1xuICAgICAgICBzdGFnZTogXCJ3ZWJzb2NrZXQtc2Vzc2lvbi1pZGVudGl0eS1wYXVzZVwiXG4gICAgICB9KVxuXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJXZWJzb2NrZXQgc2Vzc2lvbiBpZGVudGl0eSByZXNvbHZlciBmYWlsZWQgYXQgcGF1c2VcIiwgZXJyb3JdKVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyBgb25EaXNjb25uZWN0YCBvbiBldmVyeSBsaXZlIENvbm5lY3Rpb24gYW5kIENoYW5uZWwgc3ViIHNvXG4gICAqIGFwcHMgY2FuIHBhdXNlIHBlci1pbnN0YW5jZSB3b3JrIHdoaWxlIHRoZSBzZXNzaW9uIGlzIHBhdXNlZC5cbiAgICogRXJyb3JzIGFyZSBsb2dnZWQsIG5vdCByZXRocm93biDigJQgb25lIGJyb2tlbiBoYW5kbGVyIG11c3Qgbm90XG4gICAqIGJsb2NrIHRoZSByZXN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9maXJlT25EaXNjb25uZWN0KCkge1xuICAgIGF3YWl0IHRoaXMuX2ZpcmVMaWZlY3ljbGVDYWxsYmFjayhcIm9uRGlzY29ubmVjdFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIGBvblJlc3VtZWAgb24gZXZlcnkgbGl2ZSBDb25uZWN0aW9uIGFuZCBDaGFubmVsIHN1YiBhZnRlclxuICAgKiBhIHN1Y2Nlc3NmdWwgYHNlc3Npb24tcmVzdW1lYCBoYW5kb2ZmLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9maXJlT25SZXN1bWUoKSB7XG4gICAgYXdhaXQgdGhpcy5fZmlyZUxpZmVjeWNsZUNhbGxiYWNrKFwib25SZXN1bWVcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZpcmUgbGlmZWN5Y2xlIGNhbGxiYWNrLlxuICAgKiBAcGFyYW0ge1wib25EaXNjb25uZWN0XCIgfCBcIm9uUmVzdW1lXCJ9IGNhbGxiYWNrTmFtZSBMaWZlY3ljbGUgY2FsbGJhY2sgdG8gZmlyZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIHdoZW4gZXZlcnkgbGl2ZSBoYW5kbGVyIGhhcyBiZWVuIGF0dGVtcHRlZC5cbiAgICovXG4gIGFzeW5jIF9maXJlTGlmZWN5Y2xlQ2FsbGJhY2soY2FsbGJhY2tOYW1lKSB7XG4gICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIHRoaXMuX2Nvbm5lY3Rpb25zLnZhbHVlcygpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjb25uZWN0aW9uW2NhbGxiYWNrTmFtZV0/LigpXG4gICAgICB9IGNhdGNoIChjYXVnaHRFcnJvcikge1xuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuX3JlcG9ydFVuZXhwZWN0ZWREaXNwYXRjaEVycm9yKGNhdWdodEVycm9yLCB7XG4gICAgICAgICAgY2FsbGJhY2tOYW1lLFxuICAgICAgICAgIGNvbm5lY3Rpb25JZDogY29ubmVjdGlvbi5jb25uZWN0aW9uSWQsXG4gICAgICAgICAgc3RhZ2U6IFwid2Vic29ja2V0LWNvbm5lY3Rpb24tbGlmZWN5Y2xlXCJcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbYCR7Y2FsbGJhY2tOYW1lfSBmYWlsZWQgZm9yICR7Y29ubmVjdGlvbi5jb25uZWN0aW9uSWR9YCwgZXJyb3JdKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qge3N1YnNjcmlwdGlvbn0gb2YgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHN1YnNjcmlwdGlvbltjYWxsYmFja05hbWVdPy4oKVxuICAgICAgfSBjYXRjaCAoY2F1Z2h0RXJyb3IpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLl9yZXBvcnRVbmV4cGVjdGVkRGlzcGF0Y2hFcnJvcihjYXVnaHRFcnJvciwge1xuICAgICAgICAgIGNhbGxiYWNrTmFtZSxcbiAgICAgICAgICBzdGFnZTogXCJ3ZWJzb2NrZXQtY2hhbm5lbC1saWZlY3ljbGVcIixcbiAgICAgICAgICBzdWJzY3JpcHRpb25JZDogc3Vic2NyaXB0aW9uLnN1YnNjcmlwdGlvbklkXG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2Ake2NhbGxiYWNrTmFtZX0gZmFpbGVkIGZvciBjaGFubmVsIHN1YiAke3N1YnNjcmlwdGlvbi5zdWJzY3JpcHRpb25JZH1gLCBlcnJvcl0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYHt0eXBlOiBcInNlc3Npb24tcmVzdW1lXCJ9YC4gVGhpcyBzZXNzaW9uICh0aGUgbmV3bHktXG4gICAqIGNyZWF0ZWQgb25lIHdob3NlIHNvY2tldCBqdXN0IGNvbm5lY3RlZCkgdHJhbnNmZXJzIHN0YXRlIGZyb21cbiAgICogdGhlIHBhdXNlZCBzZXNzaW9uIGFuZCBpbnN0cnVjdHMgdGhlIGNsaWVudCB2aWFcbiAgICogYHNlc3Npb24tcmVzdW1lZGAgb3IgYHNlc3Npb24tZ29uZWAuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBtZXNzYWdlIC0gU2Vzc2lvbi1yZXN1bWUgZnJhbWUgY29udGFpbmluZyB0aGUgcGF1c2VkIHNlc3Npb24gaWRlbnRpZmllci5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfaGFuZGxlU2Vzc2lvblJlc3VtZShtZXNzYWdlKSB7XG4gICAgY29uc3QgcmVzdW1lU2Vzc2lvbklkID0gbWVzc2FnZS5zZXNzaW9uSWRcblxuICAgIGlmICh0eXBlb2YgcmVzdW1lU2Vzc2lvbklkICE9PSBcInN0cmluZ1wiIHx8ICFyZXN1bWVTZXNzaW9uSWQpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwic2Vzc2lvbi1nb25lXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcGF1c2VkID0gdGhpcy5jb25maWd1cmF0aW9uLl9maW5kUGF1c2VkV2Vic29ja2V0U2Vzc2lvbihyZXN1bWVTZXNzaW9uSWQpXG5cbiAgICBpZiAoIXBhdXNlZCkge1xuICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJzZXNzaW9uLWdvbmVcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBBdXRoIHJlLXZlcmlmeTogY29tcGFyZSB0aGUgZnJlc2ggY2FsbGVyJ3MgaWRlbnRpdHkgYWdhaW5zdCB0aGVcbiAgICAvLyBvbmUgY2FwdHVyZWQgYXQgcGF1c2UuIE1pc21hdGNoIG1lYW5zIGEgZGlmZmVyZW50IHVzZXIgKG9yIGFcbiAgICAvLyBzaWduZWQtb3V0IHNlc3Npb24pIGlzIHRyeWluZyB0byByZWNsYWltIHN0YXRlIHRoYXQgaXNuJ3RcbiAgICAvLyB0aGVpcnMg4oCUIGRlc3Ryb3kgdGhlIHBhdXNlZCBzZXNzaW9uIG91dHJpZ2h0LlxuICAgIGNvbnN0IHJlc29sdmVyID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldFNlc3Npb25JZGVudGl0eVJlc29sdmVyPy4oKVxuXG4gICAgaWYgKHR5cGVvZiByZXNvbHZlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBwYXVzZWRJZGVudGl0eSA9IGF3YWl0IHBhdXNlZC5fcmVzdW1lSWRlbnRpdHlQcm9taXNlXG4gICAgICBsZXQgZnJlc2hJZGVudGl0eVxuXG4gICAgICB0cnkge1xuICAgICAgICBmcmVzaElkZW50aXR5ID0gYXdhaXQgcmVzb2x2ZXIodGhpcylcbiAgICAgIH0gY2F0Y2ggKGNhdWdodEVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fcmVwb3J0VW5leHBlY3RlZERpc3BhdGNoRXJyb3IoY2F1Z2h0RXJyb3IsIHtcbiAgICAgICAgICBzdGFnZTogXCJ3ZWJzb2NrZXQtc2Vzc2lvbi1pZGVudGl0eS1yZXN1bWVcIlxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBzZXNzaW9uIGlkZW50aXR5IHJlc29sdmVyIGZhaWxlZCBhdCByZXN1bWVcIiwgZXJyb3JdKVxuICAgICAgICBmcmVzaElkZW50aXR5ID0gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIGlmICghaWRlbnRpdGllc01hdGNoKHBhdXNlZElkZW50aXR5LCBmcmVzaElkZW50aXR5KSkge1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX2NsZWFyUGF1c2VkV2Vic29ja2V0U2Vzc2lvbihyZXN1bWVTZXNzaW9uSWQpXG4gICAgICAgIHBhdXNlZC5fZmluYWxpemVHcmFjZUV4cGlyeSgpXG4gICAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwic2Vzc2lvbi1nb25lXCJ9KVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX2NsZWFyUGF1c2VkV2Vic29ja2V0U2Vzc2lvbihyZXN1bWVTZXNzaW9uSWQpXG5cbiAgICAvLyBUcmFuc2ZlciByZXN1bWFibGUgc3RhdGUgb250byB0aGlzIChsaXZlKSBzZXNzaW9uLiBUaGUgcGF1c2VkXG4gICAgLy8gc2Vzc2lvbiBzaGVsbCBpcyBkaXNjYXJkZWQgYWZ0ZXIgdGhlIHRyYW5zZmVyLlxuICAgIGZvciAoY29uc3QgW2Nvbm5lY3Rpb25JZCwgY29ubmVjdGlvbl0gb2YgcGF1c2VkLl9jb25uZWN0aW9ucykge1xuICAgICAgY29ubmVjdGlvbi5zZXNzaW9uID0gdGhpc1xuICAgICAgdGhpcy5fY29ubmVjdGlvbnMuc2V0KGNvbm5lY3Rpb25JZCwgY29ubmVjdGlvbilcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtzdWJJZCwgZW50cnldIG9mIHBhdXNlZC5fY2hhbm5lbFN1YnNjcmlwdGlvbnMpIHtcbiAgICAgIGVudHJ5LnN1YnNjcmlwdGlvbi5zZXNzaW9uID0gdGhpc1xuICAgICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuc2V0KHN1YklkLCBlbnRyeSlcbiAgICB9XG5cbiAgICB0aGlzLl9tZXRhZGF0YSA9IHsuLi5wYXVzZWQuX21ldGFkYXRhfVxuICAgIHRoaXMuZGF0YSA9IHBhdXNlZC5kYXRhXG4gICAgdGhpcy5zZXNzaW9uSWQgPSByZXN1bWVTZXNzaW9uSWRcblxuICAgIC8vIFRyYW5zZmVyIGFueSBmcmFtZXMgcXVldWVkIHdoaWxlIHRoZSBwYXVzZWQgc2Vzc2lvbiBoYWQgbm9cbiAgICAvLyBzb2NrZXQuIFRoZXkgZmx1c2ggQUZURVIgc2Vzc2lvbi1yZXN1bWVkIHNvIHRoZSBjbGllbnQga25vd3NcbiAgICAvLyB3aGljaCBzZXNzaW9uIHRoZXkgYmVsb25nIHRvLlxuICAgIGNvbnN0IHF1ZXVlZCA9IHBhdXNlZC5fb3V0Ym91bmRRdWV1ZSB8fCBbXVxuXG4gICAgcGF1c2VkLl9vdXRib3VuZFF1ZXVlID0gW11cbiAgICBwYXVzZWQuX2Nvbm5lY3Rpb25zLmNsZWFyKClcbiAgICBwYXVzZWQuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmNsZWFyKClcbiAgICBwYXVzZWQuX3BhdXNlZCA9IGZhbHNlXG4gICAgcGF1c2VkLmRlc3Ryb3koKVxuXG4gICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJzZXNzaW9uLXJlc3VtZWRcIiwgc2Vzc2lvbklkOiByZXN1bWVTZXNzaW9uSWR9KVxuICAgIGZvciAoY29uc3QgYm9keSBvZiBxdWV1ZWQpIHRoaXMuc2VuZEpzb24oYm9keSlcbiAgICBhd2FpdCB0aGlzLl9maXJlT25SZXN1bWUoKVxuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIGBvbkNsb3NlKHJlYXNvbilgIG9uIGV2ZXJ5IGxpdmUgYXBwLWRlZmluZWQgY29ubmVjdGlvbiwgdGhlblxuICAgKiBkcm9wcyB0aGVtIGZyb20gdGhlIHJlZ2lzdHJ5LiBObyBuZXR3b3JrIGZyYW1lIGlzIHNlbnQg4oCUIHRoZVxuICAgKiBzb2NrZXQgaXMgYWxyZWFkeSBnb2luZyBhd2F5LlxuICAgKiBAcGFyYW0ge1wic2Vzc2lvbl9kZXN0cm95ZWRcIiB8IFwiZ3JhY2VfZXhwaXJlZFwiIHwgXCJlcnJvclwifSByZWFzb24gLSBQZXJtYW5lbnQgdGVhcmRvd24gcmVhc29uIHBhc3NlZCB0byBlYWNoIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX3RlYXJkb3duQ29ubmVjdGlvbnMocmVhc29uKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbnMgPSBbLi4udGhpcy5fY29ubmVjdGlvbnMudmFsdWVzKCldXG5cbiAgICB0aGlzLl9jb25uZWN0aW9ucy5jbGVhcigpXG5cbiAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgY29ubmVjdGlvbnMpIHtcbiAgICAgIGNvbm5lY3Rpb24uX2Nsb3NlZCA9IHRydWVcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBjb25uZWN0aW9uLm9uQ2xvc2UocmVhc29uKVxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoY2F1Z2h0RXJyb3IpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLl9yZXBvcnRVbmV4cGVjdGVkRGlzcGF0Y2hFcnJvcihjYXVnaHRFcnJvciwge1xuICAgICAgICAgIGNvbm5lY3Rpb25JZDogY29ubmVjdGlvbi5jb25uZWN0aW9uSWQsXG4gICAgICAgICAgcmVhc29uLFxuICAgICAgICAgIHN0YWdlOiBcIndlYnNvY2tldC1jb25uZWN0aW9uLXRlYXJkb3duXCJcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbYEZhaWxlZCB0byB0ZWFyIGRvd24gY29ubmVjdGlvbiAke2Nvbm5lY3Rpb24uY29ubmVjdGlvbklkfWAsIGVycm9yXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIGB7dHlwZTogXCJjb25uZWN0aW9uLW9wZW5cIn1gIG1lc3NhZ2Ug4oCUIGluc3RhbnRpYXRlcyB0aGVcbiAgICogcmVnaXN0ZXJlZCBjb25uZWN0aW9uIGNsYXNzLCBzdG9yZXMgaXQgb24gYF9jb25uZWN0aW9uc2AsIGFuZFxuICAgKiBmaXJlcyBgb25Db25uZWN0KClgLiBTZW5kcyBgY29ubmVjdGlvbi1vcGVuZWRgIG9uIHN1Y2Nlc3Mgb3JcbiAgICogYGNvbm5lY3Rpb24tZXJyb3JgIG9uIGZhaWx1cmUuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBtZXNzYWdlIC0gQ29ubmVjdGlvbi1vcGVuIGZyYW1lIG5hbWluZyB0aGUgY29ubmVjdGlvbiB0eXBlIGFuZCBpZGVudGlmaWVyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVDb25uZWN0aW9uT3BlbihtZXNzYWdlKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbklkID0gbWVzc2FnZS5jb25uZWN0aW9uSWRcbiAgICBjb25zdCBjb25uZWN0aW9uVHlwZSA9IG1lc3NhZ2UuY29ubmVjdGlvblR5cGVcbiAgICBjb25zdCBwYXJhbXMgPSBtZXNzYWdlLnBhcmFtcyB8fCB7fVxuXG4gICAgaWYgKHR5cGVvZiBjb25uZWN0aW9uSWQgIT09IFwic3RyaW5nXCIgfHwgIWNvbm5lY3Rpb25JZCkge1xuICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJlcnJvclwiLCBlcnJvcjogXCJjb25uZWN0aW9uLW9wZW4gcmVxdWlyZXMgY29ubmVjdGlvbklkXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb25uZWN0aW9uVHlwZSAhPT0gXCJzdHJpbmdcIiB8fCAhY29ubmVjdGlvblR5cGUpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IFwiY29ubmVjdGlvblR5cGUgaXMgcmVxdWlyZWRcIn0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29ubmVjdGlvbnMuaGFzKGNvbm5lY3Rpb25JZCkpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IFwiQ29ubmVjdGlvbiBpZCBhbHJlYWR5IGluIHVzZVwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IENvbm5lY3Rpb25DbGFzcyA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXZWJzb2NrZXRDb25uZWN0aW9uQ2xhc3M/Lihjb25uZWN0aW9uVHlwZSlcblxuICAgIGlmICghQ29ubmVjdGlvbkNsYXNzKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNvbm5lY3Rpb24tZXJyb3JcIiwgY29ubmVjdGlvbklkLCBtZXNzYWdlOiBgVW5rbm93biBjb25uZWN0aW9uIHR5cGU6ICR7Y29ubmVjdGlvblR5cGV9YH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb25DbGFzcyh7Y29ubmVjdGlvbklkLCBwYXJhbXMsIHNlc3Npb246IHRoaXN9KVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb24ub25Db25uZWN0KClcbiAgICAgIH0pXG4gICAgICAvLyBSZWdpc3RlciBvbmx5IGFmdGVyIG9uQ29ubmVjdCByZXNvbHZlcyBzbyBhIGNvbm5lY3Rpb24tbWVzc2FnZVxuICAgICAgLy8gY2FuIG5ldmVyIGJlIHJvdXRlZCB0byBhIHBhcnRpYWxseSBpbml0aWFsaXplZCBjb25uZWN0aW9uLlxuICAgICAgdGhpcy5fY29ubmVjdGlvbnMuc2V0KGNvbm5lY3Rpb25JZCwgY29ubmVjdGlvbilcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1vcGVuZWRcIiwgY29ubmVjdGlvbklkfSlcbiAgICB9IGNhdGNoIChjYXVnaHRFcnJvcikge1xuICAgICAgY29uc3QgY2xpZW50RXJyb3JNZXNzYWdlID0gY2F1Z2h0RXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGNhdWdodEVycm9yLm1lc3NhZ2UgOiBcIlwiXG4gICAgICBjb25zdCBlcnJvciA9IHRoaXMuX3JlcG9ydFVuZXhwZWN0ZWREaXNwYXRjaEVycm9yKGNhdWdodEVycm9yLCB7XG4gICAgICAgIGNvbm5lY3Rpb25JZCxcbiAgICAgICAgY29ubmVjdGlvblR5cGUsXG4gICAgICAgIHN0YWdlOiBcIndlYnNvY2tldC1jb25uZWN0aW9uLW9wZW5cIlxuICAgICAgfSlcblxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gb3BlbiBjb25uZWN0aW9uICR7Y29ubmVjdGlvblR5cGV9OiR7Y29ubmVjdGlvbklkfWAsIGVycm9yXSlcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IGNsaWVudEVycm9yTWVzc2FnZSB8fCBcIkZhaWxlZCB0byBvcGVuIGNvbm5lY3Rpb25cIn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYSBge3R5cGU6IFwiY29ubmVjdGlvbi1tZXNzYWdlXCJ9YCBmcm9tIHRoZSBjbGllbnQuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBtZXNzYWdlIC0gQ29ubmVjdGlvbi1tZXNzYWdlIGZyYW1lIGNvbnRhaW5pbmcgdGhlIHRhcmdldCBpZGVudGlmaWVyIGFuZCBib2R5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVDb25uZWN0aW9uTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbklkID0gbWVzc2FnZS5jb25uZWN0aW9uSWRcbiAgICBjb25zdCBjb25uZWN0aW9uID0gdHlwZW9mIGNvbm5lY3Rpb25JZCA9PT0gXCJzdHJpbmdcIiA/IHRoaXMuX2Nvbm5lY3Rpb25zLmdldChjb25uZWN0aW9uSWQpIDogbnVsbFxuXG4gICAgaWYgKCFjb25uZWN0aW9uKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNvbm5lY3Rpb24tZXJyb3JcIiwgY29ubmVjdGlvbklkLCBtZXNzYWdlOiBcIlVua25vd24gY29ubmVjdGlvbiBpZFwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBjb25uZWN0aW9uLm9uTWVzc2FnZShtZXNzYWdlLmJvZHkpXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGNhdWdodEVycm9yKSB7XG4gICAgICBjb25zdCBjbGllbnRFcnJvck1lc3NhZ2UgPSBjYXVnaHRFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gY2F1Z2h0RXJyb3IubWVzc2FnZSA6IFwiXCJcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fcmVwb3J0VW5leHBlY3RlZERpc3BhdGNoRXJyb3IoY2F1Z2h0RXJyb3IsIHtcbiAgICAgICAgY29ubmVjdGlvbklkLFxuICAgICAgICBzdGFnZTogXCJ3ZWJzb2NrZXQtY29ubmVjdGlvbi1tZXNzYWdlXCJcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgRmFpbGVkIHRvIGhhbmRsZSBjb25uZWN0aW9uLW1lc3NhZ2UgZm9yICR7Y29ubmVjdGlvbklkfWAsIGVycm9yXSlcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1lcnJvclwiLCBjb25uZWN0aW9uSWQsIG1lc3NhZ2U6IGNsaWVudEVycm9yTWVzc2FnZSB8fCBcIkZhaWxlZCB0byBoYW5kbGUgbWVzc2FnZVwifSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIGB7dHlwZTogXCJjb25uZWN0aW9uLWNsb3NlXCJ9YCBmcm9tIHRoZSBjbGllbnQg4oCUIGZpcmVzXG4gICAqIGBvbkNsb3NlKFwiY2xpZW50X2Nsb3NlXCIpYCBhbmQgY29uZmlybXMgd2l0aCBgY29ubmVjdGlvbi1jbG9zZWRgLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gbWVzc2FnZSAtIENvbm5lY3Rpb24tY2xvc2UgZnJhbWUgY29udGFpbmluZyB0aGUgdGFyZ2V0IGlkZW50aWZpZXIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX2hhbmRsZUNvbm5lY3Rpb25DbG9zZShtZXNzYWdlKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbklkID0gbWVzc2FnZS5jb25uZWN0aW9uSWRcbiAgICBjb25zdCBjb25uZWN0aW9uID0gdHlwZW9mIGNvbm5lY3Rpb25JZCA9PT0gXCJzdHJpbmdcIiA/IHRoaXMuX2Nvbm5lY3Rpb25zLmdldChjb25uZWN0aW9uSWQpIDogbnVsbFxuXG4gICAgaWYgKCFjb25uZWN0aW9uKSByZXR1cm5cblxuICAgIHRoaXMuX2Nvbm5lY3Rpb25zLmRlbGV0ZShjb25uZWN0aW9uSWQpXG4gICAgLy8gTWFyayBjbG9zZWQgYmVmb3JlIGZpcmluZyBvbkNsb3NlIHNvIGFwcCBjb2RlIGhvbGRpbmcgdGhlXG4gICAgLy8gaGFuZGxlIHNlZXMgYGlzQ2xvc2VkKCkgPT09IHRydWVgIGFuZCBjYW4ndCByZS1lbnRlciBzZW5kTWVzc2FnZS5cbiAgICBjb25uZWN0aW9uLl9jbG9zZWQgPSB0cnVlXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgY29ubmVjdGlvbi5vbkNsb3NlKFwiY2xpZW50X2Nsb3NlXCIpXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGNhdWdodEVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHRoaXMuX3JlcG9ydFVuZXhwZWN0ZWREaXNwYXRjaEVycm9yKGNhdWdodEVycm9yLCB7XG4gICAgICAgIGNvbm5lY3Rpb25JZCxcbiAgICAgICAgc3RhZ2U6IFwid2Vic29ja2V0LWNvbm5lY3Rpb24tY2xvc2VcIlxuICAgICAgfSlcblxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gdGVhciBkb3duIGNvbm5lY3Rpb24gJHtjb25uZWN0aW9uSWR9YCwgZXJyb3JdKVxuICAgIH1cblxuICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY29ubmVjdGlvbi1jbG9zZWRcIiwgY29ubmVjdGlvbklkLCByZWFzb246IFwiY2xpZW50X2Nsb3NlXCJ9KVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYHt0eXBlOiBcImNoYW5uZWwtc3Vic2NyaWJlXCJ9YCDigJQgcnVucyBgY2FuU3Vic2NyaWJlKClgLFxuICAgKiByZWdpc3RlcnMgd2l0aCB0aGUgQ29uZmlndXJhdGlvbidzIGdsb2JhbCByb3V0aW5nIHJlZ2lzdHJ5IG9uXG4gICAqIHN1Y2Nlc3MsIGFuZCBzZW5kcyBgY2hhbm5lbC1zdWJzY3JpYmVkYCBvciBgY2hhbm5lbC1lcnJvcmAuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBtZXNzYWdlIC0gQ2hhbm5lbC1zdWJzY3JpYmUgZnJhbWUgZGVzY3JpYmluZyB0aGUgcmVxdWVzdGVkIHN1YnNjcmlwdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfaGFuZGxlQ2hhbm5lbFN1YnNjcmliZShtZXNzYWdlKSB7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uSWQgPSBtZXNzYWdlLnN1YnNjcmlwdGlvbklkXG4gICAgY29uc3QgY2hhbm5lbFR5cGUgPSBtZXNzYWdlLmNoYW5uZWxUeXBlXG4gICAgY29uc3QgcGFyYW1zID0gbWVzc2FnZS5wYXJhbXMgfHwge31cbiAgICBjb25zdCBsYXN0RXZlbnRJZCA9IG1lc3NhZ2UubGFzdEV2ZW50SWRcblxuICAgIGlmICh0eXBlb2Ygc3Vic2NyaXB0aW9uSWQgIT09IFwic3RyaW5nXCIgfHwgIXN1YnNjcmlwdGlvbklkKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImVycm9yXCIsIGVycm9yOiBcImNoYW5uZWwtc3Vic2NyaWJlIHJlcXVpcmVzIHN1YnNjcmlwdGlvbklkXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjaGFubmVsVHlwZSAhPT0gXCJzdHJpbmdcIiB8fCAhY2hhbm5lbFR5cGUpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY2hhbm5lbC1lcnJvclwiLCBzdWJzY3JpcHRpb25JZCwgbWVzc2FnZTogXCJjaGFubmVsVHlwZSBpcyByZXF1aXJlZFwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5oYXMoc3Vic2NyaXB0aW9uSWQpKSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtZXJyb3JcIiwgc3Vic2NyaXB0aW9uSWQsIG1lc3NhZ2U6IFwiU3Vic2NyaXB0aW9uIGlkIGFscmVhZHkgaW4gdXNlXCJ9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgQ2hhbm5lbENsYXNzID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldENoYW5uZWxDbGFzcz8uKGNoYW5uZWxUeXBlKVxuXG4gICAgaWYgKCFDaGFubmVsQ2xhc3MpIHtcbiAgICAgIHRoaXMuc2VuZEpzb24oe3R5cGU6IFwiY2hhbm5lbC1lcnJvclwiLCBzdWJzY3JpcHRpb25JZCwgbWVzc2FnZTogYFVua25vd24gY2hhbm5lbCB0eXBlOiAke2NoYW5uZWxUeXBlfWB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gbmV3IENoYW5uZWxDbGFzcyh7c3Vic2NyaXB0aW9uSWQsIHBhcmFtcywgc2Vzc2lvbjogdGhpc30pXG5cbiAgICB0cnkge1xuICAgICAgLy8gUmVzb2x2aW5nIHRoZSB0ZW5hbnQgY2FuIHJ1biBkYXRhYmFzZSBxdWVyaWVzIChlLmcuIGxvb2tpbmcgdXAgdGhlXG4gICAgICAvLyByZWNvcmQncyBwcm9qZWN0IGFuZCB0aGUgY2FsbGVyJ3MgYWNjZXNzKSwgc28gaXQgbXVzdCBoYXBwZW4gaW5zaWRlIGFcbiAgICAgIC8vIGNvbm5lY3Rpb24gc2NvcGUuIFdpdGhvdXQgdGhpcyB0aGUgcmVzb2x2ZXIgYm9ycm93cyBhIGNvbm5lY3Rpb24gdGhhdFxuICAgICAgLy8gaXMgY2hlY2tlZCBiYWNrIGluIGJlZm9yZS93aGlsZSBpdCBxdWVyaWVzLCBpbnRlcm1pdHRlbnRseSBzdXJmYWNpbmcgYXNcbiAgICAgIC8vIFwiQ29ubmVjdGlvbiDigKYgZG9lc24ndCBleGlzdCBhbnkgbW9yZVwiIG9yIGEgZmFsc2VseSB1bmF1dGhvcml6ZWRcbiAgICAgIC8vIHN1YnNjcmlwdGlvbi5cbiAgICAgIGxldCB0ZW5hbnRcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIHRlbmFudCA9IGF3YWl0IHRoaXMuX3Jlc29sdmVUZW5hbnQoe2NoYW5uZWw6IGNoYW5uZWxUeXBlLCBwYXJhbXN9KVxuICAgICAgfSlcblxuICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJ1bldpdGhUZW5hbnQodGVuYW50LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBhbGxvd2VkID0gZmFsc2VcblxuICAgICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGFsbG93ZWQgPSBCb29sZWFuKGF3YWl0IHN1YnNjcmlwdGlvbi5jYW5TdWJzY3JpYmUoKSlcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoIWFsbG93ZWQpIHtcbiAgICAgICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtZXJyb3JcIiwgc3Vic2NyaXB0aW9uSWQsIG1lc3NhZ2U6IFwiU3Vic2NyaXB0aW9uIG5vdCBhdXRob3JpemVkXCJ9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuc2V0KHN1YnNjcmlwdGlvbklkLCB7Y2hhbm5lbFR5cGUsIHN1YnNjcmlwdGlvbn0pXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5fcmVnaXN0ZXJXZWJzb2NrZXRDaGFubmVsU3Vic2NyaXB0aW9uKGNoYW5uZWxUeXBlLCBzdWJzY3JpcHRpb24pXG5cbiAgICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IGF3YWl0IHN1YnNjcmlwdGlvbi5zdWJzY3JpYmVkKCkpXG5cbiAgICAgICAgLy8gUmVwbGF5IG1pc3NlZCBldmVudHMgQkVGT1JFIHNlbmRpbmcgY2hhbm5lbC1zdWJzY3JpYmVkIHNvXG4gICAgICAgIC8vIHRoZSBjbGllbnQga25vd3M6IGV2ZXJ5dGhpbmcgYmVmb3JlIHRoZSBjb25maXJtYXRpb24gaXNcbiAgICAgICAgLy8gcmVwbGF5ZWQsIGV2ZXJ5dGhpbmcgYWZ0ZXIgaXMgbGl2ZS5cbiAgICAgICAgaWYgKHR5cGVvZiBsYXN0RXZlbnRJZCA9PT0gXCJzdHJpbmdcIiAmJiBsYXN0RXZlbnRJZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fcmVwbGF5Q2hhbm5lbEV2ZW50c0ZvclN1YnNjcmlwdGlvbih7Y2hhbm5lbFR5cGUsIGxhc3RFdmVudElkLCBzdWJzY3JpcHRpb259KVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjaGFubmVsLXN1YnNjcmliZWRcIiwgc3Vic2NyaXB0aW9uSWR9KVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChjYXVnaHRFcnJvcikge1xuICAgICAgY29uc3QgY2xpZW50RXJyb3JNZXNzYWdlID0gY2F1Z2h0RXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGNhdWdodEVycm9yLm1lc3NhZ2UgOiBcIlwiXG5cbiAgICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmRlbGV0ZShzdWJzY3JpcHRpb25JZClcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5fdW5yZWdpc3RlcldlYnNvY2tldENoYW5uZWxTdWJzY3JpcHRpb24oY2hhbm5lbFR5cGUsIHN1YnNjcmlwdGlvbilcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fcmVwb3J0VW5leHBlY3RlZERpc3BhdGNoRXJyb3IoY2F1Z2h0RXJyb3IsIHtcbiAgICAgICAgY2hhbm5lbFR5cGUsXG4gICAgICAgIHN0YWdlOiBcIndlYnNvY2tldC1jaGFubmVsLXN1YnNjcmliZVwiLFxuICAgICAgICBzdWJzY3JpcHRpb25JZFxuICAgICAgfSlcblxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BGYWlsZWQgdG8gc3Vic2NyaWJlIGNoYW5uZWwgJHtjaGFubmVsVHlwZX06JHtzdWJzY3JpcHRpb25JZH1gLCBlcnJvcl0pXG4gICAgICB0aGlzLnNlbmRKc29uKHt0eXBlOiBcImNoYW5uZWwtZXJyb3JcIiwgc3Vic2NyaXB0aW9uSWQsIG1lc3NhZ2U6IGNsaWVudEVycm9yTWVzc2FnZSB8fCBcIkZhaWxlZCB0byBzdWJzY3JpYmVcIn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxheXMgbWlzc2VkIGV2ZW50cyBmcm9tIHRoZSBwZXJzaXN0ZW50IGV2ZW50LWxvZyBzdG9yZSBmb3IgYVxuICAgKiBjaGFubmVsIHN1YnNjcmlwdGlvbiB0aGF0IHByb3ZpZGVkIGBsYXN0RXZlbnRJZGAuIFNlbmRzIGVhY2hcbiAgICogbWlzc2VkIGV2ZW50IGFzIGEgYGNoYW5uZWwtbWVzc2FnZWAgd2l0aCBgcmVwbGF5ZWQ6IHRydWVgLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWxUeXBlIC0gQ2hhbm5lbCB0eXBlIG5hbWUgKGV2ZW50LWxvZyBrZXkpLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5sYXN0RXZlbnRJZCAtIENsaWVudCdzIGxhc3Qtc2VlbiBldmVudCBpZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiKS5kZWZhdWx0fSBhcmdzLnN1YnNjcmlwdGlvbiAtIExpdmUgc3Vic2NyaXB0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9yZXBsYXlDaGFubmVsRXZlbnRzRm9yU3Vic2NyaXB0aW9uKHtjaGFubmVsVHlwZSwgbGFzdEV2ZW50SWQsIHN1YnNjcmlwdGlvbn0pIHtcbiAgICBjb25zdCBzdG9yZSA9IHdlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9uKHRoaXMuY29uZmlndXJhdGlvbilcblxuICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5hd2FpdFBlbmRpbmdCcm9hZGNhc3RzKClcblxuICAgIGNvbnN0IGNoZWNrcG9pbnQgPSBhd2FpdCBzdG9yZS5nZXRFdmVudEJ5SWQoe2NoYW5uZWw6IGNoYW5uZWxUeXBlLCBpZDogbGFzdEV2ZW50SWR9KVxuXG4gICAgaWYgKCFjaGVja3BvaW50KSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHtcbiAgICAgICAgdHlwZTogXCJjaGFubmVsLXJlcGxheS1nYXBcIixcbiAgICAgICAgc3Vic2NyaXB0aW9uSWQ6IHN1YnNjcmlwdGlvbi5zdWJzY3JpcHRpb25JZCxcbiAgICAgICAgbGFzdEV2ZW50SWRcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjZWlsaW5nID0gYXdhaXQgc3RvcmUubGF0ZXN0U2VxdWVuY2UoY2hhbm5lbFR5cGUpXG5cbiAgICBpZiAoIWNlaWxpbmcgfHwgY2VpbGluZyA8PSBjaGVja3BvaW50LnNlcXVlbmNlKSByZXR1cm5cblxuICAgIGNvbnN0IGV2ZW50cyA9IGF3YWl0IHN0b3JlLmdldEV2ZW50c0FmdGVyKHtcbiAgICAgIGNoYW5uZWw6IGNoYW5uZWxUeXBlLFxuICAgICAgc2VxdWVuY2U6IGNoZWNrcG9pbnQuc2VxdWVuY2UsXG4gICAgICB1cFRvU2VxdWVuY2U6IGNlaWxpbmdcbiAgICB9KVxuXG4gICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgIGlmIChzdWJzY3JpcHRpb24uaXNDbG9zZWQoKSkgYnJlYWtcblxuICAgICAgc3Vic2NyaXB0aW9uLnNlbmRNZXNzYWdlKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vd2Vic29ja2V0LWNoYW5uZWwuanNcIikuV2Vic29ja2V0SnNvblZhbHVlfSAqLyAoZXZlbnQucGF5bG9hZCkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYHt0eXBlOiBcImNoYW5uZWwtdW5zdWJzY3JpYmVcIn1gIGZyb20gdGhlIGNsaWVudCDigJQgY2FsbHNcbiAgICogYHVuc3Vic2NyaWJlZCgpYCBhbmQgc2VuZHMgYGNoYW5uZWwtdW5zdWJzY3JpYmVkYC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IG1lc3NhZ2UgLSBDaGFubmVsLXVuc3Vic2NyaWJlIGZyYW1lIGNvbnRhaW5pbmcgdGhlIHN1YnNjcmlwdGlvbiBpZGVudGlmaWVyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVDaGFubmVsVW5zdWJzY3JpYmUobWVzc2FnZSkge1xuICAgIGNvbnN0IHN1YnNjcmlwdGlvbklkID0gbWVzc2FnZS5zdWJzY3JpcHRpb25JZFxuXG4gICAgaWYgKHR5cGVvZiBzdWJzY3JpcHRpb25JZCAhPT0gXCJzdHJpbmdcIikgcmV0dXJuXG5cbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmdldChzdWJzY3JpcHRpb25JZClcblxuICAgIGlmICghZW50cnkpIHJldHVyblxuXG4gICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuZGVsZXRlKHN1YnNjcmlwdGlvbklkKVxuICAgIHRoaXMuY29uZmlndXJhdGlvbi5fdW5yZWdpc3RlcldlYnNvY2tldENoYW5uZWxTdWJzY3JpcHRpb24oZW50cnkuY2hhbm5lbFR5cGUsIGVudHJ5LnN1YnNjcmlwdGlvbilcbiAgICBlbnRyeS5zdWJzY3JpcHRpb24uX2Nsb3NlZCA9IHRydWVcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4gYXdhaXQgZW50cnkuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlZCgpKVxuICAgIH0gY2F0Y2ggKGNhdWdodEVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHRoaXMuX3JlcG9ydFVuZXhwZWN0ZWREaXNwYXRjaEVycm9yKGNhdWdodEVycm9yLCB7XG4gICAgICAgIGNoYW5uZWxUeXBlOiBlbnRyeS5jaGFubmVsVHlwZSxcbiAgICAgICAgc3RhZ2U6IFwid2Vic29ja2V0LWNoYW5uZWwtdW5zdWJzY3JpYmVcIixcbiAgICAgICAgc3Vic2NyaXB0aW9uSWRcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgRmFpbGVkIHRvIHVuc3Vic2NyaWJlIGNoYW5uZWwgJHtlbnRyeS5jaGFubmVsVHlwZX06JHtzdWJzY3JpcHRpb25JZH1gLCBlcnJvcl0pXG4gICAgfVxuXG4gICAgdGhpcy5zZW5kSnNvbih7dHlwZTogXCJjaGFubmVsLXVuc3Vic2NyaWJlZFwiLCBzdWJzY3JpcHRpb25JZH0pXG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgYHVuc3Vic2NyaWJlZCgpYCBvbiBldmVyeSBsaXZlIGNoYW5uZWwtdjIgc3Vic2NyaXB0aW9uLFxuICAgKiByZW1vdmVzIHRoZW0gZnJvbSB0aGUgQ29uZmlndXJhdGlvbidzIGdsb2JhbCByZWdpc3RyeSwgYW5kXG4gICAqIGRyb3BzIHRoZSBzZXNzaW9uJ3Mgb3duIG1hcC4gTm8gbmV0d29yayBmcmFtZXMg4oCUIHRoZSBzb2NrZXRcbiAgICogaXMgYWxyZWFkeSBnb2luZyBhd2F5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF90ZWFyZG93bkNoYW5uZWxTdWJzY3JpcHRpb25zKCkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBbLi4udGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMudmFsdWVzKCldXG5cbiAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5jbGVhcigpXG5cbiAgICBmb3IgKGNvbnN0IHtjaGFubmVsVHlwZSwgc3Vic2NyaXB0aW9ufSBvZiBlbnRyaWVzKSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uX3VucmVnaXN0ZXJXZWJzb2NrZXRDaGFubmVsU3Vic2NyaXB0aW9uKGNoYW5uZWxUeXBlLCBzdWJzY3JpcHRpb24pXG4gICAgICBzdWJzY3JpcHRpb24uX2Nsb3NlZCA9IHRydWVcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IGF3YWl0IHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZWQoKSlcbiAgICAgIH0gY2F0Y2ggKGNhdWdodEVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fcmVwb3J0VW5leHBlY3RlZERpc3BhdGNoRXJyb3IoY2F1Z2h0RXJyb3IsIHtcbiAgICAgICAgICBjaGFubmVsVHlwZSxcbiAgICAgICAgICBzdGFnZTogXCJ3ZWJzb2NrZXQtY2hhbm5lbC10ZWFyZG93blwiLFxuICAgICAgICAgIHN1YnNjcmlwdGlvbklkOiBzdWJzY3JpcHRpb24uc3Vic2NyaXB0aW9uSWRcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbYEZhaWxlZCB0byB0ZWFyIGRvd24gY2hhbm5lbC12MiAke2NoYW5uZWxUeXBlfToke3N1YnNjcmlwdGlvbi5zdWJzY3JpcHRpb25JZH1gLCBlcnJvcl0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX3RlYXJkb3duQ2hhbm5lbCgpIHtcbiAgICBmb3IgKGNvbnN0IGNoYW5uZWwgb2YgdGhpcy5jaGFubmVscykge1xuICAgICAgYXdhaXQgdGhpcy5fdGVhcmRvd25TaW5nbGVDaGFubmVsKGNoYW5uZWwpXG4gICAgfVxuICAgIHRoaXMuY2hhbm5lbHMuY2xlYXIoKVxuICAgIHRoaXMuY2hhbm5lbFJlcGxheVN0YXRlcy5jbGVhcigpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB0ZWFyZG93biBzaW5nbGUgY2hhbm5lbC5cbiAgICogQHBhcmFtIHtXZWJzb2NrZXRDaGFubmVsfSBjaGFubmVsIC0gQ2hhbm5lbCBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF90ZWFyZG93blNpbmdsZUNoYW5uZWwoY2hhbm5lbCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ZW5hbnQgPSB0aGlzLmNoYW5uZWxUZW5hbnRzLmdldChjaGFubmVsKVxuXG4gICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fd2l0aENvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBjaGFubmVsPy51bnN1YnNjcmliZWQ/LigpXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGNhdWdodEVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHRoaXMuX3JlcG9ydFVuZXhwZWN0ZWREaXNwYXRjaEVycm9yKGNhdWdodEVycm9yLCB7XG4gICAgICAgIHN0YWdlOiBcIndlYnNvY2tldC1jaGFubmVsLXRlYXJkb3duXCJcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIkZhaWxlZCB0byB0ZWFyZG93biB3ZWJzb2NrZXQgY2hhbm5lbFwiLCBlcnJvcl0pXG4gICAgfVxuXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9ucyA9IHRoaXMuaGFuZGxlclN1YnNjcmlwdGlvbnMuZ2V0KGNoYW5uZWwpXG5cbiAgICBpZiAoc3Vic2NyaXB0aW9ucykge1xuICAgICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb25DaGFubmVsIG9mIHN1YnNjcmlwdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25IYW5kbGVycy5nZXQoc3Vic2NyaXB0aW9uQ2hhbm5lbCk/LmRlbGV0ZShjaGFubmVsKVxuXG4gICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbkhhbmRsZXJzLmdldChzdWJzY3JpcHRpb25DaGFubmVsKT8uc2l6ZSA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSGFuZGxlcnMuZGVsZXRlKHN1YnNjcmlwdGlvbkNoYW5uZWwpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5oYW5kbGVyU3Vic2NyaXB0aW9ucy5kZWxldGUoY2hhbm5lbClcbiAgICB9XG5cbiAgICB0aGlzLmNoYW5uZWxUZW5hbnRzLmRlbGV0ZShjaGFubmVsKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVnaXN0ZXIgY2hhbm5lbC5cbiAgICogQHBhcmFtIHtXZWJzb2NrZXRDaGFubmVsIHwgdW5kZWZpbmVkfSBjaGFubmVsIC0gQ2hhbm5lbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSB0ZW5hbnQgLSBUZW5hbnQga2V5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX3JlZ2lzdGVyQ2hhbm5lbChjaGFubmVsLCB0ZW5hbnQpIHtcbiAgICBpZiAoIWNoYW5uZWwpIHJldHVyblxuXG4gICAgdGhpcy5jaGFubmVscy5hZGQoY2hhbm5lbClcbiAgICB0aGlzLmNoYW5uZWxUZW5hbnRzLnNldChjaGFubmVsLCB0ZW5hbnQpXG4gICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJ1bldpdGhUZW5hbnQodGVuYW50LCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBjaGFubmVsPy5zdWJzY3JpYmVkPy4oKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgd2l0aCBjb25uZWN0aW9ucy5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBjYWxsYmFjayAtIENhbGxiYWNrLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX3dpdGhDb25uZWN0aW9ucyhjYWxsYmFjaykge1xuICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5lbnN1cmVDb25uZWN0aW9ucyh7bmFtZTogXCJXZWJzb2NrZXQgc2Vzc2lvblwifSwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgY2FsbGJhY2soKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBoYW5kbGUgY2hhbm5lbCBzdWJzY3JpcHRpb24uXG4gICAqIEBwYXJhbSB7e2NoYW5uZWw6IHN0cmluZywgbGFzdEV2ZW50SWQ/OiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn19IGFyZ3MgLSBTdWJzY3JpcHRpb24gYXJncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9oYW5kbGVDaGFubmVsU3Vic2NyaXB0aW9uKHtjaGFubmVsLCBsYXN0RXZlbnRJZCwgcGFyYW1zfSkge1xuICAgIGNvbnN0IHJlc29sdmVyID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldENoYW5uZWxSZXNvbHZlcj8uKClcblxuICAgIGlmICghcmVzb2x2ZXIpIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFRlbmFudCByZXNvbHV0aW9uIGNhbiBydW4gZGF0YWJhc2UgcXVlcmllcywgc28gaXQgbXVzdCBoYXBwZW4gaW5zaWRlIGFcbiAgICAgIC8vIGNvbm5lY3Rpb24gc2NvcGUgKHNlZSBfaGFuZGxlQ2hhbm5lbFN1YnNjcmliZSkuXG4gICAgICBsZXQgdGVuYW50XG4gICAgICBhd2FpdCB0aGlzLl93aXRoQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0ZW5hbnQgPSBhd2FpdCB0aGlzLl9yZXNvbHZlVGVuYW50KHtjaGFubmVsLCBwYXJhbXN9KVxuICAgICAgfSlcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJ1bldpdGhUZW5hbnQodGVuYW50LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXNvbHZlcih7XG4gICAgICAgICAgY2xpZW50OiB0aGlzLmNsaWVudCxcbiAgICAgICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgcmVxdWVzdDogdGhpcy51cGdyYWRlUmVxdWVzdCxcbiAgICAgICAgICBzdWJzY3JpcHRpb246IHtjaGFubmVsLCBwYXJhbXN9LFxuICAgICAgICAgIHdlYnNvY2tldFNlc3Npb246IHRoaXNcbiAgICAgICAgfSlcbiAgICAgIH0pXG5cbiAgICAgIGlmICghcmVzb2x2ZWQpIHtcbiAgICAgICAgdGhpcy5zZW5kSnNvbih7Y2hhbm5lbCwgZXJyb3I6IFwiU3Vic2NyaXB0aW9uIHJlamVjdGVkXCIsIHR5cGU6IFwiZXJyb3JcIn0pXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBjaGFubmVsSW5zdGFuY2UgPSB0eXBlb2YgcmVzb2x2ZWQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IG5ldyByZXNvbHZlZCh7XG4gICAgICAgICAgY2xpZW50OiB0aGlzLmNsaWVudCxcbiAgICAgICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgbGFzdEV2ZW50SWQsXG4gICAgICAgICAgcmVxdWVzdDogdGhpcy51cGdyYWRlUmVxdWVzdCxcbiAgICAgICAgICBzdWJzY3JpcHRpb25DaGFubmVsOiBjaGFubmVsLFxuICAgICAgICAgIHN1YnNjcmlwdGlvblBhcmFtczogcGFyYW1zLFxuICAgICAgICAgIHdlYnNvY2tldFNlc3Npb246IHRoaXNcbiAgICAgICAgfSlcbiAgICAgICAgOiByZXNvbHZlZFxuXG4gICAgICBpZiAoY2hhbm5lbEluc3RhbmNlICYmICEoY2hhbm5lbEluc3RhbmNlIGluc3RhbmNlb2YgV2Vic29ja2V0Q2hhbm5lbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVzb2x2ZWQgd2Vic29ja2V0IGNoYW5uZWwgbXVzdCBleHRlbmQgV2Vic29ja2V0Q2hhbm5lbFwiKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLl9yZWdpc3RlckNoYW5uZWwoY2hhbm5lbEluc3RhbmNlLCB0ZW5hbnQpXG4gICAgfSBjYXRjaCAoY2F1Z2h0RXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fcmVwb3J0VW5leHBlY3RlZERpc3BhdGNoRXJyb3IoY2F1Z2h0RXJyb3IsIHtcbiAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgc3RhZ2U6IFwid2Vic29ja2V0LWNoYW5uZWwtc3Vic2NyaXB0aW9uXCJcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oKCkgPT4gW1wiV2Vic29ja2V0IGNoYW5uZWwgc3Vic2NyaXB0aW9uIGZhaWxlZFwiLCBlcnJvcl0pXG4gICAgICB0aGlzLnNlbmRKc29uKHtjaGFubmVsLCBlcnJvcjogXCJTdWJzY3JpcHRpb24gcmVqZWN0ZWRcIiwgdHlwZTogXCJlcnJvclwifSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBwcmVwYXJlIHJlcGxheSBzdGF0ZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jaGFubmVsIC0gSW50ZXJuYWwgY2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gYXJncy5sYXN0RXZlbnRJZCAtIExhc3QgcmVjZWl2ZWQgZXZlbnQgaWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnN1YnNjcmlwdGlvbkNoYW5uZWwgLSBDbGllbnQtZmFjaW5nIGNoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4gfCB1bmRlZmluZWR9IGFyZ3Muc3Vic2NyaXB0aW9uUGFyYW1zIC0gQ2xpZW50LWZhY2luZyBwYXJhbXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGZhbHNlIHwge2J1ZmZlcmVkOiBib29sZWFuLCBjZWlsaW5nU2VxdWVuY2U6IG51bWJlciwgY2hlY2twb2ludFNlcXVlbmNlOiBudW1iZXIsIHJlcGxheWluZzogYm9vbGVhbn0gfCBudWxsPn0gLSBSZXBsYXkgc3RhdGUuXG4gICAqL1xuICBhc3luYyBfcHJlcGFyZVJlcGxheVN0YXRlKHtjaGFubmVsLCBsYXN0RXZlbnRJZCwgc3Vic2NyaXB0aW9uQ2hhbm5lbCwgc3Vic2NyaXB0aW9uUGFyYW1zfSkge1xuICAgIGlmICghbGFzdEV2ZW50SWQpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBzdG9yZSA9IHdlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9uKHRoaXMuY29uZmlndXJhdGlvbilcbiAgICBjb25zdCBjaGVja3BvaW50ID0gYXdhaXQgc3RvcmUuZ2V0RXZlbnRCeUlkKHtjaGFubmVsLCBpZDogbGFzdEV2ZW50SWR9KVxuXG4gICAgaWYgKCFjaGVja3BvaW50KSB7XG4gICAgICB0aGlzLnNlbmRKc29uKHtjaGFubmVsOiBzdWJzY3JpcHRpb25DaGFubmVsLCBsYXN0RXZlbnRJZCwgcGFyYW1zOiBzdWJzY3JpcHRpb25QYXJhbXMsIHR5cGU6IFwicmVwbGF5LWdhcFwifSlcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBidWZmZXJlZDogZmFsc2UsXG4gICAgICBjZWlsaW5nU2VxdWVuY2U6IChhd2FpdCBzdG9yZS5sYXRlc3RTZXF1ZW5jZShjaGFubmVsKSkgfHwgY2hlY2twb2ludC5zZXF1ZW5jZSxcbiAgICAgIGNoZWNrcG9pbnRTZXF1ZW5jZTogY2hlY2twb2ludC5zZXF1ZW5jZSxcbiAgICAgIHJlcGxheWluZzogdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlcGxheSBjaGFubmVsIGV2ZW50cy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge3tidWZmZXJlZDogYm9vbGVhbiwgY2VpbGluZ1NlcXVlbmNlOiBudW1iZXIsIGNoZWNrcG9pbnRTZXF1ZW5jZTogbnVtYmVyLCByZXBsYXlpbmc6IGJvb2xlYW59fSBhcmdzLnJlcGxheVN0YXRlIC0gUmVwbGF5IHN0YXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHJlcGxheSBjb21wbGV0ZXMuXG4gICAqL1xuICBhc3luYyBfcmVwbGF5Q2hhbm5lbEV2ZW50cyh7Y2hhbm5lbCwgcmVwbGF5U3RhdGV9KSB7XG4gICAgY29uc3Qgc3RvcmUgPSB3ZWJzb2NrZXRFdmVudExvZ1N0b3JlRm9yQ29uZmlndXJhdGlvbih0aGlzLmNvbmZpZ3VyYXRpb24pXG4gICAgY29uc3QgZXZlbnRzID0gYXdhaXQgc3RvcmUuZ2V0RXZlbnRzQWZ0ZXIoe1xuICAgICAgY2hhbm5lbCxcbiAgICAgIHNlcXVlbmNlOiByZXBsYXlTdGF0ZS5jaGVja3BvaW50U2VxdWVuY2UsXG4gICAgICB1cFRvU2VxdWVuY2U6IHJlcGxheVN0YXRlLmNlaWxpbmdTZXF1ZW5jZVxuICAgIH0pXG5cbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgYXdhaXQgdGhpcy5zZW5kRXZlbnQoY2hhbm5lbCwgZXZlbnQucGF5bG9hZCwge1xuICAgICAgICBjcmVhdGVkQXQ6IGV2ZW50LmNyZWF0ZWRBdCxcbiAgICAgICAgZXZlbnRJZDogZXZlbnQuaWQsXG4gICAgICAgIHJlcGxheWVkOiB0cnVlLFxuICAgICAgICBzZXF1ZW5jZTogZXZlbnQuc2VxdWVuY2VcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZmluaXNoIHJlcGxheSBzdGF0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7e2J1ZmZlcmVkOiBib29sZWFuLCBjZWlsaW5nU2VxdWVuY2U6IG51bWJlciwgY2hlY2twb2ludFNlcXVlbmNlOiBudW1iZXIsIHJlcGxheWluZzogYm9vbGVhbn19IHJlcGxheVN0YXRlIC0gUmVwbGF5IHN0YXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGJ1ZmZlcmVkIGV2ZW50cyBhcmUgZmx1c2hlZC5cbiAgICovXG4gIGFzeW5jIF9maW5pc2hSZXBsYXlTdGF0ZShjaGFubmVsLCByZXBsYXlTdGF0ZSkge1xuICAgIGNvbnN0IHN0b3JlID0gd2Vic29ja2V0RXZlbnRMb2dTdG9yZUZvckNvbmZpZ3VyYXRpb24odGhpcy5jb25maWd1cmF0aW9uKVxuXG4gICAgcmVwbGF5U3RhdGUucmVwbGF5aW5nID0gZmFsc2VcbiAgICB0aGlzLmNoYW5uZWxSZXBsYXlTdGF0ZXMuZGVsZXRlKGNoYW5uZWwpXG5cbiAgICBpZiAoIXJlcGxheVN0YXRlLmJ1ZmZlcmVkKSByZXR1cm5cblxuICAgIGNvbnN0IGxpdmVFdmVudHMgPSBhd2FpdCBzdG9yZS5nZXRFdmVudHNBZnRlcih7XG4gICAgICBjaGFubmVsLFxuICAgICAgc2VxdWVuY2U6IHJlcGxheVN0YXRlLmNlaWxpbmdTZXF1ZW5jZVxuICAgIH0pXG5cbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGxpdmVFdmVudHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZEV2ZW50KGNoYW5uZWwsIGV2ZW50LnBheWxvYWQsIHtcbiAgICAgICAgY3JlYXRlZEF0OiBldmVudC5jcmVhdGVkQXQsXG4gICAgICAgIGV2ZW50SWQ6IGV2ZW50LmlkLFxuICAgICAgICBzZXF1ZW5jZTogZXZlbnQuc2VxdWVuY2VcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVzb2x2ZSB0ZW5hbnQuXG4gICAqIEBwYXJhbSB7e2NoYW5uZWw/OiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn19IGFyZ3MgLSBUZW5hbnQgcmVzb2x1dGlvbiBhcmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPn0gLSBSZXNvbHZlZCB0ZW5hbnQuXG4gICAqL1xuICBhc3luYyBfcmVzb2x2ZVRlbmFudCh7Y2hhbm5lbCwgcGFyYW1zfSkge1xuICAgIGNvbnN0IHJlcXVlc3RQYXJhbXMgPSB0aGlzLnVwZ3JhZGVSZXF1ZXN0Py5wYXJhbXM/LigpXG4gICAgY29uc3QgbWVyZ2VkUGFyYW1zID0ge1xuICAgICAgLi4uKHJlcXVlc3RQYXJhbXMgJiYgdHlwZW9mIHJlcXVlc3RQYXJhbXMgPT09IFwib2JqZWN0XCIgPyByZXF1ZXN0UGFyYW1zIDoge30pLFxuICAgICAgLi4uKHBhcmFtcyAmJiB0eXBlb2YgcGFyYW1zID09PSBcIm9iamVjdFwiID8gcGFyYW1zIDoge30pXG4gICAgfVxuXG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7UHJvbWlzZTxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPn0gKi8gKHRoaXMuY29uZmlndXJhdGlvbi5yZXNvbHZlVGVuYW50KHtcbiAgICAgIHBhcmFtczogbWVyZ2VkUGFyYW1zLFxuICAgICAgcmVxdWVzdDogdGhpcy51cGdyYWRlUmVxdWVzdCxcbiAgICAgIHJlc3BvbnNlOiB1bmRlZmluZWQsXG4gICAgICBzdWJzY3JpcHRpb246IGNoYW5uZWwgPyB7Y2hhbm5lbCwgcGFyYW1zfSA6IHVuZGVmaW5lZFxuICAgIH0pKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdW5tYXNrIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBwYXlsb2FkIC0gUGF5bG9hZCBkYXRhLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gbWFzayAtIE1hc2suXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIF91bm1hc2tQYXlsb2FkKHBheWxvYWQsIG1hc2spIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBheWxvYWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHBheWxvYWRbaV0gXj0gbWFza1tpICUgNF1cbiAgICB9XG4gIH1cblxuICBhc3luYyBfcnVuTWVzc2FnZUhhbmRsZXJPcGVuKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5tZXNzYWdlSGFuZGxlclxuICAgICAgY29uc3Qgb25PcGVuID0gaGFuZGxlciA/IGhhbmRsZXIub25PcGVuIDogbnVsbFxuXG4gICAgICBpZiAob25PcGVuKSB7XG4gICAgICAgIGF3YWl0IG9uT3Blbih7c2Vzc2lvbjogdGhpc30pXG4gICAgICB9XG4gICAgfSBjYXRjaCAoY2F1Z2h0RXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fcmVwb3J0VW5leHBlY3RlZERpc3BhdGNoRXJyb3IoY2F1Z2h0RXJyb3IsIHtcbiAgICAgICAgc3RhZ2U6IFwid2Vic29ja2V0LW1lc3NhZ2UtaGFuZGxlci1vcGVuXCJcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBvcGVuIGhhbmRsZXIgZmFpbGVkXCIsIGVycm9yXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBydW4gbWVzc2FnZSBoYW5kbGVyIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB7V2Vic29ja2V0U2Vzc2lvbk1lc3NhZ2V9IG1lc3NhZ2UgLSBJbmNvbWluZyB3ZWJzb2NrZXQgbWVzc2FnZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9ydW5NZXNzYWdlSGFuZGxlck1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5tZXNzYWdlSGFuZGxlclxuICAgICAgY29uc3Qgb25NZXNzYWdlID0gaGFuZGxlciA/IGhhbmRsZXIub25NZXNzYWdlIDogbnVsbFxuXG4gICAgICBpZiAob25NZXNzYWdlKSB7XG4gICAgICAgIGF3YWl0IG9uTWVzc2FnZSh7bWVzc2FnZSwgc2Vzc2lvbjogdGhpc30pXG4gICAgICB9XG4gICAgfSBjYXRjaCAoY2F1Z2h0RXJyb3IpIHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyXG4gICAgICBjb25zdCBvbkVycm9yID0gaGFuZGxlciA/IGhhbmRsZXIub25FcnJvciA6IG51bGxcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fcmVwb3J0VW5leHBlY3RlZERpc3BhdGNoRXJyb3IoY2F1Z2h0RXJyb3IsIHtcbiAgICAgICAgc3RhZ2U6IFwid2Vic29ja2V0LW1lc3NhZ2UtaGFuZGxlclwiXG4gICAgICB9KVxuXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJXZWJzb2NrZXQgbWVzc2FnZSBoYW5kbGVyIGZhaWxlZFwiLCBlcnJvcl0pXG4gICAgICBpZiAoIW9uRXJyb3IpIHJldHVyblxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBvbkVycm9yKHtlcnJvciwgc2Vzc2lvbjogdGhpc30pXG4gICAgICB9IGNhdGNoIChvbkVycm9yQ2F1Z2h0RXJyb3IpIHtcbiAgICAgICAgY29uc3QgY2xpZW50RXJyb3JNZXNzYWdlID0gb25FcnJvckNhdWdodEVycm9yIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICA/IG9uRXJyb3JDYXVnaHRFcnJvci5tZXNzYWdlXG4gICAgICAgICAgOiBTdHJpbmcob25FcnJvckNhdWdodEVycm9yKVxuICAgICAgICBjb25zdCBvbkVycm9yRXJyb3IgPSB0aGlzLl9yZXBvcnRVbmV4cGVjdGVkRGlzcGF0Y2hFcnJvcihvbkVycm9yQ2F1Z2h0RXJyb3IsIHtcbiAgICAgICAgICBzdGFnZTogXCJ3ZWJzb2NrZXQtbWVzc2FnZS1oYW5kbGVyLWVycm9yXCJcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJXZWJzb2NrZXQgbWVzc2FnZSBlcnJvciBoYW5kbGVyIGZhaWxlZFwiLCBvbkVycm9yRXJyb3JdKVxuICAgICAgICB0aGlzLnNlbmRKc29uKHtcbiAgICAgICAgICBlcnJvcjogY2xpZW50RXJyb3JNZXNzYWdlLFxuICAgICAgICAgIHR5cGU6IFwiZXJyb3JcIlxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIF9ydW5NZXNzYWdlSGFuZGxlckNsb3NlKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5tZXNzYWdlSGFuZGxlclxuICAgICAgY29uc3Qgb25DbG9zZSA9IGhhbmRsZXIgPyBoYW5kbGVyLm9uQ2xvc2UgOiBudWxsXG5cbiAgICAgIGlmIChvbkNsb3NlKSB7XG4gICAgICAgIGF3YWl0IG9uQ2xvc2Uoe3Nlc3Npb246IHRoaXN9KVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGNhdWdodEVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHRoaXMuX3JlcG9ydFVuZXhwZWN0ZWREaXNwYXRjaEVycm9yKGNhdWdodEVycm9yLCB7XG4gICAgICAgIHN0YWdlOiBcIndlYnNvY2tldC1tZXNzYWdlLWhhbmRsZXItY2xvc2VcIlxuICAgICAgfSlcblxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiV2Vic29ja2V0IGNsb3NlIGhhbmRsZXIgZmFpbGVkXCIsIGVycm9yXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyByZW1vdGUgYWRkcmVzcy5cbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gLSBSZW1vdGUgYWRkcmVzcyByZXNvbHZlZCBmcm9tIHRoZSB3ZWJzb2NrZXQgdXBncmFkZSByZXF1ZXN0LlxuICAgKi9cbiAgcmVtb3RlQWRkcmVzcygpIHtcbiAgICByZXR1cm4gdGhpcy51cGdyYWRlUmVxdWVzdD8ucmVtb3RlQWRkcmVzcygpIHx8IHRoaXMuY2xpZW50LnJlbW90ZUFkZHJlc3NcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNldCBtZXNzYWdlIGhhbmRsZXIuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5XZWJzb2NrZXRNZXNzYWdlSGFuZGxlcn0gaGFuZGxlciAtIEhhbmRsZXIgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0TWVzc2FnZUhhbmRsZXIoaGFuZGxlcikge1xuICAgIHRoaXMubWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyXG4gICAgdm9pZCB0aGlzLl9ydW5NZXNzYWdlSGFuZGxlck9wZW4oKVxuICB9XG5cbiAgYXN5bmMgX3Jlc29sdmVNZXNzYWdlSGFuZGxlclByb21pc2UoKSB7XG4gICAgaWYgKCF0aGlzLm1lc3NhZ2VIYW5kbGVyUHJvbWlzZSkgcmV0dXJuXG5cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuV2Vic29ja2V0TWVzc2FnZUhhbmRsZXIgfCB2b2lkfSAqL1xuICAgIGxldCBoYW5kbGVyXG5cbiAgICB0cnkge1xuICAgICAgaGFuZGxlciA9IGF3YWl0IHRoaXMubWVzc2FnZUhhbmRsZXJQcm9taXNlXG4gICAgfSBjYXRjaCAoY2F1Z2h0RXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fcmVwb3J0VW5leHBlY3RlZERpc3BhdGNoRXJyb3IoY2F1Z2h0RXJyb3IsIHtcbiAgICAgICAgc3RhZ2U6IFwid2Vic29ja2V0LW1lc3NhZ2UtaGFuZGxlci1yZXNvbHZlclwiXG4gICAgICB9KVxuXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJXZWJzb2NrZXQgbWVzc2FnZSBoYW5kbGVyIHJlc29sdmVyIGZhaWxlZFwiLCBlcnJvcl0pXG4gICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyUHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgICAgYXdhaXQgdGhpcy5fZmluaXNoTWVzc2FnZUhhbmRsZXJSZXNvbHV0aW9uKHt1c2VIYW5kbGVyOiBmYWxzZX0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyUHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgIGlmICghaGFuZGxlcikge1xuICAgICAgYXdhaXQgdGhpcy5fZmluaXNoTWVzc2FnZUhhbmRsZXJSZXNvbHV0aW9uKHt1c2VIYW5kbGVyOiBmYWxzZX0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5faW5ib3VuZENsb3NlZCkge1xuICAgICAgdGhpcy5wZW5kaW5nTWVzc2FnZUhhbmRsZXIgPSBmYWxzZVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gSW5zdGFsbCBoYW5kbGVyIGFuZCBkcmFpbiBvbk9wZW4gYmVmb3JlIHJlcGxheWluZyBxdWV1ZWRcbiAgICAvLyBtZXNzYWdlcy4gc2V0TWVzc2FnZUhhbmRsZXIoKSBmaXJlcyBvbk9wZW4gYXMgZmlyZS1hbmQtZm9yZ2V0O1xuICAgIC8vIGF3YWl0aW5nIF9ydW5NZXNzYWdlSGFuZGxlck9wZW4oKSBkaXJlY3RseSBoZXJlIGNsb3NlcyB0aGVcbiAgICAvLyByYWNlIHdoZXJlIHF1ZXVlZCBzdWJzY3JpYmUvY29ubmVjdGlvbi0qIGZyYW1lcyB3b3VsZFxuICAgIC8vIGRpc3BhdGNoIHdoaWxlIGFuIGFzeW5jIG9uT3BlbiBpcyBzdGlsbCBzZXR0aW5nIHVwIHNlc3Npb25cbiAgICAvLyBzdGF0ZS5cbiAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyID0gaGFuZGxlclxuICAgIGF3YWl0IHRoaXMuX3J1bk1lc3NhZ2VIYW5kbGVyT3BlbigpXG4gICAgYXdhaXQgdGhpcy5fZmluaXNoTWVzc2FnZUhhbmRsZXJSZXNvbHV0aW9uKHtcbiAgICAgIHVzZUhhbmRsZXI6IHR5cGVvZiBoYW5kbGVyLm9uTWVzc2FnZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnRzIHJlc29sdmVyIGNvbXBsZXRpb24gaW50byB0aGUgRklGTyBjaGFpbiBiZWZvcmUgYWxsb3dpbmcgbmV3IGRpc3BhdGNoLlxuICAgKiBAcGFyYW0ge3t1c2VIYW5kbGVyOiBib29sZWFufX0gYXJncyAtIFJlc29sdmVyIHJlc3VsdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgcXVldWVkIG1lc3NhZ2VzIGRyYWluLlxuICAgKi9cbiAgYXN5bmMgX2ZpbmlzaE1lc3NhZ2VIYW5kbGVyUmVzb2x1dGlvbih7dXNlSGFuZGxlcn0pIHtcbiAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMuX21lc3NhZ2VDaGFpblxuICAgIGNvbnN0IGRyYWluID0gcHJldmlvdXMudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICB0aGlzLnBlbmRpbmdNZXNzYWdlSGFuZGxlciA9IGZhbHNlXG4gICAgICBpZiAodGhpcy5faW5ib3VuZENsb3NlZCkge1xuICAgICAgICB0aGlzLm1lc3NhZ2VRdWV1ZSA9IFtdXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLl9mbHVzaFF1ZXVlZE1lc3NhZ2VzKHt1c2VIYW5kbGVyfSlcbiAgICB9KVxuXG4gICAgdGhpcy5fbWVzc2FnZUNoYWluID0gZHJhaW4uY2F0Y2goKCkgPT4ge30pXG4gICAgYXdhaXQgZHJhaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZsdXNoIHF1ZXVlZCBtZXNzYWdlcy5cbiAgICogQHBhcmFtIHt7dXNlSGFuZGxlcjogYm9vbGVhbn19IGFyZ3MgLSBBcmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX2ZsdXNoUXVldWVkTWVzc2FnZXMoe3VzZUhhbmRsZXJ9KSB7XG4gICAgaWYgKHRoaXMubWVzc2FnZVF1ZXVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICBjb25zdCBxdWV1ZWQgPSB0aGlzLm1lc3NhZ2VRdWV1ZVxuICAgIHRoaXMubWVzc2FnZVF1ZXVlID0gW11cblxuICAgIGZvciAoY29uc3Qgd29yayBvZiBxdWV1ZWQpIHtcbiAgICAgIGlmICh0aGlzLl9pbmJvdW5kQ2xvc2VkKSB7XG4gICAgICAgIHRoaXMuX3JlbGVhc2VJbmJvdW5kQWRtaXNzaW9uKHdvcmsuYWRtaXNzaW9uKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAodXNlSGFuZGxlciAmJiB0aGlzLm1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fcnVuTWVzc2FnZUhhbmRsZXJNZXNzYWdlKHdvcmsubWVzc2FnZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLl9kaXNwYXRjaE1lc3NhZ2Uod29yay5tZXNzYWdlKVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChjYXVnaHRFcnJvcikge1xuICAgICAgICBjb25zdCBjbGllbnRFcnJvck1lc3NhZ2UgPSBjYXVnaHRFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gY2F1Z2h0RXJyb3IubWVzc2FnZSA6IFN0cmluZyhjYXVnaHRFcnJvcilcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLl9yZXBvcnRVbmV4cGVjdGVkRGlzcGF0Y2hFcnJvcihjYXVnaHRFcnJvciwge1xuICAgICAgICAgIHN0YWdlOiBcIndlYnNvY2tldC1tZXNzYWdlLWRpc3BhdGNoXCJcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJXZWJzb2NrZXQgbWVzc2FnZSBoYW5kbGVyIGZhaWxlZFwiLCBlcnJvcl0pXG4gICAgICAgIHRoaXMuc2VuZEpzb24oe1xuICAgICAgICAgIGVycm9yOiBjbGllbnRFcnJvck1lc3NhZ2UsXG4gICAgICAgICAgdHlwZTogXCJlcnJvclwiXG4gICAgICAgIH0pXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLl9yZWxlYXNlSW5ib3VuZEFkbWlzc2lvbih3b3JrLmFkbWlzc2lvbilcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
|