velocious 1.0.449 → 1.0.451
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 +1 -1
- package/build/application.js +4 -4
- package/build/authorization/ability.js +8 -8
- package/build/authorization/base-resource.js +4 -4
- package/build/background-jobs/cron-expression.js +1 -1
- package/build/background-jobs/forked-runner-child.js +1 -1
- package/build/background-jobs/job-registry.js +1 -1
- package/build/background-jobs/job-runner.js +1 -1
- package/build/background-jobs/job.js +1 -1
- package/build/background-jobs/json-socket.js +4 -4
- package/build/background-jobs/main.js +21 -21
- package/build/background-jobs/scheduler.js +7 -7
- package/build/background-jobs/store.js +7 -7
- package/build/background-jobs/web/controller.js +2 -2
- package/build/background-jobs/worker.js +12 -12
- package/build/beacon/client.js +11 -8
- package/build/beacon/in-process-broker.js +2 -2
- package/build/beacon/in-process-client.js +2 -2
- package/build/beacon/server.js +3 -3
- package/build/cli/browser-cli.js +1 -1
- package/build/cli/commands/db/base-command.js +2 -2
- package/build/cli/index.js +2 -2
- package/build/cli/tenant-database-command-helper.js +3 -3
- package/build/cli/use-browser-cli.js +1 -1
- package/build/configuration-types.js +3 -1
- package/build/configuration.js +38 -38
- package/build/controller.js +8 -8
- package/build/current-configuration.js +1 -1
- package/build/database/annotations-async-hooks.js +2 -2
- package/build/database/annotations.js +3 -3
- 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 +10 -10
- package/build/database/drivers/mssql/index.js +1 -1
- package/build/database/drivers/mssql/table.js +1 -1
- package/build/database/drivers/mysql/index.js +3 -3
- package/build/database/drivers/mysql/query.js +1 -1
- package/build/database/drivers/mysql/table.js +1 -1
- package/build/database/drivers/pgsql/index.js +2 -2
- package/build/database/drivers/sqlite/base.js +16 -16
- package/build/database/drivers/sqlite/index.js +11 -11
- package/build/database/drivers/sqlite/index.native.js +1 -1
- package/build/database/drivers/sqlite/index.web.js +3 -3
- package/build/database/drivers/sqlite/query.js +1 -1
- package/build/database/drivers/sqlite/query.web.js +1 -1
- package/build/database/drivers/sqlite/sql/alter-table.js +2 -2
- package/build/database/drivers/sqlite/table.js +1 -1
- package/build/database/migrator/files-finder.js +1 -1
- package/build/database/migrator.js +6 -6
- package/build/database/pool/async-tracked-multi-connection.js +27 -27
- package/build/database/pool/base-methods-forward.js +4 -4
- package/build/database/pool/base.js +8 -8
- package/build/database/query/from-base.js +1 -1
- package/build/database/query/index.js +10 -10
- package/build/database/query/join-object.js +3 -3
- package/build/database/query/model-class-query.js +39 -39
- package/build/database/query/preloader/belongs-to.js +22 -22
- package/build/database/query/preloader/has-many.js +20 -20
- package/build/database/query/preloader/has-one.js +8 -8
- package/build/database/query/preloader/selection.js +3 -3
- package/build/database/query/preloader.js +8 -8
- package/build/database/query/query-data.js +9 -9
- package/build/database/query/where-model-class-hash.js +7 -7
- package/build/database/query/with-count.js +9 -9
- package/build/database/record/acts-as-list.js +15 -15
- package/build/database/record/attachments/handle.js +2 -2
- package/build/database/record/attachments/normalize-input.js +12 -12
- package/build/database/record/attachments/storage-drivers/s3.js +6 -6
- package/build/database/record/attachments/store.js +13 -13
- package/build/database/record/index.js +115 -121
- package/build/database/record/instance-relationships/base.js +11 -11
- package/build/database/record/instance-relationships/belongs-to.js +3 -3
- package/build/database/record/instance-relationships/has-many.js +8 -8
- package/build/database/record/instance-relationships/has-one.js +7 -7
- package/build/database/record/relationships/base.js +2 -2
- package/build/database/record/state-machine.js +7 -7
- package/build/database/record/validators/presence.js +1 -1
- package/build/database/record/validators/uniqueness.js +5 -5
- package/build/database/table-data/index.js +4 -4
- package/build/environment-handlers/base.js +2 -2
- package/build/environment-handlers/browser.js +7 -7
- package/build/environment-handlers/node/cli/commands/cli-command-context.js +1 -1
- package/build/environment-handlers/node/cli/commands/console.js +4 -4
- package/build/environment-handlers/node/cli/commands/db/schema/dump.js +1 -1
- package/build/environment-handlers/node/cli/commands/db/schema/load.js +3 -3
- package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +836 -60
- package/build/environment-handlers/node.js +6 -6
- package/build/frontend-model-controller.js +81 -82
- package/build/frontend-model-resource/base-resource.js +78 -115
- package/build/frontend-models/base.js +162 -149
- package/build/frontend-models/clear-pending-debounced-callback.js +1 -1
- package/build/frontend-models/event-hook-models.js +2 -2
- package/build/frontend-models/outgoing-event-buffer.js +2 -2
- package/build/frontend-models/preloader.js +5 -5
- package/build/frontend-models/query.js +43 -38
- package/build/frontend-models/resource-definition.js +6 -6
- package/build/frontend-models/transport-serialization.js +11 -11
- package/build/frontend-models/use-destroyed-event.js +10 -10
- package/build/frontend-models/use-model-class-event.js +11 -11
- package/build/frontend-models/use-updated-event.js +11 -11
- package/build/frontend-models/websocket-channel.js +26 -17
- package/build/frontend-models/websocket-publishers.js +9 -9
- package/build/http-client/response.js +2 -2
- package/build/http-server/client/index.js +8 -8
- package/build/http-server/client/params-to-object.js +10 -10
- package/build/http-server/client/request-buffer/form-data-part.js +2 -2
- package/build/http-server/client/request-buffer/index.js +8 -8
- package/build/http-server/client/request-parser.js +3 -3
- package/build/http-server/client/request-runner.js +6 -6
- package/build/http-server/client/request-timing.js +5 -5
- package/build/http-server/client/request.js +1 -1
- package/build/http-server/client/response.js +5 -5
- package/build/http-server/client/websocket-request.js +4 -4
- package/build/http-server/client/websocket-session.js +18 -18
- package/build/http-server/development-reloader.js +5 -5
- package/build/http-server/index.js +12 -12
- package/build/http-server/remote-address.js +4 -4
- package/build/http-server/server-client.js +3 -3
- package/build/http-server/server-lock.js +4 -4
- package/build/http-server/websocket-channel-subscribers.js +3 -3
- package/build/http-server/websocket-channel.js +1 -1
- package/build/http-server/websocket-connection.js +1 -1
- package/build/http-server/websocket-event-log-store.js +6 -6
- package/build/http-server/websocket-events-host.js +2 -2
- package/build/http-server/worker-handler/in-process.js +7 -7
- package/build/http-server/worker-handler/index.js +4 -4
- package/build/http-server/worker-handler/worker-thread.js +3 -3
- package/build/logger/outputs/array-output.js +3 -3
- package/build/logger/outputs/console-output.js +1 -1
- package/build/logger/outputs/file-output.js +4 -4
- package/build/logger/outputs/stdout-output.js +1 -1
- package/build/logger.js +10 -10
- package/build/mailer/backends/smtp.js +3 -3
- package/build/mailer/base.js +8 -8
- package/build/mailer/delivery.js +4 -4
- package/build/plugins/sqljs-wasm-route-controller.js +1 -1
- package/build/routes/base-route.js +6 -6
- package/build/routes/basic-route.js +1 -1
- package/build/routes/hooks/frontend-model-command-route-hook.js +1 -1
- package/build/routes/index.js +1 -1
- package/build/routes/plugin-routes.js +1 -1
- package/build/routes/resolver.js +11 -11
- package/build/routes/resource-route.js +1 -1
- package/build/src/application.d.ts +3 -3
- package/build/src/application.d.ts.map +1 -1
- package/build/src/application.js +5 -5
- package/build/src/authorization/ability.d.ts +7 -7
- package/build/src/authorization/ability.d.ts.map +1 -1
- package/build/src/authorization/ability.js +9 -9
- package/build/src/authorization/base-resource.d.ts +1 -1
- package/build/src/authorization/base-resource.d.ts.map +1 -1
- package/build/src/authorization/base-resource.js +5 -5
- package/build/src/background-jobs/cron-expression.js +2 -2
- package/build/src/background-jobs/forked-runner-child.js +2 -2
- package/build/src/background-jobs/job-registry.d.ts +1 -1
- package/build/src/background-jobs/job-registry.d.ts.map +1 -1
- package/build/src/background-jobs/job-registry.js +2 -2
- package/build/src/background-jobs/job-runner.js +2 -2
- package/build/src/background-jobs/job.js +2 -2
- package/build/src/background-jobs/json-socket.d.ts +4 -4
- package/build/src/background-jobs/json-socket.d.ts.map +1 -1
- package/build/src/background-jobs/json-socket.js +5 -5
- package/build/src/background-jobs/main.d.ts +18 -18
- package/build/src/background-jobs/main.d.ts.map +1 -1
- package/build/src/background-jobs/main.js +22 -22
- package/build/src/background-jobs/scheduler.d.ts +5 -5
- package/build/src/background-jobs/scheduler.d.ts.map +1 -1
- package/build/src/background-jobs/scheduler.js +8 -8
- package/build/src/background-jobs/store.js +8 -8
- package/build/src/background-jobs/web/controller.js +3 -3
- package/build/src/background-jobs/worker.d.ts +6 -6
- package/build/src/background-jobs/worker.d.ts.map +1 -1
- package/build/src/background-jobs/worker.js +13 -13
- package/build/src/beacon/client.d.ts +4 -4
- package/build/src/beacon/client.d.ts.map +1 -1
- package/build/src/beacon/client.js +12 -9
- package/build/src/beacon/in-process-broker.d.ts.map +1 -1
- package/build/src/beacon/in-process-broker.js +3 -3
- package/build/src/beacon/in-process-client.d.ts +1 -1
- package/build/src/beacon/in-process-client.d.ts.map +1 -1
- package/build/src/beacon/in-process-client.js +3 -3
- package/build/src/beacon/server.d.ts +2 -2
- package/build/src/beacon/server.d.ts.map +1 -1
- package/build/src/beacon/server.js +4 -4
- package/build/src/cli/browser-cli.js +2 -2
- package/build/src/cli/commands/db/base-command.d.ts +2 -2
- package/build/src/cli/commands/db/base-command.d.ts.map +1 -1
- package/build/src/cli/commands/db/base-command.js +3 -3
- package/build/src/cli/index.js +3 -3
- package/build/src/cli/tenant-database-command-helper.d.ts +1 -1
- package/build/src/cli/tenant-database-command-helper.d.ts.map +1 -1
- package/build/src/cli/tenant-database-command-helper.js +4 -4
- package/build/src/cli/use-browser-cli.js +2 -2
- package/build/src/configuration-types.d.ts +12 -2
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +4 -2
- package/build/src/configuration.d.ts +14 -14
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +39 -39
- package/build/src/controller.js +10 -10
- package/build/src/current-configuration.js +2 -2
- package/build/src/database/annotations-async-hooks.js +3 -3
- package/build/src/database/annotations.d.ts.map +1 -1
- package/build/src/database/annotations.js +4 -4
- package/build/src/database/drivers/base-column.d.ts +1 -1
- 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-foreign-key.d.ts +1 -1
- 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 +1 -1
- 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 +6 -6
- package/build/src/database/drivers/base.d.ts.map +1 -1
- package/build/src/database/drivers/base.js +11 -11
- package/build/src/database/drivers/mssql/index.js +2 -2
- package/build/src/database/drivers/mssql/table.js +2 -2
- package/build/src/database/drivers/mysql/index.js +4 -4
- package/build/src/database/drivers/mysql/query.js +2 -2
- package/build/src/database/drivers/mysql/table.js +2 -2
- package/build/src/database/drivers/pgsql/index.js +3 -3
- package/build/src/database/drivers/sqlite/base.d.ts +3 -3
- package/build/src/database/drivers/sqlite/base.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/base.js +17 -17
- package/build/src/database/drivers/sqlite/index.d.ts +4 -4
- package/build/src/database/drivers/sqlite/index.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/index.js +12 -12
- package/build/src/database/drivers/sqlite/index.native.js +2 -2
- package/build/src/database/drivers/sqlite/index.web.d.ts +2 -2
- package/build/src/database/drivers/sqlite/index.web.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/index.web.js +4 -4
- package/build/src/database/drivers/sqlite/query.js +2 -2
- package/build/src/database/drivers/sqlite/query.web.js +2 -2
- package/build/src/database/drivers/sqlite/sql/alter-table.js +3 -3
- package/build/src/database/drivers/sqlite/table.js +2 -2
- package/build/src/database/migrator/files-finder.js +2 -2
- package/build/src/database/migrator.d.ts +1 -1
- package/build/src/database/migrator.d.ts.map +1 -1
- package/build/src/database/migrator.js +7 -7
- package/build/src/database/pool/async-tracked-multi-connection.d.ts +9 -9
- package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
- package/build/src/database/pool/async-tracked-multi-connection.js +28 -28
- package/build/src/database/pool/base-methods-forward.js +7 -7
- package/build/src/database/pool/base.d.ts +1 -1
- package/build/src/database/pool/base.d.ts.map +1 -1
- package/build/src/database/pool/base.js +9 -9
- package/build/src/database/query/from-base.d.ts +1 -1
- package/build/src/database/query/from-base.d.ts.map +1 -1
- package/build/src/database/query/from-base.js +2 -2
- package/build/src/database/query/index.d.ts +4 -4
- package/build/src/database/query/index.d.ts.map +1 -1
- package/build/src/database/query/index.js +11 -11
- package/build/src/database/query/join-object.js +4 -4
- package/build/src/database/query/model-class-query.d.ts +4 -4
- 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/preloader/belongs-to.js +23 -23
- package/build/src/database/query/preloader/has-many.js +21 -21
- package/build/src/database/query/preloader/has-one.js +9 -9
- package/build/src/database/query/preloader/selection.js +4 -4
- package/build/src/database/query/preloader.js +9 -9
- package/build/src/database/query/query-data.js +10 -10
- package/build/src/database/query/where-model-class-hash.js +8 -8
- package/build/src/database/query/with-count.js +10 -10
- package/build/src/database/record/acts-as-list.js +20 -20
- package/build/src/database/record/attachments/handle.d.ts +1 -1
- package/build/src/database/record/attachments/handle.d.ts.map +1 -1
- package/build/src/database/record/attachments/handle.js +3 -3
- package/build/src/database/record/attachments/normalize-input.js +15 -15
- package/build/src/database/record/attachments/storage-drivers/s3.js +7 -7
- package/build/src/database/record/attachments/store.d.ts +2 -2
- package/build/src/database/record/attachments/store.d.ts.map +1 -1
- package/build/src/database/record/attachments/store.js +14 -14
- package/build/src/database/record/index.d.ts +18 -25
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +135 -141
- package/build/src/database/record/instance-relationships/base.d.ts +3 -3
- package/build/src/database/record/instance-relationships/base.d.ts.map +1 -1
- package/build/src/database/record/instance-relationships/base.js +13 -13
- package/build/src/database/record/instance-relationships/belongs-to.js +4 -4
- package/build/src/database/record/instance-relationships/has-many.js +9 -9
- package/build/src/database/record/instance-relationships/has-one.d.ts +1 -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 +8 -8
- package/build/src/database/record/relationships/base.js +4 -4
- package/build/src/database/record/state-machine.js +8 -8
- package/build/src/database/record/validators/presence.js +2 -2
- package/build/src/database/record/validators/uniqueness.js +6 -6
- package/build/src/database/table-data/index.d.ts +4 -4
- package/build/src/database/table-data/index.d.ts.map +1 -1
- package/build/src/database/table-data/index.js +5 -5
- package/build/src/environment-handlers/base.js +3 -3
- package/build/src/environment-handlers/browser.d.ts +3 -3
- package/build/src/environment-handlers/browser.d.ts.map +1 -1
- package/build/src/environment-handlers/browser.js +8 -8
- package/build/src/environment-handlers/node/cli/commands/cli-command-context.js +2 -2
- 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/dump.js +2 -2
- 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/schema/load.js +4 -4
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +285 -12
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +712 -61
- package/build/src/environment-handlers/node.d.ts +2 -2
- package/build/src/environment-handlers/node.d.ts.map +1 -1
- package/build/src/environment-handlers/node.js +7 -7
- package/build/src/frontend-model-controller.d.ts +5 -6
- package/build/src/frontend-model-controller.d.ts.map +1 -1
- package/build/src/frontend-model-controller.js +88 -89
- package/build/src/frontend-model-resource/base-resource.d.ts +36 -27
- package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
- package/build/src/frontend-model-resource/base-resource.js +67 -120
- package/build/src/frontend-models/base.d.ts +67 -59
- package/build/src/frontend-models/base.d.ts.map +1 -1
- package/build/src/frontend-models/base.js +171 -158
- package/build/src/frontend-models/clear-pending-debounced-callback.js +2 -2
- package/build/src/frontend-models/event-hook-models.d.ts.map +1 -1
- package/build/src/frontend-models/event-hook-models.js +3 -3
- package/build/src/frontend-models/outgoing-event-buffer.d.ts +1 -1
- package/build/src/frontend-models/outgoing-event-buffer.d.ts.map +1 -1
- package/build/src/frontend-models/outgoing-event-buffer.js +3 -3
- package/build/src/frontend-models/preloader.js +6 -6
- package/build/src/frontend-models/query.d.ts +16 -8
- package/build/src/frontend-models/query.d.ts.map +1 -1
- package/build/src/frontend-models/query.js +43 -39
- package/build/src/frontend-models/resource-definition.js +7 -7
- package/build/src/frontend-models/transport-serialization.js +12 -12
- package/build/src/frontend-models/use-destroyed-event.d.ts.map +1 -1
- package/build/src/frontend-models/use-destroyed-event.js +11 -11
- package/build/src/frontend-models/use-model-class-event.d.ts.map +1 -1
- package/build/src/frontend-models/use-model-class-event.js +12 -12
- package/build/src/frontend-models/use-updated-event.d.ts.map +1 -1
- package/build/src/frontend-models/use-updated-event.js +12 -12
- package/build/src/frontend-models/websocket-channel.d.ts +6 -1
- package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
- package/build/src/frontend-models/websocket-channel.js +26 -18
- package/build/src/frontend-models/websocket-publishers.js +11 -11
- package/build/src/http-client/response.d.ts +2 -2
- package/build/src/http-client/response.d.ts.map +1 -1
- package/build/src/http-client/response.js +3 -3
- package/build/src/http-server/client/index.d.ts +1 -1
- package/build/src/http-server/client/index.d.ts.map +1 -1
- package/build/src/http-server/client/index.js +9 -9
- package/build/src/http-server/client/params-to-object.js +11 -11
- package/build/src/http-server/client/request-buffer/form-data-part.d.ts +2 -2
- package/build/src/http-server/client/request-buffer/form-data-part.d.ts.map +1 -1
- package/build/src/http-server/client/request-buffer/form-data-part.js +3 -3
- package/build/src/http-server/client/request-buffer/index.d.ts +4 -4
- package/build/src/http-server/client/request-buffer/index.d.ts.map +1 -1
- package/build/src/http-server/client/request-buffer/index.js +9 -9
- package/build/src/http-server/client/request-parser.d.ts +1 -1
- package/build/src/http-server/client/request-parser.d.ts.map +1 -1
- package/build/src/http-server/client/request-parser.js +4 -4
- package/build/src/http-server/client/request-runner.js +7 -7
- package/build/src/http-server/client/request-timing.d.ts +5 -5
- package/build/src/http-server/client/request-timing.d.ts.map +1 -1
- package/build/src/http-server/client/request-timing.js +6 -6
- package/build/src/http-server/client/request.js +2 -2
- package/build/src/http-server/client/response.d.ts +3 -3
- package/build/src/http-server/client/response.d.ts.map +1 -1
- package/build/src/http-server/client/response.js +6 -6
- package/build/src/http-server/client/websocket-request.d.ts +3 -3
- package/build/src/http-server/client/websocket-request.d.ts.map +1 -1
- package/build/src/http-server/client/websocket-request.js +5 -5
- package/build/src/http-server/client/websocket-session.d.ts +6 -6
- package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
- package/build/src/http-server/client/websocket-session.js +19 -19
- package/build/src/http-server/development-reloader.d.ts +3 -3
- package/build/src/http-server/development-reloader.d.ts.map +1 -1
- package/build/src/http-server/development-reloader.js +6 -6
- package/build/src/http-server/index.d.ts +7 -7
- package/build/src/http-server/index.d.ts.map +1 -1
- package/build/src/http-server/index.js +13 -13
- package/build/src/http-server/remote-address.js +6 -6
- package/build/src/http-server/server-client.js +4 -4
- package/build/src/http-server/server-lock.js +5 -5
- package/build/src/http-server/websocket-channel-subscribers.d.ts +1 -1
- package/build/src/http-server/websocket-channel-subscribers.d.ts.map +1 -1
- package/build/src/http-server/websocket-channel-subscribers.js +4 -4
- package/build/src/http-server/websocket-channel.d.ts +1 -1
- 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 +1 -1
- package/build/src/http-server/websocket-connection.d.ts.map +1 -1
- package/build/src/http-server/websocket-connection.js +2 -2
- package/build/src/http-server/websocket-event-log-store.d.ts +1 -1
- package/build/src/http-server/websocket-event-log-store.d.ts.map +1 -1
- package/build/src/http-server/websocket-event-log-store.js +7 -7
- package/build/src/http-server/websocket-events-host.d.ts +1 -1
- package/build/src/http-server/websocket-events-host.d.ts.map +1 -1
- package/build/src/http-server/websocket-events-host.js +3 -3
- package/build/src/http-server/worker-handler/in-process.d.ts +3 -3
- package/build/src/http-server/worker-handler/in-process.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/in-process.js +9 -9
- package/build/src/http-server/worker-handler/index.d.ts +4 -4
- package/build/src/http-server/worker-handler/index.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/index.js +5 -5
- package/build/src/http-server/worker-handler/worker-thread.d.ts +2 -2
- package/build/src/http-server/worker-handler/worker-thread.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/worker-thread.js +4 -4
- package/build/src/logger/outputs/array-output.d.ts +3 -3
- package/build/src/logger/outputs/array-output.d.ts.map +1 -1
- package/build/src/logger/outputs/array-output.js +4 -4
- package/build/src/logger/outputs/console-output.d.ts +1 -1
- package/build/src/logger/outputs/console-output.d.ts.map +1 -1
- package/build/src/logger/outputs/console-output.js +2 -2
- package/build/src/logger/outputs/file-output.d.ts +4 -4
- package/build/src/logger/outputs/file-output.d.ts.map +1 -1
- package/build/src/logger/outputs/file-output.js +5 -5
- package/build/src/logger/outputs/stdout-output.d.ts.map +1 -1
- package/build/src/logger/outputs/stdout-output.js +2 -2
- package/build/src/logger.d.ts.map +1 -1
- package/build/src/logger.js +11 -11
- package/build/src/mailer/backends/smtp.d.ts.map +1 -1
- package/build/src/mailer/backends/smtp.js +5 -5
- package/build/src/mailer/base.js +11 -11
- package/build/src/mailer/delivery.d.ts +3 -3
- package/build/src/mailer/delivery.d.ts.map +1 -1
- package/build/src/mailer/delivery.js +5 -5
- package/build/src/plugins/sqljs-wasm-route-controller.js +2 -2
- package/build/src/routes/base-route.d.ts +6 -6
- package/build/src/routes/base-route.d.ts.map +1 -1
- package/build/src/routes/base-route.js +7 -7
- package/build/src/routes/basic-route.js +2 -2
- package/build/src/routes/hooks/frontend-model-command-route-hook.js +2 -2
- package/build/src/routes/index.js +2 -2
- package/build/src/routes/plugin-routes.js +2 -2
- package/build/src/routes/resolver.d.ts +1 -1
- package/build/src/routes/resolver.d.ts.map +1 -1
- package/build/src/routes/resolver.js +13 -13
- package/build/src/routes/resource-route.d.ts +1 -1
- package/build/src/routes/resource-route.d.ts.map +1 -1
- package/build/src/routes/resource-route.js +2 -2
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts.map +1 -1
- package/build/src/testing/browser-frontend-model-event-hook-scenarios.js +8 -8
- package/build/src/testing/expect-utils.js +13 -13
- package/build/src/testing/expect.d.ts +1 -1
- package/build/src/testing/expect.d.ts.map +1 -1
- package/build/src/testing/expect.js +9 -9
- package/build/src/testing/test-files-finder.d.ts +8 -8
- package/build/src/testing/test-files-finder.d.ts.map +1 -1
- package/build/src/testing/test-files-finder.js +9 -9
- package/build/src/testing/test-filter-parser.js +3 -3
- package/build/src/testing/test-runner.d.ts +2 -2
- package/build/src/testing/test-runner.d.ts.map +1 -1
- package/build/src/testing/test-runner.js +17 -17
- package/build/src/testing/test-suite-splitter.js +2 -2
- package/build/src/testing/test.d.ts +2 -2
- package/build/src/testing/test.d.ts.map +1 -1
- package/build/src/testing/test.js +16 -16
- package/build/src/utils/backtrace-cleaner.d.ts +1 -1
- package/build/src/utils/backtrace-cleaner.d.ts.map +1 -1
- package/build/src/utils/backtrace-cleaner.js +2 -2
- package/build/src/utils/format-value.js +2 -2
- package/build/src/utils/model-scope.js +2 -2
- package/build/src/utils/ransack.js +27 -27
- package/build/src/utils/with-tracked-stack-async-hooks.js +8 -8
- package/build/src/utils/with-tracked-stack.js +4 -4
- package/build/testing/browser-frontend-model-event-hook-scenarios.js +7 -7
- package/build/testing/expect-utils.js +11 -11
- package/build/testing/expect.js +7 -7
- package/build/testing/test-files-finder.js +8 -8
- package/build/testing/test-filter-parser.js +2 -2
- package/build/testing/test-runner.js +16 -16
- package/build/testing/test-suite-splitter.js +1 -1
- package/build/testing/test.js +15 -15
- package/build/utils/backtrace-cleaner.js +1 -1
- package/build/utils/format-value.js +1 -1
- package/build/utils/model-scope.js +1 -1
- package/build/utils/ransack.js +26 -26
- package/build/utils/with-tracked-stack-async-hooks.js +7 -7
- package/build/utils/with-tracked-stack.js +3 -3
- package/package.json +2 -1
- package/src/application.js +4 -4
- package/src/authorization/ability.js +8 -8
- package/src/authorization/base-resource.js +4 -4
- package/src/background-jobs/cron-expression.js +1 -1
- package/src/background-jobs/forked-runner-child.js +1 -1
- package/src/background-jobs/job-registry.js +1 -1
- package/src/background-jobs/job-runner.js +1 -1
- package/src/background-jobs/job.js +1 -1
- package/src/background-jobs/json-socket.js +4 -4
- package/src/background-jobs/main.js +21 -21
- package/src/background-jobs/scheduler.js +7 -7
- package/src/background-jobs/store.js +7 -7
- package/src/background-jobs/web/controller.js +2 -2
- package/src/background-jobs/worker.js +12 -12
- package/src/beacon/client.js +11 -8
- package/src/beacon/in-process-broker.js +2 -2
- package/src/beacon/in-process-client.js +2 -2
- package/src/beacon/server.js +3 -3
- package/src/cli/browser-cli.js +1 -1
- package/src/cli/commands/db/base-command.js +2 -2
- package/src/cli/index.js +2 -2
- package/src/cli/tenant-database-command-helper.js +3 -3
- package/src/cli/use-browser-cli.js +1 -1
- package/src/configuration-types.js +3 -1
- package/src/configuration.js +38 -38
- package/src/controller.js +8 -8
- package/src/current-configuration.js +1 -1
- package/src/database/annotations-async-hooks.js +2 -2
- package/src/database/annotations.js +3 -3
- 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 +10 -10
- package/src/database/drivers/mssql/index.js +1 -1
- package/src/database/drivers/mssql/table.js +1 -1
- package/src/database/drivers/mysql/index.js +3 -3
- package/src/database/drivers/mysql/query.js +1 -1
- package/src/database/drivers/mysql/table.js +1 -1
- package/src/database/drivers/pgsql/index.js +2 -2
- package/src/database/drivers/sqlite/base.js +16 -16
- package/src/database/drivers/sqlite/index.js +11 -11
- package/src/database/drivers/sqlite/index.native.js +1 -1
- package/src/database/drivers/sqlite/index.web.js +3 -3
- package/src/database/drivers/sqlite/query.js +1 -1
- package/src/database/drivers/sqlite/query.web.js +1 -1
- package/src/database/drivers/sqlite/sql/alter-table.js +2 -2
- package/src/database/drivers/sqlite/table.js +1 -1
- package/src/database/migrator/files-finder.js +1 -1
- package/src/database/migrator.js +6 -6
- package/src/database/pool/async-tracked-multi-connection.js +27 -27
- package/src/database/pool/base-methods-forward.js +4 -4
- package/src/database/pool/base.js +8 -8
- package/src/database/query/from-base.js +1 -1
- package/src/database/query/index.js +10 -10
- package/src/database/query/join-object.js +3 -3
- package/src/database/query/model-class-query.js +39 -39
- package/src/database/query/preloader/belongs-to.js +22 -22
- package/src/database/query/preloader/has-many.js +20 -20
- package/src/database/query/preloader/has-one.js +8 -8
- package/src/database/query/preloader/selection.js +3 -3
- package/src/database/query/preloader.js +8 -8
- package/src/database/query/query-data.js +9 -9
- package/src/database/query/where-model-class-hash.js +7 -7
- package/src/database/query/with-count.js +9 -9
- package/src/database/record/acts-as-list.js +15 -15
- package/src/database/record/attachments/handle.js +2 -2
- package/src/database/record/attachments/normalize-input.js +12 -12
- package/src/database/record/attachments/storage-drivers/s3.js +6 -6
- package/src/database/record/attachments/store.js +13 -13
- package/src/database/record/index.js +115 -121
- package/src/database/record/instance-relationships/base.js +11 -11
- package/src/database/record/instance-relationships/belongs-to.js +3 -3
- package/src/database/record/instance-relationships/has-many.js +8 -8
- package/src/database/record/instance-relationships/has-one.js +7 -7
- package/src/database/record/relationships/base.js +2 -2
- package/src/database/record/state-machine.js +7 -7
- package/src/database/record/validators/presence.js +1 -1
- package/src/database/record/validators/uniqueness.js +5 -5
- package/src/database/table-data/index.js +4 -4
- package/src/environment-handlers/base.js +2 -2
- package/src/environment-handlers/browser.js +7 -7
- package/src/environment-handlers/node/cli/commands/cli-command-context.js +1 -1
- package/src/environment-handlers/node/cli/commands/console.js +4 -4
- package/src/environment-handlers/node/cli/commands/db/schema/dump.js +1 -1
- package/src/environment-handlers/node/cli/commands/db/schema/load.js +3 -3
- package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +836 -60
- package/src/environment-handlers/node.js +6 -6
- package/src/frontend-model-controller.js +81 -82
- package/src/frontend-model-resource/base-resource.js +78 -115
- package/src/frontend-models/base.js +162 -149
- package/src/frontend-models/clear-pending-debounced-callback.js +1 -1
- package/src/frontend-models/event-hook-models.js +2 -2
- package/src/frontend-models/outgoing-event-buffer.js +2 -2
- package/src/frontend-models/preloader.js +5 -5
- package/src/frontend-models/query.js +43 -38
- package/src/frontend-models/resource-definition.js +6 -6
- package/src/frontend-models/transport-serialization.js +11 -11
- package/src/frontend-models/use-destroyed-event.js +10 -10
- package/src/frontend-models/use-model-class-event.js +11 -11
- package/src/frontend-models/use-updated-event.js +11 -11
- package/src/frontend-models/websocket-channel.js +26 -17
- package/src/frontend-models/websocket-publishers.js +9 -9
- package/src/http-client/response.js +2 -2
- package/src/http-server/client/index.js +8 -8
- package/src/http-server/client/params-to-object.js +10 -10
- package/src/http-server/client/request-buffer/form-data-part.js +2 -2
- package/src/http-server/client/request-buffer/index.js +8 -8
- package/src/http-server/client/request-parser.js +3 -3
- package/src/http-server/client/request-runner.js +6 -6
- package/src/http-server/client/request-timing.js +5 -5
- package/src/http-server/client/request.js +1 -1
- package/src/http-server/client/response.js +5 -5
- package/src/http-server/client/websocket-request.js +4 -4
- package/src/http-server/client/websocket-session.js +18 -18
- package/src/http-server/development-reloader.js +5 -5
- package/src/http-server/index.js +12 -12
- package/src/http-server/remote-address.js +4 -4
- package/src/http-server/server-client.js +3 -3
- package/src/http-server/server-lock.js +4 -4
- package/src/http-server/websocket-channel-subscribers.js +3 -3
- package/src/http-server/websocket-channel.js +1 -1
- package/src/http-server/websocket-connection.js +1 -1
- package/src/http-server/websocket-event-log-store.js +6 -6
- package/src/http-server/websocket-events-host.js +2 -2
- package/src/http-server/worker-handler/in-process.js +7 -7
- package/src/http-server/worker-handler/index.js +4 -4
- package/src/http-server/worker-handler/worker-thread.js +3 -3
- package/src/logger/outputs/array-output.js +3 -3
- package/src/logger/outputs/console-output.js +1 -1
- package/src/logger/outputs/file-output.js +4 -4
- package/src/logger/outputs/stdout-output.js +1 -1
- package/src/logger.js +10 -10
- package/src/mailer/backends/smtp.js +3 -3
- package/src/mailer/base.js +8 -8
- package/src/mailer/delivery.js +4 -4
- package/src/plugins/sqljs-wasm-route-controller.js +1 -1
- package/src/routes/base-route.js +6 -6
- package/src/routes/basic-route.js +1 -1
- package/src/routes/hooks/frontend-model-command-route-hook.js +1 -1
- package/src/routes/index.js +1 -1
- package/src/routes/plugin-routes.js +1 -1
- package/src/routes/resolver.js +11 -11
- package/src/routes/resource-route.js +1 -1
- package/src/testing/browser-frontend-model-event-hook-scenarios.js +7 -7
- package/src/testing/expect-utils.js +11 -11
- package/src/testing/expect.js +7 -7
- package/src/testing/test-files-finder.js +8 -8
- package/src/testing/test-filter-parser.js +2 -2
- package/src/testing/test-runner.js +16 -16
- package/src/testing/test-suite-splitter.js +1 -1
- package/src/testing/test.js +15 -15
- package/src/utils/backtrace-cleaner.js +1 -1
- package/src/utils/format-value.js +1 -1
- package/src/utils/model-scope.js +1 -1
- package/src/utils/ransack.js +26 -26
- package/src/utils/with-tracked-stack-async-hooks.js +7 -7
- package/src/utils/with-tracked-stack.js +3 -3
|
@@ -14,7 +14,7 @@ export default class Expect extends BaseExpect {
|
|
|
14
14
|
this._object = object;
|
|
15
15
|
/**
|
|
16
16
|
* Narrows the runtime value to the documented type.
|
|
17
|
-
|
|
17
|
+
* @type {Array<Expect | ExpectToChange>} */
|
|
18
18
|
this.expectations = [];
|
|
19
19
|
}
|
|
20
20
|
/**
|
|
@@ -400,7 +400,7 @@ export default class Expect extends BaseExpect {
|
|
|
400
400
|
if (isObjectContaining(result)) {
|
|
401
401
|
const expectedValue = /**
|
|
402
402
|
* Narrows the runtime value to the documented type.
|
|
403
|
-
|
|
403
|
+
* @type {?} */ (result).value;
|
|
404
404
|
const { matches, differences } = matchObject(this._object, expectedValue);
|
|
405
405
|
const objectPrint = formatValue(this._object);
|
|
406
406
|
const expectedPrint = formatValue(expectedValue);
|
|
@@ -418,9 +418,9 @@ export default class Expect extends BaseExpect {
|
|
|
418
418
|
if (isArrayContaining(result)) {
|
|
419
419
|
const expectedValue = /**
|
|
420
420
|
* Narrows the runtime value to the documented type.
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
@type {?} */(result).value);
|
|
421
|
+
* @type {Array<?>} */ ( /**
|
|
422
|
+
* Narrows the runtime value to the documented type.
|
|
423
|
+
* @type {?} */(result).value);
|
|
424
424
|
const { matches, differences } = matchArrayContaining(this._object, expectedValue);
|
|
425
425
|
const objectPrint = formatValue(this._object);
|
|
426
426
|
const expectedPrint = formatValue(expectedValue);
|
|
@@ -654,18 +654,18 @@ export default class Expect extends BaseExpect {
|
|
|
654
654
|
throw new Error("not stub");
|
|
655
655
|
/**
|
|
656
656
|
* Differences.
|
|
657
|
-
|
|
657
|
+
* @type {Record<string, Array<?>>} */
|
|
658
658
|
const differences = {};
|
|
659
659
|
const objectAsRecord = /**
|
|
660
660
|
* Narrows the runtime value to the documented type.
|
|
661
|
-
|
|
661
|
+
* @type {Record<string, ?>} */ (this._object);
|
|
662
662
|
for (const key in result) {
|
|
663
663
|
const value = result[key];
|
|
664
664
|
if (!(key in objectAsRecord))
|
|
665
665
|
throw new Error(`${this._object.constructor.name} doesn't respond to ${key}`);
|
|
666
666
|
const objectValue = /**
|
|
667
667
|
* Narrows the runtime value to the documented type.
|
|
668
|
-
|
|
668
|
+
* @type {() => ?} */ (objectAsRecord[key])();
|
|
669
669
|
if (value != objectValue) {
|
|
670
670
|
differences[key] = [value, objectValue];
|
|
671
671
|
}
|
|
@@ -675,4 +675,4 @@ export default class Expect extends BaseExpect {
|
|
|
675
675
|
}
|
|
676
676
|
}
|
|
677
677
|
}
|
|
678
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rlc3RpbmcvZXhwZWN0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsV0FBVyxFQUFFLGlCQUFpQixFQUFDLE1BQU0sMEJBQTBCLENBQUE7QUFDdkUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sdUNBQXVDLENBQUE7QUFDdkUsT0FBTyxVQUFVLE1BQU0sa0JBQWtCLENBQUE7QUFDekMsT0FBTyxjQUFjLE1BQU0sdUJBQXVCLENBQUE7QUFDbEQsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3BCLFdBQVcsRUFDWixNQUFNLG1CQUFtQixDQUFBO0FBRTFCLE1BQU0sQ0FBQyxPQUFPLE9BQU8sTUFBTyxTQUFRLFVBQVU7SUFDNUM7OztPQUdHO0lBQ0gsWUFBWSxNQUFNO1FBQ2hCLEtBQUssRUFBRSxDQUFBO1FBQ1AsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUE7UUFFckI7O21EQUUyQztRQUMzQyxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQTtJQUN4QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFNBQVMsQ0FBQyxjQUFjO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQTtJQUN0QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSxHQUFHO1FBQ0wsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7UUFFaEIsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksQ0FBQyxNQUFNO1FBQ1QsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZCxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FB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LENBQUE7UUFFcEUsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUN6QixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7WUFFekIsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLGNBQWMsQ0FBQztnQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSx1QkFBdUIsR0FBRyxFQUFFLENBQUMsQ0FBQTtZQUUzRyxNQUFNLFdBQVcsR0FBRzs7b0RBRW9CLENBQUMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFBO1lBRWhFLElBQUksS0FBSyxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUN6QixXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUE7WUFDekMsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUNsRixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7Zm9ybWF0VmFsdWUsIG1pbmlmaWVkU3RyaW5naWZ5fSBmcm9tIFwiLi4vdXRpbHMvZm9ybWF0LXZhbHVlLmpzXCJcbmltcG9ydCB7YW55dGhpbmdEaWZmZXJlbnR9IGZyb20gXCJzZXQtc3RhdGUtY29tcGFyZS9idWlsZC9kaWZmLXV0aWxzLmpzXCJcbmltcG9ydCBCYXNlRXhwZWN0IGZyb20gXCIuL2Jhc2UtZXhwZWN0LmpzXCJcbmltcG9ydCBFeHBlY3RUb0NoYW5nZSBmcm9tIFwiLi9leHBlY3QtdG8tY2hhbmdlLmpzXCJcbmltcG9ydCB7XG4gIGlzQXJyYXlDb250YWluaW5nLFxuICBpc09iamVjdENvbnRhaW5pbmcsXG4gIG1hdGNoQXJyYXlDb250YWluaW5nLFxuICBtYXRjaE9iamVjdFxufSBmcm9tIFwiLi9leHBlY3QtdXRpbHMuanNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFeHBlY3QgZXh0ZW5kcyBCYXNlRXhwZWN0IHtcbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7P30gb2JqZWN0IC0gT2JqZWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3Iob2JqZWN0KSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuX29iamVjdCA9IG9iamVjdFxuXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAgQHR5cGUge0FycmF5PEV4cGVjdCB8IEV4cGVjdFRvQ2hhbmdlPn0gKi9cbiAgICB0aGlzLmV4cGVjdGF0aW9ucyA9IFtdXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhbmQgY2hhbmdlLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCk6IFByb21pc2U8bnVtYmVyPn0gY2hhbmdlQ2FsbGJhY2sgLSBDaGFuZ2UgY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtFeHBlY3RUb0NoYW5nZX0gLSBUaGUgYW5kIGNoYW5nZS5cbiAgICovXG4gIGFuZENoYW5nZShjaGFuZ2VDYWxsYmFjaykge1xuICAgIHJldHVybiB0aGlzLnRvQ2hhbmdlKGNoYW5nZUNhbGxiYWNrKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgbm90LlxuICAgKiBAcmV0dXJucyB7dGhpc30gLSBBIHZhbHVlLlxuICAgKi9cbiAgZ2V0IG5vdCgpIHtcbiAgICB0aGlzLl9ub3QgPSB0cnVlXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdG8gYmUuXG4gICAqIEBwYXJhbSB7P30gcmVzdWx0IC0gUmVzdWx0LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICB0b0JlKHJlc3VsdCkge1xuICAgIGlmICh0aGlzLl9ub3QpIHtcbiAgICAgIGlmICh0aGlzLl9vYmplY3QgPT09IHJlc3VsdCkge1xuICAgICAgICBjb25zdCBvYmplY3RQcmludCA9IGZvcm1hdFZhbHVlKHRoaXMuX29iamVjdClcbiAgICAgICAgY29uc3QgcmVzdWx0UHJpbnQgPSBmb3JtYXRWYWx1ZShyZXN1bHQpXG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSB3YXMgdW5leHBlY3RlZCBub3QgdG8gYmUgJHtyZXN1bHRQcmludH1gKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5fb2JqZWN0ICE9PSByZXN1bHQpIHtcbiAgICAgICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBmb3JtYXRWYWx1ZSh0aGlzLl9vYmplY3QpXG4gICAgICAgIGNvbnN0IHJlc3VsdFByaW50ID0gZm9ybWF0VmFsdWUocmVzdWx0KVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3RQcmludH0gd2Fzbid0IGV4cGVjdGVkIGJlICR7cmVzdWx0UHJpbnR9YClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyB0byBiZSBsZXNzIHRoYW4uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZXN1bHQgLSBSZXN1bHQuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHRvQmVMZXNzVGhhbihyZXN1bHQpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX29iamVjdCAhPT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm51bWJlclwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG51bWJlcnMgYnV0IGdvdCAke3R5cGVvZiB0aGlzLl9vYmplY3R9IGFuZCAke3R5cGVvZiByZXN1bHR9YClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbm90KSB7XG4gICAgICBpZiAodGhpcy5fb2JqZWN0IDwgcmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IG9iamVjdFByaW50ID0gZm9ybWF0VmFsdWUodGhpcy5fb2JqZWN0KVxuICAgICAgICBjb25zdCByZXN1bHRQcmludCA9IGZvcm1hdFZhbHVlKHJlc3VsdClcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhcyB1bmV4cGVjdGVkIHRvIGJlIGxlc3MgdGhhbiAke3Jlc3VsdFByaW50fWApXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLl9vYmplY3QgPj0gcmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IG9iamVjdFByaW50ID0gZm9ybWF0VmFsdWUodGhpcy5fb2JqZWN0KVxuICAgICAgICBjb25zdCByZXN1bHRQcmludCA9IGZvcm1hdFZhbHVlKHJlc3VsdClcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhc24ndCBleHBlY3RlZCB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHtyZXN1bHRQcmludH1gKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRvIGJlIGxlc3MgdGhhbiBvciBlcXVhbC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlc3VsdCAtIFJlc3VsdC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgdG9CZUxlc3NUaGFuT3JFcXVhbChyZXN1bHQpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX29iamVjdCAhPT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm51bWJlclwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG51bWJlcnMgYnV0IGdvdCAke3R5cGVvZiB0aGlzLl9vYmplY3R9IGFuZCAke3R5cGVvZiByZXN1bHR9YClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbm90KSB7XG4gICAgICBpZiAodGhpcy5fb2JqZWN0IDw9IHJlc3VsdCkge1xuICAgICAgICBjb25zdCBvYmplY3RQcmludCA9IGZvcm1hdFZhbHVlKHRoaXMuX29iamVjdClcbiAgICAgICAgY29uc3QgcmVzdWx0UHJpbnQgPSBmb3JtYXRWYWx1ZShyZXN1bHQpXG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSB3YXMgdW5leHBlY3RlZCB0byBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJHtyZXN1bHRQcmludH1gKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5fb2JqZWN0ID4gcmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IG9iamVjdFByaW50ID0gZm9ybWF0VmFsdWUodGhpcy5fb2JqZWN0KVxuICAgICAgICBjb25zdCByZXN1bHRQcmludCA9IGZvcm1hdFZhbHVlKHJlc3VsdClcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhc24ndCBleHBlY3RlZCB0byBiZSBncmVhdGVyIHRoYW4gJHtyZXN1bHRQcmludH1gKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRvIGJlIGdyZWF0ZXIgdGhhbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlc3VsdCAtIFJlc3VsdC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgdG9CZUdyZWF0ZXJUaGFuKHJlc3VsdCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fb2JqZWN0ICE9PSBcIm51bWJlclwiIHx8IHR5cGVvZiByZXN1bHQgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgbnVtYmVycyBidXQgZ290ICR7dHlwZW9mIHRoaXMuX29iamVjdH0gYW5kICR7dHlwZW9mIHJlc3VsdH1gKVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9ub3QpIHtcbiAgICAgIGlmICh0aGlzLl9vYmplY3QgPiByZXN1bHQpIHtcbiAgICAgICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBmb3JtYXRWYWx1ZSh0aGlzLl9vYmplY3QpXG4gICAgICAgIGNvbnN0IHJlc3VsdFByaW50ID0gZm9ybWF0VmFsdWUocmVzdWx0KVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3RQcmludH0gd2FzIHVuZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlciB0aGFuICR7cmVzdWx0UHJpbnR9YClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuX29iamVjdCA8PSByZXN1bHQpIHtcbiAgICAgICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBmb3JtYXRWYWx1ZSh0aGlzLl9vYmplY3QpXG4gICAgICAgIGNvbnN0IHJlc3VsdFByaW50ID0gZm9ybWF0VmFsdWUocmVzdWx0KVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3RQcmludH0gd2Fzbid0IGV4cGVjdGVkIHRvIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAke3Jlc3VsdFByaW50fWApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdG8gYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsLlxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVzdWx0IC0gUmVzdWx0LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICB0b0JlR3JlYXRlclRoYW5PckVxdWFsKHJlc3VsdCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fb2JqZWN0ICE9PSBcIm51bWJlclwiIHx8IHR5cGVvZiByZXN1bHQgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgbnVtYmVycyBidXQgZ290ICR7dHlwZW9mIHRoaXMuX29iamVjdH0gYW5kICR7dHlwZW9mIHJlc3VsdH1gKVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9ub3QpIHtcbiAgICAgIGlmICh0aGlzLl9vYmplY3QgPj0gcmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IG9iamVjdFByaW50ID0gZm9ybWF0VmFsdWUodGhpcy5fb2JqZWN0KVxuICAgICAgICBjb25zdCByZXN1bHRQcmludCA9IGZvcm1hdFZhbHVlKHJlc3VsdClcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhcyB1bmV4cGVjdGVkIHRvIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAke3Jlc3VsdFByaW50fWApXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLl9vYmplY3QgPCByZXN1bHQpIHtcbiAgICAgICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBmb3JtYXRWYWx1ZSh0aGlzLl9vYmplY3QpXG4gICAgICAgIGNvbnN0IHJlc3VsdFByaW50ID0gZm9ybWF0VmFsdWUocmVzdWx0KVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3RQcmludH0gd2Fzbid0IGV4cGVjdGVkIHRvIGJlIGxlc3MgdGhhbiAke3Jlc3VsdFByaW50fWApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdG8gYmUgY2xvc2UgdG8uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZXN1bHQgLSBSZXN1bHQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbcHJlY2lzaW9uXSAtIERlY2ltYWwgcHJlY2lzaW9uLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICB0b0JlQ2xvc2VUbyhyZXN1bHQsIHByZWNpc2lvbiA9IDIpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX29iamVjdCAhPT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm51bWJlclwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG51bWJlcnMgYnV0IGdvdCAke3R5cGVvZiB0aGlzLl9vYmplY3R9IGFuZCAke3R5cGVvZiByZXN1bHR9YClcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHByZWNpc2lvbiAhPT0gXCJudW1iZXJcIiB8fCAhTnVtYmVyLmlzRmluaXRlKHByZWNpc2lvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcHJlY2lzaW9uIHRvIGJlIGEgbnVtYmVyIGJ1dCBnb3QgJHt0eXBlb2YgcHJlY2lzaW9ufWApXG4gICAgfVxuXG4gICAgY29uc3QgdG9sZXJhbmNlID0gMC41ICogTWF0aC5wb3coMTAsIC1wcmVjaXNpb24pXG4gICAgY29uc3QgZGlmZiA9IE1hdGguYWJzKHRoaXMuX29iamVjdCAtIHJlc3VsdClcbiAgICBjb25zdCBpc0Nsb3NlID0gZGlmZiA8PSB0b2xlcmFuY2VcblxuICAgIGlmICh0aGlzLl9ub3QpIHtcbiAgICAgIGlmIChpc0Nsb3NlKSB7XG4gICAgICAgIGNvbnN0IG9iamVjdFByaW50ID0gZm9ybWF0VmFsdWUodGhpcy5fb2JqZWN0KVxuICAgICAgICBjb25zdCByZXN1bHRQcmludCA9IGZvcm1hdFZhbHVlKHJlc3VsdClcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhcyB1bmV4cGVjdGVkIHRvIGJlIGNsb3NlIHRvICR7cmVzdWx0UHJpbnR9YClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFpc0Nsb3NlKSB7XG4gICAgICAgIGNvbnN0IG9iamVjdFByaW50ID0gZm9ybWF0VmFsdWUodGhpcy5fb2JqZWN0KVxuICAgICAgICBjb25zdCByZXN1bHRQcmludCA9IGZvcm1hdFZhbHVlKHJlc3VsdClcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhc24ndCBleHBlY3RlZCB0byBiZSBjbG9zZSB0byAke3Jlc3VsdFByaW50fWApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdG8gaGF2ZSBsZW5ndGguXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZXN1bHQgLSBFeHBlY3RlZCBsZW5ndGguXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHRvSGF2ZUxlbmd0aChyZXN1bHQpIHtcbiAgICBpZiAodHlwZW9mIHJlc3VsdCAhPT0gXCJudW1iZXJcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBsZW5ndGggbnVtYmVyIGJ1dCBnb3QgJHt0eXBlb2YgcmVzdWx0fWApXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX29iamVjdCA9PT0gbnVsbCB8fCB0aGlzLl9vYmplY3QgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdGhpcy5fb2JqZWN0Lmxlbmd0aCAhPT0gXCJudW1iZXJcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCB2YWx1ZSB3aXRoIGxlbmd0aCBidXQgZ290ICR7dHlwZW9mIHRoaXMuX29iamVjdH1gKVxuICAgIH1cblxuICAgIGNvbnN0IG9iamVjdFByaW50ID0gZm9ybWF0VmFsdWUodGhpcy5fb2JqZWN0KVxuICAgIGNvbnN0IHJlc3VsdFByaW50ID0gZm9ybWF0VmFsdWUocmVzdWx0KVxuICAgIGNvbnN0IGxlbmd0aFZhbHVlID0gdGhpcy5fb2JqZWN0Lmxlbmd0aFxuXG4gICAgaWYgKHRoaXMuX25vdCkge1xuICAgICAgaWYgKGxlbmd0aFZhbHVlID09PSByZXN1bHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSB3YXMgdW5leHBlY3RlZCB0byBoYXZlIGxlbmd0aCAke3Jlc3VsdFByaW50fWApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChsZW5ndGhWYWx1ZSAhPT0gcmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhc24ndCBleHBlY3RlZCB0byBoYXZlIGxlbmd0aCAke3Jlc3VsdFByaW50fWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdG8gYmUgZGVmaW5lZC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgdG9CZURlZmluZWQoKSB7XG4gICAgaWYgKHRoaXMuX25vdCkge1xuICAgICAgaWYgKHRoaXMuX29iamVjdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IG9iamVjdFByaW50ID0gZm9ybWF0VmFsdWUodGhpcy5fb2JqZWN0KVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3RQcmludH0gd2FzbsK0dCBleHBlY3RlZCB0byBiZSBkZWZpbmVkYClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuX29iamVjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IG9iamVjdFByaW50ID0gZm9ybWF0VmFsdWUodGhpcy5fb2JqZWN0KVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3RQcmludH0gd2Fzbid0IGV4cGVjdGVkIGJlIHVuZGVmaW5lZGApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdG8gYmUgaW5zdGFuY2Ugb2YuXG4gICAqIEBwYXJhbSB7bmV3ICguLi5hcmdzOiBBcnJheTw/PikgPT4gP30ga2xhc3MgLSBDbGFzcyBjb25zdHJ1Y3RvciB0byBjaGVjayBhZ2FpbnN0IChlLmcuIGEgYnVpbHQtaW4gbGlrZSBFcnJvcikuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHRvQmVJbnN0YW5jZU9mKGtsYXNzKSB7XG4gICAgaWYgKCEodGhpcy5fb2JqZWN0IGluc3RhbmNlb2Yga2xhc3MpKSB7XG4gICAgICBjb25zdCBvYmplY3RQcmludCA9IGZvcm1hdFZhbHVlKHRoaXMuX29iamVjdClcblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke29iamVjdFByaW50fSB0byBiZSBhICR7a2xhc3MubmFtZX0gYnV0IGl0IHdhc24ndGApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdG8gYmUgZmFsc2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHRvQmVGYWxzZSgpIHtcbiAgICB0aGlzLnRvQmUoZmFsc2UpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB0byBiZSBudWxsLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICB0b0JlTnVsbCgpIHtcbiAgICB0aGlzLnRvQmUobnVsbClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRvIGJlIHVuZGVmaW5lZC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgdG9CZVVuZGVmaW5lZCgpIHtcbiAgICB0aGlzLnRvQmUodW5kZWZpbmVkKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdG8gYmUgdHJ1ZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgdG9CZVRydWUoKSB7XG4gICAgdGhpcy50b0JlKHRydWUpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB0byBiZSB0cnV0aHkuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHRvQmVUcnV0aHkoKSB7XG4gICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBmb3JtYXRWYWx1ZSh0aGlzLl9vYmplY3QpXG5cbiAgICBpZiAodGhpcy5fbm90KSB7XG4gICAgICBpZiAodGhpcy5fb2JqZWN0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3RQcmludH0gd2FzIHVuZXhwZWN0ZWQgdG8gYmUgdHJ1dGh5YClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCF0aGlzLl9vYmplY3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSB3YXNuJ3QgZXhwZWN0ZWQgdG8gYmUgdHJ1dGh5YClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyB0byBjaGFuZ2UuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTogUHJvbWlzZTxudW1iZXI+fSBjaGFuZ2VDYWxsYmFjayAtIENoYW5nZSBjYWxsYmFjay5cbiAgICogQHJldHVybnMge0V4cGVjdFRvQ2hhbmdlfSAtIFRoZSBjaGFuZ2UuXG4gICAqL1xuICB0b0NoYW5nZShjaGFuZ2VDYWxsYmFjaykge1xuICAgIGlmICh0aGlzLl9ub3QpIHRocm93IG5ldyBFcnJvcihcIm5vdCBzdHViXCIpXG5cbiAgICBjb25zdCBleHBlY3RUb0NoYW5nZSA9IG5ldyBFeHBlY3RUb0NoYW5nZSh7Y2hhbmdlQ2FsbGJhY2ssIGV4cGVjdDogdGhpc30pXG5cbiAgICB0aGlzLmV4cGVjdGF0aW9ucy5wdXNoKGV4cGVjdFRvQ2hhbmdlKVxuXG4gICAgcmV0dXJuIGV4cGVjdFRvQ2hhbmdlXG4gIH1cblxuICAvKipcbiAgICogUnVucyB0byBjb250YWluLlxuICAgKiBAcGFyYW0gez99IHZhbHVlVG9Db250YWluIC0gVmFsdWUgdG8gY29udGFpbi5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgdG9Db250YWluKHZhbHVlVG9Db250YWluKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9vYmplY3QgPT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IHRoaXMuX29iamVjdC5pbmNsdWRlcyhTdHJpbmcodmFsdWVUb0NvbnRhaW4pKVxuICAgICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBtaW5pZmllZFN0cmluZ2lmeSh0aGlzLl9vYmplY3QpXG4gICAgICBjb25zdCB2YWx1ZVByaW50ID0gdHlwZW9mIHZhbHVlVG9Db250YWluID09IFwic3RyaW5nXCJcbiAgICAgICAgPyBtaW5pZmllZFN0cmluZ2lmeSh2YWx1ZVRvQ29udGFpbilcbiAgICAgICAgOiBmb3JtYXRWYWx1ZSh2YWx1ZVRvQ29udGFpbilcblxuICAgICAgaWYgKHRoaXMuX25vdCkge1xuICAgICAgICBpZiAobWF0Y2hlcykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3RQcmludH0gd2FzIHVuZXhwZWN0ZWQgdG8gY29udGFpbiAke3ZhbHVlUHJpbnR9YClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghbWF0Y2hlcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IGRvZXNuJ3QgY29udGFpbiAke3ZhbHVlUHJpbnR9YClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMuX29iamVjdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYXJyYXkgb3Igc3RyaW5nIGJ1dCBnb3QgJHt0eXBlb2YgdGhpcy5fb2JqZWN0fWApXG4gICAgfVxuXG4gICAgY29uc3QgbWF0Y2hlcyA9IHRoaXMuX29iamVjdC5pbmNsdWRlcyh2YWx1ZVRvQ29udGFpbilcbiAgICBjb25zdCBvYmplY3RQcmludCA9IGZvcm1hdFZhbHVlKHRoaXMuX29iamVjdClcbiAgICBjb25zdCB2YWx1ZVByaW50ID0gdHlwZW9mIHZhbHVlVG9Db250YWluID09IFwic3RyaW5nXCJcbiAgICAgID8gbWluaWZpZWRTdHJpbmdpZnkodmFsdWVUb0NvbnRhaW4pXG4gICAgICA6IGZvcm1hdFZhbHVlKHZhbHVlVG9Db250YWluKVxuXG4gICAgaWYgKHRoaXMuX25vdCkge1xuICAgICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSB3YXMgdW5leHBlY3RlZCB0byBjb250YWluICR7dmFsdWVQcmludH1gKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIW1hdGNoZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3RQcmludH0gZG9lc24ndCBjb250YWluICR7dmFsdWVQcmludH1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRvIGNvbnRhaW4gZXF1YWwuXG4gICAqIEBwYXJhbSB7P30gdmFsdWVUb0NvbnRhaW4gLSBWYWx1ZSB0byBjb250YWluLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICB0b0NvbnRhaW5FcXVhbCh2YWx1ZVRvQ29udGFpbikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLl9vYmplY3QpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGFycmF5IGJ1dCBnb3QgJHt0eXBlb2YgdGhpcy5fb2JqZWN0fWApXG4gICAgfVxuXG4gICAgY29uc3QgbWF0Y2hlcyA9IHRoaXMuX29iamVjdC5zb21lKChpdGVtKSA9PiAhYW55dGhpbmdEaWZmZXJlbnQoaXRlbSwgdmFsdWVUb0NvbnRhaW4pKVxuICAgIGNvbnN0IG9iamVjdFByaW50ID0gZm9ybWF0VmFsdWUodGhpcy5fb2JqZWN0KVxuICAgIGNvbnN0IHZhbHVlUHJpbnQgPSB0eXBlb2YgdmFsdWVUb0NvbnRhaW4gPT0gXCJzdHJpbmdcIlxuICAgICAgPyBtaW5pZmllZFN0cmluZ2lmeSh2YWx1ZVRvQ29udGFpbilcbiAgICAgIDogZm9ybWF0VmFsdWUodmFsdWVUb0NvbnRhaW4pXG5cbiAgICBpZiAodGhpcy5fbm90KSB7XG4gICAgICBpZiAobWF0Y2hlcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhcyB1bmV4cGVjdGVkIHRvIGNvbnRhaW4gJHt2YWx1ZVByaW50fWApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghbWF0Y2hlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSBkb2Vzbid0IGNvbnRhaW4gJHt2YWx1ZVByaW50fWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdG8gaW5jbHVkZS5cbiAgICogQHBhcmFtIHs/fSB2YWx1ZVRvSW5jbHVkZSAtIFZhbHVlIHRvIGluY2x1ZGUuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHRvSW5jbHVkZSh2YWx1ZVRvSW5jbHVkZSkge1xuICAgIHRoaXMudG9Db250YWluKHZhbHVlVG9JbmNsdWRlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdG8gZXF1YWwuXG4gICAqIEBwYXJhbSB7P30gcmVzdWx0IC0gUmVzdWx0LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICB0b0VxdWFsKHJlc3VsdCkge1xuICAgIGlmICh0aGlzLl9vYmplY3QgaW5zdGFuY2VvZiBTZXQgJiYgcmVzdWx0IGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICBjb25zdCBvYmplY3RQcmludCA9IGZvcm1hdFZhbHVlKHRoaXMuX29iamVjdClcbiAgICAgIGNvbnN0IHJlc3VsdFByaW50ID0gZm9ybWF0VmFsdWUocmVzdWx0KVxuICAgICAgY29uc3QgYWN0dWFsSXRlbXMgPSBBcnJheS5mcm9tKHRoaXMuX29iamVjdClcbiAgICAgIGNvbnN0IGV4cGVjdGVkSXRlbXMgPSBBcnJheS5mcm9tKHJlc3VsdClcbiAgICAgIGNvbnN0IG1pc3NpbmdJdGVtcyA9IGV4cGVjdGVkSXRlbXMuZmlsdGVyKChleHBlY3RlZEl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuICFhY3R1YWxJdGVtcy5zb21lKChhY3R1YWxJdGVtKSA9PiAhYW55dGhpbmdEaWZmZXJlbnQoYWN0dWFsSXRlbSwgZXhwZWN0ZWRJdGVtKSlcbiAgICAgIH0pXG4gICAgICBjb25zdCB1bmV4cGVjdGVkSXRlbXMgPSBhY3R1YWxJdGVtcy5maWx0ZXIoKGFjdHVhbEl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuICFleHBlY3RlZEl0ZW1zLnNvbWUoKGV4cGVjdGVkSXRlbSkgPT4gIWFueXRoaW5nRGlmZmVyZW50KGFjdHVhbEl0ZW0sIGV4cGVjdGVkSXRlbSkpXG4gICAgICB9KVxuICAgICAgY29uc3QgaXNFcXVhbCA9IG1pc3NpbmdJdGVtcy5sZW5ndGggPT09IDAgJiYgdW5leHBlY3RlZEl0ZW1zLmxlbmd0aCA9PT0gMFxuXG4gICAgICBpZiAodGhpcy5fbm90KSB7XG4gICAgICAgIGlmIChpc0VxdWFsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSB3YXMgdW5leHBlY3RlZCBlcXVhbCB0byAke3Jlc3VsdFByaW50fWApXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWlzRXF1YWwpIHtcbiAgICAgICAgY29uc3QgbWlzc2luZ1N0cmluZ3MgPSBtaXNzaW5nSXRlbXMubWFwKChpdGVtKSA9PiBtaW5pZmllZFN0cmluZ2lmeShpdGVtKSlcbiAgICAgICAgY29uc3QgdW5leHBlY3RlZFN0cmluZ3MgPSB1bmV4cGVjdGVkSXRlbXMubWFwKChpdGVtKSA9PiBtaW5pZmllZFN0cmluZ2lmeShpdGVtKSlcbiAgICAgICAgY29uc3QgZGlmZlBhcnRzID0gW11cblxuICAgICAgICBpZiAobWlzc2luZ1N0cmluZ3MubGVuZ3RoID4gMCkgZGlmZlBhcnRzLnB1c2goYG1pc3NpbmcgJHttaXNzaW5nU3RyaW5ncy5qb2luKFwiLCBcIil9YClcbiAgICAgICAgaWYgKHVuZXhwZWN0ZWRTdHJpbmdzLmxlbmd0aCA+IDApIGRpZmZQYXJ0cy5wdXNoKGB1bmV4cGVjdGVkICR7dW5leHBlY3RlZFN0cmluZ3Muam9pbihcIiwgXCIpfWApXG5cbiAgICAgICAgY29uc3QgZGlmZk1lc3NhZ2UgPSBkaWZmUGFydHMubGVuZ3RoID4gMCA/IGAgKGRpZmY6ICR7ZGlmZlBhcnRzLmpvaW4oXCI7IFwiKX0pYCA6IFwiXCJcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhc24ndCBlcXVhbCB0byAke3Jlc3VsdFByaW50fSR7ZGlmZk1lc3NhZ2V9YClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGlzT2JqZWN0Q29udGFpbmluZyhyZXN1bHQpKSB7XG4gICAgICBjb25zdCBleHBlY3RlZFZhbHVlID0gLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHR5cGUgez99ICovIChyZXN1bHQpLnZhbHVlXG4gICAgICBjb25zdCB7bWF0Y2hlcywgZGlmZmVyZW5jZXN9ID0gbWF0Y2hPYmplY3QodGhpcy5fb2JqZWN0LCBleHBlY3RlZFZhbHVlKVxuICAgICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBmb3JtYXRWYWx1ZSh0aGlzLl9vYmplY3QpXG4gICAgICBjb25zdCBleHBlY3RlZFByaW50ID0gZm9ybWF0VmFsdWUoZXhwZWN0ZWRWYWx1ZSlcblxuICAgICAgaWYgKHRoaXMuX25vdCkge1xuICAgICAgICBpZiAobWF0Y2hlcykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJHtvYmplY3RQcmludH0gbm90IHRvIG1hdGNoICR7ZXhwZWN0ZWRQcmludH1gKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFtYXRjaGVzKSB7XG4gICAgICAgIGNvbnN0IGRpZmZQcmludCA9IE9iamVjdC5rZXlzKGRpZmZlcmVuY2VzKS5sZW5ndGggPiAwID8gYCAoZGlmZjogJHttaW5pZmllZFN0cmluZ2lmeShkaWZmZXJlbmNlcyl9KWAgOiBcIlwiXG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke29iamVjdFByaW50fSB0byBtYXRjaCAke2V4cGVjdGVkUHJpbnR9JHtkaWZmUHJpbnR9YClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGlzQXJyYXlDb250YWluaW5nKHJlc3VsdCkpIHtcbiAgICAgIGNvbnN0IGV4cGVjdGVkVmFsdWUgPSAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdHlwZSB7QXJyYXk8Pz59ICovICgvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHR5cGUgez99ICovIChyZXN1bHQpLnZhbHVlKVxuICAgICAgY29uc3Qge21hdGNoZXMsIGRpZmZlcmVuY2VzfSA9IG1hdGNoQXJyYXlDb250YWluaW5nKHRoaXMuX29iamVjdCwgZXhwZWN0ZWRWYWx1ZSlcbiAgICAgIGNvbnN0IG9iamVjdFByaW50ID0gZm9ybWF0VmFsdWUodGhpcy5fb2JqZWN0KVxuICAgICAgY29uc3QgZXhwZWN0ZWRQcmludCA9IGZvcm1hdFZhbHVlKGV4cGVjdGVkVmFsdWUpXG5cbiAgICAgIGlmICh0aGlzLl9ub3QpIHtcbiAgICAgICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7b2JqZWN0UHJpbnR9IG5vdCB0byBtYXRjaCAke2V4cGVjdGVkUHJpbnR9YClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghbWF0Y2hlcykge1xuICAgICAgICBjb25zdCBkaWZmUHJpbnQgPSBPYmplY3Qua2V5cyhkaWZmZXJlbmNlcykubGVuZ3RoID4gMCA/IGAgKGRpZmY6ICR7bWluaWZpZWRTdHJpbmdpZnkoZGlmZmVyZW5jZXMpfSlgIDogXCJcIlxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJHtvYmplY3RQcmludH0gdG8gbWF0Y2ggJHtleHBlY3RlZFByaW50fSR7ZGlmZlByaW50fWApXG4gICAgICB9XG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9ub3QpIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5fb2JqZWN0ID09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlc3VsdCA9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIGlmICghYW55dGhpbmdEaWZmZXJlbnQodGhpcy5fb2JqZWN0LCByZXN1bHQpKSB7XG4gICAgICAgICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBmb3JtYXRWYWx1ZSh0aGlzLl9vYmplY3QpXG4gICAgICAgICAgY29uc3QgcmVzdWx0UHJpbnQgPSBmb3JtYXRWYWx1ZShyZXN1bHQpXG5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhcyB1bmV4cGVjdGVkIGVxdWFsIHRvICR7cmVzdWx0UHJpbnR9YClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuX29iamVjdCA9PSByZXN1bHQpIHtcbiAgICAgICAgICBjb25zdCBvYmplY3RQcmludCA9IGZvcm1hdFZhbHVlKHRoaXMuX29iamVjdClcbiAgICAgICAgICBjb25zdCByZXN1bHRQcmludCA9IGZvcm1hdFZhbHVlKHJlc3VsdClcblxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3RQcmludH0gd2FzIHVuZXhwZWN0ZWQgZXF1YWwgdG8gJHtyZXN1bHRQcmludH1gKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5fb2JqZWN0ID09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlc3VsdCA9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIGlmIChhbnl0aGluZ0RpZmZlcmVudCh0aGlzLl9vYmplY3QsIHJlc3VsdCkpIHtcbiAgICAgICAgICBjb25zdCBvYmplY3RQcmludCA9IGZvcm1hdFZhbHVlKHRoaXMuX29iamVjdClcbiAgICAgICAgICBjb25zdCByZXN1bHRQcmludCA9IGZvcm1hdFZhbHVlKHJlc3VsdClcblxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuX29iamVjdCkgJiYgQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICAgICAgICBjb25zdCBhY3R1YWxTdHJpbmdzID0gdGhpcy5fb2JqZWN0Lm1hcCgoaXRlbSkgPT4gbWluaWZpZWRTdHJpbmdpZnkoaXRlbSkpXG4gICAgICAgICAgICBjb25zdCBleHBlY3RlZFN0cmluZ3MgPSByZXN1bHQubWFwKChpdGVtKSA9PiBtaW5pZmllZFN0cmluZ2lmeShpdGVtKSlcblxuICAgICAgICAgICAgY29uc3QgbWlzc2luZ0l0ZW1zID0gZXhwZWN0ZWRTdHJpbmdzLmZpbHRlcigoaXRlbSkgPT4gIWFjdHVhbFN0cmluZ3MuaW5jbHVkZXMoaXRlbSkpXG4gICAgICAgICAgICBjb25zdCB1bmV4cGVjdGVkSXRlbXMgPSBhY3R1YWxTdHJpbmdzLmZpbHRlcigoaXRlbSkgPT4gIWV4cGVjdGVkU3RyaW5ncy5pbmNsdWRlcyhpdGVtKSlcblxuICAgICAgICAgICAgY29uc3QgZGlmZlBhcnRzID0gW11cblxuICAgICAgICAgICAgaWYgKG1pc3NpbmdJdGVtcy5sZW5ndGggPiAwKSBkaWZmUGFydHMucHVzaChgbWlzc2luZyAke21pc3NpbmdJdGVtcy5qb2luKFwiLCBcIil9YClcbiAgICAgICAgICAgIGlmICh1bmV4cGVjdGVkSXRlbXMubGVuZ3RoID4gMCkgZGlmZlBhcnRzLnB1c2goYHVuZXhwZWN0ZWQgJHt1bmV4cGVjdGVkSXRlbXMuam9pbihcIiwgXCIpfWApXG5cbiAgICAgICAgICAgIGNvbnN0IGRpZmZNZXNzYWdlID0gZGlmZlBhcnRzLmxlbmd0aCA+IDAgPyBgIChkaWZmOiAke2RpZmZQYXJ0cy5qb2luKFwiOyBcIil9KWAgOiBcIlwiXG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3RQcmludH0gd2Fzbid0IGVxdWFsIHRvICR7cmVzdWx0UHJpbnR9JHtkaWZmTWVzc2FnZX1gKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3RQcmludH0gd2Fzbid0IGVxdWFsIHRvICR7cmVzdWx0UHJpbnR9YClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuX29iamVjdCAhPSByZXN1bHQpIHtcbiAgICAgICAgICBjb25zdCBvYmplY3RQcmludCA9IGZvcm1hdFZhbHVlKHRoaXMuX29iamVjdClcbiAgICAgICAgICBjb25zdCByZXN1bHRQcmludCA9IGZvcm1hdFZhbHVlKHJlc3VsdClcblxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3RQcmludH0gd2Fzbid0IGVxdWFsIHRvICR7cmVzdWx0UHJpbnR9YClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRvIG1hdGNoLlxuICAgKiBAcGFyYW0ge1JlZ0V4cH0gcmVnZXggLSBSZWdleC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgdG9NYXRjaChyZWdleCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fb2JqZWN0ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHN0cmluZyBidXQgZ290ICR7dHlwZW9mIHRoaXMuX29iamVjdH1gKVxuICAgIH1cblxuICAgIGNvbnN0IG1hdGNoID0gdGhpcy5fb2JqZWN0Lm1hdGNoKHJlZ2V4KVxuICAgIGNvbnN0IG9iamVjdFByaW50ID0gbWluaWZpZWRTdHJpbmdpZnkodGhpcy5fb2JqZWN0KVxuXG4gICAgaWYgKHRoaXMuX25vdCkge1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3RQcmludH0gc2hvdWxkbid0IG1hdGNoICR7cmVnZXh9YClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IGRpZG4ndCBtYXRjaCAke3JlZ2V4fWApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdG8gbWF0Y2ggb2JqZWN0LlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+IHwgQXJyYXk8Pz59IGV4cGVjdGVkIC0gRXhwZWN0ZWQgcGFydGlhbCBvYmplY3QuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHRvTWF0Y2hPYmplY3QoZXhwZWN0ZWQpIHtcbiAgICBpZiAoZXhwZWN0ZWQgPT09IG51bGwgfHwgdHlwZW9mIGV4cGVjdGVkICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG9iamVjdCBidXQgZ290ICR7dHlwZW9mIGV4cGVjdGVkfWApXG4gICAgfVxuXG4gICAgY29uc3Qge21hdGNoZXMsIGRpZmZlcmVuY2VzfSA9IG1hdGNoT2JqZWN0KHRoaXMuX29iamVjdCwgZXhwZWN0ZWQpXG4gICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBmb3JtYXRWYWx1ZSh0aGlzLl9vYmplY3QpXG4gICAgY29uc3QgZXhwZWN0ZWRQcmludCA9IGZvcm1hdFZhbHVlKGV4cGVjdGVkKVxuXG4gICAgaWYgKHRoaXMuX25vdCkge1xuICAgICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke29iamVjdFByaW50fSBub3QgdG8gbWF0Y2ggJHtleHBlY3RlZFByaW50fWApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghbWF0Y2hlcykge1xuICAgICAgY29uc3QgZGlmZlByaW50ID0gT2JqZWN0LmtleXMoZGlmZmVyZW5jZXMpLmxlbmd0aCA+IDAgPyBgIChkaWZmOiAke21pbmlmaWVkU3RyaW5naWZ5KGRpZmZlcmVuY2VzKX0pYCA6IFwiXCJcblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke29iamVjdFByaW50fSB0byBtYXRjaCAke2V4cGVjdGVkUHJpbnR9JHtkaWZmUHJpbnR9YClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyB0byB0aHJvdyBlcnJvci5cbiAgICogQHRlbXBsYXRlIFQgZXh0ZW5kcyBFcnJvclxuICAgKiBAcGFyYW0ge3N0cmluZ3xUfSBleHBlY3RlZEVycm9yIC0gRXhwZWN0ZWQgZXJyb3IuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyB0b1Rocm93RXJyb3IoZXhwZWN0ZWRFcnJvcikge1xuICAgIGlmICh0aGlzLl9ub3QpIHRocm93IG5ldyBFcnJvcihcIm5vdCBzdHViXCIpXG5cbiAgICBsZXQgZmFpbGVkRXJyb3JcblxuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuX29iamVjdCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZnVuY3Rpb24gYnV0IGdvdCAke3R5cGVvZiB0aGlzLl9vYmplY3R9YClcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5fb2JqZWN0KClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZmFpbGVkRXJyb3IgPSBlcnJvclxuICAgIH1cblxuICAgIGlmICghZmFpbGVkRXJyb3IpIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIHRvIGZhaWwgYnV0IGRpZG4ndFwiKVxuXG4gICAgbGV0IGV4cGVjdGVkRXJyb3JNZXNzYWdlLCBmYWlsZWRFcnJvck1lc3NhZ2VcblxuICAgIGlmICh0eXBlb2YgZmFpbGVkRXJyb3IgPT0gXCJzdHJpbmdcIikge1xuICAgICAgZmFpbGVkRXJyb3JNZXNzYWdlID0gZmFpbGVkRXJyb3JcbiAgICB9IGVsc2UgaWYgKGZhaWxlZEVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGZhaWxlZEVycm9yTWVzc2FnZSA9IGZhaWxlZEVycm9yLm1lc3NhZ2VcbiAgICB9IGVsc2Uge1xuICAgICAgZmFpbGVkRXJyb3JNZXNzYWdlID0gU3RyaW5nKGZhaWxlZEVycm9yKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZXhwZWN0ZWRFcnJvciA9PSBcInN0cmluZ1wiKSB7XG4gICAgICBleHBlY3RlZEVycm9yTWVzc2FnZSA9IGV4cGVjdGVkRXJyb3JcbiAgICB9IGVsc2UgaWYgKGV4cGVjdGVkRXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgZXhwZWN0ZWRFcnJvck1lc3NhZ2UgPSBleHBlY3RlZEVycm9yLm1lc3NhZ2VcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwZWN0ZWRFcnJvck1lc3NhZ2UgPSBTdHJpbmcoZXhwZWN0ZWRFcnJvcilcbiAgICB9XG5cbiAgICBpZiAoZmFpbGVkRXJyb3JNZXNzYWdlICE9IGV4cGVjdGVkRXJyb3JNZXNzYWdlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHRvIGZhaWwgd2l0aCAnJHtleHBlY3RlZEVycm9yTWVzc2FnZX0nIGJ1dCBmYWlsZWQgd2l0aCAnJHtmYWlsZWRFcnJvck1lc3NhZ2V9J2ApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdG8gdGhyb3cuXG4gICAqIEBwYXJhbSB7c3RyaW5nfFJlZ0V4cHxFcnJvcnwoKG5ldyAoLi4uYXJnczogQXJyYXk8Pz4pID0+IEVycm9yKSl9IFtleHBlY3RlZF0gLSBFeHBlY3RlZCBlcnJvci5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIHRvVGhyb3coZXhwZWN0ZWQpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX29iamVjdCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGZ1bmN0aW9uIGJ1dCBnb3QgJHt0eXBlb2YgdGhpcy5fb2JqZWN0fWApXG4gICAgfVxuXG4gICAgbGV0IGZhaWxlZEVycm9yXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fb2JqZWN0KClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZmFpbGVkRXJyb3IgPSBlcnJvclxuICAgIH1cblxuICAgIGNvbnN0IG9iamVjdFByaW50ID0gZm9ybWF0VmFsdWUodGhpcy5fb2JqZWN0KVxuXG4gICAgaWYgKHRoaXMuX25vdCkge1xuICAgICAgaWYgKGZhaWxlZEVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3RQcmludH0gd2FzIHVuZXhwZWN0ZWQgdG8gdGhyb3dgKVxuICAgICAgfVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIWZhaWxlZEVycm9yKSB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCB0byBmYWlsIGJ1dCBkaWRuJ3RcIilcbiAgICBpZiAoZXhwZWN0ZWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuXG5cbiAgICBjb25zdCBmYWlsZWRFcnJvck1lc3NhZ2UgPSBmYWlsZWRFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZmFpbGVkRXJyb3IubWVzc2FnZSA6IFN0cmluZyhmYWlsZWRFcnJvcilcbiAgICBjb25zdCBmYWlsZWRFcnJvck5hbWUgPSBmYWlsZWRFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZmFpbGVkRXJyb3IubmFtZSA6IHR5cGVvZiBmYWlsZWRFcnJvclxuXG4gICAgaWYgKGV4cGVjdGVkIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICBpZiAoIWV4cGVjdGVkLnRlc3QoZmFpbGVkRXJyb3JNZXNzYWdlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHRvIGZhaWwgd2l0aCBtZXNzYWdlIG1hdGNoaW5nICR7ZXhwZWN0ZWR9IGJ1dCBmYWlsZWQgd2l0aCAnJHtmYWlsZWRFcnJvck1lc3NhZ2V9J2ApXG4gICAgICB9XG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZXhwZWN0ZWQgPT09IFwiZnVuY3Rpb25cIiAmJiAoZXhwZWN0ZWQucHJvdG90eXBlIGluc3RhbmNlb2YgRXJyb3IgfHwgZXhwZWN0ZWQgPT09IEVycm9yKSkge1xuICAgICAgaWYgKCEoZmFpbGVkRXJyb3IgaW5zdGFuY2VvZiBleHBlY3RlZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCB0byB0aHJvdyAke2V4cGVjdGVkLm5hbWV9IGJ1dCB0aHJldyAke2ZhaWxlZEVycm9yTmFtZX1gKVxuICAgICAgfVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBsZXQgZXhwZWN0ZWRNZXNzYWdlXG5cbiAgICBpZiAodHlwZW9mIGV4cGVjdGVkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBleHBlY3RlZE1lc3NhZ2UgPSBleHBlY3RlZFxuICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgZXhwZWN0ZWRNZXNzYWdlID0gZXhwZWN0ZWQubWVzc2FnZVxuICAgIH0gZWxzZSB7XG4gICAgICBleHBlY3RlZE1lc3NhZ2UgPSBTdHJpbmcoZXhwZWN0ZWQpXG4gICAgfVxuXG4gICAgaWYgKGZhaWxlZEVycm9yTWVzc2FnZSAhPSBleHBlY3RlZE1lc3NhZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgdG8gZmFpbCB3aXRoICcke2V4cGVjdGVkTWVzc2FnZX0nIGJ1dCBmYWlsZWQgd2l0aCAnJHtmYWlsZWRFcnJvck1lc3NhZ2V9J2ApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZXhlY3V0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Pz59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgZXhlY3V0ZS5cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgZm9yIChjb25zdCBleHBlY3RhdGlvbiBvZiB0aGlzLmV4cGVjdGF0aW9ucykge1xuICAgICAgYXdhaXQgZXhwZWN0YXRpb24ucnVuQmVmb3JlKClcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRoaXMuX29iamVjdCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGZ1bmN0aW9uIGJ1dCBnb3QgJHt0eXBlb2YgdGhpcy5fb2JqZWN0fWApXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5fb2JqZWN0KClcblxuICAgIGZvciAoY29uc3QgZXhwZWN0YXRpb24gb2YgdGhpcy5leHBlY3RhdGlvbnMpIHtcbiAgICAgIGF3YWl0IGV4cGVjdGF0aW9uLnJ1bkFmdGVyKClcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGV4cGVjdGF0aW9uIG9mIHRoaXMuZXhwZWN0YXRpb25zKSB7XG4gICAgICBhd2FpdCBleHBlY3RhdGlvbi5leGVjdXRlKClcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogUnVucyB0byBoYXZlIGF0dHJpYnV0ZXMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IHJlc3VsdCAtIFJlc3VsdC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgdG9IYXZlQXR0cmlidXRlcyhyZXN1bHQpIHtcbiAgICBpZiAodGhpcy5fbm90KSB0aHJvdyBuZXcgRXJyb3IoXCJub3Qgc3R1YlwiKVxuXG4gICAgLyoqXG4gICAgICogRGlmZmVyZW5jZXMuXG4gICAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgQXJyYXk8Pz4+fSAqL1xuICAgIGNvbnN0IGRpZmZlcmVuY2VzID0ge31cbiAgICBjb25zdCBvYmplY3RBc1JlY29yZCA9IC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovICh0aGlzLl9vYmplY3QpXG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiByZXN1bHQpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gcmVzdWx0W2tleV1cblxuICAgICAgaWYgKCEoa2V5IGluIG9iamVjdEFzUmVjb3JkKSkgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuX29iamVjdC5jb25zdHJ1Y3Rvci5uYW1lfSBkb2Vzbid0IHJlc3BvbmQgdG8gJHtrZXl9YClcblxuICAgICAgY29uc3Qgb2JqZWN0VmFsdWUgPSAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHsoKSA9PiA/fSAqLyAob2JqZWN0QXNSZWNvcmRba2V5XSkoKVxuXG4gICAgICBpZiAodmFsdWUgIT0gb2JqZWN0VmFsdWUpIHtcbiAgICAgICAgZGlmZmVyZW5jZXNba2V5XSA9IFt2YWx1ZSwgb2JqZWN0VmFsdWVdXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKGRpZmZlcmVuY2VzKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE9iamVjdCBoYWQgZGlmZmVyZXQgdmFsdWVzOiAke21pbmlmaWVkU3RyaW5naWZ5KGRpZmZlcmVuY2VzKX1gKVxuICAgIH1cbiAgfVxufVxuIl19
|
|
678
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rlc3RpbmcvZXhwZWN0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsV0FBVyxFQUFFLGlCQUFpQixFQUFDLE1BQU0sMEJBQTBCLENBQUE7QUFDdkUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sdUNBQXVDLENBQUE7QUFDdkUsT0FBTyxVQUFVLE1BQU0sa0JBQWtCLENBQUE7QUFDekMsT0FBTyxjQUFjLE1BQU0sdUJBQXVCLENBQUE7QUFDbEQsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3BCLFdBQVcsRUFDWixNQUFNLG1CQUFtQixDQUFBO0FBRTFCLE1BQU0sQ0FBQyxPQUFPLE9BQU8sTUFBTyxTQUFRLFVBQVU7SUFDNUM7OztPQUdHO0lBQ0gsWUFBWSxNQUFNO1FBQ2hCLEtBQUssRUFBRSxDQUFBO1FBQ1AsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUE7UUFFckI7O29EQUU0QztRQUM1QyxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQTtJQUN4QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFNBQVMsQ0FBQyxjQUFjO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQTtJQUN0QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSxHQUFHO1FBQ0wsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7UUFFaEIsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksQ0FBQyxNQUFNO1FBQ1QsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZCxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FB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LENBQUE7UUFFckUsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUN6QixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7WUFFekIsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLGNBQWMsQ0FBQztnQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSx1QkFBdUIsR0FBRyxFQUFFLENBQUMsQ0FBQTtZQUUzRyxNQUFNLFdBQVcsR0FBRzs7cURBRXFCLENBQUMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFBO1lBRWpFLElBQUksS0FBSyxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUN6QixXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUE7WUFDekMsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUNsRixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7Zm9ybWF0VmFsdWUsIG1pbmlmaWVkU3RyaW5naWZ5fSBmcm9tIFwiLi4vdXRpbHMvZm9ybWF0LXZhbHVlLmpzXCJcbmltcG9ydCB7YW55dGhpbmdEaWZmZXJlbnR9IGZyb20gXCJzZXQtc3RhdGUtY29tcGFyZS9idWlsZC9kaWZmLXV0aWxzLmpzXCJcbmltcG9ydCBCYXNlRXhwZWN0IGZyb20gXCIuL2Jhc2UtZXhwZWN0LmpzXCJcbmltcG9ydCBFeHBlY3RUb0NoYW5nZSBmcm9tIFwiLi9leHBlY3QtdG8tY2hhbmdlLmpzXCJcbmltcG9ydCB7XG4gIGlzQXJyYXlDb250YWluaW5nLFxuICBpc09iamVjdENvbnRhaW5pbmcsXG4gIG1hdGNoQXJyYXlDb250YWluaW5nLFxuICBtYXRjaE9iamVjdFxufSBmcm9tIFwiLi9leHBlY3QtdXRpbHMuanNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFeHBlY3QgZXh0ZW5kcyBCYXNlRXhwZWN0IHtcbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7P30gb2JqZWN0IC0gT2JqZWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3Iob2JqZWN0KSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuX29iamVjdCA9IG9iamVjdFxuXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAqIEB0eXBlIHtBcnJheTxFeHBlY3QgfCBFeHBlY3RUb0NoYW5nZT59ICovXG4gICAgdGhpcy5leHBlY3RhdGlvbnMgPSBbXVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYW5kIGNoYW5nZS5cbiAgICogQHBhcmFtIHtmdW5jdGlvbigpOiBQcm9taXNlPG51bWJlcj59IGNoYW5nZUNhbGxiYWNrIC0gQ2hhbmdlIGNhbGxiYWNrLlxuICAgKiBAcmV0dXJucyB7RXhwZWN0VG9DaGFuZ2V9IC0gVGhlIGFuZCBjaGFuZ2UuXG4gICAqL1xuICBhbmRDaGFuZ2UoY2hhbmdlQ2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGhpcy50b0NoYW5nZShjaGFuZ2VDYWxsYmFjaylcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG5vdC5cbiAgICogQHJldHVybnMge3RoaXN9IC0gQSB2YWx1ZS5cbiAgICovXG4gIGdldCBub3QoKSB7XG4gICAgdGhpcy5fbm90ID0gdHJ1ZVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRvIGJlLlxuICAgKiBAcGFyYW0gez99IHJlc3VsdCAtIFJlc3VsdC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgdG9CZShyZXN1bHQpIHtcbiAgICBpZiAodGhpcy5fbm90KSB7XG4gICAgICBpZiAodGhpcy5fb2JqZWN0ID09PSByZXN1bHQpIHtcbiAgICAgICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBmb3JtYXRWYWx1ZSh0aGlzLl9vYmplY3QpXG4gICAgICAgIGNvbnN0IHJlc3VsdFByaW50ID0gZm9ybWF0VmFsdWUocmVzdWx0KVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3RQcmludH0gd2FzIHVuZXhwZWN0ZWQgbm90IHRvIGJlICR7cmVzdWx0UHJpbnR9YClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuX29iamVjdCAhPT0gcmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IG9iamVjdFByaW50ID0gZm9ybWF0VmFsdWUodGhpcy5fb2JqZWN0KVxuICAgICAgICBjb25zdCByZXN1bHRQcmludCA9IGZvcm1hdFZhbHVlKHJlc3VsdClcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhc24ndCBleHBlY3RlZCBiZSAke3Jlc3VsdFByaW50fWApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdG8gYmUgbGVzcyB0aGFuLlxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVzdWx0IC0gUmVzdWx0LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICB0b0JlTGVzc1RoYW4ocmVzdWx0KSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9vYmplY3QgIT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJudW1iZXJcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBudW1iZXJzIGJ1dCBnb3QgJHt0eXBlb2YgdGhpcy5fb2JqZWN0fSBhbmQgJHt0eXBlb2YgcmVzdWx0fWApXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX25vdCkge1xuICAgICAgaWYgKHRoaXMuX29iamVjdCA8IHJlc3VsdCkge1xuICAgICAgICBjb25zdCBvYmplY3RQcmludCA9IGZvcm1hdFZhbHVlKHRoaXMuX29iamVjdClcbiAgICAgICAgY29uc3QgcmVzdWx0UHJpbnQgPSBmb3JtYXRWYWx1ZShyZXN1bHQpXG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSB3YXMgdW5leHBlY3RlZCB0byBiZSBsZXNzIHRoYW4gJHtyZXN1bHRQcmludH1gKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5fb2JqZWN0ID49IHJlc3VsdCkge1xuICAgICAgICBjb25zdCBvYmplY3RQcmludCA9IGZvcm1hdFZhbHVlKHRoaXMuX29iamVjdClcbiAgICAgICAgY29uc3QgcmVzdWx0UHJpbnQgPSBmb3JtYXRWYWx1ZShyZXN1bHQpXG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSB3YXNuJ3QgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICR7cmVzdWx0UHJpbnR9YClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyB0byBiZSBsZXNzIHRoYW4gb3IgZXF1YWwuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZXN1bHQgLSBSZXN1bHQuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHRvQmVMZXNzVGhhbk9yRXF1YWwocmVzdWx0KSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9vYmplY3QgIT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJudW1iZXJcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBudW1iZXJzIGJ1dCBnb3QgJHt0eXBlb2YgdGhpcy5fb2JqZWN0fSBhbmQgJHt0eXBlb2YgcmVzdWx0fWApXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX25vdCkge1xuICAgICAgaWYgKHRoaXMuX29iamVjdCA8PSByZXN1bHQpIHtcbiAgICAgICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBmb3JtYXRWYWx1ZSh0aGlzLl9vYmplY3QpXG4gICAgICAgIGNvbnN0IHJlc3VsdFByaW50ID0gZm9ybWF0VmFsdWUocmVzdWx0KVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3RQcmludH0gd2FzIHVuZXhwZWN0ZWQgdG8gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICR7cmVzdWx0UHJpbnR9YClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuX29iamVjdCA+IHJlc3VsdCkge1xuICAgICAgICBjb25zdCBvYmplY3RQcmludCA9IGZvcm1hdFZhbHVlKHRoaXMuX29iamVjdClcbiAgICAgICAgY29uc3QgcmVzdWx0UHJpbnQgPSBmb3JtYXRWYWx1ZShyZXN1bHQpXG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSB3YXNuJ3QgZXhwZWN0ZWQgdG8gYmUgZ3JlYXRlciB0aGFuICR7cmVzdWx0UHJpbnR9YClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyB0byBiZSBncmVhdGVyIHRoYW4uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZXN1bHQgLSBSZXN1bHQuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHRvQmVHcmVhdGVyVGhhbihyZXN1bHQpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX29iamVjdCAhPT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm51bWJlclwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG51bWJlcnMgYnV0IGdvdCAke3R5cGVvZiB0aGlzLl9vYmplY3R9IGFuZCAke3R5cGVvZiByZXN1bHR9YClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbm90KSB7XG4gICAgICBpZiAodGhpcy5fb2JqZWN0ID4gcmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IG9iamVjdFByaW50ID0gZm9ybWF0VmFsdWUodGhpcy5fb2JqZWN0KVxuICAgICAgICBjb25zdCByZXN1bHRQcmludCA9IGZvcm1hdFZhbHVlKHJlc3VsdClcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhcyB1bmV4cGVjdGVkIHRvIGJlIGdyZWF0ZXIgdGhhbiAke3Jlc3VsdFByaW50fWApXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLl9vYmplY3QgPD0gcmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IG9iamVjdFByaW50ID0gZm9ybWF0VmFsdWUodGhpcy5fb2JqZWN0KVxuICAgICAgICBjb25zdCByZXN1bHRQcmludCA9IGZvcm1hdFZhbHVlKHJlc3VsdClcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhc24ndCBleHBlY3RlZCB0byBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJHtyZXN1bHRQcmludH1gKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRvIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlc3VsdCAtIFJlc3VsdC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgdG9CZUdyZWF0ZXJUaGFuT3JFcXVhbChyZXN1bHQpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX29iamVjdCAhPT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm51bWJlclwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG51bWJlcnMgYnV0IGdvdCAke3R5cGVvZiB0aGlzLl9vYmplY3R9IGFuZCAke3R5cGVvZiByZXN1bHR9YClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbm90KSB7XG4gICAgICBpZiAodGhpcy5fb2JqZWN0ID49IHJlc3VsdCkge1xuICAgICAgICBjb25zdCBvYmplY3RQcmludCA9IGZvcm1hdFZhbHVlKHRoaXMuX29iamVjdClcbiAgICAgICAgY29uc3QgcmVzdWx0UHJpbnQgPSBmb3JtYXRWYWx1ZShyZXN1bHQpXG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSB3YXMgdW5leHBlY3RlZCB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHtyZXN1bHRQcmludH1gKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5fb2JqZWN0IDwgcmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IG9iamVjdFByaW50ID0gZm9ybWF0VmFsdWUodGhpcy5fb2JqZWN0KVxuICAgICAgICBjb25zdCByZXN1bHRQcmludCA9IGZvcm1hdFZhbHVlKHJlc3VsdClcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhc24ndCBleHBlY3RlZCB0byBiZSBsZXNzIHRoYW4gJHtyZXN1bHRQcmludH1gKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRvIGJlIGNsb3NlIHRvLlxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVzdWx0IC0gUmVzdWx0LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbl0gLSBEZWNpbWFsIHByZWNpc2lvbi5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgdG9CZUNsb3NlVG8ocmVzdWx0LCBwcmVjaXNpb24gPSAyKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9vYmplY3QgIT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJudW1iZXJcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBudW1iZXJzIGJ1dCBnb3QgJHt0eXBlb2YgdGhpcy5fb2JqZWN0fSBhbmQgJHt0eXBlb2YgcmVzdWx0fWApXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwcmVjaXNpb24gIT09IFwibnVtYmVyXCIgfHwgIU51bWJlci5pc0Zpbml0ZShwcmVjaXNpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHByZWNpc2lvbiB0byBiZSBhIG51bWJlciBidXQgZ290ICR7dHlwZW9mIHByZWNpc2lvbn1gKVxuICAgIH1cblxuICAgIGNvbnN0IHRvbGVyYW5jZSA9IDAuNSAqIE1hdGgucG93KDEwLCAtcHJlY2lzaW9uKVxuICAgIGNvbnN0IGRpZmYgPSBNYXRoLmFicyh0aGlzLl9vYmplY3QgLSByZXN1bHQpXG4gICAgY29uc3QgaXNDbG9zZSA9IGRpZmYgPD0gdG9sZXJhbmNlXG5cbiAgICBpZiAodGhpcy5fbm90KSB7XG4gICAgICBpZiAoaXNDbG9zZSkge1xuICAgICAgICBjb25zdCBvYmplY3RQcmludCA9IGZvcm1hdFZhbHVlKHRoaXMuX29iamVjdClcbiAgICAgICAgY29uc3QgcmVzdWx0UHJpbnQgPSBmb3JtYXRWYWx1ZShyZXN1bHQpXG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSB3YXMgdW5leHBlY3RlZCB0byBiZSBjbG9zZSB0byAke3Jlc3VsdFByaW50fWApXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghaXNDbG9zZSkge1xuICAgICAgICBjb25zdCBvYmplY3RQcmludCA9IGZvcm1hdFZhbHVlKHRoaXMuX29iamVjdClcbiAgICAgICAgY29uc3QgcmVzdWx0UHJpbnQgPSBmb3JtYXRWYWx1ZShyZXN1bHQpXG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSB3YXNuJ3QgZXhwZWN0ZWQgdG8gYmUgY2xvc2UgdG8gJHtyZXN1bHRQcmludH1gKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRvIGhhdmUgbGVuZ3RoLlxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVzdWx0IC0gRXhwZWN0ZWQgbGVuZ3RoLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICB0b0hhdmVMZW5ndGgocmVzdWx0KSB7XG4gICAgaWYgKHR5cGVvZiByZXN1bHQgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgbGVuZ3RoIG51bWJlciBidXQgZ290ICR7dHlwZW9mIHJlc3VsdH1gKVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9vYmplY3QgPT09IG51bGwgfHwgdGhpcy5fb2JqZWN0ID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHRoaXMuX29iamVjdC5sZW5ndGggIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgdmFsdWUgd2l0aCBsZW5ndGggYnV0IGdvdCAke3R5cGVvZiB0aGlzLl9vYmplY3R9YClcbiAgICB9XG5cbiAgICBjb25zdCBvYmplY3RQcmludCA9IGZvcm1hdFZhbHVlKHRoaXMuX29iamVjdClcbiAgICBjb25zdCByZXN1bHRQcmludCA9IGZvcm1hdFZhbHVlKHJlc3VsdClcbiAgICBjb25zdCBsZW5ndGhWYWx1ZSA9IHRoaXMuX29iamVjdC5sZW5ndGhcblxuICAgIGlmICh0aGlzLl9ub3QpIHtcbiAgICAgIGlmIChsZW5ndGhWYWx1ZSA9PT0gcmVzdWx0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3RQcmludH0gd2FzIHVuZXhwZWN0ZWQgdG8gaGF2ZSBsZW5ndGggJHtyZXN1bHRQcmludH1gKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobGVuZ3RoVmFsdWUgIT09IHJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSB3YXNuJ3QgZXhwZWN0ZWQgdG8gaGF2ZSBsZW5ndGggJHtyZXN1bHRQcmludH1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRvIGJlIGRlZmluZWQuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHRvQmVEZWZpbmVkKCkge1xuICAgIGlmICh0aGlzLl9ub3QpIHtcbiAgICAgIGlmICh0aGlzLl9vYmplY3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBvYmplY3RQcmludCA9IGZvcm1hdFZhbHVlKHRoaXMuX29iamVjdClcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhc27CtHQgZXhwZWN0ZWQgdG8gYmUgZGVmaW5lZGApXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLl9vYmplY3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBvYmplY3RQcmludCA9IGZvcm1hdFZhbHVlKHRoaXMuX29iamVjdClcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhc24ndCBleHBlY3RlZCBiZSB1bmRlZmluZWRgKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRvIGJlIGluc3RhbmNlIG9mLlxuICAgKiBAcGFyYW0ge25ldyAoLi4uYXJnczogQXJyYXk8Pz4pID0+ID99IGtsYXNzIC0gQ2xhc3MgY29uc3RydWN0b3IgdG8gY2hlY2sgYWdhaW5zdCAoZS5nLiBhIGJ1aWx0LWluIGxpa2UgRXJyb3IpLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICB0b0JlSW5zdGFuY2VPZihrbGFzcykge1xuICAgIGlmICghKHRoaXMuX29iamVjdCBpbnN0YW5jZW9mIGtsYXNzKSkge1xuICAgICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBmb3JtYXRWYWx1ZSh0aGlzLl9vYmplY3QpXG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJHtvYmplY3RQcmludH0gdG8gYmUgYSAke2tsYXNzLm5hbWV9IGJ1dCBpdCB3YXNuJ3RgKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRvIGJlIGZhbHNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICB0b0JlRmFsc2UoKSB7XG4gICAgdGhpcy50b0JlKGZhbHNlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdG8gYmUgbnVsbC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgdG9CZU51bGwoKSB7XG4gICAgdGhpcy50b0JlKG51bGwpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB0byBiZSB1bmRlZmluZWQuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHRvQmVVbmRlZmluZWQoKSB7XG4gICAgdGhpcy50b0JlKHVuZGVmaW5lZClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRvIGJlIHRydWUuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHRvQmVUcnVlKCkge1xuICAgIHRoaXMudG9CZSh0cnVlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdG8gYmUgdHJ1dGh5LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICB0b0JlVHJ1dGh5KCkge1xuICAgIGNvbnN0IG9iamVjdFByaW50ID0gZm9ybWF0VmFsdWUodGhpcy5fb2JqZWN0KVxuXG4gICAgaWYgKHRoaXMuX25vdCkge1xuICAgICAgaWYgKHRoaXMuX29iamVjdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhcyB1bmV4cGVjdGVkIHRvIGJlIHRydXRoeWApXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghdGhpcy5fb2JqZWN0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3RQcmludH0gd2Fzbid0IGV4cGVjdGVkIHRvIGJlIHRydXRoeWApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdG8gY2hhbmdlLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCk6IFByb21pc2U8bnVtYmVyPn0gY2hhbmdlQ2FsbGJhY2sgLSBDaGFuZ2UgY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtFeHBlY3RUb0NoYW5nZX0gLSBUaGUgY2hhbmdlLlxuICAgKi9cbiAgdG9DaGFuZ2UoY2hhbmdlQ2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy5fbm90KSB0aHJvdyBuZXcgRXJyb3IoXCJub3Qgc3R1YlwiKVxuXG4gICAgY29uc3QgZXhwZWN0VG9DaGFuZ2UgPSBuZXcgRXhwZWN0VG9DaGFuZ2Uoe2NoYW5nZUNhbGxiYWNrLCBleHBlY3Q6IHRoaXN9KVxuXG4gICAgdGhpcy5leHBlY3RhdGlvbnMucHVzaChleHBlY3RUb0NoYW5nZSlcblxuICAgIHJldHVybiBleHBlY3RUb0NoYW5nZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdG8gY29udGFpbi5cbiAgICogQHBhcmFtIHs/fSB2YWx1ZVRvQ29udGFpbiAtIFZhbHVlIHRvIGNvbnRhaW4uXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHRvQ29udGFpbih2YWx1ZVRvQ29udGFpbikge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fb2JqZWN0ID09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSB0aGlzLl9vYmplY3QuaW5jbHVkZXMoU3RyaW5nKHZhbHVlVG9Db250YWluKSlcbiAgICAgIGNvbnN0IG9iamVjdFByaW50ID0gbWluaWZpZWRTdHJpbmdpZnkodGhpcy5fb2JqZWN0KVxuICAgICAgY29uc3QgdmFsdWVQcmludCA9IHR5cGVvZiB2YWx1ZVRvQ29udGFpbiA9PSBcInN0cmluZ1wiXG4gICAgICAgID8gbWluaWZpZWRTdHJpbmdpZnkodmFsdWVUb0NvbnRhaW4pXG4gICAgICAgIDogZm9ybWF0VmFsdWUodmFsdWVUb0NvbnRhaW4pXG5cbiAgICAgIGlmICh0aGlzLl9ub3QpIHtcbiAgICAgICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhcyB1bmV4cGVjdGVkIHRvIGNvbnRhaW4gJHt2YWx1ZVByaW50fWApXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIW1hdGNoZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSBkb2Vzbid0IGNvbnRhaW4gJHt2YWx1ZVByaW50fWApXG4gICAgICB9XG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLl9vYmplY3QpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGFycmF5IG9yIHN0cmluZyBidXQgZ290ICR7dHlwZW9mIHRoaXMuX29iamVjdH1gKVxuICAgIH1cblxuICAgIGNvbnN0IG1hdGNoZXMgPSB0aGlzLl9vYmplY3QuaW5jbHVkZXModmFsdWVUb0NvbnRhaW4pXG4gICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBmb3JtYXRWYWx1ZSh0aGlzLl9vYmplY3QpXG4gICAgY29uc3QgdmFsdWVQcmludCA9IHR5cGVvZiB2YWx1ZVRvQ29udGFpbiA9PSBcInN0cmluZ1wiXG4gICAgICA/IG1pbmlmaWVkU3RyaW5naWZ5KHZhbHVlVG9Db250YWluKVxuICAgICAgOiBmb3JtYXRWYWx1ZSh2YWx1ZVRvQ29udGFpbilcblxuICAgIGlmICh0aGlzLl9ub3QpIHtcbiAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3RQcmludH0gd2FzIHVuZXhwZWN0ZWQgdG8gY29udGFpbiAke3ZhbHVlUHJpbnR9YClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFtYXRjaGVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IGRvZXNuJ3QgY29udGFpbiAke3ZhbHVlUHJpbnR9YClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyB0byBjb250YWluIGVxdWFsLlxuICAgKiBAcGFyYW0gez99IHZhbHVlVG9Db250YWluIC0gVmFsdWUgdG8gY29udGFpbi5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgdG9Db250YWluRXF1YWwodmFsdWVUb0NvbnRhaW4pIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy5fb2JqZWN0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhcnJheSBidXQgZ290ICR7dHlwZW9mIHRoaXMuX29iamVjdH1gKVxuICAgIH1cblxuICAgIGNvbnN0IG1hdGNoZXMgPSB0aGlzLl9vYmplY3Quc29tZSgoaXRlbSkgPT4gIWFueXRoaW5nRGlmZmVyZW50KGl0ZW0sIHZhbHVlVG9Db250YWluKSlcbiAgICBjb25zdCBvYmplY3RQcmludCA9IGZvcm1hdFZhbHVlKHRoaXMuX29iamVjdClcbiAgICBjb25zdCB2YWx1ZVByaW50ID0gdHlwZW9mIHZhbHVlVG9Db250YWluID09IFwic3RyaW5nXCJcbiAgICAgID8gbWluaWZpZWRTdHJpbmdpZnkodmFsdWVUb0NvbnRhaW4pXG4gICAgICA6IGZvcm1hdFZhbHVlKHZhbHVlVG9Db250YWluKVxuXG4gICAgaWYgKHRoaXMuX25vdCkge1xuICAgICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSB3YXMgdW5leHBlY3RlZCB0byBjb250YWluICR7dmFsdWVQcmludH1gKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIW1hdGNoZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3RQcmludH0gZG9lc24ndCBjb250YWluICR7dmFsdWVQcmludH1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRvIGluY2x1ZGUuXG4gICAqIEBwYXJhbSB7P30gdmFsdWVUb0luY2x1ZGUgLSBWYWx1ZSB0byBpbmNsdWRlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICB0b0luY2x1ZGUodmFsdWVUb0luY2x1ZGUpIHtcbiAgICB0aGlzLnRvQ29udGFpbih2YWx1ZVRvSW5jbHVkZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRvIGVxdWFsLlxuICAgKiBAcGFyYW0gez99IHJlc3VsdCAtIFJlc3VsdC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgdG9FcXVhbChyZXN1bHQpIHtcbiAgICBpZiAodGhpcy5fb2JqZWN0IGluc3RhbmNlb2YgU2V0ICYmIHJlc3VsdCBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBmb3JtYXRWYWx1ZSh0aGlzLl9vYmplY3QpXG4gICAgICBjb25zdCByZXN1bHRQcmludCA9IGZvcm1hdFZhbHVlKHJlc3VsdClcbiAgICAgIGNvbnN0IGFjdHVhbEl0ZW1zID0gQXJyYXkuZnJvbSh0aGlzLl9vYmplY3QpXG4gICAgICBjb25zdCBleHBlY3RlZEl0ZW1zID0gQXJyYXkuZnJvbShyZXN1bHQpXG4gICAgICBjb25zdCBtaXNzaW5nSXRlbXMgPSBleHBlY3RlZEl0ZW1zLmZpbHRlcigoZXhwZWN0ZWRJdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiAhYWN0dWFsSXRlbXMuc29tZSgoYWN0dWFsSXRlbSkgPT4gIWFueXRoaW5nRGlmZmVyZW50KGFjdHVhbEl0ZW0sIGV4cGVjdGVkSXRlbSkpXG4gICAgICB9KVxuICAgICAgY29uc3QgdW5leHBlY3RlZEl0ZW1zID0gYWN0dWFsSXRlbXMuZmlsdGVyKChhY3R1YWxJdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiAhZXhwZWN0ZWRJdGVtcy5zb21lKChleHBlY3RlZEl0ZW0pID0+ICFhbnl0aGluZ0RpZmZlcmVudChhY3R1YWxJdGVtLCBleHBlY3RlZEl0ZW0pKVxuICAgICAgfSlcbiAgICAgIGNvbnN0IGlzRXF1YWwgPSBtaXNzaW5nSXRlbXMubGVuZ3RoID09PSAwICYmIHVuZXhwZWN0ZWRJdGVtcy5sZW5ndGggPT09IDBcblxuICAgICAgaWYgKHRoaXMuX25vdCkge1xuICAgICAgICBpZiAoaXNFcXVhbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3RQcmludH0gd2FzIHVuZXhwZWN0ZWQgZXF1YWwgdG8gJHtyZXN1bHRQcmludH1gKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFpc0VxdWFsKSB7XG4gICAgICAgIGNvbnN0IG1pc3NpbmdTdHJpbmdzID0gbWlzc2luZ0l0ZW1zLm1hcCgoaXRlbSkgPT4gbWluaWZpZWRTdHJpbmdpZnkoaXRlbSkpXG4gICAgICAgIGNvbnN0IHVuZXhwZWN0ZWRTdHJpbmdzID0gdW5leHBlY3RlZEl0ZW1zLm1hcCgoaXRlbSkgPT4gbWluaWZpZWRTdHJpbmdpZnkoaXRlbSkpXG4gICAgICAgIGNvbnN0IGRpZmZQYXJ0cyA9IFtdXG5cbiAgICAgICAgaWYgKG1pc3NpbmdTdHJpbmdzLmxlbmd0aCA+IDApIGRpZmZQYXJ0cy5wdXNoKGBtaXNzaW5nICR7bWlzc2luZ1N0cmluZ3Muam9pbihcIiwgXCIpfWApXG4gICAgICAgIGlmICh1bmV4cGVjdGVkU3RyaW5ncy5sZW5ndGggPiAwKSBkaWZmUGFydHMucHVzaChgdW5leHBlY3RlZCAke3VuZXhwZWN0ZWRTdHJpbmdzLmpvaW4oXCIsIFwiKX1gKVxuXG4gICAgICAgIGNvbnN0IGRpZmZNZXNzYWdlID0gZGlmZlBhcnRzLmxlbmd0aCA+IDAgPyBgIChkaWZmOiAke2RpZmZQYXJ0cy5qb2luKFwiOyBcIil9KWAgOiBcIlwiXG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSB3YXNuJ3QgZXF1YWwgdG8gJHtyZXN1bHRQcmludH0ke2RpZmZNZXNzYWdlfWApXG4gICAgICB9XG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChpc09iamVjdENvbnRhaW5pbmcocmVzdWx0KSkge1xuICAgICAgY29uc3QgZXhwZWN0ZWRWYWx1ZSA9IC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAdHlwZSB7P30gKi8gKHJlc3VsdCkudmFsdWVcbiAgICAgIGNvbnN0IHttYXRjaGVzLCBkaWZmZXJlbmNlc30gPSBtYXRjaE9iamVjdCh0aGlzLl9vYmplY3QsIGV4cGVjdGVkVmFsdWUpXG4gICAgICBjb25zdCBvYmplY3RQcmludCA9IGZvcm1hdFZhbHVlKHRoaXMuX29iamVjdClcbiAgICAgIGNvbnN0IGV4cGVjdGVkUHJpbnQgPSBmb3JtYXRWYWx1ZShleHBlY3RlZFZhbHVlKVxuXG4gICAgICBpZiAodGhpcy5fbm90KSB7XG4gICAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke29iamVjdFByaW50fSBub3QgdG8gbWF0Y2ggJHtleHBlY3RlZFByaW50fWApXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIW1hdGNoZXMpIHtcbiAgICAgICAgY29uc3QgZGlmZlByaW50ID0gT2JqZWN0LmtleXMoZGlmZmVyZW5jZXMpLmxlbmd0aCA+IDAgPyBgIChkaWZmOiAke21pbmlmaWVkU3RyaW5naWZ5KGRpZmZlcmVuY2VzKX0pYCA6IFwiXCJcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7b2JqZWN0UHJpbnR9IHRvIG1hdGNoICR7ZXhwZWN0ZWRQcmludH0ke2RpZmZQcmludH1gKVxuICAgICAgfVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaXNBcnJheUNvbnRhaW5pbmcocmVzdWx0KSkge1xuICAgICAgY29uc3QgZXhwZWN0ZWRWYWx1ZSA9IC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAdHlwZSB7QXJyYXk8Pz59ICovICgvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEB0eXBlIHs/fSAqLyAocmVzdWx0KS52YWx1ZSlcbiAgICAgIGNvbnN0IHttYXRjaGVzLCBkaWZmZXJlbmNlc30gPSBtYXRjaEFycmF5Q29udGFpbmluZyh0aGlzLl9vYmplY3QsIGV4cGVjdGVkVmFsdWUpXG4gICAgICBjb25zdCBvYmplY3RQcmludCA9IGZvcm1hdFZhbHVlKHRoaXMuX29iamVjdClcbiAgICAgIGNvbnN0IGV4cGVjdGVkUHJpbnQgPSBmb3JtYXRWYWx1ZShleHBlY3RlZFZhbHVlKVxuXG4gICAgICBpZiAodGhpcy5fbm90KSB7XG4gICAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke29iamVjdFByaW50fSBub3QgdG8gbWF0Y2ggJHtleHBlY3RlZFByaW50fWApXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIW1hdGNoZXMpIHtcbiAgICAgICAgY29uc3QgZGlmZlByaW50ID0gT2JqZWN0LmtleXMoZGlmZmVyZW5jZXMpLmxlbmd0aCA+IDAgPyBgIChkaWZmOiAke21pbmlmaWVkU3RyaW5naWZ5KGRpZmZlcmVuY2VzKX0pYCA6IFwiXCJcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7b2JqZWN0UHJpbnR9IHRvIG1hdGNoICR7ZXhwZWN0ZWRQcmludH0ke2RpZmZQcmludH1gKVxuICAgICAgfVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbm90KSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuX29iamVjdCA9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZXN1bHQgPT0gXCJvYmplY3RcIikge1xuICAgICAgICBpZiAoIWFueXRoaW5nRGlmZmVyZW50KHRoaXMuX29iamVjdCwgcmVzdWx0KSkge1xuICAgICAgICAgIGNvbnN0IG9iamVjdFByaW50ID0gZm9ybWF0VmFsdWUodGhpcy5fb2JqZWN0KVxuICAgICAgICAgIGNvbnN0IHJlc3VsdFByaW50ID0gZm9ybWF0VmFsdWUocmVzdWx0KVxuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSB3YXMgdW5leHBlY3RlZCBlcXVhbCB0byAke3Jlc3VsdFByaW50fWApXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLl9vYmplY3QgPT0gcmVzdWx0KSB7XG4gICAgICAgICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBmb3JtYXRWYWx1ZSh0aGlzLl9vYmplY3QpXG4gICAgICAgICAgY29uc3QgcmVzdWx0UHJpbnQgPSBmb3JtYXRWYWx1ZShyZXN1bHQpXG5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhcyB1bmV4cGVjdGVkIGVxdWFsIHRvICR7cmVzdWx0UHJpbnR9YClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuX29iamVjdCA9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZXN1bHQgPT0gXCJvYmplY3RcIikge1xuICAgICAgICBpZiAoYW55dGhpbmdEaWZmZXJlbnQodGhpcy5fb2JqZWN0LCByZXN1bHQpKSB7XG4gICAgICAgICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBmb3JtYXRWYWx1ZSh0aGlzLl9vYmplY3QpXG4gICAgICAgICAgY29uc3QgcmVzdWx0UHJpbnQgPSBmb3JtYXRWYWx1ZShyZXN1bHQpXG5cbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl9vYmplY3QpICYmIEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgICAgICAgY29uc3QgYWN0dWFsU3RyaW5ncyA9IHRoaXMuX29iamVjdC5tYXAoKGl0ZW0pID0+IG1pbmlmaWVkU3RyaW5naWZ5KGl0ZW0pKVxuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWRTdHJpbmdzID0gcmVzdWx0Lm1hcCgoaXRlbSkgPT4gbWluaWZpZWRTdHJpbmdpZnkoaXRlbSkpXG5cbiAgICAgICAgICAgIGNvbnN0IG1pc3NpbmdJdGVtcyA9IGV4cGVjdGVkU3RyaW5ncy5maWx0ZXIoKGl0ZW0pID0+ICFhY3R1YWxTdHJpbmdzLmluY2x1ZGVzKGl0ZW0pKVxuICAgICAgICAgICAgY29uc3QgdW5leHBlY3RlZEl0ZW1zID0gYWN0dWFsU3RyaW5ncy5maWx0ZXIoKGl0ZW0pID0+ICFleHBlY3RlZFN0cmluZ3MuaW5jbHVkZXMoaXRlbSkpXG5cbiAgICAgICAgICAgIGNvbnN0IGRpZmZQYXJ0cyA9IFtdXG5cbiAgICAgICAgICAgIGlmIChtaXNzaW5nSXRlbXMubGVuZ3RoID4gMCkgZGlmZlBhcnRzLnB1c2goYG1pc3NpbmcgJHttaXNzaW5nSXRlbXMuam9pbihcIiwgXCIpfWApXG4gICAgICAgICAgICBpZiAodW5leHBlY3RlZEl0ZW1zLmxlbmd0aCA+IDApIGRpZmZQYXJ0cy5wdXNoKGB1bmV4cGVjdGVkICR7dW5leHBlY3RlZEl0ZW1zLmpvaW4oXCIsIFwiKX1gKVxuXG4gICAgICAgICAgICBjb25zdCBkaWZmTWVzc2FnZSA9IGRpZmZQYXJ0cy5sZW5ndGggPiAwID8gYCAoZGlmZjogJHtkaWZmUGFydHMuam9pbihcIjsgXCIpfSlgIDogXCJcIlxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhc24ndCBlcXVhbCB0byAke3Jlc3VsdFByaW50fSR7ZGlmZk1lc3NhZ2V9YClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhc24ndCBlcXVhbCB0byAke3Jlc3VsdFByaW50fWApXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLl9vYmplY3QgIT0gcmVzdWx0KSB7XG4gICAgICAgICAgY29uc3Qgb2JqZWN0UHJpbnQgPSBmb3JtYXRWYWx1ZSh0aGlzLl9vYmplY3QpXG4gICAgICAgICAgY29uc3QgcmVzdWx0UHJpbnQgPSBmb3JtYXRWYWx1ZShyZXN1bHQpXG5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhc24ndCBlcXVhbCB0byAke3Jlc3VsdFByaW50fWApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyB0byBtYXRjaC5cbiAgICogQHBhcmFtIHtSZWdFeHB9IHJlZ2V4IC0gUmVnZXguXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHRvTWF0Y2gocmVnZXgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX29iamVjdCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBzdHJpbmcgYnV0IGdvdCAke3R5cGVvZiB0aGlzLl9vYmplY3R9YClcbiAgICB9XG5cbiAgICBjb25zdCBtYXRjaCA9IHRoaXMuX29iamVjdC5tYXRjaChyZWdleClcbiAgICBjb25zdCBvYmplY3RQcmludCA9IG1pbmlmaWVkU3RyaW5naWZ5KHRoaXMuX29iamVjdClcblxuICAgIGlmICh0aGlzLl9ub3QpIHtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHNob3VsZG4ndCBtYXRjaCAke3JlZ2V4fWApXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdFByaW50fSBkaWRuJ3QgbWF0Y2ggJHtyZWdleH1gKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRvIG1hdGNoIG9iamVjdC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/PiB8IEFycmF5PD8+fSBleHBlY3RlZCAtIEV4cGVjdGVkIHBhcnRpYWwgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICB0b01hdGNoT2JqZWN0KGV4cGVjdGVkKSB7XG4gICAgaWYgKGV4cGVjdGVkID09PSBudWxsIHx8IHR5cGVvZiBleHBlY3RlZCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvYmplY3QgYnV0IGdvdCAke3R5cGVvZiBleHBlY3RlZH1gKVxuICAgIH1cblxuICAgIGNvbnN0IHttYXRjaGVzLCBkaWZmZXJlbmNlc30gPSBtYXRjaE9iamVjdCh0aGlzLl9vYmplY3QsIGV4cGVjdGVkKVxuICAgIGNvbnN0IG9iamVjdFByaW50ID0gZm9ybWF0VmFsdWUodGhpcy5fb2JqZWN0KVxuICAgIGNvbnN0IGV4cGVjdGVkUHJpbnQgPSBmb3JtYXRWYWx1ZShleHBlY3RlZClcblxuICAgIGlmICh0aGlzLl9ub3QpIHtcbiAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJHtvYmplY3RQcmludH0gbm90IHRvIG1hdGNoICR7ZXhwZWN0ZWRQcmludH1gKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIW1hdGNoZXMpIHtcbiAgICAgIGNvbnN0IGRpZmZQcmludCA9IE9iamVjdC5rZXlzKGRpZmZlcmVuY2VzKS5sZW5ndGggPiAwID8gYCAoZGlmZjogJHttaW5pZmllZFN0cmluZ2lmeShkaWZmZXJlbmNlcyl9KWAgOiBcIlwiXG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJHtvYmplY3RQcmludH0gdG8gbWF0Y2ggJHtleHBlY3RlZFByaW50fSR7ZGlmZlByaW50fWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdG8gdGhyb3cgZXJyb3IuXG4gICAqIEB0ZW1wbGF0ZSBUIGV4dGVuZHMgRXJyb3JcbiAgICogQHBhcmFtIHtzdHJpbmd8VH0gZXhwZWN0ZWRFcnJvciAtIEV4cGVjdGVkIGVycm9yLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgdG9UaHJvd0Vycm9yKGV4cGVjdGVkRXJyb3IpIHtcbiAgICBpZiAodGhpcy5fbm90KSB0aHJvdyBuZXcgRXJyb3IoXCJub3Qgc3R1YlwiKVxuXG4gICAgbGV0IGZhaWxlZEVycm9yXG5cbiAgICB0cnkge1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLl9vYmplY3QgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGZ1bmN0aW9uIGJ1dCBnb3QgJHt0eXBlb2YgdGhpcy5fb2JqZWN0fWApXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuX29iamVjdCgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGZhaWxlZEVycm9yID0gZXJyb3JcbiAgICB9XG5cbiAgICBpZiAoIWZhaWxlZEVycm9yKSB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCB0byBmYWlsIGJ1dCBkaWRuJ3RcIilcblxuICAgIGxldCBleHBlY3RlZEVycm9yTWVzc2FnZSwgZmFpbGVkRXJyb3JNZXNzYWdlXG5cbiAgICBpZiAodHlwZW9mIGZhaWxlZEVycm9yID09IFwic3RyaW5nXCIpIHtcbiAgICAgIGZhaWxlZEVycm9yTWVzc2FnZSA9IGZhaWxlZEVycm9yXG4gICAgfSBlbHNlIGlmIChmYWlsZWRFcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBmYWlsZWRFcnJvck1lc3NhZ2UgPSBmYWlsZWRFcnJvci5tZXNzYWdlXG4gICAgfSBlbHNlIHtcbiAgICAgIGZhaWxlZEVycm9yTWVzc2FnZSA9IFN0cmluZyhmYWlsZWRFcnJvcilcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGV4cGVjdGVkRXJyb3IgPT0gXCJzdHJpbmdcIikge1xuICAgICAgZXhwZWN0ZWRFcnJvck1lc3NhZ2UgPSBleHBlY3RlZEVycm9yXG4gICAgfSBlbHNlIGlmIChleHBlY3RlZEVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGV4cGVjdGVkRXJyb3JNZXNzYWdlID0gZXhwZWN0ZWRFcnJvci5tZXNzYWdlXG4gICAgfSBlbHNlIHtcbiAgICAgIGV4cGVjdGVkRXJyb3JNZXNzYWdlID0gU3RyaW5nKGV4cGVjdGVkRXJyb3IpXG4gICAgfVxuXG4gICAgaWYgKGZhaWxlZEVycm9yTWVzc2FnZSAhPSBleHBlY3RlZEVycm9yTWVzc2FnZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCB0byBmYWlsIHdpdGggJyR7ZXhwZWN0ZWRFcnJvck1lc3NhZ2V9JyBidXQgZmFpbGVkIHdpdGggJyR7ZmFpbGVkRXJyb3JNZXNzYWdlfSdgKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRvIHRocm93LlxuICAgKiBAcGFyYW0ge3N0cmluZ3xSZWdFeHB8RXJyb3J8KChuZXcgKC4uLmFyZ3M6IEFycmF5PD8+KSA9PiBFcnJvcikpfSBbZXhwZWN0ZWRdIC0gRXhwZWN0ZWQgZXJyb3IuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyB0b1Rocm93KGV4cGVjdGVkKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9vYmplY3QgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBmdW5jdGlvbiBidXQgZ290ICR7dHlwZW9mIHRoaXMuX29iamVjdH1gKVxuICAgIH1cblxuICAgIGxldCBmYWlsZWRFcnJvclxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX29iamVjdCgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGZhaWxlZEVycm9yID0gZXJyb3JcbiAgICB9XG5cbiAgICBjb25zdCBvYmplY3RQcmludCA9IGZvcm1hdFZhbHVlKHRoaXMuX29iamVjdClcblxuICAgIGlmICh0aGlzLl9ub3QpIHtcbiAgICAgIGlmIChmYWlsZWRFcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0UHJpbnR9IHdhcyB1bmV4cGVjdGVkIHRvIHRocm93YClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCFmYWlsZWRFcnJvcikgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgdG8gZmFpbCBidXQgZGlkbid0XCIpXG4gICAgaWYgKGV4cGVjdGVkID09PSB1bmRlZmluZWQpIHJldHVyblxuXG4gICAgY29uc3QgZmFpbGVkRXJyb3JNZXNzYWdlID0gZmFpbGVkRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGZhaWxlZEVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZmFpbGVkRXJyb3IpXG4gICAgY29uc3QgZmFpbGVkRXJyb3JOYW1lID0gZmFpbGVkRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGZhaWxlZEVycm9yLm5hbWUgOiB0eXBlb2YgZmFpbGVkRXJyb3JcblxuICAgIGlmIChleHBlY3RlZCBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgaWYgKCFleHBlY3RlZC50ZXN0KGZhaWxlZEVycm9yTWVzc2FnZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCB0byBmYWlsIHdpdGggbWVzc2FnZSBtYXRjaGluZyAke2V4cGVjdGVkfSBidXQgZmFpbGVkIHdpdGggJyR7ZmFpbGVkRXJyb3JNZXNzYWdlfSdgKVxuICAgICAgfVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGV4cGVjdGVkID09PSBcImZ1bmN0aW9uXCIgJiYgKGV4cGVjdGVkLnByb3RvdHlwZSBpbnN0YW5jZW9mIEVycm9yIHx8IGV4cGVjdGVkID09PSBFcnJvcikpIHtcbiAgICAgIGlmICghKGZhaWxlZEVycm9yIGluc3RhbmNlb2YgZXhwZWN0ZWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgdG8gdGhyb3cgJHtleHBlY3RlZC5uYW1lfSBidXQgdGhyZXcgJHtmYWlsZWRFcnJvck5hbWV9YClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgbGV0IGV4cGVjdGVkTWVzc2FnZVxuXG4gICAgaWYgKHR5cGVvZiBleHBlY3RlZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgZXhwZWN0ZWRNZXNzYWdlID0gZXhwZWN0ZWRcbiAgICB9IGVsc2UgaWYgKGV4cGVjdGVkIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGV4cGVjdGVkTWVzc2FnZSA9IGV4cGVjdGVkLm1lc3NhZ2VcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwZWN0ZWRNZXNzYWdlID0gU3RyaW5nKGV4cGVjdGVkKVxuICAgIH1cblxuICAgIGlmIChmYWlsZWRFcnJvck1lc3NhZ2UgIT0gZXhwZWN0ZWRNZXNzYWdlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHRvIGZhaWwgd2l0aCAnJHtleHBlY3RlZE1lc3NhZ2V9JyBidXQgZmFpbGVkIHdpdGggJyR7ZmFpbGVkRXJyb3JNZXNzYWdlfSdgKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGV4ZWN1dGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPD8+fSAtIFJlc29sdmVzIHdpdGggdGhlIGV4ZWN1dGUuXG4gICAqL1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIGZvciAoY29uc3QgZXhwZWN0YXRpb24gb2YgdGhpcy5leHBlY3RhdGlvbnMpIHtcbiAgICAgIGF3YWl0IGV4cGVjdGF0aW9uLnJ1bkJlZm9yZSgpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLl9vYmplY3QgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBmdW5jdGlvbiBidXQgZ290ICR7dHlwZW9mIHRoaXMuX29iamVjdH1gKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuX29iamVjdCgpXG5cbiAgICBmb3IgKGNvbnN0IGV4cGVjdGF0aW9uIG9mIHRoaXMuZXhwZWN0YXRpb25zKSB7XG4gICAgICBhd2FpdCBleHBlY3RhdGlvbi5ydW5BZnRlcigpXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBleHBlY3RhdGlvbiBvZiB0aGlzLmV4cGVjdGF0aW9ucykge1xuICAgICAgYXdhaXQgZXhwZWN0YXRpb24uZXhlY3V0ZSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdG8gaGF2ZSBhdHRyaWJ1dGVzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSByZXN1bHQgLSBSZXN1bHQuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHRvSGF2ZUF0dHJpYnV0ZXMocmVzdWx0KSB7XG4gICAgaWYgKHRoaXMuX25vdCkgdGhyb3cgbmV3IEVycm9yKFwibm90IHN0dWJcIilcblxuICAgIC8qKlxuICAgICAqIERpZmZlcmVuY2VzLlxuICAgICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBBcnJheTw/Pj59ICovXG4gICAgY29uc3QgZGlmZmVyZW5jZXMgPSB7fVxuICAgIGNvbnN0IG9iamVjdEFzUmVjb3JkID0gLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovICh0aGlzLl9vYmplY3QpXG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiByZXN1bHQpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gcmVzdWx0W2tleV1cblxuICAgICAgaWYgKCEoa2V5IGluIG9iamVjdEFzUmVjb3JkKSkgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuX29iamVjdC5jb25zdHJ1Y3Rvci5uYW1lfSBkb2Vzbid0IHJlc3BvbmQgdG8gJHtrZXl9YClcblxuICAgICAgY29uc3Qgb2JqZWN0VmFsdWUgPSAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAdHlwZSB7KCkgPT4gP30gKi8gKG9iamVjdEFzUmVjb3JkW2tleV0pKClcblxuICAgICAgaWYgKHZhbHVlICE9IG9iamVjdFZhbHVlKSB7XG4gICAgICAgIGRpZmZlcmVuY2VzW2tleV0gPSBbdmFsdWUsIG9iamVjdFZhbHVlXVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChPYmplY3Qua2V5cyhkaWZmZXJlbmNlcykubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBPYmplY3QgaGFkIGRpZmZlcmV0IHZhbHVlczogJHttaW5pZmllZFN0cmluZ2lmeShkaWZmZXJlbmNlcyl9YClcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -19,35 +19,35 @@ export default class TestFilesFinder {
|
|
|
19
19
|
processArgs: string[];
|
|
20
20
|
/**
|
|
21
21
|
* Narrows the runtime value to the documented type.
|
|
22
|
-
|
|
22
|
+
* @type {string[]} */
|
|
23
23
|
foundFiles: string[];
|
|
24
24
|
/**
|
|
25
25
|
* Narrows the runtime value to the documented type.
|
|
26
|
-
|
|
26
|
+
* @type {Record<number, Promise<void>>} */
|
|
27
27
|
findingPromises: Record<number, Promise<void>>;
|
|
28
28
|
/**
|
|
29
29
|
* Narrows the runtime value to the documented type.
|
|
30
|
-
|
|
30
|
+
* @type {string[]} */
|
|
31
31
|
testArgs: string[];
|
|
32
32
|
/**
|
|
33
33
|
* Narrows the runtime value to the documented type.
|
|
34
|
-
|
|
34
|
+
* @type {string[]} */
|
|
35
35
|
directoryArgs: string[];
|
|
36
36
|
/**
|
|
37
37
|
* Narrows the runtime value to the documented type.
|
|
38
|
-
|
|
38
|
+
* @type {string[]} */
|
|
39
39
|
directoryFullPaths: string[];
|
|
40
40
|
/**
|
|
41
41
|
* Narrows the runtime value to the documented type.
|
|
42
|
-
|
|
42
|
+
* @type {string[]} */
|
|
43
43
|
fileArgs: string[];
|
|
44
44
|
/**
|
|
45
45
|
* Narrows the runtime value to the documented type.
|
|
46
|
-
|
|
46
|
+
* @type {string[]} */
|
|
47
47
|
explicitFiles: string[];
|
|
48
48
|
/**
|
|
49
49
|
* Narrows the runtime value to the documented type.
|
|
50
|
-
|
|
50
|
+
* @type {Record<string, number[]>} */
|
|
51
51
|
lineFiltersByFile: Record<string, number[]>;
|
|
52
52
|
_argsPrepared: boolean;
|
|
53
53
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-files-finder.d.ts","sourceRoot":"","sources":["../../../src/testing/test-files-finder.js"],"names":[],"mappings":"AAUA;IACE,+BAA+C;IAE/C;;;;;;OAMG;IACH,kEAJG;QAAqB,SAAS,EAAtB,MAAM;QACU,WAAW;QACZ,WAAW,EAA1B,MAAM,EAAE;KAClB,EA6DA;IAzDC,kBAAwC;IACxC,eAA8B;IAG5B,sBAAkE;IASpE,qBAAqB;IACrB,sBAA8B;IAE9B;;
|
|
1
|
+
{"version":3,"file":"test-files-finder.d.ts","sourceRoot":"","sources":["../../../src/testing/test-files-finder.js"],"names":[],"mappings":"AAUA;IACE,+BAA+C;IAE/C;;;;;;OAMG;IACH,kEAJG;QAAqB,SAAS,EAAtB,MAAM;QACU,WAAW;QACZ,WAAW,EAA1B,MAAM,EAAE;KAClB,EA6DA;IAzDC,kBAAwC;IACxC,eAA8B;IAG5B,sBAAkE;IASpE,qBAAqB;IACrB,sBAA8B;IAE9B;;0BAEsB;IACtB,YADU,MAAM,EAAE,CACE;IAEpB;;+CAE2C;IAC3C,iBADU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CACd;IAEzB;;0BAEsB;IACtB,UADU,MAAM,EAAE,CACwD;IAE1E;;0BAEsB;IACtB,eADU,MAAM,EAAE,CACK;IAEvB;;0BAEsB;IACtB,oBADU,MAAM,EAAE,CACU;IAE5B;;0BAEsB;IACtB,UADU,MAAM,EAAE,CACA;IAElB;;0BAEsB;IACtB,eADU,MAAM,EAAE,CACK;IAEvB;;0CAEsC;IACtC,mBADU,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CACP;IAE3B,uBAA0B;IAG5B;;;OAGG;IACH,iBAFa,OAAO,CAAC,MAAM,EAAE,CAAC,CA2B7B;IAED;;;OAGG;IACH,wBAFa,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAEmB;IAExD;;;OAGG;IACH,yBAFa,MAAM,CAEwD;IAE3E,wCAIC;IAED;;;OAGG;IACH,mCAFa,OAAO,CAAC,IAAI,CAAC,CAYzB;IAED;;;;OAIG;IACH,2BAHW,MAAa,OAAO,CAAC,IAAI,CAAC,GACxB,OAAO,CAAC,IAAI,CAAC,CAgBzB;IAED;;;;OAIG;IACH,wBAHW,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAwBzB;IAED;;;;;OAKG;IACH,iCAJW,MAAM,aACN,MAAM,GACJ,OAAO,CA2BnB;IAED;;;;OAIG;IACH,wBAHW,MAAM,GACJ,OAAO,CAInB;IAED;;;OAGG;IACH,eAFa,OAAO,CAAC,IAAI,CAAC,CA8DzB;IAED;;;;;OAKG;IACH,wBAJW,MAAM,QACN,MAAM,GACJ,IAAI,CAYhB;IAED;;;;OAIG;IACH,sBAHW,MAAM,GACJ;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAC,CAgB7C;IAED;;;;OAIG;IACH,+BAHW,MAAM,GACJ,MAAM,CAKlB;IAED;;;;OAIG;IACH,sBAHW,MAAM,GACJ,MAAM,CAKlB;CACF;mBArWkB,cAAc"}
|
|
@@ -32,35 +32,35 @@ export default class TestFilesFinder {
|
|
|
32
32
|
this.processArgs = processArgs;
|
|
33
33
|
/**
|
|
34
34
|
* Narrows the runtime value to the documented type.
|
|
35
|
-
|
|
35
|
+
* @type {string[]} */
|
|
36
36
|
this.foundFiles = [];
|
|
37
37
|
/**
|
|
38
38
|
* Narrows the runtime value to the documented type.
|
|
39
|
-
|
|
39
|
+
* @type {Record<number, Promise<void>>} */
|
|
40
40
|
this.findingPromises = {};
|
|
41
41
|
/**
|
|
42
42
|
* Narrows the runtime value to the documented type.
|
|
43
|
-
|
|
43
|
+
* @type {string[]} */
|
|
44
44
|
this.testArgs = this.processArgs.filter((processArg, index) => index != 0);
|
|
45
45
|
/**
|
|
46
46
|
* Narrows the runtime value to the documented type.
|
|
47
|
-
|
|
47
|
+
* @type {string[]} */
|
|
48
48
|
this.directoryArgs = [];
|
|
49
49
|
/**
|
|
50
50
|
* Narrows the runtime value to the documented type.
|
|
51
|
-
|
|
51
|
+
* @type {string[]} */
|
|
52
52
|
this.directoryFullPaths = [];
|
|
53
53
|
/**
|
|
54
54
|
* Narrows the runtime value to the documented type.
|
|
55
|
-
|
|
55
|
+
* @type {string[]} */
|
|
56
56
|
this.fileArgs = [];
|
|
57
57
|
/**
|
|
58
58
|
* Narrows the runtime value to the documented type.
|
|
59
|
-
|
|
59
|
+
* @type {string[]} */
|
|
60
60
|
this.explicitFiles = [];
|
|
61
61
|
/**
|
|
62
62
|
* Narrows the runtime value to the documented type.
|
|
63
|
-
|
|
63
|
+
* @type {Record<string, number[]>} */
|
|
64
64
|
this.lineFiltersByFile = {};
|
|
65
65
|
this._argsPrepared = false;
|
|
66
66
|
}
|
|
@@ -307,4 +307,4 @@ export default class TestFilesFinder {
|
|
|
307
307
|
return relativePath.split(path.sep).join("/");
|
|
308
308
|
}
|
|
309
309
|
}
|
|
310
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1maWxlcy1maW5kZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy90ZXN0LWZpbGVzLWZpbmRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzVCLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQTtBQUV2QixPQUFPLFVBQVUsTUFBTSx5QkFBeUIsQ0FBQTtBQUNoRCxPQUFPLE1BQU0sTUFBTSxjQUFjLENBQUE7QUFDakMsT0FBTyxhQUFhLE1BQU0sNkJBQTZCLENBQUE7QUFFdkQsaUhBQWlIO0FBQ2pILE1BQU0sQ0FBQyxPQUFPLE9BQU8sZUFBZTtJQUNsQyxNQUFNLENBQUMsYUFBYSxHQUFHLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFBO0lBRS9DOzs7Ozs7T0FNRztJQUNILFlBQVksRUFBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxHQUFHLFFBQVEsRUFBQztRQUM1RCxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ3hDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7UUFFOUIsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtRQUNwRSxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxXQUFXLEdBQUc7Z0JBQ2pCLEdBQUcsSUFBSSxDQUFDLFNBQVMsWUFBWTtnQkFDN0IsR0FBRyxJQUFJLENBQUMsU0FBUyxRQUFRO2dCQUN6QixHQUFHLElBQUksQ0FBQyxT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UUFDbEIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUUzQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxPQUFPLEVBQUMsUUFBUSxFQUFFLE9BQU8sRUFBQyxDQUFBO1FBQzVCLENBQUM7UUFFRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMzQixPQUFPLEVBQUMsUUFBUSxFQUFFLE9BQU8sRUFBQyxDQUFBO1FBQzVCLENBQUM7UUFFRCxPQUFPLEVBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUMsQ0FBQTtJQUNuQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILG1CQUFtQixDQUFDLFNBQVM7UUFDM0IsSUFBSSxTQUFTLEtBQUssRUFBRTtZQUFFLE9BQU8sU0FBUyxDQUFBO1FBQ3RDLE9BQU8sU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsR0FBRyxDQUFBO0lBQzlELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsV0FBVyxDQUFDLFFBQVE7UUFDbEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQzVELE9BQU8sWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQy9DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IGZzIGZyb20gXCJmcy9wcm9taXNlc1wiXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5cbmltcG9ydCBmaWxlRXhpc3RzIGZyb20gXCIuLi91dGlscy9maWxlLWV4aXN0cy5qc1wiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi9sb2dnZXIuanNcIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4uL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5cbi8vIEluY3JlZGlibHkgY29tcGxleCBjbGFzcyB0byBmaW5kIGZpbGVzIGluIG11bHRpcGxlIHNpbXVsdGFuaW91cyBydW5uaW5nIHByb21pc2VzIHRvIGRvIGl0IGFzIGZhc3QgYXMgcG9zc2libGUuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZXN0RmlsZXNGaW5kZXIge1xuICBzdGF0aWMgSUdOT1JFRF9OQU1FUyA9IFtcIi5naXRcIiwgXCJub2RlX21vZHVsZXNcIl1cblxuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZGlyZWN0b3J5IC0gRGlyZWN0b3J5IHBhdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFthcmdzLmRpcmVjdG9yaWVzXSAtIERpcmVjdG9yaWVzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzLnByb2Nlc3NBcmdzIC0gUHJvY2VzcyBhcmdzLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2RpcmVjdG9yeSwgZGlyZWN0b3JpZXMsIHByb2Nlc3NBcmdzLCAuLi5yZXN0QXJnc30pIHtcbiAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuXG4gICAgdGhpcy5kaXJlY3RvcnkgPSBwYXRoLnJlc29sdmUoZGlyZWN0b3J5KVxuICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlcih0aGlzKVxuXG4gICAgaWYgKGRpcmVjdG9yaWVzKSB7XG4gICAgICB0aGlzLmRpcmVjdG9yaWVzID0gZGlyZWN0b3JpZXMubWFwKChlbnRyeSkgPT4gcGF0aC5yZXNvbHZlKGVudHJ5KSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXJlY3RvcmllcyA9IFtcbiAgICAgICAgYCR7dGhpcy5kaXJlY3Rvcnl9L19fdGVzdHNfX2AsXG4gICAgICAgIGAke3RoaXMuZGlyZWN0b3J5fS90ZXN0c2AsXG4gICAgICAgIGAke3RoaXMuZGlyZWN0b3J5fS9zcGVjYFxuICAgICAgXVxuICAgIH1cblxuICAgIHRoaXMuZmluZGluZ0NvdW50ID0gMFxuICAgIHRoaXMucHJvY2Vzc0FyZ3MgPSBwcm9jZXNzQXJnc1xuXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAgQHR5cGUge3N0cmluZ1tdfSAqL1xuICAgIHRoaXMuZm91bmRGaWxlcyA9IFtdXG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICBAdHlwZSB7UmVjb3JkPG51bWJlciwgUHJvbWlzZTx2b2lkPj59ICovXG4gICAgdGhpcy5maW5kaW5nUHJvbWlzZXMgPSB7fVxuXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAgQHR5cGUge3N0cmluZ1tdfSAqL1xuICAgIHRoaXMudGVzdEFyZ3MgPSB0aGlzLnByb2Nlc3NBcmdzLmZpbHRlcigocHJvY2Vzc0FyZywgaW5kZXgpID0+IGluZGV4ICE9IDApXG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICBAdHlwZSB7c3RyaW5nW119ICovXG4gICAgdGhpcy5kaXJlY3RvcnlBcmdzID0gW11cblxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICB0aGlzLmRpcmVjdG9yeUZ1bGxQYXRocyA9IFtdXG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICBAdHlwZSB7c3RyaW5nW119ICovXG4gICAgdGhpcy5maWxlQXJncyA9IFtdXG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICBAdHlwZSB7c3RyaW5nW119ICovXG4gICAgdGhpcy5leHBsaWNpdEZpbGVzID0gW11cblxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXJbXT59ICovXG4gICAgdGhpcy5saW5lRmlsdGVyc0J5RmlsZSA9IHt9XG5cbiAgICB0aGlzLl9hcmdzUHJlcGFyZWQgPSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZmluZCB0ZXN0IGZpbGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgdGVzdCBmaWxlcy5cbiAgICovXG4gIGFzeW5jIGZpbmRUZXN0RmlsZXMoKSB7XG4gICAgYXdhaXQgdGhpcy5wcmVwYXJlQXJncygpXG5cbiAgICBpZiAodGhpcy5leHBsaWNpdEZpbGVzLmxlbmd0aCA+IDAgJiYgdGhpcy5kaXJlY3RvcnlBcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldCh0aGlzLmV4cGxpY2l0RmlsZXMpKVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMud2l0aEZpbmRpbmdDb3VudChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBoYXNFeHBsaWNpdEFyZ3MgPSB0aGlzLmRpcmVjdG9yeUZ1bGxQYXRocy5sZW5ndGggPiAwIHx8IHRoaXMuZmlsZUFyZ3MubGVuZ3RoID4gMFxuICAgICAgY29uc3QgZGlyZWN0b3JpZXNUb1NjYW4gPSBoYXNFeHBsaWNpdEFyZ3MgPyB0aGlzLmRpcmVjdG9yeUZ1bGxQYXRocyA6IHRoaXMuZGlyZWN0b3JpZXNcblxuICAgICAgZm9yIChjb25zdCBkaXJlY3Rvcnkgb2YgZGlyZWN0b3JpZXNUb1NjYW4pIHtcbiAgICAgICAgaWYgKGF3YWl0IGZpbGVFeGlzdHMoZGlyZWN0b3J5KSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZmluZFRlc3RGaWxlc0luRGlyKGRpcmVjdG9yeSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBhd2FpdCB0aGlzLndhaXRGb3JGaW5kaW5nUHJvbWlzZXMoKVxuXG4gICAgaWYgKHRoaXMuZXhwbGljaXRGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmZvdW5kRmlsZXMucHVzaCguLi50aGlzLmV4cGxpY2l0RmlsZXMpXG4gICAgfVxuXG4gICAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldCh0aGlzLmZvdW5kRmlsZXMpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGxpbmUgZmlsdGVycyBieSBmaWxlLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgbnVtYmVyW10+fSAtIExpbmUgZmlsdGVycyBieSBmaWxlLlxuICAgKi9cbiAgZ2V0TGluZUZpbHRlcnNCeUZpbGUoKSB7IHJldHVybiB0aGlzLmxpbmVGaWx0ZXJzQnlGaWxlIH1cblxuICAvKipcbiAgICogUnVucyBmaW5kaW5nIHByb21pc2VzIGxlbmd0aC5cbiAgICogQHJldHVybnMge251bWJlcn0gLSBUaGUgaW5nIHByb21pc2VzIGxlbmd0aC5cbiAgICovXG4gIGZpbmRpbmdQcm9taXNlc0xlbmd0aCgpIHsgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZmluZGluZ1Byb21pc2VzKS5sZW5ndGggfVxuXG4gIGFzeW5jIHdhaXRGb3JGaW5kaW5nUHJvbWlzZXMoKSB7XG4gICAgd2hpbGUgKHRoaXMuZmluZGluZ1Byb21pc2VzTGVuZ3RoKCkgPiAwKSB7XG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JGaW5kaW5nUHJvbWlzZXNJdGVyYXRpb24oKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdhaXQgZm9yIGZpbmRpbmcgcHJvbWlzZXMgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgd2FpdEZvckZpbmRpbmdQcm9taXNlc0l0ZXJhdGlvbigpIHtcbiAgICBjb25zdCB1bmZpbmlzaGVkUHJvbWlzZXMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBmaW5kaW5nUHJvbWlzZUlkIGluIHRoaXMuZmluZGluZ1Byb21pc2VzKSB7XG4gICAgICBjb25zdCBmaW5kaW5nUHJvbWlzZSA9IHRoaXMuZmluZGluZ1Byb21pc2VzW2ZpbmRpbmdQcm9taXNlSWRdXG5cbiAgICAgIHVuZmluaXNoZWRQcm9taXNlcy5wdXNoKGZpbmRpbmdQcm9taXNlKVxuICAgIH1cblxuICAgIGF3YWl0IFByb21pc2UuYWxsKHVuZmluaXNoZWRQcm9taXNlcylcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdpdGggZmluZGluZyBjb3VudC5cbiAgICogQHBhcmFtIHtmdW5jdGlvbigpIDogUHJvbWlzZTx2b2lkPn0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIHdpdGhGaW5kaW5nQ291bnQoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IGZpbmRpbmdQcm9taXNlID0gY2FsbGJhY2soKVxuICAgICAgY29uc3QgZmluZGluZ0NvdW50ID0gdGhpcy5maW5kaW5nQ291bnRcblxuICAgICAgdGhpcy5maW5kaW5nQ291bnQgKz0gMVxuICAgICAgdGhpcy5maW5kaW5nUHJvbWlzZXNbZmluZGluZ0NvdW50XSA9IGZpbmRpbmdQcm9taXNlXG5cbiAgICAgIGZpbmRpbmdQcm9taXNlLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICBkZWxldGUgdGhpcy5maW5kaW5nUHJvbWlzZXNbZmluZGluZ0NvdW50XVxuXG4gICAgICAgIHJlc29sdmUodW5kZWZpbmVkKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZmluZCB0ZXN0IGZpbGVzIGluIGRpci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRpciAtIERpci5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGZpbmRUZXN0RmlsZXNJbkRpcihkaXIpIHtcbiAgICBhd2FpdCB0aGlzLndpdGhGaW5kaW5nQ291bnQoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpcilcblxuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIGlmIChUZXN0RmlsZXNGaW5kZXIuSUdOT1JFRF9OQU1FUy5pbmNsdWRlcyhmaWxlKSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmdWxsUGF0aCA9IGAke2Rpcn0vJHtmaWxlfWBcbiAgICAgICAgY29uc3QgbG9jYWxQYXRoID0gZnVsbFBhdGgucmVwbGFjZShgJHt0aGlzLmRpcmVjdG9yeX0vYCwgXCJcIilcbiAgICAgICAgY29uc3QgaXNEaXIgPSAoYXdhaXQgZnMuc3RhdChmdWxsUGF0aCkpLmlzRGlyZWN0b3J5KClcblxuICAgICAgICBpZiAoaXNEaXIpIHtcbiAgICAgICAgICB0aGlzLmZpbmRUZXN0RmlsZXNJbkRpcihmdWxsUGF0aClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGhpcy5pc0ZpbGVNYXRjaGluZ1JlcXVpcmVtZW50cyhmaWxlLCBsb2NhbFBhdGgpKSB7XG4gICAgICAgICAgICB0aGlzLmZvdW5kRmlsZXMucHVzaChmdWxsUGF0aClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaXMgZmlsZSBtYXRjaGluZyByZXF1aXJlbWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlIC0gRmlsZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvY2FsUGF0aCAtIExvY2FsIHBhdGguXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgZmlsZSBtYXRjaGluZyByZXF1aXJlbWVudHMuXG4gICAqL1xuICBpc0ZpbGVNYXRjaGluZ1JlcXVpcmVtZW50cyhmaWxlLCBsb2NhbFBhdGgpIHtcbiAgICBpZiAodGhpcy5kaXJlY3RvcnlBcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgZGlyZWN0b3J5QXJnIG9mIHRoaXMuZGlyZWN0b3J5QXJncykge1xuICAgICAgICBpZiAobG9jYWxQYXRoLnN0YXJ0c1dpdGgoZGlyZWN0b3J5QXJnKSAmJiB0aGlzLmxvb2tzTGlrZVRlc3RGaWxlKGZpbGUpKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXCJGb3VuZCB0ZXN0IGZpbGUgYmVjYXVzZSBtYXRjaGluZyBkaXIgYW5kIGxvb2tzIGxpa2UgdGhpcyBmaWxlOlwiLCBmaWxlKVxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5maWxlQXJncy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IGZpbGVBcmcgb2YgdGhpcy5maWxlQXJncykge1xuICAgICAgICBpZiAoZmlsZUFyZyA9PSBsb2NhbFBhdGgpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcIkZvdW5kIHRlc3QgZmlsZSBiZWNhdXNlIG1hdGNoaW5nIGZpbGUgYXJnOlwiLCBmaWxlKVxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5maWxlQXJncy5sZW5ndGggPT0gMCAmJiB0aGlzLmRpcmVjdG9yeUFyZ3MubGVuZ3RoID09IDAgJiYgdGhpcy5sb29rc0xpa2VUZXN0RmlsZShmaWxlKSkge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXCJGb3VuZCB0ZXN0IGZpbGUgYmVjYXVzZSBsb29rcyBsaWtlIHRoaXMgZmlsZTpcIiwgZmlsZSlcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBsb29rcyBsaWtlIHRlc3QgZmlsZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGUgLSBGaWxlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGxvb2tzIGxpa2UgdGVzdCBmaWxlLlxuICAgKi9cbiAgbG9va3NMaWtlVGVzdEZpbGUoZmlsZSkge1xuICAgIHJldHVybiBCb29sZWFuKGZpbGUubWF0Y2goLy0oc3BlY3x0ZXN0KVxcLihtfClqcyQvKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHByZXBhcmUgYXJncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiB0ZXN0IGFyZ3MgYXJlIHByZXBhcmVkLlxuICAgKi9cbiAgYXN5bmMgcHJlcGFyZUFyZ3MoKSB7XG4gICAgaWYgKHRoaXMuX2FyZ3NQcmVwYXJlZCkgcmV0dXJuXG5cbiAgICBmb3IgKGNvbnN0IHRlc3RBcmcgb2YgdGhpcy50ZXN0QXJncykge1xuICAgICAgaWYgKHRlc3RBcmcgPT09IFwiLS1cIikgY29udGludWVcblxuICAgICAgY29uc3Qge2NsZWFuQXJnLCBsaW5lfSA9IHRoaXMuc3BsaXRMaW5lQXJnKHRlc3RBcmcpXG4gICAgICBjb25zdCBmb3JjZURpcmVjdG9yeSA9IHRlc3RBcmcuZW5kc1dpdGgoXCIvXCIpIHx8IHRlc3RBcmcuZW5kc1dpdGgocGF0aC5zZXApXG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShjbGVhbkFyZykgPyBjbGVhbkFyZyA6IHBhdGgucmVzb2x2ZSh0aGlzLmRpcmVjdG9yeSwgY2xlYW5BcmcpXG4gICAgICBjb25zdCBiYXNlTmFtZSA9IHBhdGguYmFzZW5hbWUodGhpcy5kaXJlY3RvcnkpXG4gICAgICBjb25zdCBoYXNCYXNlUHJlZml4ID0gY2xlYW5BcmcgPT09IGJhc2VOYW1lIHx8IGNsZWFuQXJnLnN0YXJ0c1dpdGgoYCR7YmFzZU5hbWV9L2ApIHx8IGNsZWFuQXJnLnN0YXJ0c1dpdGgoYCR7YmFzZU5hbWV9JHtwYXRoLnNlcH1gKVxuICAgICAgY29uc3QgYmFzZVByZWZpeGVkRnVsbFBhdGggPSAoIXBhdGguaXNBYnNvbHV0ZShjbGVhbkFyZykgJiYgaGFzQmFzZVByZWZpeCkgPyBwYXRoLnJlc29sdmUocGF0aC5kaXJuYW1lKHRoaXMuZGlyZWN0b3J5KSwgY2xlYW5BcmcpIDogbnVsbFxuICAgICAgY29uc3QgZnVsbFBhdGhDYW5kaWRhdGVzID0gYmFzZVByZWZpeGVkRnVsbFBhdGggPyBbYmFzZVByZWZpeGVkRnVsbFBhdGhdIDogW2Z1bGxQYXRoXVxuXG4gICAgICBpZiAoZm9yY2VEaXJlY3RvcnkpIHtcbiAgICAgICAgY29uc3QgcHJlZmVycmVkTG9jYWxQYXRoID0gdGhpcy50b0xvY2FsUGF0aChiYXNlUHJlZml4ZWRGdWxsUGF0aCB8fCBmdWxsUGF0aClcbiAgICAgICAgdGhpcy5kaXJlY3RvcnlBcmdzLnB1c2godGhpcy5lbnN1cmVUcmFpbGluZ1NsYXNoKHByZWZlcnJlZExvY2FsUGF0aCkpXG4gICAgICAgIHRoaXMuZGlyZWN0b3J5RnVsbFBhdGhzLnB1c2gocGF0aC5yZXNvbHZlKGJhc2VQcmVmaXhlZEZ1bGxQYXRoIHx8IGZ1bGxQYXRoKSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IHN0YXRzXG4gICAgICAgIGxldCByZXNvbHZlZEZ1bGxQYXRoXG5cbiAgICAgICAgZm9yIChjb25zdCBjYW5kaWRhdGVQYXRoIG9mIGZ1bGxQYXRoQ2FuZGlkYXRlcykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoY2FuZGlkYXRlUGF0aClcbiAgICAgICAgICAgIHJlc29sdmVkRnVsbFBhdGggPSBjYW5kaWRhdGVQYXRoXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gS2VlcCBzZWFyY2hpbmdcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXN0YXRzIHx8ICFyZXNvbHZlZEZ1bGxQYXRoKSB0aHJvdyBuZXcgRXJyb3IoXCJQYXRoIG5vdCBmb3VuZFwiKVxuICAgICAgICBjb25zdCBsb2NhbFBhdGggPSB0aGlzLnRvTG9jYWxQYXRoKHJlc29sdmVkRnVsbFBhdGgpXG5cbiAgICAgICAgaWYgKHN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICB0aGlzLmRpcmVjdG9yeUFyZ3MucHVzaCh0aGlzLmVuc3VyZVRyYWlsaW5nU2xhc2gobG9jYWxQYXRoKSlcbiAgICAgICAgICB0aGlzLmRpcmVjdG9yeUZ1bGxQYXRocy5wdXNoKHJlc29sdmVkRnVsbFBhdGgpXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHMuaXNGaWxlKCkpIHtcbiAgICAgICAgICB0aGlzLmZpbGVBcmdzLnB1c2gobG9jYWxQYXRoKVxuICAgICAgICAgIHRoaXMuZXhwbGljaXRGaWxlcy5wdXNoKHJlc29sdmVkRnVsbFBhdGgpXG5cbiAgICAgICAgICBpZiAobGluZSkge1xuICAgICAgICAgICAgdGhpcy5hZGRMaW5lRmlsdGVyKHJlc29sdmVkRnVsbFBhdGgsIGxpbmUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc3QgZmFsbGJhY2tMb2NhbFBhdGggPSB0aGlzLnRvTG9jYWxQYXRoKGJhc2VQcmVmaXhlZEZ1bGxQYXRoIHx8IGZ1bGxQYXRoKVxuICAgICAgICB0aGlzLmZpbGVBcmdzLnB1c2goZmFsbGJhY2tMb2NhbFBhdGgpXG5cbiAgICAgICAgaWYgKGxpbmUpIHtcbiAgICAgICAgICB0aGlzLmFkZExpbmVGaWx0ZXIoYmFzZVByZWZpeGVkRnVsbFBhdGggfHwgZnVsbFBhdGgsIGxpbmUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9hcmdzUHJlcGFyZWQgPSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhZGQgbGluZSBmaWx0ZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aCAtIEZpbGUgcGF0aC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGxpbmUgLSBMaW5lIG51bWJlci5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgYWRkTGluZUZpbHRlcihmaWxlUGF0aCwgbGluZSkge1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5yZXNvbHZlKGZpbGVQYXRoKVxuXG4gICAgaWYgKCF0aGlzLmxpbmVGaWx0ZXJzQnlGaWxlW2Z1bGxQYXRoXSkge1xuICAgICAgdGhpcy5saW5lRmlsdGVyc0J5RmlsZVtmdWxsUGF0aF0gPSBbXVxuICAgIH1cblxuICAgIGlmICghdGhpcy5saW5lRmlsdGVyc0J5RmlsZVtmdWxsUGF0aF0uaW5jbHVkZXMobGluZSkpIHtcbiAgICAgIHRoaXMubGluZUZpbHRlcnNCeUZpbGVbZnVsbFBhdGhdLnB1c2gobGluZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBzcGxpdCBsaW5lIGFyZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RBcmcgLSBUZXN0IGFyZy5cbiAgICogQHJldHVybnMge3tjbGVhbkFyZzogc3RyaW5nLCBsaW5lPzogbnVtYmVyfX0gLSBDbGVhbmVkIGFyZyBhbmQgbGluZS5cbiAgICovXG4gIHNwbGl0TGluZUFyZyh0ZXN0QXJnKSB7XG4gICAgY29uc3QgbWF0Y2ggPSB0ZXN0QXJnLm1hdGNoKC9eKC4qKTooXFxkKykkLylcblxuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIHJldHVybiB7Y2xlYW5Bcmc6IHRlc3RBcmd9XG4gICAgfVxuXG4gICAgY29uc3QgbGluZSA9IE51bWJlcihtYXRjaFsyXSlcblxuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKGxpbmUpKSB7XG4gICAgICByZXR1cm4ge2NsZWFuQXJnOiB0ZXN0QXJnfVxuICAgIH1cblxuICAgIHJldHVybiB7Y2xlYW5Bcmc6IG1hdGNoWzFdLCBsaW5lfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZW5zdXJlIHRyYWlsaW5nIHNsYXNoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9jYWxQYXRoIC0gTG9jYWwgcGF0aC5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBOb3JtYWxpemVkIGxvY2FsIHBhdGggd2l0aCB0cmFpbGluZyBzbGFzaC5cbiAgICovXG4gIGVuc3VyZVRyYWlsaW5nU2xhc2gobG9jYWxQYXRoKSB7XG4gICAgaWYgKGxvY2FsUGF0aCA9PT0gXCJcIikgcmV0dXJuIGxvY2FsUGF0aFxuICAgIHJldHVybiBsb2NhbFBhdGguZW5kc1dpdGgoXCIvXCIpID8gbG9jYWxQYXRoIDogYCR7bG9jYWxQYXRofS9gXG4gIH1cblxuICAvKipcbiAgICogUnVucyB0byBsb2NhbCBwYXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZnVsbFBhdGggLSBGdWxsIHBhdGguXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gTG9jYWwgcGF0aCByZWxhdGl2ZSB0byB0aGUgYmFzZSBkaXJlY3RvcnkuXG4gICAqL1xuICB0b0xvY2FsUGF0aChmdWxsUGF0aCkge1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUodGhpcy5kaXJlY3RvcnksIGZ1bGxQYXRoKVxuICAgIHJldHVybiByZWxhdGl2ZVBhdGguc3BsaXQocGF0aC5zZXApLmpvaW4oXCIvXCIpXG4gIH1cbn1cbiJdfQ==
|
|
310
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1maWxlcy1maW5kZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy90ZXN0LWZpbGVzLWZpbmRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzVCLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQTtBQUV2QixPQUFPLFVBQVUsTUFBTSx5QkFBeUIsQ0FBQTtBQUNoRCxPQUFPLE1BQU0sTUFBTSxjQUFjLENBQUE7QUFDakMsT0FBTyxhQUFhLE1BQU0sNkJBQTZCLENBQUE7QUFFdkQsaUhBQWlIO0FBQ2pILE1BQU0sQ0FBQyxPQUFPLE9BQU8sZUFBZTtJQUNsQyxNQUFNLENBQUMsYUFBYSxHQUFHLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFBO0lBRS9DOzs7Ozs7T0FNRztJQUNILFlBQVksRUFBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxHQUFHLFFBQVEsRUFBQztRQUM1RCxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ3hDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7UUFFOUIsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtRQUNwRSxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxXQUFXLEdBQUc7Z0JBQ2pCLEdBQUcsSUFBSSxDQUFDLFNBQVMsWUFBWTtnQkFDN0IsR0FBRyxJQUFJLENBQUMsU0FBUyxRQUFRO2dCQUN6QixHQUFHLElBQUksQ0FBQyxT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UUFDbEIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUUzQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxPQUFPLEVBQUMsUUFBUSxFQUFFLE9BQU8sRUFBQyxDQUFBO1FBQzVCLENBQUM7UUFFRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMzQixPQUFPLEVBQUMsUUFBUSxFQUFFLE9BQU8sRUFBQyxDQUFBO1FBQzVCLENBQUM7UUFFRCxPQUFPLEVBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUMsQ0FBQTtJQUNuQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILG1CQUFtQixDQUFDLFNBQVM7UUFDM0IsSUFBSSxTQUFTLEtBQUssRUFBRTtZQUFFLE9BQU8sU0FBUyxDQUFBO1FBQ3RDLE9BQU8sU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsR0FBRyxDQUFBO0lBQzlELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsV0FBVyxDQUFDLFFBQVE7UUFDbEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQzVELE9BQU8sWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQy9DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IGZzIGZyb20gXCJmcy9wcm9taXNlc1wiXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5cbmltcG9ydCBmaWxlRXhpc3RzIGZyb20gXCIuLi91dGlscy9maWxlLWV4aXN0cy5qc1wiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi9sb2dnZXIuanNcIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4uL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5cbi8vIEluY3JlZGlibHkgY29tcGxleCBjbGFzcyB0byBmaW5kIGZpbGVzIGluIG11bHRpcGxlIHNpbXVsdGFuaW91cyBydW5uaW5nIHByb21pc2VzIHRvIGRvIGl0IGFzIGZhc3QgYXMgcG9zc2libGUuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZXN0RmlsZXNGaW5kZXIge1xuICBzdGF0aWMgSUdOT1JFRF9OQU1FUyA9IFtcIi5naXRcIiwgXCJub2RlX21vZHVsZXNcIl1cblxuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZGlyZWN0b3J5IC0gRGlyZWN0b3J5IHBhdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFthcmdzLmRpcmVjdG9yaWVzXSAtIERpcmVjdG9yaWVzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzLnByb2Nlc3NBcmdzIC0gUHJvY2VzcyBhcmdzLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2RpcmVjdG9yeSwgZGlyZWN0b3JpZXMsIHByb2Nlc3NBcmdzLCAuLi5yZXN0QXJnc30pIHtcbiAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuXG4gICAgdGhpcy5kaXJlY3RvcnkgPSBwYXRoLnJlc29sdmUoZGlyZWN0b3J5KVxuICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlcih0aGlzKVxuXG4gICAgaWYgKGRpcmVjdG9yaWVzKSB7XG4gICAgICB0aGlzLmRpcmVjdG9yaWVzID0gZGlyZWN0b3JpZXMubWFwKChlbnRyeSkgPT4gcGF0aC5yZXNvbHZlKGVudHJ5KSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXJlY3RvcmllcyA9IFtcbiAgICAgICAgYCR7dGhpcy5kaXJlY3Rvcnl9L19fdGVzdHNfX2AsXG4gICAgICAgIGAke3RoaXMuZGlyZWN0b3J5fS90ZXN0c2AsXG4gICAgICAgIGAke3RoaXMuZGlyZWN0b3J5fS9zcGVjYFxuICAgICAgXVxuICAgIH1cblxuICAgIHRoaXMuZmluZGluZ0NvdW50ID0gMFxuICAgIHRoaXMucHJvY2Vzc0FyZ3MgPSBwcm9jZXNzQXJnc1xuXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICB0aGlzLmZvdW5kRmlsZXMgPSBbXVxuXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAqIEB0eXBlIHtSZWNvcmQ8bnVtYmVyLCBQcm9taXNlPHZvaWQ+Pn0gKi9cbiAgICB0aGlzLmZpbmRpbmdQcm9taXNlcyA9IHt9XG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge3N0cmluZ1tdfSAqL1xuICAgIHRoaXMudGVzdEFyZ3MgPSB0aGlzLnByb2Nlc3NBcmdzLmZpbHRlcigocHJvY2Vzc0FyZywgaW5kZXgpID0+IGluZGV4ICE9IDApXG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge3N0cmluZ1tdfSAqL1xuICAgIHRoaXMuZGlyZWN0b3J5QXJncyA9IFtdXG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge3N0cmluZ1tdfSAqL1xuICAgIHRoaXMuZGlyZWN0b3J5RnVsbFBhdGhzID0gW11cblxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nW119ICovXG4gICAgdGhpcy5maWxlQXJncyA9IFtdXG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge3N0cmluZ1tdfSAqL1xuICAgIHRoaXMuZXhwbGljaXRGaWxlcyA9IFtdXG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsIG51bWJlcltdPn0gKi9cbiAgICB0aGlzLmxpbmVGaWx0ZXJzQnlGaWxlID0ge31cblxuICAgIHRoaXMuX2FyZ3NQcmVwYXJlZCA9IGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmaW5kIHRlc3QgZmlsZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gLSBSZXNvbHZlcyB3aXRoIHRoZSB0ZXN0IGZpbGVzLlxuICAgKi9cbiAgYXN5bmMgZmluZFRlc3RGaWxlcygpIHtcbiAgICBhd2FpdCB0aGlzLnByZXBhcmVBcmdzKClcblxuICAgIGlmICh0aGlzLmV4cGxpY2l0RmlsZXMubGVuZ3RoID4gMCAmJiB0aGlzLmRpcmVjdG9yeUFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KHRoaXMuZXhwbGljaXRGaWxlcykpXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy53aXRoRmluZGluZ0NvdW50KGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGhhc0V4cGxpY2l0QXJncyA9IHRoaXMuZGlyZWN0b3J5RnVsbFBhdGhzLmxlbmd0aCA+IDAgfHwgdGhpcy5maWxlQXJncy5sZW5ndGggPiAwXG4gICAgICBjb25zdCBkaXJlY3Rvcmllc1RvU2NhbiA9IGhhc0V4cGxpY2l0QXJncyA/IHRoaXMuZGlyZWN0b3J5RnVsbFBhdGhzIDogdGhpcy5kaXJlY3Rvcmllc1xuXG4gICAgICBmb3IgKGNvbnN0IGRpcmVjdG9yeSBvZiBkaXJlY3Rvcmllc1RvU2Nhbikge1xuICAgICAgICBpZiAoYXdhaXQgZmlsZUV4aXN0cyhkaXJlY3RvcnkpKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5maW5kVGVzdEZpbGVzSW5EaXIoZGlyZWN0b3J5KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcblxuICAgIGF3YWl0IHRoaXMud2FpdEZvckZpbmRpbmdQcm9taXNlcygpXG5cbiAgICBpZiAodGhpcy5leHBsaWNpdEZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZm91bmRGaWxlcy5wdXNoKC4uLnRoaXMuZXhwbGljaXRGaWxlcylcbiAgICB9XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KHRoaXMuZm91bmRGaWxlcykpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgbGluZSBmaWx0ZXJzIGJ5IGZpbGUuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXJbXT59IC0gTGluZSBmaWx0ZXJzIGJ5IGZpbGUuXG4gICAqL1xuICBnZXRMaW5lRmlsdGVyc0J5RmlsZSgpIHsgcmV0dXJuIHRoaXMubGluZUZpbHRlcnNCeUZpbGUgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZpbmRpbmcgcHJvbWlzZXMgbGVuZ3RoLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSAtIFRoZSBpbmcgcHJvbWlzZXMgbGVuZ3RoLlxuICAgKi9cbiAgZmluZGluZ1Byb21pc2VzTGVuZ3RoKCkgeyByZXR1cm4gT2JqZWN0LmtleXModGhpcy5maW5kaW5nUHJvbWlzZXMpLmxlbmd0aCB9XG5cbiAgYXN5bmMgd2FpdEZvckZpbmRpbmdQcm9taXNlcygpIHtcbiAgICB3aGlsZSAodGhpcy5maW5kaW5nUHJvbWlzZXNMZW5ndGgoKSA+IDApIHtcbiAgICAgIGF3YWl0IHRoaXMud2FpdEZvckZpbmRpbmdQcm9taXNlc0l0ZXJhdGlvbigpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgd2FpdCBmb3IgZmluZGluZyBwcm9taXNlcyBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyB3YWl0Rm9yRmluZGluZ1Byb21pc2VzSXRlcmF0aW9uKCkge1xuICAgIGNvbnN0IHVuZmluaXNoZWRQcm9taXNlcyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGZpbmRpbmdQcm9taXNlSWQgaW4gdGhpcy5maW5kaW5nUHJvbWlzZXMpIHtcbiAgICAgIGNvbnN0IGZpbmRpbmdQcm9taXNlID0gdGhpcy5maW5kaW5nUHJvbWlzZXNbZmluZGluZ1Byb21pc2VJZF1cblxuICAgICAgdW5maW5pc2hlZFByb21pc2VzLnB1c2goZmluZGluZ1Byb21pc2UpXG4gICAgfVxuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwodW5maW5pc2hlZFByb21pc2VzKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgd2l0aCBmaW5kaW5nIGNvdW50LlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCkgOiBQcm9taXNlPHZvaWQ+fSBjYWxsYmFjayAtIENhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgd2l0aEZpbmRpbmdDb3VudChjYWxsYmFjaykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3QgZmluZGluZ1Byb21pc2UgPSBjYWxsYmFjaygpXG4gICAgICBjb25zdCBmaW5kaW5nQ291bnQgPSB0aGlzLmZpbmRpbmdDb3VudFxuXG4gICAgICB0aGlzLmZpbmRpbmdDb3VudCArPSAxXG4gICAgICB0aGlzLmZpbmRpbmdQcm9taXNlc1tmaW5kaW5nQ291bnRdID0gZmluZGluZ1Byb21pc2VcblxuICAgICAgZmluZGluZ1Byb21pc2UuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmZpbmRpbmdQcm9taXNlc1tmaW5kaW5nQ291bnRdXG5cbiAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmaW5kIHRlc3QgZmlsZXMgaW4gZGlyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGlyIC0gRGlyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgZmluZFRlc3RGaWxlc0luRGlyKGRpcikge1xuICAgIGF3YWl0IHRoaXMud2l0aEZpbmRpbmdDb3VudChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyKVxuXG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgaWYgKFRlc3RGaWxlc0ZpbmRlci5JR05PUkVEX05BTUVTLmluY2x1ZGVzKGZpbGUpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gYCR7ZGlyfS8ke2ZpbGV9YFxuICAgICAgICBjb25zdCBsb2NhbFBhdGggPSBmdWxsUGF0aC5yZXBsYWNlKGAke3RoaXMuZGlyZWN0b3J5fS9gLCBcIlwiKVxuICAgICAgICBjb25zdCBpc0RpciA9IChhd2FpdCBmcy5zdGF0KGZ1bGxQYXRoKSkuaXNEaXJlY3RvcnkoKVxuXG4gICAgICAgIGlmIChpc0Rpcikge1xuICAgICAgICAgIHRoaXMuZmluZFRlc3RGaWxlc0luRGlyKGZ1bGxQYXRoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLmlzRmlsZU1hdGNoaW5nUmVxdWlyZW1lbnRzKGZpbGUsIGxvY2FsUGF0aCkpIHtcbiAgICAgICAgICAgIHRoaXMuZm91bmRGaWxlcy5wdXNoKGZ1bGxQYXRoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBpcyBmaWxlIG1hdGNoaW5nIHJlcXVpcmVtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGUgLSBGaWxlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9jYWxQYXRoIC0gTG9jYWwgcGF0aC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBmaWxlIG1hdGNoaW5nIHJlcXVpcmVtZW50cy5cbiAgICovXG4gIGlzRmlsZU1hdGNoaW5nUmVxdWlyZW1lbnRzKGZpbGUsIGxvY2FsUGF0aCkge1xuICAgIGlmICh0aGlzLmRpcmVjdG9yeUFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBkaXJlY3RvcnlBcmcgb2YgdGhpcy5kaXJlY3RvcnlBcmdzKSB7XG4gICAgICAgIGlmIChsb2NhbFBhdGguc3RhcnRzV2l0aChkaXJlY3RvcnlBcmcpICYmIHRoaXMubG9va3NMaWtlVGVzdEZpbGUoZmlsZSkpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcIkZvdW5kIHRlc3QgZmlsZSBiZWNhdXNlIG1hdGNoaW5nIGRpciBhbmQgbG9va3MgbGlrZSB0aGlzIGZpbGU6XCIsIGZpbGUpXG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmZpbGVBcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgZmlsZUFyZyBvZiB0aGlzLmZpbGVBcmdzKSB7XG4gICAgICAgIGlmIChmaWxlQXJnID09IGxvY2FsUGF0aCkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFwiRm91bmQgdGVzdCBmaWxlIGJlY2F1c2UgbWF0Y2hpbmcgZmlsZSBhcmc6XCIsIGZpbGUpXG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmZpbGVBcmdzLmxlbmd0aCA9PSAwICYmIHRoaXMuZGlyZWN0b3J5QXJncy5sZW5ndGggPT0gMCAmJiB0aGlzLmxvb2tzTGlrZVRlc3RGaWxlKGZpbGUpKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcIkZvdW5kIHRlc3QgZmlsZSBiZWNhdXNlIGxvb2tzIGxpa2UgdGhpcyBmaWxlOlwiLCBmaWxlKVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGxvb2tzIGxpa2UgdGVzdCBmaWxlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZSAtIEZpbGUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgbG9va3MgbGlrZSB0ZXN0IGZpbGUuXG4gICAqL1xuICBsb29rc0xpa2VUZXN0RmlsZShmaWxlKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oZmlsZS5tYXRjaCgvLShzcGVjfHRlc3QpXFwuKG18KWpzJC8pKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcHJlcGFyZSBhcmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHRlc3QgYXJncyBhcmUgcHJlcGFyZWQuXG4gICAqL1xuICBhc3luYyBwcmVwYXJlQXJncygpIHtcbiAgICBpZiAodGhpcy5fYXJnc1ByZXBhcmVkKSByZXR1cm5cblxuICAgIGZvciAoY29uc3QgdGVzdEFyZyBvZiB0aGlzLnRlc3RBcmdzKSB7XG4gICAgICBpZiAodGVzdEFyZyA9PT0gXCItLVwiKSBjb250aW51ZVxuXG4gICAgICBjb25zdCB7Y2xlYW5BcmcsIGxpbmV9ID0gdGhpcy5zcGxpdExpbmVBcmcodGVzdEFyZylcbiAgICAgIGNvbnN0IGZvcmNlRGlyZWN0b3J5ID0gdGVzdEFyZy5lbmRzV2l0aChcIi9cIikgfHwgdGVzdEFyZy5lbmRzV2l0aChwYXRoLnNlcClcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5pc0Fic29sdXRlKGNsZWFuQXJnKSA/IGNsZWFuQXJnIDogcGF0aC5yZXNvbHZlKHRoaXMuZGlyZWN0b3J5LCBjbGVhbkFyZylcbiAgICAgIGNvbnN0IGJhc2VOYW1lID0gcGF0aC5iYXNlbmFtZSh0aGlzLmRpcmVjdG9yeSlcbiAgICAgIGNvbnN0IGhhc0Jhc2VQcmVmaXggPSBjbGVhbkFyZyA9PT0gYmFzZU5hbWUgfHwgY2xlYW5Bcmcuc3RhcnRzV2l0aChgJHtiYXNlTmFtZX0vYCkgfHwgY2xlYW5Bcmcuc3RhcnRzV2l0aChgJHtiYXNlTmFtZX0ke3BhdGguc2VwfWApXG4gICAgICBjb25zdCBiYXNlUHJlZml4ZWRGdWxsUGF0aCA9ICghcGF0aC5pc0Fic29sdXRlKGNsZWFuQXJnKSAmJiBoYXNCYXNlUHJlZml4KSA/IHBhdGgucmVzb2x2ZShwYXRoLmRpcm5hbWUodGhpcy5kaXJlY3RvcnkpLCBjbGVhbkFyZykgOiBudWxsXG4gICAgICBjb25zdCBmdWxsUGF0aENhbmRpZGF0ZXMgPSBiYXNlUHJlZml4ZWRGdWxsUGF0aCA/IFtiYXNlUHJlZml4ZWRGdWxsUGF0aF0gOiBbZnVsbFBhdGhdXG5cbiAgICAgIGlmIChmb3JjZURpcmVjdG9yeSkge1xuICAgICAgICBjb25zdCBwcmVmZXJyZWRMb2NhbFBhdGggPSB0aGlzLnRvTG9jYWxQYXRoKGJhc2VQcmVmaXhlZEZ1bGxQYXRoIHx8IGZ1bGxQYXRoKVxuICAgICAgICB0aGlzLmRpcmVjdG9yeUFyZ3MucHVzaCh0aGlzLmVuc3VyZVRyYWlsaW5nU2xhc2gocHJlZmVycmVkTG9jYWxQYXRoKSlcbiAgICAgICAgdGhpcy5kaXJlY3RvcnlGdWxsUGF0aHMucHVzaChwYXRoLnJlc29sdmUoYmFzZVByZWZpeGVkRnVsbFBhdGggfHwgZnVsbFBhdGgpKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBsZXQgc3RhdHNcbiAgICAgICAgbGV0IHJlc29sdmVkRnVsbFBhdGhcblxuICAgICAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZVBhdGggb2YgZnVsbFBhdGhDYW5kaWRhdGVzKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHN0YXRzID0gYXdhaXQgZnMuc3RhdChjYW5kaWRhdGVQYXRoKVxuICAgICAgICAgICAgcmVzb2x2ZWRGdWxsUGF0aCA9IGNhbmRpZGF0ZVBhdGhcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBLZWVwIHNlYXJjaGluZ1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc3RhdHMgfHwgIXJlc29sdmVkRnVsbFBhdGgpIHRocm93IG5ldyBFcnJvcihcIlBhdGggbm90IGZvdW5kXCIpXG4gICAgICAgIGNvbnN0IGxvY2FsUGF0aCA9IHRoaXMudG9Mb2NhbFBhdGgocmVzb2x2ZWRGdWxsUGF0aClcblxuICAgICAgICBpZiAoc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgIHRoaXMuZGlyZWN0b3J5QXJncy5wdXNoKHRoaXMuZW5zdXJlVHJhaWxpbmdTbGFzaChsb2NhbFBhdGgpKVxuICAgICAgICAgIHRoaXMuZGlyZWN0b3J5RnVsbFBhdGhzLnB1c2gocmVzb2x2ZWRGdWxsUGF0aClcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0cy5pc0ZpbGUoKSkge1xuICAgICAgICAgIHRoaXMuZmlsZUFyZ3MucHVzaChsb2NhbFBhdGgpXG4gICAgICAgICAgdGhpcy5leHBsaWNpdEZpbGVzLnB1c2gocmVzb2x2ZWRGdWxsUGF0aClcblxuICAgICAgICAgIGlmIChsaW5lKSB7XG4gICAgICAgICAgICB0aGlzLmFkZExpbmVGaWx0ZXIocmVzb2x2ZWRGdWxsUGF0aCwgbGluZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zdCBmYWxsYmFja0xvY2FsUGF0aCA9IHRoaXMudG9Mb2NhbFBhdGgoYmFzZVByZWZpeGVkRnVsbFBhdGggfHwgZnVsbFBhdGgpXG4gICAgICAgIHRoaXMuZmlsZUFyZ3MucHVzaChmYWxsYmFja0xvY2FsUGF0aClcblxuICAgICAgICBpZiAobGluZSkge1xuICAgICAgICAgIHRoaXMuYWRkTGluZUZpbHRlcihiYXNlUHJlZml4ZWRGdWxsUGF0aCB8fCBmdWxsUGF0aCwgbGluZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2FyZ3NQcmVwYXJlZCA9IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFkZCBsaW5lIGZpbHRlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoIC0gRmlsZSBwYXRoLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbGluZSAtIExpbmUgbnVtYmVyLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBhZGRMaW5lRmlsdGVyKGZpbGVQYXRoLCBsaW5lKSB7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLnJlc29sdmUoZmlsZVBhdGgpXG5cbiAgICBpZiAoIXRoaXMubGluZUZpbHRlcnNCeUZpbGVbZnVsbFBhdGhdKSB7XG4gICAgICB0aGlzLmxpbmVGaWx0ZXJzQnlGaWxlW2Z1bGxQYXRoXSA9IFtdXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmxpbmVGaWx0ZXJzQnlGaWxlW2Z1bGxQYXRoXS5pbmNsdWRlcyhsaW5lKSkge1xuICAgICAgdGhpcy5saW5lRmlsdGVyc0J5RmlsZVtmdWxsUGF0aF0ucHVzaChsaW5lKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNwbGl0IGxpbmUgYXJnLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdEFyZyAtIFRlc3QgYXJnLlxuICAgKiBAcmV0dXJucyB7e2NsZWFuQXJnOiBzdHJpbmcsIGxpbmU/OiBudW1iZXJ9fSAtIENsZWFuZWQgYXJnIGFuZCBsaW5lLlxuICAgKi9cbiAgc3BsaXRMaW5lQXJnKHRlc3RBcmcpIHtcbiAgICBjb25zdCBtYXRjaCA9IHRlc3RBcmcubWF0Y2goL14oLiopOihcXGQrKSQvKVxuXG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgcmV0dXJuIHtjbGVhbkFyZzogdGVzdEFyZ31cbiAgICB9XG5cbiAgICBjb25zdCBsaW5lID0gTnVtYmVyKG1hdGNoWzJdKVxuXG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobGluZSkpIHtcbiAgICAgIHJldHVybiB7Y2xlYW5Bcmc6IHRlc3RBcmd9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtjbGVhbkFyZzogbWF0Y2hbMV0sIGxpbmV9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBlbnN1cmUgdHJhaWxpbmcgc2xhc2guXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhbFBhdGggLSBMb2NhbCBwYXRoLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIE5vcm1hbGl6ZWQgbG9jYWwgcGF0aCB3aXRoIHRyYWlsaW5nIHNsYXNoLlxuICAgKi9cbiAgZW5zdXJlVHJhaWxpbmdTbGFzaChsb2NhbFBhdGgpIHtcbiAgICBpZiAobG9jYWxQYXRoID09PSBcIlwiKSByZXR1cm4gbG9jYWxQYXRoXG4gICAgcmV0dXJuIGxvY2FsUGF0aC5lbmRzV2l0aChcIi9cIikgPyBsb2NhbFBhdGggOiBgJHtsb2NhbFBhdGh9L2BcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRvIGxvY2FsIHBhdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmdWxsUGF0aCAtIEZ1bGwgcGF0aC5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBMb2NhbCBwYXRoIHJlbGF0aXZlIHRvIHRoZSBiYXNlIGRpcmVjdG9yeS5cbiAgICovXG4gIHRvTG9jYWxQYXRoKGZ1bGxQYXRoKSB7XG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZSh0aGlzLmRpcmVjdG9yeSwgZnVsbFBhdGgpXG4gICAgcmV0dXJuIHJlbGF0aXZlUGF0aC5zcGxpdChwYXRoLnNlcCkuam9pbihcIi9cIilcbiAgfVxufVxuIl19
|