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
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// @ts-check
|
|
2
2
|
import UUID from "pure-uuid";
|
|
3
|
+
import HasManyRelationship from "./relationships/has-many.js";
|
|
3
4
|
/**
|
|
4
5
|
* Global audit event bus matching ActiveRecordAuditable::Events.
|
|
5
6
|
* @typedef {object} AuditEventsType
|
|
@@ -9,7 +10,7 @@ import UUID from "pure-uuid";
|
|
|
9
10
|
*/
|
|
10
11
|
/**
|
|
11
12
|
* AuditChanges type.
|
|
12
|
-
* @typedef {Record<string,
|
|
13
|
+
* @typedef {Record<string, ReturnType<typeof JSON.parse>>} AuditChanges
|
|
13
14
|
*/
|
|
14
15
|
/**
|
|
15
16
|
* AuditEventPayload type.
|
|
@@ -17,7 +18,7 @@ import UUID from "pure-uuid";
|
|
|
17
18
|
* @property {string} action - Audit action name.
|
|
18
19
|
* @property {number | string} auditId - Created audit row id.
|
|
19
20
|
* @property {AuditChanges | null} auditedChanges - Changes captured for the audit.
|
|
20
|
-
* @property {Record<string,
|
|
21
|
+
* @property {Record<string, ReturnType<typeof JSON.parse>> | null} params - Optional caller-supplied audit params.
|
|
21
22
|
* @property {import("./index.js").default} record - Audited record.
|
|
22
23
|
*/
|
|
23
24
|
/**
|
|
@@ -29,7 +30,7 @@ import UUID from "pure-uuid";
|
|
|
29
30
|
* @typedef {object} CreateAuditArgs
|
|
30
31
|
* @property {string} action - Audit action name.
|
|
31
32
|
* @property {AuditChanges | null} [auditedChanges] - Explicit changes to persist.
|
|
32
|
-
* @property {Record<string,
|
|
33
|
+
* @property {Record<string, ReturnType<typeof JSON.parse>> | null} [params] - Optional metadata to store with the audit.
|
|
33
34
|
*/
|
|
34
35
|
/**
|
|
35
36
|
* AuditedModelClass type.
|
|
@@ -48,11 +49,15 @@ import UUID from "pure-uuid";
|
|
|
48
49
|
* @property {string} foreignKey - Column name that references the audited model.
|
|
49
50
|
* @property {typeof import("./index.js").default} auditClass - The audit model class to use.
|
|
50
51
|
*/
|
|
51
|
-
/** @type {Map<string, boolean
|
|
52
|
-
const
|
|
52
|
+
/** @type {WeakMap<import("../../configuration.js").default, Map<string, boolean>>} */
|
|
53
|
+
const dedicatedTableCacheByConfiguration = new WeakMap();
|
|
54
|
+
/** @type {WeakMap<AuditedModelClass, Map<string, AuditTableData>>} */
|
|
55
|
+
const auditTableDataByModel = new WeakMap();
|
|
53
56
|
/** @type {Map<string, typeof import("./index.js").default>} */
|
|
54
57
|
const auditClassCache = new Map();
|
|
55
58
|
const generatedAuditRelationships = new WeakSet();
|
|
59
|
+
/** @type {WeakMap<AuditedModelClass, Map<string, HasManyRelationship>>} */
|
|
60
|
+
const auditRelationshipsByModel = new WeakMap();
|
|
56
61
|
// ---------------------------------------------------------------------------
|
|
57
62
|
// Global event bus (like ActiveRecordAuditable::Events)
|
|
58
63
|
// ---------------------------------------------------------------------------
|
|
@@ -123,20 +128,30 @@ function dedicatedAuditTableName(modelClass) {
|
|
|
123
128
|
* Called lazily on first createAudit / withoutAudit / relationship usage.
|
|
124
129
|
* @param {AuditedModelClass} modelClass - Audited model class.
|
|
125
130
|
* @param {import("../drivers/base.js").default} [connection] - Explicit record-owned connection.
|
|
131
|
+
* @param {import("../operation.js").default} [operation] - Explicit record operation.
|
|
126
132
|
* @returns {Promise<AuditTableData>} Resolved audit table metadata.
|
|
127
133
|
*/
|
|
128
|
-
async function resolveAuditTableData(modelClass, connection) {
|
|
129
|
-
if (modelClass._auditTableResolved && modelClass._auditTableData) {
|
|
130
|
-
return modelClass._auditTableData;
|
|
131
|
-
}
|
|
134
|
+
async function resolveAuditTableData(modelClass, connection, operation) {
|
|
132
135
|
const resolvedConnection = connection || modelClass.connection();
|
|
133
|
-
const
|
|
136
|
+
const databaseIdentity = auditDatabaseIdentity(modelClass, resolvedConnection, operation);
|
|
137
|
+
let tableDataByIdentity = auditTableDataByModel.get(modelClass);
|
|
138
|
+
if (!tableDataByIdentity) {
|
|
139
|
+
tableDataByIdentity = new Map();
|
|
140
|
+
auditTableDataByModel.set(modelClass, tableDataByIdentity);
|
|
141
|
+
}
|
|
142
|
+
const cachedTableData = tableDataByIdentity.get(databaseIdentity);
|
|
143
|
+
if (cachedTableData) {
|
|
144
|
+
registerAuditRelationship(modelClass, cachedTableData, databaseIdentity);
|
|
145
|
+
return cachedTableData;
|
|
146
|
+
}
|
|
147
|
+
const tableData = await buildAuditTableData(modelClass, resolvedConnection, databaseIdentity);
|
|
134
148
|
const configuration = modelClass._getConfiguration();
|
|
135
149
|
tableData.auditClass.registerRecordClass({ configuration });
|
|
136
150
|
await tableData.auditClass.initializeRecord({ configuration, connection: resolvedConnection });
|
|
137
151
|
modelClass._auditTableData = tableData;
|
|
138
152
|
modelClass._auditTableResolved = true;
|
|
139
|
-
|
|
153
|
+
tableDataByIdentity.set(databaseIdentity, tableData);
|
|
154
|
+
registerAuditRelationship(modelClass, tableData, databaseIdentity);
|
|
140
155
|
return tableData;
|
|
141
156
|
}
|
|
142
157
|
/**
|
|
@@ -145,11 +160,12 @@ async function resolveAuditTableData(modelClass, connection) {
|
|
|
145
160
|
* dynamic class.
|
|
146
161
|
* @param {AuditedModelClass} modelClass - Audited model class.
|
|
147
162
|
* @param {import("../drivers/base.js").default} connection - Explicit record-owned connection.
|
|
163
|
+
* @param {string} databaseIdentity - Captured physical database identity.
|
|
148
164
|
* @returns {Promise<AuditTableData>} Audit table metadata.
|
|
149
165
|
*/
|
|
150
|
-
async function buildAuditTableData(modelClass, connection) {
|
|
166
|
+
async function buildAuditTableData(modelClass, connection, databaseIdentity) {
|
|
151
167
|
const dedicatedTable = dedicatedAuditTableName(modelClass);
|
|
152
|
-
const dedicatedExists = await dedicatedTableExistsForConnection(modelClass, dedicatedTable, connection);
|
|
168
|
+
const dedicatedExists = await dedicatedTableExistsForConnection(modelClass, dedicatedTable, connection, databaseIdentity);
|
|
153
169
|
if (dedicatedExists) {
|
|
154
170
|
const auditClass = dedicatedAuditClass(modelClass, dedicatedTable);
|
|
155
171
|
const modelKey = modelParamKey(modelClass);
|
|
@@ -179,14 +195,20 @@ async function buildAuditTableData(modelClass, connection) {
|
|
|
179
195
|
}
|
|
180
196
|
/**
|
|
181
197
|
* Checks whether a dedicated audit table exists for a model's connection.
|
|
182
|
-
* @param {AuditedModelClass} modelClass - Audited model class.
|
|
198
|
+
* @param {AuditedModelClass} modelClass - Audited model class owning the Configuration.
|
|
183
199
|
* @param {string} tableName - Dedicated audit table name to check.
|
|
184
200
|
* @param {import("../drivers/base.js").default} connection - Explicit record-owned connection.
|
|
201
|
+
* @param {string} databaseIdentity - Captured physical database identity.
|
|
185
202
|
* @returns {Promise<boolean>} Whether the table exists.
|
|
186
203
|
*/
|
|
187
|
-
async function dedicatedTableExistsForConnection(modelClass, tableName, connection) {
|
|
188
|
-
const
|
|
189
|
-
const cacheKey = `${
|
|
204
|
+
async function dedicatedTableExistsForConnection(modelClass, tableName, connection, databaseIdentity) {
|
|
205
|
+
const configuration = modelClass._getConfiguration();
|
|
206
|
+
const cacheKey = `${databaseIdentity}:${tableName}`;
|
|
207
|
+
let dedicatedTableCache = dedicatedTableCacheByConfiguration.get(configuration);
|
|
208
|
+
if (!dedicatedTableCache) {
|
|
209
|
+
dedicatedTableCache = new Map();
|
|
210
|
+
dedicatedTableCacheByConfiguration.set(configuration, dedicatedTableCache);
|
|
211
|
+
}
|
|
190
212
|
const cached = dedicatedTableCache.get(cacheKey);
|
|
191
213
|
if (typeof cached === "boolean") {
|
|
192
214
|
return cached;
|
|
@@ -196,6 +218,22 @@ async function dedicatedTableExistsForConnection(modelClass, tableName, connecti
|
|
|
196
218
|
dedicatedTableCache.set(cacheKey, exists);
|
|
197
219
|
return exists;
|
|
198
220
|
}
|
|
221
|
+
/**
|
|
222
|
+
* Resolves a cache identity from explicit operation ownership or the actual
|
|
223
|
+
* stamped pool connection. Ambient tenant state is never used when an
|
|
224
|
+
* operation is available.
|
|
225
|
+
* @param {AuditedModelClass} modelClass - Audited model class.
|
|
226
|
+
* @param {import("../drivers/base.js").default} connection - Actual connection.
|
|
227
|
+
* @param {import("../operation.js").default} [operation] - Explicit operation.
|
|
228
|
+
* @returns {string} - Physical database identity.
|
|
229
|
+
*/
|
|
230
|
+
function auditDatabaseIdentity(modelClass, connection, operation) {
|
|
231
|
+
if (operation)
|
|
232
|
+
return operation.databaseIdentity();
|
|
233
|
+
const databaseIdentifier = modelClass.getDatabaseIdentifier();
|
|
234
|
+
const pool = modelClass._getConfiguration().getDatabasePool(databaseIdentifier);
|
|
235
|
+
return `${databaseIdentifier}:${pool.getConnectionConfigurationReuseKey(connection)}`;
|
|
236
|
+
}
|
|
199
237
|
// ---------------------------------------------------------------------------
|
|
200
238
|
// Dynamic audit classes
|
|
201
239
|
// ---------------------------------------------------------------------------
|
|
@@ -375,18 +413,14 @@ function shouldResolveAuditTableData(modelClass) {
|
|
|
375
413
|
* Registers the audits relationship without forcing audit table detection.
|
|
376
414
|
* @param {AuditedModelClass} modelClass - Model class to audit.
|
|
377
415
|
* @param {AuditTableData} [tableData] - Resolved audit table data when available.
|
|
416
|
+
* @param {string} [databaseIdentity] - Resolved physical database identity.
|
|
378
417
|
* @returns {void}
|
|
379
418
|
*/
|
|
380
|
-
function registerAuditRelationship(modelClass, tableData = defaultAuditRelationshipTableData(modelClass)) {
|
|
419
|
+
function registerAuditRelationship(modelClass, tableData = defaultAuditRelationshipTableData(modelClass), databaseIdentity) {
|
|
381
420
|
if (modelClass._relationshipExists("audits")) {
|
|
382
421
|
const relationship = modelClass.getRelationshipByName("audits");
|
|
383
|
-
if (generatedAuditRelationships.has(relationship)) {
|
|
384
|
-
|
|
385
|
-
relationship.klass = tableData.auditClass;
|
|
386
|
-
relationship.foreignKey = tableData.foreignKey;
|
|
387
|
-
relationship._explicitForeignKey = tableData.foreignKey;
|
|
388
|
-
relationship._polymorphic = !tableData.dedicated;
|
|
389
|
-
relationship._polymorphicTypeColumn = undefined;
|
|
422
|
+
if (generatedAuditRelationships.has(relationship) && databaseIdentity) {
|
|
423
|
+
auditRelationshipMap(modelClass).set(databaseIdentity, buildAuditRelationship(modelClass, tableData));
|
|
390
424
|
}
|
|
391
425
|
return;
|
|
392
426
|
}
|
|
@@ -395,7 +429,48 @@ function registerAuditRelationship(modelClass, tableData = defaultAuditRelations
|
|
|
395
429
|
klass: tableData.auditClass,
|
|
396
430
|
polymorphic: !tableData.dedicated
|
|
397
431
|
});
|
|
398
|
-
|
|
432
|
+
const relationship = modelClass.getRelationshipByName("audits");
|
|
433
|
+
generatedAuditRelationships.add(relationship);
|
|
434
|
+
relationship.setRecordResolver((record) => {
|
|
435
|
+
const relationships = auditRelationshipMap(modelClass);
|
|
436
|
+
const operation = record.databaseOperation();
|
|
437
|
+
if (operation)
|
|
438
|
+
return relationships.get(operation.databaseIdentity()) || relationship;
|
|
439
|
+
if (relationships.size === 1)
|
|
440
|
+
return [...relationships.values()][0];
|
|
441
|
+
const identity = auditDatabaseIdentity(modelClass, record.connection());
|
|
442
|
+
return relationships.get(identity) || relationship;
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Returns physical audit relationship variants for a model.
|
|
447
|
+
* @param {AuditedModelClass} modelClass - Audited model class.
|
|
448
|
+
* @returns {Map<string, HasManyRelationship>} - Relationships keyed by physical database identity.
|
|
449
|
+
*/
|
|
450
|
+
function auditRelationshipMap(modelClass) {
|
|
451
|
+
let relationships = auditRelationshipsByModel.get(modelClass);
|
|
452
|
+
if (!relationships) {
|
|
453
|
+
relationships = new Map();
|
|
454
|
+
auditRelationshipsByModel.set(modelClass, relationships);
|
|
455
|
+
}
|
|
456
|
+
return relationships;
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* Builds immutable-by-ownership audit relationship metadata for one physical database.
|
|
460
|
+
* @param {AuditedModelClass} modelClass - Audited model class.
|
|
461
|
+
* @param {AuditTableData} tableData - Resolved audit table data.
|
|
462
|
+
* @returns {HasManyRelationship} - Physical relationship definition.
|
|
463
|
+
*/
|
|
464
|
+
function buildAuditRelationship(modelClass, tableData) {
|
|
465
|
+
return new HasManyRelationship({
|
|
466
|
+
foreignKey: tableData.foreignKey,
|
|
467
|
+
klass: tableData.auditClass,
|
|
468
|
+
modelClass,
|
|
469
|
+
polymorphic: !tableData.dedicated,
|
|
470
|
+
relationshipName: "audits",
|
|
471
|
+
scope: auditRelationshipScope,
|
|
472
|
+
type: "hasMany"
|
|
473
|
+
});
|
|
399
474
|
}
|
|
400
475
|
/**
|
|
401
476
|
* Returns unresolved shared-audit defaults for early relationship registration.
|
|
@@ -444,6 +519,9 @@ function canResolveAuditTableData(modelClass) {
|
|
|
444
519
|
*/
|
|
445
520
|
async function createAudit(record, args) {
|
|
446
521
|
const modelClass = /** @type {AuditedModelClass} */ (record.getModelClass());
|
|
522
|
+
const operation = record.databaseOperation();
|
|
523
|
+
if (operation)
|
|
524
|
+
return await createAuditWithCurrentConnection(record, args, modelClass);
|
|
447
525
|
return await modelClass._getConfiguration().ensureConnections({ name: `${modelClass.getModelName()} audit` }, async () => {
|
|
448
526
|
return await createAuditWithCurrentConnection(record, args, modelClass);
|
|
449
527
|
});
|
|
@@ -460,7 +538,7 @@ async function createAuditWithCurrentConnection(record, args, modelClass) {
|
|
|
460
538
|
if (!record.isPersisted())
|
|
461
539
|
throw new Error(`Cannot audit unpersisted ${modelClass.getModelName()} record`);
|
|
462
540
|
const db = record.connection();
|
|
463
|
-
const tableData = await resolveAuditTableData(modelClass, db);
|
|
541
|
+
const tableData = await resolveAuditTableData(modelClass, db, record.databaseOperation());
|
|
464
542
|
const action = normalizeAction(args.action);
|
|
465
543
|
const auditedChanges = args.auditedChanges === undefined ? null : args.auditedChanges;
|
|
466
544
|
const params = args.params === undefined ? null : args.params;
|
|
@@ -626,13 +704,14 @@ function auditChangesForDestroy(record) {
|
|
|
626
704
|
*/
|
|
627
705
|
function withoutAudit(modelClass, action) {
|
|
628
706
|
const db = modelClass.connection();
|
|
707
|
+
const databaseIdentity = auditDatabaseIdentity(modelClass, db);
|
|
708
|
+
const tableData = auditTableDataByModel.get(modelClass)?.get(databaseIdentity);
|
|
629
709
|
const modelTableSql = db.quoteTable(modelClass.tableName());
|
|
630
710
|
const auditActionsTableSql = db.quoteTable("audit_actions");
|
|
631
711
|
const modelPrimaryKeySql = `${modelTableSql}.${db.quoteColumn(modelClass.primaryKey())}`;
|
|
632
712
|
const auditActionsIdSql = `${auditActionsTableSql}.${db.quoteColumn("id")}`;
|
|
633
713
|
const auditActionsActionSql = `${auditActionsTableSql}.${db.quoteColumn("action")}`;
|
|
634
|
-
if (
|
|
635
|
-
const tableData = modelClass._auditTableData;
|
|
714
|
+
if (tableData?.dedicated) {
|
|
636
715
|
const modelKey = modelParamKey(modelClass);
|
|
637
716
|
const auditsTableSql = db.quoteTable(tableData.tableName);
|
|
638
717
|
const auditActionIdSql = `${auditsTableSql}.${db.quoteColumn("audit_action_id")}`;
|
|
@@ -831,4 +910,4 @@ function dedicatedAuditTableNameForTable(modelTableName) {
|
|
|
831
910
|
return `${modelTableName}_audits`;
|
|
832
911
|
}
|
|
833
912
|
export { AuditEvents, captureCreateAuditChanges, captureUpdateAuditChanges, createAudit, createCreateAudit, createDestroyAudit, createUpdateAudit, createSharedAuditTablesMigration, dedicatedAuditTableNameForTable, initializeAuditedModelRelationships, initializeAuditing, registerAuditCallback, registerAuditing, withoutAudit };
|
|
834
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXRpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvcmVjb3JkL2F1ZGl0aW5nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLElBQUksTUFBTSxXQUFXLENBQUE7QUFFNUI7Ozs7OztHQU1HO0FBQ0g7OztHQUdHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7O0dBR0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7O0dBT0c7QUFFSCxtQ0FBbUM7QUFDbkMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0FBRXJDLCtEQUErRDtBQUMvRCxNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0FBRWpDLE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtBQUVqRCw4RUFBOEU7QUFDOUUsd0RBQXdEO0FBQ3hELDhFQUE4RTtBQUU5RSx1RkFBdUY7QUFDdkYsSUFBSSxzQkFBc0IsR0FBRyxFQUFFLENBQUE7QUFFL0IsOEJBQThCO0FBQzlCLE1BQU0sV0FBVyxHQUFHO0lBQ2xCOzs7OztPQUtHO0lBQ0gsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSTtRQUNyQixNQUFNLE9BQU8sR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDbEQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUV2QyxLQUFLLE1BQU0sUUFBUSxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3RDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNoQixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVE7UUFDNUIsSUFBSSxDQUFDLHNCQUFz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LFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2pDLE9BQU8sR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7SUFDaEQsQ0FBQztJQUVELE9BQU8sR0FBRyxjQUFjLFNBQVMsQ0FBQTtBQUNuQyxDQUFDO0FBRUQsT0FBTyxFQUNMLFdBQVcsRUFDWCx5QkFBeUIsRUFDekIseUJBQXlCLEVBQ3pCLFdBQVcsRUFDWCxpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLGlCQUFpQixFQUNqQixnQ0FBZ0MsRUFDaEMsK0JBQStCLEVBQy9CLG1DQUFtQyxFQUNuQyxrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixZQUFZLEVBQ2IsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgVVVJRCBmcm9tIFwicHVyZS11dWlkXCJcblxuLyoqXG4gKiBHbG9iYWwgYXVkaXQgZXZlbnQgYnVzIG1hdGNoaW5nIEFjdGl2ZVJlY29yZEF1ZGl0YWJsZTo6RXZlbnRzLlxuICogQHR5cGVkZWYge29iamVjdH0gQXVkaXRFdmVudHNUeXBlXG4gKiBAcHJvcGVydHkgeyh0eXBlOiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nLCBhcmdzOiBBdWRpdEV2ZW50UGF5bG9hZCkgPT4gdm9pZH0gY2FsbCAtIEZpcmUgYWxsIGNhbGxiYWNrcyBmb3IgYSBtb2RlbCB0eXBlICsgYWN0aW9uLlxuICogQHByb3BlcnR5IHsodHlwZTogc3RyaW5nLCBhY3Rpb246IHN0cmluZywgY2FsbGJhY2s6IChhcmdzOiBBdWRpdEV2ZW50UGF5bG9hZCkgPT4gdm9pZCkgPT4gKCkgPT4gdm9pZH0gY29ubmVjdCAtIFJlZ2lzdGVyIGEgY2FsbGJhY2sgZm9yIGEgbW9kZWwgdHlwZSArIGFjdGlvbi4gUmV0dXJucyBhbiB1bnN1YnNjcmliZSBmdW5jdGlvbi5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gcmVzZXQgLSBDbGVhciBhbGwgcmVnaXN0ZXJlZCBjYWxsYmFja3MuXG4gKi9cbi8qKlxuICogQXVkaXRDaGFuZ2VzIHR5cGUuXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgPz59IEF1ZGl0Q2hhbmdlc1xuICovXG5cbi8qKlxuICogQXVkaXRFdmVudFBheWxvYWQgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEF1ZGl0RXZlbnRQYXlsb2FkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYWN0aW9uIC0gQXVkaXQgYWN0aW9uIG5hbWUuXG4gKiBAcHJvcGVydHkge251bWJlciB8IHN0cmluZ30gYXVkaXRJZCAtIENyZWF0ZWQgYXVkaXQgcm93IGlkLlxuICogQHByb3BlcnR5IHtBdWRpdENoYW5nZXMgfCBudWxsfSBhdWRpdGVkQ2hhbmdlcyAtIENoYW5nZXMgY2FwdHVyZWQgZm9yIHRoZSBhdWRpdC5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgPz4gfCBudWxsfSBwYXJhbXMgLSBPcHRpb25hbCBjYWxsZXItc3VwcGxpZWQgYXVkaXQgcGFyYW1zLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IHJlY29yZCAtIEF1ZGl0ZWQgcmVjb3JkLlxuICovXG5cbi8qKlxuICogQXVkaXRDYWxsYmFjayB0eXBlLlxuICogQHR5cGVkZWYgeyhwYXlsb2FkOiBBdWRpdEV2ZW50UGF5bG9hZCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD59IEF1ZGl0Q2FsbGJhY2tcbiAqL1xuXG4vKipcbiAqIENyZWF0ZUF1ZGl0QXJncyB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gQ3JlYXRlQXVkaXRBcmdzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYWN0aW9uIC0gQXVkaXQgYWN0aW9uIG5hbWUuXG4gKiBAcHJvcGVydHkge0F1ZGl0Q2hhbmdlcyB8IG51bGx9IFthdWRpdGVkQ2hhbmdlc10gLSBFeHBsaWNpdCBjaGFuZ2VzIHRvIHBlcnNpc3QuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsID8+IHwgbnVsbH0gW3BhcmFtc10gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBzdG9yZSB3aXRoIHRoZSBhdWRpdC5cbiAqL1xuXG4vKipcbiAqIEF1ZGl0ZWRNb2RlbENsYXNzIHR5cGUuXG4gKiBAdHlwZWRlZiB7dHlwZW9mIGltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdCAmIHtcbiAqICAgX2F1ZGl0Q2FsbGJhY2tzPzogUmVjb3JkPHN0cmluZywgQXVkaXRDYWxsYmFja1tdPixcbiAqICAgX2F1ZGl0TGlmZWN5Y2xlQ2FsbGJhY2tzUmVnaXN0ZXJlZD86IGJvb2xlYW4sXG4gKiAgIF9hdWRpdFRhYmxlUmVzb2x2ZWQ/OiBib29sZWFuLFxuICogICBfYXVkaXRUYWJsZURhdGE/OiBBdWRpdFRhYmxlRGF0YVxuICogfX0gQXVkaXRlZE1vZGVsQ2xhc3NcbiAqL1xuXG4vKipcbiAqIEF1ZGl0VGFibGVEYXRhIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBdWRpdFRhYmxlRGF0YVxuICogQHByb3BlcnR5IHtib29sZWFufSBkZWRpY2F0ZWQgLSBXaGV0aGVyIGEgZGVkaWNhdGVkIGF1ZGl0IHRhYmxlIGV4aXN0cy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBOYW1lIG9mIHRoZSBhdWRpdCB0YWJsZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmb3JlaWduS2V5IC0gQ29sdW1uIG5hbWUgdGhhdCByZWZlcmVuY2VzIHRoZSBhdWRpdGVkIG1vZGVsLlxuICogQHByb3BlcnR5IHt0eXBlb2YgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSBhdWRpdENsYXNzIC0gVGhlIGF1ZGl0IG1vZGVsIGNsYXNzIHRvIHVzZS5cbiAqL1xuXG4vKiogQHR5cGUge01hcDxzdHJpbmcsIGJvb2xlYW4+fSAqL1xuY29uc3QgZGVkaWNhdGVkVGFibGVDYWNoZSA9IG5ldyBNYXAoKVxuXG4vKiogQHR5cGUge01hcDxzdHJpbmcsIHR5cGVvZiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHQ+fSAqL1xuY29uc3QgYXVkaXRDbGFzc0NhY2hlID0gbmV3IE1hcCgpXG5cbmNvbnN0IGdlbmVyYXRlZEF1ZGl0UmVsYXRpb25zaGlwcyA9IG5ldyBXZWFrU2V0KClcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBHbG9iYWwgZXZlbnQgYnVzIChsaWtlIEFjdGl2ZVJlY29yZEF1ZGl0YWJsZTo6RXZlbnRzKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgQXJyYXk8KGFyZ3M6IEF1ZGl0RXZlbnRQYXlsb2FkKSA9PiB2b2lkPj4+fSAqL1xubGV0IGdsb2JhbEV2ZW50Q29ubmVjdGlvbnMgPSB7fVxuXG4vKiogQHR5cGUge0F1ZGl0RXZlbnRzVHlwZX0gKi9cbmNvbnN0IEF1ZGl0RXZlbnRzID0ge1xuICAvKipcbiAgICogRmlyZSBhbGwgcmVnaXN0ZXJlZCBjYWxsYmFja3MgZm9yIGEgbW9kZWwgdHlwZSBhbmQgYWN0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIEF1ZGl0ZWQgbW9kZWwgdHlwZSB3aG9zZSBsaXN0ZW5lcnMgc2hvdWxkIGZpcmUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb24gLSBBdWRpdCBhY3Rpb24gd2hvc2UgbGlzdGVuZXJzIHNob3VsZCBmaXJlLlxuICAgKiBAcGFyYW0ge0F1ZGl0RXZlbnRQYXlsb2FkfSBhcmdzIC0gQXVkaXQgZXZlbnQgZGVsaXZlcmVkIHRvIG1hdGNoaW5nIGxpc3RlbmVycy5cbiAgICovXG4gIGNhbGwodHlwZSwgYWN0aW9uLCBhcmdzKSB7XG4gICAgY29uc3QgYWN0aW9ucyA9IGdsb2JhbEV2ZW50Q29ubmVjdGlvbnNbdHlwZV0gfHwge31cbiAgICBjb25zdCBjYWxsYmFja3MgPSBhY3Rpb25zW2FjdGlvbl0gfHwgW11cblxuICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgWy4uLmNhbGxiYWNrc10pIHtcbiAgICAgIGNhbGxiYWNrKGFyZ3MpXG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGNhbGxiYWNrIGZvciBhIG1vZGVsIHR5cGUgYW5kIGFjdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBBdWRpdGVkIG1vZGVsIHR5cGUgdG8gb2JzZXJ2ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbiAtIEF1ZGl0IGFjdGlvbiB0byBvYnNlcnZlLlxuICAgKiBAcGFyYW0geyhhcmdzOiBBdWRpdEV2ZW50UGF5bG9hZCkgPT4gdm9pZH0gY2FsbGJhY2sgLSBMaXN0ZW5lciBpbnZva2VkIGZvciBtYXRjaGluZyBhdWRpdCBldmVudHMuXG4gICAqIEByZXR1cm5zIHsoKSA9PiB2b2lkfSAtIENhbGxiYWNrIHRoYXQgcmVtb3ZlcyB0aGUgcmVnaXN0cmF0aW9uLlxuICAgKi9cbiAgY29ubmVjdCh0eXBlLCBhY3Rpb24sIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFnbG9iYWxFdmVudENvbm5lY3Rpb25zW3R5cGVdKSB7XG4gICAgICBnbG9iYWxFdmVudENvbm5lY3Rpb25zW3R5cGVdID0ge31cbiAgICB9XG5cbiAgICBpZiAoIWdsb2JhbEV2ZW50Q29ubmVjdGlvbnNbdHlwZV1bYWN0aW9uXSkge1xuICAgICAgZ2xvYmFsRXZlbnRDb25uZWN0aW9uc1t0eXBlXVthY3Rpb25dID0gW11cbiAgICB9XG5cbiAgICBnbG9iYWxFdmVudENvbm5lY3Rpb25zW3R5cGVdW2FjdGlvbl0ucHVzaChjYWxsYmFjaylcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb25zdCBsaXN0ID0gZ2xvYmFsRXZlbnRDb25uZWN0aW9uc1t0eXBlXT8uW2FjdGlvbl1cblxuICAgICAgaWYgKGxpc3QpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBsaXN0LmluZGV4T2YoY2FsbGJhY2spXG5cbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICBsaXN0LnNwbGljZShpbmRleCwgMSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKiogQ2xlYXIgYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2tzLiAqL1xuICByZXNldCgpIHtcbiAgICBnbG9iYWxFdmVudENvbm5lY3Rpb25zID0ge31cbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRhYmxlIGRldGVjdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogUmV0dXJucyB0aGUgZGVkaWNhdGVkIGF1ZGl0IHRhYmxlIG5hbWUgZm9yIGEgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge0F1ZGl0ZWRNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gQXVkaXRlZCBtb2RlbCBjbGFzcy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IGUuZy4gXCJwcm9qZWN0X2F1ZGl0c1wiIGZvciBhIFwicHJvamVjdHNcIiB0YWJsZS5cbiAqL1xuZnVuY3Rpb24gZGVkaWNhdGVkQXVkaXRUYWJsZU5hbWUobW9kZWxDbGFzcykge1xuICBjb25zdCB0YWJsZSA9IG1vZGVsQ2xhc3MudGFibGVOYW1lKClcblxuICBpZiAodGFibGUuZW5kc1dpdGgoXCJzXCIpKSB7XG4gICAgcmV0dXJuIGAke3RhYmxlLnNsaWNlKDAsIC0xKX1fYXVkaXRzYFxuICB9XG5cbiAgcmV0dXJuIGAke3RhYmxlfV9hdWRpdHNgXG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYXVkaXQgdGFibGUgZGF0YSBmb3IgYSBtb2RlbCBjbGFzcy4gQ2FjaGVkIHBlciBtb2RlbC5cbiAqIENhbGxlZCBsYXppbHkgb24gZmlyc3QgY3JlYXRlQXVkaXQgLyB3aXRob3V0QXVkaXQgLyByZWxhdGlvbnNoaXAgdXNhZ2UuXG4gKiBAcGFyYW0ge0F1ZGl0ZWRNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gQXVkaXRlZCBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IFtjb25uZWN0aW9uXSAtIEV4cGxpY2l0IHJlY29yZC1vd25lZCBjb25uZWN0aW9uLlxuICogQHJldHVybnMge1Byb21pc2U8QXVkaXRUYWJsZURhdGE+fSBSZXNvbHZlZCBhdWRpdCB0YWJsZSBtZXRhZGF0YS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUF1ZGl0VGFibGVEYXRhKG1vZGVsQ2xhc3MsIGNvbm5lY3Rpb24pIHtcbiAgaWYgKG1vZGVsQ2xhc3MuX2F1ZGl0VGFibGVSZXNvbHZlZCAmJiBtb2RlbENsYXNzLl9hdWRpdFRhYmxlRGF0YSkge1xuICAgIHJldHVybiBtb2RlbENsYXNzLl9hdWRpdFRhYmxlRGF0YVxuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWRDb25uZWN0aW9uID0gY29ubmVjdGlvbiB8fCBtb2RlbENsYXNzLmNvbm5lY3Rpb24oKVxuICBjb25zdCB0YWJsZURhdGEgPSBhd2FpdCBidWlsZEF1ZGl0VGFibGVEYXRhKG1vZGVsQ2xhc3MsIHJlc29sdmVkQ29ubmVjdGlvbilcbiAgY29uc3QgY29uZmlndXJhdGlvbiA9IG1vZGVsQ2xhc3MuX2dldENvbmZpZ3VyYXRpb24oKVxuXG4gIHRhYmxlRGF0YS5hdWRpdENsYXNzLnJlZ2lzdGVyUmVjb3JkQ2xhc3Moe2NvbmZpZ3VyYXRpb259KVxuICBhd2FpdCB0YWJsZURhdGEuYXVkaXRDbGFzcy5pbml0aWFsaXplUmVjb3JkKHtjb25maWd1cmF0aW9uLCBjb25uZWN0aW9uOiByZXNvbHZlZENvbm5lY3Rpb259KVxuXG4gIG1vZGVsQ2xhc3MuX2F1ZGl0VGFibGVEYXRhID0gdGFibGVEYXRhXG4gIG1vZGVsQ2xhc3MuX2F1ZGl0VGFibGVSZXNvbHZlZCA9IHRydWVcblxuICByZWdpc3RlckF1ZGl0UmVsYXRpb25zaGlwKG1vZGVsQ2xhc3MsIHRhYmxlRGF0YSlcblxuICByZXR1cm4gdGFibGVEYXRhXG59XG5cbi8qKlxuICogQnVpbGRzIGF1ZGl0IHRhYmxlIG1ldGFkYXRhIGZvciBhIG1vZGVsIGNsYXNzLiBQcmVmZXJzIHRoZSBjb25zdW1lcidzXG4gKiByZWdpc3RlcmVkIEF1ZGl0IG1vZGVsIGZvciBzaGFyZWQgdGFibGVzOyBmYWxscyBiYWNrIHRvIGEgZnJhbWV3b3JrLW93bmVkXG4gKiBkeW5hbWljIGNsYXNzLlxuICogQHBhcmFtIHtBdWRpdGVkTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIEF1ZGl0ZWQgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBjb25uZWN0aW9uIC0gRXhwbGljaXQgcmVjb3JkLW93bmVkIGNvbm5lY3Rpb24uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBdWRpdFRhYmxlRGF0YT59IEF1ZGl0IHRhYmxlIG1ldGFkYXRhLlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZEF1ZGl0VGFibGVEYXRhKG1vZGVsQ2xhc3MsIGNvbm5lY3Rpb24pIHtcbiAgY29uc3QgZGVkaWNhdGVkVGFibGUgPSBkZWRpY2F0ZWRBdWRpdFRhYmxlTmFtZShtb2RlbENsYXNzKVxuICBjb25zdCBkZWRpY2F0ZWRFeGlzdHMgPSBhd2FpdCBkZWRpY2F0ZWRUYWJsZUV4aXN0c0ZvckNvbm5lY3Rpb24obW9kZWxDbGFzcywgZGVkaWNhdGVkVGFibGUsIGNvbm5lY3Rpb24pXG5cbiAgaWYgKGRlZGljYXRlZEV4aXN0cykge1xuICAgIGNvbnN0IGF1ZGl0Q2xhc3MgPSBkZWRpY2F0ZWRBdWRpdENsYXNzKG1vZGVsQ2xhc3MsIGRlZGljYXRlZFRhYmxlKVxuICAgIGNvbnN0IG1vZGVsS2V5ID0gbW9kZWxQYXJhbUtleShtb2RlbENsYXNzKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGF1ZGl0Q2xhc3MsXG4gICAgICBkZWRpY2F0ZWQ6IHRydWUsXG4gICAgICBmb3JlaWduS2V5OiBgJHttb2RlbEtleX1faWRgLFxuICAgICAgdGFibGVOYW1lOiBkZWRpY2F0ZWRUYWJsZVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBtb2RlbENsYXNzLl9nZXRDb25maWd1cmF0aW9uKClcblxuICBjb25zdCBjb25zdW1lckF1ZGl0Q2xhc3MgPSBjb25maWd1cmF0aW9uLmdldE1vZGVsQ2xhc3NlcygpLkF1ZGl0XG5cbiAgaWYgKGNvbnN1bWVyQXVkaXRDbGFzcykge1xuICAgIHJldHVybiB7XG4gICAgICBhdWRpdENsYXNzOiBjb25zdW1lckF1ZGl0Q2xhc3MsXG4gICAgICBkZWRpY2F0ZWQ6IGZhbHNlLFxuICAgICAgZm9yZWlnbktleTogXCJhdWRpdGFibGVfaWRcIixcbiAgICAgIHRhYmxlTmFtZTogXCJhdWRpdHNcIlxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYXVkaXRDbGFzczogY2FjaGVkU2hhcmVkQXVkaXRDbGFzcyhtb2RlbENsYXNzKSxcbiAgICBkZWRpY2F0ZWQ6IGZhbHNlLFxuICAgIGZvcmVpZ25LZXk6IFwiYXVkaXRhYmxlX2lkXCIsXG4gICAgdGFibGVOYW1lOiBcImF1ZGl0c1wiXG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIGRlZGljYXRlZCBhdWRpdCB0YWJsZSBleGlzdHMgZm9yIGEgbW9kZWwncyBjb25uZWN0aW9uLlxuICogQHBhcmFtIHtBdWRpdGVkTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIEF1ZGl0ZWQgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gRGVkaWNhdGVkIGF1ZGl0IHRhYmxlIG5hbWUgdG8gY2hlY2suXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBjb25uZWN0aW9uIC0gRXhwbGljaXQgcmVjb3JkLW93bmVkIGNvbm5lY3Rpb24uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gV2hldGhlciB0aGUgdGFibGUgZXhpc3RzLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZWRpY2F0ZWRUYWJsZUV4aXN0c0ZvckNvbm5lY3Rpb24obW9kZWxDbGFzcywgdGFibGVOYW1lLCBjb25uZWN0aW9uKSB7XG4gIGNvbnN0IGRhdGFiYXNlSWRlbnRpZmllciA9IG1vZGVsQ2xhc3MuZ2V0RGF0YWJhc2VJZGVudGlmaWVyKClcbiAgY29uc3QgY2FjaGVLZXkgPSBgJHtkYXRhYmFzZUlkZW50aWZpZXJ9OiR7dGFibGVOYW1lfWBcbiAgY29uc3QgY2FjaGVkID0gZGVkaWNhdGVkVGFibGVDYWNoZS5nZXQoY2FjaGVLZXkpXG5cbiAgaWYgKHR5cGVvZiBjYWNoZWQgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgcmV0dXJuIGNhY2hlZFxuICB9XG5cbiAgY29uc3QgdGFibGUgPSBhd2FpdCBjb25uZWN0aW9uLmdldFRhYmxlQnlOYW1lKHRhYmxlTmFtZSwge3Rocm93RXJyb3I6IGZhbHNlfSlcbiAgY29uc3QgZXhpc3RzID0gQm9vbGVhbih0YWJsZSlcblxuICBkZWRpY2F0ZWRUYWJsZUNhY2hlLnNldChjYWNoZUtleSwgZXhpc3RzKVxuXG4gIHJldHVybiBleGlzdHNcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBEeW5hbWljIGF1ZGl0IGNsYXNzZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFJldHVybnMgYSBmcmFtZXdvcmstb3duZWQgc2hhcmVkIEF1ZGl0IGNsYXNzIGZvciB0aGUgYGF1ZGl0c2AgdGFibGUuXG4gKiBUaGlzIGlzIG9ubHkgdXNlZCB3aGVuIG5vIGNvbnN1bWVyLXJlZ2lzdGVyZWQgQXVkaXQgbW9kZWwgZXhpc3RzLlxuICogQHBhcmFtIHtBdWRpdGVkTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIEFueSBhdWRpdGVkIG1vZGVsIGNsYXNzICh1c2VkIHRvIGxvY2F0ZSBEYXRhYmFzZVJlY29yZCkuXG4gKiBAcmV0dXJucyB7dHlwZW9mIGltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gU2hhcmVkIEF1ZGl0IG1vZGVsIGNsYXNzLlxuICovXG5mdW5jdGlvbiBzaGFyZWRBdWRpdENsYXNzKG1vZGVsQ2xhc3MpIHtcbiAgY29uc3QgZGJSZWNvcmRDbGFzcyA9IGZpbmREYXRhYmFzZVJlY29yZENsYXNzKG1vZGVsQ2xhc3MpXG5cbiAgLyoqXG4gICAqIEZyYW1ld29yay1vd25lZCBBdWRpdCBtb2RlbCBmb3IgdGhlIHNoYXJlZCBgYXVkaXRzYCB0YWJsZS5cbiAgICovXG4gIGNsYXNzIEF1ZGl0IGV4dGVuZHMgZGJSZWNvcmRDbGFzcyB7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYmFja2luZyB0YWJsZSBuYW1lLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU2hhcmVkIGBhdWRpdHNgIHRhYmxlIG5hbWUuXG4gICAgICovXG4gICAgc3RhdGljIHRhYmxlTmFtZSgpIHtcbiAgICAgIHJldHVybiBcImF1ZGl0c1wiXG4gICAgfVxuICB9XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEF1ZGl0LCBcIm1vZGVsTmFtZVwiLCB7dmFsdWU6IFwiQXVkaXRcIiwgd3JpdGFibGU6IGZhbHNlfSlcbiAgYXBwbHlBdWRpdENsYXNzRGF0YWJhc2VSb3V0aW5nKG1vZGVsQ2xhc3MsIEF1ZGl0KVxuXG4gIHJldHVybiAvKiogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9ICovIChBdWRpdClcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjYWNoZWQgZnJhbWV3b3JrLW93bmVkIHNoYXJlZCBBdWRpdCBjbGFzcyBmb3IgYSBkYXRhYmFzZS5cbiAqIEBwYXJhbSB7QXVkaXRlZE1vZGVsQ2xhc3N9IG1vZGVsQ2xhc3MgLSBBbnkgYXVkaXRlZCBtb2RlbCBjbGFzcy5cbiAqIEByZXR1cm5zIHt0eXBlb2YgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSBTaGFyZWQgQXVkaXQgbW9kZWwgY2xhc3MuXG4gKi9cbmZ1bmN0aW9uIGNhY2hlZFNoYXJlZEF1ZGl0Q2xhc3MobW9kZWxDbGFzcykge1xuICBjb25zdCByb3V0aW5nS2V5ID0gbW9kZWxDbGFzcy5oYXNUZW5hbnREYXRhYmFzZUlkZW50aWZpZXJSZXNvbHZlcigpXG4gICAgPyBgdGVuYW50OiR7bW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKX1gXG4gICAgOiBgZGF0YWJhc2U6JHttb2RlbENsYXNzLmdldENvbmZpZ3VyZWREYXRhYmFzZUlkZW50aWZpZXIoKX1gXG4gIGNvbnN0IGNhY2hlS2V5ID0gYHNoYXJlZDoke3JvdXRpbmdLZXl9YFxuICBsZXQgYXVkaXRDbGFzcyA9IGF1ZGl0Q2xhc3NDYWNoZS5nZXQoY2FjaGVLZXkpXG5cbiAgaWYgKCFhdWRpdENsYXNzKSB7XG4gICAgYXVkaXRDbGFzcyA9IHNoYXJlZEF1ZGl0Q2xhc3MobW9kZWxDbGFzcylcbiAgICBhdWRpdENsYXNzQ2FjaGUuc2V0KGNhY2hlS2V5LCBhdWRpdENsYXNzKVxuICB9XG5cbiAgcmV0dXJuIGF1ZGl0Q2xhc3Ncbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZHluYW1pYyBwZXItbW9kZWwgYXVkaXQgY2xhc3MgZm9yIGEgZGVkaWNhdGVkIHRhYmxlLlxuICogQHBhcmFtIHtBdWRpdGVkTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIEF1ZGl0ZWQgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gRGVkaWNhdGVkIGF1ZGl0IHRhYmxlIG5hbWUgKGUuZy4gXCJwcm9qZWN0X2F1ZGl0c1wiKS5cbiAqIEByZXR1cm5zIHt0eXBlb2YgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSBEZWRpY2F0ZWQgYXVkaXQgbW9kZWwgY2xhc3MuXG4gKi9cbmZ1bmN0aW9uIGRlZGljYXRlZEF1ZGl0Q2xhc3MobW9kZWxDbGFzcywgdGFibGVOYW1lKSB7XG4gIGNvbnN0IGRiUmVjb3JkQ2xhc3MgPSBmaW5kRGF0YWJhc2VSZWNvcmRDbGFzcyhtb2RlbENsYXNzKVxuICBjb25zdCBtb2RlbE5hbWUgPSBtb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpXG4gIGNvbnN0IG1vZGVsS2V5ID0gbW9kZWxQYXJhbUtleShtb2RlbENsYXNzKVxuXG4gIC8qKlxuICAgKiBGcmFtZXdvcmstb3duZWQgcGVyLW1vZGVsIEF1ZGl0IGNsYXNzLlxuICAgKi9cbiAgY2xhc3MgTW9kZWxBdWRpdCBleHRlbmRzIGRiUmVjb3JkQ2xhc3Mge1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGJhY2tpbmcgdGFibGUgbmFtZS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIERlZGljYXRlZCBhdWRpdCB0YWJsZSBzdXBwbGllZCBmb3IgdGhpcyBtb2RlbCBjbGFzcy5cbiAgICAgKi9cbiAgICBzdGF0aWMgdGFibGVOYW1lKCkge1xuICAgICAgcmV0dXJuIHRhYmxlTmFtZVxuICAgIH1cbiAgfVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShNb2RlbEF1ZGl0LCBcIm1vZGVsTmFtZVwiLCB7dmFsdWU6IGAke21vZGVsTmFtZX1BdWRpdGAsIHdyaXRhYmxlOiBmYWxzZX0pXG4gIGFwcGx5QXVkaXRDbGFzc0RhdGFiYXNlUm91dGluZyhtb2RlbENsYXNzLCBNb2RlbEF1ZGl0KVxuICBNb2RlbEF1ZGl0LmJlbG9uZ3NUbyhtb2RlbEtleSwge2NsYXNzTmFtZTogbW9kZWxOYW1lfSlcblxuICByZXR1cm4gLyoqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSAqLyAoTW9kZWxBdWRpdClcbn1cblxuLyoqXG4gKiBNYWtlcyBmcmFtZXdvcmstb3duZWQgYXVkaXQgY2xhc3NlcyByZWFkIHRoZSBzYW1lIGRhdGFiYXNlIGFzIHRoZSBhdWRpdGVkIG1vZGVsLlxuICogQHBhcmFtIHtBdWRpdGVkTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIEF1ZGl0ZWQgc291cmNlIG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSBhdWRpdENsYXNzIC0gR2VuZXJhdGVkIGF1ZGl0IGNsYXNzLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGFwcGx5QXVkaXRDbGFzc0RhdGFiYXNlUm91dGluZyhtb2RlbENsYXNzLCBhdWRpdENsYXNzKSB7XG4gIGF1ZGl0Q2xhc3Muc2V0RGF0YWJhc2VJZGVudGlmaWVyKG1vZGVsQ2xhc3MuZ2V0Q29uZmlndXJlZERhdGFiYXNlSWRlbnRpZmllcigpKVxuXG4gIGlmIChtb2RlbENsYXNzLmhhc1RlbmFudERhdGFiYXNlSWRlbnRpZmllclJlc29sdmVyKCkpIHtcbiAgICBhdWRpdENsYXNzLnN3aXRjaGVzVGVuYW50RGF0YWJhc2UoKHt0ZW5hbnR9KSA9PiBtb2RlbENsYXNzLmdldFRlbmFudERhdGFiYXNlSWRlbnRpZmllcih0ZW5hbnQpKVxuICB9XG59XG5cbi8qKlxuICogV2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiB0byBmaW5kIHRoZSByb290IERhdGFiYXNlUmVjb3JkIGNsYXNzLlxuICogQHBhcmFtIHtBdWRpdGVkTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIEF1ZGl0ZWQgbW9kZWwgY2xhc3MuXG4gKiBAcmV0dXJucyB7dHlwZW9mIGltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gUm9vdCBEYXRhYmFzZVJlY29yZCBjbGFzcy5cbiAqL1xuZnVuY3Rpb24gZmluZERhdGFiYXNlUmVjb3JkQ2xhc3MobW9kZWxDbGFzcykge1xuICBsZXQgcmVjb3JkQ2xhc3MgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YobW9kZWxDbGFzcylcblxuICB3aGlsZSAocmVjb3JkQ2xhc3MgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKHJlY29yZENsYXNzKSAhPT0gRnVuY3Rpb24ucHJvdG90eXBlKSB7XG4gICAgcmVjb3JkQ2xhc3MgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocmVjb3JkQ2xhc3MpXG4gIH1cblxuICByZXR1cm4gLyoqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSAqLyAocmVjb3JkQ2xhc3MpXG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGFyYW1ldGVyLWtleSBuYW1lIGZvciBhIG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtBdWRpdGVkTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIEF1ZGl0ZWQgbW9kZWwgY2xhc3MuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBlLmcuIFwicHJvamVjdFwiIGZvciBcIlByb2plY3RcIi5cbiAqL1xuZnVuY3Rpb24gbW9kZWxQYXJhbUtleShtb2RlbENsYXNzKSB7XG4gIGNvbnN0IG5hbWUgPSBtb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpXG5cbiAgcmV0dXJuIG5hbWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpXG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmVnaXN0cmF0aW9uIChzeW5jIOKAlCBjYWxsYmFja3Mgb25seTsgdGFibGUgZGV0ZWN0aW9uIGRlZmVycmVkKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogUmVnaXN0ZXJzIGxpZmVjeWNsZSBjYWxsYmFja3MgZm9yIGF1dG9tYXRpYyBjcmVhdGUvdXBkYXRlL2Rlc3Ryb3kgYXVkaXRpbmcuXG4gKiBUYWJsZSBkZXRlY3Rpb24gYW5kIHJlbGF0aW9uc2hpcCByZWdpc3RyYXRpb24gaGFwcGVuIGxhemlseSBvbiBmaXJzdCB1c2FnZS5cbiAqIENhbGxlZCBzeW5jaHJvbm91c2x5IGZyb20gTW9kZWwuYXVkaXRlZCgpIGF0IG1vZHVsZS1sb2FkIHRpbWUuXG4gKiBAcGFyYW0ge0F1ZGl0ZWRNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MgdG8gYXVkaXQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJBdWRpdGluZyhtb2RlbENsYXNzKSB7XG4gIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kZWxDbGFzcywgXCJfYXVkaXRMaWZlY3ljbGVDYWxsYmFja3NSZWdpc3RlcmVkXCIpICYmIG1vZGVsQ2xhc3MuX2F1ZGl0TGlmZWN5Y2xlQ2FsbGJhY2tzUmVnaXN0ZXJlZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgbW9kZWxDbGFzcy5fYXVkaXRMaWZlY3ljbGVDYWxsYmFja3NSZWdpc3RlcmVkID0gdHJ1ZVxuICByZWdpc3RlckF1ZGl0UmVsYXRpb25zaGlwKG1vZGVsQ2xhc3MpXG4gIG1vZGVsQ2xhc3MuYmVmb3JlQ3JlYXRlKFwiY2FwdHVyZUNyZWF0ZUF1ZGl0Q2hhbmdlc1wiKVxuICBtb2RlbENsYXNzLmFmdGVyQ3JlYXRlKFwiY3JlYXRlQ3JlYXRlQXVkaXRcIilcbiAgbW9kZWxDbGFzcy5iZWZvcmVVcGRhdGUoXCJjYXB0dXJlVXBkYXRlQXVkaXRDaGFuZ2VzXCIpXG4gIG1vZGVsQ2xhc3MuYWZ0ZXJVcGRhdGUoXCJjcmVhdGVVcGRhdGVBdWRpdFwiKVxuICBtb2RlbENsYXNzLmFmdGVyRGVzdHJveShcImNyZWF0ZURlc3Ryb3lBdWRpdFwiKVxufVxuXG4vKipcbiAqIEluaXRpYWxpemVzIGF1ZGl0IG1ldGFkYXRhIGZvciBhdWRpdGVkIG1vZGVsIGNsYXNzZXMuXG4gKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcyB0byBpbml0aWFsaXplLlxuICogQHBhcmFtIHt7cmVzb2x2ZVRhYmxlRGF0YT86IGJvb2xlYW59fSBbYXJnc10gLSBJbml0aWFsaXphdGlvbiBvcHRpb25zLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluaXRpYWxpemVBdWRpdGluZyhtb2RlbENsYXNzLCBhcmdzID0ge30pIHtcbiAgY29uc3Qge3Jlc29sdmVUYWJsZURhdGEgPSBmYWxzZX0gPSBhcmdzXG4gIGNvbnN0IGF1ZGl0ZWRNb2RlbENsYXNzID0gLyoqIEB0eXBlIHtBdWRpdGVkTW9kZWxDbGFzc30gKi8gKG1vZGVsQ2xhc3MpXG5cbiAgaWYgKCFhdWRpdGVkTW9kZWxDbGFzcy5fYXVkaXRMaWZlY3ljbGVDYWxsYmFja3NSZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICByZWdpc3RlckF1ZGl0UmVsYXRpb25zaGlwKGF1ZGl0ZWRNb2RlbENsYXNzKVxuXG4gIGlmIChyZXNvbHZlVGFibGVEYXRhICYmIHNob3VsZFJlc29sdmVBdWRpdFRhYmxlRGF0YShhdWRpdGVkTW9kZWxDbGFzcykpIHtcbiAgICBhd2FpdCByZXNvbHZlQXVkaXRUYWJsZURhdGEoYXVkaXRlZE1vZGVsQ2xhc3MpXG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhdWRpdCBtZXRhZGF0YSBhZnRlciBhcHBsaWNhdGlvbiBhbmQgcGFja2FnZSBtb2RlbCBjbGFzc2VzIGFyZSByZWdpc3RlcmVkLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIHdob3NlIG1vZGVscyBzaG91bGQgYmUgZmluYWxpemVkLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluaXRpYWxpemVBdWRpdGVkTW9kZWxSZWxhdGlvbnNoaXBzKGNvbmZpZ3VyYXRpb24pIHtcbiAgY29uc3QgbW9kZWxDbGFzc2VzID0gT2JqZWN0LnZhbHVlcyhjb25maWd1cmF0aW9uLmdldE1vZGVsQ2xhc3NlcygpKVxuICBjb25zdCBzaG91bGRSZXNvbHZlVGFibGVEYXRhID0gbW9kZWxDbGFzc2VzLnNvbWUoKG1vZGVsQ2xhc3MpID0+IHNob3VsZFJlc29sdmVBdWRpdFRhYmxlRGF0YShtb2RlbENsYXNzKSlcblxuICBpZiAoIXNob3VsZFJlc29sdmVUYWJsZURhdGEpIHtcbiAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgbW9kZWxDbGFzc2VzKSB7XG4gICAgICBhd2FpdCBpbml0aWFsaXplQXVkaXRpbmcobW9kZWxDbGFzcylcbiAgICB9XG5cbiAgICByZXR1cm5cbiAgfVxuXG4gIGF3YWl0IGNvbmZpZ3VyYXRpb24uZW5zdXJlQ29ubmVjdGlvbnMoe25hbWU6IFwiSW5pdGlhbGl6ZSBhdWRpdGVkIG1vZGVsIHJlbGF0aW9uc2hpcHNcIn0sIGFzeW5jICgpID0+IHtcbiAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgbW9kZWxDbGFzc2VzKSB7XG4gICAgICBhd2FpdCBpbml0aWFsaXplQXVkaXRpbmcobW9kZWxDbGFzcywge3Jlc29sdmVUYWJsZURhdGE6IHRydWV9KVxuICAgIH1cbiAgfSlcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhdWRpdCB0YWJsZSBtZXRhZGF0YSBzaG91bGQgYmUgcmVzb2x2ZWQgZm9yIGEgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcyB0byBpbnNwZWN0LlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGFibGUgbWV0YWRhdGEgcmVzb2x1dGlvbiBzaG91bGQgcnVuIG5vdy5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkUmVzb2x2ZUF1ZGl0VGFibGVEYXRhKG1vZGVsQ2xhc3MpIHtcbiAgY29uc3QgYXVkaXRlZE1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge0F1ZGl0ZWRNb2RlbENsYXNzfSAqLyAobW9kZWxDbGFzcylcblxuICBpZiAoIWF1ZGl0ZWRNb2RlbENsYXNzLl9hdWRpdExpZmVjeWNsZUNhbGxiYWNrc1JlZ2lzdGVyZWQpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiBCb29sZWFuKGF1ZGl0ZWRNb2RlbENsYXNzLl9pbml0aWFsaXplZCkgJiYgY2FuUmVzb2x2ZUF1ZGl0VGFibGVEYXRhKGF1ZGl0ZWRNb2RlbENsYXNzKVxufVxuXG4vKipcbiAqIFJlZ2lzdGVycyB0aGUgYXVkaXRzIHJlbGF0aW9uc2hpcCB3aXRob3V0IGZvcmNpbmcgYXVkaXQgdGFibGUgZGV0ZWN0aW9uLlxuICogQHBhcmFtIHtBdWRpdGVkTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzIHRvIGF1ZGl0LlxuICogQHBhcmFtIHtBdWRpdFRhYmxlRGF0YX0gW3RhYmxlRGF0YV0gLSBSZXNvbHZlZCBhdWRpdCB0YWJsZSBkYXRhIHdoZW4gYXZhaWxhYmxlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyQXVkaXRSZWxhdGlvbnNoaXAobW9kZWxDbGFzcywgdGFibGVEYXRhID0gZGVmYXVsdEF1ZGl0UmVsYXRpb25zaGlwVGFibGVEYXRhKG1vZGVsQ2xhc3MpKSB7XG4gIGlmIChtb2RlbENsYXNzLl9yZWxhdGlvbnNoaXBFeGlzdHMoXCJhdWRpdHNcIikpIHtcbiAgICBjb25zdCByZWxhdGlvbnNoaXAgPSBtb2RlbENsYXNzLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShcImF1ZGl0c1wiKVxuXG4gICAgaWYgKGdlbmVyYXRlZEF1ZGl0UmVsYXRpb25zaGlwcy5oYXMocmVsYXRpb25zaGlwKSkge1xuICAgICAgcmVsYXRpb25zaGlwLmNsYXNzTmFtZSA9IHVuZGVmaW5lZFxuICAgICAgcmVsYXRpb25zaGlwLmtsYXNzID0gdGFibGVEYXRhLmF1ZGl0Q2xhc3NcbiAgICAgIHJlbGF0aW9uc2hpcC5mb3JlaWduS2V5ID0gdGFibGVEYXRhLmZvcmVpZ25LZXlcbiAgICAgIHJlbGF0aW9uc2hpcC5fZXhwbGljaXRGb3JlaWduS2V5ID0gdGFibGVEYXRhLmZvcmVpZ25LZXlcbiAgICAgIHJlbGF0aW9uc2hpcC5fcG9seW1vcnBoaWMgPSAhdGFibGVEYXRhLmRlZGljYXRlZFxuICAgICAgcmVsYXRpb25zaGlwLl9wb2x5bW9ycGhpY1R5cGVDb2x1bW4gPSB1bmRlZmluZWRcbiAgICB9XG5cbiAgICByZXR1cm5cbiAgfVxuXG4gIG1vZGVsQ2xhc3MuaGFzTWFueShcImF1ZGl0c1wiLCBhdWRpdFJlbGF0aW9uc2hpcFNjb3BlLCB7XG4gICAgZm9yZWlnbktleTogdGFibGVEYXRhLmZvcmVpZ25LZXksXG4gICAga2xhc3M6IHRhYmxlRGF0YS5hdWRpdENsYXNzLFxuICAgIHBvbHltb3JwaGljOiAhdGFibGVEYXRhLmRlZGljYXRlZFxuICB9KVxuICBnZW5lcmF0ZWRBdWRpdFJlbGF0aW9uc2hpcHMuYWRkKG1vZGVsQ2xhc3MuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKFwiYXVkaXRzXCIpKVxufVxuXG4vKipcbiAqIFJldHVybnMgdW5yZXNvbHZlZCBzaGFyZWQtYXVkaXQgZGVmYXVsdHMgZm9yIGVhcmx5IHJlbGF0aW9uc2hpcCByZWdpc3RyYXRpb24uXG4gKiBAcGFyYW0ge0F1ZGl0ZWRNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MgdG8gYXVkaXQuXG4gKiBAcmV0dXJucyB7QXVkaXRUYWJsZURhdGF9IFNoYXJlZCBhdWRpdCByZWxhdGlvbnNoaXAgZGVmYXVsdHMuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRBdWRpdFJlbGF0aW9uc2hpcFRhYmxlRGF0YShtb2RlbENsYXNzKSB7XG4gIHJldHVybiB7XG4gICAgYXVkaXRDbGFzczogY2FjaGVkU2hhcmVkQXVkaXRDbGFzcyhtb2RlbENsYXNzKSxcbiAgICBkZWRpY2F0ZWQ6IGZhbHNlLFxuICAgIGZvcmVpZ25LZXk6IFwiYXVkaXRhYmxlX2lkXCIsXG4gICAgdGFibGVOYW1lOiBcImF1ZGl0c1wiXG4gIH1cbn1cblxuLyoqXG4gKiBBcHBsaWVzIGRlZmF1bHQgYXVkaXQgb3JkZXJpbmcgdG8gZ2VuZXJhdGVkIGF1ZGl0IHJlbGF0aW9uc2hpcHMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHQ8dHlwZW9mIGltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdD59IHF1ZXJ5IC0gQXVkaXQgcXVlcnkuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdDx0eXBlb2YgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0Pn0gT3JkZXJlZCBhdWRpdCBxdWVyeS5cbiAqL1xuZnVuY3Rpb24gYXVkaXRSZWxhdGlvbnNoaXBTY29wZShxdWVyeSkge1xuICByZXR1cm4gcXVlcnkub3JkZXIoe2NvbHVtbjogXCJjcmVhdGVkX2F0XCIsIGRpcmVjdGlvbjogXCJERVNDXCJ9KVxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHRlbmFudCBjb250ZXh0IGNhbiByZXNvbHZlIGF1ZGl0IHRhYmxlIGRhdGEuXG4gKiBAcGFyYW0ge0F1ZGl0ZWRNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGF1ZGl0IHRhYmxlIGRhdGEgY2FuIGJlIHJlc29sdmVkIGluIHRoZSBjdXJyZW50IHNjb3BlLlxuICovXG5mdW5jdGlvbiBjYW5SZXNvbHZlQXVkaXRUYWJsZURhdGEobW9kZWxDbGFzcykge1xuICBpZiAoIW1vZGVsQ2xhc3MuaGFzVGVuYW50RGF0YWJhc2VJZGVudGlmaWVyUmVzb2x2ZXIoKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBjb25zdCB0ZW5hbnREYXRhYmFzZUlkZW50aWZpZXIgPSBtb2RlbENsYXNzLmdldFRlbmFudERhdGFiYXNlSWRlbnRpZmllcigpXG5cbiAgaWYgKCF0ZW5hbnREYXRhYmFzZUlkZW50aWZpZXIpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiBtb2RlbENsYXNzLl9nZXRDb25maWd1cmF0aW9uKCkuaXNEYXRhYmFzZUlkZW50aWZpZXJBY3RpdmUodGVuYW50RGF0YWJhc2VJZGVudGlmaWVyKVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENyZWF0aW5nIGF1ZGl0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhdWRpdCByb3cgZm9yIGEgcmVjb3JkLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IHJlY29yZCAtIFJlY29yZCB0byBhdWRpdC5cbiAqIEBwYXJhbSB7Q3JlYXRlQXVkaXRBcmdzfSBhcmdzIC0gQXVkaXQgcm93IG9wdGlvbnMgKGFjdGlvbiwgYXVkaXRlZENoYW5nZXMsIHBhcmFtcykuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXIgfCBzdHJpbmc+fSBDcmVhdGVkIGF1ZGl0IHJvdyBpZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXVkaXQocmVjb3JkLCBhcmdzKSB7XG4gIGNvbnN0IG1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge0F1ZGl0ZWRNb2RlbENsYXNzfSAqLyAocmVjb3JkLmdldE1vZGVsQ2xhc3MoKSlcblxuICByZXR1cm4gYXdhaXQgbW9kZWxDbGFzcy5fZ2V0Q29uZmlndXJhdGlvbigpLmVuc3VyZUNvbm5lY3Rpb25zKHtuYW1lOiBgJHttb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpfSBhdWRpdGB9LCBhc3luYyAoKSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGNyZWF0ZUF1ZGl0V2l0aEN1cnJlbnRDb25uZWN0aW9uKHJlY29yZCwgYXJncywgbW9kZWxDbGFzcylcbiAgfSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGF1ZGl0IHJvdyB1c2luZyB0aGUgY3VycmVudCBtb2RlbCBkYXRhYmFzZSBjb25uZWN0aW9uLlxuICogUm91dGVzIHRvIHNoYXJlZCB0YWJsZSBvciBkZWRpY2F0ZWQgdGFibGUgYmFzZWQgb24gcmVzb2x2ZWQgYXVkaXQgdGFibGUgZGF0YS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSByZWNvcmQgLSBSZWNvcmQgdG8gYXVkaXQuXG4gKiBAcGFyYW0ge0NyZWF0ZUF1ZGl0QXJnc30gYXJncyAtIEF1ZGl0IHJvdyBvcHRpb25zIChhY3Rpb24sIGF1ZGl0ZWRDaGFuZ2VzLCBwYXJhbXMpLlxuICogQHBhcmFtIHtBdWRpdGVkTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIEF1ZGl0ZWQgbW9kZWwgY2xhc3MuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXIgfCBzdHJpbmc+fSBDcmVhdGVkIGF1ZGl0IHJvdyBpZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXVkaXRXaXRoQ3VycmVudENvbm5lY3Rpb24ocmVjb3JkLCBhcmdzLCBtb2RlbENsYXNzKSB7XG4gIGlmICghcmVjb3JkLmlzUGVyc2lzdGVkKCkpIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGF1ZGl0IHVucGVyc2lzdGVkICR7bW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKX0gcmVjb3JkYClcblxuICBjb25zdCBkYiA9IHJlY29yZC5jb25uZWN0aW9uKClcbiAgY29uc3QgdGFibGVEYXRhID0gYXdhaXQgcmVzb2x2ZUF1ZGl0VGFibGVEYXRhKG1vZGVsQ2xhc3MsIGRiKVxuICBjb25zdCBhY3Rpb24gPSBub3JtYWxpemVBY3Rpb24oYXJncy5hY3Rpb24pXG4gIGNvbnN0IGF1ZGl0ZWRDaGFuZ2VzID0gYXJncy5hdWRpdGVkQ2hhbmdlcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGFyZ3MuYXVkaXRlZENoYW5nZXNcbiAgY29uc3QgcGFyYW1zID0gYXJncy5wYXJhbXMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBhcmdzLnBhcmFtc1xuICBjb25zdCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKClcblxuICBjb25zdCBhdWRpdEFjdGlvbklkID0gYXdhaXQgZmluZE9yQ3JlYXRlTG9va3VwSWQoe1xuICAgIGNvbHVtbk5hbWU6IFwiYWN0aW9uXCIsXG4gICAgY3VycmVudERhdGUsXG4gICAgZGIsXG4gICAgdGFibGVOYW1lOiBcImF1ZGl0X2FjdGlvbnNcIixcbiAgICB2YWx1ZTogYWN0aW9uXG4gIH0pXG5cbiAgY29uc3QgYXVkaXRJZCA9IG5ldyBVVUlEKDQpLmZvcm1hdCgpXG5cbiAgaWYgKHRhYmxlRGF0YS5kZWRpY2F0ZWQpIHtcbiAgICBjb25zdCBtb2RlbEtleSA9IG1vZGVsUGFyYW1LZXkobW9kZWxDbGFzcylcblxuICAgIGF3YWl0IGRiLnF1ZXJ5KGRiLmluc2VydFNxbCh7XG4gICAgICByZXR1cm5MYXN0SW5zZXJ0ZWRDb2x1bW5OYW1lczogW1wiaWRcIl0sXG4gICAgICB0YWJsZU5hbWU6IHRhYmxlRGF0YS50YWJsZU5hbWUsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGlkOiBhdWRpdElkLFxuICAgICAgICBbYCR7bW9kZWxLZXl9X2lkYF06IHJlY29yZC5pZCgpLFxuICAgICAgICBhdWRpdF9hY3Rpb25faWQ6IGF1ZGl0QWN0aW9uSWQsXG4gICAgICAgIGF1ZGl0ZWRfY2hhbmdlczogYXVkaXRlZENoYW5nZXMsXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgY3JlYXRlZF9hdDogY3VycmVudERhdGUsXG4gICAgICAgIHVwZGF0ZWRfYXQ6IGN1cnJlbnREYXRlXG4gICAgICB9XG4gICAgfSkpXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgYXVkaXRBdWRpdGFibGVUeXBlSWQgPSBhd2FpdCBmaW5kT3JDcmVhdGVMb29rdXBJZCh7XG4gICAgICBjb2x1bW5OYW1lOiBcIm5hbWVcIixcbiAgICAgIGN1cnJlbnREYXRlLFxuICAgICAgZGIsXG4gICAgICB0YWJsZU5hbWU6IFwiYXVkaXRfYXVkaXRhYmxlX3R5cGVzXCIsXG4gICAgICB2YWx1ZTogbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKVxuICAgIH0pXG5cbiAgICBhd2FpdCBkYi5xdWVyeShkYi5pbnNlcnRTcWwoe1xuICAgICAgcmV0dXJuTGFzdEluc2VydGVkQ29sdW1uTmFtZXM6IFtcImlkXCJdLFxuICAgICAgdGFibGVOYW1lOiBcImF1ZGl0c1wiLFxuICAgICAgZGF0YToge1xuICAgICAgICBpZDogYXVkaXRJZCxcbiAgICAgICAgYXVkaXRfYWN0aW9uX2lkOiBhdWRpdEFjdGlvbklkLFxuICAgICAgICBhdWRpdF9hdWRpdGFibGVfdHlwZV9pZDogYXVkaXRBdWRpdGFibGVUeXBlSWQsXG4gICAgICAgIGF1ZGl0YWJsZV9pZDogcmVjb3JkLmlkKCksXG4gICAgICAgIGF1ZGl0YWJsZV90eXBlOiBtb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpLFxuICAgICAgICBhdWRpdGVkX2NoYW5nZXM6IGF1ZGl0ZWRDaGFuZ2VzLFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIGNyZWF0ZWRfYXQ6IGN1cnJlbnREYXRlLFxuICAgICAgICB1cGRhdGVkX2F0OiBjdXJyZW50RGF0ZVxuICAgICAgfVxuICAgIH0pKVxuICB9XG5cbiAgYXdhaXQgZW1pdEF1ZGl0RXZlbnQobW9kZWxDbGFzcywgYWN0aW9uLCB7XG4gICAgYWN0aW9uLFxuICAgIGF1ZGl0SWQsXG4gICAgYXVkaXRlZENoYW5nZXMsXG4gICAgcGFyYW1zLFxuICAgIHJlY29yZFxuICB9KVxuXG4gIEF1ZGl0RXZlbnRzLmNhbGwobW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKSwgYWN0aW9uLCB7XG4gICAgYWN0aW9uLFxuICAgIGF1ZGl0SWQsXG4gICAgYXVkaXRlZENoYW5nZXMsXG4gICAgcGFyYW1zLFxuICAgIHJlY29yZFxuICB9KVxuXG4gIHJldHVybiBhdWRpdElkXG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTGlmZWN5Y2xlIGNhbGxiYWNrc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ2FwdHVyZXMgY3JlYXRlIGNoYW5nZXMgYmVmb3JlIHBlcnNpc3RlbmNlIGNsZWFycyB0aGUgY2hhbmdlIHNldC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0ICYge19wZW5kaW5nQ3JlYXRlQXVkaXRDaGFuZ2VzPzogQXVkaXRDaGFuZ2VzfX0gcmVjb3JkIC0gUmVjb3JkIHdob3NlIHBlbmRpbmcgY2hhbmdlcyBzaG91bGQgYmUgY2FwdHVyZWQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gY2FwdHVyZUNyZWF0ZUF1ZGl0Q2hhbmdlcyhyZWNvcmQpIHtcbiAgcmVjb3JkLl9wZW5kaW5nQ3JlYXRlQXVkaXRDaGFuZ2VzID0gYXVkaXRDaGFuZ2VzRm9yQ3VycmVudENoYW5nZXMocmVjb3JkKVxufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgY3JlYXRlIGF1ZGl0IHJvdyBmb3IgYSBtb2RlbCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0ICYge19wZW5kaW5nQ3JlYXRlQXVkaXRDaGFuZ2VzPzogQXVkaXRDaGFuZ2VzfX0gcmVjb3JkIC0gUmVjb3JkIHRvIGF1ZGl0LlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUNyZWF0ZUF1ZGl0KHJlY29yZCkge1xuICBhd2FpdCBjcmVhdGVBdWRpdChyZWNvcmQsIHtcbiAgICBhY3Rpb246IFwiY3JlYXRlXCIsXG4gICAgYXVkaXRlZENoYW5nZXM6IHJlY29yZC5fcGVuZGluZ0NyZWF0ZUF1ZGl0Q2hhbmdlcyB8fCBudWxsXG4gIH0pXG5cbiAgcmVjb3JkLl9wZW5kaW5nQ3JlYXRlQXVkaXRDaGFuZ2VzID0gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogQ2FwdHVyZXMgdXBkYXRlIGNoYW5nZXMgYmVmb3JlIHBlcnNpc3RlbmNlIGNsZWFycyB0aGUgY2hhbmdlIHNldC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0ICYge19wZW5kaW5nVXBkYXRlQXVkaXRDaGFuZ2VzPzogQXVkaXRDaGFuZ2VzfX0gcmVjb3JkIC0gUmVjb3JkIHdob3NlIHBlbmRpbmcgY2hhbmdlcyBzaG91bGQgYmUgY2FwdHVyZWQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gY2FwdHVyZVVwZGF0ZUF1ZGl0Q2hhbmdlcyhyZWNvcmQpIHtcbiAgcmVjb3JkLl9wZW5kaW5nVXBkYXRlQXVkaXRDaGFuZ2VzID0gYXVkaXRDaGFuZ2VzRm9yQ3VycmVudENoYW5nZXMocmVjb3JkKVxufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgdXBkYXRlIGF1ZGl0IHJvdyBmb3IgYSBtb2RlbCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0ICYge19wZW5kaW5nVXBkYXRlQXVkaXRDaGFuZ2VzPzogQXVkaXRDaGFuZ2VzfX0gcmVjb3JkIC0gUmVjb3JkIHRvIGF1ZGl0LlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVVwZGF0ZUF1ZGl0KHJlY29yZCkge1xuICBjb25zdCBhdWRpdGVkQ2hhbmdlcyA9IHJlY29yZC5fcGVuZGluZ1VwZGF0ZUF1ZGl0Q2hhbmdlcyB8fCBudWxsXG5cbiAgcmVjb3JkLl9wZW5kaW5nVXBkYXRlQXVkaXRDaGFuZ2VzID0gdW5kZWZpbmVkXG5cbiAgaWYgKCFhdWRpdGVkQ2hhbmdlcyB8fCBPYmplY3Qua2V5cyhhdWRpdGVkQ2hhbmdlcykubGVuZ3RoIDw9IDApIHJldHVyblxuXG4gIGF3YWl0IGNyZWF0ZUF1ZGl0KHJlY29yZCwge1xuICAgIGFjdGlvbjogXCJ1cGRhdGVcIixcbiAgICBhdWRpdGVkQ2hhbmdlc1xuICB9KVxufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgZGVzdHJveSBhdWRpdCByb3cgZm9yIGEgbW9kZWwgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gcmVjb3JkIC0gUmVjb3JkIHRvIGF1ZGl0LlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURlc3Ryb3lBdWRpdChyZWNvcmQpIHtcbiAgYXdhaXQgY3JlYXRlQXVkaXQocmVjb3JkLCB7XG4gICAgYWN0aW9uOiBcImRlc3Ryb3lcIixcbiAgICBhdWRpdGVkQ2hhbmdlczogYXVkaXRDaGFuZ2VzRm9yRGVzdHJveShyZWNvcmQpXG4gIH0pXG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ2hhbmdlcyBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDYXB0dXJlcyB0aGUgbmV3IHZhbHVlcyBmb3IgZmllbGRzIGNoYW5nZWQgb24gYSByZWNvcmQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gcmVjb3JkIC0gUmVjb3JkIHdob3NlIHBlbmRpbmcgY2hhbmdlcyBzaG91bGQgYmUgY2FwdHVyZWQuXG4gKiBAcmV0dXJucyB7QXVkaXRDaGFuZ2VzfSBOZXcgdmFsdWVzIGtleWVkIGJ5IGF0dHJpYnV0ZSBuYW1lLlxuICovXG5mdW5jdGlvbiBhdWRpdENoYW5nZXNGb3JDdXJyZW50Q2hhbmdlcyhyZWNvcmQpIHtcbiAgY29uc3QgY2hhbmdlcyA9IHJlY29yZC5jaGFuZ2VzKClcbiAgLyoqIEB0eXBlIHtBdWRpdENoYW5nZXN9ICovXG4gIGNvbnN0IGF1ZGl0ZWRDaGFuZ2VzID0ge31cbiAgY29uc3QgY29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZSA9IHJlY29yZC5nZXRNb2RlbENsYXNzKCkuZ2V0Q29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZU1hcCgpXG5cbiAgZm9yIChjb25zdCBbYXR0cmlidXRlTmFtZSwgY2hhbmdlXSBvZiBPYmplY3QuZW50cmllcyhjaGFuZ2VzKSkge1xuICAgIGF1ZGl0ZWRDaGFuZ2VzW2NvbHVtbk5hbWVUb0F0dHJpYnV0ZU5hbWVbYXR0cmlidXRlTmFtZV0gfHwgYXR0cmlidXRlTmFtZV0gPSBjaGFuZ2VbMV1cbiAgfVxuXG4gIHJldHVybiBhdWRpdGVkQ2hhbmdlc1xufVxuXG4vKipcbiAqIENhcHR1cmVzIHRoZSBjdXJyZW50IGF0dHJpYnV0ZXMgZm9yIGEgZGVzdHJveSBhdWRpdC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSByZWNvcmQgLSBSZWNvcmQgYmVpbmcgZGVzdHJveWVkLlxuICogQHJldHVybnMge0F1ZGl0Q2hhbmdlc30gQ3VycmVudCBhdHRyaWJ1dGVzIGtleWVkIGJ5IGF0dHJpYnV0ZSBuYW1lLlxuICovXG5mdW5jdGlvbiBhdWRpdENoYW5nZXNGb3JEZXN0cm95KHJlY29yZCkge1xuICByZXR1cm4gey4uLnJlY29yZC5hdHRyaWJ1dGVzKCl9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gd2l0aG91dEF1ZGl0XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZXR1cm5zIHJlY29yZHMgd2l0aG91dCBhbiBhdWRpdCByb3cgZm9yIHRoZSBnaXZlbiBhY3Rpb24uXG4gKiBVc2VzIHNoYXJlZC10YWJsZSBkZWZhdWx0cyB3aGVuIHRhYmxlIGRhdGEgaXMgbm90IHlldCByZXNvbHZlZDtcbiAqIHN3aXRjaGVzIHRvIHRoZSBkZWRpY2F0ZWQgdGFibGUgcGF0aCBvbmNlIHJlc29sdmVkLlxuICogQHRlbXBsYXRlIHtBdWRpdGVkTW9kZWxDbGFzc30gTUNcbiAqIEBwYXJhbSB7TUN9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcyB0byBzY29wZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb24gLSBBdWRpdCBhY3Rpb24gdG8gZXhjbHVkZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0PE1DPn0gUXVlcnkgc2NvcGVkIHRvIHJlY29yZHMgd2l0aG91dCB0aGF0IGF1ZGl0IGFjdGlvbi5cbiAqL1xuZnVuY3Rpb24gd2l0aG91dEF1ZGl0KG1vZGVsQ2xhc3MsIGFjdGlvbikge1xuICBjb25zdCBkYiA9IG1vZGVsQ2xhc3MuY29ubmVjdGlvbigpXG4gIGNvbnN0IG1vZGVsVGFibGVTcWwgPSBkYi5xdW90ZVRhYmxlKG1vZGVsQ2xhc3MudGFibGVOYW1lKCkpXG4gIGNvbnN0IGF1ZGl0QWN0aW9uc1RhYmxlU3FsID0gZGIucXVvdGVUYWJsZShcImF1ZGl0X2FjdGlvbnNcIilcbiAgY29uc3QgbW9kZWxQcmltYXJ5S2V5U3FsID0gYCR7bW9kZWxUYWJsZVNxbH0uJHtkYi5xdW90ZUNvbHVtbihtb2RlbENsYXNzLnByaW1hcnlLZXkoKSl9YFxuICBjb25zdCBhdWRpdEFjdGlvbnNJZFNxbCA9IGAke2F1ZGl0QWN0aW9uc1RhYmxlU3FsfS4ke2RiLnF1b3RlQ29sdW1uKFwiaWRcIil9YFxuICBjb25zdCBhdWRpdEFjdGlvbnNBY3Rpb25TcWwgPSBgJHthdWRpdEFjdGlvbnNUYWJsZVNxbH0uJHtkYi5xdW90ZUNvbHVtbihcImFjdGlvblwiKX1gXG5cbiAgaWYgKG1vZGVsQ2xhc3MuX2F1ZGl0VGFibGVSZXNvbHZlZCAmJiBtb2RlbENsYXNzLl9hdWRpdFRhYmxlRGF0YT8uZGVkaWNhdGVkKSB7XG4gICAgY29uc3QgdGFibGVEYXRhID0gbW9kZWxDbGFzcy5fYXVkaXRUYWJsZURhdGFcbiAgICBjb25zdCBtb2RlbEtleSA9IG1vZGVsUGFyYW1LZXkobW9kZWxDbGFzcylcbiAgICBjb25zdCBhdWRpdHNUYWJsZVNxbCA9IGRiLnF1b3RlVGFibGUodGFibGVEYXRhLnRhYmxlTmFtZSlcbiAgICBjb25zdCBhdWRpdEFjdGlvbklkU3FsID0gYCR7YXVkaXRzVGFibGVTcWx9LiR7ZGIucXVvdGVDb2x1bW4oXCJhdWRpdF9hY3Rpb25faWRcIil9YFxuICAgIGNvbnN0IG1vZGVsSWRTcWwgPSBgJHthdWRpdHNUYWJsZVNxbH0uJHtkYi5xdW90ZUNvbHVtbihgJHttb2RlbEtleX1faWRgKX1gXG5cbiAgICByZXR1cm4gbW9kZWxDbGFzc1xuICAgICAgLmFsbCgpXG4gICAgICAud2hlcmUoYFxuICAgICAgICBOT1QgRVhJU1RTIChcbiAgICAgICAgICBTRUxFQ1QgMVxuICAgICAgICAgIEZST00gJHthdWRpdHNUYWJsZVNxbH1cbiAgICAgICAgICBJTk5FUiBKT0lOICR7YXVkaXRBY3Rpb25zVGFibGVTcWx9XG4gICAgICAgICAgICBPTiAke2F1ZGl0QWN0aW9uc0lkU3FsfSA9ICR7YXVkaXRBY3Rpb25JZFNxbH1cbiAgICAgICAgICBXSEVSRSAke21vZGVsSWRTcWx9ID0gJHttb2RlbFByaW1hcnlLZXlTcWx9XG4gICAgICAgICAgICBBTkQgJHthdWRpdEFjdGlvbnNBY3Rpb25TcWx9ID0gJHtkYi5xdW90ZShub3JtYWxpemVBY3Rpb24oYWN0aW9uKSl9XG4gICAgICAgIClcbiAgICAgIGApXG4gIH1cblxuICBjb25zdCBhdWRpdHNUYWJsZVNxbCA9IGRiLnF1b3RlVGFibGUoXCJhdWRpdHNcIilcbiAgY29uc3QgYXVkaXRBdWRpdGFibGVJZFNxbCA9IGAke2F1ZGl0c1RhYmxlU3FsfS4ke2RiLnF1b3RlQ29sdW1uKFwiYXVkaXRhYmxlX2lkXCIpfWBcbiAgY29uc3QgYXVkaXRBdWRpdGFibGVUeXBlU3FsID0gYCR7YXVkaXRzVGFibGVTcWx9LiR7ZGIucXVvdGVDb2x1bW4oXCJhdWRpdGFibGVfdHlwZVwiKX1gXG4gIGNvbnN0IGF1ZGl0QWN0aW9uSWRTcWwgPSBgJHthdWRpdHNUYWJsZVNxbH0uJHtkYi5xdW90ZUNvbHVtbihcImF1ZGl0X2FjdGlvbl9pZFwiKX1gXG5cbiAgcmV0dXJuIG1vZGVsQ2xhc3NcbiAgICAuYWxsKClcbiAgICAud2hlcmUoYFxuICAgICAgTk9UIEVYSVNUUyAoXG4gICAgICAgIFNFTEVDVCAxXG4gICAgICAgIEZST00gJHthdWRpdHNUYWJsZVNxbH1cbiAgICAgICAgSU5ORVIgSk9JTiAke2F1ZGl0QWN0aW9uc1RhYmxlU3FsfVxuICAgICAgICAgIE9OICR7YXVkaXRBY3Rpb25zSWRTcWx9ID0gJHthdWRpdEFjdGlvbklkU3FsfVxuICAgICAgICBXSEVSRSAke2F1ZGl0QXVkaXRhYmxlVHlwZVNxbH0gPSAke2RiLnF1b3RlKG1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKCkpfVxuICAgICAgICAgIEFORCAke2F1ZGl0QXVkaXRhYmxlSWRTcWx9ID0gJHttb2RlbFByaW1hcnlLZXlTcWx9XG4gICAgICAgICAgQU5EICR7YXVkaXRBY3Rpb25zQWN0aW9uU3FsfSA9ICR7ZGIucXVvdGUobm9ybWFsaXplQWN0aW9uKGFjdGlvbikpfVxuICAgICAgKVxuICAgIGApXG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRXZlbnQgY2FsbGJhY2tzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBwZXItbW9kZWwgY2FsbGJhY2sgZmlyZWQgYWZ0ZXIgYW4gYXVkaXQgcm93IGlzIGNyZWF0ZWQuXG4gKiBAcGFyYW0ge0F1ZGl0ZWRNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MgdG8gb2JzZXJ2ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb24gLSBBdWRpdCBhY3Rpb24gbmFtZSAoZS5nLiBcImNyZWF0ZVwiKS5cbiAqIEBwYXJhbSB7QXVkaXRDYWxsYmFja30gY2FsbGJhY2sgLSBDYWxsYmFjayBpbnZva2VkIGFmdGVyIG1hdGNoaW5nIGF1ZGl0IHJvd3MgYXJlIGNyZWF0ZWQuXG4gKiBAcmV0dXJucyB7KCkgPT4gdm9pZH0gVW5zdWJzY3JpYmUgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyQXVkaXRDYWxsYmFjayhtb2RlbENsYXNzLCBhY3Rpb24sIGNhbGxiYWNrKSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRBY3Rpb24gPSBub3JtYWxpemVBY3Rpb24oYWN0aW9uKVxuICBjb25zdCBjYWxsYmFja3MgPSBhdWRpdENhbGxiYWNrc0Zvck1vZGVsQ2xhc3MobW9kZWxDbGFzcylcblxuICBpZiAoIWNhbGxiYWNrc1tub3JtYWxpemVkQWN0aW9uXSkge1xuICAgIGNhbGxiYWNrc1tub3JtYWxpemVkQWN0aW9uXSA9IFtdXG4gIH1cblxuICBjYWxsYmFja3Nbbm9ybWFsaXplZEFjdGlvbl0ucHVzaChjYWxsYmFjaylcblxuICByZXR1cm4gKCkgPT4ge1xuICAgIGNvbnN0IGFjdGlvbkNhbGxiYWNrcyA9IGNhbGxiYWNrc1tub3JtYWxpemVkQWN0aW9uXVxuICAgIGNvbnN0IGluZGV4ID0gYWN0aW9uQ2FsbGJhY2tzLmluZGV4T2YoY2FsbGJhY2spXG5cbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgYWN0aW9uQ2FsbGJhY2tzLnNwbGljZShpbmRleCwgMSlcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBFbWl0cyBwZXItbW9kZWwgYXVkaXQgY2FsbGJhY2tzIGZvciBhIG1vZGVsL2FjdGlvbiBwYWlyLlxuICogQHBhcmFtIHtBdWRpdGVkTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbiAtIEF1ZGl0IGFjdGlvbi5cbiAqIEBwYXJhbSB7QXVkaXRFdmVudFBheWxvYWR9IHBheWxvYWQgLSBFdmVudCBwYXlsb2FkLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVtaXRBdWRpdEV2ZW50KG1vZGVsQ2xhc3MsIGFjdGlvbiwgcGF5bG9hZCkge1xuICBjb25zdCBjYWxsYmFja3MgPSBhdWRpdENhbGxiYWNrc0Zvck1vZGVsQ2xhc3MobW9kZWxDbGFzcylbYWN0aW9uXSB8fCBbXVxuXG4gIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgWy4uLmNhbGxiYWNrc10pIHtcbiAgICBhd2FpdCBjYWxsYmFjayhwYXlsb2FkKVxuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGVyLW1vZGVsIGNhbGxiYWNrIG1hcC5cbiAqIEBwYXJhbSB7QXVkaXRlZE1vZGVsQ2xhc3N9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBBdWRpdENhbGxiYWNrW10+fSBDYWxsYmFjayBtYXAga2V5ZWQgYnkgYWN0aW9uLlxuICovXG5mdW5jdGlvbiBhdWRpdENhbGxiYWNrc0Zvck1vZGVsQ2xhc3MobW9kZWxDbGFzcykge1xuICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2RlbENsYXNzLCBcIl9hdWRpdENhbGxiYWNrc1wiKSkge1xuICAgIG1vZGVsQ2xhc3MuX2F1ZGl0Q2FsbGJhY2tzID0ge31cbiAgfVxuXG4gIGNvbnN0IGNhbGxiYWNrcyA9IG1vZGVsQ2xhc3MuX2F1ZGl0Q2FsbGJhY2tzXG5cbiAgaWYgKCFjYWxsYmFja3MpIHRocm93IG5ldyBFcnJvcihgQXVkaXQgY2FsbGJhY2tzIHdlcmVuJ3QgaW5pdGlhbGl6ZWQgZm9yICR7bW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKX1gKVxuXG4gIHJldHVybiBjYWxsYmFja3Ncbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBMb29rdXAgaGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogRmluZHMgb3IgY3JlYXRlcyBhIGxvb2t1cCByb3cgYW5kIHJldHVybnMgaXRzIGlkLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNvbHVtbk5hbWUgLSBMb29rdXAgdmFsdWUgY29sdW1uIG5hbWUuXG4gKiBAcGFyYW0ge0RhdGV9IGFyZ3MuY3VycmVudERhdGUgLSBUaW1lc3RhbXAgdG8gd3JpdGUgd2hlbiBpbnNlcnRpbmcuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBhcmdzLmRiIC0gRGF0YWJhc2UgZHJpdmVyLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudGFibGVOYW1lIC0gTG9va3VwIHRhYmxlIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy52YWx1ZSAtIExvb2t1cCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlciB8IHN0cmluZz59IExvb2t1cCByb3cgaWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpbmRPckNyZWF0ZUxvb2t1cElkKHtjb2x1bW5OYW1lLCBjdXJyZW50RGF0ZSwgZGIsIHRhYmxlTmFtZSwgdmFsdWV9KSB7XG4gIGF3YWl0IGRiLnVwc2VydCh7XG4gICAgdGFibGVOYW1lLFxuICAgIGNvbmZsaWN0Q29sdW1uczogW2NvbHVtbk5hbWVdLFxuICAgIHVwZGF0ZUNvbHVtbnM6IFtjb2x1bW5OYW1lXSxcbiAgICBkYXRhOiB7XG4gICAgICBpZDogbmV3IFVVSUQoNCkuZm9ybWF0KCksXG4gICAgICBbY29sdW1uTmFtZV06IHZhbHVlLFxuICAgICAgY3JlYXRlZF9hdDogY3VycmVudERhdGUsXG4gICAgICB1cGRhdGVkX2F0OiBjdXJyZW50RGF0ZVxuICAgIH1cbiAgfSlcblxuICBjb25zdCBpZCA9IGF3YWl0IGZpbmRMb29rdXBJZCh7Y29sdW1uTmFtZSwgZGIsIHRhYmxlTmFtZSwgdmFsdWV9KVxuXG4gIGlmIChpZCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kICR7dGFibGVOYW1lfS4ke2NvbHVtbk5hbWV9IGFmdGVyIHVwc2VydGApXG5cbiAgcmV0dXJuIGlkXG59XG5cbi8qKlxuICogRmluZHMgYSBsb29rdXAgaWQgYnkgdmFsdWUuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY29sdW1uTmFtZSAtIExvb2t1cCB2YWx1ZSBjb2x1bW4gbmFtZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGFyZ3MuZGIgLSBEYXRhYmFzZSBkcml2ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy50YWJsZU5hbWUgLSBMb29rdXAgdGFibGUgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnZhbHVlIC0gTG9va3VwIHZhbHVlLlxuICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyIHwgc3RyaW5nIHwgbnVsbD59IExvb2t1cCByb3cgaWQgb3IgbnVsbC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmluZExvb2t1cElkKHtjb2x1bW5OYW1lLCBkYiwgdGFibGVOYW1lLCB2YWx1ZX0pIHtcbiAgY29uc3Qgcm93cyA9IC8qKiBAdHlwZSB7QXJyYXk8e2lkOiBudW1iZXIgfCBzdHJpbmd9Pn0gKi8gKGF3YWl0IGRiLnF1ZXJ5KGBcbiAgICBTRUxFQ1QgJHtkYi5xdW90ZUNvbHVtbihcImlkXCIpfSBBUyBpZFxuICAgIEZST00gJHtkYi5xdW90ZVRhYmxlKHRhYmxlTmFtZSl9XG4gICAgV0hFUkUgJHtkYi5xdW90ZUNvbHVtbihjb2x1bW5OYW1lKX0gPSAke2RiLnF1b3RlKHZhbHVlKX1cbiAgYCkpXG5cbiAgaWYgKHJvd3NbMF0pIHJldHVybiByb3dzWzBdLmlkXG5cbiAgcmV0dXJuIG51bGxcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGFuIGF1ZGl0IGFjdGlvbiBzdHJpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uIC0gQWN0aW9uIG5hbWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUcmltbWVkLCBub24tZW1wdHkgYWN0aW9uIG5hbWUuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUFjdGlvbihhY3Rpb24pIHtcbiAgY29uc3Qgbm9ybWFsaXplZEFjdGlvbiA9IGFjdGlvbi50cmltKClcblxuICBpZiAoIW5vcm1hbGl6ZWRBY3Rpb24pIHRocm93IG5ldyBFcnJvcihcIkF1ZGl0IGFjdGlvbiBtdXN0IGJlIHByZXNlbnRcIilcblxuICByZXR1cm4gbm9ybWFsaXplZEFjdGlvblxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE1pZ3JhdGlvbiBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBzaGFyZWQgYXVkaXQgdGFibGVzIG1pZ3JhdGlvbiB1cC9kb3duIGNhbGxiYWNrcyBmb3IgdXNlIGluc2lkZVxuICogYSBNaWdyYXRpb24gY2xhc3MuIFRoZSBgdGFibGVgIHBhcmFtZXRlciBpcyBhIE1pZ3JhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7e2lkPzoge3R5cGU6IHN0cmluZ319fSBbb3B0aW9uc10gLSBJRCBjb2x1bW4gb3B0aW9ucy5cbiAqIEByZXR1cm5zIHt7ZG93bjogKHRhYmxlOiBpbXBvcnQoXCIuLi9taWdyYXRpb24vaW5kZXguanNcIikuZGVmYXVsdCkgPT4gUHJvbWlzZTx2b2lkPiwgdXA6ICh0YWJsZTogaW1wb3J0KFwiLi4vbWlncmF0aW9uL2luZGV4LmpzXCIpLmRlZmF1bHQpID0+IFByb21pc2U8dm9pZD59fSAtIFVwL2Rvd24gY2FsbGJhY2tzIGZvciB0aGUgc2hhcmVkIGF1ZGl0IHRhYmxlcy5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlU2hhcmVkQXVkaXRUYWJsZXNNaWdyYXRpb24ob3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IG9wdHMgPSAvKiogQHR5cGUge3tpZD86IHt0eXBlOiBzdHJpbmd9fX0gKi8gKG9wdGlvbnMpXG4gIGNvbnN0IGlkT3B0aW9ucyA9IC8qKiBAdHlwZSB7e3R5cGU/OiBzdHJpbmd9fSAqLyAob3B0cy5pZCB8fCB7fSlcbiAgY29uc3QgdHlwZSA9IGlkT3B0aW9ucy50eXBlXG5cbiAgcmV0dXJuIHtcbiAgICBhc3luYyB1cCh0YWJsZSkge1xuICAgICAgYXdhaXQgdGFibGUuY3JlYXRlVGFibGUoXCJhdWRpdF9hY3Rpb25zXCIsIHtpZDogLyoqIEB0eXBlIHt7dHlwZT86IHN0cmluZ319ICovIChvcHRzLmlkIHx8IHt9KX0sICgvKiogQHR5cGUge3tzdHJpbmcobmFtZTogc3RyaW5nLCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQsIHRpbWVzdGFtcHMoKTogdm9pZH19ICovIHQpID0+IHtcbiAgICAgICAgdC5zdHJpbmcoXCJhY3Rpb25cIiwge2luZGV4OiB7dW5pcXVlOiB0cnVlfSwgbnVsbDogZmFsc2V9KVxuICAgICAgICB0LnRpbWVzdGFtcHMoKVxuICAgICAgfSlcblxuICAgICAgYXdhaXQgdGFibGUuY3JlYXRlVGFibGUoXCJhdWRpdF9hdWRpdGFibGVfdHlwZXNcIiwge2lkOiAvKiogQHR5cGUge3t0eXBlPzogc3RyaW5nfX0gKi8gKG9wdHMuaWQgfHwge30pfSwgKC8qKiBAdHlwZSB7e3N0cmluZyhuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCwgdGltZXN0YW1wcygpOiB2b2lkfX0gKi8gdCkgPT4ge1xuICAgICAgICB0LnN0cmluZyhcIm5hbWVcIiwge2luZGV4OiB7dW5pcXVlOiB0cnVlfSwgbnVsbDogZmFsc2V9KVxuICAgICAgICB0LnRpbWVzdGFtcHMoKVxuICAgICAgfSlcblxuICAgICAgYXdhaXQgdGFibGUuY3JlYXRlVGFibGUoXCJhdWRpdHNcIiwge2lkOiAvKiogQHR5cGUge3t0eXBlPzogc3RyaW5nfX0gKi8gKG9wdHMuaWQgfHwge30pfSwgKC8qKiBAdHlwZSB7e2pzb24obmFtZTogc3RyaW5nKTogdm9pZCwgcmVmZXJlbmNlcyhuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCwgdGltZXN0YW1wcygpOiB2b2lkfX0gKi8gdCkgPT4ge1xuICAgICAgICB0LnJlZmVyZW5jZXMoXCJhdWRpdF9hY3Rpb25cIiwge2ZvcmVpZ25LZXk6IHRydWUsIG51bGw6IGZhbHNlLCB0eXBlfSlcbiAgICAgICAgdC5yZWZlcmVuY2VzKFwiYXVkaXRfYXVkaXRhYmxlX3R5cGVcIiwge2ZvcmVpZ25LZXk6IHRydWUsIG51bGw6IGZhbHNlLCB0eXBlfSlcbiAgICAgICAgdC5yZWZlcmVuY2VzKFwiYXVkaXRhYmxlXCIsIHtudWxsOiBmYWxzZSwgcG9seW1vcnBoaWM6IHRydWUsIHR5cGV9KVxuICAgICAgICB0Lmpzb24oXCJhdWRpdGVkX2NoYW5nZXNcIilcbiAgICAgICAgdC5qc29uKFwicGFyYW1zXCIpXG4gICAgICAgIHQudGltZXN0YW1wcygpXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkb3duKHRhYmxlKSB7XG4gICAgICBhd2FpdCB0YWJsZS5kcm9wVGFibGUoXCJhdWRpdHNcIilcbiAgICAgIGF3YWl0IHRhYmxlLmRyb3BUYWJsZShcImF1ZGl0X2F1ZGl0YWJsZV90eXBlc1wiKVxuICAgICAgYXdhaXQgdGFibGUuZHJvcFRhYmxlKFwiYXVkaXRfYWN0aW9uc1wiKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGRlZGljYXRlZCBhdWRpdCB0YWJsZSBuYW1lIGZvciBhIGdpdmVuIG1vZGVsIHRhYmxlIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxUYWJsZU5hbWUgLSBNb2RlbCB0YWJsZSBuYW1lIChlLmcuIFwicHJvamVjdHNcIikuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBEZWRpY2F0ZWQgYXVkaXQgdGFibGUgbmFtZSAoZS5nLiBcInByb2plY3RfYXVkaXRzXCIpLlxuICovXG5mdW5jdGlvbiBkZWRpY2F0ZWRBdWRpdFRhYmxlTmFtZUZvclRhYmxlKG1vZGVsVGFibGVOYW1lKSB7XG4gIGlmIChtb2RlbFRhYmxlTmFtZS5lbmRzV2l0aChcInNcIikpIHtcbiAgICByZXR1cm4gYCR7bW9kZWxUYWJsZU5hbWUuc2xpY2UoMCwgLTEpfV9hdWRpdHNgXG4gIH1cblxuICByZXR1cm4gYCR7bW9kZWxUYWJsZU5hbWV9X2F1ZGl0c2Bcbn1cblxuZXhwb3J0IHtcbiAgQXVkaXRFdmVudHMsXG4gIGNhcHR1cmVDcmVhdGVBdWRpdENoYW5nZXMsXG4gIGNhcHR1cmVVcGRhdGVBdWRpdENoYW5nZXMsXG4gIGNyZWF0ZUF1ZGl0LFxuICBjcmVhdGVDcmVhdGVBdWRpdCxcbiAgY3JlYXRlRGVzdHJveUF1ZGl0LFxuICBjcmVhdGVVcGRhdGVBdWRpdCxcbiAgY3JlYXRlU2hhcmVkQXVkaXRUYWJsZXNNaWdyYXRpb24sXG4gIGRlZGljYXRlZEF1ZGl0VGFibGVOYW1lRm9yVGFibGUsXG4gIGluaXRpYWxpemVBdWRpdGVkTW9kZWxSZWxhdGlvbnNoaXBzLFxuICBpbml0aWFsaXplQXVkaXRpbmcsXG4gIHJlZ2lzdGVyQXVkaXRDYWxsYmFjayxcbiAgcmVnaXN0ZXJBdWRpdGluZyxcbiAgd2l0aG91dEF1ZGl0XG59XG4iXX0=
|
|
913
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXRpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvcmVjb3JkL2F1ZGl0aW5nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLElBQUksTUFBTSxXQUFXLENBQUE7QUFDNUIsT0FBTyxtQkFBbUIsTUFBTSw2QkFBNkIsQ0FBQTtBQUU3RDs7Ozs7O0dBTUc7QUFDSDs7O0dBR0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7R0FHRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7R0FPRztBQUVILHNGQUFzRjtBQUN0RixNQUFNLGtDQUFrQyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7QUFFeEQsc0VBQXNFO0FBQ3RFLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtBQUUzQywrREFBK0Q7QUFDL0QsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtBQUVqQyxNQUFNLDJCQUEyQixHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7QUFFakQsMkVBQTJFO0FBQzNFLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtBQUUvQyw4RUFBOEU7QUFDOUUsd0RBQXdEO0FBQ3hELDhFQUE4RTtBQUU5RSx1RkFBdUY7QUFDdkYsSUFBSSxzQkFBc0IsR0FBRyxFQUFFLENBQUE7QUFFL0IsOEJBQThCO0FBQzlCLE1BQU0sV0FBVyxHQUFHO0lBQ2xCOzs7OztPQUtHO0lBQ0gsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSTtRQUNyQixNQUFNLE9BQU8sR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDbEQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUV2QyxLQUFLLE1BQU0sUUFBUSxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3RDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNoQixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVE7UUFDNUIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDbEMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBQ25DLENBQUM7UUFFRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMxQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUE7UUFDM0MsQ0FBQztRQUVELHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUVuRCxPQUFPLEdBQUcsRUFBRTtZQUNWLE1BQU0sSUFBSSxHQUFHLHNCQUFzQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUE7WUFFbkQsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDVCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO2dCQUVwQyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDZixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQTtnQkFDdkIsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDLENBQUE7SUFDSCxDQUFDO0lBRUQsc0NBQXNDO0lBQ3RDLEtBQUs7UUFDSCxzQkFBc0IsR0FBRyxFQUFFLENBQUE7SUFDN0IsQ0FBQztDQUNGLENBQUE7QUFFRCw4RUFBOEU7QUFDOUUsa0JBQWtCO0FBQ2xCLDhFQUE4RTtBQUU5RTs7OztHQUlHO0FBQ0gsU0FBUyx1QkFBdUIsQ0FBQyxVQUFVO0lBQ3pDLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQTtJQUVwQyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN4QixPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO0lBQ3ZDLENBQUM7SUFFRCxPQUFPLEdBQUcsS0FBSyxTQUFTLENBQUE7QUFDMUIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxLQUFLLFVBQVUscUJBQXFCLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTO0lBQ3BFLE1BQU0sa0JBQWtCLEdBQUcsVUFBVSxJQUFJLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtJQUNoRSxNQUFNLGdCQUFnQixHQUFHLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUN6RixJQUFJLG1CQUFtQixHQUFHLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUUvRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUN6QixtQkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBQy9CLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsbUJBQW1CLENBQUMsQ0FBQTtJQUM1RCxDQUFDO0lBRUQsTUFBTSxlQUFlLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUE7SUFFakUsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUNwQix5QkFBeUIsQ0FBQyxVQUFVLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixDQUFDLENBQUE7UUFDeEUsT0FBTyxlQUFlLENBQUE7SUFDeEIsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLE1BQU0sbUJBQW1CLENBQUMsVUFBVSxFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixDQUFDLENBQUE7SUFDN0YsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLGlCQUFpQixFQUFFLENBQUE7SUFFcEQsU0FBUyxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFDLGFBQWEsRUFBQyxDQUFDLENBQUE7SUFDekQsTUFBTSxTQUFTLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLEVBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxrQkFBa0IsRUFBQyxDQUFDLENBQUE7SUFFNUYsVUFBVSxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUE7SUFDdEMsVUFBVSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQTtJQUNyQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsU0FBUyxDQUFDLENBQUE7SUFFcEQseUJBQXlCLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFBO0lBRWxFLE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILEtBQUssVUFBVSxtQkFBbUIsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLGdCQUFnQjtJQUN6RSxNQUFNLGNBQWMsR0FBRyx1QkFBdUIsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUMxRCxNQUFNLGVBQWUsR0FBRyxNQUFNLGlDQUFpQyxDQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixDQUFDLENBQUE7SUFFekgsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUNwQixNQUFNLFVBQVUsR0FBRyxtQkFBbUIsQ0FBQyxVQUFVLEVBQUUsY0FBYyxDQUFDLENBQUE7UUFDbEUsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRTFDLE9BQU87WUFDTCxVQUFVO1lBQ1YsU0FBUyxFQUFFLElBQUk7WUFDZixVQUFVLEVBQUUsR0FBRyxRQUFRLEtBQUs7WUFDNUIsU0FBUyxFQUFFLGNBQWM7U0FDMUIsQ0FBQTtJQUNILENBQUM7SUFFRCxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtJQUVwRCxNQUFNLGtCQUFrQixHQUFHLGFBQWEsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxLQUFLLENBQUE7SUFFaEUsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBQ3ZCLE9BQU87WUFDTCxVQUFVLEVBQUUsa0JBQWtCO1lBQzlCLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLFVBQVUsRUFBRSxjQUFjO1lBQzFCLFNBQVMsRUFBRSxRQUFRO1NBQ3BCLENBQUE7SUFDSCxDQUFDO0lBRUQsT0FBTztRQUNMLFVBQVUsRUFBRSxzQkFBc0IsQ0FBQyxVQUFVLENBQUM7UUFDOUMsU0FBUyxFQUFFLEtBQUs7UUFDaEIsVUFBVSxFQUFFLGNBQWM7UUFDMUIsU0FBUyxFQUFFLFFBQVE7S0FDcEIsQ0FBQTtBQUNILENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsS0FBSyxVQUFVLGlDQUFpQyxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLGdCQUFnQjtJQUNsRyxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtJQUNwRCxNQUFNLFFBQVEsR0FBRyxHQUFHLGdCQUFnQixJQUFJLFNBQVMsRUFBRSxDQUFBO0lBQ25ELElBQUksbUJBQW1CLEdBQUcsa0NBQWtDLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBRS9FLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ3pCLG1CQUFtQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7UUFDL0Isa0NBQWtDLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxtQkFBbUIsQ0FBQyxDQUFBO0lBQzVFLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUE7SUFFaEQsSUFBSSxPQUFPLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNoQyxPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLFVBQVUsQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUE7SUFDN0UsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRTdCLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFFekMsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUztJQUM5RCxJQUFJLFNBQVM7UUFBRSxPQUFPLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO0lBRWxELE1BQU0sa0JBQWtCLEdBQUcsVUFBVSxDQUFDLHFCQUFxQixFQUFFLENBQUE7SUFDN0QsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLGlCQUFpQixFQUFFLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLENBQUE7SUFFL0UsT0FBTyxHQUFHLGtCQUFrQixJQUFJLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFBO0FBQ3ZGLENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsd0JBQXdCO0FBQ3hCLDhFQUE4RTtBQUU5RTs7Ozs7R0FLRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsVUFBVTtJQUNsQyxNQUFNLGFBQWEsR0FBRyx1QkFBdUIsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUV6RDs7T0FFRztJQUNILE1BQU0sS0FBTSxTQUFRLGFBQWE7UUFDL0I7OztXQUdHO1FBQ0gsTUFBTSxDQUFDLFNBQVM7WUFDZCxPQUFPLFFBQVEsQ0FBQTtRQUNqQixDQUFDO0tBQ0Y7SUFFRCxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO0lBQzVFLDhCQUE4QixDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUVqRCxPQUFPLGtEQUFrRCxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDbkUsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLHNCQUFzQixDQUFDLFVBQVU7SUFDeEMsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLG1DQUFtQyxFQUFFO1FBQ2pFLENBQUMsQ0FBQyxVQUFVLFVBQVUsQ0FBQyxZQUFZLEVBQUUsRUFBRTtRQUN2QyxDQUFDLENBQUMsWUFBWSxVQUFVLENBQUMsK0JBQStCLEVBQUUsRUFBRSxDQUFBO0lBQzlELE1BQU0sUUFBUSxHQUFHLFVBQVUsVUFBVSxFQUFFLENBQUE7SUFDdkMsSUFBSSxVQUFVLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUU5QyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEIsVUFBVSxHQUFHLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQ3pDLGVBQWUsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBQzNDLENBQUM7SUFFRCxPQUFPLFVBQVUsQ0FBQTtBQUNuQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxTQUFTO0lBQ2hELE1BQU0sYUFBYSxHQUFHLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ3pELE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQTtJQUMzQyxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUE7SUFFMUM7O09BRUc7SUFDSCxNQUFNLFVBQVcsU0FBUSxhQUFhO1FBQ3BDOzs7V0FHRztRQUNILE1BQU0sQ0FBQyxTQUFTO1lBQ2QsT0FBTyxTQUFTLENBQUE7UUFDbEIsQ0FBQztLQUNGO0lBRUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsU0FBUyxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUE7SUFDN0YsOEJBQThCLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBQ3RELFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLEVBQUMsU0FBUyxFQUFFLFNBQVMsRUFBQyxDQUFDLENBQUE7SUFFdEQsT0FBTyxrREFBa0QsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0FBQ3hFLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsOEJBQThCLENBQUMsVUFBVSxFQUFFLFVBQVU7SUFDNUQsVUFBVSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQywrQkFBK0IsRUFBRSxDQUFDLENBQUE7SUFFOUUsSUFBSSxVQUFVLENBQUMsbUNBQW1DLEVBQUUsRUFBRSxDQUFDO1FBQ3JELFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLEVBQUMsTUFBTSxFQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO0lBQ2pHLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsdUJBQXVCLENBQUMsVUFBVTtJQUN6QyxJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBRW5ELE9BQU8sV0FBVyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLEtBQUssUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2hGLFdBQVcsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQ2xELENBQUM7SUFFRCxPQUFPLGtEQUFrRCxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUE7QUFDekUsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGFBQWEsQ0FBQyxVQUFVO0lBQy9CLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQTtJQUV0QyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNyRCxDQUFDO0FBRUQsOEVBQThFO0FBQzlFLGlFQUFpRTtBQUNqRSw4RUFBOEU7QUFFOUU7Ozs7OztHQU1HO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxVQUFVO0lBQ2xDLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxvQ0FBb0MsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxrQ0FBa0MsRUFBRSxDQUFDO1FBQzVJLE9BQU07SUFDUixDQUFDO0lBRUQsVUFBVSxDQUFDLGtDQUFrQyxHQUFHLElBQUksQ0FBQTtJQUNwRCx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUNyQyxVQUFVLENBQUMsWUFBWSxDQUFDLDJCQUEyQixDQUFDLENBQUE7SUFDcEQsVUFBVSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO0lBQzNDLFVBQVUsQ0FBQyxZQUFZLENBQUMsMkJBQTJCLENBQUMsQ0FBQTtJQUNwRCxVQUFVLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUE7SUFDM0MsVUFBVSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO0FBQy9DLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSxHQUFHLEVBQUU7SUFDckQsTUFBTSxFQUFDLGdCQUFnQixHQUFHLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQTtJQUN2QyxNQUFNLGlCQUFpQixHQUFHLGdDQUFnQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUE7SUFFdkUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGtDQUFrQyxFQUFFLENBQUM7UUFDMUQsT0FBTTtJQUNSLENBQUM7SUFFRCx5QkFBeUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO0lBRTVDLElBQUksZ0JBQWdCLElBQUksMkJBQTJCLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO1FBQ3ZFLE1BQU0scUJBQXFCLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtJQUNoRCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxLQUFLLFVBQVUsbUNBQW1DLENBQUMsYUFBYTtJQUM5RCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFBO0lBQ25FLE1BQU0sc0JBQXNCLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsMkJBQTJCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQTtJQUV6RyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUM1QixLQUFLLE1BQU0sVUFBVSxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ3RDLE1BQU0sa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDdEMsQ0FBQztRQUVELE9BQU07SUFDUixDQUFDO0lBRUQsTUFBTSxhQUFhLENBQUMsaUJBQWlCLENBQUMsRUFBQyxJQUFJLEVBQUUsd0NBQXdDLEVBQUMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNqRyxLQUFLLE1BQU0sVUFBVSxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ3RDLE1BQU0sa0JBQWtCLENBQUMsVUFBVSxFQUFFLEVBQUMsZ0JBQWdCLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtRQUNoRSxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsMkJBQTJCLENBQUMsVUFBVTtJQUM3QyxNQUFNLGlCQUFpQixHQUFHLGdDQUFnQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUE7SUFFdkUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGtDQUFrQyxFQUFFLENBQUM7UUFDMUQsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLElBQUksd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtBQUMvRixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyx5QkFBeUIsQ0FBQyxVQUFVLEVBQUUsU0FBUyxHQUFHLGlDQUFpQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLGdCQUFnQjtJQUN4SCxJQUFJLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQzdDLE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUUvRCxJQUFJLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3RFLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQTtRQUN2RyxDQUFDO1FBRUQsT0FBTTtJQUNSLENBQUM7SUFFRCxVQUFVLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxzQkFBc0IsRUFBRTtRQUNuRCxVQUFVLEVBQUUsU0FBUyxDQUFDLFVBQVU7UUFDaEMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxVQUFVO1FBQzNCLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTO0tBQ2xDLENBQUMsQ0FBQTtJQUNGLE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUUvRCwyQkFBMkIsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUE7SUFDN0MsWUFBWSxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7UUFDeEMsTUFBTSxhQUFhLEdBQUcsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDdEQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixFQUFFLENBQUE7UUFFNUMsSUFBSSxTQUFTO1lBQUUsT0FBTyxhQUFhLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLElBQUksWUFBWSxDQUFBO1FBQ3JGLElBQUksYUFBYSxDQUFDLElBQUksS0FBSyxDQUFDO1lBQUUsT0FBTyxDQUFDLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFbkUsTUFBTSxRQUFRLEdBQUcscUJBQXFCLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFBO1FBRXZFLE9BQU8sYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxZQUFZLENBQUE7SUFDcEQsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsb0JBQW9CLENBQUMsVUFBVTtJQUN0QyxJQUFJLGFBQWEsR0FBRyx5QkFBeUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUE7SUFFN0QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ25CLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBQ3pCLHlCQUF5QixDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUE7SUFDMUQsQ0FBQztJQUVELE9BQU8sYUFBYSxDQUFBO0FBQ3RCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLFNBQVM7SUFDbkQsT0FBTyxJQUFJLG1CQUFtQixDQUFDO1FBQzdCLFVBQVUsRUFBRSxTQUFTLENBQUMsVUFBVTtRQUNoQyxLQUFLLEVBQUUsU0FBUyxDQUFDLFVBQVU7UUFDM0IsVUFBVTtRQUNWLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTO1FBQ2pDLGdCQUFnQixFQUFFLFFBQVE7UUFDMUIsS0FBSyxFQUFFLHNCQUFzQjtRQUM3QixJQUFJLEVBQUUsU0FBUztLQUNoQixDQUFDLENBQUE7QUFDSixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsaUNBQWlDLENBQUMsVUFBVTtJQUNuRCxPQUFPO1FBQ0wsVUFBVSxFQUFFLHNCQUFzQixDQUFDLFVBQVUsQ0FBQztRQUM5QyxTQUFTLEVBQUUsS0FBSztRQUNoQixVQUFVLEVBQUUsY0FBYztRQUMxQixTQUFTLEVBQUUsUUFBUTtLQUNwQixDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLHNCQUFzQixDQUFDLEtBQUs7SUFDbkMsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtBQUMvRCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsd0JBQXdCLENBQUMsVUFBVTtJQUMxQyxJQUFJLENBQUMsVUFBVSxDQUFDLG1DQUFtQyxFQUFFLEVBQUUsQ0FBQztRQUN0RCxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFFRCxNQUFNLHdCQUF3QixHQUFHLFVBQVUsQ0FBQywyQkFBMkIsRUFBRSxDQUFBO0lBRXpFLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQzlCLE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUVELE9BQU8sVUFBVSxDQUFDLGlCQUFpQixFQUFFLENBQUMsMEJBQTBCLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtBQUM1RixDQUFDO0FBRUQsOEVBQThFO0FBQzlFLGtCQUFrQjtBQUNsQiw4RUFBOEU7QUFFOUU7Ozs7O0dBS0c7QUFDSCxLQUFLLFVBQVUsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJO0lBQ3JDLE1BQU0sVUFBVSxHQUFHLGdDQUFnQyxDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUE7SUFDNUUsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixFQUFFLENBQUE7SUFFNUMsSUFBSSxTQUFTO1FBQUUsT0FBTyxNQUFNLGdDQUFnQyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUE7SUFFdEYsT0FBTyxNQUFNLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUMsSUFBSSxFQUFFLEdBQUcsVUFBVSxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNySCxPQUFPLE1BQU0sZ0NBQWdDLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQTtJQUN6RSxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsS0FBSyxVQUFVLGdDQUFnQyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVTtJQUN0RSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLFVBQVUsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUE7SUFFMUcsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFBO0lBQzlCLE1BQU0sU0FBUyxHQUFHLE1BQU0scUJBQXFCLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFBO0lBQ3pGLE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDM0MsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQTtJQUNyRixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFBO0lBQzdELE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUE7SUFFOUIsTUFBTSxhQUFhLEdBQUcsTUFBTSxvQkFBb0IsQ0FBQztRQUMvQyxVQUFVLEVBQUUsUUFBUTtRQUNwQixXQUFXO1FBQ1gsRUFBRTtRQUNGLFNBQVMsRUFBRSxlQUFlO1FBQzFCLEtBQUssRUFBRSxNQUFNO0tBQ2QsQ0FBQyxDQUFBO0lBRUYsTUFBTSxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUE7SUFFcEMsSUFBSSxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDeEIsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRTFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQzFCLDZCQUE2QixFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ3JDLFNBQVMsRUFBRSxTQUFTLENBQUMsU0FBUztZQUM5QixJQUFJLEVBQUU7Z0JBQ0osRUFBRSxFQUFFLE9BQU87Z0JBQ1gsQ0FBQyxHQUFHLFFBQVEsS0FBSyxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRTtnQkFDL0IsZUFBZSxFQUFFLGFBQWE7Z0JBQzlCLGVBQWUsRUFBRSxjQUFjO2dCQUMvQixNQUFNO2dCQUNOLFVBQVUsRUFBRSxXQUFXO2dCQUN2QixVQUFVLEVBQUUsV0FBVzthQUN4QjtTQUNGLENBQUMsQ0FBQyxDQUFBO0lBQ0wsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLG9CQUFvQixHQUFHLE1BQU0sb0JBQW9CLENBQUM7WUFDdEQsVUFBVSxFQUFFLE1BQU07WUFDbEIsV0FBVztZQUNYLEVBQUU7WUFDRixTQUFTLEVBQUUsdUJBQXVCO1lBQ2xDLEtBQUssRUFBRSxVQUFVLENBQUMsWUFBWSxFQUFFO1NBQ2pDLENBQUMsQ0FBQTtRQUVGLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQzFCLDZCQUE2QixFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ3JDLFNBQVMsRUFBRSxRQUFRO1lBQ25CLElBQUksRUFBRTtnQkFDSixFQUFFLEVBQUUsT0FBTztnQkFDWCxlQUFlLEVBQUUsYUFBYTtnQkFDOUIsdUJBQXVCLEVBQUUsb0JBQW9CO2dCQUM3QyxZQUFZLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRTtnQkFDekIsY0FBYyxFQUFFLFVBQVUsQ0FBQyxZQUFZLEVBQUU7Z0JBQ3pDLGVBQWUsRUFBRSxjQUFjO2dCQUMvQixNQUFNO2dCQUNOLFVBQVUsRUFBRSxXQUFXO2dCQUN2QixVQUFVLEVBQUUsV0FBVzthQUN4QjtTQUNGLENBQUMsQ0FBQyxDQUFBO0lBQ0wsQ0FBQztJQUVELE1BQU0sY0FBYyxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUU7UUFDdkMsTUFBTTtRQUNOLE9BQU87UUFDUCxjQUFjO1FBQ2QsTUFBTTtRQUNOLE1BQU07S0FDUCxDQUFDLENBQUE7SUFFRixXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUU7UUFDbEQsTUFBTTtRQUNOLE9BQU87UUFDUCxjQUFjO1FBQ2QsTUFBTTtRQUNOLE1BQU07S0FDUCxDQUFDLENBQUE7SUFFRixPQUFPLE9BQU8sQ0FBQTtBQUNoQixDQUFDO0FBRUQsOEVBQThFO0FBQzlFLHNCQUFzQjtBQUN0Qiw4RUFBOEU7QUFFOUU7Ozs7R0FJRztBQUNILFNBQVMseUJBQXlCLENBQUMsTUFBTTtJQUN2QyxNQUFNLENBQUMsMEJBQTBCLEdBQUcsNkJBQTZCLENBQUMsTUFBTSxDQUFDLENBQUE7QUFDM0UsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxLQUFLLFVBQVUsaUJBQWlCLENBQUMsTUFBTTtJQUNyQyxNQUFNLFdBQVcsQ0FBQyxNQUFNLEVBQUU7UUFDeEIsTUFBTSxFQUFFLFFBQVE7UUFDaEIsY0FBYyxFQUFFLE1BQU0sQ0FBQywwQkFBMEIsSUFBSSxJQUFJO0tBQzFELENBQUMsQ0FBQTtJQUVGLE1BQU0sQ0FBQywwQkFBMEIsR0FBRyxTQUFTLENBQUE7QUFDL0MsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLHlCQUF5QixDQUFDLE1BQU07SUFDdkMsTUFBTSxDQUFDLDBCQUEwQixHQUFHLDZCQUE2QixDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQzNFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsS0FBSyxVQUFVLGlCQUFpQixDQUFDLE1BQU07SUFDckMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLDBCQUEwQixJQUFJLElBQUksQ0FBQTtJQUVoRSxNQUFNLENBQUMsMEJBQTBCLEdBQUcsU0FBUyxDQUFBO0lBRTdDLElBQUksQ0FBQyxjQUFjLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQztRQUFFLE9BQU07SUFFdEUsTUFBTSxXQUFXLENBQUMsTUFBTSxFQUFFO1FBQ3hCLE1BQU0sRUFBRSxRQUFRO1FBQ2hCLGNBQWM7S0FDZixDQUFDLENBQUE7QUFDSixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxNQUFNO0lBQ3RDLE1BQU0sV0FBVyxDQUFDLE1BQU0sRUFBRTtRQUN4QixNQUFNLEVBQUUsU0FBUztRQUNqQixjQUFjLEVBQUUsc0JBQXNCLENBQUMsTUFBTSxDQUFDO0tBQy9DLENBQUMsQ0FBQTtBQUNKLENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsa0JBQWtCO0FBQ2xCLDhFQUE4RTtBQUU5RTs7OztHQUlHO0FBQ0gsU0FBUyw2QkFBNkIsQ0FBQyxNQUFNO0lBQzNDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUNoQywyQkFBMkI7SUFDM0IsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFBO0lBQ3pCLE1BQU0seUJBQXlCLEdBQUcsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDLCtCQUErQixFQUFFLENBQUE7SUFFMUYsS0FBSyxNQUFNLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUM5RCxjQUFjLENBQUMseUJBQXlCLENBQUMsYUFBYSxDQUFDLElBQUksYUFBYSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3ZGLENBQUM7SUFFRCxPQUFPLGNBQWMsQ0FBQTtBQUN2QixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsc0JBQXNCLENBQUMsTUFBTTtJQUNwQyxPQUFPLEVBQUMsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUMsQ0FBQTtBQUNqQyxDQUFDO0FBRUQsOEVBQThFO0FBQzlFLGVBQWU7QUFDZiw4RUFBOEU7QUFFOUU7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLFlBQVksQ0FBQyxVQUFVLEVBQUUsTUFBTTtJQUN0QyxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUE7SUFDbEMsTUFBTSxnQkFBZ0IsR0FBRyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDOUQsTUFBTSxTQUFTLEdBQUcscUJBQXFCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO0lBQzlFLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUE7SUFDM0QsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFBO0lBQzNELE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxhQUFhLElBQUksRUFBRSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFBO0lBQ3hGLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxvQkFBb0IsSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUE7SUFDM0UsTUFBTSxxQkFBcUIsR0FBRyxHQUFHLG9CQUFvQixJQUFJLEVBQUUsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQTtJQUVuRixJQUFJLFNBQVMsRUFBRSxTQUFTLEVBQUUsQ0FBQztRQUN6QixNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDMUMsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDekQsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLGNBQWMsSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQTtRQUNqRixNQUFNLFVBQVUsR0FBRyxHQUFHLGNBQWMsSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDLEdBQUcsUUFBUSxLQUFLLENBQUMsRUFBRSxDQUFBO1FBRTFFLE9BQU8sVUFBVTthQUNkLEdBQUcsRUFBRTthQUNMLEtBQUssQ0FBQzs7O2lCQUdJLGNBQWM7dUJBQ1Isb0JBQW9CO2lCQUMxQixpQkFBaUIsTUFBTSxnQkFBZ0I7a0JBQ3RDLFVBQVUsTUFBTSxrQkFBa0I7a0JBQ2xDLHFCQUFxQixNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDOztPQUV2RSxDQUFDLENBQUE7SUFDTixDQUFDO0lBRUQsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUM5QyxNQUFNLG1CQUFtQixHQUFHLEdBQUcsY0FBYyxJQUFJLEVBQUUsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQTtJQUNqRixNQUFNLHFCQUFxQixHQUFHLEdBQUcsY0FBYyxJQUFJLEVBQUUsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFBO0lBQ3JGLE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxjQUFjLElBQUksRUFBRSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUE7SUFFakYsT0FBTyxVQUFVO1NBQ2QsR0FBRyxFQUFFO1NBQ0wsS0FBSyxDQUFDOzs7ZUFHSSxjQUFjO3FCQUNSLG9CQUFvQjtlQUMxQixpQkFBaUIsTUFBTSxnQkFBZ0I7Z0JBQ3RDLHFCQUFxQixNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUM5RCxtQkFBbUIsTUFBTSxrQkFBa0I7Z0JBQzNDLHFCQUFxQixNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDOztLQUV2RSxDQUFDLENBQUE7QUFDTixDQUFDO0FBRUQsOEVBQThFO0FBQzlFLGtCQUFrQjtBQUNsQiw4RUFBOEU7QUFFOUU7Ozs7OztHQU1HO0FBQ0gsU0FBUyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVE7SUFDekQsTUFBTSxnQkFBZ0IsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDaEQsTUFBTSxTQUFTLEdBQUcsMkJBQTJCLENBQUMsVUFBVSxDQUFDLENBQUE7SUFFekQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7UUFDakMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFBO0lBQ2xDLENBQUM7SUFFRCxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7SUFFMUMsT0FBTyxHQUFHLEVBQUU7UUFDVixNQUFNLGVBQWUsR0FBRyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtRQUNuRCxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRS9DLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2YsZUFBZSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDbEMsQ0FBQztJQUNILENBQUMsQ0FBQTtBQUNILENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxLQUFLLFVBQVUsY0FBYyxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsT0FBTztJQUN2RCxNQUFNLFNBQVMsR0FBRywyQkFBMkIsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUE7SUFFdkUsS0FBSyxNQUFNLFFBQVEsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUN0QyxNQUFNLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN6QixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLDJCQUEyQixDQUFDLFVBQVU7SUFDN0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLENBQUMsRUFBRSxDQUFDO1FBQ3pFLFVBQVUsQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFBO0lBQ2pDLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFBO0lBRTVDLElBQUksQ0FBQyxTQUFTO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsVUFBVSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUV2RyxPQUFPLFNBQVMsQ0FBQTtBQUNsQixDQUFDO0FBRUQsOEVBQThFO0FBQzlFLGlCQUFpQjtBQUNqQiw4RUFBOEU7QUFFOUU7Ozs7Ozs7OztHQVNHO0FBQ0gsS0FBSyxVQUFVLG9CQUFvQixDQUFDLEVBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBQztJQUNqRixNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDZCxTQUFTO1FBQ1QsZUFBZSxFQUFFLENBQUMsVUFBVSxDQUFDO1FBQzdCLGFBQWEsRUFBRSxDQUFDLFVBQVUsQ0FBQztRQUMzQixJQUFJLEVBQUU7WUFDSixFQUFFLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFO1lBQ3hCLENBQUMsVUFBVSxDQUFDLEVBQUUsS0FBSztZQUNuQixVQUFVLEVBQUUsV0FBVztZQUN2QixVQUFVLEVBQUUsV0FBVztTQUN4QjtLQUNGLENBQUMsQ0FBQTtJQUVGLE1BQU0sRUFBRSxHQUFHLE1BQU0sWUFBWSxDQUFDLEVBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQTtJQUVqRSxJQUFJLEVBQUUsS0FBSyxJQUFJO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsU0FBUyxJQUFJLFVBQVUsZUFBZSxDQUFDLENBQUE7SUFFekYsT0FBTyxFQUFFLENBQUE7QUFDWCxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxLQUFLLFVBQVUsWUFBWSxDQUFDLEVBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFDO0lBQzVELE1BQU0sSUFBSSxHQUFHLDJDQUEyQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDO2FBQzlELEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO1dBQ3RCLEVBQUUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDO1lBQ3ZCLEVBQUUsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7R0FDeEQsQ0FBQyxDQUFDLENBQUE7SUFFSCxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFFOUIsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsZUFBZSxDQUFDLE1BQU07SUFDN0IsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUE7SUFFdEMsSUFBSSxDQUFDLGdCQUFnQjtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQTtJQUV0RSxPQUFPLGdCQUFnQixDQUFBO0FBQ3pCLENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsb0JBQW9CO0FBQ3BCLDhFQUE4RTtBQUU5RTs7Ozs7R0FLRztBQUNILFNBQVMsZ0NBQWdDLENBQUMsT0FBTyxHQUFHLEVBQUU7SUFDcEQsTUFBTSxJQUFJLEdBQUcsb0NBQW9DLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUMzRCxNQUFNLFNBQVMsR0FBRyw4QkFBOEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7SUFDaEUsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQTtJQUUzQixPQUFPO1FBQ0wsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLO1lBQ1osTUFBTSxLQUFLLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxFQUFDLEVBQUUsRUFBRSw4QkFBOEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUMsRUFBRSxDQUFDLGlHQUFpRyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNyTSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFDLEtBQUssRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQTtnQkFDeEQsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFBO1lBQ2hCLENBQUMsQ0FBQyxDQUFBO1lBRUYsTUFBTSxLQUFLLENBQUMsV0FBVyxDQUFDLHVCQUF1QixFQUFFLEVBQUMsRUFBRSxFQUFFLDhCQUE4QixDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBQyxFQUFFLENBQUMsaUdBQWlHLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQzdNLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUMsS0FBSyxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO2dCQUN0RCxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUE7WUFDaEIsQ0FBQyxDQUFDLENBQUE7WUFFRixNQUFNLEtBQUssQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLEVBQUMsRUFBRSxFQUFFLDhCQUE4QixDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBQyxFQUFFLENBQUMsK0hBQStILENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQzVOLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLEVBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7Z0JBQ25FLENBQUMsQ0FBQyxVQUFVLENBQUMsc0JBQXNCLEVBQUUsRUFBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtnQkFDM0UsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtnQkFDakUsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO2dCQUN6QixDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO2dCQUNoQixDQUFDLENBQUMsVUFBVSxFQUFFLENBQUE7WUFDaEIsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDO1FBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQ2QsTUFBTSxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQy9CLE1BQU0sS0FBSyxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO1lBQzlDLE1BQU0sS0FBSyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQTtRQUN4QyxDQUFDO0tBQ0YsQ0FBQTtBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUywrQkFBK0IsQ0FBQyxjQUFjO0lBQ3JELElBQUksY0FBYyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2pDLE9BQU8sR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7SUFDaEQsQ0FBQztJQUVELE9BQU8sR0FBRyxjQUFjLFNBQVMsQ0FBQTtBQUNuQyxDQUFDO0FBRUQsT0FBTyxFQUNMLFdBQVcsRUFDWCx5QkFBeUIsRUFDekIseUJBQXlCLEVBQ3pCLFdBQVcsRUFDWCxpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLGlCQUFpQixFQUNqQixnQ0FBZ0MsRUFDaEMsK0JBQStCLEVBQy9CLG1DQUFtQyxFQUNuQyxrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixZQUFZLEVBQ2IsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgVVVJRCBmcm9tIFwicHVyZS11dWlkXCJcbmltcG9ydCBIYXNNYW55UmVsYXRpb25zaGlwIGZyb20gXCIuL3JlbGF0aW9uc2hpcHMvaGFzLW1hbnkuanNcIlxuXG4vKipcbiAqIEdsb2JhbCBhdWRpdCBldmVudCBidXMgbWF0Y2hpbmcgQWN0aXZlUmVjb3JkQXVkaXRhYmxlOjpFdmVudHMuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBdWRpdEV2ZW50c1R5cGVcbiAqIEBwcm9wZXJ0eSB7KHR5cGU6IHN0cmluZywgYWN0aW9uOiBzdHJpbmcsIGFyZ3M6IEF1ZGl0RXZlbnRQYXlsb2FkKSA9PiB2b2lkfSBjYWxsIC0gRmlyZSBhbGwgY2FsbGJhY2tzIGZvciBhIG1vZGVsIHR5cGUgKyBhY3Rpb24uXG4gKiBAcHJvcGVydHkgeyh0eXBlOiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nLCBjYWxsYmFjazogKGFyZ3M6IEF1ZGl0RXZlbnRQYXlsb2FkKSA9PiB2b2lkKSA9PiAoKSA9PiB2b2lkfSBjb25uZWN0IC0gUmVnaXN0ZXIgYSBjYWxsYmFjayBmb3IgYSBtb2RlbCB0eXBlICsgYWN0aW9uLiBSZXR1cm5zIGFuIHVuc3Vic2NyaWJlIGZ1bmN0aW9uLlxuICogQHByb3BlcnR5IHsoKSA9PiB2b2lkfSByZXNldCAtIENsZWFyIGFsbCByZWdpc3RlcmVkIGNhbGxiYWNrcy5cbiAqL1xuLyoqXG4gKiBBdWRpdENoYW5nZXMgdHlwZS5cbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IEF1ZGl0Q2hhbmdlc1xuICovXG5cbi8qKlxuICogQXVkaXRFdmVudFBheWxvYWQgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEF1ZGl0RXZlbnRQYXlsb2FkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYWN0aW9uIC0gQXVkaXQgYWN0aW9uIG5hbWUuXG4gKiBAcHJvcGVydHkge251bWJlciB8IHN0cmluZ30gYXVkaXRJZCAtIENyZWF0ZWQgYXVkaXQgcm93IGlkLlxuICogQHByb3BlcnR5IHtBdWRpdENoYW5nZXMgfCBudWxsfSBhdWRpdGVkQ2hhbmdlcyAtIENoYW5nZXMgY2FwdHVyZWQgZm9yIHRoZSBhdWRpdC5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+IHwgbnVsbH0gcGFyYW1zIC0gT3B0aW9uYWwgY2FsbGVyLXN1cHBsaWVkIGF1ZGl0IHBhcmFtcy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSByZWNvcmQgLSBBdWRpdGVkIHJlY29yZC5cbiAqL1xuXG4vKipcbiAqIEF1ZGl0Q2FsbGJhY2sgdHlwZS5cbiAqIEB0eXBlZGVmIHsocGF5bG9hZDogQXVkaXRFdmVudFBheWxvYWQpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+fSBBdWRpdENhbGxiYWNrXG4gKi9cblxuLyoqXG4gKiBDcmVhdGVBdWRpdEFyZ3MgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IENyZWF0ZUF1ZGl0QXJnc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdGlvbiAtIEF1ZGl0IGFjdGlvbiBuYW1lLlxuICogQHByb3BlcnR5IHtBdWRpdENoYW5nZXMgfCBudWxsfSBbYXVkaXRlZENoYW5nZXNdIC0gRXhwbGljaXQgY2hhbmdlcyB0byBwZXJzaXN0LlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4gfCBudWxsfSBbcGFyYW1zXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHN0b3JlIHdpdGggdGhlIGF1ZGl0LlxuICovXG5cbi8qKlxuICogQXVkaXRlZE1vZGVsQ2xhc3MgdHlwZS5cbiAqIEB0eXBlZGVmIHt0eXBlb2YgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0ICYge1xuICogICBfYXVkaXRDYWxsYmFja3M/OiBSZWNvcmQ8c3RyaW5nLCBBdWRpdENhbGxiYWNrW10+LFxuICogICBfYXVkaXRMaWZlY3ljbGVDYWxsYmFja3NSZWdpc3RlcmVkPzogYm9vbGVhbixcbiAqICAgX2F1ZGl0VGFibGVSZXNvbHZlZD86IGJvb2xlYW4sXG4gKiAgIF9hdWRpdFRhYmxlRGF0YT86IEF1ZGl0VGFibGVEYXRhXG4gKiB9fSBBdWRpdGVkTW9kZWxDbGFzc1xuICovXG5cbi8qKlxuICogQXVkaXRUYWJsZURhdGEgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEF1ZGl0VGFibGVEYXRhXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGRlZGljYXRlZCAtIFdoZXRoZXIgYSBkZWRpY2F0ZWQgYXVkaXQgdGFibGUgZXhpc3RzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRhYmxlTmFtZSAtIE5hbWUgb2YgdGhlIGF1ZGl0IHRhYmxlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZvcmVpZ25LZXkgLSBDb2x1bW4gbmFtZSB0aGF0IHJlZmVyZW5jZXMgdGhlIGF1ZGl0ZWQgbW9kZWwuXG4gKiBAcHJvcGVydHkge3R5cGVvZiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IGF1ZGl0Q2xhc3MgLSBUaGUgYXVkaXQgbW9kZWwgY2xhc3MgdG8gdXNlLlxuICovXG5cbi8qKiBAdHlwZSB7V2Vha01hcDxpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIE1hcDxzdHJpbmcsIGJvb2xlYW4+Pn0gKi9cbmNvbnN0IGRlZGljYXRlZFRhYmxlQ2FjaGVCeUNvbmZpZ3VyYXRpb24gPSBuZXcgV2Vha01hcCgpXG5cbi8qKiBAdHlwZSB7V2Vha01hcDxBdWRpdGVkTW9kZWxDbGFzcywgTWFwPHN0cmluZywgQXVkaXRUYWJsZURhdGE+Pn0gKi9cbmNvbnN0IGF1ZGl0VGFibGVEYXRhQnlNb2RlbCA9IG5ldyBXZWFrTWFwKClcblxuLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCB0eXBlb2YgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0Pn0gKi9cbmNvbnN0IGF1ZGl0Q2xhc3NDYWNoZSA9IG5ldyBNYXAoKVxuXG5jb25zdCBnZW5lcmF0ZWRBdWRpdFJlbGF0aW9uc2hpcHMgPSBuZXcgV2Vha1NldCgpXG5cbi8qKiBAdHlwZSB7V2Vha01hcDxBdWRpdGVkTW9kZWxDbGFzcywgTWFwPHN0cmluZywgSGFzTWFueVJlbGF0aW9uc2hpcD4+fSAqL1xuY29uc3QgYXVkaXRSZWxhdGlvbnNoaXBzQnlNb2RlbCA9IG5ldyBXZWFrTWFwKClcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBHbG9iYWwgZXZlbnQgYnVzIChsaWtlIEFjdGl2ZVJlY29yZEF1ZGl0YWJsZTo6RXZlbnRzKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgQXJyYXk8KGFyZ3M6IEF1ZGl0RXZlbnRQYXlsb2FkKSA9PiB2b2lkPj4+fSAqL1xubGV0IGdsb2JhbEV2ZW50Q29ubmVjdGlvbnMgPSB7fVxuXG4vKiogQHR5cGUge0F1ZGl0RXZlbnRzVHlwZX0gKi9cbmNvbnN0IEF1ZGl0RXZlbnRzID0ge1xuICAvKipcbiAgICogRmlyZSBhbGwgcmVnaXN0ZXJlZCBjYWxsYmFja3MgZm9yIGEgbW9kZWwgdHlwZSBhbmQgYWN0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIEF1ZGl0ZWQgbW9kZWwgdHlwZSB3aG9zZSBsaXN0ZW5lcnMgc2hvdWxkIGZpcmUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb24gLSBBdWRpdCBhY3Rpb24gd2hvc2UgbGlzdGVuZXJzIHNob3VsZCBmaXJlLlxuICAgKiBAcGFyYW0ge0F1ZGl0RXZlbnRQYXlsb2FkfSBhcmdzIC0gQXVkaXQgZXZlbnQgZGVsaXZlcmVkIHRvIG1hdGNoaW5nIGxpc3RlbmVycy5cbiAgICovXG4gIGNhbGwodHlwZSwgYWN0aW9uLCBhcmdzKSB7XG4gICAgY29uc3QgYWN0aW9ucyA9IGdsb2JhbEV2ZW50Q29ubmVjdGlvbnNbdHlwZV0gfHwge31cbiAgICBjb25zdCBjYWxsYmFja3MgPSBhY3Rpb25zW2FjdGlvbl0gfHwgW11cblxuICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgWy4uLmNhbGxiYWNrc10pIHtcbiAgICAgIGNhbGxiYWNrKGFyZ3MpXG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGNhbGxiYWNrIGZvciBhIG1vZGVsIHR5cGUgYW5kIGFjdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBBdWRpdGVkIG1vZGVsIHR5cGUgdG8gb2JzZXJ2ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbiAtIEF1ZGl0IGFjdGlvbiB0byBvYnNlcnZlLlxuICAgKiBAcGFyYW0geyhhcmdzOiBBdWRpdEV2ZW50UGF5bG9hZCkgPT4gdm9pZH0gY2FsbGJhY2sgLSBMaXN0ZW5lciBpbnZva2VkIGZvciBtYXRjaGluZyBhdWRpdCBldmVudHMuXG4gICAqIEByZXR1cm5zIHsoKSA9PiB2b2lkfSAtIENhbGxiYWNrIHRoYXQgcmVtb3ZlcyB0aGUgcmVnaXN0cmF0aW9uLlxuICAgKi9cbiAgY29ubmVjdCh0eXBlLCBhY3Rpb24sIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFnbG9iYWxFdmVudENvbm5lY3Rpb25zW3R5cGVdKSB7XG4gICAgICBnbG9iYWxFdmVudENvbm5lY3Rpb25zW3R5cGVdID0ge31cbiAgICB9XG5cbiAgICBpZiAoIWdsb2JhbEV2ZW50Q29ubmVjdGlvbnNbdHlwZV1bYWN0aW9uXSkge1xuICAgICAgZ2xvYmFsRXZlbnRDb25uZWN0aW9uc1t0eXBlXVthY3Rpb25dID0gW11cbiAgICB9XG5cbiAgICBnbG9iYWxFdmVudENvbm5lY3Rpb25zW3R5cGVdW2FjdGlvbl0ucHVzaChjYWxsYmFjaylcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb25zdCBsaXN0ID0gZ2xvYmFsRXZlbnRDb25uZWN0aW9uc1t0eXBlXT8uW2FjdGlvbl1cblxuICAgICAgaWYgKGxpc3QpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBsaXN0LmluZGV4T2YoY2FsbGJhY2spXG5cbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICBsaXN0LnNwbGljZShpbmRleCwgMSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKiogQ2xlYXIgYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2tzLiAqL1xuICByZXNldCgpIHtcbiAgICBnbG9iYWxFdmVudENvbm5lY3Rpb25zID0ge31cbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRhYmxlIGRldGVjdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogUmV0dXJucyB0aGUgZGVkaWNhdGVkIGF1ZGl0IHRhYmxlIG5hbWUgZm9yIGEgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge0F1ZGl0ZWRNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gQXVkaXRlZCBtb2RlbCBjbGFzcy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IGUuZy4gXCJwcm9qZWN0X2F1ZGl0c1wiIGZvciBhIFwicHJvamVjdHNcIiB0YWJsZS5cbiAqL1xuZnVuY3Rpb24gZGVkaWNhdGVkQXVkaXRUYWJsZU5hbWUobW9kZWxDbGFzcykge1xuICBjb25zdCB0YWJsZSA9IG1vZGVsQ2xhc3MudGFibGVOYW1lKClcblxuICBpZiAodGFibGUuZW5kc1dpdGgoXCJzXCIpKSB7XG4gICAgcmV0dXJuIGAke3RhYmxlLnNsaWNlKDAsIC0xKX1fYXVkaXRzYFxuICB9XG5cbiAgcmV0dXJuIGAke3RhYmxlfV9hdWRpdHNgXG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYXVkaXQgdGFibGUgZGF0YSBmb3IgYSBtb2RlbCBjbGFzcy4gQ2FjaGVkIHBlciBtb2RlbC5cbiAqIENhbGxlZCBsYXppbHkgb24gZmlyc3QgY3JlYXRlQXVkaXQgLyB3aXRob3V0QXVkaXQgLyByZWxhdGlvbnNoaXAgdXNhZ2UuXG4gKiBAcGFyYW0ge0F1ZGl0ZWRNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gQXVkaXRlZCBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IFtjb25uZWN0aW9uXSAtIEV4cGxpY2l0IHJlY29yZC1vd25lZCBjb25uZWN0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9vcGVyYXRpb24uanNcIikuZGVmYXVsdH0gW29wZXJhdGlvbl0gLSBFeHBsaWNpdCByZWNvcmQgb3BlcmF0aW9uLlxuICogQHJldHVybnMge1Byb21pc2U8QXVkaXRUYWJsZURhdGE+fSBSZXNvbHZlZCBhdWRpdCB0YWJsZSBtZXRhZGF0YS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUF1ZGl0VGFibGVEYXRhKG1vZGVsQ2xhc3MsIGNvbm5lY3Rpb24sIG9wZXJhdGlvbikge1xuICBjb25zdCByZXNvbHZlZENvbm5lY3Rpb24gPSBjb25uZWN0aW9uIHx8IG1vZGVsQ2xhc3MuY29ubmVjdGlvbigpXG4gIGNvbnN0IGRhdGFiYXNlSWRlbnRpdHkgPSBhdWRpdERhdGFiYXNlSWRlbnRpdHkobW9kZWxDbGFzcywgcmVzb2x2ZWRDb25uZWN0aW9uLCBvcGVyYXRpb24pXG4gIGxldCB0YWJsZURhdGFCeUlkZW50aXR5ID0gYXVkaXRUYWJsZURhdGFCeU1vZGVsLmdldChtb2RlbENsYXNzKVxuXG4gIGlmICghdGFibGVEYXRhQnlJZGVudGl0eSkge1xuICAgIHRhYmxlRGF0YUJ5SWRlbnRpdHkgPSBuZXcgTWFwKClcbiAgICBhdWRpdFRhYmxlRGF0YUJ5TW9kZWwuc2V0KG1vZGVsQ2xhc3MsIHRhYmxlRGF0YUJ5SWRlbnRpdHkpXG4gIH1cblxuICBjb25zdCBjYWNoZWRUYWJsZURhdGEgPSB0YWJsZURhdGFCeUlkZW50aXR5LmdldChkYXRhYmFzZUlkZW50aXR5KVxuXG4gIGlmIChjYWNoZWRUYWJsZURhdGEpIHtcbiAgICByZWdpc3RlckF1ZGl0UmVsYXRpb25zaGlwKG1vZGVsQ2xhc3MsIGNhY2hlZFRhYmxlRGF0YSwgZGF0YWJhc2VJZGVudGl0eSlcbiAgICByZXR1cm4gY2FjaGVkVGFibGVEYXRhXG4gIH1cblxuICBjb25zdCB0YWJsZURhdGEgPSBhd2FpdCBidWlsZEF1ZGl0VGFibGVEYXRhKG1vZGVsQ2xhc3MsIHJlc29sdmVkQ29ubmVjdGlvbiwgZGF0YWJhc2VJZGVudGl0eSlcbiAgY29uc3QgY29uZmlndXJhdGlvbiA9IG1vZGVsQ2xhc3MuX2dldENvbmZpZ3VyYXRpb24oKVxuXG4gIHRhYmxlRGF0YS5hdWRpdENsYXNzLnJlZ2lzdGVyUmVjb3JkQ2xhc3Moe2NvbmZpZ3VyYXRpb259KVxuICBhd2FpdCB0YWJsZURhdGEuYXVkaXRDbGFzcy5pbml0aWFsaXplUmVjb3JkKHtjb25maWd1cmF0aW9uLCBjb25uZWN0aW9uOiByZXNvbHZlZENvbm5lY3Rpb259KVxuXG4gIG1vZGVsQ2xhc3MuX2F1ZGl0VGFibGVEYXRhID0gdGFibGVEYXRhXG4gIG1vZGVsQ2xhc3MuX2F1ZGl0VGFibGVSZXNvbHZlZCA9IHRydWVcbiAgdGFibGVEYXRhQnlJZGVudGl0eS5zZXQoZGF0YWJhc2VJZGVudGl0eSwgdGFibGVEYXRhKVxuXG4gIHJlZ2lzdGVyQXVkaXRSZWxhdGlvbnNoaXAobW9kZWxDbGFzcywgdGFibGVEYXRhLCBkYXRhYmFzZUlkZW50aXR5KVxuXG4gIHJldHVybiB0YWJsZURhdGFcbn1cblxuLyoqXG4gKiBCdWlsZHMgYXVkaXQgdGFibGUgbWV0YWRhdGEgZm9yIGEgbW9kZWwgY2xhc3MuIFByZWZlcnMgdGhlIGNvbnN1bWVyJ3NcbiAqIHJlZ2lzdGVyZWQgQXVkaXQgbW9kZWwgZm9yIHNoYXJlZCB0YWJsZXM7IGZhbGxzIGJhY2sgdG8gYSBmcmFtZXdvcmstb3duZWRcbiAqIGR5bmFtaWMgY2xhc3MuXG4gKiBAcGFyYW0ge0F1ZGl0ZWRNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gQXVkaXRlZCBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGNvbm5lY3Rpb24gLSBFeHBsaWNpdCByZWNvcmQtb3duZWQgY29ubmVjdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhYmFzZUlkZW50aXR5IC0gQ2FwdHVyZWQgcGh5c2ljYWwgZGF0YWJhc2UgaWRlbnRpdHkuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBdWRpdFRhYmxlRGF0YT59IEF1ZGl0IHRhYmxlIG1ldGFkYXRhLlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZEF1ZGl0VGFibGVEYXRhKG1vZGVsQ2xhc3MsIGNvbm5lY3Rpb24sIGRhdGFiYXNlSWRlbnRpdHkpIHtcbiAgY29uc3QgZGVkaWNhdGVkVGFibGUgPSBkZWRpY2F0ZWRBdWRpdFRhYmxlTmFtZShtb2RlbENsYXNzKVxuICBjb25zdCBkZWRpY2F0ZWRFeGlzdHMgPSBhd2FpdCBkZWRpY2F0ZWRUYWJsZUV4aXN0c0ZvckNvbm5lY3Rpb24obW9kZWxDbGFzcywgZGVkaWNhdGVkVGFibGUsIGNvbm5lY3Rpb24sIGRhdGFiYXNlSWRlbnRpdHkpXG5cbiAgaWYgKGRlZGljYXRlZEV4aXN0cykge1xuICAgIGNvbnN0IGF1ZGl0Q2xhc3MgPSBkZWRpY2F0ZWRBdWRpdENsYXNzKG1vZGVsQ2xhc3MsIGRlZGljYXRlZFRhYmxlKVxuICAgIGNvbnN0IG1vZGVsS2V5ID0gbW9kZWxQYXJhbUtleShtb2RlbENsYXNzKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGF1ZGl0Q2xhc3MsXG4gICAgICBkZWRpY2F0ZWQ6IHRydWUsXG4gICAgICBmb3JlaWduS2V5OiBgJHttb2RlbEtleX1faWRgLFxuICAgICAgdGFibGVOYW1lOiBkZWRpY2F0ZWRUYWJsZVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBtb2RlbENsYXNzLl9nZXRDb25maWd1cmF0aW9uKClcblxuICBjb25zdCBjb25zdW1lckF1ZGl0Q2xhc3MgPSBjb25maWd1cmF0aW9uLmdldE1vZGVsQ2xhc3NlcygpLkF1ZGl0XG5cbiAgaWYgKGNvbnN1bWVyQXVkaXRDbGFzcykge1xuICAgIHJldHVybiB7XG4gICAgICBhdWRpdENsYXNzOiBjb25zdW1lckF1ZGl0Q2xhc3MsXG4gICAgICBkZWRpY2F0ZWQ6IGZhbHNlLFxuICAgICAgZm9yZWlnbktleTogXCJhdWRpdGFibGVfaWRcIixcbiAgICAgIHRhYmxlTmFtZTogXCJhdWRpdHNcIlxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYXVkaXRDbGFzczogY2FjaGVkU2hhcmVkQXVkaXRDbGFzcyhtb2RlbENsYXNzKSxcbiAgICBkZWRpY2F0ZWQ6IGZhbHNlLFxuICAgIGZvcmVpZ25LZXk6IFwiYXVkaXRhYmxlX2lkXCIsXG4gICAgdGFibGVOYW1lOiBcImF1ZGl0c1wiXG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIGRlZGljYXRlZCBhdWRpdCB0YWJsZSBleGlzdHMgZm9yIGEgbW9kZWwncyBjb25uZWN0aW9uLlxuICogQHBhcmFtIHtBdWRpdGVkTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIEF1ZGl0ZWQgbW9kZWwgY2xhc3Mgb3duaW5nIHRoZSBDb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIERlZGljYXRlZCBhdWRpdCB0YWJsZSBuYW1lIHRvIGNoZWNrLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gY29ubmVjdGlvbiAtIEV4cGxpY2l0IHJlY29yZC1vd25lZCBjb25uZWN0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IGRhdGFiYXNlSWRlbnRpdHkgLSBDYXB0dXJlZCBwaHlzaWNhbCBkYXRhYmFzZSBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBXaGV0aGVyIHRoZSB0YWJsZSBleGlzdHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlZGljYXRlZFRhYmxlRXhpc3RzRm9yQ29ubmVjdGlvbihtb2RlbENsYXNzLCB0YWJsZU5hbWUsIGNvbm5lY3Rpb24sIGRhdGFiYXNlSWRlbnRpdHkpIHtcbiAgY29uc3QgY29uZmlndXJhdGlvbiA9IG1vZGVsQ2xhc3MuX2dldENvbmZpZ3VyYXRpb24oKVxuICBjb25zdCBjYWNoZUtleSA9IGAke2RhdGFiYXNlSWRlbnRpdHl9OiR7dGFibGVOYW1lfWBcbiAgbGV0IGRlZGljYXRlZFRhYmxlQ2FjaGUgPSBkZWRpY2F0ZWRUYWJsZUNhY2hlQnlDb25maWd1cmF0aW9uLmdldChjb25maWd1cmF0aW9uKVxuXG4gIGlmICghZGVkaWNhdGVkVGFibGVDYWNoZSkge1xuICAgIGRlZGljYXRlZFRhYmxlQ2FjaGUgPSBuZXcgTWFwKClcbiAgICBkZWRpY2F0ZWRUYWJsZUNhY2hlQnlDb25maWd1cmF0aW9uLnNldChjb25maWd1cmF0aW9uLCBkZWRpY2F0ZWRUYWJsZUNhY2hlKVxuICB9XG5cbiAgY29uc3QgY2FjaGVkID0gZGVkaWNhdGVkVGFibGVDYWNoZS5nZXQoY2FjaGVLZXkpXG5cbiAgaWYgKHR5cGVvZiBjYWNoZWQgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgcmV0dXJuIGNhY2hlZFxuICB9XG5cbiAgY29uc3QgdGFibGUgPSBhd2FpdCBjb25uZWN0aW9uLmdldFRhYmxlQnlOYW1lKHRhYmxlTmFtZSwge3Rocm93RXJyb3I6IGZhbHNlfSlcbiAgY29uc3QgZXhpc3RzID0gQm9vbGVhbih0YWJsZSlcblxuICBkZWRpY2F0ZWRUYWJsZUNhY2hlLnNldChjYWNoZUtleSwgZXhpc3RzKVxuXG4gIHJldHVybiBleGlzdHNcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIGNhY2hlIGlkZW50aXR5IGZyb20gZXhwbGljaXQgb3BlcmF0aW9uIG93bmVyc2hpcCBvciB0aGUgYWN0dWFsXG4gKiBzdGFtcGVkIHBvb2wgY29ubmVjdGlvbi4gQW1iaWVudCB0ZW5hbnQgc3RhdGUgaXMgbmV2ZXIgdXNlZCB3aGVuIGFuXG4gKiBvcGVyYXRpb24gaXMgYXZhaWxhYmxlLlxuICogQHBhcmFtIHtBdWRpdGVkTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIEF1ZGl0ZWQgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBjb25uZWN0aW9uIC0gQWN0dWFsIGNvbm5lY3Rpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL29wZXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBbb3BlcmF0aW9uXSAtIEV4cGxpY2l0IG9wZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gUGh5c2ljYWwgZGF0YWJhc2UgaWRlbnRpdHkuXG4gKi9cbmZ1bmN0aW9uIGF1ZGl0RGF0YWJhc2VJZGVudGl0eShtb2RlbENsYXNzLCBjb25uZWN0aW9uLCBvcGVyYXRpb24pIHtcbiAgaWYgKG9wZXJhdGlvbikgcmV0dXJuIG9wZXJhdGlvbi5kYXRhYmFzZUlkZW50aXR5KClcblxuICBjb25zdCBkYXRhYmFzZUlkZW50aWZpZXIgPSBtb2RlbENsYXNzLmdldERhdGFiYXNlSWRlbnRpZmllcigpXG4gIGNvbnN0IHBvb2wgPSBtb2RlbENsYXNzLl9nZXRDb25maWd1cmF0aW9uKCkuZ2V0RGF0YWJhc2VQb29sKGRhdGFiYXNlSWRlbnRpZmllcilcblxuICByZXR1cm4gYCR7ZGF0YWJhc2VJZGVudGlmaWVyfToke3Bvb2wuZ2V0Q29ubmVjdGlvbkNvbmZpZ3VyYXRpb25SZXVzZUtleShjb25uZWN0aW9uKX1gXG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRHluYW1pYyBhdWRpdCBjbGFzc2VzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnJhbWV3b3JrLW93bmVkIHNoYXJlZCBBdWRpdCBjbGFzcyBmb3IgdGhlIGBhdWRpdHNgIHRhYmxlLlxuICogVGhpcyBpcyBvbmx5IHVzZWQgd2hlbiBubyBjb25zdW1lci1yZWdpc3RlcmVkIEF1ZGl0IG1vZGVsIGV4aXN0cy5cbiAqIEBwYXJhbSB7QXVkaXRlZE1vZGVsQ2xhc3N9IG1vZGVsQ2xhc3MgLSBBbnkgYXVkaXRlZCBtb2RlbCBjbGFzcyAodXNlZCB0byBsb2NhdGUgRGF0YWJhc2VSZWNvcmQpLlxuICogQHJldHVybnMge3R5cGVvZiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IFNoYXJlZCBBdWRpdCBtb2RlbCBjbGFzcy5cbiAqL1xuZnVuY3Rpb24gc2hhcmVkQXVkaXRDbGFzcyhtb2RlbENsYXNzKSB7XG4gIGNvbnN0IGRiUmVjb3JkQ2xhc3MgPSBmaW5kRGF0YWJhc2VSZWNvcmRDbGFzcyhtb2RlbENsYXNzKVxuXG4gIC8qKlxuICAgKiBGcmFtZXdvcmstb3duZWQgQXVkaXQgbW9kZWwgZm9yIHRoZSBzaGFyZWQgYGF1ZGl0c2AgdGFibGUuXG4gICAqL1xuICBjbGFzcyBBdWRpdCBleHRlbmRzIGRiUmVjb3JkQ2xhc3Mge1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGJhY2tpbmcgdGFibGUgbmFtZS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFNoYXJlZCBgYXVkaXRzYCB0YWJsZSBuYW1lLlxuICAgICAqL1xuICAgIHN0YXRpYyB0YWJsZU5hbWUoKSB7XG4gICAgICByZXR1cm4gXCJhdWRpdHNcIlxuICAgIH1cbiAgfVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBdWRpdCwgXCJtb2RlbE5hbWVcIiwge3ZhbHVlOiBcIkF1ZGl0XCIsIHdyaXRhYmxlOiBmYWxzZX0pXG4gIGFwcGx5QXVkaXRDbGFzc0RhdGFiYXNlUm91dGluZyhtb2RlbENsYXNzLCBBdWRpdClcblxuICByZXR1cm4gLyoqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSAqLyAoQXVkaXQpXG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY2FjaGVkIGZyYW1ld29yay1vd25lZCBzaGFyZWQgQXVkaXQgY2xhc3MgZm9yIGEgZGF0YWJhc2UuXG4gKiBAcGFyYW0ge0F1ZGl0ZWRNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gQW55IGF1ZGl0ZWQgbW9kZWwgY2xhc3MuXG4gKiBAcmV0dXJucyB7dHlwZW9mIGltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gU2hhcmVkIEF1ZGl0IG1vZGVsIGNsYXNzLlxuICovXG5mdW5jdGlvbiBjYWNoZWRTaGFyZWRBdWRpdENsYXNzKG1vZGVsQ2xhc3MpIHtcbiAgY29uc3Qgcm91dGluZ0tleSA9IG1vZGVsQ2xhc3MuaGFzVGVuYW50RGF0YWJhc2VJZGVudGlmaWVyUmVzb2x2ZXIoKVxuICAgID8gYHRlbmFudDoke21vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKCl9YFxuICAgIDogYGRhdGFiYXNlOiR7bW9kZWxDbGFzcy5nZXRDb25maWd1cmVkRGF0YWJhc2VJZGVudGlmaWVyKCl9YFxuICBjb25zdCBjYWNoZUtleSA9IGBzaGFyZWQ6JHtyb3V0aW5nS2V5fWBcbiAgbGV0IGF1ZGl0Q2xhc3MgPSBhdWRpdENsYXNzQ2FjaGUuZ2V0KGNhY2hlS2V5KVxuXG4gIGlmICghYXVkaXRDbGFzcykge1xuICAgIGF1ZGl0Q2xhc3MgPSBzaGFyZWRBdWRpdENsYXNzKG1vZGVsQ2xhc3MpXG4gICAgYXVkaXRDbGFzc0NhY2hlLnNldChjYWNoZUtleSwgYXVkaXRDbGFzcylcbiAgfVxuXG4gIHJldHVybiBhdWRpdENsYXNzXG59XG5cbi8qKlxuICogUmV0dXJucyBhIGR5bmFtaWMgcGVyLW1vZGVsIGF1ZGl0IGNsYXNzIGZvciBhIGRlZGljYXRlZCB0YWJsZS5cbiAqIEBwYXJhbSB7QXVkaXRlZE1vZGVsQ2xhc3N9IG1vZGVsQ2xhc3MgLSBBdWRpdGVkIG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIERlZGljYXRlZCBhdWRpdCB0YWJsZSBuYW1lIChlLmcuIFwicHJvamVjdF9hdWRpdHNcIikuXG4gKiBAcmV0dXJucyB7dHlwZW9mIGltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gRGVkaWNhdGVkIGF1ZGl0IG1vZGVsIGNsYXNzLlxuICovXG5mdW5jdGlvbiBkZWRpY2F0ZWRBdWRpdENsYXNzKG1vZGVsQ2xhc3MsIHRhYmxlTmFtZSkge1xuICBjb25zdCBkYlJlY29yZENsYXNzID0gZmluZERhdGFiYXNlUmVjb3JkQ2xhc3MobW9kZWxDbGFzcylcbiAgY29uc3QgbW9kZWxOYW1lID0gbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKVxuICBjb25zdCBtb2RlbEtleSA9IG1vZGVsUGFyYW1LZXkobW9kZWxDbGFzcylcblxuICAvKipcbiAgICogRnJhbWV3b3JrLW93bmVkIHBlci1tb2RlbCBBdWRpdCBjbGFzcy5cbiAgICovXG4gIGNsYXNzIE1vZGVsQXVkaXQgZXh0ZW5kcyBkYlJlY29yZENsYXNzIHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBiYWNraW5nIHRhYmxlIG5hbWUuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gLSBEZWRpY2F0ZWQgYXVkaXQgdGFibGUgc3VwcGxpZWQgZm9yIHRoaXMgbW9kZWwgY2xhc3MuXG4gICAgICovXG4gICAgc3RhdGljIHRhYmxlTmFtZSgpIHtcbiAgICAgIHJldHVybiB0YWJsZU5hbWVcbiAgICB9XG4gIH1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTW9kZWxBdWRpdCwgXCJtb2RlbE5hbWVcIiwge3ZhbHVlOiBgJHttb2RlbE5hbWV9QXVkaXRgLCB3cml0YWJsZTogZmFsc2V9KVxuICBhcHBseUF1ZGl0Q2xhc3NEYXRhYmFzZVJvdXRpbmcobW9kZWxDbGFzcywgTW9kZWxBdWRpdClcbiAgTW9kZWxBdWRpdC5iZWxvbmdzVG8obW9kZWxLZXksIHtjbGFzc05hbWU6IG1vZGVsTmFtZX0pXG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gKi8gKE1vZGVsQXVkaXQpXG59XG5cbi8qKlxuICogTWFrZXMgZnJhbWV3b3JrLW93bmVkIGF1ZGl0IGNsYXNzZXMgcmVhZCB0aGUgc2FtZSBkYXRhYmFzZSBhcyB0aGUgYXVkaXRlZCBtb2RlbC5cbiAqIEBwYXJhbSB7QXVkaXRlZE1vZGVsQ2xhc3N9IG1vZGVsQ2xhc3MgLSBBdWRpdGVkIHNvdXJjZSBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gYXVkaXRDbGFzcyAtIEdlbmVyYXRlZCBhdWRpdCBjbGFzcy5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBhcHBseUF1ZGl0Q2xhc3NEYXRhYmFzZVJvdXRpbmcobW9kZWxDbGFzcywgYXVkaXRDbGFzcykge1xuICBhdWRpdENsYXNzLnNldERhdGFiYXNlSWRlbnRpZmllcihtb2RlbENsYXNzLmdldENvbmZpZ3VyZWREYXRhYmFzZUlkZW50aWZpZXIoKSlcblxuICBpZiAobW9kZWxDbGFzcy5oYXNUZW5hbnREYXRhYmFzZUlkZW50aWZpZXJSZXNvbHZlcigpKSB7XG4gICAgYXVkaXRDbGFzcy5zd2l0Y2hlc1RlbmFudERhdGFiYXNlKCh7dGVuYW50fSkgPT4gbW9kZWxDbGFzcy5nZXRUZW5hbnREYXRhYmFzZUlkZW50aWZpZXIodGVuYW50KSlcbiAgfVxufVxuXG4vKipcbiAqIFdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gdG8gZmluZCB0aGUgcm9vdCBEYXRhYmFzZVJlY29yZCBjbGFzcy5cbiAqIEBwYXJhbSB7QXVkaXRlZE1vZGVsQ2xhc3N9IG1vZGVsQ2xhc3MgLSBBdWRpdGVkIG1vZGVsIGNsYXNzLlxuICogQHJldHVybnMge3R5cGVvZiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IFJvb3QgRGF0YWJhc2VSZWNvcmQgY2xhc3MuXG4gKi9cbmZ1bmN0aW9uIGZpbmREYXRhYmFzZVJlY29yZENsYXNzKG1vZGVsQ2xhc3MpIHtcbiAgbGV0IHJlY29yZENsYXNzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG1vZGVsQ2xhc3MpXG5cbiAgd2hpbGUgKHJlY29yZENsYXNzICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihyZWNvcmRDbGFzcykgIT09IEZ1bmN0aW9uLnByb3RvdHlwZSkge1xuICAgIHJlY29yZENsYXNzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHJlY29yZENsYXNzKVxuICB9XG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gKi8gKHJlY29yZENsYXNzKVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBhcmFtZXRlci1rZXkgbmFtZSBmb3IgYSBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7QXVkaXRlZE1vZGVsQ2xhc3N9IG1vZGVsQ2xhc3MgLSBBdWRpdGVkIG1vZGVsIGNsYXNzLlxuICogQHJldHVybnMge3N0cmluZ30gZS5nLiBcInByb2plY3RcIiBmb3IgXCJQcm9qZWN0XCIuXG4gKi9cbmZ1bmN0aW9uIG1vZGVsUGFyYW1LZXkobW9kZWxDbGFzcykge1xuICBjb25zdCBuYW1lID0gbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKVxuXG4gIHJldHVybiBuYW1lLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgbmFtZS5zbGljZSgxKVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlZ2lzdHJhdGlvbiAoc3luYyDigJQgY2FsbGJhY2tzIG9ubHk7IHRhYmxlIGRldGVjdGlvbiBkZWZlcnJlZClcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFJlZ2lzdGVycyBsaWZlY3ljbGUgY2FsbGJhY2tzIGZvciBhdXRvbWF0aWMgY3JlYXRlL3VwZGF0ZS9kZXN0cm95IGF1ZGl0aW5nLlxuICogVGFibGUgZGV0ZWN0aW9uIGFuZCByZWxhdGlvbnNoaXAgcmVnaXN0cmF0aW9uIGhhcHBlbiBsYXppbHkgb24gZmlyc3QgdXNhZ2UuXG4gKiBDYWxsZWQgc3luY2hyb25vdXNseSBmcm9tIE1vZGVsLmF1ZGl0ZWQoKSBhdCBtb2R1bGUtbG9hZCB0aW1lLlxuICogQHBhcmFtIHtBdWRpdGVkTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzIHRvIGF1ZGl0LlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyQXVkaXRpbmcobW9kZWxDbGFzcykge1xuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZGVsQ2xhc3MsIFwiX2F1ZGl0TGlmZWN5Y2xlQ2FsbGJhY2tzUmVnaXN0ZXJlZFwiKSAmJiBtb2RlbENsYXNzLl9hdWRpdExpZmVjeWNsZUNhbGxiYWNrc1JlZ2lzdGVyZWQpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIG1vZGVsQ2xhc3MuX2F1ZGl0TGlmZWN5Y2xlQ2FsbGJhY2tzUmVnaXN0ZXJlZCA9IHRydWVcbiAgcmVnaXN0ZXJBdWRpdFJlbGF0aW9uc2hpcChtb2RlbENsYXNzKVxuICBtb2RlbENsYXNzLmJlZm9yZUNyZWF0ZShcImNhcHR1cmVDcmVhdGVBdWRpdENoYW5nZXNcIilcbiAgbW9kZWxDbGFzcy5hZnRlckNyZWF0ZShcImNyZWF0ZUNyZWF0ZUF1ZGl0XCIpXG4gIG1vZGVsQ2xhc3MuYmVmb3JlVXBkYXRlKFwiY2FwdHVyZVVwZGF0ZUF1ZGl0Q2hhbmdlc1wiKVxuICBtb2RlbENsYXNzLmFmdGVyVXBkYXRlKFwiY3JlYXRlVXBkYXRlQXVkaXRcIilcbiAgbW9kZWxDbGFzcy5hZnRlckRlc3Ryb3koXCJjcmVhdGVEZXN0cm95QXVkaXRcIilcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyBhdWRpdCBtZXRhZGF0YSBmb3IgYXVkaXRlZCBtb2RlbCBjbGFzc2VzLlxuICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MgdG8gaW5pdGlhbGl6ZS5cbiAqIEBwYXJhbSB7e3Jlc29sdmVUYWJsZURhdGE/OiBib29sZWFufX0gW2FyZ3NdIC0gSW5pdGlhbGl6YXRpb24gb3B0aW9ucy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5hc3luYyBmdW5jdGlvbiBpbml0aWFsaXplQXVkaXRpbmcobW9kZWxDbGFzcywgYXJncyA9IHt9KSB7XG4gIGNvbnN0IHtyZXNvbHZlVGFibGVEYXRhID0gZmFsc2V9ID0gYXJnc1xuICBjb25zdCBhdWRpdGVkTW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7QXVkaXRlZE1vZGVsQ2xhc3N9ICovIChtb2RlbENsYXNzKVxuXG4gIGlmICghYXVkaXRlZE1vZGVsQ2xhc3MuX2F1ZGl0TGlmZWN5Y2xlQ2FsbGJhY2tzUmVnaXN0ZXJlZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgcmVnaXN0ZXJBdWRpdFJlbGF0aW9uc2hpcChhdWRpdGVkTW9kZWxDbGFzcylcblxuICBpZiAocmVzb2x2ZVRhYmxlRGF0YSAmJiBzaG91bGRSZXNvbHZlQXVkaXRUYWJsZURhdGEoYXVkaXRlZE1vZGVsQ2xhc3MpKSB7XG4gICAgYXdhaXQgcmVzb2x2ZUF1ZGl0VGFibGVEYXRhKGF1ZGl0ZWRNb2RlbENsYXNzKVxuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYXVkaXQgbWV0YWRhdGEgYWZ0ZXIgYXBwbGljYXRpb24gYW5kIHBhY2thZ2UgbW9kZWwgY2xhc3NlcyBhcmUgcmVnaXN0ZXJlZC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBjb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiB3aG9zZSBtb2RlbHMgc2hvdWxkIGJlIGZpbmFsaXplZC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5hc3luYyBmdW5jdGlvbiBpbml0aWFsaXplQXVkaXRlZE1vZGVsUmVsYXRpb25zaGlwcyhjb25maWd1cmF0aW9uKSB7XG4gIGNvbnN0IG1vZGVsQ2xhc3NlcyA9IE9iamVjdC52YWx1ZXMoY29uZmlndXJhdGlvbi5nZXRNb2RlbENsYXNzZXMoKSlcbiAgY29uc3Qgc2hvdWxkUmVzb2x2ZVRhYmxlRGF0YSA9IG1vZGVsQ2xhc3Nlcy5zb21lKChtb2RlbENsYXNzKSA9PiBzaG91bGRSZXNvbHZlQXVkaXRUYWJsZURhdGEobW9kZWxDbGFzcykpXG5cbiAgaWYgKCFzaG91bGRSZXNvbHZlVGFibGVEYXRhKSB7XG4gICAgZm9yIChjb25zdCBtb2RlbENsYXNzIG9mIG1vZGVsQ2xhc3Nlcykge1xuICAgICAgYXdhaXQgaW5pdGlhbGl6ZUF1ZGl0aW5nKG1vZGVsQ2xhc3MpXG4gICAgfVxuXG4gICAgcmV0dXJuXG4gIH1cblxuICBhd2FpdCBjb25maWd1cmF0aW9uLmVuc3VyZUNvbm5lY3Rpb25zKHtuYW1lOiBcIkluaXRpYWxpemUgYXVkaXRlZCBtb2RlbCByZWxhdGlvbnNoaXBzXCJ9LCBhc3luYyAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBtb2RlbENsYXNzIG9mIG1vZGVsQ2xhc3Nlcykge1xuICAgICAgYXdhaXQgaW5pdGlhbGl6ZUF1ZGl0aW5nKG1vZGVsQ2xhc3MsIHtyZXNvbHZlVGFibGVEYXRhOiB0cnVlfSlcbiAgICB9XG4gIH0pXG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYXVkaXQgdGFibGUgbWV0YWRhdGEgc2hvdWxkIGJlIHJlc29sdmVkIGZvciBhIG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRhYmxlIG1ldGFkYXRhIHJlc29sdXRpb24gc2hvdWxkIHJ1biBub3cuXG4gKi9cbmZ1bmN0aW9uIHNob3VsZFJlc29sdmVBdWRpdFRhYmxlRGF0YShtb2RlbENsYXNzKSB7XG4gIGNvbnN0IGF1ZGl0ZWRNb2RlbENsYXNzID0gLyoqIEB0eXBlIHtBdWRpdGVkTW9kZWxDbGFzc30gKi8gKG1vZGVsQ2xhc3MpXG5cbiAgaWYgKCFhdWRpdGVkTW9kZWxDbGFzcy5fYXVkaXRMaWZlY3ljbGVDYWxsYmFja3NSZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gQm9vbGVhbihhdWRpdGVkTW9kZWxDbGFzcy5faW5pdGlhbGl6ZWQpICYmIGNhblJlc29sdmVBdWRpdFRhYmxlRGF0YShhdWRpdGVkTW9kZWxDbGFzcylcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIGF1ZGl0cyByZWxhdGlvbnNoaXAgd2l0aG91dCBmb3JjaW5nIGF1ZGl0IHRhYmxlIGRldGVjdGlvbi5cbiAqIEBwYXJhbSB7QXVkaXRlZE1vZGVsQ2xhc3N9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcyB0byBhdWRpdC5cbiAqIEBwYXJhbSB7QXVkaXRUYWJsZURhdGF9IFt0YWJsZURhdGFdIC0gUmVzb2x2ZWQgYXVkaXQgdGFibGUgZGF0YSB3aGVuIGF2YWlsYWJsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YWJhc2VJZGVudGl0eV0gLSBSZXNvbHZlZCBwaHlzaWNhbCBkYXRhYmFzZSBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiByZWdpc3RlckF1ZGl0UmVsYXRpb25zaGlwKG1vZGVsQ2xhc3MsIHRhYmxlRGF0YSA9IGRlZmF1bHRBdWRpdFJlbGF0aW9uc2hpcFRhYmxlRGF0YShtb2RlbENsYXNzKSwgZGF0YWJhc2VJZGVudGl0eSkge1xuICBpZiAobW9kZWxDbGFzcy5fcmVsYXRpb25zaGlwRXhpc3RzKFwiYXVkaXRzXCIpKSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwID0gbW9kZWxDbGFzcy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUoXCJhdWRpdHNcIilcblxuICAgIGlmIChnZW5lcmF0ZWRBdWRpdFJlbGF0aW9uc2hpcHMuaGFzKHJlbGF0aW9uc2hpcCkgJiYgZGF0YWJhc2VJZGVudGl0eSkge1xuICAgICAgYXVkaXRSZWxhdGlvbnNoaXBNYXAobW9kZWxDbGFzcykuc2V0KGRhdGFiYXNlSWRlbnRpdHksIGJ1aWxkQXVkaXRSZWxhdGlvbnNoaXAobW9kZWxDbGFzcywgdGFibGVEYXRhKSlcbiAgICB9XG5cbiAgICByZXR1cm5cbiAgfVxuXG4gIG1vZGVsQ2xhc3MuaGFzTWFueShcImF1ZGl0c1wiLCBhdWRpdFJlbGF0aW9uc2hpcFNjb3BlLCB7XG4gICAgZm9yZWlnbktleTogdGFibGVEYXRhLmZvcmVpZ25LZXksXG4gICAga2xhc3M6IHRhYmxlRGF0YS5hdWRpdENsYXNzLFxuICAgIHBvbHltb3JwaGljOiAhdGFibGVEYXRhLmRlZGljYXRlZFxuICB9KVxuICBjb25zdCByZWxhdGlvbnNoaXAgPSBtb2RlbENsYXNzLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShcImF1ZGl0c1wiKVxuXG4gIGdlbmVyYXRlZEF1ZGl0UmVsYXRpb25zaGlwcy5hZGQocmVsYXRpb25zaGlwKVxuICByZWxhdGlvbnNoaXAuc2V0UmVjb3JkUmVzb2x2ZXIoKHJlY29yZCkgPT4ge1xuICAgIGNvbnN0IHJlbGF0aW9uc2hpcHMgPSBhdWRpdFJlbGF0aW9uc2hpcE1hcChtb2RlbENsYXNzKVxuICAgIGNvbnN0IG9wZXJhdGlvbiA9IHJlY29yZC5kYXRhYmFzZU9wZXJhdGlvbigpXG5cbiAgICBpZiAob3BlcmF0aW9uKSByZXR1cm4gcmVsYXRpb25zaGlwcy5nZXQob3BlcmF0aW9uLmRhdGFiYXNlSWRlbnRpdHkoKSkgfHwgcmVsYXRpb25zaGlwXG4gICAgaWYgKHJlbGF0aW9uc2hpcHMuc2l6ZSA9PT0gMSkgcmV0dXJuIFsuLi5yZWxhdGlvbnNoaXBzLnZhbHVlcygpXVswXVxuXG4gICAgY29uc3QgaWRlbnRpdHkgPSBhdWRpdERhdGFiYXNlSWRlbnRpdHkobW9kZWxDbGFzcywgcmVjb3JkLmNvbm5lY3Rpb24oKSlcblxuICAgIHJldHVybiByZWxhdGlvbnNoaXBzLmdldChpZGVudGl0eSkgfHwgcmVsYXRpb25zaGlwXG4gIH0pXG59XG5cbi8qKlxuICogUmV0dXJucyBwaHlzaWNhbCBhdWRpdCByZWxhdGlvbnNoaXAgdmFyaWFudHMgZm9yIGEgbW9kZWwuXG4gKiBAcGFyYW0ge0F1ZGl0ZWRNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gQXVkaXRlZCBtb2RlbCBjbGFzcy5cbiAqIEByZXR1cm5zIHtNYXA8c3RyaW5nLCBIYXNNYW55UmVsYXRpb25zaGlwPn0gLSBSZWxhdGlvbnNoaXBzIGtleWVkIGJ5IHBoeXNpY2FsIGRhdGFiYXNlIGlkZW50aXR5LlxuICovXG5mdW5jdGlvbiBhdWRpdFJlbGF0aW9uc2hpcE1hcChtb2RlbENsYXNzKSB7XG4gIGxldCByZWxhdGlvbnNoaXBzID0gYXVkaXRSZWxhdGlvbnNoaXBzQnlNb2RlbC5nZXQobW9kZWxDbGFzcylcblxuICBpZiAoIXJlbGF0aW9uc2hpcHMpIHtcbiAgICByZWxhdGlvbnNoaXBzID0gbmV3IE1hcCgpXG4gICAgYXVkaXRSZWxhdGlvbnNoaXBzQnlNb2RlbC5zZXQobW9kZWxDbGFzcywgcmVsYXRpb25zaGlwcylcbiAgfVxuXG4gIHJldHVybiByZWxhdGlvbnNoaXBzXG59XG5cbi8qKlxuICogQnVpbGRzIGltbXV0YWJsZS1ieS1vd25lcnNoaXAgYXVkaXQgcmVsYXRpb25zaGlwIG1ldGFkYXRhIGZvciBvbmUgcGh5c2ljYWwgZGF0YWJhc2UuXG4gKiBAcGFyYW0ge0F1ZGl0ZWRNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gQXVkaXRlZCBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7QXVkaXRUYWJsZURhdGF9IHRhYmxlRGF0YSAtIFJlc29sdmVkIGF1ZGl0IHRhYmxlIGRhdGEuXG4gKiBAcmV0dXJucyB7SGFzTWFueVJlbGF0aW9uc2hpcH0gLSBQaHlzaWNhbCByZWxhdGlvbnNoaXAgZGVmaW5pdGlvbi5cbiAqL1xuZnVuY3Rpb24gYnVpbGRBdWRpdFJlbGF0aW9uc2hpcChtb2RlbENsYXNzLCB0YWJsZURhdGEpIHtcbiAgcmV0dXJuIG5ldyBIYXNNYW55UmVsYXRpb25zaGlwKHtcbiAgICBmb3JlaWduS2V5OiB0YWJsZURhdGEuZm9yZWlnbktleSxcbiAgICBrbGFzczogdGFibGVEYXRhLmF1ZGl0Q2xhc3MsXG4gICAgbW9kZWxDbGFzcyxcbiAgICBwb2x5bW9ycGhpYzogIXRhYmxlRGF0YS5kZWRpY2F0ZWQsXG4gICAgcmVsYXRpb25zaGlwTmFtZTogXCJhdWRpdHNcIixcbiAgICBzY29wZTogYXVkaXRSZWxhdGlvbnNoaXBTY29wZSxcbiAgICB0eXBlOiBcImhhc01hbnlcIlxuICB9KVxufVxuXG4vKipcbiAqIFJldHVybnMgdW5yZXNvbHZlZCBzaGFyZWQtYXVkaXQgZGVmYXVsdHMgZm9yIGVhcmx5IHJlbGF0aW9uc2hpcCByZWdpc3RyYXRpb24uXG4gKiBAcGFyYW0ge0F1ZGl0ZWRNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MgdG8gYXVkaXQuXG4gKiBAcmV0dXJucyB7QXVkaXRUYWJsZURhdGF9IFNoYXJlZCBhdWRpdCByZWxhdGlvbnNoaXAgZGVmYXVsdHMuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRBdWRpdFJlbGF0aW9uc2hpcFRhYmxlRGF0YShtb2RlbENsYXNzKSB7XG4gIHJldHVybiB7XG4gICAgYXVkaXRDbGFzczogY2FjaGVkU2hhcmVkQXVkaXRDbGFzcyhtb2RlbENsYXNzKSxcbiAgICBkZWRpY2F0ZWQ6IGZhbHNlLFxuICAgIGZvcmVpZ25LZXk6IFwiYXVkaXRhYmxlX2lkXCIsXG4gICAgdGFibGVOYW1lOiBcImF1ZGl0c1wiXG4gIH1cbn1cblxuLyoqXG4gKiBBcHBsaWVzIGRlZmF1bHQgYXVkaXQgb3JkZXJpbmcgdG8gZ2VuZXJhdGVkIGF1ZGl0IHJlbGF0aW9uc2hpcHMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHQ8dHlwZW9mIGltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdD59IHF1ZXJ5IC0gQXVkaXQgcXVlcnkuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdDx0eXBlb2YgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0Pn0gT3JkZXJlZCBhdWRpdCBxdWVyeS5cbiAqL1xuZnVuY3Rpb24gYXVkaXRSZWxhdGlvbnNoaXBTY29wZShxdWVyeSkge1xuICByZXR1cm4gcXVlcnkub3JkZXIoe2NvbHVtbjogXCJjcmVhdGVkX2F0XCIsIGRpcmVjdGlvbjogXCJERVNDXCJ9KVxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHRlbmFudCBjb250ZXh0IGNhbiByZXNvbHZlIGF1ZGl0IHRhYmxlIGRhdGEuXG4gKiBAcGFyYW0ge0F1ZGl0ZWRNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGF1ZGl0IHRhYmxlIGRhdGEgY2FuIGJlIHJlc29sdmVkIGluIHRoZSBjdXJyZW50IHNjb3BlLlxuICovXG5mdW5jdGlvbiBjYW5SZXNvbHZlQXVkaXRUYWJsZURhdGEobW9kZWxDbGFzcykge1xuICBpZiAoIW1vZGVsQ2xhc3MuaGFzVGVuYW50RGF0YWJhc2VJZGVudGlmaWVyUmVzb2x2ZXIoKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBjb25zdCB0ZW5hbnREYXRhYmFzZUlkZW50aWZpZXIgPSBtb2RlbENsYXNzLmdldFRlbmFudERhdGFiYXNlSWRlbnRpZmllcigpXG5cbiAgaWYgKCF0ZW5hbnREYXRhYmFzZUlkZW50aWZpZXIpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiBtb2RlbENsYXNzLl9nZXRDb25maWd1cmF0aW9uKCkuaXNEYXRhYmFzZUlkZW50aWZpZXJBY3RpdmUodGVuYW50RGF0YWJhc2VJZGVudGlmaWVyKVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENyZWF0aW5nIGF1ZGl0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhdWRpdCByb3cgZm9yIGEgcmVjb3JkLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IHJlY29yZCAtIFJlY29yZCB0byBhdWRpdC5cbiAqIEBwYXJhbSB7Q3JlYXRlQXVkaXRBcmdzfSBhcmdzIC0gQXVkaXQgcm93IG9wdGlvbnMgKGFjdGlvbiwgYXVkaXRlZENoYW5nZXMsIHBhcmFtcykuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXIgfCBzdHJpbmc+fSBDcmVhdGVkIGF1ZGl0IHJvdyBpZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXVkaXQocmVjb3JkLCBhcmdzKSB7XG4gIGNvbnN0IG1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge0F1ZGl0ZWRNb2RlbENsYXNzfSAqLyAocmVjb3JkLmdldE1vZGVsQ2xhc3MoKSlcbiAgY29uc3Qgb3BlcmF0aW9uID0gcmVjb3JkLmRhdGFiYXNlT3BlcmF0aW9uKClcblxuICBpZiAob3BlcmF0aW9uKSByZXR1cm4gYXdhaXQgY3JlYXRlQXVkaXRXaXRoQ3VycmVudENvbm5lY3Rpb24ocmVjb3JkLCBhcmdzLCBtb2RlbENsYXNzKVxuXG4gIHJldHVybiBhd2FpdCBtb2RlbENsYXNzLl9nZXRDb25maWd1cmF0aW9uKCkuZW5zdXJlQ29ubmVjdGlvbnMoe25hbWU6IGAke21vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKCl9IGF1ZGl0YH0sIGFzeW5jICgpID0+IHtcbiAgICByZXR1cm4gYXdhaXQgY3JlYXRlQXVkaXRXaXRoQ3VycmVudENvbm5lY3Rpb24ocmVjb3JkLCBhcmdzLCBtb2RlbENsYXNzKVxuICB9KVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXVkaXQgcm93IHVzaW5nIHRoZSBjdXJyZW50IG1vZGVsIGRhdGFiYXNlIGNvbm5lY3Rpb24uXG4gKiBSb3V0ZXMgdG8gc2hhcmVkIHRhYmxlIG9yIGRlZGljYXRlZCB0YWJsZSBiYXNlZCBvbiByZXNvbHZlZCBhdWRpdCB0YWJsZSBkYXRhLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IHJlY29yZCAtIFJlY29yZCB0byBhdWRpdC5cbiAqIEBwYXJhbSB7Q3JlYXRlQXVkaXRBcmdzfSBhcmdzIC0gQXVkaXQgcm93IG9wdGlvbnMgKGFjdGlvbiwgYXVkaXRlZENoYW5nZXMsIHBhcmFtcykuXG4gKiBAcGFyYW0ge0F1ZGl0ZWRNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gQXVkaXRlZCBtb2RlbCBjbGFzcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlciB8IHN0cmluZz59IENyZWF0ZWQgYXVkaXQgcm93IGlkLlxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVBdWRpdFdpdGhDdXJyZW50Q29ubmVjdGlvbihyZWNvcmQsIGFyZ3MsIG1vZGVsQ2xhc3MpIHtcbiAgaWYgKCFyZWNvcmQuaXNQZXJzaXN0ZWQoKSkgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgYXVkaXQgdW5wZXJzaXN0ZWQgJHttb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpfSByZWNvcmRgKVxuXG4gIGNvbnN0IGRiID0gcmVjb3JkLmNvbm5lY3Rpb24oKVxuICBjb25zdCB0YWJsZURhdGEgPSBhd2FpdCByZXNvbHZlQXVkaXRUYWJsZURhdGEobW9kZWxDbGFzcywgZGIsIHJlY29yZC5kYXRhYmFzZU9wZXJhdGlvbigpKVxuICBjb25zdCBhY3Rpb24gPSBub3JtYWxpemVBY3Rpb24oYXJncy5hY3Rpb24pXG4gIGNvbnN0IGF1ZGl0ZWRDaGFuZ2VzID0gYXJncy5hdWRpdGVkQ2hhbmdlcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGFyZ3MuYXVkaXRlZENoYW5nZXNcbiAgY29uc3QgcGFyYW1zID0gYXJncy5wYXJhbXMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBhcmdzLnBhcmFtc1xuICBjb25zdCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKClcblxuICBjb25zdCBhdWRpdEFjdGlvbklkID0gYXdhaXQgZmluZE9yQ3JlYXRlTG9va3VwSWQoe1xuICAgIGNvbHVtbk5hbWU6IFwiYWN0aW9uXCIsXG4gICAgY3VycmVudERhdGUsXG4gICAgZGIsXG4gICAgdGFibGVOYW1lOiBcImF1ZGl0X2FjdGlvbnNcIixcbiAgICB2YWx1ZTogYWN0aW9uXG4gIH0pXG5cbiAgY29uc3QgYXVkaXRJZCA9IG5ldyBVVUlEKDQpLmZvcm1hdCgpXG5cbiAgaWYgKHRhYmxlRGF0YS5kZWRpY2F0ZWQpIHtcbiAgICBjb25zdCBtb2RlbEtleSA9IG1vZGVsUGFyYW1LZXkobW9kZWxDbGFzcylcblxuICAgIGF3YWl0IGRiLnF1ZXJ5KGRiLmluc2VydFNxbCh7XG4gICAgICByZXR1cm5MYXN0SW5zZXJ0ZWRDb2x1bW5OYW1lczogW1wiaWRcIl0sXG4gICAgICB0YWJsZU5hbWU6IHRhYmxlRGF0YS50YWJsZU5hbWUsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGlkOiBhdWRpdElkLFxuICAgICAgICBbYCR7bW9kZWxLZXl9X2lkYF06IHJlY29yZC5pZCgpLFxuICAgICAgICBhdWRpdF9hY3Rpb25faWQ6IGF1ZGl0QWN0aW9uSWQsXG4gICAgICAgIGF1ZGl0ZWRfY2hhbmdlczogYXVkaXRlZENoYW5nZXMsXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgY3JlYXRlZF9hdDogY3VycmVudERhdGUsXG4gICAgICAgIHVwZGF0ZWRfYXQ6IGN1cnJlbnREYXRlXG4gICAgICB9XG4gICAgfSkpXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgYXVkaXRBdWRpdGFibGVUeXBlSWQgPSBhd2FpdCBmaW5kT3JDcmVhdGVMb29rdXBJZCh7XG4gICAgICBjb2x1bW5OYW1lOiBcIm5hbWVcIixcbiAgICAgIGN1cnJlbnREYXRlLFxuICAgICAgZGIsXG4gICAgICB0YWJsZU5hbWU6IFwiYXVkaXRfYXVkaXRhYmxlX3R5cGVzXCIsXG4gICAgICB2YWx1ZTogbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKVxuICAgIH0pXG5cbiAgICBhd2FpdCBkYi5xdWVyeShkYi5pbnNlcnRTcWwoe1xuICAgICAgcmV0dXJuTGFzdEluc2VydGVkQ29sdW1uTmFtZXM6IFtcImlkXCJdLFxuICAgICAgdGFibGVOYW1lOiBcImF1ZGl0c1wiLFxuICAgICAgZGF0YToge1xuICAgICAgICBpZDogYXVkaXRJZCxcbiAgICAgICAgYXVkaXRfYWN0aW9uX2lkOiBhdWRpdEFjdGlvbklkLFxuICAgICAgICBhdWRpdF9hdWRpdGFibGVfdHlwZV9pZDogYXVkaXRBdWRpdGFibGVUeXBlSWQsXG4gICAgICAgIGF1ZGl0YWJsZV9pZDogcmVjb3JkLmlkKCksXG4gICAgICAgIGF1ZGl0YWJsZV90eXBlOiBtb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpLFxuICAgICAgICBhdWRpdGVkX2NoYW5nZXM6IGF1ZGl0ZWRDaGFuZ2VzLFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIGNyZWF0ZWRfYXQ6IGN1cnJlbnREYXRlLFxuICAgICAgICB1cGRhdGVkX2F0OiBjdXJyZW50RGF0ZVxuICAgICAgfVxuICAgIH0pKVxuICB9XG5cbiAgYXdhaXQgZW1pdEF1ZGl0RXZlbnQobW9kZWxDbGFzcywgYWN0aW9uLCB7XG4gICAgYWN0aW9uLFxuICAgIGF1ZGl0SWQsXG4gICAgYXVkaXRlZENoYW5nZXMsXG4gICAgcGFyYW1zLFxuICAgIHJlY29yZFxuICB9KVxuXG4gIEF1ZGl0RXZlbnRzLmNhbGwobW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKSwgYWN0aW9uLCB7XG4gICAgYWN0aW9uLFxuICAgIGF1ZGl0SWQsXG4gICAgYXVkaXRlZENoYW5nZXMsXG4gICAgcGFyYW1zLFxuICAgIHJlY29yZFxuICB9KVxuXG4gIHJldHVybiBhdWRpdElkXG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTGlmZWN5Y2xlIGNhbGxiYWNrc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ2FwdHVyZXMgY3JlYXRlIGNoYW5nZXMgYmVmb3JlIHBlcnNpc3RlbmNlIGNsZWFycyB0aGUgY2hhbmdlIHNldC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0ICYge19wZW5kaW5nQ3JlYXRlQXVkaXRDaGFuZ2VzPzogQXVkaXRDaGFuZ2VzfX0gcmVjb3JkIC0gUmVjb3JkIHdob3NlIHBlbmRpbmcgY2hhbmdlcyBzaG91bGQgYmUgY2FwdHVyZWQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gY2FwdHVyZUNyZWF0ZUF1ZGl0Q2hhbmdlcyhyZWNvcmQpIHtcbiAgcmVjb3JkLl9wZW5kaW5nQ3JlYXRlQXVkaXRDaGFuZ2VzID0gYXVkaXRDaGFuZ2VzRm9yQ3VycmVudENoYW5nZXMocmVjb3JkKVxufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgY3JlYXRlIGF1ZGl0IHJvdyBmb3IgYSBtb2RlbCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0ICYge19wZW5kaW5nQ3JlYXRlQXVkaXRDaGFuZ2VzPzogQXVkaXRDaGFuZ2VzfX0gcmVjb3JkIC0gUmVjb3JkIHRvIGF1ZGl0LlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUNyZWF0ZUF1ZGl0KHJlY29yZCkge1xuICBhd2FpdCBjcmVhdGVBdWRpdChyZWNvcmQsIHtcbiAgICBhY3Rpb246IFwiY3JlYXRlXCIsXG4gICAgYXVkaXRlZENoYW5nZXM6IHJlY29yZC5fcGVuZGluZ0NyZWF0ZUF1ZGl0Q2hhbmdlcyB8fCBudWxsXG4gIH0pXG5cbiAgcmVjb3JkLl9wZW5kaW5nQ3JlYXRlQXVkaXRDaGFuZ2VzID0gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogQ2FwdHVyZXMgdXBkYXRlIGNoYW5nZXMgYmVmb3JlIHBlcnNpc3RlbmNlIGNsZWFycyB0aGUgY2hhbmdlIHNldC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0ICYge19wZW5kaW5nVXBkYXRlQXVkaXRDaGFuZ2VzPzogQXVkaXRDaGFuZ2VzfX0gcmVjb3JkIC0gUmVjb3JkIHdob3NlIHBlbmRpbmcgY2hhbmdlcyBzaG91bGQgYmUgY2FwdHVyZWQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gY2FwdHVyZVVwZGF0ZUF1ZGl0Q2hhbmdlcyhyZWNvcmQpIHtcbiAgcmVjb3JkLl9wZW5kaW5nVXBkYXRlQXVkaXRDaGFuZ2VzID0gYXVkaXRDaGFuZ2VzRm9yQ3VycmVudENoYW5nZXMocmVjb3JkKVxufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgdXBkYXRlIGF1ZGl0IHJvdyBmb3IgYSBtb2RlbCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0ICYge19wZW5kaW5nVXBkYXRlQXVkaXRDaGFuZ2VzPzogQXVkaXRDaGFuZ2VzfX0gcmVjb3JkIC0gUmVjb3JkIHRvIGF1ZGl0LlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVVwZGF0ZUF1ZGl0KHJlY29yZCkge1xuICBjb25zdCBhdWRpdGVkQ2hhbmdlcyA9IHJlY29yZC5fcGVuZGluZ1VwZGF0ZUF1ZGl0Q2hhbmdlcyB8fCBudWxsXG5cbiAgcmVjb3JkLl9wZW5kaW5nVXBkYXRlQXVkaXRDaGFuZ2VzID0gdW5kZWZpbmVkXG5cbiAgaWYgKCFhdWRpdGVkQ2hhbmdlcyB8fCBPYmplY3Qua2V5cyhhdWRpdGVkQ2hhbmdlcykubGVuZ3RoIDw9IDApIHJldHVyblxuXG4gIGF3YWl0IGNyZWF0ZUF1ZGl0KHJlY29yZCwge1xuICAgIGFjdGlvbjogXCJ1cGRhdGVcIixcbiAgICBhdWRpdGVkQ2hhbmdlc1xuICB9KVxufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgZGVzdHJveSBhdWRpdCByb3cgZm9yIGEgbW9kZWwgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gcmVjb3JkIC0gUmVjb3JkIHRvIGF1ZGl0LlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURlc3Ryb3lBdWRpdChyZWNvcmQpIHtcbiAgYXdhaXQgY3JlYXRlQXVkaXQocmVjb3JkLCB7XG4gICAgYWN0aW9uOiBcImRlc3Ryb3lcIixcbiAgICBhdWRpdGVkQ2hhbmdlczogYXVkaXRDaGFuZ2VzRm9yRGVzdHJveShyZWNvcmQpXG4gIH0pXG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ2hhbmdlcyBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDYXB0dXJlcyB0aGUgbmV3IHZhbHVlcyBmb3IgZmllbGRzIGNoYW5nZWQgb24gYSByZWNvcmQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gcmVjb3JkIC0gUmVjb3JkIHdob3NlIHBlbmRpbmcgY2hhbmdlcyBzaG91bGQgYmUgY2FwdHVyZWQuXG4gKiBAcmV0dXJucyB7QXVkaXRDaGFuZ2VzfSBOZXcgdmFsdWVzIGtleWVkIGJ5IGF0dHJpYnV0ZSBuYW1lLlxuICovXG5mdW5jdGlvbiBhdWRpdENoYW5nZXNGb3JDdXJyZW50Q2hhbmdlcyhyZWNvcmQpIHtcbiAgY29uc3QgY2hhbmdlcyA9IHJlY29yZC5jaGFuZ2VzKClcbiAgLyoqIEB0eXBlIHtBdWRpdENoYW5nZXN9ICovXG4gIGNvbnN0IGF1ZGl0ZWRDaGFuZ2VzID0ge31cbiAgY29uc3QgY29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZSA9IHJlY29yZC5nZXRNb2RlbENsYXNzKCkuZ2V0Q29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZU1hcCgpXG5cbiAgZm9yIChjb25zdCBbYXR0cmlidXRlTmFtZSwgY2hhbmdlXSBvZiBPYmplY3QuZW50cmllcyhjaGFuZ2VzKSkge1xuICAgIGF1ZGl0ZWRDaGFuZ2VzW2NvbHVtbk5hbWVUb0F0dHJpYnV0ZU5hbWVbYXR0cmlidXRlTmFtZV0gfHwgYXR0cmlidXRlTmFtZV0gPSBjaGFuZ2VbMV1cbiAgfVxuXG4gIHJldHVybiBhdWRpdGVkQ2hhbmdlc1xufVxuXG4vKipcbiAqIENhcHR1cmVzIHRoZSBjdXJyZW50IGF0dHJpYnV0ZXMgZm9yIGEgZGVzdHJveSBhdWRpdC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5kZWZhdWx0fSByZWNvcmQgLSBSZWNvcmQgYmVpbmcgZGVzdHJveWVkLlxuICogQHJldHVybnMge0F1ZGl0Q2hhbmdlc30gQ3VycmVudCBhdHRyaWJ1dGVzIGtleWVkIGJ5IGF0dHJpYnV0ZSBuYW1lLlxuICovXG5mdW5jdGlvbiBhdWRpdENoYW5nZXNGb3JEZXN0cm95KHJlY29yZCkge1xuICByZXR1cm4gey4uLnJlY29yZC5hdHRyaWJ1dGVzKCl9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gd2l0aG91dEF1ZGl0XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZXR1cm5zIHJlY29yZHMgd2l0aG91dCBhbiBhdWRpdCByb3cgZm9yIHRoZSBnaXZlbiBhY3Rpb24uXG4gKiBVc2VzIHNoYXJlZC10YWJsZSBkZWZhdWx0cyB3aGVuIHRhYmxlIGRhdGEgaXMgbm90IHlldCByZXNvbHZlZDtcbiAqIHN3aXRjaGVzIHRvIHRoZSBkZWRpY2F0ZWQgdGFibGUgcGF0aCBvbmNlIHJlc29sdmVkLlxuICogQHRlbXBsYXRlIHtBdWRpdGVkTW9kZWxDbGFzc30gTUNcbiAqIEBwYXJhbSB7TUN9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcyB0byBzY29wZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb24gLSBBdWRpdCBhY3Rpb24gdG8gZXhjbHVkZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0PE1DPn0gUXVlcnkgc2NvcGVkIHRvIHJlY29yZHMgd2l0aG91dCB0aGF0IGF1ZGl0IGFjdGlvbi5cbiAqL1xuZnVuY3Rpb24gd2l0aG91dEF1ZGl0KG1vZGVsQ2xhc3MsIGFjdGlvbikge1xuICBjb25zdCBkYiA9IG1vZGVsQ2xhc3MuY29ubmVjdGlvbigpXG4gIGNvbnN0IGRhdGFiYXNlSWRlbnRpdHkgPSBhdWRpdERhdGFiYXNlSWRlbnRpdHkobW9kZWxDbGFzcywgZGIpXG4gIGNvbnN0IHRhYmxlRGF0YSA9IGF1ZGl0VGFibGVEYXRhQnlNb2RlbC5nZXQobW9kZWxDbGFzcyk/LmdldChkYXRhYmFzZUlkZW50aXR5KVxuICBjb25zdCBtb2RlbFRhYmxlU3FsID0gZGIucXVvdGVUYWJsZShtb2RlbENsYXNzLnRhYmxlTmFtZSgpKVxuICBjb25zdCBhdWRpdEFjdGlvbnNUYWJsZVNxbCA9IGRiLnF1b3RlVGFibGUoXCJhdWRpdF9hY3Rpb25zXCIpXG4gIGNvbnN0IG1vZGVsUHJpbWFyeUtleVNxbCA9IGAke21vZGVsVGFibGVTcWx9LiR7ZGIucXVvdGVDb2x1bW4obW9kZWxDbGFzcy5wcmltYXJ5S2V5KCkpfWBcbiAgY29uc3QgYXVkaXRBY3Rpb25zSWRTcWwgPSBgJHthdWRpdEFjdGlvbnNUYWJsZVNxbH0uJHtkYi5xdW90ZUNvbHVtbihcImlkXCIpfWBcbiAgY29uc3QgYXVkaXRBY3Rpb25zQWN0aW9uU3FsID0gYCR7YXVkaXRBY3Rpb25zVGFibGVTcWx9LiR7ZGIucXVvdGVDb2x1bW4oXCJhY3Rpb25cIil9YFxuXG4gIGlmICh0YWJsZURhdGE/LmRlZGljYXRlZCkge1xuICAgIGNvbnN0IG1vZGVsS2V5ID0gbW9kZWxQYXJhbUtleShtb2RlbENsYXNzKVxuICAgIGNvbnN0IGF1ZGl0c1RhYmxlU3FsID0gZGIucXVvdGVUYWJsZSh0YWJsZURhdGEudGFibGVOYW1lKVxuICAgIGNvbnN0IGF1ZGl0QWN0aW9uSWRTcWwgPSBgJHthdWRpdHNUYWJsZVNxbH0uJHtkYi5xdW90ZUNvbHVtbihcImF1ZGl0X2FjdGlvbl9pZFwiKX1gXG4gICAgY29uc3QgbW9kZWxJZFNxbCA9IGAke2F1ZGl0c1RhYmxlU3FsfS4ke2RiLnF1b3RlQ29sdW1uKGAke21vZGVsS2V5fV9pZGApfWBcblxuICAgIHJldHVybiBtb2RlbENsYXNzXG4gICAgICAuYWxsKClcbiAgICAgIC53aGVyZShgXG4gICAgICAgIE5PVCBFWElTVFMgKFxuICAgICAgICAgIFNFTEVDVCAxXG4gICAgICAgICAgRlJPTSAke2F1ZGl0c1RhYmxlU3FsfVxuICAgICAgICAgIElOTkVSIEpPSU4gJHthdWRpdEFjdGlvbnNUYWJsZVNxbH1cbiAgICAgICAgICAgIE9OICR7YXVkaXRBY3Rpb25zSWRTcWx9ID0gJHthdWRpdEFjdGlvbklkU3FsfVxuICAgICAgICAgIFdIRVJFICR7bW9kZWxJZFNxbH0gPSAke21vZGVsUHJpbWFyeUtleVNxbH1cbiAgICAgICAgICAgIEFORCAke2F1ZGl0QWN0aW9uc0FjdGlvblNxbH0gPSAke2RiLnF1b3RlKG5vcm1hbGl6ZUFjdGlvbihhY3Rpb24pKX1cbiAgICAgICAgKVxuICAgICAgYClcbiAgfVxuXG4gIGNvbnN0IGF1ZGl0c1RhYmxlU3FsID0gZGIucXVvdGVUYWJsZShcImF1ZGl0c1wiKVxuICBjb25zdCBhdWRpdEF1ZGl0YWJsZUlkU3FsID0gYCR7YXVkaXRzVGFibGVTcWx9LiR7ZGIucXVvdGVDb2x1bW4oXCJhdWRpdGFibGVfaWRcIil9YFxuICBjb25zdCBhdWRpdEF1ZGl0YWJsZVR5cGVTcWwgPSBgJHthdWRpdHNUYWJsZVNxbH0uJHtkYi5xdW90ZUNvbHVtbihcImF1ZGl0YWJsZV90eXBlXCIpfWBcbiAgY29uc3QgYXVkaXRBY3Rpb25JZFNxbCA9IGAke2F1ZGl0c1RhYmxlU3FsfS4ke2RiLnF1b3RlQ29sdW1uKFwiYXVkaXRfYWN0aW9uX2lkXCIpfWBcblxuICByZXR1cm4gbW9kZWxDbGFzc1xuICAgIC5hbGwoKVxuICAgIC53aGVyZShgXG4gICAgICBOT1QgRVhJU1RTIChcbiAgICAgICAgU0VMRUNUIDFcbiAgICAgICAgRlJPTSAke2F1ZGl0c1RhYmxlU3FsfVxuICAgICAgICBJTk5FUiBKT0lOICR7YXVkaXRBY3Rpb25zVGFibGVTcWx9XG4gICAgICAgICAgT04gJHthdWRpdEFjdGlvbnNJZFNxbH0gPSAke2F1ZGl0QWN0aW9uSWRTcWx9XG4gICAgICAgIFdIRVJFICR7YXVkaXRBdWRpdGFibGVUeXBlU3FsfSA9ICR7ZGIucXVvdGUobW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKSl9XG4gICAgICAgICAgQU5EICR7YXVkaXRBdWRpdGFibGVJZFNxbH0gPSAke21vZGVsUHJpbWFyeUtleVNxbH1cbiAgICAgICAgICBBTkQgJHthdWRpdEFjdGlvbnNBY3Rpb25TcWx9ID0gJHtkYi5xdW90ZShub3JtYWxpemVBY3Rpb24oYWN0aW9uKSl9XG4gICAgICApXG4gICAgYClcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFdmVudCBjYWxsYmFja3Ncbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhIHBlci1tb2RlbCBjYWxsYmFjayBmaXJlZCBhZnRlciBhbiBhdWRpdCByb3cgaXMgY3JlYXRlZC5cbiAqIEBwYXJhbSB7QXVkaXRlZE1vZGVsQ2xhc3N9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcyB0byBvYnNlcnZlLlxuICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbiAtIEF1ZGl0IGFjdGlvbiBuYW1lIChlLmcuIFwiY3JlYXRlXCIpLlxuICogQHBhcmFtIHtBdWRpdENhbGxiYWNrfSBjYWxsYmFjayAtIENhbGxiYWNrIGludm9rZWQgYWZ0ZXIgbWF0Y2hpbmcgYXVkaXQgcm93cyBhcmUgY3JlYXRlZC5cbiAqIEByZXR1cm5zIHsoKSA9PiB2b2lkfSBVbnN1YnNjcmliZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJBdWRpdENhbGxiYWNrKG1vZGVsQ2xhc3MsIGFjdGlvbiwgY2FsbGJhY2spIHtcbiAgY29uc3Qgbm9ybWFsaXplZEFjdGlvbiA9IG5vcm1hbGl6ZUFjdGlvbihhY3Rpb24pXG4gIGNvbnN0IGNhbGxiYWNrcyA9IGF1ZGl0Q2FsbGJhY2tzRm9yTW9kZWxDbGFzcyhtb2RlbENsYXNzKVxuXG4gIGlmICghY2FsbGJhY2tzW25vcm1hbGl6ZWRBY3Rpb25dKSB7XG4gICAgY2FsbGJhY2tzW25vcm1hbGl6ZWRBY3Rpb25dID0gW11cbiAgfVxuXG4gIGNhbGxiYWNrc1tub3JtYWxpemVkQWN0aW9uXS5wdXNoKGNhbGxiYWNrKVxuXG4gIHJldHVybiAoKSA9PiB7XG4gICAgY29uc3QgYWN0aW9uQ2FsbGJhY2tzID0gY2FsbGJhY2tzW25vcm1hbGl6ZWRBY3Rpb25dXG4gICAgY29uc3QgaW5kZXggPSBhY3Rpb25DYWxsYmFja3MuaW5kZXhPZihjYWxsYmFjaylcblxuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICBhY3Rpb25DYWxsYmFja3Muc3BsaWNlKGluZGV4LCAxKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEVtaXRzIHBlci1tb2RlbCBhdWRpdCBjYWxsYmFja3MgZm9yIGEgbW9kZWwvYWN0aW9uIHBhaXIuXG4gKiBAcGFyYW0ge0F1ZGl0ZWRNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uIC0gQXVkaXQgYWN0aW9uLlxuICogQHBhcmFtIHtBdWRpdEV2ZW50UGF5bG9hZH0gcGF5bG9hZCAtIEV2ZW50IHBheWxvYWQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW1pdEF1ZGl0RXZlbnQobW9kZWxDbGFzcywgYWN0aW9uLCBwYXlsb2FkKSB7XG4gIGNvbnN0IGNhbGxiYWNrcyA9IGF1ZGl0Q2FsbGJhY2tzRm9yTW9kZWxDbGFzcyhtb2RlbENsYXNzKVthY3Rpb25dIHx8IFtdXG5cbiAgZm9yIChjb25zdCBjYWxsYmFjayBvZiBbLi4uY2FsbGJhY2tzXSkge1xuICAgIGF3YWl0IGNhbGxiYWNrKHBheWxvYWQpXG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwZXItbW9kZWwgY2FsbGJhY2sgbWFwLlxuICogQHBhcmFtIHtBdWRpdGVkTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIEF1ZGl0Q2FsbGJhY2tbXT59IENhbGxiYWNrIG1hcCBrZXllZCBieSBhY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGF1ZGl0Q2FsbGJhY2tzRm9yTW9kZWxDbGFzcyhtb2RlbENsYXNzKSB7XG4gIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZGVsQ2xhc3MsIFwiX2F1ZGl0Q2FsbGJhY2tzXCIpKSB7XG4gICAgbW9kZWxDbGFzcy5fYXVkaXRDYWxsYmFja3MgPSB7fVxuICB9XG5cbiAgY29uc3QgY2FsbGJhY2tzID0gbW9kZWxDbGFzcy5fYXVkaXRDYWxsYmFja3NcblxuICBpZiAoIWNhbGxiYWNrcykgdGhyb3cgbmV3IEVycm9yKGBBdWRpdCBjYWxsYmFja3Mgd2VyZW4ndCBpbml0aWFsaXplZCBmb3IgJHttb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpfWApXG5cbiAgcmV0dXJuIGNhbGxiYWNrc1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIExvb2t1cCBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBGaW5kcyBvciBjcmVhdGVzIGEgbG9va3VwIHJvdyBhbmQgcmV0dXJucyBpdHMgaWQuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY29sdW1uTmFtZSAtIExvb2t1cCB2YWx1ZSBjb2x1bW4gbmFtZS5cbiAqIEBwYXJhbSB7RGF0ZX0gYXJncy5jdXJyZW50RGF0ZSAtIFRpbWVzdGFtcCB0byB3cml0ZSB3aGVuIGluc2VydGluZy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGFyZ3MuZGIgLSBEYXRhYmFzZSBkcml2ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy50YWJsZU5hbWUgLSBMb29rdXAgdGFibGUgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnZhbHVlIC0gTG9va3VwIHZhbHVlLlxuICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyIHwgc3RyaW5nPn0gTG9va3VwIHJvdyBpZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmluZE9yQ3JlYXRlTG9va3VwSWQoe2NvbHVtbk5hbWUsIGN1cnJlbnREYXRlLCBkYiwgdGFibGVOYW1lLCB2YWx1ZX0pIHtcbiAgYXdhaXQgZGIudXBzZXJ0KHtcbiAgICB0YWJsZU5hbWUsXG4gICAgY29uZmxpY3RDb2x1bW5zOiBbY29sdW1uTmFtZV0sXG4gICAgdXBkYXRlQ29sdW1uczogW2NvbHVtbk5hbWVdLFxuICAgIGRhdGE6IHtcbiAgICAgIGlkOiBuZXcgVVVJRCg0KS5mb3JtYXQoKSxcbiAgICAgIFtjb2x1bW5OYW1lXTogdmFsdWUsXG4gICAgICBjcmVhdGVkX2F0OiBjdXJyZW50RGF0ZSxcbiAgICAgIHVwZGF0ZWRfYXQ6IGN1cnJlbnREYXRlXG4gICAgfVxuICB9KVxuXG4gIGNvbnN0IGlkID0gYXdhaXQgZmluZExvb2t1cElkKHtjb2x1bW5OYW1lLCBkYiwgdGFibGVOYW1lLCB2YWx1ZX0pXG5cbiAgaWYgKGlkID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgJHt0YWJsZU5hbWV9LiR7Y29sdW1uTmFtZX0gYWZ0ZXIgdXBzZXJ0YClcblxuICByZXR1cm4gaWRcbn1cblxuLyoqXG4gKiBGaW5kcyBhIGxvb2t1cCBpZCBieSB2YWx1ZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jb2x1bW5OYW1lIC0gTG9va3VwIHZhbHVlIGNvbHVtbiBuYW1lLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gYXJncy5kYiAtIERhdGFiYXNlIGRyaXZlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnRhYmxlTmFtZSAtIExvb2t1cCB0YWJsZSBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudmFsdWUgLSBMb29rdXAgdmFsdWUuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXIgfCBzdHJpbmcgfCBudWxsPn0gTG9va3VwIHJvdyBpZCBvciBudWxsLlxuICovXG5hc3luYyBmdW5jdGlvbiBmaW5kTG9va3VwSWQoe2NvbHVtbk5hbWUsIGRiLCB0YWJsZU5hbWUsIHZhbHVlfSkge1xuICBjb25zdCByb3dzID0gLyoqIEB0eXBlIHtBcnJheTx7aWQ6IG51bWJlciB8IHN0cmluZ30+fSAqLyAoYXdhaXQgZGIucXVlcnkoYFxuICAgIFNFTEVDVCAke2RiLnF1b3RlQ29sdW1uKFwiaWRcIil9IEFTIGlkXG4gICAgRlJPTSAke2RiLnF1b3RlVGFibGUodGFibGVOYW1lKX1cbiAgICBXSEVSRSAke2RiLnF1b3RlQ29sdW1uKGNvbHVtbk5hbWUpfSA9ICR7ZGIucXVvdGUodmFsdWUpfVxuICBgKSlcblxuICBpZiAocm93c1swXSkgcmV0dXJuIHJvd3NbMF0uaWRcblxuICByZXR1cm4gbnVsbFxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYW4gYXVkaXQgYWN0aW9uIHN0cmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb24gLSBBY3Rpb24gbmFtZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRyaW1tZWQsIG5vbi1lbXB0eSBhY3Rpb24gbmFtZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplQWN0aW9uKGFjdGlvbikge1xuICBjb25zdCBub3JtYWxpemVkQWN0aW9uID0gYWN0aW9uLnRyaW0oKVxuXG4gIGlmICghbm9ybWFsaXplZEFjdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiQXVkaXQgYWN0aW9uIG11c3QgYmUgcHJlc2VudFwiKVxuXG4gIHJldHVybiBub3JtYWxpemVkQWN0aW9uXG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTWlncmF0aW9uIGhlbHBlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIHNoYXJlZCBhdWRpdCB0YWJsZXMgbWlncmF0aW9uIHVwL2Rvd24gY2FsbGJhY2tzIGZvciB1c2UgaW5zaWRlXG4gKiBhIE1pZ3JhdGlvbiBjbGFzcy4gVGhlIGB0YWJsZWAgcGFyYW1ldGVyIGlzIGEgTWlncmF0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHt7aWQ/OiB7dHlwZTogc3RyaW5nfX19IFtvcHRpb25zXSAtIElEIGNvbHVtbiBvcHRpb25zLlxuICogQHJldHVybnMge3tkb3duOiAodGFibGU6IGltcG9ydChcIi4uL21pZ3JhdGlvbi9pbmRleC5qc1wiKS5kZWZhdWx0KSA9PiBQcm9taXNlPHZvaWQ+LCB1cDogKHRhYmxlOiBpbXBvcnQoXCIuLi9taWdyYXRpb24vaW5kZXguanNcIikuZGVmYXVsdCkgPT4gUHJvbWlzZTx2b2lkPn19IC0gVXAvZG93biBjYWxsYmFja3MgZm9yIHRoZSBzaGFyZWQgYXVkaXQgdGFibGVzLlxuICovXG5mdW5jdGlvbiBjcmVhdGVTaGFyZWRBdWRpdFRhYmxlc01pZ3JhdGlvbihvcHRpb25zID0ge30pIHtcbiAgY29uc3Qgb3B0cyA9IC8qKiBAdHlwZSB7e2lkPzoge3R5cGU6IHN0cmluZ319fSAqLyAob3B0aW9ucylcbiAgY29uc3QgaWRPcHRpb25zID0gLyoqIEB0eXBlIHt7dHlwZT86IHN0cmluZ319ICovIChvcHRzLmlkIHx8IHt9KVxuICBjb25zdCB0eXBlID0gaWRPcHRpb25zLnR5cGVcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIHVwKHRhYmxlKSB7XG4gICAgICBhd2FpdCB0YWJsZS5jcmVhdGVUYWJsZShcImF1ZGl0X2FjdGlvbnNcIiwge2lkOiAvKiogQHR5cGUge3t0eXBlPzogc3RyaW5nfX0gKi8gKG9wdHMuaWQgfHwge30pfSwgKC8qKiBAdHlwZSB7e3N0cmluZyhuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCwgdGltZXN0YW1wcygpOiB2b2lkfX0gKi8gdCkgPT4ge1xuICAgICAgICB0LnN0cmluZyhcImFjdGlvblwiLCB7aW5kZXg6IHt1bmlxdWU6IHRydWV9LCBudWxsOiBmYWxzZX0pXG4gICAgICAgIHQudGltZXN0YW1wcygpXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCB0YWJsZS5jcmVhdGVUYWJsZShcImF1ZGl0X2F1ZGl0YWJsZV90eXBlc1wiLCB7aWQ6IC8qKiBAdHlwZSB7e3R5cGU/OiBzdHJpbmd9fSAqLyAob3B0cy5pZCB8fCB7fSl9LCAoLyoqIEB0eXBlIHt7c3RyaW5nKG5hbWU6IHN0cmluZywgb3B0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkLCB0aW1lc3RhbXBzKCk6IHZvaWR9fSAqLyB0KSA9PiB7XG4gICAgICAgIHQuc3RyaW5nKFwibmFtZVwiLCB7aW5kZXg6IHt1bmlxdWU6IHRydWV9LCBudWxsOiBmYWxzZX0pXG4gICAgICAgIHQudGltZXN0YW1wcygpXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCB0YWJsZS5jcmVhdGVUYWJsZShcImF1ZGl0c1wiLCB7aWQ6IC8qKiBAdHlwZSB7e3R5cGU/OiBzdHJpbmd9fSAqLyAob3B0cy5pZCB8fCB7fSl9LCAoLyoqIEB0eXBlIHt7anNvbihuYW1lOiBzdHJpbmcpOiB2b2lkLCByZWZlcmVuY2VzKG5hbWU6IHN0cmluZywgb3B0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkLCB0aW1lc3RhbXBzKCk6IHZvaWR9fSAqLyB0KSA9PiB7XG4gICAgICAgIHQucmVmZXJlbmNlcyhcImF1ZGl0X2FjdGlvblwiLCB7Zm9yZWlnbktleTogdHJ1ZSwgbnVsbDogZmFsc2UsIHR5cGV9KVxuICAgICAgICB0LnJlZmVyZW5jZXMoXCJhdWRpdF9hdWRpdGFibGVfdHlwZVwiLCB7Zm9yZWlnbktleTogdHJ1ZSwgbnVsbDogZmFsc2UsIHR5cGV9KVxuICAgICAgICB0LnJlZmVyZW5jZXMoXCJhdWRpdGFibGVcIiwge251bGw6IGZhbHNlLCBwb2x5bW9ycGhpYzogdHJ1ZSwgdHlwZX0pXG4gICAgICAgIHQuanNvbihcImF1ZGl0ZWRfY2hhbmdlc1wiKVxuICAgICAgICB0Lmpzb24oXCJwYXJhbXNcIilcbiAgICAgICAgdC50aW1lc3RhbXBzKClcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRvd24odGFibGUpIHtcbiAgICAgIGF3YWl0IHRhYmxlLmRyb3BUYWJsZShcImF1ZGl0c1wiKVxuICAgICAgYXdhaXQgdGFibGUuZHJvcFRhYmxlKFwiYXVkaXRfYXVkaXRhYmxlX3R5cGVzXCIpXG4gICAgICBhd2FpdCB0YWJsZS5kcm9wVGFibGUoXCJhdWRpdF9hY3Rpb25zXCIpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZGVkaWNhdGVkIGF1ZGl0IHRhYmxlIG5hbWUgZm9yIGEgZ2l2ZW4gbW9kZWwgdGFibGUgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbFRhYmxlTmFtZSAtIE1vZGVsIHRhYmxlIG5hbWUgKGUuZy4gXCJwcm9qZWN0c1wiKS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IERlZGljYXRlZCBhdWRpdCB0YWJsZSBuYW1lIChlLmcuIFwicHJvamVjdF9hdWRpdHNcIikuXG4gKi9cbmZ1bmN0aW9uIGRlZGljYXRlZEF1ZGl0VGFibGVOYW1lRm9yVGFibGUobW9kZWxUYWJsZU5hbWUpIHtcbiAgaWYgKG1vZGVsVGFibGVOYW1lLmVuZHNXaXRoKFwic1wiKSkge1xuICAgIHJldHVybiBgJHttb2RlbFRhYmxlTmFtZS5zbGljZSgwLCAtMSl9X2F1ZGl0c2BcbiAgfVxuXG4gIHJldHVybiBgJHttb2RlbFRhYmxlTmFtZX1fYXVkaXRzYFxufVxuXG5leHBvcnQge1xuICBBdWRpdEV2ZW50cyxcbiAgY2FwdHVyZUNyZWF0ZUF1ZGl0Q2hhbmdlcyxcbiAgY2FwdHVyZVVwZGF0ZUF1ZGl0Q2hhbmdlcyxcbiAgY3JlYXRlQXVkaXQsXG4gIGNyZWF0ZUNyZWF0ZUF1ZGl0LFxuICBjcmVhdGVEZXN0cm95QXVkaXQsXG4gIGNyZWF0ZVVwZGF0ZUF1ZGl0LFxuICBjcmVhdGVTaGFyZWRBdWRpdFRhYmxlc01pZ3JhdGlvbixcbiAgZGVkaWNhdGVkQXVkaXRUYWJsZU5hbWVGb3JUYWJsZSxcbiAgaW5pdGlhbGl6ZUF1ZGl0ZWRNb2RlbFJlbGF0aW9uc2hpcHMsXG4gIGluaXRpYWxpemVBdWRpdGluZyxcbiAgcmVnaXN0ZXJBdWRpdENhbGxiYWNrLFxuICByZWdpc3RlckF1ZGl0aW5nLFxuICB3aXRob3V0QXVkaXRcbn1cbiJdfQ==
|