@decaf-ts/for-fabric 0.3.51 → 0.3.53
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/dist/for-fabric.cjs +3748 -2
- package/dist/for-fabric.js +3852 -2
- package/lib/bin/cli.cjs +2 -1
- package/lib/cli-module.cjs +1 -1
- package/lib/cli-utils.cjs +1 -1
- package/lib/client/FabricClientAdapter.cjs +1 -1
- package/lib/client/FabricClientDispatch.cjs +1 -1
- package/lib/client/FabricClientPaginator.cjs +4 -1
- package/lib/client/FabricClientPaginator.d.ts +2 -1
- package/lib/client/FabricClientRepository.cjs +3 -2
- package/lib/client/FabricClientStatement.cjs +1 -1
- package/lib/client/collections/generation.cjs +1 -1
- package/lib/client/collections/index.cjs +1 -1
- package/lib/client/constants.cjs +1 -1
- package/lib/client/crypto.cjs +1 -1
- package/lib/client/erc20/FabricERC20ClientRepository.cjs +1 -1
- package/lib/client/erc20/index.cjs +1 -1
- package/lib/client/fabric-fs.cjs +1 -1
- package/lib/client/fabric-hsm.cjs +1 -1
- package/lib/client/ids/id-extraction.cjs +1 -1
- package/lib/client/ids/index.cjs +1 -1
- package/lib/client/index.cjs +1 -1
- package/lib/client/indexes/generation.cjs +1 -1
- package/lib/client/indexes/index.cjs +1 -1
- package/lib/client/logging.cjs +1 -1
- package/lib/client/services/FabricEnrollmentService.cjs +1 -1
- package/lib/client/services/FabricIdentityService.cjs +1 -1
- package/lib/client/services/RegistrationRequestBuilder.cjs +1 -1
- package/lib/client/services/constants.cjs +1 -1
- package/lib/client/services/index.cjs +1 -1
- package/lib/client/types.cjs +1 -1
- package/lib/client/utils.cjs +1 -1
- package/lib/contract/Address.cjs +1 -1
- package/lib/contract/AddressContract.cjs +1 -1
- package/lib/contract/AuditContract.cjs +1 -1
- package/lib/contract/BatchContract.cjs +1 -1
- package/lib/contract/MarketContract.cjs +1 -1
- package/lib/contract/OtherAuditContract.cjs +1 -1
- package/lib/contract/OtherBatchContract.cjs +1 -1
- package/lib/contract/OtherMarketContract.cjs +1 -1
- package/lib/contract/OtherProductContract.cjs +1 -1
- package/lib/contract/OtherProductImageContract.cjs +1 -1
- package/lib/contract/OtherProductSharedContract.cjs +1 -1
- package/lib/contract/OtherProductStrengthContract.cjs +1 -1
- package/lib/contract/Product.cjs +1 -1
- package/lib/contract/ProductContract.cjs +1 -1
- package/lib/contract/ProductStrengthContract.cjs +1 -1
- package/lib/contract/SegregatedPrivateDocumentContract.cjs +1 -1
- package/lib/contract/SegregatedSharedDocumentContract.cjs +1 -1
- package/lib/contract/User.cjs +1 -1
- package/lib/contract/UserContract.cjs +1 -1
- package/lib/contract/index.cjs +1 -1
- package/lib/contract/models/Audit.cjs +1 -1
- package/lib/contract/models/BaseIdentifiedModel.cjs +1 -1
- package/lib/contract/models/BaseModel.cjs +1 -1
- package/lib/contract/models/Batch.cjs +1 -1
- package/lib/contract/models/GtinOwner.cjs +1 -1
- package/lib/contract/models/History.cjs +1 -1
- package/lib/contract/models/Leaflet.cjs +1 -1
- package/lib/contract/models/LeafletFile.cjs +1 -1
- package/lib/contract/models/Market.cjs +1 -1
- package/lib/contract/models/OtherAudit.cjs +4 -1
- package/lib/contract/models/OtherBatchShared.cjs +1 -1
- package/lib/contract/models/OtherLeaflet.cjs +1 -1
- package/lib/contract/models/OtherLeafletFile.cjs +1 -1
- package/lib/contract/models/OtherMarket.cjs +1 -1
- package/lib/contract/models/OtherProduct.cjs +1 -1
- package/lib/contract/models/OtherProductImage.cjs +1 -1
- package/lib/contract/models/OtherProductShared.cjs +1 -1
- package/lib/contract/models/OtherProductStrength.cjs +1 -1
- package/lib/contract/models/Product.cjs +1 -1
- package/lib/contract/models/ProductStrength.cjs +1 -1
- package/lib/contract/models/SegregatedDocument.cjs +1 -1
- package/lib/contract/models/constants.cjs +1 -1
- package/lib/contract/models/decorators-private.cjs +1 -1
- package/lib/contract/models/decorators.cjs +1 -1
- package/lib/contract/models/gtin.cjs +1 -1
- package/lib/contract/models/history-dec.cjs +1 -1
- package/lib/contracts/ContractAdapter.cjs +50 -79
- package/lib/contracts/ContractAdapter.d.ts +9 -0
- package/lib/contracts/ContractContext.cjs +1 -1
- package/lib/contracts/FabricContractDispatch.cjs +1 -1
- package/lib/contracts/FabricContractPaginator.cjs +20 -16
- package/lib/contracts/FabricContractRepository.cjs +1 -1
- package/lib/contracts/FabricContractRepositoryObservableHandler.cjs +1 -1
- package/lib/contracts/FabricContractSequence.cjs +1 -1
- package/lib/contracts/FabricContractStatement.cjs +1 -1
- package/lib/contracts/PrivateSequence.cjs +1 -1
- package/lib/contracts/auth/decorators.cjs +1 -1
- package/lib/contracts/auth/index.cjs +1 -1
- package/lib/contracts/crud/crud-contract.cjs +1 -1
- package/lib/contracts/crud/index.cjs +1 -1
- package/lib/contracts/crud/serialized-crud-contract.cjs +1 -1
- package/lib/contracts/erc20/erc20contract.cjs +1 -1
- package/lib/contracts/erc20/index.cjs +1 -1
- package/lib/contracts/erc20/models.cjs +1 -1
- package/lib/contracts/index.cjs +1 -1
- package/lib/contracts/logging.cjs +1 -1
- package/lib/contracts/overrides.cjs +1 -1
- package/lib/contracts/types.cjs +1 -1
- package/lib/contracts/uuid.cjs +1 -1
- package/lib/esm/bin/cli.js +1 -1
- package/lib/esm/cli-module.js +1 -1
- package/lib/esm/cli-utils.js +1 -1
- package/lib/esm/client/FabricClientAdapter.js +1 -1
- package/lib/esm/client/FabricClientDispatch.js +1 -1
- package/lib/esm/client/FabricClientPaginator.d.ts +2 -1
- package/lib/esm/client/FabricClientPaginator.js +4 -1
- package/lib/esm/client/FabricClientRepository.js +4 -3
- package/lib/esm/client/FabricClientStatement.js +1 -1
- package/lib/esm/client/collections/generation.js +1 -1
- package/lib/esm/client/collections/index.js +1 -1
- package/lib/esm/client/constants.js +1 -1
- package/lib/esm/client/crypto.js +1 -1
- package/lib/esm/client/erc20/FabricERC20ClientRepository.js +1 -1
- package/lib/esm/client/erc20/index.js +1 -1
- package/lib/esm/client/fabric-fs.js +1 -1
- package/lib/esm/client/fabric-hsm.js +1 -1
- package/lib/esm/client/ids/id-extraction.js +1 -1
- package/lib/esm/client/ids/index.js +1 -1
- package/lib/esm/client/index.js +1 -1
- package/lib/esm/client/indexes/generation.js +1 -1
- package/lib/esm/client/indexes/index.js +1 -1
- package/lib/esm/client/logging.js +1 -1
- package/lib/esm/client/services/FabricEnrollmentService.js +1 -1
- package/lib/esm/client/services/FabricIdentityService.js +1 -1
- package/lib/esm/client/services/RegistrationRequestBuilder.js +1 -1
- package/lib/esm/client/services/constants.js +1 -1
- package/lib/esm/client/services/index.js +1 -1
- package/lib/esm/client/types.js +1 -1
- package/lib/esm/client/utils.js +1 -1
- package/lib/esm/contract/Address.js +1 -1
- package/lib/esm/contract/AddressContract.js +1 -1
- package/lib/esm/contract/AuditContract.js +1 -1
- package/lib/esm/contract/BatchContract.js +1 -1
- package/lib/esm/contract/MarketContract.js +1 -1
- package/lib/esm/contract/OtherAuditContract.js +1 -1
- package/lib/esm/contract/OtherBatchContract.js +1 -1
- package/lib/esm/contract/OtherMarketContract.js +1 -1
- package/lib/esm/contract/OtherProductContract.js +1 -1
- package/lib/esm/contract/OtherProductImageContract.js +1 -1
- package/lib/esm/contract/OtherProductSharedContract.js +1 -1
- package/lib/esm/contract/OtherProductStrengthContract.js +1 -1
- package/lib/esm/contract/Product.js +1 -1
- package/lib/esm/contract/ProductContract.js +1 -1
- package/lib/esm/contract/ProductStrengthContract.js +1 -1
- package/lib/esm/contract/SegregatedPrivateDocumentContract.js +1 -1
- package/lib/esm/contract/SegregatedSharedDocumentContract.js +1 -1
- package/lib/esm/contract/User.js +1 -1
- package/lib/esm/contract/UserContract.js +1 -1
- package/lib/esm/contract/index.js +1 -1
- package/lib/esm/contract/models/Audit.js +1 -1
- package/lib/esm/contract/models/BaseIdentifiedModel.js +1 -1
- package/lib/esm/contract/models/BaseModel.js +1 -1
- package/lib/esm/contract/models/Batch.js +1 -1
- package/lib/esm/contract/models/GtinOwner.js +1 -1
- package/lib/esm/contract/models/History.js +1 -1
- package/lib/esm/contract/models/Leaflet.js +1 -1
- package/lib/esm/contract/models/LeafletFile.js +1 -1
- package/lib/esm/contract/models/Market.js +1 -1
- package/lib/esm/contract/models/OtherAudit.js +5 -2
- package/lib/esm/contract/models/OtherBatchShared.js +1 -1
- package/lib/esm/contract/models/OtherLeaflet.js +1 -1
- package/lib/esm/contract/models/OtherLeafletFile.js +1 -1
- package/lib/esm/contract/models/OtherMarket.js +1 -1
- package/lib/esm/contract/models/OtherProduct.js +1 -1
- package/lib/esm/contract/models/OtherProductImage.js +1 -1
- package/lib/esm/contract/models/OtherProductShared.js +1 -1
- package/lib/esm/contract/models/OtherProductStrength.js +1 -1
- package/lib/esm/contract/models/Product.js +1 -1
- package/lib/esm/contract/models/ProductStrength.js +1 -1
- package/lib/esm/contract/models/SegregatedDocument.js +1 -1
- package/lib/esm/contract/models/constants.js +1 -1
- package/lib/esm/contract/models/decorators-private.js +1 -1
- package/lib/esm/contract/models/decorators.js +1 -1
- package/lib/esm/contract/models/gtin.js +1 -1
- package/lib/esm/contract/models/history-dec.js +1 -1
- package/lib/esm/contracts/ContractAdapter.d.ts +9 -0
- package/lib/esm/contracts/ContractAdapter.js +52 -81
- package/lib/esm/contracts/ContractContext.js +1 -1
- package/lib/esm/contracts/FabricContractDispatch.js +1 -1
- package/lib/esm/contracts/FabricContractPaginator.js +20 -16
- package/lib/esm/contracts/FabricContractRepository.js +1 -1
- package/lib/esm/contracts/FabricContractRepositoryObservableHandler.js +1 -1
- package/lib/esm/contracts/FabricContractSequence.js +1 -1
- package/lib/esm/contracts/FabricContractStatement.js +1 -1
- package/lib/esm/contracts/PrivateSequence.js +1 -1
- package/lib/esm/contracts/auth/decorators.js +1 -1
- package/lib/esm/contracts/auth/index.js +1 -1
- package/lib/esm/contracts/crud/crud-contract.js +1 -1
- package/lib/esm/contracts/crud/index.js +1 -1
- package/lib/esm/contracts/crud/serialized-crud-contract.js +1 -1
- package/lib/esm/contracts/erc20/erc20contract.js +1 -1
- package/lib/esm/contracts/erc20/index.js +1 -1
- package/lib/esm/contracts/erc20/models.js +1 -1
- package/lib/esm/contracts/index.js +1 -1
- package/lib/esm/contracts/logging.js +1 -1
- package/lib/esm/contracts/overrides.js +1 -1
- package/lib/esm/contracts/types.js +1 -1
- package/lib/esm/contracts/uuid.js +1 -1
- package/lib/esm/index.js +1 -1
- package/lib/esm/shared/ClientSerializer.js +1 -1
- package/lib/esm/shared/DeterministicSerializer.js +1 -1
- package/lib/esm/shared/SimpleDeterministicSerializer.js +1 -1
- package/lib/esm/shared/constants.js +1 -1
- package/lib/esm/shared/decorators.js +1 -1
- package/lib/esm/shared/erc20/erc20-constants.js +1 -1
- package/lib/esm/shared/erc20/index.js +1 -1
- package/lib/esm/shared/errors.js +1 -1
- package/lib/esm/shared/events.js +1 -1
- package/lib/esm/shared/fabric-types.js +1 -1
- package/lib/esm/shared/index.js +1 -1
- package/lib/esm/shared/interfaces/Checkable.js +1 -1
- package/lib/esm/shared/interfaces/index.js +1 -1
- package/lib/esm/shared/math.js +1 -1
- package/lib/esm/shared/model/FabricBaseModel.js +1 -1
- package/lib/esm/shared/model/FabricIdentifiedBaseModel.js +1 -1
- package/lib/esm/shared/model/Identity.js +1 -1
- package/lib/esm/shared/model/IdentityCredentials.js +1 -1
- package/lib/esm/shared/model/index.js +1 -1
- package/lib/esm/shared/overrides/Model.js +1 -1
- package/lib/esm/shared/overrides/index.js +1 -1
- package/lib/esm/shared/overrides/overrides.js +1 -1
- package/lib/esm/shared/types.js +1 -1
- package/lib/esm/version.d.ts +1 -1
- package/lib/esm/version.js +2 -2
- package/lib/index.cjs +1 -1
- package/lib/shared/ClientSerializer.cjs +1 -1
- package/lib/shared/DeterministicSerializer.cjs +1 -1
- package/lib/shared/SimpleDeterministicSerializer.cjs +1 -1
- package/lib/shared/constants.cjs +1 -1
- package/lib/shared/decorators.cjs +1 -1
- package/lib/shared/erc20/erc20-constants.cjs +1 -1
- package/lib/shared/erc20/index.cjs +1 -1
- package/lib/shared/errors.cjs +1 -1
- package/lib/shared/events.cjs +1 -1
- package/lib/shared/fabric-types.cjs +1 -1
- package/lib/shared/index.cjs +1 -1
- package/lib/shared/interfaces/Checkable.cjs +1 -1
- package/lib/shared/interfaces/index.cjs +1 -1
- package/lib/shared/math.cjs +1 -1
- package/lib/shared/model/FabricBaseModel.cjs +1 -1
- package/lib/shared/model/FabricIdentifiedBaseModel.cjs +1 -1
- package/lib/shared/model/Identity.cjs +1 -1
- package/lib/shared/model/IdentityCredentials.cjs +1 -1
- package/lib/shared/model/index.cjs +1 -1
- package/lib/shared/overrides/Model.cjs +1 -1
- package/lib/shared/overrides/index.cjs +1 -1
- package/lib/shared/overrides/overrides.cjs +1 -1
- package/lib/shared/types.cjs +1 -1
- package/lib/version.cjs +2 -2
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
- package/dist/for-fabric.cjs.map +0 -1
- package/dist/for-fabric.js.map +0 -1
- package/lib/bin/cli.js.map +0 -1
- package/lib/cli-module.js.map +0 -1
- package/lib/cli-utils.js.map +0 -1
- package/lib/client/FabricClientAdapter.js.map +0 -1
- package/lib/client/FabricClientDispatch.js.map +0 -1
- package/lib/client/FabricClientPaginator.js.map +0 -1
- package/lib/client/FabricClientRepository.js.map +0 -1
- package/lib/client/FabricClientStatement.js.map +0 -1
- package/lib/client/collections/generation.js.map +0 -1
- package/lib/client/collections/index.js.map +0 -1
- package/lib/client/constants.js.map +0 -1
- package/lib/client/crypto.js.map +0 -1
- package/lib/client/erc20/FabricERC20ClientRepository.js.map +0 -1
- package/lib/client/erc20/index.js.map +0 -1
- package/lib/client/fabric-fs.js.map +0 -1
- package/lib/client/fabric-hsm.js.map +0 -1
- package/lib/client/ids/id-extraction.js.map +0 -1
- package/lib/client/ids/index.js.map +0 -1
- package/lib/client/index.js.map +0 -1
- package/lib/client/indexes/generation.js.map +0 -1
- package/lib/client/indexes/index.js.map +0 -1
- package/lib/client/logging.js.map +0 -1
- package/lib/client/services/FabricEnrollmentService.js.map +0 -1
- package/lib/client/services/FabricIdentityService.js.map +0 -1
- package/lib/client/services/RegistrationRequestBuilder.js.map +0 -1
- package/lib/client/services/constants.js.map +0 -1
- package/lib/client/services/index.js.map +0 -1
- package/lib/client/types.js.map +0 -1
- package/lib/client/utils.js.map +0 -1
- package/lib/contract/Address.js.map +0 -1
- package/lib/contract/AddressContract.js.map +0 -1
- package/lib/contract/AuditContract.js.map +0 -1
- package/lib/contract/BatchContract.js.map +0 -1
- package/lib/contract/MarketContract.js.map +0 -1
- package/lib/contract/OtherAuditContract.js.map +0 -1
- package/lib/contract/OtherBatchContract.js.map +0 -1
- package/lib/contract/OtherMarketContract.js.map +0 -1
- package/lib/contract/OtherProductContract.js.map +0 -1
- package/lib/contract/OtherProductImageContract.js.map +0 -1
- package/lib/contract/OtherProductSharedContract.js.map +0 -1
- package/lib/contract/OtherProductStrengthContract.js.map +0 -1
- package/lib/contract/Product.js.map +0 -1
- package/lib/contract/ProductContract.js.map +0 -1
- package/lib/contract/ProductStrengthContract.js.map +0 -1
- package/lib/contract/SegregatedPrivateDocumentContract.js.map +0 -1
- package/lib/contract/SegregatedSharedDocumentContract.js.map +0 -1
- package/lib/contract/User.js.map +0 -1
- package/lib/contract/UserContract.js.map +0 -1
- package/lib/contract/index.js.map +0 -1
- package/lib/contract/models/Audit.js.map +0 -1
- package/lib/contract/models/BaseIdentifiedModel.js.map +0 -1
- package/lib/contract/models/BaseModel.js.map +0 -1
- package/lib/contract/models/Batch.js.map +0 -1
- package/lib/contract/models/GtinOwner.js.map +0 -1
- package/lib/contract/models/History.js.map +0 -1
- package/lib/contract/models/Leaflet.js.map +0 -1
- package/lib/contract/models/LeafletFile.js.map +0 -1
- package/lib/contract/models/Market.js.map +0 -1
- package/lib/contract/models/OtherAudit.js.map +0 -1
- package/lib/contract/models/OtherBatchShared.js.map +0 -1
- package/lib/contract/models/OtherLeaflet.js.map +0 -1
- package/lib/contract/models/OtherLeafletFile.js.map +0 -1
- package/lib/contract/models/OtherMarket.js.map +0 -1
- package/lib/contract/models/OtherProduct.js.map +0 -1
- package/lib/contract/models/OtherProductImage.js.map +0 -1
- package/lib/contract/models/OtherProductShared.js.map +0 -1
- package/lib/contract/models/OtherProductStrength.js.map +0 -1
- package/lib/contract/models/Product.js.map +0 -1
- package/lib/contract/models/ProductStrength.js.map +0 -1
- package/lib/contract/models/SegregatedDocument.js.map +0 -1
- package/lib/contract/models/constants.js.map +0 -1
- package/lib/contract/models/decorators-private.js.map +0 -1
- package/lib/contract/models/decorators.js.map +0 -1
- package/lib/contract/models/gtin.js.map +0 -1
- package/lib/contract/models/history-dec.js.map +0 -1
- package/lib/contracts/ContractAdapter.js.map +0 -1
- package/lib/contracts/ContractContext.js.map +0 -1
- package/lib/contracts/FabricContractDispatch.js.map +0 -1
- package/lib/contracts/FabricContractPaginator.js.map +0 -1
- package/lib/contracts/FabricContractRepository.js.map +0 -1
- package/lib/contracts/FabricContractRepositoryObservableHandler.js.map +0 -1
- package/lib/contracts/FabricContractSequence.js.map +0 -1
- package/lib/contracts/FabricContractStatement.js.map +0 -1
- package/lib/contracts/PrivateSequence.js.map +0 -1
- package/lib/contracts/auth/decorators.js.map +0 -1
- package/lib/contracts/auth/index.js.map +0 -1
- package/lib/contracts/crud/crud-contract.js.map +0 -1
- package/lib/contracts/crud/index.js.map +0 -1
- package/lib/contracts/crud/serialized-crud-contract.js.map +0 -1
- package/lib/contracts/erc20/erc20contract.js.map +0 -1
- package/lib/contracts/erc20/index.js.map +0 -1
- package/lib/contracts/erc20/models.js.map +0 -1
- package/lib/contracts/index.js.map +0 -1
- package/lib/contracts/logging.js.map +0 -1
- package/lib/contracts/overrides.js.map +0 -1
- package/lib/contracts/types.js.map +0 -1
- package/lib/contracts/uuid.js.map +0 -1
- package/lib/esm/bin/cli.js.map +0 -1
- package/lib/esm/cli-module.js.map +0 -1
- package/lib/esm/cli-utils.js.map +0 -1
- package/lib/esm/client/FabricClientAdapter.js.map +0 -1
- package/lib/esm/client/FabricClientDispatch.js.map +0 -1
- package/lib/esm/client/FabricClientPaginator.js.map +0 -1
- package/lib/esm/client/FabricClientRepository.js.map +0 -1
- package/lib/esm/client/FabricClientStatement.js.map +0 -1
- package/lib/esm/client/collections/generation.js.map +0 -1
- package/lib/esm/client/collections/index.js.map +0 -1
- package/lib/esm/client/constants.js.map +0 -1
- package/lib/esm/client/crypto.js.map +0 -1
- package/lib/esm/client/erc20/FabricERC20ClientRepository.js.map +0 -1
- package/lib/esm/client/erc20/index.js.map +0 -1
- package/lib/esm/client/fabric-fs.js.map +0 -1
- package/lib/esm/client/fabric-hsm.js.map +0 -1
- package/lib/esm/client/ids/id-extraction.js.map +0 -1
- package/lib/esm/client/ids/index.js.map +0 -1
- package/lib/esm/client/index.js.map +0 -1
- package/lib/esm/client/indexes/generation.js.map +0 -1
- package/lib/esm/client/indexes/index.js.map +0 -1
- package/lib/esm/client/logging.js.map +0 -1
- package/lib/esm/client/services/FabricEnrollmentService.js.map +0 -1
- package/lib/esm/client/services/FabricIdentityService.js.map +0 -1
- package/lib/esm/client/services/RegistrationRequestBuilder.js.map +0 -1
- package/lib/esm/client/services/constants.js.map +0 -1
- package/lib/esm/client/services/index.js.map +0 -1
- package/lib/esm/client/types.js.map +0 -1
- package/lib/esm/client/utils.js.map +0 -1
- package/lib/esm/contract/Address.js.map +0 -1
- package/lib/esm/contract/AddressContract.js.map +0 -1
- package/lib/esm/contract/AuditContract.js.map +0 -1
- package/lib/esm/contract/BatchContract.js.map +0 -1
- package/lib/esm/contract/MarketContract.js.map +0 -1
- package/lib/esm/contract/OtherAuditContract.js.map +0 -1
- package/lib/esm/contract/OtherBatchContract.js.map +0 -1
- package/lib/esm/contract/OtherMarketContract.js.map +0 -1
- package/lib/esm/contract/OtherProductContract.js.map +0 -1
- package/lib/esm/contract/OtherProductImageContract.js.map +0 -1
- package/lib/esm/contract/OtherProductSharedContract.js.map +0 -1
- package/lib/esm/contract/OtherProductStrengthContract.js.map +0 -1
- package/lib/esm/contract/Product.js.map +0 -1
- package/lib/esm/contract/ProductContract.js.map +0 -1
- package/lib/esm/contract/ProductStrengthContract.js.map +0 -1
- package/lib/esm/contract/SegregatedPrivateDocumentContract.js.map +0 -1
- package/lib/esm/contract/SegregatedSharedDocumentContract.js.map +0 -1
- package/lib/esm/contract/User.js.map +0 -1
- package/lib/esm/contract/UserContract.js.map +0 -1
- package/lib/esm/contract/index.js.map +0 -1
- package/lib/esm/contract/models/Audit.js.map +0 -1
- package/lib/esm/contract/models/BaseIdentifiedModel.js.map +0 -1
- package/lib/esm/contract/models/BaseModel.js.map +0 -1
- package/lib/esm/contract/models/Batch.js.map +0 -1
- package/lib/esm/contract/models/GtinOwner.js.map +0 -1
- package/lib/esm/contract/models/History.js.map +0 -1
- package/lib/esm/contract/models/Leaflet.js.map +0 -1
- package/lib/esm/contract/models/LeafletFile.js.map +0 -1
- package/lib/esm/contract/models/Market.js.map +0 -1
- package/lib/esm/contract/models/OtherAudit.js.map +0 -1
- package/lib/esm/contract/models/OtherBatchShared.js.map +0 -1
- package/lib/esm/contract/models/OtherLeaflet.js.map +0 -1
- package/lib/esm/contract/models/OtherLeafletFile.js.map +0 -1
- package/lib/esm/contract/models/OtherMarket.js.map +0 -1
- package/lib/esm/contract/models/OtherProduct.js.map +0 -1
- package/lib/esm/contract/models/OtherProductImage.js.map +0 -1
- package/lib/esm/contract/models/OtherProductShared.js.map +0 -1
- package/lib/esm/contract/models/OtherProductStrength.js.map +0 -1
- package/lib/esm/contract/models/Product.js.map +0 -1
- package/lib/esm/contract/models/ProductStrength.js.map +0 -1
- package/lib/esm/contract/models/SegregatedDocument.js.map +0 -1
- package/lib/esm/contract/models/constants.js.map +0 -1
- package/lib/esm/contract/models/decorators-private.js.map +0 -1
- package/lib/esm/contract/models/decorators.js.map +0 -1
- package/lib/esm/contract/models/gtin.js.map +0 -1
- package/lib/esm/contract/models/history-dec.js.map +0 -1
- package/lib/esm/contracts/ContractAdapter.js.map +0 -1
- package/lib/esm/contracts/ContractContext.js.map +0 -1
- package/lib/esm/contracts/FabricContractDispatch.js.map +0 -1
- package/lib/esm/contracts/FabricContractPaginator.js.map +0 -1
- package/lib/esm/contracts/FabricContractRepository.js.map +0 -1
- package/lib/esm/contracts/FabricContractRepositoryObservableHandler.js.map +0 -1
- package/lib/esm/contracts/FabricContractSequence.js.map +0 -1
- package/lib/esm/contracts/FabricContractStatement.js.map +0 -1
- package/lib/esm/contracts/PrivateSequence.js.map +0 -1
- package/lib/esm/contracts/auth/decorators.js.map +0 -1
- package/lib/esm/contracts/auth/index.js.map +0 -1
- package/lib/esm/contracts/crud/crud-contract.js.map +0 -1
- package/lib/esm/contracts/crud/index.js.map +0 -1
- package/lib/esm/contracts/crud/serialized-crud-contract.js.map +0 -1
- package/lib/esm/contracts/erc20/erc20contract.js.map +0 -1
- package/lib/esm/contracts/erc20/index.js.map +0 -1
- package/lib/esm/contracts/erc20/models.js.map +0 -1
- package/lib/esm/contracts/index.js.map +0 -1
- package/lib/esm/contracts/logging.js.map +0 -1
- package/lib/esm/contracts/overrides.js.map +0 -1
- package/lib/esm/contracts/types.js.map +0 -1
- package/lib/esm/contracts/uuid.js.map +0 -1
- package/lib/esm/index.js.map +0 -1
- package/lib/esm/shared/ClientSerializer.js.map +0 -1
- package/lib/esm/shared/DeterministicSerializer.js.map +0 -1
- package/lib/esm/shared/SimpleDeterministicSerializer.js.map +0 -1
- package/lib/esm/shared/constants.js.map +0 -1
- package/lib/esm/shared/decorators.js.map +0 -1
- package/lib/esm/shared/erc20/erc20-constants.js.map +0 -1
- package/lib/esm/shared/erc20/index.js.map +0 -1
- package/lib/esm/shared/errors.js.map +0 -1
- package/lib/esm/shared/events.js.map +0 -1
- package/lib/esm/shared/fabric-types.js.map +0 -1
- package/lib/esm/shared/index.js.map +0 -1
- package/lib/esm/shared/interfaces/Checkable.js.map +0 -1
- package/lib/esm/shared/interfaces/index.js.map +0 -1
- package/lib/esm/shared/math.js.map +0 -1
- package/lib/esm/shared/model/FabricBaseModel.js.map +0 -1
- package/lib/esm/shared/model/FabricIdentifiedBaseModel.js.map +0 -1
- package/lib/esm/shared/model/Identity.js.map +0 -1
- package/lib/esm/shared/model/IdentityCredentials.js.map +0 -1
- package/lib/esm/shared/model/index.js.map +0 -1
- package/lib/esm/shared/overrides/Model.js.map +0 -1
- package/lib/esm/shared/overrides/index.js.map +0 -1
- package/lib/esm/shared/overrides/overrides.js.map +0 -1
- package/lib/esm/shared/types.js.map +0 -1
- package/lib/esm/version.js.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/shared/ClientSerializer.js.map +0 -1
- package/lib/shared/DeterministicSerializer.js.map +0 -1
- package/lib/shared/SimpleDeterministicSerializer.js.map +0 -1
- package/lib/shared/constants.js.map +0 -1
- package/lib/shared/decorators.js.map +0 -1
- package/lib/shared/erc20/erc20-constants.js.map +0 -1
- package/lib/shared/erc20/index.js.map +0 -1
- package/lib/shared/errors.js.map +0 -1
- package/lib/shared/events.js.map +0 -1
- package/lib/shared/fabric-types.js.map +0 -1
- package/lib/shared/index.js.map +0 -1
- package/lib/shared/interfaces/Checkable.js.map +0 -1
- package/lib/shared/interfaces/index.js.map +0 -1
- package/lib/shared/math.js.map +0 -1
- package/lib/shared/model/FabricBaseModel.js.map +0 -1
- package/lib/shared/model/FabricIdentifiedBaseModel.js.map +0 -1
- package/lib/shared/model/Identity.js.map +0 -1
- package/lib/shared/model/IdentityCredentials.js.map +0 -1
- package/lib/shared/model/index.js.map +0 -1
- package/lib/shared/overrides/Model.js.map +0 -1
- package/lib/shared/overrides/index.js.map +0 -1
- package/lib/shared/overrides/overrides.js.map +0 -1
- package/lib/shared/types.js.map +0 -1
- package/lib/version.js.map +0 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { CouchDBAdapter, CouchDBKeys, } from "@decaf-ts/for-couchdb";
|
|
2
2
|
import { Model, ValidationKeys } from "@decaf-ts/decorator-validation";
|
|
3
3
|
import { FabricContractContext } from "./ContractContext.js";
|
|
4
|
-
import { BadRequestError, ConflictError, InternalError, NotFoundError, onCreate, onCreateUpdate, SerializationError, } from "@decaf-ts/db-decorators";
|
|
4
|
+
import { BadRequestError, BulkCrudOperationKeys, ConflictError, InternalError, NotFoundError, onCreate, onCreateUpdate, SerializationError, } from "@decaf-ts/db-decorators";
|
|
5
5
|
import { Object as FabricObject, Property, Property as FabricProperty, } from "fabric-contract-api";
|
|
6
6
|
import { Logging } from "@decaf-ts/logging";
|
|
7
|
-
import { PersistenceKeys, UnsupportedError, Adapter, QueryError, PagingError, MigrationError, ObserverError, AuthorizationError, ForbiddenError, ConnectionError, TransactionOperationKeys, } from "@decaf-ts/core";
|
|
7
|
+
import { PersistenceKeys, UnsupportedError, Adapter, QueryError, PagingError, MigrationError, ObserverError, AuthorizationError, ForbiddenError, ConnectionError, TransactionOperationKeys, promiseSequence, resolveBulkSequenceResult, } from "@decaf-ts/core";
|
|
8
8
|
import { FabricContractRepository } from "./FabricContractRepository.js";
|
|
9
9
|
import { FabricStatement } from "./FabricContractStatement.js";
|
|
10
10
|
import { FabricContractSequence } from "./FabricContractSequence.js";
|
|
@@ -257,84 +257,55 @@ export class FabricContractAdapter extends CouchDBAdapter {
|
|
|
257
257
|
Object.assign(model, await this.forPrivate(col).readState(composedKey, ctx));
|
|
258
258
|
return model;
|
|
259
259
|
}
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
// try {
|
|
310
|
-
// const tasks = id.map(
|
|
311
|
-
// (i) => () =>
|
|
312
|
-
// isMirror && mirrorCollection
|
|
313
|
-
// ? readMirror(
|
|
314
|
-
// clazz,
|
|
315
|
-
// i,
|
|
316
|
-
// ...args,
|
|
317
|
-
// ctx.override({ noEmitSingle: true })
|
|
318
|
-
// )
|
|
319
|
-
// : this.read(clazz, i, ...args, ctx.override({ noEmitSingle: true }))
|
|
320
|
-
// );
|
|
321
|
-
//
|
|
322
|
-
// const rawResult = continueOnError
|
|
323
|
-
// ? await promiseSequence(tasks, true)
|
|
324
|
-
// : await promiseSequence(tasks);
|
|
325
|
-
// return resolveBulkSequenceResult(
|
|
326
|
-
// rawResult,
|
|
327
|
-
// continueOnError,
|
|
328
|
-
// log,
|
|
329
|
-
// BulkCrudOperationKeys.READ_ALL
|
|
330
|
-
// );
|
|
331
|
-
// } catch (e) {
|
|
332
|
-
// throw this.parseError(e as Error);
|
|
333
|
-
// } finally {
|
|
334
|
-
// ctx.put("mirror" as any, undefined);
|
|
335
|
-
// ctx.put("mirrorCollection" as any, undefined);
|
|
336
|
-
// }
|
|
337
|
-
// }
|
|
260
|
+
/**
|
|
261
|
+
* @description Retrieves multiple records from the database
|
|
262
|
+
* @summary Fetches multiple records with the given IDs from the specified table
|
|
263
|
+
* @param {string} tableName - The name of the table to read from
|
|
264
|
+
* @param id - The identifiers of the records to retrieve
|
|
265
|
+
* @param {...any[]} args - Additional arguments specific to the adapter implementation
|
|
266
|
+
* @return A promise that resolves to an array of retrieved records
|
|
267
|
+
*/
|
|
268
|
+
async readAll(clazz, id, ...args) {
|
|
269
|
+
const { log, ctx } = this.logCtx(args, this.readAll);
|
|
270
|
+
const tableName = Model.tableName(clazz);
|
|
271
|
+
log.debug(`Reading ${id.length} entries ${tableName} table`);
|
|
272
|
+
const breakOnSingleFailure = ctx.get("breakOnSingleFailureInBulk") ?? true;
|
|
273
|
+
const continueOnError = !breakOnSingleFailure;
|
|
274
|
+
const mirrorCollection = ctx.getOrUndefined("mirrorCollection");
|
|
275
|
+
const isMirror = ctx.getOrUndefined("mirror");
|
|
276
|
+
const readMirror = async (clazz, id, ...args) => {
|
|
277
|
+
if (!mirrorCollection)
|
|
278
|
+
throw new BadRequestError("Missing mirror collection for mirror read");
|
|
279
|
+
try {
|
|
280
|
+
const { ctx, log } = this.logCtx(args, readMirror);
|
|
281
|
+
log.info(`in ADAPTER read with args ${args}`);
|
|
282
|
+
const tableName = Model.tableName(clazz);
|
|
283
|
+
const composedKey = ctx.stub.createCompositeKey(tableName, [
|
|
284
|
+
String(id),
|
|
285
|
+
]);
|
|
286
|
+
return await this.forPrivate(mirrorCollection).readState(composedKey, ctx);
|
|
287
|
+
}
|
|
288
|
+
catch (e) {
|
|
289
|
+
throw this.parseError(e);
|
|
290
|
+
}
|
|
291
|
+
};
|
|
292
|
+
try {
|
|
293
|
+
const tasks = id.map((i) => () => isMirror && mirrorCollection
|
|
294
|
+
? readMirror(clazz, i, ...args, ctx.override({ noEmitSingle: true }))
|
|
295
|
+
: this.read(clazz, i, ...args, ctx.override({ noEmitSingle: true })));
|
|
296
|
+
const rawResult = continueOnError
|
|
297
|
+
? await promiseSequence(tasks, true)
|
|
298
|
+
: await promiseSequence(tasks);
|
|
299
|
+
return resolveBulkSequenceResult(rawResult, continueOnError, log, BulkCrudOperationKeys.READ_ALL);
|
|
300
|
+
}
|
|
301
|
+
catch (e) {
|
|
302
|
+
throw this.parseError(e);
|
|
303
|
+
}
|
|
304
|
+
finally {
|
|
305
|
+
ctx.put("mirror", undefined);
|
|
306
|
+
ctx.put("mirrorCollection", undefined);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
338
309
|
/**
|
|
339
310
|
* @description Updates a record in the state database
|
|
340
311
|
* @summary Serializes a model and updates it in the Fabric state database
|
|
@@ -1137,4 +1108,4 @@ export class FabricContractAdapter extends CouchDBAdapter {
|
|
|
1137
1108
|
}
|
|
1138
1109
|
FabricContractAdapter.decoration();
|
|
1139
1110
|
Adapter.setCurrent(FabricFlavour);
|
|
1140
|
-
//# sourceMappingURL=ContractAdapter.js.map
|
|
1111
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJhY3RBZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbnRyYWN0cy9Db250cmFjdEFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGNBQWMsRUFDZCxXQUFXLEdBR1osTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXZFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSw2QkFBMEI7QUFDMUQsT0FBTyxFQUNMLGVBQWUsRUFFZixxQkFBcUIsRUFDckIsYUFBYSxFQUNiLGFBQWEsRUFDYixhQUFhLEVBQ2IsUUFBUSxFQUNSLGNBQWMsRUFHZCxrQkFBa0IsR0FDbkIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBRUwsTUFBTSxJQUFJLFlBQVksRUFDdEIsUUFBUSxFQUNSLFFBQVEsSUFBSSxjQUFjLEdBQzNCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFVLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFDTCxlQUFlLEVBSWYsZ0JBQWdCLEVBQ2hCLE9BQU8sRUFHUCxVQUFVLEVBQ1YsV0FBVyxFQUNYLGNBQWMsRUFDZCxhQUFhLEVBQ2Isa0JBQWtCLEVBQ2xCLGNBQWMsRUFDZCxlQUFlLEVBV2Ysd0JBQXdCLEVBR3hCLGVBQWUsRUFDZix5QkFBeUIsR0FDMUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsc0NBQW1DO0FBT3RFLE9BQU8sRUFBRSxlQUFlLEVBQUUscUNBQWtDO0FBQzVELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxvQ0FBaUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxpQ0FBNEI7QUFDcEQsT0FBTyxFQUFFLDZCQUE2QixFQUFFLHFEQUFnRDtBQUN4RixPQUFPLEVBQ0wsS0FBSyxFQUVMLFVBQVUs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d0Q7WUFDeEQsT0FBTyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN4QixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDOUMsWUFBWSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDOUIsQ0FBQztZQUVELE9BQU8sWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFDO2FBQ0QsS0FBSyxFQUFFLENBQUM7SUFDYixDQUFDOztBQUdILHFCQUFxQixDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ25DLE9BQU8sQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb3VjaERCQWRhcHRlcixcbiAgQ291Y2hEQktleXMsXG4gIE1hbmdvUXVlcnksXG4gIFZpZXdSZXNwb25zZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuaW1wb3J0IHsgTW9kZWwsIFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljQ29udHJhY3RGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBGYWJyaWNDb250cmFjdENvbnRleHQgfSBmcm9tIFwiLi9Db250cmFjdENvbnRleHRcIjtcbmltcG9ydCB7XG4gIEJhZFJlcXVlc3RFcnJvcixcbiAgQmFzZUVycm9yLFxuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIENvbmZsaWN0RXJyb3IsXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIG9uQ3JlYXRlLFxuICBvbkNyZWF0ZVVwZGF0ZSxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgUHJpbWFyeUtleVR5cGUsXG4gIFNlcmlhbGl6YXRpb25FcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1xuICBDb250ZXh0IGFzIEN0eCxcbiAgT2JqZWN0IGFzIEZhYnJpY09iamVjdCxcbiAgUHJvcGVydHksXG4gIFByb3BlcnR5IGFzIEZhYnJpY1Byb3BlcnR5LFxufSBmcm9tIFwiZmFicmljLWNvbnRyYWN0LWFwaVwiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQge1xuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFJlbGF0aW9uc01ldGFkYXRhLFxuICBTZXF1ZW5jZSxcbiAgU2VxdWVuY2VPcHRpb25zLFxuICBVbnN1cHBvcnRlZEVycm9yLFxuICBBZGFwdGVyLFxuICBQcmVwYXJlZE1vZGVsLFxuICBSZXBvc2l0b3J5LFxuICBRdWVyeUVycm9yLFxuICBQYWdpbmdFcnJvcixcbiAgTWlncmF0aW9uRXJyb3IsXG4gIE9ic2VydmVyRXJyb3IsXG4gIEF1dGhvcml6YXRpb25FcnJvcixcbiAgRm9yYmlkZGVuRXJyb3IsXG4gIENvbm5lY3Rpb25FcnJvcixcbiAgQ29udGV4dHVhbGl6ZWRBcmdzLFxuICBDb250ZXh0LFxuICBSYXdSZXN1bHQsXG4gIFBhZ2luYXRvcixcbiAgQ29udGV4dHVhbEFyZ3MsXG4gIE1heWJlQ29udGV4dHVhbEFyZyxcbiAgTWV0aG9kT3JPcGVyYXRpb24sXG4gIEFsbE9wZXJhdGlvbktleXMsXG4gIEZsYWdzT2YsXG4gIENvbnRleHRPZixcbiAgVHJhbnNhY3Rpb25PcGVyYXRpb25LZXlzLFxuICBFdmVudElkcyxcbiAgRGlzcGF0Y2gsXG4gIHByb21pc2VTZXF1ZW5jZSxcbiAgcmVzb2x2ZUJ1bGtTZXF1ZW5jZVJlc3VsdCxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBGYWJyaWNDb250cmFjdFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9GYWJyaWNDb250cmFjdFJlcG9zaXRvcnlcIjtcbmltcG9ydCB7XG4gIENoYWluY29kZVN0dWIsXG4gIENsaWVudElkZW50aXR5LFxuICBJdGVyYXRvcnMsXG4gIFN0YXRlUXVlcnlSZXNwb25zZSxcbn0gZnJvbSBcImZhYnJpYy1zaGltLWFwaVwiO1xuaW1wb3J0IHsgRmFicmljU3RhdGVtZW50IH0gZnJvbSBcIi4vRmFicmljQ29udHJhY3RTdGF0ZW1lbnRcIjtcbmltcG9ydCB7IEZhYnJpY0NvbnRyYWN0U2VxdWVuY2UgfSBmcm9tIFwiLi9GYWJyaWNDb250cmFjdFNlcXVlbmNlXCI7XG5pbXBvcnQgeyBGYWJyaWNGbGF2b3VyIH0gZnJvbSBcIi4uL3NoYXJlZC9jb25zdGFudHNcIjtcbmltcG9ydCB7IFNpbXBsZURldGVybWluaXN0aWNTZXJpYWxpemVyIH0gZnJvbSBcIi4uL3NoYXJlZC9TaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplclwiO1xuaW1wb3J0IHtcbiAgYXBwbHksXG4gIENvbnN0cnVjdG9yLFxuICBEZWNvcmF0aW9uLFxuICBNZXRhZGF0YSxcbiAgcHJvcE1ldGFkYXRhLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY0NvbnRyYWN0UGFnaW5hdG9yIH0gZnJvbSBcIi4vRmFicmljQ29udHJhY3RQYWdpbmF0b3JcIjtcbmltcG9ydCB7IE1pc3NpbmdDb250ZXh0RXJyb3IgfSBmcm9tIFwiLi4vc2hhcmVkL2Vycm9yc1wiO1xuaW1wb3J0IHsgU2VncmVnYXRlZE1vZGVsIH0gZnJvbSBcIi4uL3NoYXJlZC9pbmRleFwiO1xuaW1wb3J0IHsgRmFicmljQ29udHJhY3REaXNwYXRjaCB9IGZyb20gXCIuL0ZhYnJpY0NvbnRyYWN0RGlzcGF0Y2hcIjtcblxuZXhwb3J0IHR5cGUgRmFicmljQ29udGV4dHVhbGl6ZWRBcmdzPFxuICBBUkdTIGV4dGVuZHMgYW55W10gPSBhbnlbXSxcbiAgRVhURU5EIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuPiA9IENvbnRleHR1YWxpemVkQXJnczxGYWJyaWNDb250cmFjdENvbnRleHQsIEFSR1MsIEVYVEVORD4gJiB7XG4gIHN0dWI6IENoYWluY29kZVN0dWI7XG4gIGlkZW50aXR5OiBDbGllbnRJZGVudGl0eTtcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGNyZWF0b3Igb3IgdXBkYXRlciBmaWVsZCBpbiBhIG1vZGVsIGJhc2VkIG9uIHRoZSB1c2VyIGluIHRoZSBjb250ZXh0XG4gKiBAc3VtbWFyeSBDYWxsYmFjayBmdW5jdGlvbiB1c2VkIGluIGRlY29yYXRvcnMgdG8gYXV0b21hdGljYWxseSBzZXQgdGhlIGNyZWF0ZWRfYnkgb3IgdXBkYXRlZF9ieSBmaWVsZHNcbiAqIHdpdGggdGhlIHVzZXJuYW1lIGZyb20gdGhlIGNvbnRleHQgd2hlbiBhIGRvY3VtZW50IGlzIGNyZWF0ZWQgb3IgdXBkYXRlZFxuICogQHRlbXBsYXRlIE0gLSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUeXBlIGV4dGVuZGluZyBOYW5vUmVwb3NpdG9yeTxNPlxuICogQHRlbXBsYXRlIFYgLSBUeXBlIGV4dGVuZGluZyBSZWxhdGlvbnNNZXRhZGF0YVxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7RmFicmljQ29udHJhY3RDb250ZXh0fSBjb250ZXh0IC0gVGhlIG9wZXJhdGlvbiBjb250ZXh0IGNvbnRhaW5pbmcgdXNlciBpbmZvcm1hdGlvblxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIHJlbGF0aW9uIG1ldGFkYXRhXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byBzZXQgd2l0aCB0aGUgdXNlcm5hbWVcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgYmVpbmcgY3JlYXRlZCBvciB1cGRhdGVkXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAqIEBmdW5jdGlvbiBjcmVhdGVkQnlPbkZhYnJpY0NyZWF0ZVVwZGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpmYWJyaWMuY29udHJhY3RzXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEYgYXMgY3JlYXRlZEJ5T25OYW5vQ3JlYXRlVXBkYXRlXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ29udGV4dFxuICogICBwYXJ0aWNpcGFudCBNIGFzIE1vZGVsXG4gKiAgIEYtPj5DOiBnZXQoXCJ1c2VyXCIpXG4gKiAgIEMtLT4+RjogdXNlciBvYmplY3RcbiAqICAgRi0+Pk06IHNldCBrZXkgdG8gdXNlci5uYW1lXG4gKiAgIE5vdGUgb3ZlciBGOiBJZiBubyB1c2VyIGluIGNvbnRleHRcbiAqICAgRi0tPj5GOiB0aHJvdyBVbnN1cHBvcnRlZEVycm9yXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVkQnlPbkZhYnJpY0NyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgRmFicmljQ29udHJhY3RSZXBvc2l0b3J5PE0+LFxuICBWIGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGEsXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0T2Y8Uj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHVzZXIgPSBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzIENsaWVudElkZW50aXR5O1xuICAgIG1vZGVsW2tleV0gPSB1c2VyLmdldElEKCkgYXMgTVt0eXBlb2Yga2V5XTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgIFwiTm8gVXNlciBmb3VuZCBpbiBjb250ZXh0LiBQbGVhc2UgcHJvdmlkZSBhIHVzZXIgaW4gdGhlIGNvbnRleHRcIlxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQWRhcHRlciBmb3IgSHlwZXJsZWRnZXIgRmFicmljIGNoYWluY29kZSBzdGF0ZSBkYXRhYmFzZSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIENvdWNoREItbGlrZSBpbnRlcmZhY2UgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIEZhYnJpYyBzdGF0ZSBkYXRhYmFzZSBmcm9tIHdpdGhpbiBhIGNoYWluY29kZSBjb250cmFjdFxuICogQHRlbXBsYXRlIHZvaWQgLSBObyBjb25maWd1cmF0aW9uIG5lZWRlZCBmb3IgY29udHJhY3QgYWRhcHRlclxuICogQHRlbXBsYXRlIEZhYnJpY0NvbnRyYWN0RmxhZ3MgLSBGbGFncyBzcGVjaWZpYyB0byBGYWJyaWMgY29udHJhY3Qgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIEZhYnJpY0NvbnRyYWN0Q29udGV4dCAtIENvbnRleHQgdHlwZSBmb3IgRmFicmljIGNvbnRyYWN0IG9wZXJhdGlvbnNcbiAqIEBjbGFzcyBGYWJyaWNDb250cmFjdEFkYXB0ZXJcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBJbiBhIEZhYnJpYyBjaGFpbmNvZGUgY29udHJhY3QgY2xhc3NcbiAqIGltcG9ydCB7IEZhYnJpY0NvbnRyYWN0QWRhcHRlciB9IGZyb20gJ0BkZWNhZi10cy9mb3ItZmFicmljJztcbiAqXG4gKiBleHBvcnQgY2xhc3MgTXlDb250cmFjdCBleHRlbmRzIENvbnRyYWN0IHtcbiAqICAgcHJpdmF0ZSBhZGFwdGVyID0gbmV3IEZhYnJpY0NvbnRyYWN0QWRhcHRlcigpO1xuICpcbiAqICAgQFRyYW5zYWN0aW9uKClcbiAqICAgYXN5bmMgY3JlYXRlQXNzZXQoY3R4OiBDb250ZXh0LCBpZDogc3RyaW5nLCBkYXRhOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAqICAgICBjb25zdCBtb2RlbCA9IHsgaWQsIGRhdGEsIHRpbWVzdGFtcDogRGF0ZS5ub3coKSB9O1xuICogICAgIGF3YWl0IHRoaXMuYWRhcHRlci5jcmVhdGUoJ2Fzc2V0cycsIGlkLCBtb2RlbCwge30sIHsgc3R1YjogY3R4LnN0dWIgfSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDb250cmFjdFxuICogICBwYXJ0aWNpcGFudCBGYWJyaWNDb250cmFjdEFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgU3R1YlxuICogICBwYXJ0aWNpcGFudCBTdGF0ZURCXG4gKlxuICogICBDb250cmFjdC0+PkZhYnJpY0NvbnRyYWN0QWRhcHRlcjogY3JlYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsLCB0cmFuc2llbnQsIGN0eClcbiAqICAgRmFicmljQ29udHJhY3RBZGFwdGVyLT4+RmFicmljQ29udHJhY3RBZGFwdGVyOiBTZXJpYWxpemUgbW9kZWwgdG8gSlNPTlxuICogICBGYWJyaWNDb250cmFjdEFkYXB0ZXItPj5TdHViOiBwdXRTdGF0ZShpZCwgc2VyaWFsaXplZERhdGEpXG4gKiAgIFN0dWItPj5TdGF0ZURCOiBXcml0ZSBkYXRhXG4gKiAgIFN0YXRlREItLT4+U3R1YjogU3VjY2Vzc1xuICogICBTdHViLS0+PkZhYnJpY0NvbnRyYWN0QWRhcHRlcjogU3VjY2Vzc1xuICogICBGYWJyaWNDb250cmFjdEFkYXB0ZXItLT4+Q29udHJhY3Q6IG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBGYWJyaWNDb250cmFjdEFkYXB0ZXIgZXh0ZW5kcyBDb3VjaERCQWRhcHRlcjxcbiAgYW55LFxuICB2b2lkLFxuICBGYWJyaWNDb250cmFjdENvbnRleHRcbj4ge1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0Q2xpZW50KCk6IHZvaWQge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFwiQ2xpZW50IGlzIG5vdCBzdXBwb3J0ZWQgaW4gRmFicmljIGNvbnRyYWN0c1wiKTtcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRleHQgZGVjb2RlciBmb3IgY29udmVydGluZyBiaW5hcnkgZGF0YSB0byBzdHJpbmdzXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcihcInV0ZjhcIik7XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyByZWFkb25seSBzZXJpYWxpemVyID0gbmV3IFNpbXBsZURldGVybWluaXN0aWNTZXJpYWxpemVyKCk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb250ZXh0IGNvbnN0cnVjdG9yIGZvciB0aGlzIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgT3ZlcnJpZGVzIHRoZSBiYXNlIENvbnRleHQgY29uc3RydWN0b3Igd2l0aCBGYWJyaWNDb250cmFjdENvbnRleHRcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXQgQ29udGV4dCgpOiBDb25zdHJ1Y3RvcjxGYWJyaWNDb250cmFjdENvbnRleHQ+IHtcbiAgICByZXR1cm4gRmFicmljQ29udHJhY3RDb250ZXh0O1xuICB9XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgcmVwb3NpdG9yeSBjb25zdHJ1Y3RvciBmb3IgdGhpcyBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeSBjb25zdHJ1Y3RvciBmb3IgY3JlYXRpbmcgcmVwb3NpdG9yaWVzXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAgICogQHJldHVybiB7Q29uc3RydWN0b3I8UmVwb3NpdG9yeTxNLCBNYW5nb1F1ZXJ5LCBGYWJyaWNDb250cmFjdEFkYXB0ZXIsIEZhYnJpY0NvbnRyYWN0RmxhZ3MsIEZhYnJpY0NvbnRyYWN0Q29udGV4dD4+fSBUaGUgcmVwb3NpdG9yeSBjb25zdHJ1Y3RvclxuICAgKi9cbiAgb3ZlcnJpZGUgcmVwb3NpdG9yeTxcbiAgICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxcbiAgICAgIGFueSxcbiAgICAgIEFkYXB0ZXI8YW55LCB2b2lkLCBNYW5nb1F1ZXJ5LCBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+PlxuICAgID4sXG4gID4oKTogQ29uc3RydWN0b3I8Uj4ge1xuICAgIHJldHVybiBGYWJyaWNDb250cmFjdFJlcG9zaXRvcnkgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxSPjtcbiAgfVxuXG4gIG92ZXJyaWRlIFBhZ2luYXRvcjxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHF1ZXJ5OiBNYW5nb1F1ZXJ5LFxuICAgIHNpemU6IG51bWJlcixcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT5cbiAgKTogUGFnaW5hdG9yPE0sIGFueSwgTWFuZ29RdWVyeT4ge1xuICAgIHJldHVybiBuZXcgRmFicmljQ29udHJhY3RQYWdpbmF0b3IodGhpcywgcXVlcnksIHNpemUsIGNsYXp6KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIFNlcXVlbmNlKG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucyk6IFByb21pc2U8U2VxdWVuY2U+IHtcbiAgICByZXR1cm4gbmV3IEZhYnJpY0NvbnRyYWN0U2VxdWVuY2Uob3B0aW9ucywgdGhpcyBhcyBhbnkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIERpc3BhdGNoKCk6IERpc3BhdGNoPEZhYnJpY0NvbnRyYWN0QWRhcHRlcj4ge1xuICAgIHJldHVybiBuZXcgRmFicmljQ29udHJhY3REaXNwYXRjaCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IEZhYnJpY0NvbnRyYWN0QWRhcHRlciBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhbiBhZGFwdGVyIGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBGYWJyaWMgc3RhdGUgZGF0YWJhc2VcbiAgICogQHBhcmFtIHt2b2lkfSBzY29wZSAtIE5vdCB1c2VkIGluIHRoaXMgYWRhcHRlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FsaWFzXSAtIE9wdGlvbmFsIGFsaWFzIGZvciB0aGUgYWRhcHRlciBpbnN0YW5jZVxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IHZvaWQsIGFsaWFzPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIEZhYnJpY0ZsYXZvdXIsIGFsaWFzKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGZvcihjb25maWc6IFBhcnRpYWw8YW55PiwgLi4uYXJnczogYW55KTogdHlwZW9mIHRoaXMge1xuICAgIHJldHVybiBzdXBlci5mb3IoY29uZmlnLCAuLi5hcmdzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRNb2RlbERlZmF1bHRzPE0gZXh0ZW5kcyBNb2RlbD4oY2xheno6IENvbnN0cnVjdG9yPE0+KSB7XG4gICAgY29uc3QgbSA9IG5ldyBjbGF6eigpO1xuICAgIHJldHVybiAoTWV0YWRhdGEucHJvcGVydGllcyhjbGF6eikgfHwgW10pLnJlZHVjZShcbiAgICAgIChhY2MsIHApID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBtW3AgYXMga2V5b2YgTV0gIT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgICAgYWNjW3AgYXMga2V5b2YgTV0gPSBtW3AgYXMga2V5b2YgTV07XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LFxuICAgICAge30gYXMgUmVjb3JkPGtleW9mIE0sIGFueT5cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgcmVjb3JkIGluIHRoZSBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBTZXJpYWxpemVzIGEgbW9kZWwgYW5kIHN0b3JlcyBpdCBpbiB0aGUgRmFicmljIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcmVjb3JkIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIChub3QgdXNlZCBpbiB0aGlzIGltcGxlbWVudGF0aW9uKVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMsIGluY2x1ZGluZyB0aGUgY2hhaW5jb2RlIHN0dWIgYW5kIGxvZ2dlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY3JlYXRlZCByZWNvcmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5jcmVhdGUpO1xuICAgIHRoaXMuZW5mb3JjZU1pcnJvckF1dGhvcml6YXRpb24oY2xhenosIGN0eCk7XG4gICAgbG9nLmluZm8oYGluIEFEQVBURVIgY3JlYXRlIHdpdGggYXJncyAke2FyZ3N9YCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcbiAgICBjb25zdCBjb21wb3NlZEtleSA9IGN0eC5zdHViLmNyZWF0ZUNvbXBvc2l0ZUtleSh0YWJsZU5hbWUsIFtTdHJpbmcoaWQpXSk7XG4gICAgY29uc3QgbWlycm9yQ29sbGVjdGlvbiA9IGN0eC5nZXRPclVuZGVmaW5lZChcIm1pcnJvckNvbGxlY3Rpb25cIikgYXNcbiAgICAgIHwgc3RyaW5nXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBmdWxseVNlZ3JlZ2F0ZWQgPSBjdHguaXNGdWxseVNlZ3JlZ2F0ZWQgJiYgIW1pcnJvckNvbGxlY3Rpb247XG5cbiAgICBpZiAoIW1pcnJvckNvbGxlY3Rpb24pIHtcbiAgICAgIGxldCBleGlzdGluZzogYW55O1xuICAgICAgdHJ5IHtcbiAgICAgICAgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLnJlYWRTdGF0ZShjb21wb3NlZEtleSwgY3R4KTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4LWFzc2lnblxuICAgICAgICBlID0gdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgTm90Rm91bmRFcnJvcikpIHRocm93IGU7XG4gICAgICB9XG4gICAgICBpZiAoZXhpc3RpbmcpXG4gICAgICAgIHRocm93IG5ldyBDb25mbGljdEVycm9yKFxuICAgICAgICAgIGByZWNvcmQgd2l0aCBpZCAke2lkfSBpbiB0YWJsZSAke3RhYmxlTmFtZX0gYWxyZWFkeSBleGlzdHNgXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGxvZy5pbmZvKGBhZGRpbmcgZW50cnkgdG8gJHt0YWJsZU5hbWV9IHRhYmxlIHdpdGggcGsgJHtpZH1gKTtcblxuICAgICAgaWYgKG1pcnJvckNvbGxlY3Rpb24pIHtcbiAgICAgICAgbW9kZWwgPSBhd2FpdCB0aGlzLmZvclByaXZhdGUobWlycm9yQ29sbGVjdGlvbikucHV0U3RhdGUoXG4gICAgICAgICAgY29tcG9zZWRLZXksXG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgY3R4XG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkZWZhdWx0cyA9IHRoaXMuZ2V0TW9kZWxEZWZhdWx0cyhjbGF6eik7XG4gICAgICAgIC8vIGhhbmRsZSBwdWJsaWMgZGF0YSBpZiBub3QgZnVsbHkgc2VncmVnYXRlZFxuICAgICAgICBpZiAoIWZ1bGx5U2VncmVnYXRlZCkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKG1vZGVsKS5maWx0ZXIoKGspID0+IHtcbiAgICAgICAgICAgICAgaWYgKGsgPT09IENvdWNoREJLZXlzLlRBQkxFKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIHJldHVybiAhKFxuICAgICAgICAgICAgICAgIGRlZmF1bHRzICYmXG4gICAgICAgICAgICAgICAgayBpbiBkZWZhdWx0cyAmJlxuICAgICAgICAgICAgICAgIGRlZmF1bHRzW2sgYXMga2V5b2YgTV0gPT09IG1vZGVsW2tdXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KS5sZW5ndGhcbiAgICAgICAgICApXG4gICAgICAgICAgICBtb2RlbCA9IGF3YWl0IHRoaXMucHV0U3RhdGUoY29tcG9zZWRLZXksIG1vZGVsLCBjdHgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGFuZGxlIHNlZ3JlZ2F0ZWQgd3JpdGVzXG4gICAgICAgIGNvbnN0IGRhdGEgPSBjdHguZ2V0RnJvbUNoaWxkcmVuKFwic2VncmVnYXRlZERhdGFcIik7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBjb2xsZWN0aW9uIGluIGRhdGEpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmZvclByaXZhdGUoY29sbGVjdGlvbikucHV0U3RhdGUoXG4gICAgICAgICAgICAgICAgY29tcG9zZWRLZXksXG4gICAgICAgICAgICAgICAgZGF0YVtjb2xsZWN0aW9uXVtpZCBhcyBhbnldLFxuICAgICAgICAgICAgICAgIGN0eFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGw8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YWJsZU5hbWU6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ29udHJhY3RDb250ZXh0PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGlmIChpZC5sZW5ndGggIT09IG1vZGVsLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5jcmVhdGVBbGwpO1xuICAgIGNvbnN0IHRhYmxlTGFiZWwgPSBNb2RlbC50YWJsZU5hbWUodGFibGVOYW1lKTtcbiAgICBsb2cuZGVidWcoYENyZWF0aW5nICR7aWQubGVuZ3RofSBlbnRyaWVzICR7dGFibGVMYWJlbH0gdGFibGVgKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICBpZC5tYXAoKGksIGNvdW50KSA9PiB0aGlzLmNyZWF0ZSh0YWJsZU5hbWUsIGksIG1vZGVsW2NvdW50XSwgLi4uY3R4QXJncykpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZHMgYSByZWNvcmQgZnJvbSB0aGUgc3RhdGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGFuZCBkZXNlcmlhbGl6ZXMgYSByZWNvcmQgZnJvbSB0aGUgRmFicmljIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcmVjb3JkIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLCBpbmNsdWRpbmcgdGhlIGNoYWluY29kZSBzdHViIGFuZCBsb2dnZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHJldHJpZXZlZCByZWNvcmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJlYWQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ29udHJhY3RGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IHsgY3R4LCBsb2cgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmVhZCk7XG4gICAgbG9nLmluZm8oYGluIEFEQVBURVIgcmVhZCB3aXRoIGFyZ3MgJHthcmdzfWApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG5cbiAgICBjb25zdCBjb21wb3NlZEtleSA9IGN0eC5zdHViLmNyZWF0ZUNvbXBvc2l0ZUtleSh0YWJsZU5hbWUsIFtTdHJpbmcoaWQpXSk7XG4gICAgY29uc3QgbWlycm9yQ29sbGVjdGlvbiA9IGN0eC5nZXRPclVuZGVmaW5lZChcIm1pcnJvckNvbGxlY3Rpb25cIikgYXNcbiAgICAgIHwgc3RyaW5nXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBpc01pcnJvciA9IGN0eC5nZXRPclVuZGVmaW5lZChcIm1pcnJvclwiKSBhcyBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgIGlmIChpc01pcnJvciAmJiBtaXJyb3JDb2xsZWN0aW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5mb3JQcml2YXRlKG1pcnJvckNvbGxlY3Rpb24pLnJlYWRTdGF0ZShcbiAgICAgICAgICBjb21wb3NlZEtleSxcbiAgICAgICAgICBjdHhcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgY3R4LnB1dChcIm1pcnJvclwiIGFzIGFueSwgdW5kZWZpbmVkKTtcbiAgICAgICAgY3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG4gICAgdHJ5IHtcbiAgICAgIG1vZGVsID0gY3R4LmlzRnVsbHlTZWdyZWdhdGVkXG4gICAgICAgID8ge31cbiAgICAgICAgOiBhd2FpdCB0aGlzLnJlYWRTdGF0ZShjb21wb3NlZEtleSwgY3R4KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuXG4gICAgY29uc3QgcmVhZENvbGxlY3Rpb25zID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgICAgIC4uLihjdHguZ2V0UmVhZENvbGxlY3Rpb25zKCkgfHwgW10pLFxuICAgICAgLi4uKGN0eC5jb25zdW1lUmVhZENvbGxlY3Rpb25zKCkgfHwgW10pLFxuICAgIF0pO1xuICAgIGZvciAoY29uc3QgY29sIG9mIHJlYWRDb2xsZWN0aW9ucylcbiAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgIG1vZGVsLFxuICAgICAgICBhd2FpdCB0aGlzLmZvclByaXZhdGUoY29sKS5yZWFkU3RhdGUoY29tcG9zZWRLZXksIGN0eClcbiAgICAgICk7XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgbXVsdGlwbGUgcmVjb3JkcyBmcm9tIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBGZXRjaGVzIG11bHRpcGxlIHJlY29yZHMgd2l0aCB0aGUgZ2l2ZW4gSURzIGZyb20gdGhlIHNwZWNpZmllZCB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIHJlYWQgZnJvbVxuICAgKiBAcGFyYW0gaWQgLSBUaGUgaWRlbnRpZmllcnMgb2YgdGhlIHJlY29yZHMgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHNwZWNpZmljIHRvIHRoZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgcmV0cmlldmVkIHJlY29yZHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJlYWRBbGw8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJlYWRBbGwpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgbG9nLmRlYnVnKGBSZWFkaW5nICR7aWQubGVuZ3RofSBlbnRyaWVzICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGNvbnN0IGJyZWFrT25TaW5nbGVGYWlsdXJlID0gY3R4LmdldChcImJyZWFrT25TaW5nbGVGYWlsdXJlSW5CdWxrXCIpID8/IHRydWU7XG4gICAgY29uc3QgY29udGludWVPbkVycm9yID0gIWJyZWFrT25TaW5nbGVGYWlsdXJlO1xuXG4gICAgY29uc3QgbWlycm9yQ29sbGVjdGlvbiA9IGN0eC5nZXRPclVuZGVmaW5lZChcIm1pcnJvckNvbGxlY3Rpb25cIikgYXNcbiAgICAgIHwgc3RyaW5nXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBpc01pcnJvciA9IGN0eC5nZXRPclVuZGVmaW5lZChcIm1pcnJvclwiKSBhcyBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgcmVhZE1pcnJvciA9IGFzeW5jIDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPj5cbiAgICApID0+IHtcbiAgICAgIGlmICghbWlycm9yQ29sbGVjdGlvbilcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFcnJvcihcIk1pc3NpbmcgbWlycm9yIGNvbGxlY3Rpb24gZm9yIG1pcnJvciByZWFkXCIpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gdGhpcy5sb2dDdHgoYXJncywgcmVhZE1pcnJvcik7XG4gICAgICAgIGxvZy5pbmZvKGBpbiBBREFQVEVSIHJlYWQgd2l0aCBhcmdzICR7YXJnc31gKTtcbiAgICAgICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgICAgICBjb25zdCBjb21wb3NlZEtleSA9IGN0eC5zdHViLmNyZWF0ZUNvbXBvc2l0ZUtleSh0YWJsZU5hbWUsIFtcbiAgICAgICAgICBTdHJpbmcoaWQpLFxuICAgICAgICBdKTtcblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5mb3JQcml2YXRlKG1pcnJvckNvbGxlY3Rpb24pLnJlYWRTdGF0ZShcbiAgICAgICAgICBjb21wb3NlZEtleSxcbiAgICAgICAgICBjdHhcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdGFza3MgPSBpZC5tYXAoXG4gICAgICAgIChpKSA9PiAoKSA9PlxuICAgICAgICAgIGlzTWlycm9yICYmIG1pcnJvckNvbGxlY3Rpb25cbiAgICAgICAgICAgID8gcmVhZE1pcnJvcihcbiAgICAgICAgICAgICAgICBjbGF6eixcbiAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgIC4uLmFyZ3MsXG4gICAgICAgICAgICAgICAgY3R4Lm92ZXJyaWRlKHsgbm9FbWl0U2luZ2xlOiB0cnVlIH0pXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogdGhpcy5yZWFkKGNsYXp6LCBpLCAuLi5hcmdzLCBjdHgub3ZlcnJpZGUoeyBub0VtaXRTaW5nbGU6IHRydWUgfSkpXG4gICAgICApO1xuXG4gICAgICBjb25zdCByYXdSZXN1bHQgPSBjb250aW51ZU9uRXJyb3JcbiAgICAgICAgPyBhd2FpdCBwcm9taXNlU2VxdWVuY2UodGFza3MsIHRydWUpXG4gICAgICAgIDogYXdhaXQgcHJvbWlzZVNlcXVlbmNlKHRhc2tzKTtcbiAgICAgIHJldHVybiByZXNvbHZlQnVsa1NlcXVlbmNlUmVzdWx0KFxuICAgICAgICByYXdSZXN1bHQsXG4gICAgICAgIGNvbnRpbnVlT25FcnJvcixcbiAgICAgICAgbG9nLFxuICAgICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuUkVBRF9BTExcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjdHgucHV0KFwibWlycm9yXCIgYXMgYW55LCB1bmRlZmluZWQpO1xuICAgICAgY3R4LnB1dChcIm1pcnJvckNvbGxlY3Rpb25cIiBhcyBhbnksIHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGEgcmVjb3JkIGluIHRoZSBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBTZXJpYWxpemVzIGEgbW9kZWwgYW5kIHVwZGF0ZXMgaXQgaW4gdGhlIEZhYnJpYyBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgdXBkYXRlZCByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIChub3QgdXNlZCBpbiB0aGlzIGltcGxlbWVudGF0aW9uKVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMsIGluY2x1ZGluZyB0aGUgY2hhaW5jb2RlIHN0dWIgYW5kIGxvZ2dlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdXBkYXRlZCByZWNvcmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy51cGRhdGUpO1xuXG4gICAgdGhpcy5lbmZvcmNlTWlycm9yQXV0aG9yaXphdGlvbihjbGF6eiwgY3R4KTtcbiAgICBsb2cuaW5mbyhgaW4gQURBUFRFUiB1cGRhdGUgd2l0aCBhcmdzICR7YXJnc31gKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGNvbnN0IGNvbXBvc2VkS2V5ID0gY3R4LnN0dWIuY3JlYXRlQ29tcG9zaXRlS2V5KHRhYmxlTmFtZSwgW1N0cmluZyhpZCldKTtcbiAgICBjb25zdCBtaXJyb3JDb2xsZWN0aW9uID0gY3R4LmdldE9yVW5kZWZpbmVkKFwibWlycm9yQ29sbGVjdGlvblwiKSBhc1xuICAgICAgfCBzdHJpbmdcbiAgICAgIHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxvZy5pbmZvKGB1cGRhdGluZyBlbnRyeSBpbiAke3RhYmxlTmFtZX0gdGFibGUgd2l0aCBwayAke2lkfWApO1xuXG4gICAgICBpZiAobWlycm9yQ29sbGVjdGlvbikge1xuICAgICAgICBtb2RlbCA9IGF3YWl0IHRoaXMuZm9yUHJpdmF0ZShtaXJyb3JDb2xsZWN0aW9uKS5wdXRTdGF0ZShcbiAgICAgICAgICBjb21wb3NlZEtleSxcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICBjdHhcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRzID0gdGhpcy5nZXRNb2RlbERlZmF1bHRzKGNsYXp6KTtcbiAgICAgICAgLy8gaGFuZGxlIHB1YmxpYyBkYXRhXG4gICAgICAgIGlmIChcbiAgICAgICAgICBPYmplY3Qua2V5cyhtb2RlbCkuZmlsdGVyKChrKSA9PiB7XG4gICAgICAgICAgICBpZiAoayA9PT0gQ291Y2hEQktleXMuVEFCTEUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiAhKFxuICAgICAgICAgICAgICBkZWZhdWx0cyAmJlxuICAgICAgICAgICAgICBrIGluIGRlZmF1bHRzICYmXG4gICAgICAgICAgICAgIGRlZmF1bHRzW2sgYXMga2V5b2YgTV0gPT09IG1vZGVsW2tdXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pLmxlbmd0aFxuICAgICAgICApXG4gICAgICAgICAgbW9kZWwgPSBhd2FpdCB0aGlzLnB1dFN0YXRlKGNvbXBvc2VkS2V5LCBtb2RlbCwgY3R4KTtcblxuICAgICAgICAvLyBoYW5kbGUgc2VncmVnYXRlZCB3cml0ZXNcbiAgICAgICAgY29uc3QgZGF0YSA9IGN0eC5nZXRGcm9tQ2hpbGRyZW4oXCJzZWdyZWdhdGVkRGF0YVwiKTtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNvbGxlY3Rpb24gaW4gZGF0YSkge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuZm9yUHJpdmF0ZShjb2xsZWN0aW9uKS5wdXRTdGF0ZShcbiAgICAgICAgICAgICAgICBjb21wb3NlZEtleSxcbiAgICAgICAgICAgICAgICBkYXRhW2NvbGxlY3Rpb25dW2lkIGFzIGFueV0sXG4gICAgICAgICAgICAgICAgY3R4XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cblxuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIHJlY29yZCBmcm9tIHRoZSBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSByZWNvcmQgYW5kIHRoZW4gcmVtb3ZlcyBpdCBmcm9tIHRoZSBGYWJyaWMgc3RhdGUgZGF0YWJhc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSByZWNvcmQgaWRlbnRpZmllciB0byBkZWxldGVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLCBpbmNsdWRpbmcgdGhlIGNoYWluY29kZSBzdHViIGFuZCBsb2dnZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGRlbGV0ZWQgcmVjb3JkXG4gICAqL1xuICBhc3luYyBkZWxldGU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHQ8RmFicmljQ29udHJhY3RGbGFncz4+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IHsgY3R4LCBsb2cgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuZGVsZXRlKTtcblxuICAgIHRoaXMuZW5mb3JjZU1pcnJvckF1dGhvcml6YXRpb24oY2xhenosIGN0eCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIGNvbnN0IGNvbXBvc2VkS2V5ID0gY3R4LnN0dWIuY3JlYXRlQ29tcG9zaXRlS2V5KHRhYmxlTmFtZSwgW1N0cmluZyhpZCldKTtcbiAgICBjb25zdCBtaXJyb3JDb2xsZWN0aW9uID0gY3R4LmdldE9yVW5kZWZpbmVkKFwibWlycm9yQ29sbGVjdGlvblwiKSBhc1xuICAgICAgfCBzdHJpbmdcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIGxldCBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PjtcblxuICAgIGlmIChtaXJyb3JDb2xsZWN0aW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICBtb2RlbCA9IGF3YWl0IHRoaXMuZm9yUHJpdmF0ZShtaXJyb3JDb2xsZWN0aW9uKS5yZWFkU3RhdGUoXG4gICAgICAgICAgY29tcG9zZWRLZXksXG4gICAgICAgICAgY3R4XG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHRoaXMuZm9yUHJpdmF0ZShtaXJyb3JDb2xsZWN0aW9uKS5kZWxldGVTdGF0ZShjb21wb3NlZEtleSwgY3R4KTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICBtb2RlbCA9IGN0eC5pc0Z1bGx5U2VncmVnYXRlZFxuICAgICAgICAgID8ge31cbiAgICAgICAgICA6IGF3YWl0IHRoaXMucmVhZFN0YXRlKGNvbXBvc2VkS2V5LCBjdHgpO1xuICAgICAgICBpZiAoIWN0eC5pc0Z1bGx5U2VncmVnYXRlZCkge1xuICAgICAgICAgIGxvZy5kZWJ1ZyhgRGVsZXRpbmcgZW50cnkgJHtjb21wb3NlZEtleX0gZnJvbSBwdWJsaWMgbGVkZ2VyYCk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVTdGF0ZShjb21wb3NlZEtleSwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbGxlY3Rpb25zID0gY3R4LmdldFJlYWRDb2xsZWN0aW9ucygpO1xuICAgICAgaWYgKGNvbGxlY3Rpb25zICYmIGNvbGxlY3Rpb25zLmxlbmd0aCkge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbCBvZiBjb2xsZWN0aW9ucykge1xuICAgICAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgICAgIGBlbnN1cmluZyBjb2xsZWN0aW9uICR7Y29sfSBoYXMgZW50cnkgZm9yIGlkICR7Y29tcG9zZWRLZXl9IGJlZm9yZSBkZWxldGluZ2BcbiAgICAgICAgICApO1xuICAgICAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZm9yUHJpdmF0ZShjb2wpLnJlYWRTdGF0ZShjb21wb3NlZEtleSwgY3R4KVxuICAgICAgICAgICk7XG4gICAgICAgICAgbG9nLmRlYnVnKFxuICAgICAgICAgICAgYERlbGV0aW5nIHByaXZhdGUgY29sbGVjdGlvbiAke2NvbH0gZW50cnkgZm9yIGlkICR7Y29tcG9zZWRLZXl9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5mb3JQcml2YXRlKGNvbCkuZGVsZXRlU3RhdGUoY29tcG9zZWRLZXksIGN0eCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGRlbGV0ZVN0YXRlKGlkOiBzdHJpbmcsIGNvbnRleHQ6IEZhYnJpY0NvbnRyYWN0Q29udGV4dCkge1xuICAgIGF3YWl0IGNvbnRleHQuc3R1Yi5kZWxldGVTdGF0ZShpZCk7XG4gIH1cblxuICBmb3JQcml2YXRlKGNvbGxlY3Rpb246IHN0cmluZyk6IEZhYnJpY0NvbnRyYWN0QWRhcHRlciB7XG4gICAgY29uc3QgdG9PdmVycmlkZSA9IFtcbiAgICAgIHRoaXMucHV0U3RhdGUsXG4gICAgICB0aGlzLnJlYWRTdGF0ZSxcbiAgICAgIHRoaXMuZGVsZXRlU3RhdGUsXG4gICAgICB0aGlzLnF1ZXJ5UmVzdWx0LFxuICAgICAgdGhpcy5xdWVyeVJlc3VsdFBhZ2luYXRlZCxcbiAgICBdLm1hcCgoZm4pID0+IGZuLm5hbWUpO1xuICAgIHJldHVybiBuZXcgUHJveHkodGhpcywge1xuICAgICAgZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHtcbiAgICAgICAgaWYgKCF0b092ZXJyaWRlLmluY2x1ZGVzKHByb3AgYXMgc3RyaW5nKSlcbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7XG4gICAgICAgIHJldHVybiBuZXcgUHJveHkoKHRhcmdldCBhcyBhbnkpW3Byb3BdLCB7XG4gICAgICAgICAgYXN5bmMgYXBwbHkoZm4sIHRoaXNBcmcsIGFyZ3NMaXN0KSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHByb3ApIHtcbiAgICAgICAgICAgICAgY2FzZSBcInB1dFN0YXRlXCI6IHtcbiAgICAgICAgICAgICAgICAvLyBwdXRTdGF0ZSBzaWduYXR1cmU6IChpZDogc3RyaW5nLCBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PiwgY3R4OiBGYWJyaWNDb250cmFjdENvbnRleHQpXG4gICAgICAgICAgICAgICAgY29uc3QgW2lkLCBtb2RlbCwgY3R4XSA9IGFyZ3NMaXN0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvZyA9IGN0eC5sb2dnZXIuZm9yKHByb3ApO1xuICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgIGBQcml2YXRlIHdyaXRlIHRvICR7Y29sbGVjdGlvbn0gZm9yICR7aWQudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gQnVmZmVyLmZyb20oXG4gICAgICAgICAgICAgICAgICBGYWJyaWNDb250cmFjdEFkYXB0ZXIuc2VyaWFsaXplci5zZXJpYWxpemUoXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsIGFzIE1vZGVsLFxuICAgICAgICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYXdhaXQgY3R4LnN0dWIucHV0UHJpdmF0ZURhdGEoY29sbGVjdGlvbiwgaWQudG9TdHJpbmcoKSwgZGF0YSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vZGVsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgXCJkZWxldGVTdGF0ZVwiOiB7XG4gICAgICAgICAgICAgICAgLy8gZGVsZXRlU3RhdGUgc2lnbmF0dXJlOiAoaWQ6IHN0cmluZywgY29udGV4dDogRmFicmljQ29udHJhY3RDb250ZXh0KVxuICAgICAgICAgICAgICAgIGNvbnN0IFtpZCwgY3R4XSA9IGFyZ3NMaXN0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvZyA9IGN0eC5sb2dnZXIuZm9yKHByb3ApO1xuICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgIGBQcml2YXRlIGRlbGV0ZSBvbiAke2NvbGxlY3Rpb259IGZvciAke2lkLnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYXdhaXQgY3R4LnN0dWIuZGVsZXRlUHJpdmF0ZURhdGEoY29sbGVjdGlvbiwgaWQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgXCJyZWFkU3RhdGVcIjoge1xuICAgICAgICAgICAgICAgIC8vIHJlYWRTdGF0ZSBzaWduYXR1cmU6IChpZDogc3RyaW5nLCBjdHg6IEZhYnJpY0NvbnRyYWN0Q29udGV4dClcbiAgICAgICAgICAgICAgICBjb25zdCBbaWQsIGN0eF0gPSBhcmdzTGlzdDtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2cgPSBjdHgubG9nZ2VyLmZvcihwcm9wKTtcbiAgICAgICAgICAgICAgICBsb2cuZGVidWcoXG4gICAgICAgICAgICAgICAgICBgUHJpdmF0ZSByZWFkIGZyb20gJHtjb2xsZWN0aW9ufSBmb3IgJHtpZC50b1N0cmluZygpfWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBjdHguc3R1Yi5nZXRQcml2YXRlRGF0YShjb2xsZWN0aW9uLCBpZCk7XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhIHx8ICFkYXRhLnRvU3RyaW5nKCkubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYFJlY29yZCB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZGApO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gRmFicmljQ29udHJhY3RBZGFwdGVyLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoXG4gICAgICAgICAgICAgICAgICAgIGRhdGEudG9TdHJpbmcoXCJ1dGY4XCIpXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoXCJ1dGY4XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlIFwicXVlcnlSZXN1bHRcIjoge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtzdHViLCByYXdJbnB1dCwgLi4uYXJnc10gPSBhcmdzTGlzdDtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGxvZyB9ID0gdGhpc0FyZ1tcImxvZ0N0eFwiXShhcmdzLCBwcm9wKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICBgUXVlcnlpbmcgY29sbGVjdGlvbiAke2NvbGxlY3Rpb259IGZvciAke0pTT04uc3RyaW5naWZ5KHJhd0lucHV0KX1gXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgc3R1Yi5nZXRQcml2YXRlRGF0YVF1ZXJ5UmVzdWx0KFxuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShyYXdJbnB1dClcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgICAgICAgICAgICAgYGl0ZXJhdG9yIGZyb20gY29sbGVjdGlvbiAke2NvbGxlY3Rpb259IHJlY2VpdmVkYFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiByZXMuaXRlcmF0b3IgfHwgcmVzO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlIFwicXVlcnlSZXN1bHRQYWdpbmF0ZWRcIjoge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtzdHViLCByYXdJbnB1dCwgbGltaXQsICwgYm9va21hcmssIC4uLmFyZ3NdID0gYXJnc0xpc3Q7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBsb2cgfSA9IHRoaXNBcmdbXCJsb2dDdHhcIl0oYXJncywgcHJvcCk7XG4gICAgICAgICAgICAgICAgLy8gRmFicmljIGhhcyBubyBuYXRpdmUgcGFnaW5hdGlvbiBBUEkgZm9yIHByaXZhdGUgZGF0YS5cbiAgICAgICAgICAgICAgICAvLyBFbXVsYXRlIGl0OiBxdWVyeSBhbGwgbWF0Y2hpbmcgcmVjb3JkcyAod2l0aCBzZWxlY3RvclxuICAgICAgICAgICAgICAgIC8vIGFuZCBzb3J0IHByZXNlcnZlZCksIGxvY2F0ZSB0aGUgYm9va21hcmsgcG9zaXRpb24gaW5cbiAgICAgICAgICAgICAgICAvLyB0aGUgc29ydGVkIHJlc3VsdHMsIHRoZW4gc2xpY2UgdG8gdGhlIHBhZ2Ugc2l6ZS5cbiAgICAgICAgICAgICAgICBjb25zdCBxdWVyeSA9IHsgLi4ucmF3SW5wdXQgfTtcbiAgICAgICAgICAgICAgICBkZWxldGUgcXVlcnkubGltaXQ7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHF1ZXJ5LnNraXA7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHF1ZXJ5LmJvb2ttYXJrO1xuICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgIGBRdWVyeWluZyBjb2xsZWN0aW9uICR7Y29sbGVjdGlvbn0gZm9yICR7SlNPTi5zdHJpbmdpZnkocXVlcnkpfWBcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgbGV0IGl0ZXJhdG9yID0gYXdhaXQgKFxuICAgICAgICAgICAgICAgICAgc3R1YiBhcyBDaGFpbmNvZGVTdHViXG4gICAgICAgICAgICAgICAgKS5nZXRQcml2YXRlRGF0YVF1ZXJ5UmVzdWx0KGNvbGxlY3Rpb24sIEpTT04uc3RyaW5naWZ5KHF1ZXJ5KSk7XG4gICAgICAgICAgICAgICAgaXRlcmF0b3IgPSAoaXRlcmF0b3IgYXMgYW55KS5pdGVyYXRvciB8fCBpdGVyYXRvcjtcblxuICAgICAgICAgICAgICAgIGxvZy52ZXJib3NlKGBpdGVyYXRvciBmcm9tIGNvbGxlY3Rpb24gJHtjb2xsZWN0aW9ufSByZWNlaXZlZGApO1xuICAgICAgICAgICAgICAgIC8vIENvbGxlY3QgYWxsIG1hdGNoaW5nIHJlY29yZHMgZnJvbSB0aGUgaXRlcmF0b3JcbiAgICAgICAgICAgICAgICBjb25zdCBhbGxSZXN1bHRzOiBBcnJheTx7IGtleTogc3RyaW5nOyB2YWx1ZTogQnVmZmVyIH0+ID0gW107XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgIGlmIChyZXMudmFsdWUgJiYgcmVzLnZhbHVlLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGFsbFJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAga2V5OiByZXMudmFsdWUua2V5LFxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBCdWZmZXIuaXNCdWZmZXIocmVzLnZhbHVlLnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyByZXMudmFsdWUudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIDogQnVmZmVyLmZyb20oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcy52YWx1ZS52YWx1ZSBhcyBhbnkpLnRvU3RyaW5nKFwidXRmOFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGlmIChyZXMuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBpdGVyYXRvci5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBib29rbWFyayBwb3NpdGlvbiBhbmQgc2xpY2UgdGhlIHBhZ2VcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnRJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKGJvb2ttYXJrKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBmb3VuZCA9IGFsbFJlc3VsdHMuZmluZEluZGV4KChyKSA9PiByLmtleSA9PT0gYm9va21hcmspO1xuICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IGZvdW5kID49IDAgPyBmb3VuZCArIDEgOiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwYWdlZCA9IGFsbFJlc3VsdHMuc2xpY2Uoc3RhcnRJbmRleCwgc3RhcnRJbmRleCArIGxpbWl0KTtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0S2V5ID1cbiAgICAgICAgICAgICAgICAgIHBhZ2VkLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgPyBwYWdlZFtwYWdlZC5sZW5ndGggLSAxXS5rZXlcbiAgICAgICAgICAgICAgICAgICAgOiBib29rbWFyayB8fCBcIlwiO1xuXG4gICAgICAgICAgICAgICAgLy8gV3JhcCB0aGUgcGFnZSBpbiBhbiBhc3luYyBpdGVyYXRvciBmb3IgcmVzdWx0SXRlcmF0b3IoKVxuICAgICAgICAgICAgICAgIGxldCBpZHggPSAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFycmF5SXRlcmF0b3IgPSB7XG4gICAgICAgICAgICAgICAgICBhc3luYyBuZXh0KCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaWR4IDwgcGFnZWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHBhZ2VkW2lkeCsrXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkIGFzIGFueSwgZG9uZTogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGFzeW5jIGNsb3NlKCkge30sXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICBpdGVyYXRvcjpcbiAgICAgICAgICAgICAgICAgICAgYXJyYXlJdGVyYXRvciBhcyB1bmtub3duIGFzIEl0ZXJhdG9ycy5TdGF0ZVF1ZXJ5SXRlcmF0b3IsXG4gICAgICAgICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBmZXRjaGVkUmVjb3Jkc0NvdW50OiBwYWdlZC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIGJvb2ttYXJrOiBwYWdlZC5sZW5ndGggPj0gbGltaXQgPyBsYXN0S2V5IDogXCJcIixcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgYFVuc3VwcG9ydGVkIG1ldGhvZCBvdmVycmlkZSAke1N0cmluZyhwcm9wKX1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcHV0U3RhdGUoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjdHg6IEZhYnJpY0NvbnRyYWN0Q29udGV4dFxuICApIHtcbiAgICBsZXQgZGF0YTogQnVmZmVyO1xuXG4gICAgdHJ5IHtcbiAgICAgIGRhdGEgPSBCdWZmZXIuZnJvbShcbiAgICAgICAgRmFicmljQ29udHJhY3RBZGFwdGVyLnNlcmlhbGl6ZXIuc2VyaWFsaXplKG1vZGVsIGFzIE1vZGVsLCBmYWxzZSlcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBzZXJpYWxpemUgcmVjb3JkIHdpdGggaWQgJHtpZH06ICR7ZX1gXG4gICAgICApO1xuICAgIH1cbiAgICBhd2FpdCBjdHguc3R1Yi5wdXRTdGF0ZShpZC50b1N0cmluZygpLCBkYXRhKTtcblxuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyByZWFkU3RhdGUoaWQ6IHN0cmluZywgY3R4OiBGYWJyaWNDb250cmFjdENvbnRleHQpIHtcbiAgICBsZXQgcmVzdWx0OiBhbnk7XG5cbiAgICBjb25zdCB7IGxvZyB9ID0gdGhpcy5sb2dDdHgoW2N0eF0sIHRoaXMucmVhZFN0YXRlKTtcbiAgICBjb25zdCByZXMgPSAoYXdhaXQgY3R4LnN0dWIuZ2V0U3RhdGUoaWQudG9TdHJpbmcoKSkpLnRvU3RyaW5nKCk7XG4gICAgaWYgKCFyZXMpIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGBSZWNvcmQgd2l0aCBpZCAke2lkfSBub3QgZm91bmRgKTtcbiAgICBsb2cuc2lsbHkoYHN0YXRlIHJldHJpZXZlZCB1bmRlciBpZCAke2lkfWApO1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBGYWJyaWNDb250cmFjdEFkYXB0ZXIuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShyZXMudG9TdHJpbmcoKSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihgRmFpbGVkIHRvIHBhcnNlIHJlY29yZDogJHtlfWApO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcXVlcnlSZXN1bHQoXG4gICAgc3R1YjogQ2hhaW5jb2RlU3R1YixcbiAgICByYXdJbnB1dDogYW55LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDb250cmFjdENvbnRleHQ+XG4gICk6IFByb21pc2U8SXRlcmF0b3JzLlN0YXRlUXVlcnlJdGVyYXRvcj4ge1xuICAgIHJldHVybiBzdHViLmdldFF1ZXJ5UmVzdWx0KEpTT04uc3RyaW5naWZ5KHJhd0lucHV0KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcXVlcnlSZXN1bHRQYWdpbmF0ZWQoXG4gICAgc3R1YjogQ2hhaW5jb2RlU3R1YixcbiAgICByYXdJbnB1dDogYW55LFxuICAgIGxpbWl0OiBudW1iZXIgPSAyNTAsXG4gICAgcGFnZT86IG51bWJlcixcbiAgICBib29rbWFyaz86IHN0cmluZyB8IG51bWJlcixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxTdGF0ZVF1ZXJ5UmVzcG9uc2U8SXRlcmF0b3JzLlN0YXRlUXVlcnlJdGVyYXRvcj4+IHtcbiAgICByZXR1cm4gc3R1Yi5nZXRRdWVyeVJlc3VsdFdpdGhQYWdpbmF0aW9uKFxuICAgICAgSlNPTi5zdHJpbmdpZnkocmF3SW5wdXQpLFxuICAgICAgbGltaXQsXG4gICAgICBib29rbWFyaz8udG9TdHJpbmcoKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlY29kZXMgYmluYXJ5IGRhdGEgdG8gc3RyaW5nXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgVWludDhBcnJheSB0byBhIHN0cmluZyB1c2luZyBVVEYtOCBlbmNvZGluZ1xuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ1ZmZlciAtIFRoZSBiaW5hcnkgZGF0YSB0byBkZWNvZGVcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgZGVjb2RlZCBzdHJpbmdcbiAgICovXG4gIHByb3RlY3RlZCBkZWNvZGUoYnVmZmVyOiBVaW50OEFycmF5KSB7XG4gICAgcmV0dXJuIEZhYnJpY0NvbnRyYWN0QWRhcHRlci50ZXh0RGVjb2Rlci5kZWNvZGUoYnVmZmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBvcGVyYXRpb24gZmxhZ3MgZm9yIEZhYnJpYyBjb250cmFjdCBvcGVyYXRpb25zXG4gICAqIEBzdW1tYXJ5IE1lcmdlcyBkZWZhdWx0IGZsYWdzIHdpdGggRmFicmljLXNwZWNpZmljIGNvbnRleHQgaW5mb3JtYXRpb25cbiAgICogQHRlbXBsYXRlIE0gLSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN9IG9wZXJhdGlvbiAtIFRoZSBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7UGFydGlhbDxGYWJyaWNDb250cmFjdEZsYWdzPn0gZmxhZ3MgLSBQYXJ0aWFsIGZsYWdzIHRvIG1lcmdlIHdpdGggZGVmYXVsdHNcbiAgICogQHBhcmFtIHtDdHh9IGN0eCAtIFRoZSBGYWJyaWMgY2hhaW5jb2RlIGNvbnRleHRcbiAgICogQHJldHVybiB7RmFicmljQ29udHJhY3RGbGFnc30gVGhlIG1lcmdlZCBmbGFnc1xuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3BlcmF0aW9uOiBBbGxPcGVyYXRpb25LZXlzLFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPiB8IHVuZGVmaW5lZCxcbiAgICBmbGFnczogUGFydGlhbDxGYWJyaWNDb250cmFjdEZsYWdzPiB8IEZhYnJpY0NvbnRyYWN0Q29udGV4dCB8IEN0eCB8IGFueVxuICApOiBQcm9taXNlPEZhYnJpY0NvbnRyYWN0RmxhZ3M+IHtcbiAgICBsZXQgYmFzZUZsYWdzID0ge1xuICAgICAgc2VncmVnYXRlZDogZmFsc2UsXG4gICAgICByZWJ1aWxkV2l0aFRyYW5zaWVudDogZmFsc2UsXG4gICAgICBmdWxseVNlZ3JlZ2F0ZWQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICBiYXNlRmxhZ3MgPSBPYmplY3QuYXNzaWduKGJhc2VGbGFncywgZmxhZ3MpO1xuICAgIGNvbnN0IHN0dWJGcm9tRmxhZ3MgPVxuICAgICAgKGZsYWdzIGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dCkuc3R1YiB8fCAoZmxhZ3MgYXMgQ3R4KS5zdHViO1xuICAgIGNvbnN0IGlkZW50aXR5RnJvbUZsYWdzID1cbiAgICAgIChmbGFncyBhcyBGYWJyaWNDb250cmFjdENvbnRleHQpLmlkZW50aXR5IHx8XG4gICAgICAoZmxhZ3MgYXMgQ3R4KS5jbGllbnRJZGVudGl0eTtcbiAgICBpZiAoc3R1YkZyb21GbGFncyAmJiBpZGVudGl0eUZyb21GbGFncykge1xuICAgICAgY29uc3QgdHhJZCA9IHN0dWJGcm9tRmxhZ3MuZ2V0VHhJRCgpO1xuICAgICAgT2JqZWN0LmFzc2lnbihiYXNlRmxhZ3MsIHtcbiAgICAgICAgc3R1Yjogc3R1YkZyb21GbGFncyxcbiAgICAgICAgaWRlbnRpdHk6IGlkZW50aXR5RnJvbUZsYWdzLFxuICAgICAgICBjZXJ0OiBpZGVudGl0eUZyb21GbGFncy5nZXRJREJ5dGVzKCkudG9TdHJpbmcoKSxcbiAgICAgICAgcm9sZXM6IGlkZW50aXR5RnJvbUZsYWdzLmdldEF0dHJpYnV0ZVZhbHVlKFwicm9sZXNcIiksXG4gICAgICAgIGxvZ2dlcjogTG9nZ2luZy5mb3IoXG4gICAgICAgICAgb3BlcmF0aW9uLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGxvZ0xldmVsOiBmYWxzZSxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogZmFsc2UsXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiB0eElkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZmxhZ3NcbiAgICAgICAgKSxcbiAgICAgICAgY29ycmVsYXRpb25JZDogdHhJZCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBiYXNlRmxhZ3MgPSBPYmplY3QuYXNzaWduKGJhc2VGbGFncywgZmxhZ3MgfHwge30pO1xuICAgIH1cblxuICAgIHJldHVybiAoYXdhaXQgc3VwZXIuZmxhZ3MoXG4gICAgICBvcGVyYXRpb24sXG4gICAgICBtb2RlbCxcbiAgICAgIGJhc2VGbGFncyBhcyBhbnlcbiAgICApKSBhcyBGYWJyaWNDb250cmFjdEZsYWdzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuIGluZGV4IGZvciBhIG1vZGVsXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgRmFicmljIGNvbnRyYWN0cyBhbmQgcmV0dXJucyBhIHJlc29sdmVkIHByb21pc2VcbiAgICogQHRlbXBsYXRlIE0gLSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbHMgLSBUaGUgbW9kZWwgY29uc3RydWN0b3JcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIGltbWVkaWF0ZWx5XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIHByb3RlY3RlZCBpbmRleDxNPihtb2RlbHM6IENvbnN0cnVjdG9yPE0+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgcmVzdWx0cyBmcm9tIGEgc3RhdGUgcXVlcnkgaXRlcmF0b3JcbiAgICogQHN1bW1hcnkgSXRlcmF0ZXMgdGhyb3VnaCBxdWVyeSByZXN1bHRzIGFuZCBjb252ZXJ0cyB0aGVtIHRvIGEgc3RydWN0dXJlZCBmb3JtYXRcbiAgICogQHBhcmFtIHtMb2dnZXJ9IGxvZyAtIExvZ2dlciBpbnN0YW5jZSBmb3IgZGVidWdnaW5nXG4gICAqIEBwYXJhbSB7SXRlcmF0b3JzLlN0YXRlUXVlcnlJdGVyYXRvcn0gaXRlcmF0b3IgLSBUaGUgc3RhdGUgcXVlcnkgaXRlcmF0b3JcbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNIaXN0b3J5PWZhbHNlXSAtIFdoZXRoZXIgdGhpcyBpcyBhIGhpc3RvcnkgcXVlcnlcbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnlbXT59IFByb21pc2UgcmVzb2x2aW5nIHRvIGFuIGFycmF5IG9mIHByb2Nlc3NlZCByZXN1bHRzXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICAgKiAgIHBhcnRpY2lwYW50IFJlc3VsdEl0ZXJhdG9yXG4gICAqICAgcGFydGljaXBhbnQgSXRlcmF0b3JcbiAgICpcbiAgICogICBDYWxsZXItPj5SZXN1bHRJdGVyYXRvcjogcmVzdWx0SXRlcmF0b3IobG9nLCBpdGVyYXRvciwgaXNIaXN0b3J5KVxuICAgKiAgIGxvb3AgVW50aWwgZG9uZVxuICAgKiAgICAgUmVzdWx0SXRlcmF0b3ItPj5JdGVyYXRvcjogbmV4dCgpXG4gICAqICAgICBJdGVyYXRvci0tPj5SZXN1bHRJdGVyYXRvcjogeyB2YWx1ZSwgZG9uZSB9XG4gICAqICAgICBhbHQgSGFzIHZhbHVlXG4gICAqICAgICAgIFJlc3VsdEl0ZXJhdG9yLT4+UmVzdWx0SXRlcmF0b3I6IFByb2Nlc3MgdmFsdWUgYmFzZWQgb24gaXNIaXN0b3J5XG4gICAqICAgICAgIFJlc3VsdEl0ZXJhdG9yLT4+UmVzdWx0SXRlcmF0b3I6IEFkZCB0byByZXN1bHRzIGFycmF5XG4gICAqICAgICBlbmRcbiAgICogICBlbmRcbiAgICogICBSZXN1bHRJdGVyYXRvci0+Pkl0ZXJhdG9yOiBjbG9zZSgpXG4gICAqICAgUmVzdWx0SXRlcmF0b3ItLT4+Q2FsbGVyOiBhbGxSZXN1bHRzXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgcmVzdWx0SXRlcmF0b3IoXG4gICAgbG9nOiBMb2dnZXIsXG4gICAgaXRlcmF0b3I6IEl0ZXJhdG9ycy5TdGF0ZVF1ZXJ5SXRlcmF0b3IsXG4gICAgaXNIaXN0b3J5ID0gZmFsc2VcbiAgKSB7XG4gICAgY29uc3QgYWxsUmVzdWx0cyA9IFtdO1xuICAgIGxldCByZXM6IHsgdmFsdWU6IGFueTsgZG9uZTogYm9vbGVhbiB9ID0gYXdhaXQgaXRlcmF0b3IubmV4dCgpO1xuICAgIHdoaWxlICghcmVzLmRvbmUpIHtcbiAgICAgIGlmIChyZXMudmFsdWUgJiYgcmVzLnZhbHVlLnZhbHVlLnRvU3RyaW5nKCkpIHtcbiAgICAgICAgbGV0IGpzb25SZXM6IGFueSA9IHt9O1xuICAgICAgICBsb2cuZGVidWcocmVzLnZhbHVlLnZhbHVlLnRvU3RyaW5nKFwidXRmOFwiKSk7XG4gICAgICAgIGlmIChpc0hpc3RvcnkgLyogJiYgaXNIaXN0b3J5ID09PSB0cnVlKi8pIHtcbiAgICAgICAgICBqc29uUmVzLlR4SWQgPSByZXMudmFsdWUudHhJZDtcbiAgICAgICAgICBqc29uUmVzLlRpbWVzdGFtcCA9IHJlcy52YWx1ZS50aW1lc3RhbXA7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGpzb25SZXMuVmFsdWUgPSBKU09OLnBhcnNlKHJlcy52YWx1ZS52YWx1ZS50b1N0cmluZyhcInV0ZjhcIikpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICBsb2cuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIGpzb25SZXMuVmFsdWUgPSByZXMudmFsdWUudmFsdWUudG9TdHJpbmcoXCJ1dGY4XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAganNvblJlcyA9IEpTT04ucGFyc2UocmVzLnZhbHVlLnZhbHVlLnRvU3RyaW5nKFwidXRmOFwiKSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcihlcnIpO1xuICAgICAgICAgICAganNvblJlcyA9IHJlcy52YWx1ZS52YWx1ZS50b1N0cmluZyhcInV0ZjhcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFsbFJlc3VsdHMucHVzaChqc29uUmVzKTtcbiAgICAgIH1cbiAgICAgIHJlcyA9IGF3YWl0IGl0ZXJhdG9yLm5leHQoKTtcbiAgICB9XG4gICAgbG9nLmRlYnVnKGBDbG9zaW5nIGl0ZXJhdG9yIGFmdGVyICR7YWxsUmVzdWx0cy5sZW5ndGh9IHJlc3VsdHNgKTtcbiAgICBhd2FpdCBpdGVyYXRvci5jbG9zZSgpO1xuICAgIHJldHVybiBhbGxSZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBxdWVyeSBhZ2FpbnN0IHRoZSBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBhIHJpY2ggcXVlcnkgdXNpbmcgQ291Y2hEQiBzeW50YXggYWdhaW5zdCB0aGUgRmFicmljIHN0YXRlIGRhdGFiYXNlXG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJldHVybiB0eXBlXG4gICAqIEBwYXJhbSB7TWFuZ29RdWVyeX0gcmF3SW5wdXQgLSBUaGUgTWFuZ28gUXVlcnkgdG8gZXhlY3V0ZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGRvY3NPbmx5IC0gV2hldGhlciB0byByZXR1cm4gb25seSBkb2N1bWVudHMgKG5vdCB1c2VkIGluIHRoaXMgaW1wbGVtZW50YXRpb24pXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cywgaW5jbHVkaW5nIHRoZSBjaGFpbmNvZGUgc3R1YiBhbmQgbG9nZ2VyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Uj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBxdWVyeSByZXN1bHRzXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICAgKiAgIHBhcnRpY2lwYW50IEZhYnJpY0NvbnRyYWN0QWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFN0dWJcbiAgICogICBwYXJ0aWNpcGFudCBTdGF0ZURCXG4gICAqXG4gICAqICAgQ2FsbGVyLT4+RmFicmljQ29udHJhY3RBZGFwdGVyOiByYXcocmF3SW5wdXQsIGRvY3NPbmx5LCBjdHgpXG4gICAqICAgRmFicmljQ29udHJhY3RBZGFwdGVyLT4+RmFicmljQ29udHJhY3RBZGFwdGVyOiBFeHRyYWN0IGxpbWl0IGFuZCBza2lwXG4gICAqICAgYWx0IFdpdGggcGFnaW5hdGlvblxuICAgKiAgICAgRmFicmljQ29udHJhY3RBZGFwdGVyLT4+U3R1YjogZ2V0UXVlcnlSZXN1bHRXaXRoUGFnaW5hdGlvbihxdWVyeSwgbGltaXQsIHNraXApXG4gICAqICAgZWxzZSBXaXRob3V0IHBhZ2luYXRpb25cbiAgICogICAgIEZhYnJpY0NvbnRyYWN0QWRhcHRlci0+PlN0dWI6IGdldFF1ZXJ5UmVzdWx0KHF1ZXJ5KVxuICAgKiAgIGVuZFxuICAgKiAgIFN0dWItPj5TdGF0ZURCOiBFeGVjdXRlIHF1ZXJ5XG4gICAqICAgU3RhdGVEQi0tPj5TdHViOiBJdGVyYXRvclxuICAgKiAgIFN0dWItLT4+RmFicmljQ29udHJhY3RBZGFwdGVyOiBJdGVyYXRvclxuICAgKiAgIEZhYnJpY0NvbnRyYWN0QWRhcHRlci0+PkZhYnJpY0NvbnRyYWN0QWRhcHRlcjogcmVzdWx0SXRlcmF0b3IobG9nLCBpdGVyYXRvcilcbiAgICogICBGYWJyaWNDb250cmFjdEFkYXB0ZXItLT4+Q2FsbGVyOiByZXN1bHRzXG4gICAqL1xuICBhc3luYyByYXc8UiwgRCBleHRlbmRzIGJvb2xlYW4+KFxuICAgIHJhd0lucHV0OiBNYW5nb1F1ZXJ5LFxuICAgIGRvY3NPbmx5OiBEID0gdHJ1ZSBhcyBELFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NvbnRyYWN0Q29udGV4dD5cbiAgKTogUHJvbWlzZTxSYXdSZXN1bHQ8UiwgRD4+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4LCBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJhdyk7XG5cbiAgICBjb25zdCBlbmFibGVTZWdyZWdhdGVzID0gIWFyZ3MubGVuZ3RoIHx8IGFyZ3NbMF0gIT09IHRydWU7XG4gICAgY29uc3QgZnVsbHlTZWdyZWdhdGVkID0gZW5hYmxlU2VncmVnYXRlcyAmJiBjdHguaXNGdWxseVNlZ3JlZ2F0ZWQ7XG5cbiAgICBjb25zdCB7IHNraXAsIGxpbWl0IH0gPSByYXdJbnB1dDtcbiAgICBjb25zdCBib29rbWFyayA9IHJhd0lucHV0W1wiYm9va21hcmtcIl07XG4gICAgbGV0IHJlc3AgPSB7IGRvY3M6IFtdLCBib29rbWFyazogdW5kZWZpbmVkIGFzIHN0cmluZyB8IHVuZGVmaW5lZCB9O1xuXG4gICAgLy8gUXVlcnkgcHVibGljIHN0YXRlIG9ubHkgd2hlbiB0aGUgbW9kZWwgaXMgTk9UIGZ1bGx5IHNlZ3JlZ2F0ZWRcbiAgICBpZiAoIWZ1bGx5U2VncmVnYXRlZCkge1xuICAgICAgbGV0IGl0ZXJhdG9yOiBJdGVyYXRvcnMuU3RhdGVRdWVyeUl0ZXJhdG9yO1xuICAgICAgaWYgKGxpbWl0IHx8IHNraXApIHtcbiAgICAgICAgZGVsZXRlIHJhd0lucHV0W1wibGltaXRcIl07XG4gICAgICAgIGRlbGV0ZSByYXdJbnB1dFtcInNraXBcIl07XG4gICAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgICBgUmV0cmlldmluZyBwdWJsaWMgcGFnaW5hdGVkIGl0ZXJhdG9yOiBsaW1pdDogJHtsaW1pdH0vIHNraXA6ICR7c2tpcH1gXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlOiBTdGF0ZVF1ZXJ5UmVzcG9uc2U8SXRlcmF0b3JzLlN0YXRlUXVlcnlJdGVyYXRvcj4gPVxuICAgICAgICAgIChhd2FpdCB0aGlzLnF1ZXJ5UmVzdWx0UGFnaW5hdGVkKFxuICAgICAgICAgICAgY3R4LnN0dWIsXG4gICAgICAgICAgICByYXdJbnB1dCxcbiAgICAgICAgICAgIGxpbWl0IHx8IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgICAgICAoc2tpcCBhcyBhbnkpPy50b1N0cmluZygpLFxuICAgICAgICAgICAgYm9va21hcmssXG4gICAgICAgICAgICAuLi5bY3R4IGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dF1cbiAgICAgICAgICApKSBhcyBTdGF0ZVF1ZXJ5UmVzcG9uc2U8SXRlcmF0b3JzLlN0YXRlUXVlcnlJdGVyYXRvcj47XG4gICAgICAgIHJlc3AuYm9va21hcmsgPSByZXNwb25zZS5tZXRhZGF0YS5ib29rbWFyaztcbiAgICAgICAgaXRlcmF0b3IgPSByZXNwb25zZS5pdGVyYXRvcjtcbiAgICAgICAgbG9nLmRlYnVnKGBSZXRyaWV2ZWQgcHVibGljIHBhZ2luZyBpdGVyYXRvcmApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLmRlYnVnKFwiUmV0cmlldmluZyBsaXN0aW5nIHB1YmxpYyBpdGVyYXRvclwiKTtcbiAgICAgICAgaXRlcmF0b3IgPSAoYXdhaXQgdGhpcy5xdWVyeVJlc3VsdChcbiAgICAgICAgICBjdHguc3R1YixcbiAgICAgICAgICByYXdJbnB1dCxcbiAgICAgICAgICBjdHhcbiAgICAgICAgKSkgYXMgSXRlcmF0b3JzLlN0YXRlUXVlcnlJdGVyYXRvcjtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgUmV0cmlldmVkIHB1YmxpYyBsaXN0aW5nIGl0ZXJhdG9yYCk7XG5cbiAgICAgIHJlc3AuZG9jcyA9IChhd2FpdCB0aGlzLnJlc3VsdEl0ZXJhdG9yKGxvZywgaXRlcmF0b3IpKSBhcyBhbnk7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGByZXR1cm5pbmcgJHtBcnJheS5pc0FycmF5KHJlc3AuZG9jcykgPyByZXNwLmRvY3MubGVuZ3RoIDogMX0gcmVzdWx0c2BcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciBmdWxseSBzZWdyZWdhdGVkIG1vZGVscywgc3RyaXAgcGFnaW5hdGlvbiBmaWVsZHMgZnJvbSByYXdJbnB1dFxuICAgICAgLy8gc28gdGhlIHNlZ3JlZ2F0ZWQgcXVlcnkgYmVsb3cgY2FuIHJlLWFwcGx5IHRoZW0gY2xlYW5seVxuICAgICAgaWYgKGxpbWl0IHx8IHNraXApIHtcbiAgICAgICAgZGVsZXRlIHJhd0lucHV0W1wibGltaXRcIl07XG4gICAgICAgIGRlbGV0ZSByYXdJbnB1dFtcInNraXBcIl07XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoXCJTa2lwcGluZyBwdWJsaWMgc3RhdGUgcXVlcnkgKGZ1bGx5IHNlZ3JlZ2F0ZWQgbW9kZWwpXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbGxlY3Rpb25zID0gZW5hYmxlU2VncmVnYXRlcyA/IGN0eC5nZXRSZWFkQ29sbGVjdGlvbnMoKSA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChjb2xsZWN0aW9ucyAmJiBjb2xsZWN0aW9ucy5sZW5ndGgpIHtcbiAgICAgIC8vIEJ1aWxkIGEgZnJlc2ggaW5wdXQgd2l0aCBsaW1pdC9za2lwL2Jvb2ttYXJrIHJlc3RvcmVkXG4gICAgICBjb25zdCBzZWdyZWdhdGVkSW5wdXQgPSB7IC4uLnJhd0lucHV0IH07XG4gICAgICBpZiAobGltaXQpIHNlZ3JlZ2F0ZWRJbnB1dC5saW1pdCA9IGxpbWl0O1xuICAgICAgaWYgKHNraXApIHNlZ3JlZ2F0ZWRJbnB1dC5za2lwID0gc2tpcDtcbiAgICAgIGlmIChib29rbWFyaykgc2VncmVnYXRlZElucHV0W1wiYm9va21hcmtcIl0gPSBib29rbWFyaztcblxuICAgICAgY29uc3Qgc2VncmVnYXRlZDogYW55W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgY29sbGVjdGlvbiBvZiBjb2xsZWN0aW9ucykge1xuICAgICAgICBsb2cuZGVidWcoYFF1ZXJ5aW5nIGZyb20gJHtjb2xsZWN0aW9ufWApO1xuICAgICAgICBjb25zdCBmcm9tQ29scyA9IGF3YWl0IHRoaXMuZm9yUHJpdmF0ZShjb2xsZWN0aW9uKS5yYXcoXG4gICAgICAgICAgeyAuLi5zZWdyZWdhdGVkSW5wdXQgfSxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIC4uLmN0eEFyZ3NcbiAgICAgICAgKTtcbiAgICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgICAgYHJlY2VpdmVkICR7KGZyb21Db2xzIGFzIHVua25vd24gYXMgYW55W10pLmxlbmd0aH0gZnJvbSAke2NvbGxlY3Rpb259YFxuICAgICAgICApO1xuICAgICAgICBzZWdyZWdhdGVkLnB1c2goZnJvbUNvbHMpO1xuICAgICAgfVxuICAgICAgLy8gY2hvb3NlIHRoZSByZXNwb25zZSB3aXRoIHRoZSBtb3N0IHJlc3VsdHNcbiAgICAgIHJlc3AgPSBzZWdyZWdhdGVkLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiB7XG4gICAgICAgIGlmICghYWNjKSByZXR1cm4gY3VycjtcbiAgICAgICAgaWYgKGN1cnIuZG9jcyAmJiBjdXJyLmRvY3MubGVuZ3RoID49IGFjYz8uZG9jcy5sZW5ndGgpIHJldHVybiBjdXJyO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwgcmVzcCk7XG4gICAgfVxuXG4gICAgaWYgKGRvY3NPbmx5KSB7XG4gICAgICByZXR1cm4gcmVzcC5kb2NzIGFzIGFueTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3AgYXMgYW55O1xuICB9XG5cbiAgYXN5bmMgdmlldzxSPihcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgZGRvYzogc3RyaW5nLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB2aWV3TmFtZTogc3RyaW5nLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5fYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ29udHJhY3RDb250ZXh0PlxuICApOiBQcm9taXNlPFZpZXdSZXNwb25zZTxSPj4ge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgXCJGYWJyaWMgY29udHJhY3RzIGRvIG5vdCBzdXBwb3J0IENvdWNoREIgdmlld3MuXCJcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgU3RhdGVtZW50PE0gZXh0ZW5kcyBNb2RlbD4oKTogRmFicmljU3RhdGVtZW50PE0sIGFueT4ge1xuICAgIHJldHVybiBuZXcgRmFicmljU3RhdGVtZW50KHRoaXMgYXMgYW55KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHRhYmxlTmFtZTogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDb250cmFjdENvbnRleHQ+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkLmxlbmd0aCAhPT0gbW9kZWwubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZUFsbCk7XG4gICAgY29uc3QgdGFibGVMYWJlbCA9IE1vZGVsLnRhYmxlTmFtZSh0YWJsZU5hbWUpO1xuICAgIGxvZy5kZWJ1ZyhgVXBkYXRpbmcgJHtpZC5sZW5ndGh9IGVudHJpZXMgJHt0YWJsZUxhYmVsfSB0YWJsZWApO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIGlkLm1hcCgoaSwgY291bnQpID0+IHRoaXMudXBkYXRlKHRhYmxlTmFtZSwgaSwgbW9kZWxbY291bnRdLCAuLi5jdHhBcmdzKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBtb2RlbFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGtcbiAgICogQHBhcmFtIGFyZ3NcbiAgICovXG4gIG92ZXJyaWRlIHByZXBhcmU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDb250cmFjdENvbnRleHQ+XG4gICk6IFByZXBhcmVkTW9kZWwgJiB7XG4gICAgc2VncmVnYXRlZD86IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIGFueT4+O1xuICB9IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnByZXBhcmUpO1xuICAgIGNvbnN0IHNwbGl0OiBTZWdyZWdhdGVkTW9kZWw8TT4gPSBNb2RlbC5zZWdyZWdhdGUobW9kZWwpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpO1xuICAgIGNvbnN0IHBrID0gTW9kZWwucGsobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KTtcbiAgICBjb25zdCBpZCA9IG1vZGVsW3BrIGFzIGtleW9mIE1dO1xuXG4gICAgY29uc3QgaXNNaXJyb3IgPSBjdHguZ2V0T3JVbmRlZmluZWQoXCJtaXJyb3JcIikgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IG1hcFRvUmVjb3JkID0gZnVuY3Rpb24gKFxuICAgICAgdGhpczogRmFicmljQ29udHJhY3RBZGFwdGVyLFxuICAgICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgICAga2V5c092ZXJyaWRlPzogc3RyaW5nW11cbiAgICApIHtcbiAgICAgIGlmIChrZXlzT3ZlcnJpZGUpXG4gICAgICAgIGtleXNPdmVycmlkZSA9IFsuLi5uZXcgU2V0KFsuLi5rZXlzT3ZlcnJpZGUsIHBrIGFzIHN0cmluZ10pXTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5lbnRyaWVzKG9iaikucmVkdWNlKFxuICAgICAgICAoYWNjdW06IFJlY29yZDxzdHJpbmcsIGFueT4sIFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGFjY3VtO1xuICAgICAgICAgIGlmIChrZXlzT3ZlcnJpZGUgJiYgIWtleXNPdmVycmlkZS5pbmNsdWRlcyhrZXkpKSByZXR1cm4gYWNjdW07XG4gICAgICAgICAgY29uc3QgbWFwcGVkUHJvcCA9IE1vZGVsLmNvbHVtbk5hbWUobW9kZWwsIGtleSBhcyBhbnkpO1xuICAgICAgICAgIGlmICh0aGlzLmlzUmVzZXJ2ZWQobWFwcGVkUHJvcCkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgUHJvcGVydHkgbmFtZSAke21hcHBlZFByb3B9IGlzIHJlc2VydmVkYCk7XG4gICAgICAgICAgdmFsID0gdmFsIGluc3RhbmNlb2YgRGF0ZSA/IG5ldyBEYXRlKHZhbCkgOiB2YWw7XG4gICAgICAgICAgYWNjdW1bbWFwcGVkUHJvcF0gPSB2YWw7XG4gICAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgICB9LFxuICAgICAgICB7fVxuICAgICAgKTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhyZXN1bHQpLmZpbHRlcigoaykgPT4gQm9vbGVhbihyZXN1bHRba10pKS5sZW5ndGgpIHtcbiAgICAgICAgLy8gQWRkIHRhYmxlIGlkZW50aWZpZXJcbiAgICAgICAgcmVzdWx0W0NvdWNoREJLZXlzLlRBQkxFXSA9IHRhYmxlTmFtZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfS5iaW5kKHRoaXMpO1xuXG4gICAgbG9nLnNpbGx5KFxuICAgICAgYFByZXBhcmluZyByZWNvcmQgZm9yICR7dGFibGVOYW1lfSB0YWJsZSB3aXRoIHBrICR7KG1vZGVsIGFzIGFueSlbcGtdfWBcbiAgICApO1xuXG4gICAgY29uc3Qgc2VncmVnYXRlZFdyaXRlS2V5cyA9IGN0eC5nZXRTZWdyZWdhdGVkV3JpdGVzKCk7XG4gICAgY29uc3Qgc2VncmVnYXRlZFdyaXRlczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGlmIChzZWdyZWdhdGVkV3JpdGVLZXlzKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbGxlY3Rpb24gaW4gc2VncmVnYXRlZFdyaXRlS2V5cykge1xuICAgICAgICBzZWdyZWdhdGVkV3JpdGVzW2NvbGxlY3Rpb25dID0gc2VncmVnYXRlZFdyaXRlc1tjb2xsZWN0aW9uXSB8fCB7fTtcbiAgICAgICAgc2VncmVnYXRlZFdyaXRlc1tjb2xsZWN0aW9uXVtpZCBhcyBhbnldID0gbWFwVG9SZWNvcmQoXG4gICAgICAgICAgY3R4LmdldE9yVW5kZWZpbmVkKFwiZm9yY2VTZWdyZWdhdGVXcml0ZVwiKVxuICAgICAgICAgICAgPyBzcGxpdC5tb2RlbFxuICAgICAgICAgICAgOiAoc3BsaXQudHJhbnNpZW50IGFzIGFueSksXG4gICAgICAgICAgc2VncmVnYXRlZFdyaXRlS2V5c1tjb2xsZWN0aW9uXVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluIG1pcnJvciBtb2RlLCB0aGUgcmVjb3JkIHNob3VsZCBjb250YWluIEFMTCBtb2RlbCBwcm9wZXJ0aWVzIChmdWxsIGNvcHkpXG4gICAgY29uc3QgcmVjb3JkID0gaXNNaXJyb3IgPyBtYXBUb1JlY29yZChtb2RlbCkgOiBtYXBUb1JlY29yZChzcGxpdC5tb2RlbCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmVjb3JkLFxuICAgICAgaWQ6IChtb2RlbCBhcyBhbnkpW3BrXSBhcyBzdHJpbmcsXG4gICAgICB0cmFuc2llbnQ6XG4gICAgICAgICFpc01pcnJvciAmJiBzcGxpdC50cmFuc2llbnQgJiYgT2JqZWN0LmtleXMoc3BsaXQudHJhbnNpZW50KS5sZW5ndGhcbiAgICAgICAgICA/IG1hcFRvUmVjb3JkKHNwbGl0LnRyYW5zaWVudClcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIHNlZ3JlZ2F0ZWQ6IGlzTWlycm9yID8gdW5kZWZpbmVkIDogc2VncmVnYXRlZFdyaXRlcyxcbiAgICB9O1xuICB9XG5cbiAgb3ZlcnJpZGUgcmV2ZXJ0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgdHJhbnNpZW50PzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDb250cmFjdENvbnRleHQ+XG4gICk6IE0ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMucmV2ZXJ0KTtcbiAgICBjb25zdCBvYjogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGNvbnN0IHBrID0gTW9kZWwucGsoY2xhenopO1xuICAgIGNvbnN0IHBrUHJvcHMgPSBNb2RlbC5wa1Byb3BzKGNsYXp6KTtcbiAgICBpZiAocGtQcm9wcz8udHlwZSA9PT0gTnVtYmVyICYmIHR5cGVvZiBpZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaWQgPSBOdW1iZXIoaWQpO1xuICAgIH1cbiAgICBvYltwayBhcyBzdHJpbmddID0gaWQ7XG4gICAgbG9nLnNpbGx5KGBSZWJ1aWxkaW5nIG1vZGVsICR7Y2xhenoubmFtZX0gaWQgJHtpZH1gKTtcblxuICAgIGZ1bmN0aW9uIG1hcFRvTW9kZWwocjogUmVjb3JkPGFueSwgYW55Pikge1xuICAgICAgY29uc3QgbSA9IChcbiAgICAgICAgdHlwZW9mIGNsYXp6ID09PSBcInN0cmluZ1wiID8gTW9kZWwuYnVpbGQob2IsIGNsYXp6KSA6IG5ldyBjbGF6eihvYilcbiAgICAgICkgYXMgTTtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBNb2RlbC5nZXRBdHRyaWJ1dGVzKGNsYXp6KTtcbiAgICAgIGNvbnN0IGtleXMgPSBhdHRyaWJ1dGVzLmxlbmd0aCA/IGF0dHJpYnV0ZXMgOiBPYmplY3Qua2V5cyhtKTtcbiAgICAgIHJldHVybiBrZXlzXG4gICAgICAgIC5maWx0ZXIoKGspID0+IGsgIT09IChwayBhcyBzdHJpbmcpKVxuICAgICAgICAucmVkdWNlKChhY2N1bTogTSwga2V5KSA9PiB7XG4gICAgICAgICAgKGFjY3VtIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW2tleV0gPVxuICAgICAgICAgICAgcltNb2RlbC5jb2x1bW5OYW1lKGFjY3VtLCBrZXkgYXMgYW55KV07XG4gICAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgICB9LCBtKTtcbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0ID0gbWFwVG9Nb2RlbChvYmopO1xuXG4gICAgaWYgKHRyYW5zaWVudCAmJiAhdGhpcy5zaG91bGRSZWJ1aWxkV2l0aFRyYW5zaWVudChjdHgpKSB7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBmaWx0ZXJpbmcgdHJhbnNpZW50IHByb3BlcnRpZXM6ICR7T2JqZWN0LmtleXModHJhbnNpZW50KS5qb2luKFwiLCBcIil9YFxuICAgICAgKTtcbiAgICAgIHJlc3VsdCA9IE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChhY2MsIFtrZXksIHZdKSA9PiB7XG4gICAgICAgIGlmIChrZXkgPT09IHBrIHx8ICEoa2V5IGluIHRyYW5zaWVudCkpIHtcbiAgICAgICAgICBhY2Nba2V5IGFzIGtleW9mIE1dID0gdjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwgbmV3IGNsYXp6KCkpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFJlYnVpbGRXaXRoVHJhbnNpZW50KGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0KTogYm9vbGVhbiB7XG4gICAgaWYgKCFjdHgpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoY3R4LmdldE9yVW5kZWZpbmVkKFwicmVidWlsZFdpdGhUcmFuc2llbnRcIikpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IG9wZXJhdGlvbiA9IGN0eC5nZXRPclVuZGVmaW5lZChcIm9wZXJhdGlvblwiKSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFvcGVyYXRpb24pIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IG9wID0gb3BlcmF0aW9uLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gIVRyYW5zYWN0aW9uT3BlcmF0aW9uS2V5cy5tYXAoKGspID0+IGsudG9Mb3dlckNhc2UoKSkuaW5jbHVkZXMob3ApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb250ZXh0TXNwKGNvbnRleHQ6IEZhYnJpY0NvbnRyYWN0Q29udGV4dCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaWRlbnRpdHkgPSBjb250ZXh0LmdldChcImlkZW50aXR5XCIpIGFzXG4gICAgICB8IHN0cmluZ1xuICAgICAgfCBDbGllbnRJZGVudGl0eVxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFpZGVudGl0eSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIGlkZW50aXR5ID09PSBcInN0cmluZ1wiKSByZXR1cm4gaWRlbnRpdHk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBpZGVudGl0eS5nZXRNU1BJRCgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVuZm9yY2VNaXJyb3JBdXRob3JpemF0aW9uPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG1pcnJvck1ldGEgPSBNb2RlbC5taXJyb3JlZEF0KGNsYXp6KTtcbiAgICBpZiAoIW1pcnJvck1ldGEpIHJldHVybjtcbiAgICBjb25zdCBtc3AgPSB0aGlzLmdldENvbnRleHRNc3AoY3R4KTtcbiAgICBpZiAoIW1zcCkgcmV0dXJuO1xuICAgIGlmIChcbiAgICAgIG1zcCA9PT0gbWlycm9yTWV0YS5tc3BJZCB8fFxuICAgICAgKG1pcnJvck1ldGEuY29uZGl0aW9uICYmIG1pcnJvck1ldGEuY29uZGl0aW9uKG1zcCkpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFxuICAgICAgICBgT3JnYW5pemF0aW9uICR7bXNwfSBpcyBub3QgYXV0aG9yaXplZCB0byBtb2RpZnkgbWlycm9yZWQgZGF0YWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgY3JlYXRlUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgdGFibGVOYW1lOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPEZhYnJpY0NvbnRyYWN0Q29udGV4dD5cbiAgKSB7XG4gICAgY29uc3QgeyBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZVByZWZpeCk7XG4gICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IE1vZGVsLnRhYmxlTmFtZSh0YWJsZU5hbWUpO1xuICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbCk7XG5cbiAgICByZXR1cm4gW3RhYmxlTmFtZSwgaWQsIHJlY29yZCwgLi4uY3R4QXJnc10gYXMgW1xuICAgICAgQ29uc3RydWN0b3I8TT4sXG4gICAgICBQcmltYXJ5S2V5VHlwZSxcbiAgICAgIFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgICAuLi5hbnlbXSxcbiAgICAgIEZhYnJpY0NvbnRyYWN0Q29udGV4dCxcbiAgICBdO1xuICB9XG5cbiAgb3ZlcnJpZGUgdXBkYXRlUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgdGFibGVOYW1lOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPEZhYnJpY0NvbnRyYWN0Q29udGV4dD5cbiAgKTogYW55W10ge1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy51cGRhdGVQcmVmaXgpO1xuICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSBNb2RlbC50YWJsZU5hbWUodGFibGVOYW1lKTtcbiAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWwpO1xuXG4gICAgcmV0dXJuIFt0YWJsZU5hbWUsIGlkLCByZWNvcmQsIC4uLmN0eEFyZ3NdIGFzIFtcbiAgICAgIENvbnN0cnVjdG9yPE0+LFxuICAgICAgUHJpbWFyeUtleVR5cGUsXG4gICAgICBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgICAgLi4uYW55W10sXG4gICAgICBGYWJyaWNDb250cmFjdENvbnRleHQsXG4gICAgXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBjcmVhdGVBbGxQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YWJsZU5hbWU6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogUHJpbWFyeUtleVR5cGVbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBbLi4uYW55LCBGYWJyaWNDb250cmFjdENvbnRleHRdXG4gICk6IChzdHJpbmcgfCBzdHJpbmdbXSB8IG51bWJlcltdIHwgUmVjb3JkPHN0cmluZywgYW55PltdKVtdIHtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gbW9kZWxzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcblxuICAgIGNvbnN0IGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0ID0gYXJncy5wb3AoKTtcblxuICAgIGNvbnN0IHJlY29yZHMgPSBpZHMubWFwKChpZCwgY291bnQpID0+IHtcbiAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IE1vZGVsLnRhYmxlTmFtZSh0YWJsZU5hbWUpO1xuICAgICAgT2JqZWN0LmFzc2lnbihyZWNvcmQsIG1vZGVsc1tjb3VudF0pO1xuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9KTtcbiAgICByZXR1cm4gW3RhYmxlTmFtZSwgaWRzLCByZWNvcmRzLCBjdHggYXMgYW55XTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB1cGRhdGVBbGxQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YWJsZU5hbWU6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogUHJpbWFyeUtleVR5cGVbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBbLi4uYW55LCBGYWJyaWNDb250cmFjdENvbnRleHRdXG4gICkge1xuICAgIGlmIChpZHMubGVuZ3RoICE9PSBtb2RlbHMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuXG4gICAgY29uc3QgY3R4OiBGYWJyaWNDb250cmFjdENvbnRleHQgPSBhcmdzLnBvcCgpO1xuXG4gICAgY29uc3QgcmVjb3JkcyA9IGlkcy5tYXAoKGlkLCBjb3VudCkgPT4ge1xuICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICByZWNvcmRbQ291Y2hEQktleXMuVEFCTEVdID0gTW9kZWwudGFibGVOYW1lKHRhYmxlTmFtZSk7XG4gICAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWxzW2NvdW50XSk7XG4gICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH0pO1xuICAgIHJldHVybiBbdGFibGVOYW1lLCBpZHMsIHJlY29yZHMsIGN0eCBhcyBhbnldO1xuICB9XG5cbiAgb3ZlcnJpZGUgcGFyc2VFcnJvcjxFIGV4dGVuZHMgQmFzZUVycm9yPihcbiAgICBlcnI6IEVycm9yIHwgc3RyaW5nLFxuICAgIHJlYXNvbj86IHN0cmluZ1xuICApOiBFIHtcbiAgICByZXR1cm4gRmFicmljQ29udHJhY3RBZGFwdGVyLnBhcnNlRXJyb3IocmVhc29uIHx8IGVycik7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgbG9nQ3R4PFxuICAgIEFSR1MgZXh0ZW5kcyBhbnlbXSA9IGFueVtdLFxuICAgIE1FVEhPRCBleHRlbmRzIE1ldGhvZE9yT3BlcmF0aW9uID0gTWV0aG9kT3JPcGVyYXRpb24sXG4gID4oXG4gICAgYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPEZhYnJpY0NvbnRyYWN0Q29udGV4dCwgQVJHUz4sXG4gICAgb3BlcmF0aW9uOiBNRVRIT0RcbiAgKTogRmFicmljQ29udGV4dHVhbGl6ZWRBcmdzPEFSR1MsIE1FVEhPRCBleHRlbmRzIHN0cmluZyA/IHRydWUgOiBmYWxzZT47XG4gIHByb3RlY3RlZCBvdmVycmlkZSBsb2dDdHg8XG4gICAgQVJHUyBleHRlbmRzIGFueVtdID0gYW55W10sXG4gICAgTUVUSE9EIGV4dGVuZHMgTWV0aG9kT3JPcGVyYXRpb24gPSBNZXRob2RPck9wZXJhdGlvbixcbiAgPihcbiAgICBhcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8RmFicmljQ29udHJhY3RDb250ZXh0LCBBUkdTPixcbiAgICBvcGVyYXRpb246IE1FVEhPRCxcbiAgICBhbGxvd0NyZWF0ZTogZmFsc2VcbiAgKTogRmFicmljQ29udGV4dHVhbGl6ZWRBcmdzPEFSR1MsIE1FVEhPRCBleHRlbmRzIHN0cmluZyA/IHRydWUgOiBmYWxzZT47XG4gIHByb3RlY3RlZCBvdmVycmlkZSBsb2dDdHg8XG4gICAgQVJHUyBleHRlbmRzIGFueVtdID0gYW55W10sXG4gICAgTUVUSE9EIGV4dGVuZHMgTWV0aG9kT3JPcGVyYXRpb24gPSBNZXRob2RPck9wZXJhdGlvbixcbiAgPihcbiAgICBhcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8RmFicmljQ29udHJhY3RDb250ZXh0LCBBUkdTPixcbiAgICBvcGVyYXRpb246IE1FVEhPRCxcbiAgICBhbGxvd0NyZWF0ZTogdHJ1ZSxcbiAgICBvdmVycmlkZXM/OiBQYXJ0aWFsPEZsYWdzT2Y8RmFicmljQ29udHJhY3RDb250ZXh0Pj5cbiAgKTogUHJvbWlzZTxcbiAgICBGYWJyaWNDb250ZXh0dWFsaXplZEFyZ3M8QVJHUywgTUVUSE9EIGV4dGVuZHMgc3RyaW5nID8gdHJ1ZSA6IGZhbHNlPlxuICA+O1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgbG9nQ3R4PFxuICAgIEFSR1MgZXh0ZW5kcyBhbnlbXSA9IGFueVtdLFxuICAgIE1FVEhPRCBleHRlbmRzIE1ldGhvZE9yT3BlcmF0aW9uID0gTWV0aG9kT3JPcGVyYXRpb24sXG4gID4oXG4gICAgYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPEZhYnJpY0NvbnRyYWN0Q29udGV4dCwgQVJHUz4sXG4gICAgb3BlcmF0aW9uOiBNRVRIT0QsXG4gICAgYWxsb3dDcmVhdGU6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBvdmVycmlkZXM/OiBQYXJ0aWFsPEZsYWdzT2Y8RmFicmljQ29udHJhY3RDb250ZXh0Pj4gfCBDdHhcbiAgKTpcbiAgICB8IFByb21pc2U8XG4gICAgICAgIEZhYnJpY0NvbnRleHR1YWxpemVkQXJnczxBUkdTLCBNRVRIT0QgZXh0ZW5kcyBzdHJpbmcgPyB0cnVlIDogZmFsc2U+XG4gICAgICA+XG4gICAgfCBGYWJyaWNDb250ZXh0dWFsaXplZEFyZ3M8QVJHUywgTUVUSE9EIGV4dGVuZHMgc3RyaW5nID8gdHJ1ZSA6IGZhbHNlPiB7XG4gICAgaWYgKCFhbGxvd0NyZWF0ZSlcbiAgICAgIHJldHVybiBzdXBlci5sb2dDdHg8QVJHUywgTUVUSE9EPihcbiAgICAgICAgYXJncyxcbiAgICAgICAgb3BlcmF0aW9uIGFzIGFueSxcbiAgICAgICAgYWxsb3dDcmVhdGUgYXMgYW55LFxuICAgICAgICBvdmVycmlkZXMgYXMgYW55XG4gICAgICApIGFzIGFueTtcblxuICAgIHJldHVybiBzdXBlci5sb2dDdHhcbiAgICAgIC5jYWxsKHRoaXMsIGFyZ3MsIG9wZXJhdGlvbiBhcyBhbnksIGFsbG93Q3JlYXRlLCBvdmVycmlkZXMgYXMgYW55KVxuICAgICAgLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICBpZiAoIShyZXMuY3R4IGluc3RhbmNlb2YgRmFicmljQ29udHJhY3RDb250ZXh0KSlcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgSW52YWxpZCBjb250ZXh0IGJpbmRpbmdgKTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocmVzLCB7XG4gICAgICAgICAgc3R1YjogcmVzLmN0eC5zdHViLFxuICAgICAgICAgIGlkZW50aXR5OiByZXMuY3R4LmlkZW50aXR5LFxuICAgICAgICB9KTtcbiAgICAgIH0pIGFzIGFueTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICB0YWJsZTogQ29uc3RydWN0b3I8YW55PiB8IHN0cmluZyxcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHMsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ29udHJhY3RDb250ZXh0PlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMub2JzZXJ2ZXJIYW5kbGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiT2JzZXJ2ZXJIYW5kbGVyIG5vdCBpbml0aWFsaXplZC4gRGlkIHlvdSByZWdpc3RlciBhbnkgb2JzZXJ2YWJsZXM/XCJcbiAgICAgICk7XG4gICAgY29uc3QgeyBjdHgsIGN0eEFyZ3MgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudXBkYXRlT2JzZXJ2ZXJzKTtcbiAgICBpZiAoY3R4LmlzRnVsbHlTZWdyZWdhdGVkKSByZXR1cm47XG4gICAgaWYgKGN0eC5nZXRPclVuZGVmaW5lZChcIm5vRW1pdFwiKSkgcmV0dXJuO1xuICAgIGlmICghY3R4LnN0dWIpIHJldHVybjtcbiAgICBjb25zdCBpc0J1bGsgPSBBcnJheS5pc0FycmF5KGlkKTtcbiAgICBjb25zdCBlbWl0U2luZ2xlID0gIWN0eC5nZXRPclVuZGVmaW5lZChcIm5vRW1pdFNpbmdsZVwiKTtcbiAgICBjb25zdCBlbWl0QnVsayA9ICFjdHguZ2V0T3JVbmRlZmluZWQoXCJub0VtaXRCdWxrXCIpO1xuICAgIGlmICgoaXNCdWxrICYmIGVtaXRCdWxrKSB8fCAoIWlzQnVsayAmJiBlbWl0U2luZ2xlKSkge1xuICAgICAgLy8gUGFzcyB0aGUgTVNQIG93bmVyIGZyb20gc3R1YiBhbmQgdGhlIHJlc3VsdCBwYXlsb2FkIChpZiBhbnkpIGluIHRoZVxuICAgICAgLy8gcG9zaXRpb25zIHRoZSBoYW5kbGVyIGV4cGVjdHM6ICh0YWJsZSwgZXZlbnQsIGlkLCBvd25lcj8sIHBheWxvYWQ/LCBjdHgpXG4gICAgICBjb25zdCBtc3BJZCA9IGN0eC5zdHViLmdldE1zcElEID8gY3R4LnN0dWIuZ2V0TXNwSUQoKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IG5vbkN0eEFyZ3MgPSBjdHhBcmdzLnNsaWNlKDAsIC0xKTsgLy8gZXZlcnl0aGluZyBiZWZvcmUgY3R4XG4gICAgICBjb25zdCBwYXlsb2FkID0gbm9uQ3R4QXJncy5sZW5ndGggPiAwID8gbm9uQ3R4QXJnc1swXSA6IHVuZGVmaW5lZDtcbiAgICAgIGF3YWl0IHRoaXMub2JzZXJ2ZXJIYW5kbGVyLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgICAgdGFibGUsXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBpZCxcbiAgICAgICAgbXNwSWQsXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGN0eFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgcGFyc2VFcnJvcjxFIGV4dGVuZHMgQmFzZUVycm9yPihlcnI6IEVycm9yIHwgc3RyaW5nKTogRSB7XG4gICAgLy8gaWYgKFxuICAgIC8vICAgTUlTU0lOR19QUklWQVRFX0RBVEFfUkVHRVgudGVzdChcbiAgICAvLyAgICAgdHlwZW9mIGVyciA9PT0gXCJzdHJpbmdcIiA/IGVyciA6IGVyci5tZXNzYWdlXG4gICAgLy8gICApXG4gICAgLy8gKVxuICAgIC8vICAgcmV0dXJuIG5ldyBVbmF1dGhvcml6ZWRQcml2YXRlRGF0YUFjY2VzcyhlcnIpIGFzIEU7XG4gICAgY29uc3QgbXNnID0gdHlwZW9mIGVyciA9PT0gXCJzdHJpbmdcIiA/IGVyciA6IGVyci5tZXNzYWdlO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoTm90Rm91bmRFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBOb3RGb3VuZEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKENvbmZsaWN0RXJyb3IubmFtZSkpIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhCYWRSZXF1ZXN0RXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IEJhZFJlcXVlc3RFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhRdWVyeUVycm9yLm5hbWUpKSByZXR1cm4gbmV3IFF1ZXJ5RXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoUGFnaW5nRXJyb3IubmFtZSkpIHJldHVybiBuZXcgUGFnaW5nRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoVW5zdXBwb3J0ZWRFcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgVW5zdXBwb3J0ZWRFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhNaWdyYXRpb25FcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBNaWdyYXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhPYnNlcnZlckVycm9yLm5hbWUpKSByZXR1cm4gbmV3IE9ic2VydmVyRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQXV0aG9yaXphdGlvbkVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBBdXRob3JpemF0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoRm9yYmlkZGVuRXJyb3IubmFtZSkpIHJldHVybiBuZXcgRm9yYmlkZGVuRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQ29ubmVjdGlvbkVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoU2VyaWFsaXphdGlvbkVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoXCJubyBsZWRnZXIgY29udGV4dFwiKSlcbiAgICAgIHJldHVybiBuZXcgTWlzc2luZ0NvbnRleHRFcnJvcihcbiAgICAgICAgYE5vIGNvbnRleHQgZm91bmQuIHRoaXMgY2FuIGJlIGNhdXNlZCBieSBkZWJ1Z2dpbmc6ICR7bXNnfWBcbiAgICAgICkgYXMgRTtcblxuICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpIGFzIEU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0YXRpYyBtZXRob2QgZm9yIGRlY29yYXRpb24gb3ZlcnJpZGVzXG4gICAqIEBzdW1tYXJ5IE92ZXJyaWRlcy9leHRlbmRzIGRlY2FmIGRlY29yYXRpb24gd2l0aCBGYWJyaWMtc3BlY2lmaWMgZnVuY3Rpb25hbGl0eVxuICAgKiBAc3RhdGljXG4gICAqIEBvdmVycmlkZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIG92ZXJyaWRlIGRlY29yYXRpb24oKTogdm9pZCB7XG4gICAgc3VwZXIuZGVjb3JhdGlvbigpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoRmFicmljRmxhdm91cilcbiAgICAgIC5mb3IoUGVyc2lzdGVuY2VLZXlzLkNSRUFURURfQlkpXG4gICAgICAuZGVmaW5lKHtcbiAgICAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBjcmVhdGVkQnkoKSB7XG4gICAgICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICAgICAgb25DcmVhdGUoY3JlYXRlZEJ5T25GYWJyaWNDcmVhdGVVcGRhdGUpLFxuICAgICAgICAgICAgcHJvcE1ldGFkYXRhKFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZLCB7fSlcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgfSBhcyBhbnkpXG4gICAgICAuYXBwbHkoKTtcblxuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoRmFicmljRmxhdm91cilcbiAgICAgIC5mb3IoUGVyc2lzdGVuY2VLZXlzLlVQREFURURfQlkpXG4gICAgICAuZGVmaW5lKHtcbiAgICAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBjcmVhdGVkQnkoKSB7XG4gICAgICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICAgICAgb25DcmVhdGVVcGRhdGUoY3JlYXRlZEJ5T25GYWJyaWNDcmVhdGVVcGRhdGUpLFxuICAgICAgICAgICAgcHJvcE1ldGFkYXRhKFBlcnNpc3RlbmNlS2V5cy5VUERBVEVEX0JZLCB7fSlcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgfSBhcyBhbnkpXG4gICAgICAuYXBwbHkoKTtcblxuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoRmFicmljRmxhdm91cilcbiAgICAgIC5mb3IoUGVyc2lzdGVuY2VLZXlzLkNPTFVNTilcbiAgICAgIC5leHRlbmQoRmFicmljUHJvcGVydHkoKSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhGYWJyaWNGbGF2b3VyKVxuICAgICAgLmZvcihWYWxpZGF0aW9uS2V5cy5EQVRFKVxuICAgICAgLmV4dGVuZChmdW5jdGlvbiBmYWJyaWNQcm9wZXJ0eSgpIHtcbiAgICAgICAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcD86IGFueSkgPT4ge1xuICAgICAgICAgIFByb3BlcnR5KHByb3AsIFwic3RyaW5nOmRhdGVcIikodGFyZ2V0LCBwcm9wKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhGYWJyaWNGbGF2b3VyKVxuICAgICAgLmZvcihQZXJzaXN0ZW5jZUtleXMuVEFCTEUpXG4gICAgICAuZXh0ZW5kKGZ1bmN0aW9uIHRhYmxlKG9iajogYW55KSB7XG4gICAgICAgIGNvbnN0IGNoYWluOiBhbnlbXSA9IFtdO1xuICAgICAgICBsZXQgY3VycmVudCA9XG4gICAgICAgICAgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICA/IE1ldGFkYXRhLmNvbnN0cihvYmopXG4gICAgICAgICAgICA6IE1ldGFkYXRhLmNvbnN0cihvYmouY29uc3RydWN0b3IpO1xuXG4gICAgICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IE9iamVjdCAmJiBjdXJyZW50LnByb3RvdHlwZSkge1xuICAgICAgICAgIGNoYWluLnB1c2goY3VycmVudCk7XG4gICAgICAgICAgY3VycmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWluLm1hcCgoYykgPT4gYy5uYW1lIHx8IGMpKTtcblxuICAgICAgICAvLyBBcHBseSBmcm9tIHRoZSBiYXNlIGNsYXNzIGRvd24gdG8gdGhlIGRlY29yYXRlZCBjbGFzc1xuICAgICAgICB3aGlsZSAoY2hhaW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gY2hhaW4ucG9wKCk7XG4gICAgICAgICAgY29uc29sZS5sb2coYENhbGxpbmcgb24gJHtjb25zdHJ1Y3Rvci5uYW1lfWApO1xuICAgICAgICAgIEZhYnJpY09iamVjdCgpKGNvbnN0cnVjdG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBGYWJyaWNPYmplY3QoKShvYmopO1xuICAgICAgfSlcbiAgICAgIC5hcHBseSgpO1xuICB9XG59XG5cbkZhYnJpY0NvbnRyYWN0QWRhcHRlci5kZWNvcmF0aW9uKCk7XG5BZGFwdGVyLnNldEN1cnJlbnQoRmFicmljRmxhdm91cik7XG4iXX0=
|
|
@@ -143,4 +143,4 @@ export class FabricContractContext extends Context {
|
|
|
143
143
|
return `fabric ctx${this.stub ? " with stub" : "without stub"}`;
|
|
144
144
|
}
|
|
145
145
|
}
|
|
146
|
-
//# sourceMappingURL=ContractContext.js.map
|
|
146
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJhY3RDb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbnRyYWN0cy9Db250cmFjdENvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSXpDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRztBQUNILE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxPQUE0QjtJQUNyRTs7O09BR0c7SUFDSCxZQUFZLEdBQTJCO1FBQ3JDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNiLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBYSxTQUFTO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFDRCxFQUFFO0lBQ0Ysd0VBQXdFO0lBQ3hFLHlDQUF5QztJQUN6Qyw2Q0FBNkM7SUFDN0MsRUFBRTtJQUNGLHFDQUFxQztJQUNyQyxZQUFZO0lBQ1osd0RBQXdEO0lBQ3hELGlCQUFpQjtJQUVqQjs7Ozs7T0FLRztJQUNILHNCQUFzQixDQUNwQixPQUFlLEVBQ2YsZUFBd0IsRUFDeEIsV0FBcUI7UUFFckIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3RELEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdB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QUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGtCQUFrQjtRQUNoQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN4RCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRVEsUUFBUTtRQUNmLE9BQU8sYUFBYSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ2xFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEZhYnJpY0NvbnRyYWN0RmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgQ2hhaW5jb2RlU3R1YiwgQ2xpZW50SWRlbnRpdHkgfSBmcm9tIFwiZmFicmljLXNoaW0tYXBpXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnRleHQgY2xhc3MgZm9yIEZhYnJpYyBjaGFpbmNvZGUgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgUHJvdmlkZXMgYWNjZXNzIHRvIEZhYnJpYy1zcGVjaWZpYyBjb250ZXh0IGVsZW1lbnRzIGxpa2Ugc3R1YiwgaWRlbnRpdHksIGFuZCBsb2dnZXIgdG8gYmUgdXNlZCBieSByZXBvc2l0b3JpZXMgYW5kIGFkYXB0ZXJzIGR1cmluZyBjb250cmFjdCBleGVjdXRpb24uXG4gKiBAdGVtcGxhdGUgRiAtIEZsYWdzIHNwZWNpZmljIHRvIEZhYnJpYyBjb250cmFjdCBvcGVyYXRpb25zXG4gKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdIC0gT3B0aW9uYWwgaW5pdGlhbGl6YXRpb24gYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgYmFzZSBDb250ZXh0XG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIEZhYnJpY0NvbnRyYWN0Q29udGV4dFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEluIGEgRmFicmljIGNoYWluY29kZSBjb250cmFjdCBtZXRob2RcbiAqIGNvbnN0IGNvbnRleHQgPSBuZXcgRmFicmljQ29udHJhY3RDb250ZXh0KCk7XG4gKiAvLyBPcHRpb25hbGx5IHNldCB2YWx1ZXMgdmlhIHRoZSBiYXNlIENvbnRleHQgQVBJXG4gKiBjb250ZXh0LnNldCgnc3R1YicsIGN0eC5zdHViKTtcbiAqIGNvbnRleHQuc2V0KCdjbGllbnRJZGVudGl0eScsIGN0eC5jbGllbnRJZGVudGl0eSk7XG4gKiBjb250ZXh0LnNldCgnbG9nZ2VyJywgY29udHJhY3RMb2dnZXIpO1xuICpcbiAqIC8vIEFjY2VzcyBjb250ZXh0IHByb3BlcnRpZXNcbiAqIGNvbnN0IHRpbWVzdGFtcCA9IGNvbnRleHQudGltZXN0YW1wO1xuICogY29uc3QgY3JlYXRvciA9IGNvbnRleHQuaWRlbnRpdHkuZ2V0SUQoKTtcbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDb250cmFjdFxuICogICBwYXJ0aWNpcGFudCBDb250ZXh0XG4gKiAgIHBhcnRpY2lwYW50IExlZGdlclxuICogICBDb250cmFjdC0+PkNvbnRleHQ6IG5ldyBGYWJyaWNDb250cmFjdENvbnRleHQoKVxuICogICBDb250cmFjdC0+PkNvbnRleHQ6IHNldCgnc3R1Yid8J2NsaWVudElkZW50aXR5J3wnbG9nZ2VyJywgLi4uKVxuICogICBDb250ZXh0LS0+PkNvbnRyYWN0OiB0aW1lc3RhbXAsIGlkZW50aXR5LCBsb2dnZXJcbiAqICAgQ29udHJhY3QtPj5MZWRnZXI6IEludGVyYWN0IHZpYSBzdHViXG4gKi9cbmV4cG9ydCBjbGFzcyBGYWJyaWNDb250cmFjdENvbnRleHQgZXh0ZW5kcyBDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IEZhYnJpY0NvbnRyYWN0Q29udGV4dCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyB0aGUgY29udGV4dCB3aXRoIEZhYnJpYy1zcGVjaWZpYyBmbGFnc1xuICAgKi9cbiAgY29uc3RydWN0b3IoY3R4PzogRmFicmljQ29udHJhY3RDb250ZXh0KSB7XG4gICAgc3VwZXIoY3R4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgY2hhaW5jb2RlIHN0dWJcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgQ2hhaW5jb2RlU3R1YiBpbnN0YW5jZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgbGVkZ2VyXG4gICAqIEByZXR1cm4ge0NoYWluY29kZVN0dWJ9IFRoZSBjaGFpbmNvZGUgc3R1YlxuICAgKi9cbiAgZ2V0IHN0dWIoKTogQ2hhaW5jb2RlU3R1YiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KFwic3R1YlwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgdHJhbnNhY3Rpb24gdGltZXN0YW1wXG4gICAqIEBzdW1tYXJ5IE92ZXJyaWRlcyB0aGUgYmFzZSB0aW1lc3RhbXAgZ2V0dGVyIHRvIHVzZSB0aGUgc3R1YidzIHRpbWVzdGFtcFxuICAgKiBAcmV0dXJuIHtEYXRlfSBUaGUgdHJhbnNhY3Rpb24gdGltZXN0YW1wXG4gICAqL1xuICBvdmVycmlkZSBnZXQgdGltZXN0YW1wKCk6IERhdGUge1xuICAgIHJldHVybiB0aGlzLnN0dWIuZ2V0RGF0ZVRpbWVzdGFtcCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBjbGllbnQgaWRlbnRpdHlcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgQ2xpZW50SWRlbnRpdHkgaW5zdGFuY2UgZm9yIHRoZSB0cmFuc2FjdGlvbiBzdWJtaXR0ZXJcbiAgICogQHJldHVybiB7Q2xpZW50SWRlbnRpdHl9IFRoZSBjbGllbnQgaWRlbnRpdHlcbiAgICovXG4gIGdldCBpZGVudGl0eSgpOiBDbGllbnRJZGVudGl0eSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KFwiaWRlbnRpdHlcIik7XG4gIH1cbiAgLy9cbiAgLy8gcHJpdmF0ZSBfc2VncmVnYXRlV3JpdGU6IFJlY29yZDxzdHJpbmcsIFNlZ3JlZ2F0ZWRXcml0ZUVudHJ5W10+ID0ge307XG4gIC8vIHByaXZhdGUgX3NlZ3JlZ2F0ZVJlYWQ6IHN0cmluZ1tdID0gW107XG4gIC8vIHByaXZhdGUgX2Z1bGx5U2VncmVnYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAvL1xuICAvLyBwcml2YXRlIF9zZXF1ZW5jZVNlZ3JlZ2F0aW9uOiBNYXA8XG4gIC8vICAgc3RyaW5nLFxuICAvLyAgIHsgZnVsbHlTZWdyZWdhdGVkOiBib29sZWFuOyBjb2xsZWN0aW9uczogc3RyaW5nW10gfVxuICAvLyA+ID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RvcmVzIHNlZ3JlZ2F0aW9uIG1ldGFkYXRhIHBlciBzZXF1ZW5jZSBuYW1lXG4gICAqIEBzdW1tYXJ5IE5lZWRlZCBiZWNhdXNlIHRoZSBTZXF1ZW5jZSBjcmVhdGVzIGl0cyBvd24gY29udGV4dCAodmlhIGxvZ0N0eCksXG4gICAqIGxvc2luZyBmbGFncyBzZXQgYnkgZXh0cmFjdFNlZ3JlZ2F0ZWRDb2xsZWN0aW9ucyBvbiB0aGUgaGFuZGxlciBjb250ZXh0LlxuICAgKiBUaGUgYWRhcHRlciBwZXJzaXN0cyBhY3Jvc3Mgb3BlcmF0aW9ucywgbWFraW5nIGl0IGEgcmVsaWFibGUgc3RvcmUuXG4gICAqL1xuICBzZXRTZXF1ZW5jZVNlZ3JlZ2F0aW9uKFxuICAgIHNlcU5hbWU6IHN0cmluZyxcbiAgICBmdWxseVNlZ3JlZ2F0ZWQ6IGJvb2xlYW4sXG4gICAgY29sbGVjdGlvbnM6IHN0cmluZ1tdXG4gICk6IHZvaWQge1xuICAgIGxldCBtYXAgPSB0aGlzLmdldEZyb21DaGlsZHJlbihcInNlcXVlbmNlU2VncmVnYXRpb25cIik7XG4gICAgbWFwID0gIW1hcCB8fCAhT2JqZWN0LmtleXMobWFwKS5sZW5ndGggPyBuZXcgTWFwKCkgOiBtYXA7XG4gICAgbWFwLnNldChzZXFOYW1lLCB7IGZ1bGx5U2VncmVnYXRlZCwgY29sbGVjdGlvbnMgfSk7XG4gICAgdGhpcy5wdXQoXCJzZXF1ZW5jZVNlZ3JlZ2F0aW9uXCIsIG1hcCk7XG4gIH1cblxuICBnZXRTZXF1ZW5jZVNlZ3JlZ2F0aW9uKFxuICAgIHNlcU5hbWU6IHN0cmluZ1xuICApOiB7IGZ1bGx5U2VncmVnYXRlZDogYm9vbGVhbjsgY29sbGVjdGlvbnM6IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldEZyb21DaGlsZHJlbihcInNlcXVlbmNlU2VncmVnYXRpb25cIik/LmdldChzZXFOYW1lKTtcbiAgfVxuXG4gIG1hcmtGdWxseVNlZ3JlZ2F0ZWQoKTogdm9pZCB7XG4gICAgdGhpcy5wdXQoXCJmdWxseVNlZ3JlZ2F0ZWRcIiwgdHJ1ZSk7XG4gIH1cblxuICBnZXQgaXNGdWxseVNlZ3JlZ2F0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRGcm9tQ2hpbGRyZW4oXCJmdWxseVNlZ3JlZ2F0ZWRcIik7XG4gIH1cblxuICB3cml0ZVRvKGNvbDogc3RyaW5nLCBlbnRyeTogc3RyaW5nW10pIHtcbiAgICBjb25zdCBzZWdyZWdhdGVXcml0ZSA9IHRoaXMuZ2V0RnJvbUNoaWxkcmVuKFwic2VncmVnYXRlV3JpdGVcIikgfHwge307XG4gICAgaWYgKCEoY29sIGluIHNlZ3JlZ2F0ZVdyaXRlKSkgc2VncmVnYXRlV3JpdGVbY29sXSA9IFtdO1xuICAgIHNlZ3JlZ2F0ZVdyaXRlW2NvbF0ucHVzaCguLi5lbnRyeSk7XG4gICAgdGhpcy5wdXQoXCJzZWdyZWdhdGVXcml0ZVwiLCBzZWdyZWdhdGVXcml0ZSk7XG4gIH1cblxuICBnZXRTZWdyZWdhdGVkV3JpdGVzKCkge1xuICAgIHJldHVybiB0aGlzLmdldEZyb21DaGlsZHJlbihcInNlZ3JlZ2F0ZVdyaXRlXCIpO1xuICB9XG5cbiAgcHV0KGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5hY2N1bXVsYXRlKHsgW2tleV06IHZhbHVlIH0pO1xuICB9XG5cbiAgcmVhZEZyb20oY29sczogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBjb2xzID0gQXJyYXkuaXNBcnJheShjb2xzKSA/IGNvbHMgOiBbY29sc107XG4gICAgY29uc3Qgc2VncmVnYXRlUmVhZCA9IFtcbiAgICAgIC4uLm5ldyBTZXQoWy4uLih0aGlzLmdldE9yVW5kZWZpbmVkKFwic2VncmVnYXRlUmVhZFwiKSB8fCBbXSksIC4uLmNvbHNdKSxcbiAgICBdO1xuICAgIHRoaXMucHV0KFwic2VncmVnYXRlUmVhZFwiLCBzZWdyZWdhdGVSZWFkKTtcblxuICAgIGNvbnN0IHJlYWRTdGFjayA9IHRoaXMuZ2V0T3JVbmRlZmluZWQoXCJzZWdyZWdhdGVSZWFkU3RhY2tcIikgfHwgW107XG4gICAgdGhpcy5wdXQoXCJzZWdyZWdhdGVSZWFkU3RhY2tcIiwgWy4uLnJlYWRTdGFjaywgY29sc10pO1xuICB9XG5cbiAgY29uc3VtZVJlYWRDb2xsZWN0aW9ucygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcmVhZFN0YWNrID0gdGhpcy5nZXRPclVuZGVmaW5lZChcInNlZ3JlZ2F0ZVJlYWRTdGFja1wiKSB8fCBbXTtcbiAgICBpZiAocmVhZFN0YWNrLmxlbmd0aCkge1xuICAgICAgY29uc3QgW2N1cnJlbnQsIC4uLnJlc3RdID0gcmVhZFN0YWNrO1xuICAgICAgdGhpcy5wdXQoXCJzZWdyZWdhdGVSZWFkU3RhY2tcIiwgcmVzdCk7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVhZENvbGxlY3Rpb25zKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGNvbGxlY3Rpb25zIHJlZ2lzdGVyZWQgZm9yIHdyaXRpbmdcbiAgICogQHN1bW1hcnkgUmV0dXJucyBjb2xsZWN0aW9uIG5hbWVzIGZyb20gc2VncmVnYXRlV3JpdGUsIHVzZWQgYnkgc2VxdWVuY2VzIHRvIGtub3cgd2hlcmUgdG8gcmVwbGljYXRlLlxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gQXJyYXkgb2YgY29sbGVjdGlvbiBuYW1lcywgZW1wdHkgaWYgbm9uZSByZWdpc3RlcmVkXG4gICAqL1xuICBnZXRXcml0ZUNvbGxlY3Rpb25zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5nZXRPclVuZGVmaW5lZChcInNlZ3JlZ2F0ZVdyaXRlXCIpIHx8IHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgY29sbGVjdGlvbnMgcmVnaXN0ZXJlZCBmb3IgcmVhZGluZ1xuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGNvbGxlY3Rpb24gbmFtZXMgZnJvbSBzZWdyZWdhdGVSZWFkLlxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gQXJyYXkgb2YgY29sbGVjdGlvbiBuYW1lcywgZW1wdHkgaWYgbm9uZSByZWdpc3RlcmVkXG4gICAqL1xuICBnZXRSZWFkQ29sbGVjdGlvbnMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGNvbHMgPSB0aGlzLmdldE9yVW5kZWZpbmVkKFwic2VncmVnYXRlUmVhZFwiKSB8fCBbXTtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShjb2xzKSA/IGNvbHMgOiBbY29sc107XG4gIH1cblxuICBvdmVycmlkZSB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYGZhYnJpYyBjdHgke3RoaXMuc3R1YiA/IFwiIHdpdGggc3R1YlwiIDogXCJ3aXRob3V0IHN0dWJcIn1gO1xuICB9XG59XG4iXX0=
|
|
@@ -72,4 +72,4 @@ export class FabricContractDispatch extends Dispatch {
|
|
|
72
72
|
});
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
|
-
//# sourceMappingURL=
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmFicmljQ29udHJhY3REaXNwYXRjaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb250cmFjdHMvRmFicmljQ29udHJhY3REaXNwYXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLGFBQWEsRUFDYixhQUFhLEdBQ2QsTUFBTSx5QkFBeUIsQ0FBQztBQUVqQyxPQUFPLEVBRUwsUUFBUSxHQUdULE1BQU0sZ0JBQWdCLENBQUM7QUFJeEIsTUFBTSxPQUFPLHNCQUF1QixTQUFRLFFBQStCO0lBQ3pFO1FBQ0UsS0FBSyxFQUFFLENBQUM7SUFDVixDQUFDO0lBRWtCLEtBQUssQ0FBQyxVQUFVO0lBQ2pDLDZEQUE2RDtJQUM3RCxHQUFHLElBQStDO1FBRWxELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLE9BQU8sbUJBQW1CLENBQUMsQ0FBQztRQUM3RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBc0MsQ0FBQztRQUUxRDtZQUNFLGFBQWEsQ0FBQyxNQUFNO1lBQ3BCLGFBQWEsQ0FBQyxNQUFNO1lBQ3BCLGFBQWEsQ0FBQyxNQUFNO1lBQ3BCLHFCQUFxQixDQUFDLFVBQVU7WUFDaEMscUJBQXFCLENBQUMsVUFBVTtZQUNoQyxxQkFBcUIsQ0FBQyxVQUFVO1NBRW5DLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7Z0JBQ2xCLE1BQU0sSUFBSSxhQUFhLENBQ3JCLFVBQVUsTUFBZ0IsaUJBQWlCLE9BQU8sQ0FBQyxLQUFLLHVDQUF1QyxDQUNoRyxDQUFDO1lBRUosSUFBSSxVQUFVLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNsRSxJQUFJLEtBQUssR0FBUSxPQUFPLENBQUM7WUFDekIsT0FBTyxDQUFDLFVBQVUsSUFBSSxLQUFLLEtBQUssTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNqRCxLQUFLLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDckMsVUFBVSxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDOUQsQ0FBQztZQUVELElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUNaLHlCQUF5QixNQUFnQiwrQkFBK0IsQ0FDekUsQ0FBQztnQkFDRixPQUFPO1lBQ1QsQ0FBQztZQUNELFNBQVMsWUFBWSxDQUFDLE1BQWM7Z0JBQ2xDLFFBQVEsTUFBTSxFQUFFLENBQUM7b0JBQ2YsS0FBSyxxQkFBcUIsQ0FBQyxVQUFVO3dCQUNuQyxPQUFPLGFBQWEsQ0FBQyxNQUFNLENBQUM7b0JBQzlCLEtBQUsscUJBQXFCLENBQUMsVUFBVTt3QkFDbkMsT0FBTyxhQUFhLENBQUMsTUFBTSxDQUFDO29CQUM5QixLQUFLLHFCQUFxQixDQUFDLFVBQVU7d0JBQ25DLE9BQU8sYUFBYSxDQUFDLE1BQU0sQ0FBQztvQkFDOUI7d0JBQ0UsT0FBTyxNQUFNLENBQUM7Z0JBQ2xCLENBQUM7WUFDSCxDQUFDO1lBRUEsT0FBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDcEQsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFXLEVBQUUsT0FBWSxFQUFFLFFBQWUsRUFBRSxFQUFFO29CQUMxRCxNQUFNLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQzdDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQzFELE1BQU0sQ0FDUCxDQUFDO29CQUNGLE1BQU0sQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLFFBQVEsQ0FBQztvQkFDM0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRTt3QkFDekMsU0FBUzt3QkFDVCxHQUFHO3dCQUNILE9BQU87d0JBQ1AsR0FBRyxPQUFPO3FCQUNYLENBQUMsQ0FBQztvQkFFSCxNQUFNLFVBQVUsR0FBK0I7d0JBQzdDLFNBQVM7d0JBQ1QsWUFBWSxDQUFDLE1BQWdCLENBQUM7d0JBQzlCLEdBQUc7cUJBQ0osQ0FBQztvQkFFRixJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDO3dCQUNqQyxVQUFVLENBQUMsSUFBSSxDQUNiLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDOzRCQUNuQixDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUNqQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUN0QixDQUFDO29CQUNKLENBQUM7b0JBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQVUsRUFBRSxFQUFFLENBQ25FLEdBQUcsQ0FBQyxLQUFLLENBQ1AsMkNBQTJDLE1BQWdCLE9BQU8sU0FBUyxDQUFDLElBQUksSUFBSSxTQUFTLFFBQVEsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUNqSCxDQUNGLENBQUM7b0JBQ0YsT0FBTyxNQUFNLENBQUM7Z0JBQ2hCLENBQUM7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbmltcG9ydCB7XG4gIEFkYXB0ZXIsXG4gIERpc3BhdGNoLFxuICBFdmVudElkcyxcbiAgTWF5YmVDb250ZXh0dWFsQXJnLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IHR5cGUgRmFicmljQ29udHJhY3RBZGFwdGVyIH0gZnJvbSBcIi4vQ29udHJhY3RBZGFwdGVyXCI7XG5pbXBvcnQgeyBGYWJyaWNDb250cmFjdENvbnRleHQgfSBmcm9tIFwiLi9Db250cmFjdENvbnRleHRcIjtcblxuZXhwb3J0IGNsYXNzIEZhYnJpY0NvbnRyYWN0RGlzcGF0Y2ggZXh0ZW5kcyBEaXNwYXRjaDxGYWJyaWNDb250cmFjdEFkYXB0ZXI+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBpbml0aWFsaXplKFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8RmFicmljQ29udHJhY3RDb250ZXh0PlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuYWRhcHRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5pbml0aWFsaXplKTtcbiAgICBsb2cudmVyYm9zZShgSW5pdGlhbGl6aW5nICR7dGhpcy5hZGFwdGVyfSdzIGV2ZW50IERpc3BhdGNoYCk7XG4gICAgY29uc3QgYWRhcHRlciA9IHRoaXMuYWRhcHRlciBhcyBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT47XG4gICAgKFxuICAgICAgW1xuICAgICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTCxcbiAgICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEwsXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMLFxuICAgICAgXSBhcyAoa2V5b2YgQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+KVtdXG4gICAgKS5mb3JFYWNoKCh0b1dyYXApID0+IHtcbiAgICAgIGlmICghYWRhcHRlclt0b1dyYXBdKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgTWV0aG9kICR7dG9XcmFwIGFzIHN0cmluZ30gbm90IGZvdW5kIGluICR7YWRhcHRlci5hbGlhc30gYWRhcHRlciB0byBiaW5kIE9ic2VydmFibGVzIERpc3BhdGNoYFxuICAgICAgICApO1xuXG4gICAgICBsZXQgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYWRhcHRlciwgdG9XcmFwKTtcbiAgICAgIGxldCBwcm90bzogYW55ID0gYWRhcHRlcjtcbiAgICAgIHdoaWxlICghZGVzY3JpcHRvciAmJiBwcm90byAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgICAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gICAgICAgIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCB0b1dyYXApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRlc2NyaXB0b3IgfHwgIWRlc2NyaXB0b3Iud3JpdGFibGUpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3IoXG4gICAgICAgICAgYENvdWxkIG5vdCBmaW5kIG1ldGhvZCAke3RvV3JhcCBhcyBzdHJpbmd9IHRvIGJpbmQgT2JzZXJ2YWJsZXMgRGlzcGF0Y2hgXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGJ1bGtUb1NpbmdsZShtZXRob2Q6IHN0cmluZykge1xuICAgICAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLkNSRUFURV9BTEw6XG4gICAgICAgICAgICByZXR1cm4gT3BlcmF0aW9uS2V5cy5DUkVBVEU7XG4gICAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTDpcbiAgICAgICAgICAgIHJldHVybiBPcGVyYXRpb25LZXlzLlVQREFURTtcbiAgICAgICAgICBjYXNlIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMOlxuICAgICAgICAgICAgcmV0dXJuIE9wZXJhdGlvbktleXMuREVMRVRFO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIChhZGFwdGVyIGFzIGFueSlbdG9XcmFwXSA9IG5ldyBQcm94eShhZGFwdGVyW3RvV3JhcF0sIHtcbiAgICAgICAgYXBwbHk6IGFzeW5jICh0YXJnZXQ6IGFueSwgdGhpc0FyZzogYW55LCBhcmdBcnJheTogYW55W10pID0+IHtcbiAgICAgICAgICBjb25zdCB7IGxvZywgY3R4QXJncywgY3R4IH0gPSB0aGlzQXJnW1wibG9nQ3R4XCJdKFxuICAgICAgICAgICAgYXJnQXJyYXkuc2xpY2UoMyAtICg0IC0gYXJnQXJyYXkubGVuZ3RoKSwgYXJnQXJyYXkubGVuZ3RoKSxcbiAgICAgICAgICAgIHRhcmdldFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgW3RhYmxlTmFtZSwgaWRzLCBwYXlsb2FkXSA9IGFyZ0FycmF5O1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRhcmdldC5hcHBseSh0aGlzQXJnLCBbXG4gICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICBpZHMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICAgICAgLi4uY3R4QXJncyxcbiAgICAgICAgICBdKTtcblxuICAgICAgICAgIGNvbnN0IHJlc3VsdEFyZ3M6IFtzdHJpbmcsIHN0cmluZywgRXZlbnRJZHNdID0gW1xuICAgICAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICAgICAgYnVsa1RvU2luZ2xlKHRvV3JhcCBhcyBzdHJpbmcpLFxuICAgICAgICAgICAgaWRzLFxuICAgICAgICAgIF07XG5cbiAgICAgICAgICBpZiAoY3R4LmdldChcIm9ic2VydmVGdWxsUmVzdWx0XCIpKSB7XG4gICAgICAgICAgICByZXN1bHRBcmdzLnB1c2goXG4gICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkocmVzdWx0KVxuICAgICAgICAgICAgICAgID8gcmVzdWx0Lm1hcCgocikgPT4gdGFibGVOYW1lKHIpKVxuICAgICAgICAgICAgICAgIDogdGFibGVOYW1lKHJlc3VsdClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2ZXJzKC4uLnJlc3VsdEFyZ3MsIC4uLmN0eEFyZ3MpLmNhdGNoKChlOiB1bmtub3duKSA9PlxuICAgICAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGRpc3BhdGNoIG9ic2VydmVyIHJlZnJlc2ggZm9yICR7dG9XcmFwIGFzIHN0cmluZ30gb24gJHt0YWJsZU5hbWUubmFtZSB8fCB0YWJsZU5hbWV9IGZvciAke2lkc306ICR7ZX1gXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -126,21 +126,25 @@ export class FabricContractPaginator extends CouchDBPaginator {
|
|
|
126
126
|
if (this.isPreparedStatement())
|
|
127
127
|
return await this.pagePrepared(page, ...ctxArgs);
|
|
128
128
|
const statement = Object.assign({}, this.statement);
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
}
|
|
129
|
+
//
|
|
130
|
+
// if ((!this._recordCount || !this._totalPages) && !this._bookmark) {
|
|
131
|
+
// this._totalPages = this._recordCount = 0;
|
|
132
|
+
// const countResults =
|
|
133
|
+
// (await this.adapter.raw<M[], true>(
|
|
134
|
+
// { ...statement, limit: Number.MIN_SAFE_INTEGER, skip: undefined },
|
|
135
|
+
// true,
|
|
136
|
+
// ctx
|
|
137
|
+
// )) || [];
|
|
138
|
+
// this._recordCount = countResults.length;
|
|
139
|
+
// if (this._recordCount > 0) {
|
|
140
|
+
// const size = statement?.limit || this.size;
|
|
141
|
+
// this._totalPages = Math.ceil(this._recordCount / size);
|
|
142
|
+
// if (!bookmark) return await this.page(page, ...ctxArgs);
|
|
143
|
+
// }
|
|
144
|
+
// } else if (page === 1) {
|
|
145
|
+
// page = this.validatePage(page);
|
|
146
|
+
// statement.skip = (page - 1) * this.size;
|
|
147
|
+
// }
|
|
144
148
|
if (page !== 1) {
|
|
145
149
|
if (!this._bookmark)
|
|
146
150
|
throw new PagingError("No bookmark. Did you start in the first page?");
|
|
@@ -162,4 +166,4 @@ export class FabricContractPaginator extends CouchDBPaginator {
|
|
|
162
166
|
return results;
|
|
163
167
|
}
|
|
164
168
|
}
|
|
165
|
-
//# sourceMappingURL=FabricContractPaginator.js.map
|
|
169
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmFicmljQ29udHJhY3RQYWdpbmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29udHJhY3RzL0ZhYnJpY0NvbnRyYWN0UGFnaW5hdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxXQUFXLEVBQ1gsUUFBUSxFQUNSLE9BQU8sR0FDUixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkQsT0FBTyxFQUFlLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRTdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBYyxNQUFNLHVCQUF1QixDQUFDO0FBQ3JFLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLFlBQVksR0FDYixrQ0FBNkI7QUFFOUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQU0sT0FBTyx1QkFFWCxTQUFRLGdCQUFtQjtJQUMzQjs7Ozs7OztPQU9HO0lBQ0gsWUFDRSxPQUE4QixFQUM5QixLQUFpQixFQUNqQixJQUFZLEVBQ1osS0FBcUI7UUFFckIsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNnQixPQUFPLENBQUMsWUFBd0I7UUFDakQsTUFBTSxLQUFLLEdBQWUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDMUQsSUFBSSxLQUFLLENBQUMsS0FBSztZQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUUxQyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFFeEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0EwREc7SUFDTSxLQUFLLENBQUMsSUFBSSxDQUNqQixPQUFlLENBQUMsRUFDaEIsUUFBYyxFQUNkLEdBQUcsSUFBNkI7UUFFaEMsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUM3QyxDQUFDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFDbkMsSUFBSSxDQUFDLElBQUksQ0FDVixDQUFDO1FBQ0YsSUFBSSxRQUFRLElBQUksUUFBUSxZQUFZLE9BQU8sRUFBRSxDQUFDO1lBQzVDLFFBQVEsR0FBRyxTQUFTLENBQUM7UUFDdkIsQ0FBQztRQUVELE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsTUFBTSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyRSxNQUFNLFdBQVcsR0FBRztZQUNsQixHQUFHLElBQUksR0FBRyxDQUNSLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixDQUFDLEdBQUcsV0FBVyxFQUFFLEdBQUcsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDeEMsT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FDcEQsQ0FDRixDQUNGO1NBQ0YsQ0FBQztRQUNGLHFCQUFxQixDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxRCxNQUFNLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRTdDLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQzFCLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQzVCLE9BQU8sTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBQ25ELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNwRCxFQUFFO1FBQ0Ysc0VBQXNFO1FBQ3RFLDhDQUE4QztRQUM5Qyx5QkFBeUI7UUFDekIsMENBQTBDO1FBQzFDLDJFQUEyRTtRQUMzRSxjQUFjO1FBQ2QsWUFBWTtRQUNaLGdCQUFnQjtRQUNoQiw2Q0FBNkM7UUFDN0MsaUNBQWlDO1FBQ2pDLGtEQUFrRDtRQUNsRCw4REFBOEQ7UUFDOUQsK0RBQStEO1FBQy9ELE1BQU07UUFDTiwyQkFBMkI7UUFDM0Isb0NBQW9DO1FBQ3BDLDZDQUE2QztRQUM3QyxJQUFJO1FBRUosSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVM7Z0JBQ2pCLE1BQU0sSUFBSSxXQUFXLENBQUMsK0NBQStDLENBQUMsQ0FBQztZQUN6RSxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQW1CLENBQUM7UUFDbkQsQ0FBQztRQUNELE1BQU0sU0FBUyxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFRLENBQUM7UUFFekUsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLEdBQUcsU0FBUyxDQUFDO1FBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSztZQUFFLE1BQU0sSUFBSSxXQUFXLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUN0RSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoQyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsR0FBRyxDQUN2QixJQUFJLENBQUMsS0FBSyxFQUNWLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFZLENBQUMsQ0FDdEMsRUFBRSxJQUFJLENBQUM7UUFDUixNQUFNLE9BQU8sR0FDWCxTQUFTLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTTtZQUN6QyxDQUFDLENBQUMsSUFBSSxDQUFDLHNDQUFzQztZQUM3QyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO2dCQUNsQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUN4QixDQUFDLEVBQ0QsSUFBSSxDQUFDLEtBQUssRUFDVixRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDaEMsU0FBUyxFQUNULEdBQUcsQ0FDSixDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7UUFDVCxJQUFJLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQztRQUM5QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIFBhZ2luZ0Vycm9yLFxuICBTZXF1ZW5jZSxcbiAgQ29udGV4dCxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBEQktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDb250cmFjdEFkYXB0ZXIgfSBmcm9tIFwiLi9Db250cmFjdEFkYXB0ZXJcIjtcbmltcG9ydCB7IENvdWNoREJQYWdpbmF0b3IsIE1hbmdvUXVlcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQge1xuICBhcHBseU1pcnJvckZsYWdzLFxuICBhcHBseVNlZ3JlZ2F0aW9uRmxhZ3MsXG4gIGV4dHJhY3RNc3BJZCxcbn0gZnJvbSBcIi4uL3NoYXJlZC9kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFBhZ2luYXRvciBmb3IgQ291Y2hEQiBxdWVyeSByZXN1bHRzXG4gKiBAc3VtbWFyeSBJbXBsZW1lbnRzIHBhZ2luYXRpb24gZm9yIENvdWNoREIgcXVlcmllcyB1c2luZyBib29rbWFya3MgZm9yIGVmZmljaWVudCBuYXZpZ2F0aW9uIHRocm91Z2ggcmVzdWx0IHNldHNcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXN1bHQgdHlwZVxuICogQHBhcmFtIHtGYWJyaWNDbzxhbnksIGFueSwgYW55Pn0gYWRhcHRlciAtIFRoZSBDb3VjaERCIGFkYXB0ZXJcbiAqIEBwYXJhbSB7TWFuZ29RdWVyeX0gcXVlcnkgLSBUaGUgTWFuZ28gcXVlcnkgdG8gcGFnaW5hdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIC0gVGhlIHBhZ2Ugc2l6ZVxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgbW9kZWwgY29uc3RydWN0b3JcbiAqIEBjbGFzcyBDb3VjaERCUGFnaW5hdG9yXG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSBvZiB1c2luZyBDb3VjaERCUGFnaW5hdG9yXG4gKiBjb25zdCBhZGFwdGVyID0gbmV3IE15Q291Y2hEQkFkYXB0ZXIoc2NvcGUpO1xuICogY29uc3QgcXVlcnkgPSB7IHNlbGVjdG9yOiB7IHR5cGU6IFwidXNlclwiIH0gfTtcbiAqIGNvbnN0IHBhZ2luYXRvciA9IG5ldyBDb3VjaERCUGFnaW5hdG9yKGFkYXB0ZXIsIHF1ZXJ5LCAxMCwgVXNlcik7XG4gKlxuICogLy8gR2V0IHRoZSBmaXJzdCBwYWdlXG4gKiBjb25zdCBwYWdlMSA9IGF3YWl0IHBhZ2luYXRvci5wYWdlKDEpO1xuICpcbiAqIC8vIEdldCB0aGUgbmV4dCBwYWdlXG4gKiBjb25zdCBwYWdlMiA9IGF3YWl0IHBhZ2luYXRvci5wYWdlKDIpO1xuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ29udHJhY3RQYWdpbmF0b3I8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbj4gZXh0ZW5kcyBDb3VjaERCUGFnaW5hdG9yPE0+IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IENvdWNoREJQYWdpbmF0b3IgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBwYWdpbmF0b3IgZm9yIENvdWNoREIgcXVlcnkgcmVzdWx0c1xuICAgKiBAcGFyYW0ge0NvdWNoREJBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT59IGFkYXB0ZXIgLSBUaGUgQ291Y2hEQiBhZGFwdGVyXG4gICAqIEBwYXJhbSB7TWFuZ29RdWVyeX0gcXVlcnkgLSBUaGUgTWFuZ28gcXVlcnkgdG8gcGFnaW5hdGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgLSBUaGUgcGFnZSBzaXplXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IGNsYXp6IC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBhZGFwdGVyOiBGYWJyaWNDb250cmFjdEFkYXB0ZXIsXG4gICAgcXVlcnk6IE1hbmdvUXVlcnksXG4gICAgc2l6ZTogbnVtYmVyLFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPlxuICApIHtcbiAgICBzdXBlcihhZGFwdGVyLCBxdWVyeSwgc2l6ZSwgY2xhenopO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBhIHF1ZXJ5IGZvciBwYWdpbmF0aW9uXG4gICAqIEBzdW1tYXJ5IE1vZGlmaWVzIHRoZSByYXcgcXVlcnkgdG8gaW5jbHVkZSBwYWdpbmF0aW9uIHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIHtNYW5nb1F1ZXJ5fSByYXdTdGF0ZW1lbnQgLSBUaGUgb3JpZ2luYWwgTWFuZ28gcXVlcnlcbiAgICogQHJldHVybiB7TWFuZ29RdWVyeX0gVGhlIHByZXBhcmVkIHF1ZXJ5IHdpdGggcGFnaW5hdGlvbiBwYXJhbWV0ZXJzXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcHJlcGFyZShyYXdTdGF0ZW1lbnQ6IE1hbmdvUXVlcnkpOiBNYW5nb1F1ZXJ5IHtcbiAgICBjb25zdCBxdWVyeTogTWFuZ29RdWVyeSA9IE9iamVjdC5hc3NpZ24oe30sIHJhd1N0YXRlbWVudCk7XG4gICAgaWYgKHF1ZXJ5LmxpbWl0KSB0aGlzLmxpbWl0ID0gcXVlcnkubGltaXQ7XG5cbiAgICBxdWVyeS5saW1pdCA9IHRoaXMuc2l6ZTtcblxuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgc3BlY2lmaWMgcGFnZSBvZiByZXN1bHRzXG4gICAqIEBzdW1tYXJ5IEV4ZWN1dGVzIHRoZSBxdWVyeSB3aXRoIHBhZ2luYXRpb24gYW5kIHByb2Nlc3NlcyB0aGUgcmVzdWx0c1xuICAgKiBAcGFyYW0ge251bWJlcn0gW3BhZ2U9MV0gLSBUaGUgcGFnZSBudW1iZXIgdG8gcmV0cmlldmVcbiAgICogQHJldHVybiB7UHJvbWlzZTxSW10+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiByZXN1bHRzXG4gICAqIEB0aHJvd3Mge1BhZ2luZ0Vycm9yfSBJZiB0cnlpbmcgdG8gYWNjZXNzIGEgcGFnZSBvdGhlciB0aGFuIHRoZSBmaXJzdCB3aXRob3V0IGEgYm9va21hcmssIG9yIGlmIG5vIGNsYXNzIGlzIGRlZmluZWRcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgQ291Y2hEQlBhZ2luYXRvclxuICAgKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBDb3VjaERCXG4gICAqXG4gICAqICAgQ2xpZW50LT4+Q291Y2hEQlBhZ2luYXRvcjogcGFnZShwYWdlTnVtYmVyKVxuICAgKiAgIE5vdGUgb3ZlciBDb3VjaERCUGFnaW5hdG9yOiBDbG9uZSBzdGF0ZW1lbnRcbiAgICogICBDb3VjaERCUGFnaW5hdG9yLT4+Q291Y2hEQlBhZ2luYXRvcjogdmFsaWRhdGVQYWdlKHBhZ2UpXG4gICAqXG4gICAqICAgYWx0IHBhZ2UgIT09IDFcbiAgICogICAgIENvdWNoREJQYWdpbmF0b3ItPj5Db3VjaERCUGFnaW5hdG9yOiBDaGVjayBib29rbWFya1xuICAgKiAgICAgYWx0IE5vIGJvb2ttYXJrXG4gICAqICAgICAgIENvdWNoREJQYWdpbmF0b3ItLT4+Q2xpZW50OiBUaHJvdyBQYWdpbmdFcnJvclxuICAgKiAgICAgZWxzZSBIYXMgYm9va21hcmtcbiAgICogICAgICAgQ291Y2hEQlBhZ2luYXRvci0+PkNvdWNoREJQYWdpbmF0b3I6IEFkZCBib29rbWFyayB0byBzdGF0ZW1lbnRcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIENvdWNoREJQYWdpbmF0b3ItPj5BZGFwdGVyOiByYXcoc3RhdGVtZW50LCBmYWxzZSlcbiAgICogICBBZGFwdGVyLT4+Q291Y2hEQjogRXhlY3V0ZSBxdWVyeVxuICAgKiAgIENvdWNoREItLT4+QWRhcHRlcjogUmV0dXJuIHJlc3VsdHNcbiAgICogICBBZGFwdGVyLS0+PkNvdWNoREJQYWdpbmF0b3I6IFJldHVybiBNYW5nb1Jlc3BvbnNlXG4gICAqXG4gICAqICAgTm90ZSBvdmVyIENvdWNoREJQYWdpbmF0b3I6IFByb2Nlc3MgcmVzdWx0c1xuICAgKlxuICAgKiAgIGFsdCBIYXMgd2FybmluZ1xuICAgKiAgICAgQ291Y2hEQlBhZ2luYXRvci0+PkNvdWNoREJQYWdpbmF0b3I6IExvZyB3YXJuaW5nXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgQ291Y2hEQlBhZ2luYXRvci0+PkNvdWNoREJQYWdpbmF0b3I6IENoZWNrIGZvciBjbGF6elxuICAgKlxuICAgKiAgIGFsdCBObyBjbGF6elxuICAgKiAgICAgQ291Y2hEQlBhZ2luYXRvci0tPj5DbGllbnQ6IFRocm93IFBhZ2luZ0Vycm9yXG4gICAqICAgZWxzZSBIYXMgY2xhenpcbiAgICogICAgIENvdWNoREJQYWdpbmF0b3ItPj5Db3VjaERCUGFnaW5hdG9yOiBGaW5kIHByaW1hcnkga2V5XG4gICAqXG4gICAqICAgICBhbHQgSGFzIGZpZWxkcyBpbiBzdGF0ZW1lbnRcbiAgICogICAgICAgQ291Y2hEQlBhZ2luYXRvci0+PkNvdWNoREJQYWdpbmF0b3I6IFVzZSBkb2NzIGRpcmVjdGx5XG4gICAqICAgICBlbHNlIE5vIGZpZWxkc1xuICAgKiAgICAgICBDb3VjaERCUGFnaW5hdG9yLT4+Q291Y2hEQlBhZ2luYXRvcjogUHJvY2VzcyBlYWNoIGRvY3VtZW50XG4gICAqICAgICAgIGxvb3AgRm9yIGVhY2ggZG9jdW1lbnRcbiAgICogICAgICAgICBDb3VjaERCUGFnaW5hdG9yLT4+Q291Y2hEQlBhZ2luYXRvcjogRXh0cmFjdCBvcmlnaW5hbCBJRFxuICAgKiAgICAgICAgIENvdWNoREJQYWdpbmF0b3ItPj5BZGFwdGVyOiByZXZlcnQoZG9jLCBjbGF6eiwgcGtEZWYuaWQsIHBhcnNlZElkKVxuICAgKiAgICAgICBlbmRcbiAgICogICAgIGVuZFxuICAgKlxuICAgKiAgICAgQ291Y2hEQlBhZ2luYXRvci0+PkNvdWNoREJQYWdpbmF0b3I6IFN0b3JlIGJvb2ttYXJrXG4gICAqICAgICBDb3VjaERCUGFnaW5hdG9yLT4+Q291Y2hEQlBhZ2luYXRvcjogVXBkYXRlIGN1cnJlbnRQYWdlXG4gICAqICAgICBDb3VjaERCUGFnaW5hdG9yLS0+PkNsaWVudDogUmV0dXJuIHJlc3VsdHNcbiAgICogICBlbmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHBhZ2UoXG4gICAgcGFnZTogbnVtYmVyID0gMSxcbiAgICBib29rbWFyaz86IGFueSxcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8YW55PlxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHsgY3R4QXJncywgY3R4IH0gPSB0aGlzLmFkYXB0ZXJbXCJsb2dDdHhcIl0oXG4gICAgICBbYm9va21hcmssIC4uLmFyZ3NdLmZpbHRlcihCb29sZWFuKSxcbiAgICAgIHRoaXMucGFnZVxuICAgICk7XG4gICAgaWYgKGJvb2ttYXJrICYmIGJvb2ttYXJrIGluc3RhbmNlb2YgQ29udGV4dCkge1xuICAgICAgYm9va21hcmsgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgbXNwID0gZXh0cmFjdE1zcElkKGN0eC5pZGVudGl0eSk7XG4gICAgY29uc3QgeyBwcml2YXRlQ29scywgc2hhcmVkQ29scyB9ID0gTW9kZWwuY29sbGVjdGlvbnNGb3IodGhpcy5jbGF6eik7XG4gICAgY29uc3QgY29sbGVjdGlvbnMgPSBbXG4gICAgICAuLi5uZXcgU2V0KFxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBbLi4ucHJpdmF0ZUNvbHMsIC4uLnNoYXJlZENvbHNdLm1hcCgoYykgPT5cbiAgICAgICAgICAgIHR5cGVvZiBjID09PSBcInN0cmluZ1wiID8gYyA6IGModGhpcy5jbGF6eiwgbXNwLCBjdHgpXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApLFxuICAgIF07XG4gICAgYXBwbHlTZWdyZWdhdGlvbkZsYWdzKG5ldyB0aGlzLmNsYXp6KCksIGNvbGxlY3Rpb25zLCBjdHgpO1xuICAgIGF3YWl0IGFwcGx5TWlycm9yRmxhZ3ModGhpcy5jbGF6eiwgbXNwLCBjdHgpO1xuXG4gICAgdGhpcy5fYm9va21hcmsgPSBib29rbWFyaztcbiAgICBpZiAodGhpcy5pc1ByZXBhcmVkU3RhdGVtZW50KCkpXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5wYWdlUHJlcGFyZWQocGFnZSwgLi4uY3R4QXJncyk7XG4gICAgY29uc3Qgc3RhdGVtZW50ID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5zdGF0ZW1lbnQpO1xuICAgIC8vXG4gICAgLy8gaWYgKCghdGhpcy5fcmVjb3JkQ291bnQgfHwgIXRoaXMuX3RvdGFsUGFnZXMpICYmICF0aGlzLl9ib29rbWFyaykge1xuICAgIC8vICAgdGhpcy5fdG90YWxQYWdlcyA9IHRoaXMuX3JlY29yZENvdW50ID0gMDtcbiAgICAvLyAgIGNvbnN0IGNvdW50UmVzdWx0cyA9XG4gICAgLy8gICAgIChhd2FpdCB0aGlzLmFkYXB0ZXIucmF3PE1bXSwgdHJ1ZT4oXG4gICAgLy8gICAgICAgeyAuLi5zdGF0ZW1lbnQsIGxpbWl0OiBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUiwgc2tpcDogdW5kZWZpbmVkIH0sXG4gICAgLy8gICAgICAgdHJ1ZSxcbiAgICAvLyAgICAgICBjdHhcbiAgICAvLyAgICAgKSkgfHwgW107XG4gICAgLy8gICB0aGlzLl9yZWNvcmRDb3VudCA9IGNvdW50UmVzdWx0cy5sZW5ndGg7XG4gICAgLy8gICBpZiAodGhpcy5fcmVjb3JkQ291bnQgPiAwKSB7XG4gICAgLy8gICAgIGNvbnN0IHNpemUgPSBzdGF0ZW1lbnQ/LmxpbWl0IHx8IHRoaXMuc2l6ZTtcbiAgICAvLyAgICAgdGhpcy5fdG90YWxQYWdlcyA9IE1hdGguY2VpbCh0aGlzLl9yZWNvcmRDb3VudCAvIHNpemUpO1xuICAgIC8vICAgICBpZiAoIWJvb2ttYXJrKSByZXR1cm4gYXdhaXQgdGhpcy5wYWdlKHBhZ2UsIC4uLmN0eEFyZ3MpO1xuICAgIC8vICAgfVxuICAgIC8vIH0gZWxzZSBpZiAocGFnZSA9PT0gMSkge1xuICAgIC8vICAgcGFnZSA9IHRoaXMudmFsaWRhdGVQYWdlKHBhZ2UpO1xuICAgIC8vICAgc3RhdGVtZW50LnNraXAgPSAocGFnZSAtIDEpICogdGhpcy5zaXplO1xuICAgIC8vIH1cblxuICAgIGlmIChwYWdlICE9PSAxKSB7XG4gICAgICBpZiAoIXRoaXMuX2Jvb2ttYXJrKVxuICAgICAgICB0aHJvdyBuZXcgUGFnaW5nRXJyb3IoXCJObyBib29rbWFyay4gRGlkIHlvdSBzdGFydCBpbiB0aGUgZmlyc3QgcGFnZT9cIik7XG4gICAgICBzdGF0ZW1lbnRbXCJib29rbWFya1wiXSA9IHRoaXMuX2Jvb2ttYXJrIGFzIHN0cmluZztcbiAgICB9XG4gICAgY29uc3QgcmF3UmVzdWx0ID0gKGF3YWl0IHRoaXMuYWRhcHRlci5yYXcoc3RhdGVtZW50LCBmYWxzZSwgY3R4KSkgYXMgYW55O1xuXG4gICAgY29uc3QgeyBkb2NzLCBib29rbWFyazogbmV4dEJvb2ttYXJrIH0gPSByYXdSZXN1bHQ7XG4gICAgaWYgKCF0aGlzLmNsYXp6KSB0aHJvdyBuZXcgUGFnaW5nRXJyb3IoXCJObyBzdGF0ZW1lbnQgdGFyZ2V0IGRlZmluZWRcIik7XG4gICAgY29uc3QgaWQgPSBNb2RlbC5wayh0aGlzLmNsYXp6KTtcbiAgICBjb25zdCB0eXBlID0gTWV0YWRhdGEuZ2V0KFxuICAgICAgdGhpcy5jbGF6eixcbiAgICAgIE1ldGFkYXRhLmtleShEQktleXMuSUQsIGlkIGFzIHN0cmluZylcbiAgICApPy50eXBlO1xuICAgIGNvbnN0IHJlc3VsdHMgPVxuICAgICAgc3RhdGVtZW50LmZpZWxkcyAmJiBzdGF0ZW1lbnQuZmllbGRzLmxlbmd0aFxuICAgICAgICA/IGRvY3MgLy8gaGFzIGZpZWxkcyBtZWFucyBpdHMgbm90IGZ1bGwgbW9kZWxcbiAgICAgICAgOiBkb2NzLm1hcCgoZDogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydChcbiAgICAgICAgICAgICAgZCxcbiAgICAgICAgICAgICAgdGhpcy5jbGF6eixcbiAgICAgICAgICAgICAgU2VxdWVuY2UucGFyc2VWYWx1ZSh0eXBlLCBkW2lkXSksXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgY3R4XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgIHRoaXMuX2Jvb2ttYXJrID0gbmV4dEJvb2ttYXJrO1xuICAgIHRoaXMuX2N1cnJlbnRQYWdlID0gcGFnZTtcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxufVxuIl19
|