@aerokit/sdk 12.44.0
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/LICENSE +277 -0
- package/README.md +170 -0
- package/dist/cjs/bpm/deployer.js +57 -0
- package/dist/cjs/bpm/index.js +35 -0
- package/dist/cjs/bpm/process.js +636 -0
- package/dist/cjs/bpm/tasks.js +973 -0
- package/dist/cjs/bpm/values.js +82 -0
- package/dist/cjs/cache/cache.js +64 -0
- package/dist/cjs/cache/index.js +26 -0
- package/dist/cjs/cms/cmis.js +689 -0
- package/dist/cjs/cms/index.js +26 -0
- package/dist/cjs/component/decorators.js +126 -0
- package/dist/cjs/component/index.js +36 -0
- package/dist/cjs/core/configurations.js +110 -0
- package/dist/cjs/core/context.js +47 -0
- package/dist/cjs/core/env.js +45 -0
- package/dist/cjs/core/globals.js +54 -0
- package/dist/cjs/core/index.js +35 -0
- package/dist/cjs/db/dao.js +795 -0
- package/dist/cjs/db/database.js +904 -0
- package/dist/cjs/db/decorators.js +167 -0
- package/dist/cjs/db/index.js +72 -0
- package/dist/cjs/db/insert.js +51 -0
- package/dist/cjs/db/orm.js +245 -0
- package/dist/cjs/db/ormstatements.js +243 -0
- package/dist/cjs/db/procedure.js +112 -0
- package/dist/cjs/db/query.js +57 -0
- package/dist/cjs/db/repository.js +148 -0
- package/dist/cjs/db/sequence.js +59 -0
- package/dist/cjs/db/sql.js +516 -0
- package/dist/cjs/db/store.js +172 -0
- package/dist/cjs/db/translator.js +100 -0
- package/dist/cjs/db/update.js +43 -0
- package/dist/cjs/etcd/client.js +174 -0
- package/dist/cjs/etcd/index.js +26 -0
- package/dist/cjs/extensions/decorators.js +40 -0
- package/dist/cjs/extensions/extensions.js +108 -0
- package/dist/cjs/extensions/index.js +39 -0
- package/dist/cjs/git/client.js +277 -0
- package/dist/cjs/git/index.js +26 -0
- package/dist/cjs/http/client-async.js +224 -0
- package/dist/cjs/http/client.js +145 -0
- package/dist/cjs/http/decorators.js +76 -0
- package/dist/cjs/http/errors/ForbiddenError.js +41 -0
- package/dist/cjs/http/errors/ValidationError.js +41 -0
- package/dist/cjs/http/errors.js +26 -0
- package/dist/cjs/http/index.js +59 -0
- package/dist/cjs/http/request.js +281 -0
- package/dist/cjs/http/response.js +452 -0
- package/dist/cjs/http/rs/resource-common.js +32 -0
- package/dist/cjs/http/rs/resource-http-controller.js +306 -0
- package/dist/cjs/http/rs/resource-mappings.js +130 -0
- package/dist/cjs/http/rs/resource-method.js +218 -0
- package/dist/cjs/http/rs/resource.js +232 -0
- package/dist/cjs/http/rs.js +31 -0
- package/dist/cjs/http/session.js +124 -0
- package/dist/cjs/http/upload.js +144 -0
- package/dist/cjs/http/utils.js +106 -0
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/indexing/index.js +29 -0
- package/dist/cjs/indexing/searcher.js +70 -0
- package/dist/cjs/indexing/writer.js +45 -0
- package/dist/cjs/integrations/index.js +26 -0
- package/dist/cjs/integrations/integrations.js +55 -0
- package/dist/cjs/io/bytes.js +101 -0
- package/dist/cjs/io/files.js +344 -0
- package/dist/cjs/io/image.js +43 -0
- package/dist/cjs/io/index.js +38 -0
- package/dist/cjs/io/streams.js +243 -0
- package/dist/cjs/io/zip.js +251 -0
- package/dist/cjs/job/decorators.js +40 -0
- package/dist/cjs/job/index.js +39 -0
- package/dist/cjs/job/scheduler.js +347 -0
- package/dist/cjs/junit/index.js +18 -0
- package/dist/cjs/junit/junit.js +67 -0
- package/dist/cjs/kafka/consumer.js +70 -0
- package/dist/cjs/kafka/index.js +29 -0
- package/dist/cjs/kafka/producer.js +70 -0
- package/dist/cjs/log/index.js +26 -0
- package/dist/cjs/log/logging.js +174 -0
- package/dist/cjs/mail/client.js +153 -0
- package/dist/cjs/mail/index.js +26 -0
- package/dist/cjs/messaging/consumer.js +83 -0
- package/dist/cjs/messaging/decorators.js +40 -0
- package/dist/cjs/messaging/index.js +42 -0
- package/dist/cjs/messaging/producer.js +81 -0
- package/dist/cjs/mongodb/client.js +627 -0
- package/dist/cjs/mongodb/dao.js +390 -0
- package/dist/cjs/mongodb/index.js +36 -0
- package/dist/cjs/net/decorators.js +40 -0
- package/dist/cjs/net/index.js +42 -0
- package/dist/cjs/net/soap.js +228 -0
- package/dist/cjs/net/websockets.js +151 -0
- package/dist/cjs/net/wrappers/onClose.js +2 -0
- package/dist/cjs/net/wrappers/onError.js +2 -0
- package/dist/cjs/net/wrappers/onMessage.js +2 -0
- package/dist/cjs/net/wrappers/onOpen.js +2 -0
- package/dist/cjs/pdf/index.js +26 -0
- package/dist/cjs/pdf/pdf.js +160 -0
- package/dist/cjs/platform/command.js +47 -0
- package/dist/cjs/platform/engines.js +70 -0
- package/dist/cjs/platform/index.js +47 -0
- package/dist/cjs/platform/lifecycle.js +49 -0
- package/dist/cjs/platform/os.js +51 -0
- package/dist/cjs/platform/problems.js +127 -0
- package/dist/cjs/platform/registry.js +319 -0
- package/dist/cjs/platform/repository.js +498 -0
- package/dist/cjs/platform/workspace.js +574 -0
- package/dist/cjs/qldb/index.js +26 -0
- package/dist/cjs/qldb/qldb.js +24 -0
- package/dist/cjs/rabbitmq/consumer.js +50 -0
- package/dist/cjs/rabbitmq/index.js +29 -0
- package/dist/cjs/rabbitmq/producer.js +38 -0
- package/dist/cjs/redis/client.js +190 -0
- package/dist/cjs/redis/index.js +26 -0
- package/dist/cjs/security/decorators.js +48 -0
- package/dist/cjs/security/index.js +40 -0
- package/dist/cjs/security/oauth.js +75 -0
- package/dist/cjs/security/user.js +88 -0
- package/dist/cjs/template/engines.js +139 -0
- package/dist/cjs/template/index.js +26 -0
- package/dist/cjs/utils/alphanumeric.js +107 -0
- package/dist/cjs/utils/base64.js +104 -0
- package/dist/cjs/utils/converter.js +78 -0
- package/dist/cjs/utils/digest.js +167 -0
- package/dist/cjs/utils/escape.js +160 -0
- package/dist/cjs/utils/hex.js +104 -0
- package/dist/cjs/utils/index.js +68 -0
- package/dist/cjs/utils/jsonpath.js +489 -0
- package/dist/cjs/utils/qrcode.js +41 -0
- package/dist/cjs/utils/url.js +82 -0
- package/dist/cjs/utils/utf8.js +61 -0
- package/dist/cjs/utils/uuid.js +48 -0
- package/dist/cjs/utils/xml.js +57 -0
- package/dist/dts/bpm/deployer.d.ts +29 -0
- package/dist/dts/bpm/index.d.ts +8 -0
- package/dist/dts/bpm/process.d.ts +433 -0
- package/dist/dts/bpm/tasks.d.ts +2022 -0
- package/dist/dts/bpm/values.d.ts +38 -0
- package/dist/dts/cache/cache.d.ts +30 -0
- package/dist/dts/cache/index.d.ts +2 -0
- package/dist/dts/cms/cmis.d.ts +413 -0
- package/dist/dts/cms/index.d.ts +2 -0
- package/dist/dts/component/decorators.d.ts +52 -0
- package/dist/dts/component/index.d.ts +2 -0
- package/dist/dts/core/configurations.d.ts +65 -0
- package/dist/dts/core/context.d.ts +19 -0
- package/dist/dts/core/env.d.ts +23 -0
- package/dist/dts/core/globals.d.ts +30 -0
- package/dist/dts/core/index.d.ts +8 -0
- package/dist/dts/db/dao.d.ts +8 -0
- package/dist/dts/db/database.d.ts +507 -0
- package/dist/dts/db/decorators.d.ts +89 -0
- package/dist/dts/db/index.d.ts +25 -0
- package/dist/dts/db/insert.d.ts +32 -0
- package/dist/dts/db/orm.d.ts +44 -0
- package/dist/dts/db/ormstatements.d.ts +4 -0
- package/dist/dts/db/procedure.d.ts +25 -0
- package/dist/dts/db/query.d.ts +48 -0
- package/dist/dts/db/repository.d.ts +64 -0
- package/dist/dts/db/sequence.d.ts +34 -0
- package/dist/dts/db/sql.d.ts +267 -0
- package/dist/dts/db/store.d.ts +138 -0
- package/dist/dts/db/translator.d.ts +26 -0
- package/dist/dts/db/update.d.ts +21 -0
- package/dist/dts/etcd/client.d.ts +92 -0
- package/dist/dts/etcd/index.d.ts +2 -0
- package/dist/dts/extensions/decorators.d.ts +11 -0
- package/dist/dts/extensions/extensions.d.ts +41 -0
- package/dist/dts/extensions/index.d.ts +4 -0
- package/dist/dts/git/client.d.ts +478 -0
- package/dist/dts/git/index.d.ts +2 -0
- package/dist/dts/http/client-async.d.ts +158 -0
- package/dist/dts/http/client.d.ts +180 -0
- package/dist/dts/http/decorators.d.ts +11 -0
- package/dist/dts/http/errors/ForbiddenError.d.ts +20 -0
- package/dist/dts/http/errors/ValidationError.d.ts +20 -0
- package/dist/dts/http/errors.d.ts +2 -0
- package/dist/dts/http/index.d.ts +16 -0
- package/dist/dts/http/request.d.ts +158 -0
- package/dist/dts/http/response.d.ts +281 -0
- package/dist/dts/http/rs/resource-common.d.ts +11 -0
- package/dist/dts/http/rs/resource-http-controller.d.ts +43 -0
- package/dist/dts/http/rs/resource-mappings.d.ts +70 -0
- package/dist/dts/http/rs/resource-method.d.ts +206 -0
- package/dist/dts/http/rs/resource.d.ts +126 -0
- package/dist/dts/http/rs.d.ts +4 -0
- package/dist/dts/http/session.d.ts +81 -0
- package/dist/dts/http/upload.d.ts +100 -0
- package/dist/dts/http/utils.d.ts +54 -0
- package/dist/dts/index.d.ts +0 -0
- package/dist/dts/indexing/index.d.ts +4 -0
- package/dist/dts/indexing/searcher.d.ts +47 -0
- package/dist/dts/indexing/writer.d.ts +22 -0
- package/dist/dts/integrations/index.d.ts +2 -0
- package/dist/dts/integrations/integrations.d.ts +118 -0
- package/dist/dts/io/bytes.d.ts +56 -0
- package/dist/dts/io/files.d.ts +261 -0
- package/dist/dts/io/image.d.ts +22 -0
- package/dist/dts/io/index.d.ts +10 -0
- package/dist/dts/io/streams.d.ts +172 -0
- package/dist/dts/io/zip.d.ts +178 -0
- package/dist/dts/job/decorators.d.ts +11 -0
- package/dist/dts/job/index.d.ts +4 -0
- package/dist/dts/job/scheduler.d.ts +250 -0
- package/dist/dts/junit/index.d.ts +1 -0
- package/dist/dts/junit/junit.d.ts +50 -0
- package/dist/dts/kafka/consumer.d.ts +48 -0
- package/dist/dts/kafka/index.d.ts +4 -0
- package/dist/dts/kafka/producer.d.ts +50 -0
- package/dist/dts/log/index.d.ts +2 -0
- package/dist/dts/log/logging.d.ts +102 -0
- package/dist/dts/mail/client.d.ts +90 -0
- package/dist/dts/mail/index.d.ts +2 -0
- package/dist/dts/messaging/consumer.d.ts +61 -0
- package/dist/dts/messaging/decorators.d.ts +11 -0
- package/dist/dts/messaging/index.d.ts +6 -0
- package/dist/dts/messaging/producer.d.ts +59 -0
- package/dist/dts/mongodb/client.d.ts +367 -0
- package/dist/dts/mongodb/dao.d.ts +24 -0
- package/dist/dts/mongodb/index.d.ts +2 -0
- package/dist/dts/net/decorators.d.ts +11 -0
- package/dist/dts/net/index.d.ts +6 -0
- package/dist/dts/net/soap.d.ts +115 -0
- package/dist/dts/net/websockets.d.ts +100 -0
- package/dist/dts/net/wrappers/onClose.d.ts +0 -0
- package/dist/dts/net/wrappers/onError.d.ts +0 -0
- package/dist/dts/net/wrappers/onMessage.d.ts +0 -0
- package/dist/dts/net/wrappers/onOpen.d.ts +0 -0
- package/dist/dts/pdf/index.d.ts +2 -0
- package/dist/dts/pdf/pdf.d.ts +72 -0
- package/dist/dts/platform/command.d.ts +41 -0
- package/dist/dts/platform/engines.d.ts +35 -0
- package/dist/dts/platform/index.d.ts +16 -0
- package/dist/dts/platform/lifecycle.d.ts +22 -0
- package/dist/dts/platform/os.d.ts +23 -0
- package/dist/dts/platform/problems.d.ts +114 -0
- package/dist/dts/platform/registry.d.ts +227 -0
- package/dist/dts/platform/repository.d.ts +354 -0
- package/dist/dts/platform/workspace.d.ts +421 -0
- package/dist/dts/qldb/index.d.ts +2 -0
- package/dist/dts/qldb/qldb.d.ts +1 -0
- package/dist/dts/rabbitmq/consumer.d.ts +25 -0
- package/dist/dts/rabbitmq/index.d.ts +4 -0
- package/dist/dts/rabbitmq/producer.d.ts +15 -0
- package/dist/dts/redis/client.d.ts +134 -0
- package/dist/dts/redis/index.d.ts +2 -0
- package/dist/dts/security/decorators.d.ts +4 -0
- package/dist/dts/security/index.d.ts +5 -0
- package/dist/dts/security/oauth.d.ts +39 -0
- package/dist/dts/security/user.d.ts +51 -0
- package/dist/dts/template/engines.d.ts +98 -0
- package/dist/dts/template/index.d.ts +2 -0
- package/dist/dts/utils/alphanumeric.d.ts +39 -0
- package/dist/dts/utils/base64.d.ts +48 -0
- package/dist/dts/utils/converter.d.ts +44 -0
- package/dist/dts/utils/digest.d.ts +50 -0
- package/dist/dts/utils/escape.d.ts +110 -0
- package/dist/dts/utils/hex.d.ts +48 -0
- package/dist/dts/utils/index.d.ts +23 -0
- package/dist/dts/utils/jsonpath.d.ts +22 -0
- package/dist/dts/utils/qrcode.d.ts +16 -0
- package/dist/dts/utils/url.d.ts +50 -0
- package/dist/dts/utils/utf8.d.ts +33 -0
- package/dist/dts/utils/uuid.d.ts +21 -0
- package/dist/dts/utils/xml.d.ts +22 -0
- package/dist/esm/bpm/deployer.mjs +38 -0
- package/dist/esm/bpm/index.mjs +15 -0
- package/dist/esm/bpm/process.mjs +617 -0
- package/dist/esm/bpm/tasks.mjs +954 -0
- package/dist/esm/bpm/values.mjs +63 -0
- package/dist/esm/cache/cache.mjs +45 -0
- package/dist/esm/cache/index.mjs +6 -0
- package/dist/esm/cms/cmis.mjs +660 -0
- package/dist/esm/cms/index.mjs +6 -0
- package/dist/esm/component/decorators.mjs +107 -0
- package/dist/esm/component/index.mjs +6 -0
- package/dist/esm/core/configurations.mjs +91 -0
- package/dist/esm/core/context.mjs +28 -0
- package/dist/esm/core/env.mjs +26 -0
- package/dist/esm/core/globals.mjs +35 -0
- package/dist/esm/core/index.mjs +15 -0
- package/dist/esm/db/dao.mjs +775 -0
- package/dist/esm/db/database.mjs +885 -0
- package/dist/esm/db/decorators.mjs +148 -0
- package/dist/esm/db/index.mjs +42 -0
- package/dist/esm/db/insert.mjs +32 -0
- package/dist/esm/db/orm.mjs +225 -0
- package/dist/esm/db/ormstatements.mjs +223 -0
- package/dist/esm/db/procedure.mjs +93 -0
- package/dist/esm/db/query.mjs +38 -0
- package/dist/esm/db/repository.mjs +129 -0
- package/dist/esm/db/sequence.mjs +40 -0
- package/dist/esm/db/sql.mjs +497 -0
- package/dist/esm/db/store.mjs +153 -0
- package/dist/esm/db/translator.mjs +81 -0
- package/dist/esm/db/update.mjs +24 -0
- package/dist/esm/etcd/client.mjs +155 -0
- package/dist/esm/etcd/index.mjs +6 -0
- package/dist/esm/extensions/decorators.mjs +21 -0
- package/dist/esm/extensions/extensions.mjs +89 -0
- package/dist/esm/extensions/index.mjs +9 -0
- package/dist/esm/git/client.mjs +258 -0
- package/dist/esm/git/index.mjs +6 -0
- package/dist/esm/http/client-async.mjs +205 -0
- package/dist/esm/http/client.mjs +126 -0
- package/dist/esm/http/decorators.mjs +47 -0
- package/dist/esm/http/errors/ForbiddenError.mjs +22 -0
- package/dist/esm/http/errors/ValidationError.mjs +22 -0
- package/dist/esm/http/errors.mjs +7 -0
- package/dist/esm/http/index.mjs +29 -0
- package/dist/esm/http/request.mjs +262 -0
- package/dist/esm/http/response.mjs +433 -0
- package/dist/esm/http/rs/resource-common.mjs +13 -0
- package/dist/esm/http/rs/resource-http-controller.mjs +287 -0
- package/dist/esm/http/rs/resource-mappings.mjs +111 -0
- package/dist/esm/http/rs/resource-method.mjs +199 -0
- package/dist/esm/http/rs/resource.mjs +213 -0
- package/dist/esm/http/rs.mjs +12 -0
- package/dist/esm/http/session.mjs +105 -0
- package/dist/esm/http/upload.mjs +125 -0
- package/dist/esm/http/utils.mjs +87 -0
- package/dist/esm/index.mjs +1 -0
- package/dist/esm/indexing/index.mjs +9 -0
- package/dist/esm/indexing/searcher.mjs +51 -0
- package/dist/esm/indexing/writer.mjs +26 -0
- package/dist/esm/integrations/index.mjs +6 -0
- package/dist/esm/integrations/integrations.mjs +36 -0
- package/dist/esm/io/bytes.mjs +82 -0
- package/dist/esm/io/files.mjs +325 -0
- package/dist/esm/io/image.mjs +24 -0
- package/dist/esm/io/index.mjs +18 -0
- package/dist/esm/io/streams.mjs +224 -0
- package/dist/esm/io/zip.mjs +232 -0
- package/dist/esm/job/decorators.mjs +21 -0
- package/dist/esm/job/index.mjs +9 -0
- package/dist/esm/job/scheduler.mjs +328 -0
- package/dist/esm/junit/index.mjs +2 -0
- package/dist/esm/junit/junit.mjs +48 -0
- package/dist/esm/kafka/consumer.mjs +51 -0
- package/dist/esm/kafka/index.mjs +9 -0
- package/dist/esm/kafka/producer.mjs +51 -0
- package/dist/esm/log/index.mjs +6 -0
- package/dist/esm/log/logging.mjs +155 -0
- package/dist/esm/mail/client.mjs +134 -0
- package/dist/esm/mail/index.mjs +6 -0
- package/dist/esm/messaging/consumer.mjs +64 -0
- package/dist/esm/messaging/decorators.mjs +21 -0
- package/dist/esm/messaging/index.mjs +12 -0
- package/dist/esm/messaging/producer.mjs +62 -0
- package/dist/esm/mongodb/client.mjs +608 -0
- package/dist/esm/mongodb/dao.mjs +360 -0
- package/dist/esm/mongodb/index.mjs +7 -0
- package/dist/esm/net/decorators.mjs +21 -0
- package/dist/esm/net/index.mjs +12 -0
- package/dist/esm/net/soap.mjs +209 -0
- package/dist/esm/net/websockets.mjs +132 -0
- package/dist/esm/net/wrappers/onClose.mjs +2 -0
- package/dist/esm/net/wrappers/onError.mjs +2 -0
- package/dist/esm/net/wrappers/onMessage.mjs +2 -0
- package/dist/esm/net/wrappers/onOpen.mjs +2 -0
- package/dist/esm/pdf/index.mjs +6 -0
- package/dist/esm/pdf/pdf.mjs +141 -0
- package/dist/esm/platform/command.mjs +28 -0
- package/dist/esm/platform/engines.mjs +51 -0
- package/dist/esm/platform/index.mjs +27 -0
- package/dist/esm/platform/lifecycle.mjs +30 -0
- package/dist/esm/platform/os.mjs +32 -0
- package/dist/esm/platform/problems.mjs +108 -0
- package/dist/esm/platform/registry.mjs +300 -0
- package/dist/esm/platform/repository.mjs +479 -0
- package/dist/esm/platform/workspace.mjs +555 -0
- package/dist/esm/qldb/index.mjs +6 -0
- package/dist/esm/qldb/qldb.mjs +5 -0
- package/dist/esm/rabbitmq/consumer.mjs +31 -0
- package/dist/esm/rabbitmq/index.mjs +9 -0
- package/dist/esm/rabbitmq/producer.mjs +19 -0
- package/dist/esm/redis/client.mjs +171 -0
- package/dist/esm/redis/index.mjs +6 -0
- package/dist/esm/security/decorators.mjs +29 -0
- package/dist/esm/security/index.mjs +10 -0
- package/dist/esm/security/oauth.mjs +56 -0
- package/dist/esm/security/user.mjs +69 -0
- package/dist/esm/template/engines.mjs +120 -0
- package/dist/esm/template/index.mjs +6 -0
- package/dist/esm/utils/alphanumeric.mjs +88 -0
- package/dist/esm/utils/base64.mjs +85 -0
- package/dist/esm/utils/converter.mjs +59 -0
- package/dist/esm/utils/digest.mjs +148 -0
- package/dist/esm/utils/escape.mjs +141 -0
- package/dist/esm/utils/hex.mjs +85 -0
- package/dist/esm/utils/index.mjs +38 -0
- package/dist/esm/utils/jsonpath.mjs +470 -0
- package/dist/esm/utils/qrcode.mjs +22 -0
- package/dist/esm/utils/url.mjs +63 -0
- package/dist/esm/utils/utf8.mjs +42 -0
- package/dist/esm/utils/uuid.mjs +29 -0
- package/dist/esm/utils/xml.mjs +38 -0
- package/package.json +58 -0
|
@@ -0,0 +1,904 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
var database_exports = {};
|
|
19
|
+
__export(database_exports, {
|
|
20
|
+
CallableStatement: () => CallableStatement,
|
|
21
|
+
Connection: () => Connection,
|
|
22
|
+
Database: () => Database,
|
|
23
|
+
DatabaseSystem: () => DatabaseSystem,
|
|
24
|
+
PreparedStatement: () => PreparedStatement,
|
|
25
|
+
ResultSet: () => ResultSet,
|
|
26
|
+
SQLTypes: () => SQLTypes
|
|
27
|
+
});
|
|
28
|
+
module.exports = __toCommonJS(database_exports);
|
|
29
|
+
var import_bytes = require("@aerokit/sdk/io/bytes");
|
|
30
|
+
const DatabaseFacade = Java.type("org.eclipse.dirigible.components.api.db.DatabaseFacade");
|
|
31
|
+
const DatabaseResultSetHelper = Java.type("org.eclipse.dirigible.components.data.management.helpers.DatabaseResultSetHelper");
|
|
32
|
+
const JSqlDate = Java.type("java.sql.Date");
|
|
33
|
+
const JSqlTimestamp = Java.type("java.sql.Timestamp");
|
|
34
|
+
const JSqlTime = Java.type("java.sql.Time");
|
|
35
|
+
const StringWriter = Java.type("java.io.StringWriter");
|
|
36
|
+
const WriterOutputStream = Java.type("org.apache.commons.io.output.WriterOutputStream");
|
|
37
|
+
const StandardCharsets = Java.type("java.nio.charset.StandardCharsets");
|
|
38
|
+
const SQLTypes = Object.freeze({
|
|
39
|
+
"BOOLEAN": 16,
|
|
40
|
+
"DATE": 91,
|
|
41
|
+
"TIME": 92,
|
|
42
|
+
"TIMESTAMP": 93,
|
|
43
|
+
"DOUBLE": 8,
|
|
44
|
+
"FLOAT": 6,
|
|
45
|
+
"REAL": 7,
|
|
46
|
+
"TINYINT": -6,
|
|
47
|
+
"SMALLINT": 5,
|
|
48
|
+
"INTEGER": 4,
|
|
49
|
+
"BIGINT": -5,
|
|
50
|
+
"VARCHAR": 12,
|
|
51
|
+
"CHAR": 1,
|
|
52
|
+
"CLOB": 2005,
|
|
53
|
+
"BLOB": 2004,
|
|
54
|
+
"VARBINARY": -3,
|
|
55
|
+
"DECIMAL": 3,
|
|
56
|
+
"ARRAY": 2003,
|
|
57
|
+
"NVARCHAR": -9,
|
|
58
|
+
"NCLOB": 2011,
|
|
59
|
+
"BIT": -7
|
|
60
|
+
});
|
|
61
|
+
var DatabaseSystem = /* @__PURE__ */ ((DatabaseSystem2) => {
|
|
62
|
+
DatabaseSystem2[DatabaseSystem2["UNKNOWN"] = 0] = "UNKNOWN";
|
|
63
|
+
DatabaseSystem2[DatabaseSystem2["DERBY"] = 1] = "DERBY";
|
|
64
|
+
DatabaseSystem2[DatabaseSystem2["POSTGRESQL"] = 2] = "POSTGRESQL";
|
|
65
|
+
DatabaseSystem2[DatabaseSystem2["H2"] = 3] = "H2";
|
|
66
|
+
DatabaseSystem2[DatabaseSystem2["MARIADB"] = 4] = "MARIADB";
|
|
67
|
+
DatabaseSystem2[DatabaseSystem2["HANA"] = 5] = "HANA";
|
|
68
|
+
DatabaseSystem2[DatabaseSystem2["SNOWFLAKE"] = 6] = "SNOWFLAKE";
|
|
69
|
+
DatabaseSystem2[DatabaseSystem2["MYSQL"] = 7] = "MYSQL";
|
|
70
|
+
DatabaseSystem2[DatabaseSystem2["MONGODB"] = 8] = "MONGODB";
|
|
71
|
+
DatabaseSystem2[DatabaseSystem2["SYBASE"] = 9] = "SYBASE";
|
|
72
|
+
return DatabaseSystem2;
|
|
73
|
+
})(DatabaseSystem || {});
|
|
74
|
+
function isHanaDatabase(connection) {
|
|
75
|
+
let isHanaDatabase2 = false;
|
|
76
|
+
let metadata = connection.getMetaData();
|
|
77
|
+
if (metadata !== null && metadata !== void 0) {
|
|
78
|
+
isHanaDatabase2 = metadata.getDatabaseProductName() === "HDB";
|
|
79
|
+
}
|
|
80
|
+
return isHanaDatabase2;
|
|
81
|
+
}
|
|
82
|
+
function readClobValue(value) {
|
|
83
|
+
return value ? value.getSubString(1, value.length()) : value;
|
|
84
|
+
}
|
|
85
|
+
function createClobValue(native, value) {
|
|
86
|
+
try {
|
|
87
|
+
let connection = native.getConnection();
|
|
88
|
+
if (connection === null || connection === void 0) {
|
|
89
|
+
throw new Error("Can't create new 'Clob' value as the connection is null");
|
|
90
|
+
}
|
|
91
|
+
let clob = null;
|
|
92
|
+
if (isHanaDatabase(connection)) {
|
|
93
|
+
let ps = null;
|
|
94
|
+
try {
|
|
95
|
+
ps = connection.prepareStatement("SELECT TO_CLOB (?) FROM DUMMY;");
|
|
96
|
+
ps.setString(1, value);
|
|
97
|
+
let rs = ps.executeQuery();
|
|
98
|
+
if (rs.next()) {
|
|
99
|
+
clob = rs.getClob(1);
|
|
100
|
+
}
|
|
101
|
+
} finally {
|
|
102
|
+
if (ps !== null && ps !== void 0) {
|
|
103
|
+
ps.close();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
} else {
|
|
107
|
+
clob = connection.createClob();
|
|
108
|
+
clob.setString(1, value);
|
|
109
|
+
}
|
|
110
|
+
return clob;
|
|
111
|
+
} catch (e) {
|
|
112
|
+
throw new Error(`Error occured during creation of 'Clob' value: ${e.message}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function readNClobValue(value) {
|
|
116
|
+
return value ? value.getSubString(1, value.length()) : value;
|
|
117
|
+
}
|
|
118
|
+
function createNClobValue(native, value) {
|
|
119
|
+
try {
|
|
120
|
+
let connection = native.getConnection();
|
|
121
|
+
if (connection === null || connection === void 0) {
|
|
122
|
+
throw new Error("Can't create new 'NClob' value as the connection is null");
|
|
123
|
+
}
|
|
124
|
+
let nclob = null;
|
|
125
|
+
if (isHanaDatabase(connection)) {
|
|
126
|
+
let ps = null;
|
|
127
|
+
try {
|
|
128
|
+
ps = connection.prepareStatement("SELECT TO_NCLOB (?) FROM DUMMY;");
|
|
129
|
+
ps.setString(1, value);
|
|
130
|
+
let rs = ps.executeQuery();
|
|
131
|
+
if (rs.next()) {
|
|
132
|
+
nclob = rs.getNClob(1);
|
|
133
|
+
}
|
|
134
|
+
} finally {
|
|
135
|
+
if (ps !== null && ps !== void 0) {
|
|
136
|
+
ps.close();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
} else {
|
|
140
|
+
nclob = connection.createNClob();
|
|
141
|
+
nclob.setString(1, value);
|
|
142
|
+
}
|
|
143
|
+
return nclob;
|
|
144
|
+
} catch (e) {
|
|
145
|
+
throw new Error(`Error occured during creation of 'NClob' value: ${e.message}`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
function createBlobValue(native, value) {
|
|
149
|
+
try {
|
|
150
|
+
let connection = native.getConnection();
|
|
151
|
+
if (connection === null || connection === void 0) {
|
|
152
|
+
throw new Error("Can't create new 'Blob' value as the connection is null");
|
|
153
|
+
}
|
|
154
|
+
let blob = null;
|
|
155
|
+
if (isHanaDatabase(connection)) {
|
|
156
|
+
let ps = null;
|
|
157
|
+
try {
|
|
158
|
+
ps = connection.prepareStatement("SELECT TO_BLOB (?) FROM DUMMY;");
|
|
159
|
+
ps.setBytes(1, value);
|
|
160
|
+
let rs = ps.executeQuery();
|
|
161
|
+
if (rs.next()) {
|
|
162
|
+
blob = rs.getBlob(1);
|
|
163
|
+
}
|
|
164
|
+
} finally {
|
|
165
|
+
if (ps !== null && ps !== void 0) {
|
|
166
|
+
ps.close();
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
} else {
|
|
170
|
+
blob = connection.createBlob();
|
|
171
|
+
blob.setBytes(1, value);
|
|
172
|
+
}
|
|
173
|
+
return blob;
|
|
174
|
+
} catch (e) {
|
|
175
|
+
throw new Error(`Error occured during creation of 'Clob' value: ${e.message}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
function getDateValue(value) {
|
|
179
|
+
if (typeof value === "string") {
|
|
180
|
+
return new Date(value);
|
|
181
|
+
}
|
|
182
|
+
return value;
|
|
183
|
+
}
|
|
184
|
+
class PreparedStatement {
|
|
185
|
+
constructor(native) {
|
|
186
|
+
this.native = native;
|
|
187
|
+
}
|
|
188
|
+
close() {
|
|
189
|
+
this.native.close();
|
|
190
|
+
}
|
|
191
|
+
getResultSet() {
|
|
192
|
+
return new ResultSet(this.native.getResultSet());
|
|
193
|
+
}
|
|
194
|
+
execute() {
|
|
195
|
+
return this.native.execute();
|
|
196
|
+
}
|
|
197
|
+
executeQuery() {
|
|
198
|
+
return new ResultSet(this.native.executeQuery());
|
|
199
|
+
}
|
|
200
|
+
executeUpdate() {
|
|
201
|
+
return this.native.executeUpdate();
|
|
202
|
+
}
|
|
203
|
+
setNull(index, sqlType) {
|
|
204
|
+
this.native.setNull(index, sqlType);
|
|
205
|
+
}
|
|
206
|
+
setBinaryStream(parameterIndex, inputStream, length) {
|
|
207
|
+
if (length) {
|
|
208
|
+
this.native.setBinaryStream(parameterIndex, inputStream, length);
|
|
209
|
+
} else {
|
|
210
|
+
this.native.setBinaryStream(parameterIndex, inputStream);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
setBoolean(index, value) {
|
|
214
|
+
if (value !== null && value !== void 0) {
|
|
215
|
+
this.native.setBoolean(index, value);
|
|
216
|
+
} else {
|
|
217
|
+
this.setNull(index, SQLTypes.BOOLEAN);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
setByte(index, value) {
|
|
221
|
+
if (value !== null && value !== void 0) {
|
|
222
|
+
this.native.setByte(index, value);
|
|
223
|
+
} else {
|
|
224
|
+
this.setNull(index, SQLTypes.TINYINT);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
setBlob(index, value) {
|
|
228
|
+
if (value !== null && value !== void 0) {
|
|
229
|
+
let blob = createBlobValue(this.native, value);
|
|
230
|
+
this.native.setBlob(index, blob);
|
|
231
|
+
} else {
|
|
232
|
+
this.setNull(index, SQLTypes.BLOB);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
setClob(index, value) {
|
|
236
|
+
if (value !== null && value !== void 0) {
|
|
237
|
+
let clob = createClobValue(this.native, value);
|
|
238
|
+
this.native.setClob(index, clob);
|
|
239
|
+
} else {
|
|
240
|
+
this.setNull(index, SQLTypes.CLOB);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
setNClob(index, value) {
|
|
244
|
+
if (value !== null && value !== void 0) {
|
|
245
|
+
let nclob = createNClobValue(this.native, value);
|
|
246
|
+
this.native.setNClob(index, nclob);
|
|
247
|
+
} else {
|
|
248
|
+
this.setNull(index, SQLTypes.NCLOB);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
setBytesNative(index, value) {
|
|
252
|
+
if (value !== null && value !== void 0) {
|
|
253
|
+
this.native.setBytes(index, value);
|
|
254
|
+
} else {
|
|
255
|
+
this.setNull(index, SQLTypes.VARBINARY);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
setBytes(index, value) {
|
|
259
|
+
if (value !== null && value !== void 0) {
|
|
260
|
+
var data = import_bytes.Bytes.toJavaBytes(value);
|
|
261
|
+
this.native.setBytes(index, data);
|
|
262
|
+
} else {
|
|
263
|
+
this.setNull(index, SQLTypes.VARBINARY);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
setDate(index, value) {
|
|
267
|
+
if (value !== null && value !== void 0) {
|
|
268
|
+
const date = getDateValue(value);
|
|
269
|
+
this.native.setDate(index, new JSqlDate(date.getTime()));
|
|
270
|
+
} else {
|
|
271
|
+
this.setNull(index, SQLTypes.DATE);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
setDouble(index, value) {
|
|
275
|
+
if (value !== null && value !== void 0) {
|
|
276
|
+
this.native.setDouble(index, value);
|
|
277
|
+
} else {
|
|
278
|
+
this.setNull(index, SQLTypes.DOUBLE);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
setFloat(index, value) {
|
|
282
|
+
if (value !== null && value !== void 0) {
|
|
283
|
+
this.native.setFloat(index, value);
|
|
284
|
+
} else {
|
|
285
|
+
this.setNull(index, SQLTypes.FLOAT);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
setInt(index, value) {
|
|
289
|
+
if (value !== null && value !== void 0) {
|
|
290
|
+
this.native.setInt(index, value);
|
|
291
|
+
} else {
|
|
292
|
+
this.setNull(index, SQLTypes.INTEGER);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
setLong(index, value) {
|
|
296
|
+
if (value !== null && value !== void 0) {
|
|
297
|
+
this.native.setLong(index, value);
|
|
298
|
+
} else {
|
|
299
|
+
this.setNull(index, SQLTypes.BIGINT);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
setShort(index, value) {
|
|
303
|
+
if (value !== null && value !== void 0) {
|
|
304
|
+
this.native.setShort(index, value);
|
|
305
|
+
} else {
|
|
306
|
+
this.setNull(index, SQLTypes.SMALLINT);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
setString(index, value) {
|
|
310
|
+
if (value !== null && value !== void 0) {
|
|
311
|
+
this.native.setString(index, value);
|
|
312
|
+
} else {
|
|
313
|
+
this.setNull(index, SQLTypes.VARCHAR);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
setTime(index, value) {
|
|
317
|
+
if (value !== null && value !== void 0) {
|
|
318
|
+
const date = getDateValue(value);
|
|
319
|
+
this.native.setTime(index, new JSqlTime(date.getTime()));
|
|
320
|
+
} else {
|
|
321
|
+
this.setNull(index, SQLTypes.TIME);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
setTimestamp(index, value) {
|
|
325
|
+
if (value !== null && value !== void 0) {
|
|
326
|
+
const date = getDateValue(value);
|
|
327
|
+
this.native.setTimestamp(index, new JSqlTimestamp(date.getTime()));
|
|
328
|
+
} else {
|
|
329
|
+
this.setNull(index, SQLTypes.TIMESTAMP);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
setBigDecimal(index, value) {
|
|
333
|
+
if (value !== null && value !== void 0) {
|
|
334
|
+
this.native.setBigDecimal(index, value);
|
|
335
|
+
} else {
|
|
336
|
+
this.setNull(index, SQLTypes.DECIMAL);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
setNString(index, value) {
|
|
340
|
+
if (value !== null && value !== void 0) {
|
|
341
|
+
this.native.setNString(index, value);
|
|
342
|
+
} else {
|
|
343
|
+
this.setNull(index, SQLTypes.NVARCHAR);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
addBatch() {
|
|
347
|
+
this.native.addBatch();
|
|
348
|
+
}
|
|
349
|
+
executeBatch() {
|
|
350
|
+
return this.native.executeBatch();
|
|
351
|
+
}
|
|
352
|
+
getMetaData() {
|
|
353
|
+
return this.native.getMetaData();
|
|
354
|
+
}
|
|
355
|
+
getMoreResults() {
|
|
356
|
+
return this.native.getMoreResults();
|
|
357
|
+
}
|
|
358
|
+
getParameterMetaData() {
|
|
359
|
+
return this.native.getParameterMetaData();
|
|
360
|
+
}
|
|
361
|
+
getSQLWarning() {
|
|
362
|
+
return this.native.getWarnings();
|
|
363
|
+
}
|
|
364
|
+
isClosed() {
|
|
365
|
+
return this.native.isClosed();
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
class CallableStatement {
|
|
369
|
+
constructor(native) {
|
|
370
|
+
this.native = native;
|
|
371
|
+
}
|
|
372
|
+
getResultSet() {
|
|
373
|
+
return new ResultSet(this.native.getResultSet());
|
|
374
|
+
}
|
|
375
|
+
executeQuery() {
|
|
376
|
+
return new ResultSet(this.native.executeQuery());
|
|
377
|
+
}
|
|
378
|
+
executeUpdate() {
|
|
379
|
+
return this.native.executeUpdate();
|
|
380
|
+
}
|
|
381
|
+
registerOutParameter(parameterIndex, sqlType) {
|
|
382
|
+
this.native.registerOutParameter(parameterIndex, sqlType);
|
|
383
|
+
}
|
|
384
|
+
registerOutParameterByScale(parameterIndex, sqlType, scale) {
|
|
385
|
+
this.native.registerOutParameter(parameterIndex, sqlType, scale);
|
|
386
|
+
}
|
|
387
|
+
registerOutParameterByTypeName(parameterIndex, sqlType, typeName) {
|
|
388
|
+
this.native.registerOutParameter(parameterIndex, sqlType, typeName);
|
|
389
|
+
}
|
|
390
|
+
wasNull() {
|
|
391
|
+
return this.native.wasNull();
|
|
392
|
+
}
|
|
393
|
+
getString(parameterIndex) {
|
|
394
|
+
return this.native.getString(parameterIndex);
|
|
395
|
+
}
|
|
396
|
+
getBoolean(parameterIndex) {
|
|
397
|
+
return this.native.getBoolean(parameterIndex);
|
|
398
|
+
}
|
|
399
|
+
getByte(parameterIndex) {
|
|
400
|
+
return this.native.getByte(parameterIndex);
|
|
401
|
+
}
|
|
402
|
+
getShort(parameterIndex) {
|
|
403
|
+
return this.native.getShort(parameterIndex);
|
|
404
|
+
}
|
|
405
|
+
getInt(parameterIndex) {
|
|
406
|
+
return this.native.getInt(parameterIndex);
|
|
407
|
+
}
|
|
408
|
+
getLong(parameterIndex) {
|
|
409
|
+
return this.native.getLong(parameterIndex);
|
|
410
|
+
}
|
|
411
|
+
getFloat(parameterIndex) {
|
|
412
|
+
return this.native.getFloat(parameterIndex);
|
|
413
|
+
}
|
|
414
|
+
getDouble(parameterIndex) {
|
|
415
|
+
return this.native.getDouble(parameterIndex);
|
|
416
|
+
}
|
|
417
|
+
getDate(parameterIndex) {
|
|
418
|
+
const dateInstance = this.native.getDate(parameterIndex);
|
|
419
|
+
return dateInstance !== null && dateInstance !== void 0 ? new Date(dateInstance.getTime()) : dateInstance;
|
|
420
|
+
}
|
|
421
|
+
getTime(parameterIndex) {
|
|
422
|
+
const dateInstance = this.native.getTime(parameterIndex);
|
|
423
|
+
return dateInstance !== null && dateInstance !== void 0 ? new Date(dateInstance.getTime()) : dateInstance;
|
|
424
|
+
}
|
|
425
|
+
getTimestamp(parameterIndex) {
|
|
426
|
+
const dateInstance = this.native.getTimestamp(parameterIndex);
|
|
427
|
+
return dateInstance !== null && dateInstance !== void 0 ? new Date(dateInstance.getTime()) : dateInstance;
|
|
428
|
+
}
|
|
429
|
+
getObject(parameterIndex) {
|
|
430
|
+
return this.native.getObject(parameterIndex);
|
|
431
|
+
}
|
|
432
|
+
getBigDecimal(parameterIndex) {
|
|
433
|
+
return this.native.getBigDecimal(parameterIndex);
|
|
434
|
+
}
|
|
435
|
+
getRef(parameterIndex) {
|
|
436
|
+
return this.native.getRef(parameterIndex);
|
|
437
|
+
}
|
|
438
|
+
getBytes(parameterIndex) {
|
|
439
|
+
const data = this.native.getBytes(parameterIndex);
|
|
440
|
+
return import_bytes.Bytes.toJavaScriptBytes(data);
|
|
441
|
+
}
|
|
442
|
+
getBytesNative(parameterIndex) {
|
|
443
|
+
return this.native.getBytes(parameterIndex);
|
|
444
|
+
}
|
|
445
|
+
getBlob(parameterIndex) {
|
|
446
|
+
const data = DatabaseFacade.readBlobValue(this.native, parameterIndex);
|
|
447
|
+
return import_bytes.Bytes.toJavaScriptBytes(data);
|
|
448
|
+
}
|
|
449
|
+
getBlobNative(parameterIndex) {
|
|
450
|
+
return DatabaseFacade.readBlobValue(this.native, parameterIndex);
|
|
451
|
+
}
|
|
452
|
+
getClob(parameterIndex) {
|
|
453
|
+
return readClobValue(this.native.getClob(parameterIndex));
|
|
454
|
+
}
|
|
455
|
+
getNClob(parameterIndex) {
|
|
456
|
+
return readNClobValue(this.native.getNClob(parameterIndex));
|
|
457
|
+
}
|
|
458
|
+
getNString(parameterIndex) {
|
|
459
|
+
return this.native.getNString(parameterIndex);
|
|
460
|
+
}
|
|
461
|
+
getArray(parameterIndex) {
|
|
462
|
+
return this.native.getArray(parameterIndex);
|
|
463
|
+
}
|
|
464
|
+
getURL(parameterIndex) {
|
|
465
|
+
return this.native.getURL(parameterIndex);
|
|
466
|
+
}
|
|
467
|
+
getRowId(parameterIndex) {
|
|
468
|
+
return this.native.getRowId(parameterIndex);
|
|
469
|
+
}
|
|
470
|
+
getSQLXML(parameterIndex) {
|
|
471
|
+
return this.native.getSQLXML(parameterIndex);
|
|
472
|
+
}
|
|
473
|
+
setURL(parameterIndex, value) {
|
|
474
|
+
this.native.setURL(parameterIndex, value);
|
|
475
|
+
}
|
|
476
|
+
setNull(parameterIndex, sqlTypeStr, typeName) {
|
|
477
|
+
const sqlType = Number.isInteger(sqlTypeStr) ? sqlTypeStr : SQLTypes[sqlTypeStr];
|
|
478
|
+
if (typeName !== void 0 && typeName !== null) {
|
|
479
|
+
this.native.setNull(parameterIndex, sqlType, typeName);
|
|
480
|
+
} else {
|
|
481
|
+
this.native.setNull(parameterIndex, sqlType);
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
setBoolean(parameterIndex, value) {
|
|
485
|
+
if (value !== null && value !== void 0) {
|
|
486
|
+
this.native.setBoolean(parameterIndex, value);
|
|
487
|
+
} else {
|
|
488
|
+
this.setNull(parameterIndex, SQLTypes.BOOLEAN);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
setByte(parameterIndex, value) {
|
|
492
|
+
if (value !== null && value !== void 0) {
|
|
493
|
+
this.native.setByte(parameterIndex, value);
|
|
494
|
+
} else {
|
|
495
|
+
this.setNull(parameterIndex, SQLTypes.BIT);
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
setShort(parameterIndex, value) {
|
|
499
|
+
if (value !== null && value !== void 0) {
|
|
500
|
+
this.native.setShort(parameterIndex, value);
|
|
501
|
+
} else {
|
|
502
|
+
this.setNull(parameterIndex, SQLTypes.SMALLINT);
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
setInt(parameterIndex, value) {
|
|
506
|
+
if (value !== null && value !== void 0) {
|
|
507
|
+
this.native.setInt(parameterIndex, value);
|
|
508
|
+
} else {
|
|
509
|
+
this.setNull(parameterIndex, SQLTypes.INTEGER);
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
setLong(parameterIndex, value) {
|
|
513
|
+
if (value !== null && value !== void 0) {
|
|
514
|
+
this.native.setLong(parameterIndex, value);
|
|
515
|
+
} else {
|
|
516
|
+
this.setNull(parameterIndex, SQLTypes.BIGINT);
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
setFloat(parameterIndex, value) {
|
|
520
|
+
if (value !== null && value !== void 0) {
|
|
521
|
+
this.native.setFloat(parameterIndex, value);
|
|
522
|
+
} else {
|
|
523
|
+
this.setNull(parameterIndex, SQLTypes.FLOAT);
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
setDouble(parameterIndex, value) {
|
|
527
|
+
if (value !== null && value !== void 0) {
|
|
528
|
+
this.native.setDouble(parameterIndex, value);
|
|
529
|
+
} else {
|
|
530
|
+
this.setNull(parameterIndex, SQLTypes.DOUBLE);
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
setBigDecimal(parameterIndex, value) {
|
|
534
|
+
if (value !== null && value !== void 0) {
|
|
535
|
+
this.native.setBigDecimal(parameterIndex, value);
|
|
536
|
+
} else {
|
|
537
|
+
this.setNull(parameterIndex, SQLTypes.DECIMAL);
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
setString(parameterIndex, value) {
|
|
541
|
+
if (value !== null && value !== void 0) {
|
|
542
|
+
this.native.setString(parameterIndex, value);
|
|
543
|
+
} else {
|
|
544
|
+
this.setNull(parameterIndex, SQLTypes.VARCHAR);
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
setBytes(parameterIndex, value) {
|
|
548
|
+
if (value !== null && value !== void 0) {
|
|
549
|
+
this.native.setBytes(parameterIndex, value);
|
|
550
|
+
} else {
|
|
551
|
+
this.setNull(parameterIndex, SQLTypes.ARRAY);
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
setDate(parameterIndex, value) {
|
|
555
|
+
if (value !== null && value !== void 0) {
|
|
556
|
+
const date = getDateValue(value);
|
|
557
|
+
this.native.setDate(parameterIndex, new JSqlDate(date.getTime()));
|
|
558
|
+
} else {
|
|
559
|
+
this.setNull(parameterIndex, SQLTypes.DATE);
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
setTime(parameterIndex, value) {
|
|
563
|
+
if (value !== null && value !== void 0) {
|
|
564
|
+
const date = getDateValue(value);
|
|
565
|
+
this.native.setTime(parameterIndex, new JSqlTime(date.getTime()));
|
|
566
|
+
} else {
|
|
567
|
+
this.setNull(parameterIndex, SQLTypes.TIME);
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
setTimestamp(parameterIndex, value) {
|
|
571
|
+
if (value !== null && value !== void 0) {
|
|
572
|
+
let date = getDateValue(value);
|
|
573
|
+
this.native.setTimestamp(parameterIndex, new JSqlTimestamp(date.getTime()));
|
|
574
|
+
} else {
|
|
575
|
+
this.setNull(parameterIndex, SQLTypes.TIMESTAMP);
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
setAsciiStream(parameterIndex, inputStream, length) {
|
|
579
|
+
if (length) {
|
|
580
|
+
this.native.setAsciiStream(parameterIndex, inputStream, length);
|
|
581
|
+
} else {
|
|
582
|
+
this.native.setAsciiStream(parameterIndex, inputStream);
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
setBinaryStream(parameterIndex, inputStream, length) {
|
|
586
|
+
if (length) {
|
|
587
|
+
this.native.setBinaryStream(parameterIndex, inputStream, length);
|
|
588
|
+
} else {
|
|
589
|
+
this.native.setBinaryStream(parameterIndex, inputStream);
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
setObject(parameterIndex, value, targetSqlType, scale) {
|
|
593
|
+
if (scale !== void 0 && scale !== null && targetSqlType !== void 0 && targetSqlType !== null) {
|
|
594
|
+
this.native.setObject(parameterIndex, value, targetSqlType, scale);
|
|
595
|
+
} else if (targetSqlType !== void 0 && targetSqlType !== null) {
|
|
596
|
+
this.native.setObject(parameterIndex, value, targetSqlType);
|
|
597
|
+
} else {
|
|
598
|
+
this.native.setObject(parameterIndex, value);
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
setRowId(parameterIndex, value) {
|
|
602
|
+
this.native.setRowId(parameterIndex, value);
|
|
603
|
+
}
|
|
604
|
+
setNString(parameterIndex, value) {
|
|
605
|
+
if (value !== null && value !== void 0) {
|
|
606
|
+
this.native.setNString(parameterIndex, value);
|
|
607
|
+
} else {
|
|
608
|
+
this.setNull(parameterIndex, SQLTypes.NVARCHAR);
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
setSQLXML(parameterIndex, value) {
|
|
612
|
+
if (value !== null && value !== void 0) {
|
|
613
|
+
this.native.setSQLXML(parameterIndex, value);
|
|
614
|
+
} else {
|
|
615
|
+
throw new Error("Nullable SQLXML type not supported.");
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
setBlob(parameterIndex, value) {
|
|
619
|
+
if (value !== null && value !== void 0) {
|
|
620
|
+
const blob = createBlobValue(this.native, value);
|
|
621
|
+
this.native.setBlob(parameterIndex, blob);
|
|
622
|
+
} else {
|
|
623
|
+
this.setNull(parameterIndex, SQLTypes.BLOB);
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
setClob(parameterIndex, value) {
|
|
627
|
+
if (value !== null && value !== void 0) {
|
|
628
|
+
const clob = createClobValue(this.native, value);
|
|
629
|
+
this.native.setClob(parameterIndex, clob);
|
|
630
|
+
} else {
|
|
631
|
+
this.setNull(parameterIndex, SQLTypes.CLOB);
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
setNClob(parameterIndex, value) {
|
|
635
|
+
if (value !== null && value !== void 0) {
|
|
636
|
+
const nclob = createNClobValue(this.native, value);
|
|
637
|
+
this.native.setNClob(parameterIndex, nclob);
|
|
638
|
+
} else {
|
|
639
|
+
this.setNull(parameterIndex, SQLTypes.NCLOB);
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
execute() {
|
|
643
|
+
return this.native.execute();
|
|
644
|
+
}
|
|
645
|
+
getMoreResults() {
|
|
646
|
+
return this.native.getMoreResults();
|
|
647
|
+
}
|
|
648
|
+
getParameterMetaData() {
|
|
649
|
+
return this.native.getParameterMetaData();
|
|
650
|
+
}
|
|
651
|
+
isClosed() {
|
|
652
|
+
return this.native.isClosed();
|
|
653
|
+
}
|
|
654
|
+
close() {
|
|
655
|
+
this.native.close();
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
class ResultSet {
|
|
659
|
+
constructor(native) {
|
|
660
|
+
this.native = native;
|
|
661
|
+
}
|
|
662
|
+
/**
|
|
663
|
+
* Converts the ResultSet into a JSON array of objects.
|
|
664
|
+
* @param limited Whether to use limited JSON conversion (optimized).
|
|
665
|
+
* @param stringify Whether to return the JSON as a string or a parsed array.
|
|
666
|
+
* @returns A JavaScript array of objects representing the result set, or a string if stringify is true.
|
|
667
|
+
*/
|
|
668
|
+
toJson(limited = false, stringify = false) {
|
|
669
|
+
const sw = new StringWriter();
|
|
670
|
+
const output = WriterOutputStream.builder().setWriter(sw).setCharset(StandardCharsets.UTF_8).get();
|
|
671
|
+
DatabaseResultSetHelper.toJson(this.native, limited, stringify, output);
|
|
672
|
+
const jsonString = sw.toString();
|
|
673
|
+
return stringify ? jsonString : JSON.parse(jsonString);
|
|
674
|
+
}
|
|
675
|
+
close() {
|
|
676
|
+
this.native.close();
|
|
677
|
+
}
|
|
678
|
+
getBigDecimal(identifier) {
|
|
679
|
+
return this.native.getBigDecimal(identifier);
|
|
680
|
+
}
|
|
681
|
+
getBoolean(identifier) {
|
|
682
|
+
return this.native.getBoolean(identifier);
|
|
683
|
+
}
|
|
684
|
+
getByte(identifier) {
|
|
685
|
+
return this.native.getByte(identifier);
|
|
686
|
+
}
|
|
687
|
+
getBytes(identifier) {
|
|
688
|
+
const data = this.native.getBytes(identifier);
|
|
689
|
+
return import_bytes.Bytes.toJavaScriptBytes(data);
|
|
690
|
+
}
|
|
691
|
+
getBytesNative(identifier) {
|
|
692
|
+
return this.native.getBytes(identifier);
|
|
693
|
+
}
|
|
694
|
+
getBlob(identifier) {
|
|
695
|
+
const data = DatabaseFacade.readBlobValue(this.native, identifier);
|
|
696
|
+
return import_bytes.Bytes.toJavaScriptBytes(data);
|
|
697
|
+
}
|
|
698
|
+
getBlobNative(identifier) {
|
|
699
|
+
return DatabaseFacade.readBlobValue(this.native, identifier);
|
|
700
|
+
}
|
|
701
|
+
getClob(identifier) {
|
|
702
|
+
return readClobValue(this.native.getClob(identifier));
|
|
703
|
+
}
|
|
704
|
+
getNClob(identifier) {
|
|
705
|
+
return readNClobValue(this.native.getNClob(identifier));
|
|
706
|
+
}
|
|
707
|
+
getDate(identifier) {
|
|
708
|
+
const dateInstance = this.native.getDate(identifier);
|
|
709
|
+
return dateInstance !== null && dateInstance !== void 0 ? new Date(dateInstance.getTime()) : void 0;
|
|
710
|
+
}
|
|
711
|
+
getDouble(identifier) {
|
|
712
|
+
return this.native.getDouble(identifier);
|
|
713
|
+
}
|
|
714
|
+
getFloat(identifier) {
|
|
715
|
+
return this.native.getFloat(identifier);
|
|
716
|
+
}
|
|
717
|
+
getInt(identifier) {
|
|
718
|
+
return this.native.getInt(identifier);
|
|
719
|
+
}
|
|
720
|
+
getLong(identifier) {
|
|
721
|
+
return this.native.getLong(identifier);
|
|
722
|
+
}
|
|
723
|
+
getShort(identifier) {
|
|
724
|
+
return this.native.getShort(identifier);
|
|
725
|
+
}
|
|
726
|
+
getString(identifier) {
|
|
727
|
+
return this.native.getString(identifier);
|
|
728
|
+
}
|
|
729
|
+
getTime(identifier) {
|
|
730
|
+
const dateInstance = this.native.getTime(identifier);
|
|
731
|
+
return dateInstance !== null && dateInstance !== void 0 ? new Date(dateInstance.getTime()) : void 0;
|
|
732
|
+
}
|
|
733
|
+
getTimestamp(identifier) {
|
|
734
|
+
const dateInstance = this.native.getTimestamp(identifier);
|
|
735
|
+
return dateInstance !== null && dateInstance !== void 0 ? new Date(dateInstance.getTime()) : void 0;
|
|
736
|
+
}
|
|
737
|
+
isAfterLast() {
|
|
738
|
+
return this.native.isAfterLast();
|
|
739
|
+
}
|
|
740
|
+
isBeforeFirst() {
|
|
741
|
+
return this.native.isBeforeFirst();
|
|
742
|
+
}
|
|
743
|
+
isClosed() {
|
|
744
|
+
return this.native.isClosed();
|
|
745
|
+
}
|
|
746
|
+
isFirst() {
|
|
747
|
+
return this.native.isFirst();
|
|
748
|
+
}
|
|
749
|
+
isLast() {
|
|
750
|
+
return this.native.isLast();
|
|
751
|
+
}
|
|
752
|
+
next() {
|
|
753
|
+
return this.native.next();
|
|
754
|
+
}
|
|
755
|
+
getMetaData() {
|
|
756
|
+
return this.native.getMetaData();
|
|
757
|
+
}
|
|
758
|
+
getNString(columnIndex) {
|
|
759
|
+
return this.native.getNString(columnIndex);
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
class Connection {
|
|
763
|
+
constructor(datasourceName) {
|
|
764
|
+
this.native = DatabaseFacade.getConnection(datasourceName);
|
|
765
|
+
}
|
|
766
|
+
/**
|
|
767
|
+
* Checks if the connection is for a specific database system.
|
|
768
|
+
*/
|
|
769
|
+
isOfType(databaseSystem) {
|
|
770
|
+
return this.getDatabaseSystem() === databaseSystem;
|
|
771
|
+
}
|
|
772
|
+
/**
|
|
773
|
+
* Returns the type of the underlying database system as a {@link DatabaseSystem} enum.
|
|
774
|
+
*/
|
|
775
|
+
getDatabaseSystem() {
|
|
776
|
+
const dbSystem = this.native.getDatabaseSystem().name();
|
|
777
|
+
switch (dbSystem) {
|
|
778
|
+
case "DERBY":
|
|
779
|
+
return 1 /* DERBY */;
|
|
780
|
+
case "POSTGRESQL":
|
|
781
|
+
return 2 /* POSTGRESQL */;
|
|
782
|
+
case "H2":
|
|
783
|
+
return 3 /* H2 */;
|
|
784
|
+
case "MARIADB":
|
|
785
|
+
return 4 /* MARIADB */;
|
|
786
|
+
case "HANA":
|
|
787
|
+
return 5 /* HANA */;
|
|
788
|
+
case "SNOWFLAKE":
|
|
789
|
+
return 6 /* SNOWFLAKE */;
|
|
790
|
+
case "MYSQL":
|
|
791
|
+
return 7 /* MYSQL */;
|
|
792
|
+
case "MONGODB":
|
|
793
|
+
return 8 /* MONGODB */;
|
|
794
|
+
case "SYBASE":
|
|
795
|
+
return 9 /* SYBASE */;
|
|
796
|
+
case "UNKNOWN":
|
|
797
|
+
return 0 /* UNKNOWN */;
|
|
798
|
+
default:
|
|
799
|
+
throw new Error(`Missing mapping for database system type ${dbSystem}`);
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
/**
|
|
803
|
+
* Creates a new {@link PreparedStatement} object for sending parameterized SQL statements to the database.
|
|
804
|
+
*/
|
|
805
|
+
prepareStatement(sql) {
|
|
806
|
+
return new PreparedStatement(this.native.prepareStatement(sql));
|
|
807
|
+
}
|
|
808
|
+
/**
|
|
809
|
+
* Creates a {@link CallableStatement} object for calling database stored procedures or functions.
|
|
810
|
+
*/
|
|
811
|
+
prepareCall(sql) {
|
|
812
|
+
return new CallableStatement(this.native.prepareCall(sql));
|
|
813
|
+
}
|
|
814
|
+
close() {
|
|
815
|
+
if (!this.isClosed()) {
|
|
816
|
+
this.native.close();
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
commit() {
|
|
820
|
+
this.native.commit();
|
|
821
|
+
}
|
|
822
|
+
getAutoCommit() {
|
|
823
|
+
return this.native.getAutoCommit();
|
|
824
|
+
}
|
|
825
|
+
getCatalog() {
|
|
826
|
+
return this.native.getCatalog();
|
|
827
|
+
}
|
|
828
|
+
getSchema() {
|
|
829
|
+
return this.native.getSchema();
|
|
830
|
+
}
|
|
831
|
+
getTransactionIsolation() {
|
|
832
|
+
return this.native.getTransactionIsolation();
|
|
833
|
+
}
|
|
834
|
+
isClosed() {
|
|
835
|
+
return this.native.isClosed();
|
|
836
|
+
}
|
|
837
|
+
isReadOnly() {
|
|
838
|
+
return this.native.isReadOnly();
|
|
839
|
+
}
|
|
840
|
+
isValid() {
|
|
841
|
+
return this.native.isValid();
|
|
842
|
+
}
|
|
843
|
+
rollback() {
|
|
844
|
+
this.native.rollback();
|
|
845
|
+
}
|
|
846
|
+
setAutoCommit(autoCommit) {
|
|
847
|
+
this.native.setAutoCommit(autoCommit);
|
|
848
|
+
}
|
|
849
|
+
setCatalog(catalog) {
|
|
850
|
+
this.native.setCatalog(catalog);
|
|
851
|
+
}
|
|
852
|
+
setReadOnly(readOnly) {
|
|
853
|
+
this.native.setReadOnly(readOnly);
|
|
854
|
+
}
|
|
855
|
+
setSchema(schema) {
|
|
856
|
+
this.native.setSchema(schema);
|
|
857
|
+
}
|
|
858
|
+
setTransactionIsolation(transactionIsolation) {
|
|
859
|
+
this.native.setTransactionIsolation(transactionIsolation);
|
|
860
|
+
}
|
|
861
|
+
getMetaData() {
|
|
862
|
+
return this.native.getMetaData();
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
class Database {
|
|
866
|
+
/**
|
|
867
|
+
* Returns a list of available data source names.
|
|
868
|
+
*/
|
|
869
|
+
static getDataSources() {
|
|
870
|
+
const datasources = DatabaseFacade.getDataSources();
|
|
871
|
+
return datasources ? JSON.parse(datasources) : [];
|
|
872
|
+
}
|
|
873
|
+
/**
|
|
874
|
+
* Returns database metadata for the specified data source.
|
|
875
|
+
*/
|
|
876
|
+
static getMetadata(datasourceName) {
|
|
877
|
+
const metadata = DatabaseFacade.getMetadata(datasourceName);
|
|
878
|
+
return metadata ? JSON.parse(metadata) : void 0;
|
|
879
|
+
}
|
|
880
|
+
/**
|
|
881
|
+
* Returns the product name of the underlying database system.
|
|
882
|
+
*/
|
|
883
|
+
static getProductName(datasourceName) {
|
|
884
|
+
return DatabaseFacade.getProductName(datasourceName);
|
|
885
|
+
}
|
|
886
|
+
/**
|
|
887
|
+
* Gets a new database connection object.
|
|
888
|
+
*/
|
|
889
|
+
static getConnection(datasourceName) {
|
|
890
|
+
return new Connection(datasourceName);
|
|
891
|
+
}
|
|
892
|
+
}
|
|
893
|
+
if (typeof module !== "undefined") {
|
|
894
|
+
module.exports = {
|
|
895
|
+
Database,
|
|
896
|
+
Connection,
|
|
897
|
+
PreparedStatement,
|
|
898
|
+
CallableStatement,
|
|
899
|
+
ResultSet,
|
|
900
|
+
DatabaseSystem,
|
|
901
|
+
SQLTypes
|
|
902
|
+
};
|
|
903
|
+
}
|
|
904
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RiL2RhdGFiYXNlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEFQSSBEYXRhYmFzZVxuICpcbiAqL1xuaW1wb3J0IHsgQnl0ZXMgfSBmcm9tIFwiQGFlcm9raXQvc2RrL2lvL2J5dGVzXCI7XG5pbXBvcnQgeyBJbnB1dFN0cmVhbSB9IGZyb20gXCJAYWVyb2tpdC9zZGsvaW8vc3RyZWFtc1wiO1xuXG5jb25zdCBEYXRhYmFzZUZhY2FkZSA9IEphdmEudHlwZShcIm9yZy5lY2xpcHNlLmRpcmlnaWJsZS5jb21wb25lbnRzLmFwaS5kYi5EYXRhYmFzZUZhY2FkZVwiKTtcbmNvbnN0IERhdGFiYXNlUmVzdWx0U2V0SGVscGVyID0gSmF2YS50eXBlKFwib3JnLmVjbGlwc2UuZGlyaWdpYmxlLmNvbXBvbmVudHMuZGF0YS5tYW5hZ2VtZW50LmhlbHBlcnMuRGF0YWJhc2VSZXN1bHRTZXRIZWxwZXJcIik7XG5jb25zdCBKU3FsRGF0ZSA9IEphdmEudHlwZShcImphdmEuc3FsLkRhdGVcIik7XG5jb25zdCBKU3FsVGltZXN0YW1wID0gSmF2YS50eXBlKFwiamF2YS5zcWwuVGltZXN0YW1wXCIpO1xuY29uc3QgSlNxbFRpbWUgPSBKYXZhLnR5cGUoXCJqYXZhLnNxbC5UaW1lXCIpO1xuY29uc3QgU3RyaW5nV3JpdGVyID0gSmF2YS50eXBlKFwiamF2YS5pby5TdHJpbmdXcml0ZXJcIik7XG5jb25zdCBXcml0ZXJPdXRwdXRTdHJlYW0gPSBKYXZhLnR5cGUoXCJvcmcuYXBhY2hlLmNvbW1vbnMuaW8ub3V0cHV0LldyaXRlck91dHB1dFN0cmVhbVwiKTtcbmNvbnN0IFN0YW5kYXJkQ2hhcnNldHMgPSBKYXZhLnR5cGUoXCJqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHNcIik7XG5cbi8qKlxuICogTWFwcGluZyBvZiBTUUwgdHlwZSBuYW1lcyB0byB0aGVpciBqYXZhLnNxbC5UeXBlcyBpbnRlZ2VyIGNvbnN0YW50cy5cbiAqL1xuZXhwb3J0IGNvbnN0IFNRTFR5cGVzID0gT2JqZWN0LmZyZWV6ZSh7XG5cdFwiQk9PTEVBTlwiOiAxNixcblx0XCJEQVRFXCI6IDkxLFxuXHRcIlRJTUVcIjogOTIsXG5cdFwiVElNRVNUQU1QXCI6IDkzLFxuXHRcIkRPVUJMRVwiOiA4LFxuXHRcIkZMT0FUXCI6IDYsXG5cdFwiUkVBTFwiOiA3LFxuXHRcIlRJTllJTlRcIjogLTYsXG5cdFwiU01BTExJTlRcIjogNSxcblx0XCJJTlRFR0VSXCI6IDQsXG5cdFwiQklHSU5UXCI6IC01LFxuXHRcIlZBUkNIQVJcIjogMTIsXG5cdFwiQ0hBUlwiOiAxLFxuXHRcIkNMT0JcIjogMjAwNSxcblx0XCJCTE9CXCI6IDIwMDQsXG5cdFwiVkFSQklOQVJZXCI6IC0zLFxuXHRcIkRFQ0lNQUxcIjogMyxcblx0XCJBUlJBWVwiOiAyMDAzLFxuXHRcIk5WQVJDSEFSXCI6IC05LFxuXHRcIk5DTE9CXCI6IDIwMTEsXG5cdFwiQklUXCI6IC03XG59KTtcblxuZXhwb3J0IGVudW0gRGF0YWJhc2VTeXN0ZW0ge1xuXHRVTktOT1dOLCBERVJCWSwgUE9TVEdSRVNRTCwgSDIsIE1BUklBREIsIEhBTkEsIFNOT1dGTEFLRSwgTVlTUUwsIE1PTkdPREIsIFNZQkFTRVxufVxuXG4vLyAtLS0gTWV0YWRhdGEgSW50ZXJmYWNlcyAtLS1cblxuZXhwb3J0IGludGVyZmFjZSBUYWJsZU1ldGFkYXRhIHtcblx0LyoqIFRoZSBuYW1lLiAqL1xuXHRyZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cdC8qKiBUaGUgdHlwZS4gKi9cblx0cmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuXHQvKiogVGhlIHJlbWFya3MuICovXG5cdHJlYWRvbmx5IHJlbWFya3M6IHN0cmluZztcblx0LyoqIFRoZSBjb2x1bW5zLiAqL1xuXHRyZWFkb25seSBjb2x1bW5zOiBDb2x1bW5NZXRhZGF0YVtdO1xuXHQvKiogVGhlIGluZGljZXMuICovXG5cdHJlYWRvbmx5IGluZGljZXM6IEluZGV4TWV0YWRhdGFbXTtcblx0LyoqIFRoZSBpbmRpY2VzLiAqL1xuXHRyZWFkb25seSBmb3JlaWduS2V5czogRm9yZWlnbktleU1ldGFkYXRhW107XG5cdC8qKiBUaGUga2luZC4gKi9cblx0cmVhZG9ubHkga2luZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtbk1ldGFkYXRhIHtcblx0LyoqIFRoZSBuYW1lLiAqL1xuXHRyZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cdC8qKiBUaGUgdHlwZS4gKi9cblx0cmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuXHQvKiogVGhlIHNpemUuICovXG5cdHJlYWRvbmx5IHNpemU6IG51bWJlcjtcblx0LyoqIFRoZSBudWxsYWJsZS4gKi9cblx0cmVhZG9ubHkgbnVsbGFibGU6IGJvb2xlYW47XG5cdC8qKiBUaGUga2V5LiAqL1xuXHRyZWFkb25seSBrZXk6IGJvb2xlYW47XG5cdC8qKiBUaGUga2luZC4gKi9cblx0cmVhZG9ubHkga2luZDogc3RyaW5nO1xuXHQvKiogVGhlIHNjYWxlLiAqL1xuXHRyZWFkb25seSBzY2FsZTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEluZGV4TWV0YWRhdGEge1xuXHQvKiogVGhlIG5hbWUuICovXG5cdHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblx0LyoqIFRoZSB0eXBlLiAqL1xuXHRyZWFkb25seSB0eXBlOiBzdHJpbmc7XG5cdC8qKiBUaGUgY29sdW1uLiAqL1xuXHRyZWFkb25seSBjb2x1bW46IHN0cmluZztcblx0LyoqIFRoZSBub24gdW5pcXVlLiAqL1xuXHRyZWFkb25seSBub25VbmlxdWU6IGJvb2xlYW47XG5cdC8qKiBUaGUgcXVhbGlmaWVyLiAqL1xuXHRyZWFkb25seSBxdWFsaWZpZXI6IHN0cmluZztcblx0LyoqIFRoZSBvcmRpbmFsIHBvc2l0aW9uLiAqL1xuXHRyZWFkb25seSBvcmRpbmFsUG9zaXRpb246IHN0cmluZztcblx0LyoqIFRoZSBzb3J0IG9yZGVyLiAqL1xuXHRyZWFkb25seSBzb3J0T3JkZXI6IHN0cmluZztcblx0LyoqIFRoZSBjYXJkaW5hbGl0eS4gKi9cblx0cmVhZG9ubHkgY2FyZGluYWxpdHk6IG51bWJlcjtcblx0LyoqIFRoZSBwYWdlcy4gKi9cblx0cmVhZG9ubHkgcGFnZXM6IG51bWJlcjtcblx0LyoqIFRoZSBmaWx0ZXIgY29uZGl0aW9uLiAqL1xuXHRyZWFkb25seSBmaWx0ZXJDb25kaXRpb246IHN0cmluZztcblx0LyoqIFRoZSBraW5kLiAqL1xuXHRyZWFkb25seSBraW5kOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9yZWlnbktleU1ldGFkYXRhIHtcblx0LyoqIFRoZSBuYW1lLiAqL1xuXHRyZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cdC8qKiBUaGUga2luZC4gKi9cblx0cmVhZG9ubHkga2luZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVtYU1ldGFkYXRhIHtcblx0LyoqIFRoZSBuYW1lLiAqL1xuXHRyZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cdC8qKiBUaGUga2luZC4gKi9cblx0cmVhZG9ubHkga2luZDogc3RyaW5nO1xuXHQvKiogVGhlIHRhYmxlcy4gKi9cblx0cmVhZG9ubHkgdGFibGVzOiBUYWJsZU1ldGFkYXRhW107XG5cdC8qKiBUaGUgdmlld3MuICovXG5cdHJlYWRvbmx5IHZpZXdzOiBUYWJsZU1ldGFkYXRhW107XG5cdC8qKiBUaGUgcHJvY2VkdXJlcy4gKi9cblx0cmVhZG9ubHkgcHJvY2VkdXJlczogUHJvY2VkdXJlTWV0YWRhdGFbXTtcblx0LyoqIFRoZSBmdW5jdGlvbnMuICovXG5cdHJlYWRvbmx5IGZ1bmN0aW9uczogRnVuY3Rpb25NZXRhZGF0YVtdO1xuXHQvKiogVGhlIGZ1bmN0aW9ucy4gKi9cblx0cmVhZG9ubHkgc2VxdWVuY2VzOiBTZXF1ZW5jZU1ldGFkYXRhW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2VkdXJlTWV0YWRhdGEge1xuXHQvKiogVGhlIG5hbWUuICovXG5cdHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblx0LyoqIFRoZSB0eXBlLiAqL1xuXHRyZWFkb25seSB0eXBlOiBzdHJpbmc7XG5cdC8qKiBUaGUgcmVtYXJrcy4gKi9cblx0cmVhZG9ubHkgcmVtYXJrczogc3RyaW5nO1xuXHQvKiogVGhlIGNvbHVtbnMuICovXG5cdHJlYWRvbmx5IGNvbHVtbnM6IFBhcmFtZXRlckNvbHVtbk1ldGFkYXRhW107XG5cdC8qKiBUaGUga2luZC4gKi9cblx0cmVhZG9ubHkga2luZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uTWV0YWRhdGEge1xuXHQvKiogVGhlIG5hbWUuICovXG5cdHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblx0LyoqIFRoZSB0eXBlLiAqL1xuXHRyZWFkb25seSB0eXBlOiBzdHJpbmc7XG5cdC8qKiBUaGUgcmVtYXJrcy4gKi9cblx0cmVhZG9ubHkgcmVtYXJrczogc3RyaW5nO1xuXHQvKiogVGhlIGNvbHVtbnMuICovXG5cdHJlYWRvbmx5IGNvbHVtbnM6IFBhcmFtZXRlckNvbHVtbk1ldGFkYXRhW107XG5cdC8qKiBUaGUga2luZC4gKi9cblx0cmVhZG9ubHkga2luZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhcmFtZXRlckNvbHVtbk1ldGFkYXRhIHtcblx0LyoqIFRoZSBuYW1lLiAqL1xuXHRyZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cdC8qKiBUaGUga2luZC4gKi9cblx0cmVhZG9ubHkga2luZDogbnVtYmVyO1xuXHQvKiogVGhlIHR5cGUuICovXG5cdHJlYWRvbmx5IHR5cGU6IHN0cmluZztcblx0LyoqIFRoZSBwcmVjaXNpb24uICovXG5cdHJlYWRvbmx5IHByZWNpc2lvbjogbnVtYmVyO1xuXHQvKiogVGhlIGxlbmd0aC4gKi9cblx0cmVhZG9ubHkgbGVuZ3RoOiBudW1iZXI7XG5cdC8qKiBUaGUgc2NhbGUuICovXG5cdHJlYWRvbmx5IHNjYWxlOiBudW1iZXI7XG5cdC8qKiBUaGUgcmFkaXguICovXG5cdHJlYWRvbmx5IHJhZGl4OiBudW1iZXI7XG5cdC8qKiBUaGUgbnVsbGFibGUuICovXG5cdHJlYWRvbmx5IG51bGxhYmxlOiBib29sZWFuO1xuXHQvKiogVGhlIHJlbWFya3MuICovXG5cdHJlYWRvbmx5IHJlbWFya3M6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXF1ZW5jZU1ldGFkYXRhIHtcblx0LyoqIFRoZSBuYW1lLiAqL1xuXHRyZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cdC8qKiBUaGUga2luZC4gKi9cblx0cmVhZG9ubHkga2luZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFiYXNlTWV0YWRhdGEge1xuXHRyZWFkb25seSBhbGxQcm9jZWR1cmVzQXJlQ2FsbGFibGU6IGJvb2xlYW47XG5cdHJlYWRvbmx5IGFsbFRhYmxlc0FyZVNlbGVjdGFibGU6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHVybDogc3RyaW5nO1xuXHRyZWFkb25seSB1c2VyTmFtZTogc3RyaW5nO1xuXHRyZWFkb25seSBpc1JlYWRPbmx5OiBib29sZWFuO1xuXHRyZWFkb25seSBudWxsc0FyZVNvcnRlZEhpZ2g6IGJvb2xlYW47XG5cdHJlYWRvbmx5IG51bGxzQXJlU29ydGVkTG93OiBib29sZWFuO1xuXHRyZWFkb25seSBudWxsc0FyZVNvcnRlZEF0U3RhcnQ6IGJvb2xlYW47XG5cdHJlYWRvbmx5IG51bGxzQXJlU29ydGVkQXRFbmQ6IGJvb2xlYW47XG5cdHJlYWRvbmx5IGRhdGFiYXNlUHJvZHVjdE5hbWU6IHN0cmluZztcblx0cmVhZG9ubHkgZGF0YWJhc2VQcm9kdWN0VmVyc2lvbjogc3RyaW5nO1xuXHRyZWFkb25seSBkcml2ZXJOYW1lOiBzdHJpbmc7XG5cdHJlYWRvbmx5IGRyaXZlclZlcnNpb246IHN0cmluZztcblx0cmVhZG9ubHkgZHJpdmVyTWFqb3JWZXJzaW9uOiBudW1iZXI7XG5cdHJlYWRvbmx5IGRyaXZlck1pbm9yVmVyc2lvbjogbnVtYmVyO1xuXHRyZWFkb25seSB1c2VzTG9jYWxGaWxlczogYm9vbGVhbjtcblx0cmVhZG9ubHkgdXNlc0xvY2FsRmlsZVBlclRhYmxlOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c01peGVkQ2FzZUlkZW50aWZpZXJzOiBib29sZWFuO1xuXHRyZWFkb25seSBzdG9yZXNVcHBlckNhc2VJZGVudGlmaWVyczogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3RvcmVzTG93ZXJDYXNlSWRlbnRpZmllcnM6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN0b3Jlc01peGVkQ2FzZUlkZW50aWZpZXJzOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c01peGVkQ2FzZVF1b3RlZElkZW50aWZpZXJzOiBib29sZWFuO1xuXHRyZWFkb25seSBzdG9yZXNVcHBlckNhc2VRdW90ZWRJZGVudGlmaWVyczogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3RvcmVzTG93ZXJDYXNlUXVvdGVkSWRlbnRpZmllcnM6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN0b3Jlc01peGVkQ2FzZVF1b3RlZElkZW50aWZpZXJzOiBib29sZWFuO1xuXHRyZWFkb25seSBpZGVudGlmaWVyUXVvdGVTdHJpbmc6IHN0cmluZztcblx0cmVhZG9ubHkgc3FsS2V5d29yZHM6IHN0cmluZztcblx0cmVhZG9ubHkgbnVtZXJpY0Z1bmN0aW9uczogc3RyaW5nO1xuXHRyZWFkb25seSBzdHJpbmdGdW5jdGlvbnM6IHN0cmluZztcblx0cmVhZG9ubHkgc3lzdGVtRnVuY3Rpb25zOiBzdHJpbmc7XG5cdHJlYWRvbmx5IHRpbWVEYXRlRnVuY3Rpb25zOiBzdHJpbmc7XG5cdHJlYWRvbmx5IHNlYXJjaFN0cmluZ0VzY2FwZTogc3RyaW5nO1xuXHRyZWFkb25seSBleHRyYU5hbWVDaGFyYWN0ZXJzOiBzdHJpbmc7XG5cdHJlYWRvbmx5IHN1cHBvcnRzQWx0ZXJUYWJsZVdpdGhBZGRDb2x1bW46IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzQWx0ZXJUYWJsZVdpdGhEcm9wQ29sdW1uOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c0NvbHVtbkFsaWFzaW5nOiBib29sZWFuO1xuXHRyZWFkb25seSBudWxsUGx1c05vbk51bGxJc051bGw6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzQ29udmVydDogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3VwcG9ydHNUYWJsZUNvcnJlbGF0aW9uTmFtZXM6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzRGlmZmVyZW50VGFibGVDb3JyZWxhdGlvbk5hbWVzOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c0V4cHJlc3Npb25zSW5PcmRlckJ5OiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c09yZGVyQnlVbnJlbGF0ZWQ6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzR3JvdXBCeTogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3VwcG9ydHNHcm91cEJ5VW5yZWxhdGVkOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c0dyb3VwQnlCZXlvbmRTZWxlY3Q6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzTGlrZUVzY2FwZUNsYXVzZTogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3VwcG9ydHNNdWx0aXBsZVJlc3VsdFNldHM6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzTXVsdGlwbGVUcmFuc2FjdGlvbnM6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzTm9uTnVsbGFibGVDb2x1bW5zOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c01pbmltdW1TUUxHcmFtbWFyOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c0NvcmVTUUxHcmFtbWFyOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c0V4dGVuZGVkU1FMR3JhbW1hcjogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3VwcG9ydHNBTlNJOTJFbnRyeUxldmVsU1FMOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c0FOU0k5MkludGVybWVkaWF0ZVNRTDogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3VwcG9ydHNBTlNJOTJGdWxsU1FMOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c0ludGVncml0eUVuaGFuY2VtZW50RmFjaWxpdHk6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzT3V0ZXJKb2luczogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3VwcG9ydHNGdWxsT3V0ZXJKb2luczogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3VwcG9ydHNMaW1pdGVkT3V0ZXJKb2luczogYm9vbGVhbjtcblx0cmVhZG9ubHkgc2NoZW1hVGVybTogc3RyaW5nO1xuXHRyZWFkb25seSBwcm9jZWR1cmVUZXJtOiBzdHJpbmc7XG5cdHJlYWRvbmx5IGNhdGFsb2dUZXJtOiBzdHJpbmc7XG5cdHJlYWRvbmx5IGlzQ2F0YWxvZ0F0U3RhcnQ6IGJvb2xlYW47XG5cdHJlYWRvbmx5IGNhdGFsb2dTZXBhcmF0b3I6IHN0cmluZztcblx0cmVhZG9ubHkgc3VwcG9ydHNTY2hlbWFzSW5EYXRhTWFuaXB1bGF0aW9uOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c1NjaGVtYXNJblByb2NlZHVyZUNhbGxzOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c1NjaGVtYXNJblRhYmxlRGVmaW5pdGlvbnM6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzU2NoZW1hc0luSW5kZXhEZWZpbml0aW9uczogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3VwcG9ydHNTY2hlbWFzSW5Qcml2aWxlZ2VEZWZpbml0aW9uczogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3VwcG9ydHNDYXRhbG9nc0luRGF0YU1hbmlwdWxhdGlvbjogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3VwcG9ydHNDYXRhbG9nc0luUHJvY2VkdXJlQ2FsbHM6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzQ2F0YWxvZ3NJblRhYmxlRGVmaW5pdGlvbnM6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzQ2F0YWxvZ3NJbkluZGV4RGVmaW5pdGlvbnM6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzQ2F0YWxvZ3NJblByaXZpbGVnZURlZmluaXRpb25zOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c1Bvc2l0aW9uZWREZWxldGU6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzUG9zaXRpb25lZFVwZGF0ZTogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3VwcG9ydHNTZWxlY3RGb3JVcGRhdGU6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzU3RvcmVkUHJvY2VkdXJlczogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3VwcG9ydHNTdWJxdWVyaWVzSW5Db21wYXJpc29uczogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3VwcG9ydHNTdWJxdWVyaWVzSW5FeGlzdHM6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzU3VicXVlcmllc0luSW5zOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c1N1YnF1ZXJpZXNJblF1YW50aWZpZWRzOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c0NvcnJlbGF0ZWRTdWJxdWVyaWVzOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c1VuaW9uOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c1VuaW9uQWxsOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c09wZW5DdXJzb3JzQWNyb3NzQ29tbWl0OiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c09wZW5DdXJzb3JzQWNyb3NzUm9sbGJhY2s6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzT3BlblN0YXRlbWVudHNBY3Jvc3NDb21taXQ6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzT3BlblN0YXRlbWVudHNBY3Jvc3NSb2xsYmFjazogYm9vbGVhbjtcblx0cmVhZG9ubHkgbWF4QmluYXJ5TGl0ZXJhbExlbmd0aDogbnVtYmVyO1xuXHRyZWFkb25seSBtYXhDaGFyTGl0ZXJhbExlbmd0aDogbnVtYmVyO1xuXHRyZWFkb25seSBtYXhDb2x1bW5OYW1lTGVuZ3RoOiBudW1iZXI7XG5cdHJlYWRvbmx5IG1heENvbHVtbnNJbkdyb3VwQnk6IG51bWJlcjtcblx0cmVhZG9ubHkgbWF4Q29sdW1uc0luSW5kZXg6IG51bWJlcjtcblx0cmVhZG9ubHkgbWF4Q29sdW1uc0luT3JkZXJCeTogbnVtYmVyO1xuXHRyZWFkb25seSBtYXhDb2x1bW5zSW5TZWxlY3Q6IG51bWJlcjtcblx0cmVhZG9ubHkgbWF4Q29sdW1uc0luVGFibGU6IG51bWJlcjtcblx0cmVhZG9ubHkgbWF4Q29ubmVjdGlvbnM6IG51bWJlcjtcblx0cmVhZG9ubHkgbWF4Q3Vyc29yTmFtZUxlbmd0aDogbnVtYmVyO1xuXHRyZWFkb25seSBtYXhJbmRleExlbmd0aDogbnVtYmVyO1xuXHRyZWFkb25seSBtYXhTY2hlbWFOYW1lTGVuZ3RoOiBudW1iZXI7XG5cdHJlYWRvbmx5IG1heFByb2NlZHVyZU5hbWVMZW5ndGg6IG51bWJlcjtcblx0cmVhZG9ubHkgbWF4Q2F0YWxvZ05hbWVMZW5ndGg6IG51bWJlcjtcblx0cmVhZG9ubHkgbWF4Um93U2l6ZTogbnVtYmVyO1xuXHRyZWFkb25seSBtYXhSb3dTaXplSW5jbHVkZUJsb2JzOiBib29sZWFuO1xuXHRyZWFkb25seSBtYXhTdGF0ZW1lbnRMZW5ndGg6IG51bWJlcjtcblx0cmVhZG9ubHkgbWF4U3RhdGVtZW50czogbnVtYmVyO1xuXHRyZWFkb25seSBtYXhUYWJsZU5hbWVMZW5ndGg6IG51bWJlcjtcblx0cmVhZG9ubHkgbWF4VGFibGVzSW5TZWxlY3Q6IG51bWJlcjtcblx0cmVhZG9ubHkgbWF4VXNlck5hbWVMZW5ndGg6IG51bWJlcjtcblx0cmVhZG9ubHkgZGVmYXVsdFRyYW5zYWN0aW9uSXNvbGF0aW9uOiBudW1iZXI7XG5cdHJlYWRvbmx5IHN1cHBvcnRzVHJhbnNhY3Rpb25zOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c0RhdGFEZWZpbml0aW9uQW5kRGF0YU1hbmlwdWxhdGlvblRyYW5zYWN0aW9uczogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3VwcG9ydHNEYXRhTWFuaXB1bGF0aW9uVHJhbnNhY3Rpb25zT25seTogYm9vbGVhbjtcblx0cmVhZG9ubHkgZGF0YURlZmluaXRpb25DYXVzZXNUcmFuc2FjdGlvbkNvbW1pdDogYm9vbGVhbjtcblx0cmVhZG9ubHkgZGF0YURlZmluaXRpb25JZ25vcmVkSW5UcmFuc2FjdGlvbnM6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzQmF0Y2hVcGRhdGVzOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c1NhdmVwb2ludHM6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzTmFtZWRQYXJhbWV0ZXJzOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c011bHRpcGxlT3BlblJlc3VsdHM6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzR2V0R2VuZXJhdGVkS2V5czogYm9vbGVhbjtcblx0cmVhZG9ubHkgcmVzdWx0U2V0SG9sZGFiaWxpdHk6IG51bWJlcjtcblx0cmVhZG9ubHkgZGF0YWJhc2VNYWpvclZlcnNpb246IG51bWJlcjtcblx0cmVhZG9ubHkgZGF0YWJhc2VNaW5vclZlcnNpb246IG51bWJlcjtcblx0cmVhZG9ubHkgamRiY01ham9yVmVyc2lvbjogbnVtYmVyO1xuXHRyZWFkb25seSBqZGJjTWlub3JWZXJzaW9uOiBudW1iZXI7XG5cdHJlYWRvbmx5IHNxbFN0YXRlVHlwZTogbnVtYmVyO1xuXHRyZWFkb25seSBsb2NhdG9yc1VwZGF0ZUNvcHk6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzU3RhdGVtZW50UG9vbGluZzogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3VwcG9ydHNTdG9yZWRGdW5jdGlvbnNVc2luZ0NhbGxTeW50YXg6IGJvb2xlYW47XG5cdHJlYWRvbmx5IGF1dG9Db21taXRGYWlsdXJlQ2xvc2VzQWxsUmVzdWx0U2V0czogYm9vbGVhbjtcblx0cmVhZG9ubHkgZ2VuZXJhdGVkS2V5QWx3YXlzUmV0dXJuZWQ6IGJvb2xlYW47XG5cdHJlYWRvbmx5IG1heExvZ2ljYWxMb2JTaXplOiBudW1iZXI7XG5cdHJlYWRvbmx5IHN1cHBvcnRzUmVmQ3Vyc29yczogYm9vbGVhbjtcblx0cmVhZG9ubHkgc2NoZW1hczogU2NoZW1hTWV0YWRhdGFbXTtcblx0cmVhZG9ubHkga2luZDogc3RyaW5nO1xufVxuXG4vLyAtLS0gSGVscGVyIEZ1bmN0aW9ucyAtLS1cblxuZnVuY3Rpb24gaXNIYW5hRGF0YWJhc2UoY29ubmVjdGlvbjogYW55KTogYm9vbGVhbiB7XG5cdGxldCBpc0hhbmFEYXRhYmFzZSA9IGZhbHNlO1xuXHRsZXQgbWV0YWRhdGEgPSBjb25uZWN0aW9uLmdldE1ldGFEYXRhKCk7XG5cdGlmIChtZXRhZGF0YSAhPT0gbnVsbCAmJiBtZXRhZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0aXNIYW5hRGF0YWJhc2UgPSBtZXRhZGF0YS5nZXREYXRhYmFzZVByb2R1Y3ROYW1lKCkgPT09IFwiSERCXCI7XG5cdH1cblx0cmV0dXJuIGlzSGFuYURhdGFiYXNlO1xufVxuXG5mdW5jdGlvbiByZWFkQ2xvYlZhbHVlKHZhbHVlOiBhbnkpOiBzdHJpbmcgfCBhbnkge1xuXHRyZXR1cm4gdmFsdWUgPyB2YWx1ZS5nZXRTdWJTdHJpbmcoMSwgdmFsdWUubGVuZ3RoKCkpIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNsb2JWYWx1ZShuYXRpdmU6IGFueSwgdmFsdWU6IGFueSk6IGFueSB7XG5cdHRyeSB7XG5cdFx0bGV0IGNvbm5lY3Rpb24gPSBuYXRpdmUuZ2V0Q29ubmVjdGlvbigpOyAvLyBpbnRlbnRpb25hbGx5IG5vdCBjbG9zZWRcblx0XHRpZiAoY29ubmVjdGlvbiA9PT0gbnVsbCB8fCBjb25uZWN0aW9uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbid0IGNyZWF0ZSBuZXcgJ0Nsb2InIHZhbHVlIGFzIHRoZSBjb25uZWN0aW9uIGlzIG51bGxcIik7XG5cdFx0fVxuXHRcdGxldCBjbG9iID0gbnVsbDtcblx0XHRpZiAoaXNIYW5hRGF0YWJhc2UoY29ubmVjdGlvbikpIHtcblx0XHRcdGxldCBwcyA9IG51bGw7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRwcyA9IGNvbm5lY3Rpb24ucHJlcGFyZVN0YXRlbWVudChcIlNFTEVDVCBUT19DTE9CICg/KSBGUk9NIERVTU1ZO1wiKTtcblx0XHRcdFx0cHMuc2V0U3RyaW5nKDEsIHZhbHVlKTtcblx0XHRcdFx0bGV0IHJzID0gcHMuZXhlY3V0ZVF1ZXJ5KCk7XG5cdFx0XHRcdGlmIChycy5uZXh0KCkpIHtcblx0XHRcdFx0XHRjbG9iID0gcnMuZ2V0Q2xvYigxKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0aWYgKHBzICE9PSBudWxsICYmIHBzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRwcy5jbG9zZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNsb2IgPSBjb25uZWN0aW9uLmNyZWF0ZUNsb2IoKTtcblx0XHRcdGNsb2Iuc2V0U3RyaW5nKDEsIHZhbHVlKTtcblx0XHR9XG5cdFx0cmV0dXJuIGNsb2I7XG5cdH0gY2F0Y2ggKGU6IGFueSkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgRXJyb3Igb2NjdXJlZCBkdXJpbmcgY3JlYXRpb24gb2YgJ0Nsb2InIHZhbHVlOiAke2UubWVzc2FnZX1gKTtcblx0fVxufVxuXG5mdW5jdGlvbiByZWFkTkNsb2JWYWx1ZSh2YWx1ZTogYW55KTogc3RyaW5nIHwgYW55IHtcblx0cmV0dXJuIHZhbHVlID8gdmFsdWUuZ2V0U3ViU3RyaW5nKDEsIHZhbHVlLmxlbmd0aCgpKSA6IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVOQ2xvYlZhbHVlKG5hdGl2ZTogYW55LCB2YWx1ZTogYW55KTogYW55IHtcblx0dHJ5IHtcblx0XHRsZXQgY29ubmVjdGlvbiA9IG5hdGl2ZS5nZXRDb25uZWN0aW9uKCk7IC8vIGludGVudGlvbmFsbHkgbm90IGNsb3NlZFxuXHRcdGlmIChjb25uZWN0aW9uID09PSBudWxsIHx8IGNvbm5lY3Rpb24gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgY3JlYXRlIG5ldyAnTkNsb2InIHZhbHVlIGFzIHRoZSBjb25uZWN0aW9uIGlzIG51bGxcIik7XG5cdFx0fVxuXHRcdGxldCBuY2xvYiA9IG51bGw7XG5cdFx0aWYgKGlzSGFuYURhdGFiYXNlKGNvbm5lY3Rpb24pKSB7XG5cdFx0XHRsZXQgcHMgPSBudWxsO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0cHMgPSBjb25uZWN0aW9uLnByZXBhcmVTdGF0ZW1lbnQoXCJTRUxFQ1QgVE9fTkNMT0IgKD8pIEZST00gRFVNTVk7XCIpO1xuXHRcdFx0XHRwcy5zZXRTdHJpbmcoMSwgdmFsdWUpO1xuXHRcdFx0XHRsZXQgcnMgPSBwcy5leGVjdXRlUXVlcnkoKTtcblx0XHRcdFx0aWYgKHJzLm5leHQoKSkge1xuXHRcdFx0XHRcdG5jbG9iID0gcnMuZ2V0TkNsb2IoMSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdGlmIChwcyAhPT0gbnVsbCAmJiBwcyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0cHMuY2xvc2UoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRuY2xvYiA9IGNvbm5lY3Rpb24uY3JlYXRlTkNsb2IoKTtcblx0XHRcdG5jbG9iLnNldFN0cmluZygxLCB2YWx1ZSk7XG5cdFx0fVxuXHRcdHJldHVybiBuY2xvYjtcblx0fSBjYXRjaCAoZTogYW55KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBFcnJvciBvY2N1cmVkIGR1cmluZyBjcmVhdGlvbiBvZiAnTkNsb2InIHZhbHVlOiAke2UubWVzc2FnZX1gKTtcblx0fVxufVxuXG5mdW5jdGlvbiBjcmVhdGVCbG9iVmFsdWUobmF0aXZlOiBhbnksIHZhbHVlOiBhbnkpOiBhbnkge1xuXHR0cnkge1xuXHRcdGxldCBjb25uZWN0aW9uID0gbmF0aXZlLmdldENvbm5lY3Rpb24oKTsgLy8gaW50ZW50aW9uYWxseSBub3QgY2xvc2VkXG5cdFx0aWYgKGNvbm5lY3Rpb24gPT09IG51bGwgfHwgY29ubmVjdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBjcmVhdGUgbmV3ICdCbG9iJyB2YWx1ZSBhcyB0aGUgY29ubmVjdGlvbiBpcyBudWxsXCIpO1xuXHRcdH1cblx0XHRsZXQgYmxvYiA9IG51bGw7XG5cdFx0aWYgKGlzSGFuYURhdGFiYXNlKGNvbm5lY3Rpb24pKSB7XG5cdFx0XHRsZXQgcHMgPSBudWxsO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0cHMgPSBjb25uZWN0aW9uLnByZXBhcmVTdGF0ZW1lbnQoXCJTRUxFQ1QgVE9fQkxPQiAoPykgRlJPTSBEVU1NWTtcIik7XG5cdFx0XHRcdHBzLnNldEJ5dGVzKDEsIHZhbHVlKTtcblx0XHRcdFx0bGV0IHJzID0gcHMuZXhlY3V0ZVF1ZXJ5KCk7XG5cdFx0XHRcdGlmIChycy5uZXh0KCkpIHtcblx0XHRcdFx0XHRibG9iID0gcnMuZ2V0QmxvYigxKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0aWYgKHBzICE9PSBudWxsICYmIHBzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRwcy5jbG9zZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGJsb2IgPSBjb25uZWN0aW9uLmNyZWF0ZUJsb2IoKTtcblx0XHRcdGJsb2Iuc2V0Qnl0ZXMoMSwgdmFsdWUpO1xuXHRcdH1cblx0XHRyZXR1cm4gYmxvYjtcblx0fSBjYXRjaCAoZTogYW55KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBFcnJvciBvY2N1cmVkIGR1cmluZyBjcmVhdGlvbiBvZiAnQ2xvYicgdmFsdWU6ICR7ZS5tZXNzYWdlfWApO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldERhdGVWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgRGF0ZSk6IERhdGUge1xuXHRpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG5cdFx0cmV0dXJuIG5ldyBEYXRlKHZhbHVlKTtcblx0fVxuXHRyZXR1cm4gdmFsdWU7XG59XG5cbi8vIC0tLSBTdGF0ZW1lbnQgQ2xhc3NlcyAtLS1cblxuLyoqXG4gKiBTdGF0ZW1lbnQgb2JqZWN0XG4gKi9cbmV4cG9ydCBjbGFzcyBQcmVwYXJlZFN0YXRlbWVudCB7XG5cblx0cHJpdmF0ZSByZWFkb25seSBuYXRpdmU6IGFueTtcblxuXHRjb25zdHJ1Y3RvcihuYXRpdmU6IGFueSkge1xuXHRcdHRoaXMubmF0aXZlID0gbmF0aXZlO1xuXHR9XG5cblx0cHVibGljIGNsb3NlKCk6IHZvaWQge1xuXHRcdHRoaXMubmF0aXZlLmNsb3NlKCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UmVzdWx0U2V0KCk6IFJlc3VsdFNldCB7XG5cdFx0cmV0dXJuIG5ldyBSZXN1bHRTZXQodGhpcy5uYXRpdmUuZ2V0UmVzdWx0U2V0KCkpO1xuXHR9XG5cblx0cHVibGljIGV4ZWN1dGUoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlLmV4ZWN1dGUoKTtcblx0fVxuXG5cdHB1YmxpYyBleGVjdXRlUXVlcnkoKTogUmVzdWx0U2V0IHtcblx0XHRyZXR1cm4gbmV3IFJlc3VsdFNldCh0aGlzLm5hdGl2ZS5leGVjdXRlUXVlcnkoKSk7XG5cdH1cblxuXHRwdWJsaWMgZXhlY3V0ZVVwZGF0ZSgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5leGVjdXRlVXBkYXRlKCk7XG5cdH1cblxuXHRwdWJsaWMgc2V0TnVsbChpbmRleDogbnVtYmVyLCBzcWxUeXBlOiBudW1iZXIpOiB2b2lkIHtcblx0XHR0aGlzLm5hdGl2ZS5zZXROdWxsKGluZGV4LCBzcWxUeXBlKTtcblx0fVxuXG5cdHB1YmxpYyBzZXRCaW5hcnlTdHJlYW0ocGFyYW1ldGVySW5kZXg6IG51bWJlciwgaW5wdXRTdHJlYW06IElucHV0U3RyZWFtLCBsZW5ndGg/OiBudW1iZXIpOiB2b2lkIHtcblx0XHRpZiAobGVuZ3RoKSB7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXRCaW5hcnlTdHJlYW0ocGFyYW1ldGVySW5kZXgsIGlucHV0U3RyZWFtLCBsZW5ndGgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXRCaW5hcnlTdHJlYW0ocGFyYW1ldGVySW5kZXgsIGlucHV0U3RyZWFtKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2V0Qm9vbGVhbihpbmRleDogbnVtYmVyLCB2YWx1ZT86IGJvb2xlYW4pOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0Qm9vbGVhbihpbmRleCwgdmFsdWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNldE51bGwoaW5kZXgsIFNRTFR5cGVzLkJPT0xFQU4pO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZXRCeXRlKGluZGV4OiBudW1iZXIsIHZhbHVlPzogYW55IC8qOiBCeXRlKi8pOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0Qnl0ZShpbmRleCwgdmFsdWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNldE51bGwoaW5kZXgsIFNRTFR5cGVzLlRJTllJTlQpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZXRCbG9iKGluZGV4OiBudW1iZXIsIHZhbHVlPzogYW55IC8qKjogQmxvYiovKTogdm9pZCB7XG5cdFx0aWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGxldCBibG9iID0gY3JlYXRlQmxvYlZhbHVlKHRoaXMubmF0aXZlLCB2YWx1ZSk7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXRCbG9iKGluZGV4LCBibG9iKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXROdWxsKGluZGV4LCBTUUxUeXBlcy5CTE9CKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2V0Q2xvYihpbmRleDogbnVtYmVyLCB2YWx1ZT86IGFueSAvKjogQ2xvYiovKTogdm9pZCB7XG5cdFx0aWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGxldCBjbG9iID0gY3JlYXRlQ2xvYlZhbHVlKHRoaXMubmF0aXZlLCB2YWx1ZSk7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXRDbG9iKGluZGV4LCBjbG9iKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXROdWxsKGluZGV4LCBTUUxUeXBlcy5DTE9CKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2V0TkNsb2IoaW5kZXg6IG51bWJlciwgdmFsdWU/OiBhbnkgLyo6IE5DbG9iKi8pOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0bGV0IG5jbG9iID0gY3JlYXRlTkNsb2JWYWx1ZSh0aGlzLm5hdGl2ZSwgdmFsdWUpO1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0TkNsb2IoaW5kZXgsIG5jbG9iKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXROdWxsKGluZGV4LCBTUUxUeXBlcy5OQ0xPQik7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldEJ5dGVzTmF0aXZlKGluZGV4OiBudW1iZXIsIHZhbHVlPzogYW55W10gLypieXRlW10qLyk6IHZvaWQge1xuXHRcdGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXRCeXRlcyhpbmRleCwgdmFsdWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNldE51bGwoaW5kZXgsIFNRTFR5cGVzLlZBUkJJTkFSWSk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldEJ5dGVzKGluZGV4OiBudW1iZXIsIHZhbHVlPzogYW55W10gLypieXRlW10qLyk6IHZvaWQge1xuXHRcdGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR2YXIgZGF0YSA9IEJ5dGVzLnRvSmF2YUJ5dGVzKHZhbHVlKTtcblx0XHRcdHRoaXMubmF0aXZlLnNldEJ5dGVzKGluZGV4LCBkYXRhKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXROdWxsKGluZGV4LCBTUUxUeXBlcy5WQVJCSU5BUlkpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZXREYXRlKGluZGV4OiBudW1iZXIsIHZhbHVlPzogc3RyaW5nIHwgRGF0ZSk6IHZvaWQge1xuXHRcdGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBkYXRlID0gZ2V0RGF0ZVZhbHVlKHZhbHVlKTtcblx0XHRcdHRoaXMubmF0aXZlLnNldERhdGUoaW5kZXgsIG5ldyBKU3FsRGF0ZShkYXRlLmdldFRpbWUoKSkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNldE51bGwoaW5kZXgsIFNRTFR5cGVzLkRBVEUpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZXREb3VibGUoaW5kZXg6IG51bWJlciwgdmFsdWU/OiBudW1iZXIpOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0RG91YmxlKGluZGV4LCB2YWx1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2V0TnVsbChpbmRleCwgU1FMVHlwZXMuRE9VQkxFKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2V0RmxvYXQoaW5kZXg6IG51bWJlciwgdmFsdWU/OiBudW1iZXIpOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0RmxvYXQoaW5kZXgsIHZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXROdWxsKGluZGV4LCBTUUxUeXBlcy5GTE9BVCk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldEludChpbmRleDogbnVtYmVyLCB2YWx1ZT86IG51bWJlcik6IHZvaWQge1xuXHRcdGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXRJbnQoaW5kZXgsIHZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXROdWxsKGluZGV4LCBTUUxUeXBlcy5JTlRFR0VSKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2V0TG9uZyhpbmRleDogbnVtYmVyLCB2YWx1ZT86IG51bWJlcik6IHZvaWQge1xuXHRcdGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXRMb25nKGluZGV4LCB2YWx1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2V0TnVsbChpbmRleCwgU1FMVHlwZXMuQklHSU5UKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2V0U2hvcnQoaW5kZXg6IG51bWJlciwgdmFsdWU/OiBudW1iZXIpOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0U2hvcnQoaW5kZXgsIHZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXROdWxsKGluZGV4LCBTUUxUeXBlcy5TTUFMTElOVCk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldFN0cmluZyhpbmRleDogbnVtYmVyLCB2YWx1ZT86IHN0cmluZyk6IHZvaWQge1xuXHRcdGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXRTdHJpbmcoaW5kZXgsIHZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXROdWxsKGluZGV4LCBTUUxUeXBlcy5WQVJDSEFSKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2V0VGltZShpbmRleDogbnVtYmVyLCB2YWx1ZT86IHN0cmluZyB8IERhdGUpOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29uc3QgZGF0ZSA9IGdldERhdGVWYWx1ZSh2YWx1ZSk7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXRUaW1lKGluZGV4LCBuZXcgSlNxbFRpbWUoZGF0ZS5nZXRUaW1lKCkpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXROdWxsKGluZGV4LCBTUUxUeXBlcy5USU1FKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2V0VGltZXN0YW1wKGluZGV4OiBudW1iZXIsIHZhbHVlPzogc3RyaW5nIHwgRGF0ZSk6IHZvaWQge1xuXHRcdGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBkYXRlID0gZ2V0RGF0ZVZhbHVlKHZhbHVlKTtcblx0XHRcdHRoaXMubmF0aXZlLnNldFRpbWVzdGFtcChpbmRleCwgbmV3IEpTcWxUaW1lc3RhbXAoZGF0ZS5nZXRUaW1lKCkpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXROdWxsKGluZGV4LCBTUUxUeXBlcy5USU1FU1RBTVApO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZXRCaWdEZWNpbWFsKGluZGV4OiBudW1iZXIsIHZhbHVlPzogbnVtYmVyIC8qOiBCaWdEZWNpbWFsKi8pOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0QmlnRGVjaW1hbChpbmRleCwgdmFsdWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNldE51bGwoaW5kZXgsIFNRTFR5cGVzLkRFQ0lNQUwpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZXROU3RyaW5nKGluZGV4OiBudW1iZXIsIHZhbHVlPzogc3RyaW5nKTogdm9pZCB7XG5cdFx0aWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMubmF0aXZlLnNldE5TdHJpbmcoaW5kZXgsIHZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXROdWxsKGluZGV4LCBTUUxUeXBlcy5OVkFSQ0hBUik7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGFkZEJhdGNoKCk6IHZvaWQge1xuXHRcdHRoaXMubmF0aXZlLmFkZEJhdGNoKCk7XG5cdH1cblxuXHRwdWJsaWMgZXhlY3V0ZUJhdGNoKCk6IG51bWJlcltdIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZXhlY3V0ZUJhdGNoKCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TWV0YURhdGEoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0TWV0YURhdGEoKTtcblx0fVxuXG5cdHB1YmxpYyBnZXRNb3JlUmVzdWx0cygpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0TW9yZVJlc3VsdHMoKTtcblx0fVxuXG5cdHB1YmxpYyBnZXRQYXJhbWV0ZXJNZXRhRGF0YSgpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRQYXJhbWV0ZXJNZXRhRGF0YSgpO1xuXHR9XG5cblx0cHVibGljIGdldFNRTFdhcm5pbmcoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0V2FybmluZ3MoKTtcblx0fVxuXG5cdHB1YmxpYyBpc0Nsb3NlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuaXNDbG9zZWQoKTtcblx0fVxufVxuXG5leHBvcnQgY2xhc3MgQ2FsbGFibGVTdGF0ZW1lbnQge1xuXHRwcml2YXRlIHJlYWRvbmx5IG5hdGl2ZTogYW55O1xuXG5cdGNvbnN0cnVjdG9yKG5hdGl2ZTogYW55KSB7XG5cdFx0dGhpcy5uYXRpdmUgPSBuYXRpdmU7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UmVzdWx0U2V0KCk6IFJlc3VsdFNldCB7XG5cdFx0cmV0dXJuIG5ldyBSZXN1bHRTZXQodGhpcy5uYXRpdmUuZ2V0UmVzdWx0U2V0KCkpO1xuXHR9XG5cblx0cHVibGljIGV4ZWN1dGVRdWVyeSgpOiBSZXN1bHRTZXQge1xuXHRcdHJldHVybiBuZXcgUmVzdWx0U2V0KHRoaXMubmF0aXZlLmV4ZWN1dGVRdWVyeSgpKTtcblx0fVxuXG5cdHB1YmxpYyBleGVjdXRlVXBkYXRlKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlLmV4ZWN1dGVVcGRhdGUoKTtcblx0fVxuXG5cdHB1YmxpYyByZWdpc3Rlck91dFBhcmFtZXRlcihwYXJhbWV0ZXJJbmRleDogbnVtYmVyLCBzcWxUeXBlOiBrZXlvZiB0eXBlb2YgU1FMVHlwZXMgfCBudW1iZXIpOiB2b2lkIHtcblx0XHR0aGlzLm5hdGl2ZS5yZWdpc3Rlck91dFBhcmFtZXRlcihwYXJhbWV0ZXJJbmRleCwgc3FsVHlwZSk7XG5cdH1cblxuXHRwdWJsaWMgcmVnaXN0ZXJPdXRQYXJhbWV0ZXJCeVNjYWxlKHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHNxbFR5cGU6IGtleW9mIHR5cGVvZiBTUUxUeXBlcyB8IG51bWJlciwgc2NhbGU6IG51bWJlcik6IHZvaWQge1xuXHRcdHRoaXMubmF0aXZlLnJlZ2lzdGVyT3V0UGFyYW1ldGVyKHBhcmFtZXRlckluZGV4LCBzcWxUeXBlLCBzY2FsZSk7XG5cdH1cblxuXHRwdWJsaWMgcmVnaXN0ZXJPdXRQYXJhbWV0ZXJCeVR5cGVOYW1lKHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHNxbFR5cGU6IGtleW9mIHR5cGVvZiBTUUxUeXBlcyB8IG51bWJlciwgdHlwZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMubmF0aXZlLnJlZ2lzdGVyT3V0UGFyYW1ldGVyKHBhcmFtZXRlckluZGV4LCBzcWxUeXBlLCB0eXBlTmFtZSk7XG5cdH1cblxuXHRwdWJsaWMgd2FzTnVsbCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUud2FzTnVsbCgpO1xuXHR9XG5cblx0cHVibGljIGdldFN0cmluZyhwYXJhbWV0ZXJJbmRleDogbnVtYmVyKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0U3RyaW5nKHBhcmFtZXRlckluZGV4KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRCb29sZWFuKHBhcmFtZXRlckluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0Qm9vbGVhbihwYXJhbWV0ZXJJbmRleCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Qnl0ZShwYXJhbWV0ZXJJbmRleDogbnVtYmVyKTogYW55IC8qOiBieXRlKi8ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRCeXRlKHBhcmFtZXRlckluZGV4KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRTaG9ydChwYXJhbWV0ZXJJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0U2hvcnQocGFyYW1ldGVySW5kZXgpO1xuXHR9XG5cblx0cHVibGljIGdldEludChwYXJhbWV0ZXJJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0SW50KHBhcmFtZXRlckluZGV4KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRMb25nKHBhcmFtZXRlckluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRMb25nKHBhcmFtZXRlckluZGV4KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRGbG9hdChwYXJhbWV0ZXJJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0RmxvYXQocGFyYW1ldGVySW5kZXgpO1xuXHR9XG5cblx0cHVibGljIGdldERvdWJsZShwYXJhbWV0ZXJJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0RG91YmxlKHBhcmFtZXRlckluZGV4KTtcblx0fVxuXG5cdHB1YmxpYyBnZXREYXRlKHBhcmFtZXRlckluZGV4OiBudW1iZXIpOiBEYXRlIHtcblx0XHRjb25zdCBkYXRlSW5zdGFuY2UgPSB0aGlzLm5hdGl2ZS5nZXREYXRlKHBhcmFtZXRlckluZGV4KTtcblx0XHRyZXR1cm4gZGF0ZUluc3RhbmNlICE9PSBudWxsICYmIGRhdGVJbnN0YW5jZSAhPT0gdW5kZWZpbmVkID8gbmV3IERhdGUoZGF0ZUluc3RhbmNlLmdldFRpbWUoKSkgOiBkYXRlSW5zdGFuY2U7XG5cdH1cblxuXHRwdWJsaWMgZ2V0VGltZShwYXJhbWV0ZXJJbmRleDogbnVtYmVyKTogRGF0ZSB7XG5cdFx0Y29uc3QgZGF0ZUluc3RhbmNlID0gdGhpcy5uYXRpdmUuZ2V0VGltZShwYXJhbWV0ZXJJbmRleCk7XG5cdFx0cmV0dXJuIGRhdGVJbnN0YW5jZSAhPT0gbnVsbCAmJiBkYXRlSW5zdGFuY2UgIT09IHVuZGVmaW5lZCA/IG5ldyBEYXRlKGRhdGVJbnN0YW5jZS5nZXRUaW1lKCkpIDogZGF0ZUluc3RhbmNlO1xuXHR9XG5cblx0cHVibGljIGdldFRpbWVzdGFtcChwYXJhbWV0ZXJJbmRleDogbnVtYmVyKTogRGF0ZSB7XG5cdFx0Y29uc3QgZGF0ZUluc3RhbmNlID0gdGhpcy5uYXRpdmUuZ2V0VGltZXN0YW1wKHBhcmFtZXRlckluZGV4KTtcblx0XHRyZXR1cm4gZGF0ZUluc3RhbmNlICE9PSBudWxsICYmIGRhdGVJbnN0YW5jZSAhPT0gdW5kZWZpbmVkID8gbmV3IERhdGUoZGF0ZUluc3RhbmNlLmdldFRpbWUoKSkgOiBkYXRlSW5zdGFuY2U7XG5cdH1cblxuXHRwdWJsaWMgZ2V0T2JqZWN0KHBhcmFtZXRlckluZGV4OiBudW1iZXIpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRPYmplY3QocGFyYW1ldGVySW5kZXgpO1xuXHR9XG5cblx0cHVibGljIGdldEJpZ0RlY2ltYWwocGFyYW1ldGVySW5kZXg6IG51bWJlcik6IG51bWJlciAvKjogc3FsLkJpZ0RlY2ltYWwqLyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlLmdldEJpZ0RlY2ltYWwocGFyYW1ldGVySW5kZXgpO1xuXHR9XG5cblx0cHVibGljIGdldFJlZihwYXJhbWV0ZXJJbmRleDogbnVtYmVyKTogYW55IC8qOiBzcWwuUmVmKi8ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRSZWYocGFyYW1ldGVySW5kZXgpO1xuXHR9XG5cblx0cHVibGljIGdldEJ5dGVzKHBhcmFtZXRlckluZGV4OiBudW1iZXIpOiBhbnlbXSAvKjogYnl0ZVtdKi8ge1xuXHRcdGNvbnN0IGRhdGEgPSB0aGlzLm5hdGl2ZS5nZXRCeXRlcyhwYXJhbWV0ZXJJbmRleCk7XG5cdFx0cmV0dXJuIEJ5dGVzLnRvSmF2YVNjcmlwdEJ5dGVzKGRhdGEpO1xuXHR9XG5cblx0cHVibGljIGdldEJ5dGVzTmF0aXZlKHBhcmFtZXRlckluZGV4OiBudW1iZXIpOiBhbnlbXSAvKjogYnl0ZVtdKi8ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRCeXRlcyhwYXJhbWV0ZXJJbmRleCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0QmxvYihwYXJhbWV0ZXJJbmRleDogbnVtYmVyKTogYW55IC8qOiBzcWwuQmxvYiovIHtcblx0XHRjb25zdCBkYXRhID0gRGF0YWJhc2VGYWNhZGUucmVhZEJsb2JWYWx1ZSh0aGlzLm5hdGl2ZSwgcGFyYW1ldGVySW5kZXgpO1xuXHRcdHJldHVybiBCeXRlcy50b0phdmFTY3JpcHRCeXRlcyhkYXRhKTtcblx0fVxuXG5cdHB1YmxpYyBnZXRCbG9iTmF0aXZlKHBhcmFtZXRlckluZGV4OiBudW1iZXIpOiBhbnkgLyo6IHNxbC5CbG9iKi8ge1xuXHRcdHJldHVybiBEYXRhYmFzZUZhY2FkZS5yZWFkQmxvYlZhbHVlKHRoaXMubmF0aXZlLCBwYXJhbWV0ZXJJbmRleCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q2xvYihwYXJhbWV0ZXJJbmRleDogbnVtYmVyKTogYW55IC8qOiBzcWwuQ2xvYiovIHtcblx0XHRyZXR1cm4gcmVhZENsb2JWYWx1ZSh0aGlzLm5hdGl2ZS5nZXRDbG9iKHBhcmFtZXRlckluZGV4KSk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TkNsb2IocGFyYW1ldGVySW5kZXg6IHN0cmluZyB8IG51bWJlcik6IGFueSAvKjogc3FsLk5DbG9iKi8ge1xuXHRcdHJldHVybiByZWFkTkNsb2JWYWx1ZSh0aGlzLm5hdGl2ZS5nZXROQ2xvYihwYXJhbWV0ZXJJbmRleCkpO1xuXHR9XG5cblx0cHVibGljIGdldE5TdHJpbmcocGFyYW1ldGVySW5kZXg6IHN0cmluZyB8IG51bWJlcik6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlLmdldE5TdHJpbmcocGFyYW1ldGVySW5kZXgpO1xuXHR9XG5cblx0cHVibGljIGdldEFycmF5KHBhcmFtZXRlckluZGV4OiBzdHJpbmcgfCBudW1iZXIpOiBhbnlbXSAvKjogc3FsLkFycmF5Ki8ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRBcnJheShwYXJhbWV0ZXJJbmRleCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0VVJMKHBhcmFtZXRlckluZGV4OiBzdHJpbmcgfCBudW1iZXIpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRVUkwocGFyYW1ldGVySW5kZXgpO1xuXHR9XG5cblx0cHVibGljIGdldFJvd0lkKHBhcmFtZXRlckluZGV4OiBzdHJpbmcgfCBudW1iZXIpOiBhbnkgLyo6IHNxbC5Sb3dJZCovIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0Um93SWQocGFyYW1ldGVySW5kZXgpO1xuXHR9XG5cblx0cHVibGljIGdldFNRTFhNTChwYXJhbWV0ZXJJbmRleDogc3RyaW5nIHwgbnVtYmVyKTogYW55IC8qOiBzcWwuU1FMWE1MKi8ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRTUUxYTUwocGFyYW1ldGVySW5kZXgpO1xuXHR9XG5cblx0cHVibGljIHNldFVSTChwYXJhbWV0ZXJJbmRleDogbnVtYmVyLCB2YWx1ZTogYW55KTogdm9pZCB7XG5cdFx0dGhpcy5uYXRpdmUuc2V0VVJMKHBhcmFtZXRlckluZGV4LCB2YWx1ZSk7XG5cdH1cblxuXHRwdWJsaWMgc2V0TnVsbChwYXJhbWV0ZXJJbmRleDogbnVtYmVyLCBzcWxUeXBlU3RyOiBrZXlvZiB0eXBlb2YgU1FMVHlwZXMgfCBudW1iZXIsIHR5cGVOYW1lPzogc3RyaW5nKTogdm9pZCB7XG5cdFx0Y29uc3Qgc3FsVHlwZTogbnVtYmVyID0gTnVtYmVyLmlzSW50ZWdlcihzcWxUeXBlU3RyIGFzIG51bWJlcikgPyBzcWxUeXBlU3RyIGFzIG51bWJlciA6IFNRTFR5cGVzW3NxbFR5cGVTdHIgYXMga2V5b2YgdHlwZW9mIFNRTFR5cGVzXTtcblx0XHRpZiAodHlwZU5hbWUgIT09IHVuZGVmaW5lZCAmJiB0eXBlTmFtZSAhPT0gbnVsbCkge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0TnVsbChwYXJhbWV0ZXJJbmRleCwgc3FsVHlwZSwgdHlwZU5hbWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXROdWxsKHBhcmFtZXRlckluZGV4LCBzcWxUeXBlKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2V0Qm9vbGVhbihwYXJhbWV0ZXJJbmRleDogbnVtYmVyLCB2YWx1ZT86IGJvb2xlYW4pOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0Qm9vbGVhbihwYXJhbWV0ZXJJbmRleCwgdmFsdWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNldE51bGwocGFyYW1ldGVySW5kZXgsIFNRTFR5cGVzLkJPT0xFQU4pO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZXRCeXRlKHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHZhbHVlPzogYW55IC8qOiBieXRlKi8pOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0Qnl0ZShwYXJhbWV0ZXJJbmRleCwgdmFsdWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNldE51bGwocGFyYW1ldGVySW5kZXgsIFNRTFR5cGVzLkJJVCk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldFNob3J0KHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHZhbHVlPzogbnVtYmVyKTogdm9pZCB7XG5cdFx0aWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMubmF0aXZlLnNldFNob3J0KHBhcmFtZXRlckluZGV4LCB2YWx1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2V0TnVsbChwYXJhbWV0ZXJJbmRleCwgU1FMVHlwZXMuU01BTExJTlQpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZXRJbnQocGFyYW1ldGVySW5kZXg6IG51bWJlciwgdmFsdWU/OiBudW1iZXIpOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0SW50KHBhcmFtZXRlckluZGV4LCB2YWx1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2V0TnVsbChwYXJhbWV0ZXJJbmRleCwgU1FMVHlwZXMuSU5URUdFUik7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldExvbmcocGFyYW1ldGVySW5kZXg6IG51bWJlciwgdmFsdWU/OiBudW1iZXIpOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0TG9uZyhwYXJhbWV0ZXJJbmRleCwgdmFsdWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNldE51bGwocGFyYW1ldGVySW5kZXgsIFNRTFR5cGVzLkJJR0lOVCk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldEZsb2F0KHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHZhbHVlPzogbnVtYmVyKTogdm9pZCB7XG5cdFx0aWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMubmF0aXZlLnNldEZsb2F0KHBhcmFtZXRlckluZGV4LCB2YWx1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2V0TnVsbChwYXJhbWV0ZXJJbmRleCwgU1FMVHlwZXMuRkxPQVQpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZXREb3VibGUocGFyYW1ldGVySW5kZXg6IG51bWJlciwgdmFsdWU/OiBudW1iZXIpOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0RG91YmxlKHBhcmFtZXRlckluZGV4LCB2YWx1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2V0TnVsbChwYXJhbWV0ZXJJbmRleCwgU1FMVHlwZXMuRE9VQkxFKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2V0QmlnRGVjaW1hbChwYXJhbWV0ZXJJbmRleDogbnVtYmVyLCB2YWx1ZT86IG51bWJlciAvKjogQmlnRGVjaW1hbCovKTogdm9pZCB7XG5cdFx0aWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMubmF0aXZlLnNldEJpZ0RlY2ltYWwocGFyYW1ldGVySW5kZXgsIHZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXROdWxsKHBhcmFtZXRlckluZGV4LCBTUUxUeXBlcy5ERUNJTUFMKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2V0U3RyaW5nKHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHZhbHVlPzogc3RyaW5nKTogdm9pZCB7XG5cdFx0aWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMubmF0aXZlLnNldFN0cmluZyhwYXJhbWV0ZXJJbmRleCwgdmFsdWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNldE51bGwocGFyYW1ldGVySW5kZXgsIFNRTFR5cGVzLlZBUkNIQVIpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZXRCeXRlcyhwYXJhbWV0ZXJJbmRleDogbnVtYmVyLCB2YWx1ZT86IGFueVtdIC8qYnl0ZVtdKi8pOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0Qnl0ZXMocGFyYW1ldGVySW5kZXgsIHZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXROdWxsKHBhcmFtZXRlckluZGV4LCBTUUxUeXBlcy5BUlJBWSk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldERhdGUocGFyYW1ldGVySW5kZXg6IG51bWJlciwgdmFsdWU/OiBzdHJpbmcgfCBEYXRlKTogdm9pZCB7XG5cdFx0aWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbnN0IGRhdGUgPSBnZXREYXRlVmFsdWUodmFsdWUpO1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0RGF0ZShwYXJhbWV0ZXJJbmRleCwgbmV3IEpTcWxEYXRlKGRhdGUuZ2V0VGltZSgpKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2V0TnVsbChwYXJhbWV0ZXJJbmRleCwgU1FMVHlwZXMuREFURSk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldFRpbWUocGFyYW1ldGVySW5kZXg6IG51bWJlciwgdmFsdWU/OiBzdHJpbmcgfCBEYXRlKTogdm9pZCB7XG5cdFx0aWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbnN0IGRhdGUgPSBnZXREYXRlVmFsdWUodmFsdWUpO1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0VGltZShwYXJhbWV0ZXJJbmRleCwgbmV3IEpTcWxUaW1lKGRhdGUuZ2V0VGltZSgpKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2V0TnVsbChwYXJhbWV0ZXJJbmRleCwgU1FMVHlwZXMuVElNRSk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldFRpbWVzdGFtcChwYXJhbWV0ZXJJbmRleDogbnVtYmVyLCB2YWx1ZT86IHN0cmluZyB8IERhdGUpOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0bGV0IGRhdGUgPSBnZXREYXRlVmFsdWUodmFsdWUpO1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0VGltZXN0YW1wKHBhcmFtZXRlckluZGV4LCBuZXcgSlNxbFRpbWVzdGFtcChkYXRlLmdldFRpbWUoKSkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNldE51bGwocGFyYW1ldGVySW5kZXgsIFNRTFR5cGVzLlRJTUVTVEFNUCk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldEFzY2lpU3RyZWFtKHBhcmFtZXRlckluZGV4OiBudW1iZXIsIGlucHV0U3RyZWFtOiBJbnB1dFN0cmVhbSwgbGVuZ3RoPzogbnVtYmVyKTogdm9pZCB7XG5cdFx0aWYgKGxlbmd0aCkge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0QXNjaWlTdHJlYW0ocGFyYW1ldGVySW5kZXgsIGlucHV0U3RyZWFtLCBsZW5ndGgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXRBc2NpaVN0cmVhbShwYXJhbWV0ZXJJbmRleCwgaW5wdXRTdHJlYW0pO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZXRCaW5hcnlTdHJlYW0ocGFyYW1ldGVySW5kZXg6IG51bWJlciwgaW5wdXRTdHJlYW06IElucHV0U3RyZWFtLCBsZW5ndGg/OiBudW1iZXIpOiB2b2lkIHtcblx0XHRpZiAobGVuZ3RoKSB7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXRCaW5hcnlTdHJlYW0ocGFyYW1ldGVySW5kZXgsIGlucHV0U3RyZWFtLCBsZW5ndGgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXRCaW5hcnlTdHJlYW0ocGFyYW1ldGVySW5kZXgsIGlucHV0U3RyZWFtKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2V0T2JqZWN0KHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHZhbHVlOiBhbnksIHRhcmdldFNxbFR5cGU/OiBudW1iZXIsIHNjYWxlPzogbnVtYmVyKTogdm9pZCB7XG5cdFx0aWYgKHNjYWxlICE9PSB1bmRlZmluZWQgJiYgc2NhbGUgIT09IG51bGwgJiYgdGFyZ2V0U3FsVHlwZSAhPT0gdW5kZWZpbmVkICYmIHRhcmdldFNxbFR5cGUgIT09IG51bGwpIHtcblx0XHRcdHRoaXMubmF0aXZlLnNldE9iamVjdChwYXJhbWV0ZXJJbmRleCwgdmFsdWUsIHRhcmdldFNxbFR5cGUsIHNjYWxlKTtcblx0XHR9IGVsc2UgaWYgKHRhcmdldFNxbFR5cGUgIT09IHVuZGVmaW5lZCAmJiB0YXJnZXRTcWxUeXBlICE9PSBudWxsKSB7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXRPYmplY3QocGFyYW1ldGVySW5kZXgsIHZhbHVlLCB0YXJnZXRTcWxUeXBlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0T2JqZWN0KHBhcmFtZXRlckluZGV4LCB2YWx1ZSk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldFJvd0lkKHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHZhbHVlOiBudW1iZXIgLyo6IFJvd0lkKi8pOiB2b2lkIHtcblx0XHR0aGlzLm5hdGl2ZS5zZXRSb3dJZChwYXJhbWV0ZXJJbmRleCwgdmFsdWUpO1xuXHR9XG5cblx0cHVibGljIHNldE5TdHJpbmcocGFyYW1ldGVySW5kZXg6IG51bWJlciwgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXROU3RyaW5nKHBhcmFtZXRlckluZGV4LCB2YWx1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2V0TnVsbChwYXJhbWV0ZXJJbmRleCwgU1FMVHlwZXMuTlZBUkNIQVIpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZXRTUUxYTUwocGFyYW1ldGVySW5kZXg6IG51bWJlciwgdmFsdWU6IGFueSAvKjogU1FMWE1MKi8pOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0U1FMWE1MKHBhcmFtZXRlckluZGV4LCB2YWx1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIk51bGxhYmxlIFNRTFhNTCB0eXBlIG5vdCBzdXBwb3J0ZWQuXCIpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZXRCbG9iKHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHZhbHVlOiBhbnkgLypCbG9iICovKTogdm9pZCB7XG5cdFx0aWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbnN0IGJsb2IgPSBjcmVhdGVCbG9iVmFsdWUodGhpcy5uYXRpdmUsIHZhbHVlKTtcblx0XHRcdHRoaXMubmF0aXZlLnNldEJsb2IocGFyYW1ldGVySW5kZXgsIGJsb2IpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNldE51bGwocGFyYW1ldGVySW5kZXgsIFNRTFR5cGVzLkJMT0IpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZXRDbG9iKHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHZhbHVlOiBhbnkgLyo6IENsb2IqLyk6IHZvaWQge1xuXHRcdGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBjbG9iID0gY3JlYXRlQ2xvYlZhbHVlKHRoaXMubmF0aXZlLCB2YWx1ZSk7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXRDbG9iKHBhcmFtZXRlckluZGV4LCBjbG9iKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXROdWxsKHBhcmFtZXRlckluZGV4LCBTUUxUeXBlcy5DTE9CKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2V0TkNsb2IocGFyYW1ldGVySW5kZXg6IG51bWJlciwgdmFsdWU6IGFueSAvKjogTkNsb2IqLyk6IHZvaWQge1xuXHRcdGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBuY2xvYiA9IGNyZWF0ZU5DbG9iVmFsdWUodGhpcy5uYXRpdmUsIHZhbHVlKTtcblx0XHRcdHRoaXMubmF0aXZlLnNldE5DbG9iKHBhcmFtZXRlckluZGV4LCBuY2xvYik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2V0TnVsbChwYXJhbWV0ZXJJbmRleCwgU1FMVHlwZXMuTkNMT0IpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBleGVjdXRlKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5leGVjdXRlKCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TW9yZVJlc3VsdHMoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlLmdldE1vcmVSZXN1bHRzKCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UGFyYW1ldGVyTWV0YURhdGEoKTogYW55IC8qOiBQYXJhbWV0ZXJNZXRhRGF0YSovIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0UGFyYW1ldGVyTWV0YURhdGEoKTtcblx0fVxuXG5cdHB1YmxpYyBpc0Nsb3NlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuaXNDbG9zZWQoKTtcblx0fVxuXG5cdHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcblx0XHR0aGlzLm5hdGl2ZS5jbG9zZSgpO1xuXHR9XG59XG5cbi8qKlxuICogUmVzdWx0U2V0IG9iamVjdFxuICovXG5leHBvcnQgY2xhc3MgUmVzdWx0U2V0IHtcblxuXHRwcml2YXRlIHJlYWRvbmx5IG5hdGl2ZTogYW55O1xuXG5cdGNvbnN0cnVjdG9yKG5hdGl2ZTogYW55KSB7XG5cdFx0dGhpcy5uYXRpdmUgPSBuYXRpdmU7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgdGhlIFJlc3VsdFNldCBpbnRvIGEgSlNPTiBhcnJheSBvZiBvYmplY3RzLlxuXHQgKiBAcGFyYW0gbGltaXRlZCBXaGV0aGVyIHRvIHVzZSBsaW1pdGVkIEpTT04gY29udmVyc2lvbiAob3B0aW1pemVkKS5cblx0ICogQHBhcmFtIHN0cmluZ2lmeSBXaGV0aGVyIHRvIHJldHVybiB0aGUgSlNPTiBhcyBhIHN0cmluZyBvciBhIHBhcnNlZCBhcnJheS5cblx0ICogQHJldHVybnMgQSBKYXZhU2NyaXB0IGFycmF5IG9mIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSByZXN1bHQgc2V0LCBvciBhIHN0cmluZyBpZiBzdHJpbmdpZnkgaXMgdHJ1ZS5cblx0ICovXG5cdHB1YmxpYyB0b0pzb24obGltaXRlZCA9IGZhbHNlLCBzdHJpbmdpZnkgPSBmYWxzZSk6IGFueVtdIHtcblx0XHRjb25zdCBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTtcblx0XHRjb25zdCBvdXRwdXQgPSBXcml0ZXJPdXRwdXRTdHJlYW1cblx0XHRcdC5idWlsZGVyKClcblx0XHRcdC5zZXRXcml0ZXIoc3cpXG5cdFx0XHQuc2V0Q2hhcnNldChTdGFuZGFyZENoYXJzZXRzLlVURl84KVxuXHRcdFx0LmdldCgpO1xuXHRcdERhdGFiYXNlUmVzdWx0U2V0SGVscGVyLnRvSnNvbih0aGlzLm5hdGl2ZSwgbGltaXRlZCwgc3RyaW5naWZ5LCBvdXRwdXQpO1xuXHRcdGNvbnN0IGpzb25TdHJpbmcgPSBzdy50b1N0cmluZygpO1xuXHRcdHJldHVybiBzdHJpbmdpZnkgPyBqc29uU3RyaW5nIDogSlNPTi5wYXJzZShqc29uU3RyaW5nKTtcblx0fVxuXG5cdHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcblx0XHR0aGlzLm5hdGl2ZS5jbG9zZSgpO1xuXHR9XG5cblx0cHVibGljIGdldEJpZ0RlY2ltYWwoaWRlbnRpZmllcjogbnVtYmVyIHwgc3RyaW5nKTogYW55IC8qOiBCaWdEZWNpbWFsKi8gIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0QmlnRGVjaW1hbChpZGVudGlmaWVyKTtcblx0fVxuXG5cdHB1YmxpYyBnZXRCb29sZWFuKGlkZW50aWZpZXI6IG51bWJlciB8IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRCb29sZWFuKGlkZW50aWZpZXIpO1xuXHR9XG5cblx0cHVibGljIGdldEJ5dGUoaWRlbnRpZmllcjogbnVtYmVyIHwgc3RyaW5nKTogYW55IC8qOiBieXRlKi8ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRCeXRlKGlkZW50aWZpZXIpO1xuXHR9XG5cblx0cHVibGljIGdldEJ5dGVzKGlkZW50aWZpZXI6IG51bWJlciB8IHN0cmluZyk6IGFueVtdIC8qOiBieXRlW10qLyB7XG5cdFx0Y29uc3QgZGF0YSA9IHRoaXMubmF0aXZlLmdldEJ5dGVzKGlkZW50aWZpZXIpO1xuXHRcdHJldHVybiBCeXRlcy50b0phdmFTY3JpcHRCeXRlcyhkYXRhKTtcblx0fTtcblxuXHRwdWJsaWMgZ2V0Qnl0ZXNOYXRpdmUoaWRlbnRpZmllcjogbnVtYmVyIHwgc3RyaW5nKTogYW55W10gLyo6IGJ5dGVbXSovIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0Qnl0ZXMoaWRlbnRpZmllcik7XG5cdH07XG5cblx0cHVibGljIGdldEJsb2IoaWRlbnRpZmllcjogbnVtYmVyIHwgc3RyaW5nKTogYW55IC8qOiBzcWwuQmxvYiovIHtcblx0XHRjb25zdCBkYXRhID0gRGF0YWJhc2VGYWNhZGUucmVhZEJsb2JWYWx1ZSh0aGlzLm5hdGl2ZSwgaWRlbnRpZmllcik7XG5cdFx0cmV0dXJuIEJ5dGVzLnRvSmF2YVNjcmlwdEJ5dGVzKGRhdGEpO1xuXHR9XG5cblx0cHVibGljIGdldEJsb2JOYXRpdmUoaWRlbnRpZmllcjogbnVtYmVyIHwgc3RyaW5nKTogYW55IC8qOiBzcWwuQmxvYiovIHtcblx0XHRyZXR1cm4gRGF0YWJhc2VGYWNhZGUucmVhZEJsb2JWYWx1ZSh0aGlzLm5hdGl2ZSwgaWRlbnRpZmllcik7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q2xvYihpZGVudGlmaWVyOiBudW1iZXIgfCBzdHJpbmcpOiBhbnkgLyo6IHNxbC5DbG9iKi8ge1xuXHRcdHJldHVybiByZWFkQ2xvYlZhbHVlKHRoaXMubmF0aXZlLmdldENsb2IoaWRlbnRpZmllcikpO1xuXHR9XG5cblx0cHVibGljIGdldE5DbG9iKGlkZW50aWZpZXI6IG51bWJlciB8IHN0cmluZyk6IGFueSAvKjogc3FsLk5DbG9iKi8ge1xuXHRcdHJldHVybiByZWFkTkNsb2JWYWx1ZSh0aGlzLm5hdGl2ZS5nZXROQ2xvYihpZGVudGlmaWVyKSk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0RGF0ZShpZGVudGlmaWVyOiBudW1iZXIgfCBzdHJpbmcpOiBEYXRlIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBkYXRlSW5zdGFuY2UgPSB0aGlzLm5hdGl2ZS5nZXREYXRlKGlkZW50aWZpZXIpO1xuXHRcdHJldHVybiBkYXRlSW5zdGFuY2UgIT09IG51bGwgJiYgZGF0ZUluc3RhbmNlICE9PSB1bmRlZmluZWQgPyBuZXcgRGF0ZShkYXRlSW5zdGFuY2UuZ2V0VGltZSgpKSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBnZXREb3VibGUoaWRlbnRpZmllcjogbnVtYmVyIHwgc3RyaW5nKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0RG91YmxlKGlkZW50aWZpZXIpO1xuXHR9XG5cblx0cHVibGljIGdldEZsb2F0KGlkZW50aWZpZXI6IG51bWJlciB8IHN0cmluZyk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlLmdldEZsb2F0KGlkZW50aWZpZXIpO1xuXHR9XG5cblx0cHVibGljIGdldEludChpZGVudGlmaWVyOiBudW1iZXIgfCBzdHJpbmcpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRJbnQoaWRlbnRpZmllcik7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TG9uZyhpZGVudGlmaWVyOiBudW1iZXIgfCBzdHJpbmcpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRMb25nKGlkZW50aWZpZXIpO1xuXHR9XG5cblx0cHVibGljIGdldFNob3J0KGlkZW50aWZpZXI6IG51bWJlciB8IHN0cmluZyk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlLmdldFNob3J0KGlkZW50aWZpZXIpO1xuXHR9XG5cblx0cHVibGljIGdldFN0cmluZyhpZGVudGlmaWVyOiBudW1iZXIgfCBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRTdHJpbmcoaWRlbnRpZmllcik7XG5cdH1cblxuXHRwdWJsaWMgZ2V0VGltZShpZGVudGlmaWVyOiBudW1iZXIgfCBzdHJpbmcpOiBEYXRlIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBkYXRlSW5zdGFuY2UgPSB0aGlzLm5hdGl2ZS5nZXRUaW1lKGlkZW50aWZpZXIpO1xuXHRcdHJldHVybiBkYXRlSW5zdGFuY2UgIT09IG51bGwgJiYgZGF0ZUluc3RhbmNlICE9PSB1bmRlZmluZWQgPyBuZXcgRGF0ZShkYXRlSW5zdGFuY2UuZ2V0VGltZSgpKSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBnZXRUaW1lc3RhbXAoaWRlbnRpZmllcjogbnVtYmVyIHwgc3RyaW5nKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgZGF0ZUluc3RhbmNlID0gdGhpcy5uYXRpdmUuZ2V0VGltZXN0YW1wKGlkZW50aWZpZXIpO1xuXHRcdHJldHVybiBkYXRlSW5zdGFuY2UgIT09IG51bGwgJiYgZGF0ZUluc3RhbmNlICE9PSB1bmRlZmluZWQgPyBuZXcgRGF0ZShkYXRlSW5zdGFuY2UuZ2V0VGltZSgpKSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBpc0FmdGVyTGFzdCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuaXNBZnRlckxhc3QoKTtcblx0fVxuXG5cdHB1YmxpYyBpc0JlZm9yZUZpcnN0KCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5pc0JlZm9yZUZpcnN0KCk7XG5cdH1cblxuXHRwdWJsaWMgaXNDbG9zZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlLmlzQ2xvc2VkKCk7XG5cdH1cblxuXHRwdWJsaWMgaXNGaXJzdCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuaXNGaXJzdCgpO1xuXHR9XG5cblx0cHVibGljIGlzTGFzdCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuaXNMYXN0KCk7XG5cdH1cblxuXHRwdWJsaWMgbmV4dCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUubmV4dCgpO1xuXHR9XG5cblx0cHVibGljIGdldE1ldGFEYXRhKCk6IGFueSAvKjogUmVzdWx0U2V0TWV0YURhdGEqLyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlLmdldE1ldGFEYXRhKCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TlN0cmluZyhjb2x1bW5JbmRleDogbnVtYmVyKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0TlN0cmluZyhjb2x1bW5JbmRleCk7XG5cdH1cbn1cblxuLy8gLS0tIENvbm5lY3Rpb24gQ2xhc3MgLS0tXG5cbi8qKlxuICogQ29ubmVjdGlvbiBvYmplY3Qgd3JhcHBlciBhcm91bmQgYSBuYXRpdmUgSmF2YSBgQ29ubmVjdGlvbmAuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uIHtcblxuXHRwdWJsaWMgcmVhZG9ubHkgbmF0aXZlOiBhbnk7XG5cblx0Y29uc3RydWN0b3IoZGF0YXNvdXJjZU5hbWU/OiBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZSA9IERhdGFiYXNlRmFjYWRlLmdldENvbm5lY3Rpb24oZGF0YXNvdXJjZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgY29ubmVjdGlvbiBpcyBmb3IgYSBzcGVjaWZpYyBkYXRhYmFzZSBzeXN0ZW0uXG5cdCAqL1xuXHRwdWJsaWMgaXNPZlR5cGUoZGF0YWJhc2VTeXN0ZW06IERhdGFiYXNlU3lzdGVtKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0RGF0YWJhc2VTeXN0ZW0oKSA9PT0gZGF0YWJhc2VTeXN0ZW07XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgdW5kZXJseWluZyBkYXRhYmFzZSBzeXN0ZW0gYXMgYSB7QGxpbmsgRGF0YWJhc2VTeXN0ZW19IGVudW0uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RGF0YWJhc2VTeXN0ZW0oKTogRGF0YWJhc2VTeXN0ZW0ge1xuXHRcdGNvbnN0IGRiU3lzdGVtOiBzdHJpbmcgPSB0aGlzLm5hdGl2ZS5nZXREYXRhYmFzZVN5c3RlbSgpLm5hbWUoKTtcblx0XHRzd2l0Y2ggKGRiU3lzdGVtKSB7XG5cdFx0XHRjYXNlIFwiREVSQllcIjpcblx0XHRcdFx0cmV0dXJuIERhdGFiYXNlU3lzdGVtLkRFUkJZO1xuXHRcdFx0Y2FzZSBcIlBPU1RHUkVTUUxcIjpcblx0XHRcdFx0cmV0dXJuIERhdGFiYXNlU3lzdGVtLlBPU1RHUkVTUUw7XG5cdFx0XHRjYXNlIFwiSDJcIjpcblx0XHRcdFx0cmV0dXJuIERhdGFiYXNlU3lzdGVtLkgyO1xuXHRcdFx0Y2FzZSBcIk1BUklBREJcIjpcblx0XHRcdFx0cmV0dXJuIERhdGFiYXNlU3lzdGVtLk1BUklBREI7XG5cdFx0XHRjYXNlIFwiSEFOQVwiOlxuXHRcdFx0XHRyZXR1cm4gRGF0YWJhc2VTeXN0ZW0uSEFOQTtcblx0XHRcdGNhc2UgXCJTTk9XRkxBS0VcIjpcblx0XHRcdFx0cmV0dXJuIERhdGFiYXNlU3lzdGVtLlNOT1dGTEFLRTtcblx0XHRcdGNhc2UgXCJNWVNRTFwiOlxuXHRcdFx0XHRyZXR1cm4gRGF0YWJhc2VTeXN0ZW0uTVlTUUw7XG5cdFx0XHRjYXNlIFwiTU9OR09EQlwiOlxuXHRcdFx0XHRyZXR1cm4gRGF0YWJhc2VTeXN0ZW0uTU9OR09EQjtcblx0XHRcdGNhc2UgXCJTWUJBU0VcIjpcblx0XHRcdFx0cmV0dXJuIERhdGFiYXNlU3lzdGVtLlNZQkFTRTtcblx0XHRcdGNhc2UgXCJVTktOT1dOXCI6XG5cdFx0XHRcdHJldHVybiBEYXRhYmFzZVN5c3RlbS5VTktOT1dOO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG1hcHBpbmcgZm9yIGRhdGFiYXNlIHN5c3RlbSB0eXBlICR7ZGJTeXN0ZW19YCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFByZXBhcmVkU3RhdGVtZW50fSBvYmplY3QgZm9yIHNlbmRpbmcgcGFyYW1ldGVyaXplZCBTUUwgc3RhdGVtZW50cyB0byB0aGUgZGF0YWJhc2UuXG5cdCAqL1xuXHRwdWJsaWMgcHJlcGFyZVN0YXRlbWVudChzcWw6IHN0cmluZyk6IFByZXBhcmVkU3RhdGVtZW50IHtcblx0XHRyZXR1cm4gbmV3IFByZXBhcmVkU3RhdGVtZW50KHRoaXMubmF0aXZlLnByZXBhcmVTdGF0ZW1lbnQoc3FsKSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIHtAbGluayBDYWxsYWJsZVN0YXRlbWVudH0gb2JqZWN0IGZvciBjYWxsaW5nIGRhdGFiYXNlIHN0b3JlZCBwcm9jZWR1cmVzIG9yIGZ1bmN0aW9ucy5cblx0ICovXG5cdHB1YmxpYyBwcmVwYXJlQ2FsbChzcWw6IHN0cmluZyk6IENhbGxhYmxlU3RhdGVtZW50IHtcblx0XHRyZXR1cm4gbmV3IENhbGxhYmxlU3RhdGVtZW50KHRoaXMubmF0aXZlLnByZXBhcmVDYWxsKHNxbCkpO1xuXHR9XG5cblx0cHVibGljIGNsb3NlKCk6IHZvaWQge1xuXHRcdGlmICghdGhpcy5pc0Nsb3NlZCgpKSB7XG5cdFx0XHR0aGlzLm5hdGl2ZS5jbG9zZSgpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBjb21taXQoKTogdm9pZCB7XG5cdFx0dGhpcy5uYXRpdmUuY29tbWl0KCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0QXV0b0NvbW1pdCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0QXV0b0NvbW1pdCgpO1xuXHR9XG5cblx0cHVibGljIGdldENhdGFsb2coKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0Q2F0YWxvZygpO1xuXHR9XG5cblx0cHVibGljIGdldFNjaGVtYSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRTY2hlbWEoKTtcblx0fVxuXG5cdHB1YmxpYyBnZXRUcmFuc2FjdGlvbklzb2xhdGlvbigpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRUcmFuc2FjdGlvbklzb2xhdGlvbigpO1xuXHR9XG5cblx0cHVibGljIGlzQ2xvc2VkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5pc0Nsb3NlZCgpO1xuXHR9XG5cblx0cHVibGljIGlzUmVhZE9ubHkoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlLmlzUmVhZE9ubHkoKTtcblx0fVxuXG5cdHB1YmxpYyBpc1ZhbGlkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5pc1ZhbGlkKCk7XG5cdH1cblxuXHRwdWJsaWMgcm9sbGJhY2soKTogdm9pZCB7XG5cdFx0dGhpcy5uYXRpdmUucm9sbGJhY2soKTtcblx0fVxuXG5cdHB1YmxpYyBzZXRBdXRvQ29tbWl0KGF1dG9Db21taXQ6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLm5hdGl2ZS5zZXRBdXRvQ29tbWl0KGF1dG9Db21taXQpO1xuXHR9XG5cblx0cHVibGljIHNldENhdGFsb2coY2F0YWxvZzogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy5uYXRpdmUuc2V0Q2F0YWxvZyhjYXRhbG9nKTtcblx0fVxuXG5cdHB1YmxpYyBzZXRSZWFkT25seShyZWFkT25seTogYm9vbGVhbik6IHZvaWQge1xuXHRcdHRoaXMubmF0aXZlLnNldFJlYWRPbmx5KHJlYWRPbmx5KTtcblx0fVxuXG5cdHB1YmxpYyBzZXRTY2hlbWEoc2NoZW1hOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLm5hdGl2ZS5zZXRTY2hlbWEoc2NoZW1hKTtcblx0fVxuXG5cdHB1YmxpYyBzZXRUcmFuc2FjdGlvbklzb2xhdGlvbih0cmFuc2FjdGlvbklzb2xhdGlvbjogbnVtYmVyKTogdm9pZCB7XG5cdFx0dGhpcy5uYXRpdmUuc2V0VHJhbnNhY3Rpb25Jc29sYXRpb24odHJhbnNhY3Rpb25Jc29sYXRpb24pO1xuXHR9XG5cblx0cHVibGljIGdldE1ldGFEYXRhKCk6IGFueSAvKjogRGF0YWJhc2VNZXRhRGF0YSovIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0TWV0YURhdGEoKTtcblx0fVxufVxuXG4vLyAtLS0gRGF0YWJhc2UgQ2xhc3MgLS0tXG5cbmV4cG9ydCBjbGFzcyBEYXRhYmFzZSB7XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBsaXN0IG9mIGF2YWlsYWJsZSBkYXRhIHNvdXJjZSBuYW1lcy5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgZ2V0RGF0YVNvdXJjZXMoKTogc3RyaW5nW10ge1xuXHRcdGNvbnN0IGRhdGFzb3VyY2VzID0gRGF0YWJhc2VGYWNhZGUuZ2V0RGF0YVNvdXJjZXMoKTtcblx0XHRyZXR1cm4gZGF0YXNvdXJjZXMgPyBKU09OLnBhcnNlKGRhdGFzb3VyY2VzKSA6IFtdO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgZGF0YWJhc2UgbWV0YWRhdGEgZm9yIHRoZSBzcGVjaWZpZWQgZGF0YSBzb3VyY2UuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGdldE1ldGFkYXRhKGRhdGFzb3VyY2VOYW1lPzogc3RyaW5nKTogRGF0YWJhc2VNZXRhZGF0YSB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBEYXRhYmFzZUZhY2FkZS5nZXRNZXRhZGF0YShkYXRhc291cmNlTmFtZSk7XG5cdFx0cmV0dXJuIG1ldGFkYXRhID8gSlNPTi5wYXJzZShtZXRhZGF0YSkgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgcHJvZHVjdCBuYW1lIG9mIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlIHN5c3RlbS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgZ2V0UHJvZHVjdE5hbWUoZGF0YXNvdXJjZU5hbWU/OiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdHJldHVybiBEYXRhYmFzZUZhY2FkZS5nZXRQcm9kdWN0TmFtZShkYXRhc291cmNlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBhIG5ldyBkYXRhYmFzZSBjb25uZWN0aW9uIG9iamVjdC5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgZ2V0Q29ubmVjdGlvbihkYXRhc291cmNlTmFtZT86IHN0cmluZyk6IENvbm5lY3Rpb24ge1xuXHRcdHJldHVybiBuZXcgQ29ubmVjdGlvbihkYXRhc291cmNlTmFtZSk7XG5cdH1cbn1cblxuLy8gQHRzLWlnbm9yZVxuaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSB7XG5cdC8vIEB0cy1pZ25vcmVcblx0bW9kdWxlLmV4cG9ydHMgPSB7XG5cdFx0RGF0YWJhc2UsXG5cdFx0Q29ubmVjdGlvbixcblx0XHRQcmVwYXJlZFN0YXRlbWVudCxcblx0XHRDYWxsYWJsZVN0YXRlbWVudCxcblx0XHRSZXN1bHRT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QUFLLE9BQU8sWUFBWTtBQUFBLEVBQ2hDO0FBQ0Q7QUFJTyxNQUFNLFNBQVM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtyQixPQUFjLGlCQUEyQjtBQUN4QyxVQUFNLGNBQWMsZUFBZSxlQUFlO0FBQ2xELFdBQU8sY0FBYyxLQUFLLE1BQU0sV0FBVyxJQUFJLENBQUM7QUFBQSxFQUNqRDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsT0FBYyxZQUFZLGdCQUF1RDtBQUNoRixVQUFNLFdBQVcsZUFBZSxZQUFZLGNBQWM7QUFDMUQsV0FBTyxXQUFXLEtBQUssTUFBTSxRQUFRLElBQUk7QUFBQSxFQUMxQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsT0FBYyxlQUFlLGdCQUFpQztBQUM3RCxXQUFPLGVBQWUsZUFBZSxjQUFjO0FBQUEsRUFDcEQ7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLE9BQWMsY0FBYyxnQkFBcUM7QUFDaEUsV0FBTyxJQUFJLFdBQVcsY0FBYztBQUFBLEVBQ3JDO0FBQ0Q7QUFHQSxJQUFJLE9BQU8sV0FBVyxhQUFhO0FBRWxDLFNBQU8sVUFBVTtBQUFBLElBQ2hCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRDtBQUNEOyIsCiAgIm5hbWVzIjogWyJEYXRhYmFzZVN5c3RlbSIsICJpc0hhbmFEYXRhYmFzZSJdCn0K
|