@decaf-ts/integrations 0.4.1-2 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/integrations.cjs +2 -2087
- package/dist/integrations.cjs.map +1 -0
- package/dist/integrations.js +2 -2356
- package/dist/integrations.js.map +1 -0
- package/lib/cjs/blob/azure/AzureBlobStoreService.cjs +2 -2
- package/lib/cjs/blob/azure/AzureBlobStoreService.cjs.map +1 -0
- package/lib/cjs/blob/azure/index.cjs +2 -2
- package/lib/cjs/blob/azure/index.cjs.map +1 -0
- package/lib/cjs/blob/core/BlobErrors.cjs +2 -2
- package/lib/cjs/blob/core/BlobErrors.cjs.map +1 -0
- package/lib/cjs/blob/core/BlobKey.cjs +2 -2
- package/lib/cjs/blob/core/BlobKey.cjs.map +1 -0
- package/lib/cjs/blob/core/BlobStoreFactory.cjs +2 -2
- package/lib/cjs/blob/core/BlobStoreFactory.cjs.map +1 -0
- package/lib/cjs/blob/core/BlobStoreService.cjs +2 -2
- package/lib/cjs/blob/core/BlobStoreService.cjs.map +1 -0
- package/lib/cjs/blob/core/BlobTypes.cjs +2 -2
- package/lib/cjs/blob/core/BlobTypes.cjs.map +1 -0
- package/lib/cjs/blob/core/BlobValue.cjs +2 -2
- package/lib/cjs/blob/core/BlobValue.cjs.map +1 -0
- package/lib/cjs/blob/core/index.cjs +2 -2
- package/lib/cjs/blob/core/index.cjs.map +1 -0
- package/lib/cjs/blob/gcp/GcsBlobStoreService.cjs +2 -2
- package/lib/cjs/blob/gcp/GcsBlobStoreService.cjs.map +1 -0
- package/lib/cjs/blob/gcp/index.cjs +2 -2
- package/lib/cjs/blob/gcp/index.cjs.map +1 -0
- package/lib/cjs/blob/index.cjs +2 -2
- package/lib/cjs/blob/index.cjs.map +1 -0
- package/lib/cjs/blob/ipfs/IpfsBlobStoreService.cjs +2 -2
- package/lib/cjs/blob/ipfs/IpfsBlobStoreService.cjs.map +1 -0
- package/lib/cjs/blob/ipfs/IpfsKeyIndex.cjs +2 -2
- package/lib/cjs/blob/ipfs/IpfsKeyIndex.cjs.map +1 -0
- package/lib/cjs/blob/ipfs/LocalJsonIpfsKeyIndex.cjs +2 -2
- package/lib/cjs/blob/ipfs/LocalJsonIpfsKeyIndex.cjs.map +1 -0
- package/lib/cjs/blob/ipfs/MemoryIpfsKeyIndex.cjs +2 -2
- package/lib/cjs/blob/ipfs/MemoryIpfsKeyIndex.cjs.map +1 -0
- package/lib/cjs/blob/ipfs/PostgresIpfsKeyIndex.cjs +2 -2
- package/lib/cjs/blob/ipfs/PostgresIpfsKeyIndex.cjs.map +1 -0
- package/lib/cjs/blob/ipfs/index.cjs +2 -2
- package/lib/cjs/blob/ipfs/index.cjs.map +1 -0
- package/lib/cjs/blob/local/LocalBlobStoreService.cjs +2 -2
- package/lib/cjs/blob/local/LocalBlobStoreService.cjs.map +1 -0
- package/lib/cjs/blob/local/index.cjs +2 -2
- package/lib/cjs/blob/local/index.cjs.map +1 -0
- package/lib/cjs/blob/memory/MemoryBlobStoreService.cjs +2 -2
- package/lib/cjs/blob/memory/MemoryBlobStoreService.cjs.map +1 -0
- package/lib/cjs/blob/memory/index.cjs +2 -2
- package/lib/cjs/blob/memory/index.cjs.map +1 -0
- package/lib/cjs/blob/s3/MinioBlobStoreService.cjs +2 -2
- package/lib/cjs/blob/s3/MinioBlobStoreService.cjs.map +1 -0
- package/lib/cjs/blob/s3/R2BlobStoreService.cjs +2 -2
- package/lib/cjs/blob/s3/R2BlobStoreService.cjs.map +1 -0
- package/lib/cjs/blob/s3/S3BlobStoreService.cjs +2 -2
- package/lib/cjs/blob/s3/S3BlobStoreService.cjs.map +1 -0
- package/lib/cjs/blob/s3/index.cjs +2 -2
- package/lib/cjs/blob/s3/index.cjs.map +1 -0
- package/lib/cjs/docker/DockerComposeService.cjs +2 -2
- package/lib/cjs/docker/DockerComposeService.cjs.map +1 -0
- package/lib/cjs/docker/index.cjs +2 -2
- package/lib/cjs/docker/index.cjs.map +1 -0
- package/lib/cjs/feature-flags/constants.cjs +2 -2
- package/lib/cjs/feature-flags/constants.cjs.map +1 -0
- package/lib/cjs/feature-flags/decorators.cjs +2 -2
- package/lib/cjs/feature-flags/decorators.cjs.map +1 -0
- package/lib/cjs/feature-flags/environment.cjs +2 -2
- package/lib/cjs/feature-flags/environment.cjs.map +1 -0
- package/lib/cjs/feature-flags/index.cjs +2 -2
- package/lib/cjs/feature-flags/index.cjs.map +1 -0
- package/lib/cjs/feature-flags/models/FeatureFlag.model.cjs +2 -2
- package/lib/cjs/feature-flags/models/FeatureFlag.model.cjs.map +1 -0
- package/lib/cjs/feature-flags/models/FeatureFlagAccess.model.cjs +2 -2
- package/lib/cjs/feature-flags/models/FeatureFlagAccess.model.cjs.map +1 -0
- package/lib/cjs/feature-flags/readers/FeatureFlagReader.cjs +2 -2
- package/lib/cjs/feature-flags/readers/FeatureFlagReader.cjs.map +1 -0
- package/lib/cjs/feature-flags/readers/index.cjs +2 -2
- package/lib/cjs/feature-flags/readers/index.cjs.map +1 -0
- package/lib/cjs/feature-flags/services/FeatureFlag.service.cjs +13 -5
- package/lib/cjs/feature-flags/services/FeatureFlag.service.cjs.map +1 -0
- package/lib/cjs/feature-flags/types.cjs +2 -2
- package/lib/cjs/feature-flags/types.cjs.map +1 -0
- package/lib/cjs/feature-flags/utils.cjs +2 -2
- package/lib/cjs/feature-flags/utils.cjs.map +1 -0
- package/lib/cjs/graph/engine/constants.cjs +2 -2
- package/lib/cjs/graph/engine/constants.cjs.map +1 -0
- package/lib/cjs/graph/engine/decorators.cjs +2 -2
- package/lib/cjs/graph/engine/decorators.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphCycleError.cjs +2 -2
- package/lib/cjs/graph/engine/errors/GraphCycleError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphExecutionError.cjs +2 -2
- package/lib/cjs/graph/engine/errors/GraphExecutionError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphInputError.cjs +2 -2
- package/lib/cjs/graph/engine/errors/GraphInputError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphLoopLimitError.cjs +2 -2
- package/lib/cjs/graph/engine/errors/GraphLoopLimitError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphPinningError.cjs +2 -2
- package/lib/cjs/graph/engine/errors/GraphPinningError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphPortError.cjs +2 -2
- package/lib/cjs/graph/engine/errors/GraphPortError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphStoreError.cjs +2 -2
- package/lib/cjs/graph/engine/errors/GraphStoreError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphTopologyError.cjs +2 -2
- package/lib/cjs/graph/engine/errors/GraphTopologyError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/index.cjs +2 -2
- package/lib/cjs/graph/engine/errors/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/events/GraphExecutionEvent.cjs +2 -2
- package/lib/cjs/graph/engine/events/GraphExecutionEvent.cjs.map +1 -0
- package/lib/cjs/graph/engine/events/GraphExecutionEventEmitter.cjs +2 -2
- package/lib/cjs/graph/engine/events/GraphExecutionEventEmitter.cjs.map +1 -0
- package/lib/cjs/graph/engine/events/GraphExecutionEventFactory.cjs +2 -2
- package/lib/cjs/graph/engine/events/GraphExecutionEventFactory.cjs.map +1 -0
- package/lib/cjs/graph/engine/events/GraphExecutionObserver.cjs +2 -2
- package/lib/cjs/graph/engine/events/GraphExecutionObserver.cjs.map +1 -0
- package/lib/cjs/graph/engine/events/index.cjs +2 -2
- package/lib/cjs/graph/engine/events/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/CodeGraphNodeExecutor.cjs +2 -2
- package/lib/cjs/graph/engine/execution/CodeGraphNodeExecutor.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/CodeSandboxEvaluator.cjs +2 -2
- package/lib/cjs/graph/engine/execution/CodeSandboxEvaluator.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionContext.cjs +2 -2
- package/lib/cjs/graph/engine/execution/GraphExecutionContext.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionEngine.cjs +2 -2
- package/lib/cjs/graph/engine/execution/GraphExecutionEngine.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionFrame.cjs +2 -2
- package/lib/cjs/graph/engine/execution/GraphExecutionFrame.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionResult.cjs +2 -2
- package/lib/cjs/graph/engine/execution/GraphExecutionResult.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/GraphNodeExecutor.cjs +2 -2
- package/lib/cjs/graph/engine/execution/GraphNodeExecutor.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/IsolatedVmCodeSandboxEvaluator.cjs +2 -2
- package/lib/cjs/graph/engine/execution/IsolatedVmCodeSandboxEvaluator.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/LogGraphNodeExecutor.cjs +2 -2
- package/lib/cjs/graph/engine/execution/LogGraphNodeExecutor.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/SwitchGraphNodeExecutor.cjs +2 -2
- package/lib/cjs/graph/engine/execution/SwitchGraphNodeExecutor.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/index.cjs +2 -2
- package/lib/cjs/graph/engine/execution/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/index.cjs +2 -2
- package/lib/cjs/graph/engine/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/loops/ConditionExpressionEvaluator.cjs +2 -2
- package/lib/cjs/graph/engine/loops/ConditionExpressionEvaluator.cjs.map +1 -0
- package/lib/cjs/graph/engine/loops/ForeachGraphNodeExecutor.cjs +2 -2
- package/lib/cjs/graph/engine/loops/ForeachGraphNodeExecutor.cjs.map +1 -0
- package/lib/cjs/graph/engine/loops/GraphConditionEvaluator.cjs +2 -2
- package/lib/cjs/graph/engine/loops/GraphConditionEvaluator.cjs.map +1 -0
- package/lib/cjs/graph/engine/loops/GraphLoopExecutionContext.cjs +2 -2
- package/lib/cjs/graph/engine/loops/GraphLoopExecutionContext.cjs.map +1 -0
- package/lib/cjs/graph/engine/loops/UntilGraphNodeExecutor.cjs +2 -2
- package/lib/cjs/graph/engine/loops/UntilGraphNodeExecutor.cjs.map +1 -0
- package/lib/cjs/graph/engine/loops/WhileGraphNodeExecutor.cjs +2 -2
- package/lib/cjs/graph/engine/loops/WhileGraphNodeExecutor.cjs.map +1 -0
- package/lib/cjs/graph/engine/loops/index.cjs +2 -2
- package/lib/cjs/graph/engine/loops/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningDependencyResolver.cjs +2 -2
- package/lib/cjs/graph/engine/pinning/GraphPinningDependencyResolver.cjs.map +1 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningMetadata.cjs +2 -2
- package/lib/cjs/graph/engine/pinning/GraphPinningMetadata.cjs.map +1 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningPolicy.cjs +2 -2
- package/lib/cjs/graph/engine/pinning/GraphPinningPolicy.cjs.map +1 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningService.cjs +2 -2
- package/lib/cjs/graph/engine/pinning/GraphPinningService.cjs.map +1 -0
- package/lib/cjs/graph/engine/pinning/index.cjs +2 -2
- package/lib/cjs/graph/engine/pinning/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlan.cjs +2 -2
- package/lib/cjs/graph/engine/planning/GraphExecutionPlan.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanEdge.cjs +2 -2
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanEdge.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanLayer.cjs +2 -2
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanLayer.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanNode.cjs +2 -2
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanNode.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanner.cjs +2 -2
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanner.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/GraphRelationResolver.cjs +2 -2
- package/lib/cjs/graph/engine/planning/GraphRelationResolver.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/GraphTopology.cjs +2 -2
- package/lib/cjs/graph/engine/planning/GraphTopology.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/index.cjs +2 -2
- package/lib/cjs/graph/engine/planning/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/registry/GraphNodeExecutorRegistry.cjs +2 -2
- package/lib/cjs/graph/engine/registry/GraphNodeExecutorRegistry.cjs.map +1 -0
- package/lib/cjs/graph/engine/registry/GraphNodeExecutorResolver.cjs +2 -2
- package/lib/cjs/graph/engine/registry/GraphNodeExecutorResolver.cjs.map +1 -0
- package/lib/cjs/graph/engine/registry/index.cjs +2 -2
- package/lib/cjs/graph/engine/registry/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/snapshots/GraphExecutionSnapshotMapper.cjs +2 -2
- package/lib/cjs/graph/engine/snapshots/GraphExecutionSnapshotMapper.cjs.map +1 -0
- package/lib/cjs/graph/engine/snapshots/index.cjs +2 -2
- package/lib/cjs/graph/engine/snapshots/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/store/GraphCachedValue.cjs +2 -2
- package/lib/cjs/graph/engine/store/GraphCachedValue.cjs.map +1 -0
- package/lib/cjs/graph/engine/store/GraphValueKey.cjs +2 -2
- package/lib/cjs/graph/engine/store/GraphValueKey.cjs.map +1 -0
- package/lib/cjs/graph/engine/store/GraphValueStore.cjs +2 -2
- package/lib/cjs/graph/engine/store/GraphValueStore.cjs.map +1 -0
- package/lib/cjs/graph/engine/store/GraphValueStoreAdapter.cjs +2 -2
- package/lib/cjs/graph/engine/store/GraphValueStoreAdapter.cjs.map +1 -0
- package/lib/cjs/graph/engine/store/InMemoryGraphValueStoreAdapter.cjs +2 -2
- package/lib/cjs/graph/engine/store/InMemoryGraphValueStoreAdapter.cjs.map +1 -0
- package/lib/cjs/graph/engine/store/index.cjs +2 -2
- package/lib/cjs/graph/engine/store/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/types.cjs +2 -2
- package/lib/cjs/graph/engine/types.cjs.map +1 -0
- package/lib/cjs/graph/engine/validation/GraphDefinitionValidator.cjs +2 -2
- package/lib/cjs/graph/engine/validation/GraphDefinitionValidator.cjs.map +1 -0
- package/lib/cjs/graph/engine/validation/GraphPortSchemaResolver.cjs +2 -2
- package/lib/cjs/graph/engine/validation/GraphPortSchemaResolver.cjs.map +1 -0
- package/lib/cjs/graph/engine/validation/GraphValueValidator.cjs +2 -2
- package/lib/cjs/graph/engine/validation/GraphValueValidator.cjs.map +1 -0
- package/lib/cjs/graph/engine/validation/index.cjs +2 -2
- package/lib/cjs/graph/engine/validation/index.cjs.map +1 -0
- package/lib/cjs/graph/index.cjs +2 -2
- package/lib/cjs/graph/index.cjs.map +1 -0
- package/lib/cjs/graph/shared/constants.cjs +2 -2
- package/lib/cjs/graph/shared/constants.cjs.map +1 -0
- package/lib/cjs/graph/shared/index.cjs +2 -2
- package/lib/cjs/graph/shared/index.cjs.map +1 -0
- package/lib/cjs/graph/shared/nodes/agent.cjs +2 -2
- package/lib/cjs/graph/shared/nodes/agent.cjs.map +1 -0
- package/lib/cjs/graph/shared/nodes/base.cjs +2 -2
- package/lib/cjs/graph/shared/nodes/base.cjs.map +1 -0
- package/lib/cjs/graph/shared/nodes/category-styles.cjs +2 -2
- package/lib/cjs/graph/shared/nodes/category-styles.cjs.map +1 -0
- package/lib/cjs/graph/shared/nodes/flow-control.cjs +2 -2
- package/lib/cjs/graph/shared/nodes/flow-control.cjs.map +1 -0
- package/lib/cjs/graph/shared/nodes/index.cjs +2 -2
- package/lib/cjs/graph/shared/nodes/index.cjs.map +1 -0
- package/lib/cjs/graph/shared/nodes/triggers.cjs +2 -2
- package/lib/cjs/graph/shared/nodes/triggers.cjs.map +1 -0
- package/lib/cjs/graph/shared/types.cjs +2 -2
- package/lib/cjs/graph/shared/types.cjs.map +1 -0
- package/lib/cjs/index.cjs +5 -5
- package/lib/cjs/index.cjs.map +1 -0
- package/lib/cjs/keycloak/index.cjs +2 -2
- package/lib/cjs/keycloak/index.cjs.map +1 -0
- package/lib/cjs/keycloak/services/KeycloakAuthService.cjs +2 -2
- package/lib/cjs/keycloak/services/KeycloakAuthService.cjs.map +1 -0
- package/lib/cjs/keycloak/services/KeycloakClientService.cjs +2 -2
- package/lib/cjs/keycloak/services/KeycloakClientService.cjs.map +1 -0
- package/lib/cjs/keycloak/services/KeycloakIdentityProviderService.cjs +2 -2
- package/lib/cjs/keycloak/services/KeycloakIdentityProviderService.cjs.map +1 -0
- package/lib/cjs/keycloak/services/KeycloakRealmService.cjs +2 -2
- package/lib/cjs/keycloak/services/KeycloakRealmService.cjs.map +1 -0
- package/lib/cjs/keycloak/services/KeycloakRoleService.cjs +2 -2
- package/lib/cjs/keycloak/services/KeycloakRoleService.cjs.map +1 -0
- package/lib/cjs/keycloak/services/KeycloakService.cjs +2 -2
- package/lib/cjs/keycloak/services/KeycloakService.cjs.map +1 -0
- package/lib/cjs/keycloak/services/KeycloakUserService.cjs +2 -2
- package/lib/cjs/keycloak/services/KeycloakUserService.cjs.map +1 -0
- package/lib/cjs/keycloak/services/index.cjs +2 -2
- package/lib/cjs/keycloak/services/index.cjs.map +1 -0
- package/lib/cjs/keycloak/services/runtime.cjs +2 -2
- package/lib/cjs/keycloak/services/runtime.cjs.map +1 -0
- package/lib/cjs/keycloak/types.cjs +2 -2
- package/lib/cjs/keycloak/types.cjs.map +1 -0
- package/lib/cjs/kibana/builders/KibanaIndexBuilder.cjs +2 -2
- package/lib/cjs/kibana/builders/KibanaIndexBuilder.cjs.map +1 -0
- package/lib/cjs/kibana/builders/KibanaIndexBuilderCollection.cjs +2 -2
- package/lib/cjs/kibana/builders/KibanaIndexBuilderCollection.cjs.map +1 -0
- package/lib/cjs/kibana/builders/index.cjs +2 -2
- package/lib/cjs/kibana/builders/index.cjs.map +1 -0
- package/lib/cjs/kibana/helpers.cjs +2 -2
- package/lib/cjs/kibana/helpers.cjs.map +1 -0
- package/lib/cjs/kibana/index.cjs +2 -2
- package/lib/cjs/kibana/index.cjs.map +1 -0
- package/lib/cjs/kibana/services/KibanaAuthService.cjs +2 -2
- package/lib/cjs/kibana/services/KibanaAuthService.cjs.map +1 -0
- package/lib/cjs/kibana/services/KibanaDashboardService.cjs +2 -2
- package/lib/cjs/kibana/services/KibanaDashboardService.cjs.map +1 -0
- package/lib/cjs/kibana/services/KibanaDataViewService.cjs +2 -2
- package/lib/cjs/kibana/services/KibanaDataViewService.cjs.map +1 -0
- package/lib/cjs/kibana/services/KibanaRoleService.cjs +2 -2
- package/lib/cjs/kibana/services/KibanaRoleService.cjs.map +1 -0
- package/lib/cjs/kibana/services/KibanaService.cjs +2 -2
- package/lib/cjs/kibana/services/KibanaService.cjs.map +1 -0
- package/lib/cjs/kibana/services/KibanaSpaceService.cjs +2 -2
- package/lib/cjs/kibana/services/KibanaSpaceService.cjs.map +1 -0
- package/lib/cjs/kibana/services/KibanaUserService.cjs +2 -2
- package/lib/cjs/kibana/services/KibanaUserService.cjs.map +1 -0
- package/lib/cjs/kibana/services/index.cjs +2 -2
- package/lib/cjs/kibana/services/index.cjs.map +1 -0
- package/lib/cjs/kibana/services/runtime.cjs +2 -2
- package/lib/cjs/kibana/services/runtime.cjs.map +1 -0
- package/lib/cjs/kibana/types.cjs +2 -2
- package/lib/cjs/kibana/types.cjs.map +1 -0
- package/lib/cjs/loader/ObjectLoader.cjs +2 -2
- package/lib/cjs/loader/ObjectLoader.cjs.map +1 -0
- package/lib/cjs/loader/families.cjs +2 -2
- package/lib/cjs/loader/families.cjs.map +1 -0
- package/lib/cjs/loader/index.cjs +2 -2
- package/lib/cjs/loader/index.cjs.map +1 -0
- package/lib/cjs/loader/types.cjs +2 -2
- package/lib/cjs/loader/types.cjs.map +1 -0
- package/lib/cjs/namespaces/index.cjs +2 -2
- package/lib/cjs/namespaces/index.cjs.map +1 -0
- package/lib/cjs/namespaces/models/authorization-model.cjs +2 -2
- package/lib/cjs/namespaces/models/authorization-model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/effective-permission.model.cjs +2 -2
- package/lib/cjs/namespaces/models/effective-permission.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/group-membership.model.cjs +2 -2
- package/lib/cjs/namespaces/models/group-membership.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/group.model.cjs +2 -2
- package/lib/cjs/namespaces/models/group.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/index.cjs +2 -2
- package/lib/cjs/namespaces/models/index.cjs.map +1 -0
- package/lib/cjs/namespaces/models/inheritance-block.model.cjs +2 -2
- package/lib/cjs/namespaces/models/inheritance-block.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/org-unit-closure.model.cjs +2 -2
- package/lib/cjs/namespaces/models/org-unit-closure.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/org-unit-membership.model.cjs +2 -2
- package/lib/cjs/namespaces/models/org-unit-membership.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/org-unit-profile.model.cjs +2 -2
- package/lib/cjs/namespaces/models/org-unit-profile.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/org-unit.model.cjs +2 -2
- package/lib/cjs/namespaces/models/org-unit.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/permission.model.cjs +2 -2
- package/lib/cjs/namespaces/models/permission.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/principal.model.cjs +2 -2
- package/lib/cjs/namespaces/models/principal.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/protected-resource.model.cjs +2 -2
- package/lib/cjs/namespaces/models/protected-resource.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/resource-grant.model.cjs +2 -2
- package/lib/cjs/namespaces/models/resource-grant.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/role-assignment.model.cjs +2 -2
- package/lib/cjs/namespaces/models/role-assignment.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/role-permission.model.cjs +2 -2
- package/lib/cjs/namespaces/models/role-permission.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/role.model.cjs +2 -2
- package/lib/cjs/namespaces/models/role.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/storage-binding.model.cjs +2 -2
- package/lib/cjs/namespaces/models/storage-binding.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/tenant-membership.model.cjs +2 -2
- package/lib/cjs/namespaces/models/tenant-membership.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/tenant-profile.model.cjs +2 -2
- package/lib/cjs/namespaces/models/tenant-profile.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/tenant.model.cjs +2 -2
- package/lib/cjs/namespaces/models/tenant.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/user.model.cjs +2 -2
- package/lib/cjs/namespaces/models/user.model.cjs.map +1 -0
- package/lib/cjs/namespaces/org-based-authorization-system.cjs +2 -2
- package/lib/cjs/namespaces/org-based-authorization-system.cjs.map +1 -0
- package/lib/cjs/namespaces/org-based-authorization-system.models.cjs +2 -2
- package/lib/cjs/namespaces/org-based-authorization-system.models.cjs.map +1 -0
- package/lib/cjs/namespaces/org-based-authorization-system.services.cjs +2 -2
- package/lib/cjs/namespaces/org-based-authorization-system.services.cjs.map +1 -0
- package/lib/cjs/namespaces/services/authz.service.cjs +2 -2
- package/lib/cjs/namespaces/services/authz.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/bootstrap.service.cjs +2 -2
- package/lib/cjs/namespaces/services/bootstrap.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/effective-permission.service.cjs +2 -2
- package/lib/cjs/namespaces/services/effective-permission.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/group-membership.service.cjs +2 -2
- package/lib/cjs/namespaces/services/group-membership.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/group.service.cjs +2 -2
- package/lib/cjs/namespaces/services/group.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/index.cjs +2 -2
- package/lib/cjs/namespaces/services/index.cjs.map +1 -0
- package/lib/cjs/namespaces/services/inheritance-block.service.cjs +2 -2
- package/lib/cjs/namespaces/services/inheritance-block.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/org-unit-closure.service.cjs +2 -2
- package/lib/cjs/namespaces/services/org-unit-closure.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/org-unit-membership.service.cjs +2 -2
- package/lib/cjs/namespaces/services/org-unit-membership.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/org-unit-profile.service.cjs +2 -2
- package/lib/cjs/namespaces/services/org-unit-profile.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/org-unit.service.cjs +2 -2
- package/lib/cjs/namespaces/services/org-unit.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/permission.service.cjs +2 -2
- package/lib/cjs/namespaces/services/permission.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/principal.service.cjs +2 -2
- package/lib/cjs/namespaces/services/principal.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/protected-resource.service.cjs +2 -2
- package/lib/cjs/namespaces/services/protected-resource.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/resource-grant.service.cjs +2 -2
- package/lib/cjs/namespaces/services/resource-grant.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/resource-lifecycle.service.cjs +2 -2
- package/lib/cjs/namespaces/services/resource-lifecycle.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/role-assignment.service.cjs +2 -2
- package/lib/cjs/namespaces/services/role-assignment.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/role-permission.service.cjs +2 -2
- package/lib/cjs/namespaces/services/role-permission.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/role.service.cjs +2 -2
- package/lib/cjs/namespaces/services/role.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/storage-binding.service.cjs +2 -2
- package/lib/cjs/namespaces/services/storage-binding.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/system-management.service.cjs +2 -2
- package/lib/cjs/namespaces/services/system-management.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/tenant-membership.service.cjs +2 -2
- package/lib/cjs/namespaces/services/tenant-membership.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/tenant-profile.service.cjs +2 -2
- package/lib/cjs/namespaces/services/tenant-profile.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/tenant.service.cjs +2 -2
- package/lib/cjs/namespaces/services/tenant.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/user.service.cjs +2 -2
- package/lib/cjs/namespaces/services/user.service.cjs.map +1 -0
- package/lib/cjs/namespaces/types.cjs +2 -2
- package/lib/cjs/namespaces/types.cjs.map +1 -0
- package/lib/cjs/namespaces/utils.cjs +2 -2
- package/lib/cjs/namespaces/utils.cjs.map +1 -0
- package/lib/cjs/nest/decorators.cjs +2 -2
- package/lib/cjs/nest/decorators.cjs.map +1 -0
- package/lib/cjs/nest/graph/GraphExecutionController.cjs +2 -2
- package/lib/cjs/nest/graph/GraphExecutionController.cjs.map +1 -0
- package/lib/cjs/nest/graph/GraphExecutionModule.cjs +2 -2
- package/lib/cjs/nest/graph/GraphExecutionModule.cjs.map +1 -0
- package/lib/cjs/nest/graph/GraphExecutionResultModel.cjs +2 -2
- package/lib/cjs/nest/graph/GraphExecutionResultModel.cjs.map +1 -0
- package/lib/cjs/nest/graph/GraphExecutorRegistryFactory.cjs +2 -2
- package/lib/cjs/nest/graph/GraphExecutorRegistryFactory.cjs.map +1 -0
- package/lib/cjs/nest/graph/GraphResultService.cjs +2 -2
- package/lib/cjs/nest/graph/GraphResultService.cjs.map +1 -0
- package/lib/cjs/nest/graph/GraphWorkflowModel.cjs +2 -2
- package/lib/cjs/nest/graph/GraphWorkflowModel.cjs.map +1 -0
- package/lib/cjs/nest/graph/GraphWorkflowService.cjs +2 -2
- package/lib/cjs/nest/graph/GraphWorkflowService.cjs.map +1 -0
- package/lib/cjs/nest/graph/index.cjs +2 -2
- package/lib/cjs/nest/graph/index.cjs.map +1 -0
- package/lib/cjs/nest/graph/main.cjs +2 -2
- package/lib/cjs/nest/graph/main.cjs.map +1 -0
- package/lib/cjs/nest/index.cjs +2 -2
- package/lib/cjs/nest/index.cjs.map +1 -0
- package/lib/cjs/nest/keycloakAuthHandler.cjs +5 -3
- package/lib/cjs/nest/keycloakAuthHandler.cjs.map +1 -0
- package/lib/cjs/nest/keycloakModule.cjs +2 -2
- package/lib/cjs/nest/keycloakModule.cjs.map +1 -0
- package/lib/cjs/nest/logging.cjs +2 -2
- package/lib/cjs/nest/logging.cjs.map +1 -0
- package/lib/cjs/nest/types.cjs +2 -2
- package/lib/cjs/nest/types.cjs.map +1 -0
- package/lib/cjs/nest/utils.cjs +15 -4
- package/lib/cjs/nest/utils.cjs.map +1 -0
- package/lib/cjs/plugins/contract.cjs +2 -2
- package/lib/cjs/plugins/contract.cjs.map +1 -0
- package/lib/cjs/plugins/index.cjs +2 -2
- package/lib/cjs/plugins/index.cjs.map +1 -0
- package/lib/cjs/plugins/kibana/host.cjs +2 -2
- package/lib/cjs/plugins/kibana/host.cjs.map +1 -0
- package/lib/cjs/plugins/kibana/index.cjs +2 -2
- package/lib/cjs/plugins/kibana/index.cjs.map +1 -0
- package/lib/cjs/plugins/kibana/installer.cjs +2 -2
- package/lib/cjs/plugins/kibana/installer.cjs.map +1 -0
- package/lib/cjs/plugins/kibana/manifest.cjs +2 -2
- package/lib/cjs/plugins/kibana/manifest.cjs.map +1 -0
- package/lib/cjs/plugins/kibana/templates.cjs +2 -2
- package/lib/cjs/plugins/kibana/templates.cjs.map +1 -0
- package/lib/cjs/plugins/kibana/types.cjs +2 -2
- package/lib/cjs/plugins/kibana/types.cjs.map +1 -0
- package/lib/cjs/plugins/superset/host.cjs +2 -2
- package/lib/cjs/plugins/superset/host.cjs.map +1 -0
- package/lib/cjs/plugins/superset/index.cjs +2 -2
- package/lib/cjs/plugins/superset/index.cjs.map +1 -0
- package/lib/cjs/plugins/superset/installer.cjs +2 -2
- package/lib/cjs/plugins/superset/installer.cjs.map +1 -0
- package/lib/cjs/plugins/superset/manifest.cjs +2 -2
- package/lib/cjs/plugins/superset/manifest.cjs.map +1 -0
- package/lib/cjs/plugins/superset/templates.cjs +2 -2
- package/lib/cjs/plugins/superset/templates.cjs.map +1 -0
- package/lib/cjs/plugins/superset/types.cjs +2 -2
- package/lib/cjs/plugins/superset/types.cjs.map +1 -0
- package/lib/cjs/secrets/aws/AwsSecretService.cjs +2 -2
- package/lib/cjs/secrets/aws/AwsSecretService.cjs.map +1 -0
- package/lib/cjs/secrets/aws/AwsSecretServiceConfig.cjs +2 -2
- package/lib/cjs/secrets/aws/AwsSecretServiceConfig.cjs.map +1 -0
- package/lib/cjs/secrets/aws/index.cjs +2 -2
- package/lib/cjs/secrets/aws/index.cjs.map +1 -0
- package/lib/cjs/secrets/azure/AzureKeyVaultSecretService.cjs +2 -2
- package/lib/cjs/secrets/azure/AzureKeyVaultSecretService.cjs.map +1 -0
- package/lib/cjs/secrets/azure/AzureKeyVaultSecretServiceConfig.cjs +2 -2
- package/lib/cjs/secrets/azure/AzureKeyVaultSecretServiceConfig.cjs.map +1 -0
- package/lib/cjs/secrets/azure/index.cjs +2 -2
- package/lib/cjs/secrets/azure/index.cjs.map +1 -0
- package/lib/cjs/secrets/core/SecretErrors.cjs +2 -2
- package/lib/cjs/secrets/core/SecretErrors.cjs.map +1 -0
- package/lib/cjs/secrets/core/SecretName.cjs +2 -2
- package/lib/cjs/secrets/core/SecretName.cjs.map +1 -0
- package/lib/cjs/secrets/core/SecretReference.cjs +2 -2
- package/lib/cjs/secrets/core/SecretReference.cjs.map +1 -0
- package/lib/cjs/secrets/core/SecretSerialization.cjs +2 -2
- package/lib/cjs/secrets/core/SecretSerialization.cjs.map +1 -0
- package/lib/cjs/secrets/core/SecretService.cjs +2 -2
- package/lib/cjs/secrets/core/SecretService.cjs.map +1 -0
- package/lib/cjs/secrets/core/SecretTypes.cjs +2 -2
- package/lib/cjs/secrets/core/SecretTypes.cjs.map +1 -0
- package/lib/cjs/secrets/core/index.cjs +2 -2
- package/lib/cjs/secrets/core/index.cjs.map +1 -0
- package/lib/cjs/secrets/gcp/GcpSecretManagerService.cjs +2 -2
- package/lib/cjs/secrets/gcp/GcpSecretManagerService.cjs.map +1 -0
- package/lib/cjs/secrets/gcp/GcpSecretManagerServiceConfig.cjs +2 -2
- package/lib/cjs/secrets/gcp/GcpSecretManagerServiceConfig.cjs.map +1 -0
- package/lib/cjs/secrets/gcp/index.cjs +2 -2
- package/lib/cjs/secrets/gcp/index.cjs.map +1 -0
- package/lib/cjs/secrets/index.cjs +2 -2
- package/lib/cjs/secrets/index.cjs.map +1 -0
- package/lib/cjs/secrets/model/ModelSecretCrypto.cjs +2 -2
- package/lib/cjs/secrets/model/ModelSecretCrypto.cjs.map +1 -0
- package/lib/cjs/secrets/model/ModelSecretService.cjs +2 -2
- package/lib/cjs/secrets/model/ModelSecretService.cjs.map +1 -0
- package/lib/cjs/secrets/model/ModelSecretServiceConfig.cjs +2 -2
- package/lib/cjs/secrets/model/ModelSecretServiceConfig.cjs.map +1 -0
- package/lib/cjs/secrets/model/Secret.cjs +2 -2
- package/lib/cjs/secrets/model/Secret.cjs.map +1 -0
- package/lib/cjs/secrets/model/index.cjs +2 -2
- package/lib/cjs/secrets/model/index.cjs.map +1 -0
- package/lib/cjs/secrets/onepassword/OnePasswordSecretService.cjs +2 -2
- package/lib/cjs/secrets/onepassword/OnePasswordSecretService.cjs.map +1 -0
- package/lib/cjs/secrets/onepassword/OnePasswordSecretServiceConfig.cjs +2 -2
- package/lib/cjs/secrets/onepassword/OnePasswordSecretServiceConfig.cjs.map +1 -0
- package/lib/cjs/secrets/onepassword/index.cjs +2 -2
- package/lib/cjs/secrets/onepassword/index.cjs.map +1 -0
- package/lib/cjs/secrets/vault/VaultSecretService.cjs +2 -2
- package/lib/cjs/secrets/vault/VaultSecretService.cjs.map +1 -0
- package/lib/cjs/secrets/vault/VaultSecretServiceConfig.cjs +2 -2
- package/lib/cjs/secrets/vault/VaultSecretServiceConfig.cjs.map +1 -0
- package/lib/cjs/secrets/vault/index.cjs +2 -2
- package/lib/cjs/secrets/vault/index.cjs.map +1 -0
- package/lib/cjs/shared/runtime.cjs +2 -2
- package/lib/cjs/shared/runtime.cjs.map +1 -0
- package/lib/cjs/utils.cjs +2 -2
- package/lib/cjs/utils.cjs.map +1 -0
- package/lib/esm/blob/azure/AzureBlobStoreService.js +1 -1
- package/lib/esm/blob/azure/AzureBlobStoreService.js.map +1 -0
- package/lib/esm/blob/azure/index.js +1 -1
- package/lib/esm/blob/azure/index.js.map +1 -0
- package/lib/esm/blob/core/BlobErrors.js +1 -1
- package/lib/esm/blob/core/BlobErrors.js.map +1 -0
- package/lib/esm/blob/core/BlobKey.js +1 -1
- package/lib/esm/blob/core/BlobKey.js.map +1 -0
- package/lib/esm/blob/core/BlobStoreFactory.js +1 -1
- package/lib/esm/blob/core/BlobStoreFactory.js.map +1 -0
- package/lib/esm/blob/core/BlobStoreService.js +1 -1
- package/lib/esm/blob/core/BlobStoreService.js.map +1 -0
- package/lib/esm/blob/core/BlobTypes.js +1 -1
- package/lib/esm/blob/core/BlobTypes.js.map +1 -0
- package/lib/esm/blob/core/BlobValue.js +1 -1
- package/lib/esm/blob/core/BlobValue.js.map +1 -0
- package/lib/esm/blob/core/index.js +1 -1
- package/lib/esm/blob/core/index.js.map +1 -0
- package/lib/esm/blob/gcp/GcsBlobStoreService.js +1 -1
- package/lib/esm/blob/gcp/GcsBlobStoreService.js.map +1 -0
- package/lib/esm/blob/gcp/index.js +1 -1
- package/lib/esm/blob/gcp/index.js.map +1 -0
- package/lib/esm/blob/index.js +1 -1
- package/lib/esm/blob/index.js.map +1 -0
- package/lib/esm/blob/ipfs/IpfsBlobStoreService.js +1 -1
- package/lib/esm/blob/ipfs/IpfsBlobStoreService.js.map +1 -0
- package/lib/esm/blob/ipfs/IpfsKeyIndex.js +1 -1
- package/lib/esm/blob/ipfs/IpfsKeyIndex.js.map +1 -0
- package/lib/esm/blob/ipfs/LocalJsonIpfsKeyIndex.js +1 -1
- package/lib/esm/blob/ipfs/LocalJsonIpfsKeyIndex.js.map +1 -0
- package/lib/esm/blob/ipfs/MemoryIpfsKeyIndex.js +1 -1
- package/lib/esm/blob/ipfs/MemoryIpfsKeyIndex.js.map +1 -0
- package/lib/esm/blob/ipfs/PostgresIpfsKeyIndex.js +1 -1
- package/lib/esm/blob/ipfs/PostgresIpfsKeyIndex.js.map +1 -0
- package/lib/esm/blob/ipfs/index.js +1 -1
- package/lib/esm/blob/ipfs/index.js.map +1 -0
- package/lib/esm/blob/local/LocalBlobStoreService.js +1 -1
- package/lib/esm/blob/local/LocalBlobStoreService.js.map +1 -0
- package/lib/esm/blob/local/index.js +1 -1
- package/lib/esm/blob/local/index.js.map +1 -0
- package/lib/esm/blob/memory/MemoryBlobStoreService.js +1 -1
- package/lib/esm/blob/memory/MemoryBlobStoreService.js.map +1 -0
- package/lib/esm/blob/memory/index.js +1 -1
- package/lib/esm/blob/memory/index.js.map +1 -0
- package/lib/esm/blob/s3/MinioBlobStoreService.js +1 -1
- package/lib/esm/blob/s3/MinioBlobStoreService.js.map +1 -0
- package/lib/esm/blob/s3/R2BlobStoreService.js +1 -1
- package/lib/esm/blob/s3/R2BlobStoreService.js.map +1 -0
- package/lib/esm/blob/s3/S3BlobStoreService.js +1 -1
- package/lib/esm/blob/s3/S3BlobStoreService.js.map +1 -0
- package/lib/esm/blob/s3/index.js +1 -1
- package/lib/esm/blob/s3/index.js.map +1 -0
- package/lib/esm/docker/DockerComposeService.js +1 -1
- package/lib/esm/docker/DockerComposeService.js.map +1 -0
- package/lib/esm/docker/index.js +1 -1
- package/lib/esm/docker/index.js.map +1 -0
- package/lib/esm/feature-flags/constants.js +1 -1
- package/lib/esm/feature-flags/constants.js.map +1 -0
- package/lib/esm/feature-flags/decorators.js +1 -1
- package/lib/esm/feature-flags/decorators.js.map +1 -0
- package/lib/esm/feature-flags/environment.js +1 -1
- package/lib/esm/feature-flags/environment.js.map +1 -0
- package/lib/esm/feature-flags/index.js +1 -1
- package/lib/esm/feature-flags/index.js.map +1 -0
- package/lib/esm/feature-flags/models/FeatureFlag.model.js +1 -1
- package/lib/esm/feature-flags/models/FeatureFlag.model.js.map +1 -0
- package/lib/esm/feature-flags/models/FeatureFlagAccess.model.js +1 -1
- package/lib/esm/feature-flags/models/FeatureFlagAccess.model.js.map +1 -0
- package/lib/esm/feature-flags/readers/FeatureFlagReader.js +1 -1
- package/lib/esm/feature-flags/readers/FeatureFlagReader.js.map +1 -0
- package/lib/esm/feature-flags/readers/index.js +1 -1
- package/lib/esm/feature-flags/readers/index.js.map +1 -0
- package/lib/esm/feature-flags/services/FeatureFlag.service.js +13 -5
- package/lib/esm/feature-flags/services/FeatureFlag.service.js.map +1 -0
- package/lib/esm/feature-flags/types.js +1 -1
- package/lib/esm/feature-flags/types.js.map +1 -0
- package/lib/esm/feature-flags/utils.js +1 -1
- package/lib/esm/feature-flags/utils.js.map +1 -0
- package/lib/esm/graph/engine/constants.js +1 -1
- package/lib/esm/graph/engine/constants.js.map +1 -0
- package/lib/esm/graph/engine/decorators.js +1 -1
- package/lib/esm/graph/engine/decorators.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphCycleError.js +1 -1
- package/lib/esm/graph/engine/errors/GraphCycleError.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphExecutionError.js +1 -1
- package/lib/esm/graph/engine/errors/GraphExecutionError.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphInputError.js +1 -1
- package/lib/esm/graph/engine/errors/GraphInputError.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphLoopLimitError.js +1 -1
- package/lib/esm/graph/engine/errors/GraphLoopLimitError.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphPinningError.js +1 -1
- package/lib/esm/graph/engine/errors/GraphPinningError.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphPortError.js +1 -1
- package/lib/esm/graph/engine/errors/GraphPortError.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphStoreError.js +1 -1
- package/lib/esm/graph/engine/errors/GraphStoreError.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphTopologyError.js +1 -1
- package/lib/esm/graph/engine/errors/GraphTopologyError.js.map +1 -0
- package/lib/esm/graph/engine/errors/index.js +1 -1
- package/lib/esm/graph/engine/errors/index.js.map +1 -0
- package/lib/esm/graph/engine/events/GraphExecutionEvent.js +1 -1
- package/lib/esm/graph/engine/events/GraphExecutionEvent.js.map +1 -0
- package/lib/esm/graph/engine/events/GraphExecutionEventEmitter.js +1 -1
- package/lib/esm/graph/engine/events/GraphExecutionEventEmitter.js.map +1 -0
- package/lib/esm/graph/engine/events/GraphExecutionEventFactory.js +1 -1
- package/lib/esm/graph/engine/events/GraphExecutionEventFactory.js.map +1 -0
- package/lib/esm/graph/engine/events/GraphExecutionObserver.js +1 -1
- package/lib/esm/graph/engine/events/GraphExecutionObserver.js.map +1 -0
- package/lib/esm/graph/engine/events/index.js +1 -1
- package/lib/esm/graph/engine/events/index.js.map +1 -0
- package/lib/esm/graph/engine/execution/CodeGraphNodeExecutor.js +1 -1
- package/lib/esm/graph/engine/execution/CodeGraphNodeExecutor.js.map +1 -0
- package/lib/esm/graph/engine/execution/CodeSandboxEvaluator.js +1 -1
- package/lib/esm/graph/engine/execution/CodeSandboxEvaluator.js.map +1 -0
- package/lib/esm/graph/engine/execution/GraphExecutionContext.js +1 -1
- package/lib/esm/graph/engine/execution/GraphExecutionContext.js.map +1 -0
- package/lib/esm/graph/engine/execution/GraphExecutionEngine.js +1 -1
- package/lib/esm/graph/engine/execution/GraphExecutionEngine.js.map +1 -0
- package/lib/esm/graph/engine/execution/GraphExecutionFrame.js +1 -1
- package/lib/esm/graph/engine/execution/GraphExecutionFrame.js.map +1 -0
- package/lib/esm/graph/engine/execution/GraphExecutionResult.js +1 -1
- package/lib/esm/graph/engine/execution/GraphExecutionResult.js.map +1 -0
- package/lib/esm/graph/engine/execution/GraphNodeExecutor.js +1 -1
- package/lib/esm/graph/engine/execution/GraphNodeExecutor.js.map +1 -0
- package/lib/esm/graph/engine/execution/IsolatedVmCodeSandboxEvaluator.js +1 -1
- package/lib/esm/graph/engine/execution/IsolatedVmCodeSandboxEvaluator.js.map +1 -0
- package/lib/esm/graph/engine/execution/LogGraphNodeExecutor.js +1 -1
- package/lib/esm/graph/engine/execution/LogGraphNodeExecutor.js.map +1 -0
- package/lib/esm/graph/engine/execution/SwitchGraphNodeExecutor.js +1 -1
- package/lib/esm/graph/engine/execution/SwitchGraphNodeExecutor.js.map +1 -0
- package/lib/esm/graph/engine/execution/index.js +1 -1
- package/lib/esm/graph/engine/execution/index.js.map +1 -0
- package/lib/esm/graph/engine/index.js +1 -1
- package/lib/esm/graph/engine/index.js.map +1 -0
- package/lib/esm/graph/engine/loops/ConditionExpressionEvaluator.js +1 -1
- package/lib/esm/graph/engine/loops/ConditionExpressionEvaluator.js.map +1 -0
- package/lib/esm/graph/engine/loops/ForeachGraphNodeExecutor.js +1 -1
- package/lib/esm/graph/engine/loops/ForeachGraphNodeExecutor.js.map +1 -0
- package/lib/esm/graph/engine/loops/GraphConditionEvaluator.js +1 -1
- package/lib/esm/graph/engine/loops/GraphConditionEvaluator.js.map +1 -0
- package/lib/esm/graph/engine/loops/GraphLoopExecutionContext.js +1 -1
- package/lib/esm/graph/engine/loops/GraphLoopExecutionContext.js.map +1 -0
- package/lib/esm/graph/engine/loops/UntilGraphNodeExecutor.js +1 -1
- package/lib/esm/graph/engine/loops/UntilGraphNodeExecutor.js.map +1 -0
- package/lib/esm/graph/engine/loops/WhileGraphNodeExecutor.js +1 -1
- package/lib/esm/graph/engine/loops/WhileGraphNodeExecutor.js.map +1 -0
- package/lib/esm/graph/engine/loops/index.js +1 -1
- package/lib/esm/graph/engine/loops/index.js.map +1 -0
- package/lib/esm/graph/engine/pinning/GraphPinningDependencyResolver.js +1 -1
- package/lib/esm/graph/engine/pinning/GraphPinningDependencyResolver.js.map +1 -0
- package/lib/esm/graph/engine/pinning/GraphPinningMetadata.js +1 -1
- package/lib/esm/graph/engine/pinning/GraphPinningMetadata.js.map +1 -0
- package/lib/esm/graph/engine/pinning/GraphPinningPolicy.js +1 -1
- package/lib/esm/graph/engine/pinning/GraphPinningPolicy.js.map +1 -0
- package/lib/esm/graph/engine/pinning/GraphPinningService.js +1 -1
- package/lib/esm/graph/engine/pinning/GraphPinningService.js.map +1 -0
- package/lib/esm/graph/engine/pinning/index.js +1 -1
- package/lib/esm/graph/engine/pinning/index.js.map +1 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlan.js +1 -1
- package/lib/esm/graph/engine/planning/GraphExecutionPlan.js.map +1 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanEdge.js +1 -1
- package/lib/esm/graph/engine/planning/GraphExecutionPlanEdge.js.map +1 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanLayer.js +1 -1
- package/lib/esm/graph/engine/planning/GraphExecutionPlanLayer.js.map +1 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanNode.js +1 -1
- package/lib/esm/graph/engine/planning/GraphExecutionPlanNode.js.map +1 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanner.js +1 -1
- package/lib/esm/graph/engine/planning/GraphExecutionPlanner.js.map +1 -0
- package/lib/esm/graph/engine/planning/GraphRelationResolver.js +1 -1
- package/lib/esm/graph/engine/planning/GraphRelationResolver.js.map +1 -0
- package/lib/esm/graph/engine/planning/GraphTopology.js +1 -1
- package/lib/esm/graph/engine/planning/GraphTopology.js.map +1 -0
- package/lib/esm/graph/engine/planning/index.js +1 -1
- package/lib/esm/graph/engine/planning/index.js.map +1 -0
- package/lib/esm/graph/engine/registry/GraphNodeExecutorRegistry.js +1 -1
- package/lib/esm/graph/engine/registry/GraphNodeExecutorRegistry.js.map +1 -0
- package/lib/esm/graph/engine/registry/GraphNodeExecutorResolver.js +1 -1
- package/lib/esm/graph/engine/registry/GraphNodeExecutorResolver.js.map +1 -0
- package/lib/esm/graph/engine/registry/index.js +1 -1
- package/lib/esm/graph/engine/registry/index.js.map +1 -0
- package/lib/esm/graph/engine/snapshots/GraphExecutionSnapshotMapper.js +1 -1
- package/lib/esm/graph/engine/snapshots/GraphExecutionSnapshotMapper.js.map +1 -0
- package/lib/esm/graph/engine/snapshots/index.js +1 -1
- package/lib/esm/graph/engine/snapshots/index.js.map +1 -0
- package/lib/esm/graph/engine/store/GraphCachedValue.js +1 -1
- package/lib/esm/graph/engine/store/GraphCachedValue.js.map +1 -0
- package/lib/esm/graph/engine/store/GraphValueKey.js +1 -1
- package/lib/esm/graph/engine/store/GraphValueKey.js.map +1 -0
- package/lib/esm/graph/engine/store/GraphValueStore.js +1 -1
- package/lib/esm/graph/engine/store/GraphValueStore.js.map +1 -0
- package/lib/esm/graph/engine/store/GraphValueStoreAdapter.js +1 -1
- package/lib/esm/graph/engine/store/GraphValueStoreAdapter.js.map +1 -0
- package/lib/esm/graph/engine/store/InMemoryGraphValueStoreAdapter.js +1 -1
- package/lib/esm/graph/engine/store/InMemoryGraphValueStoreAdapter.js.map +1 -0
- package/lib/esm/graph/engine/store/index.js +1 -1
- package/lib/esm/graph/engine/store/index.js.map +1 -0
- package/lib/esm/graph/engine/types.js +1 -1
- package/lib/esm/graph/engine/types.js.map +1 -0
- package/lib/esm/graph/engine/validation/GraphDefinitionValidator.js +1 -1
- package/lib/esm/graph/engine/validation/GraphDefinitionValidator.js.map +1 -0
- package/lib/esm/graph/engine/validation/GraphPortSchemaResolver.js +1 -1
- package/lib/esm/graph/engine/validation/GraphPortSchemaResolver.js.map +1 -0
- package/lib/esm/graph/engine/validation/GraphValueValidator.js +1 -1
- package/lib/esm/graph/engine/validation/GraphValueValidator.js.map +1 -0
- package/lib/esm/graph/engine/validation/index.js +1 -1
- package/lib/esm/graph/engine/validation/index.js.map +1 -0
- package/lib/esm/graph/index.js +1 -1
- package/lib/esm/graph/index.js.map +1 -0
- package/lib/esm/graph/shared/constants.js +1 -1
- package/lib/esm/graph/shared/constants.js.map +1 -0
- package/lib/esm/graph/shared/index.js +1 -1
- package/lib/esm/graph/shared/index.js.map +1 -0
- package/lib/esm/graph/shared/nodes/agent.js +1 -1
- package/lib/esm/graph/shared/nodes/agent.js.map +1 -0
- package/lib/esm/graph/shared/nodes/base.js +1 -1
- package/lib/esm/graph/shared/nodes/base.js.map +1 -0
- package/lib/esm/graph/shared/nodes/category-styles.js +1 -1
- package/lib/esm/graph/shared/nodes/category-styles.js.map +1 -0
- package/lib/esm/graph/shared/nodes/flow-control.js +1 -1
- package/lib/esm/graph/shared/nodes/flow-control.js.map +1 -0
- package/lib/esm/graph/shared/nodes/index.js +1 -1
- package/lib/esm/graph/shared/nodes/index.js.map +1 -0
- package/lib/esm/graph/shared/nodes/triggers.js +1 -1
- package/lib/esm/graph/shared/nodes/triggers.js.map +1 -0
- package/lib/esm/graph/shared/types.js +1 -1
- package/lib/esm/graph/shared/types.js.map +1 -0
- package/lib/esm/index.js +4 -4
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/keycloak/index.js +1 -1
- package/lib/esm/keycloak/index.js.map +1 -0
- package/lib/esm/keycloak/services/KeycloakAuthService.js +1 -1
- package/lib/esm/keycloak/services/KeycloakAuthService.js.map +1 -0
- package/lib/esm/keycloak/services/KeycloakClientService.js +1 -1
- package/lib/esm/keycloak/services/KeycloakClientService.js.map +1 -0
- package/lib/esm/keycloak/services/KeycloakIdentityProviderService.js +1 -1
- package/lib/esm/keycloak/services/KeycloakIdentityProviderService.js.map +1 -0
- package/lib/esm/keycloak/services/KeycloakRealmService.js +1 -1
- package/lib/esm/keycloak/services/KeycloakRealmService.js.map +1 -0
- package/lib/esm/keycloak/services/KeycloakRoleService.js +1 -1
- package/lib/esm/keycloak/services/KeycloakRoleService.js.map +1 -0
- package/lib/esm/keycloak/services/KeycloakService.js +1 -1
- package/lib/esm/keycloak/services/KeycloakService.js.map +1 -0
- package/lib/esm/keycloak/services/KeycloakUserService.js +1 -1
- package/lib/esm/keycloak/services/KeycloakUserService.js.map +1 -0
- package/lib/esm/keycloak/services/index.js +1 -1
- package/lib/esm/keycloak/services/index.js.map +1 -0
- package/lib/esm/keycloak/services/runtime.js +1 -1
- package/lib/esm/keycloak/services/runtime.js.map +1 -0
- package/lib/esm/keycloak/types.js +1 -1
- package/lib/esm/keycloak/types.js.map +1 -0
- package/lib/esm/kibana/builders/KibanaIndexBuilder.js +1 -1
- package/lib/esm/kibana/builders/KibanaIndexBuilder.js.map +1 -0
- package/lib/esm/kibana/builders/KibanaIndexBuilderCollection.js +1 -1
- package/lib/esm/kibana/builders/KibanaIndexBuilderCollection.js.map +1 -0
- package/lib/esm/kibana/builders/index.js +1 -1
- package/lib/esm/kibana/builders/index.js.map +1 -0
- package/lib/esm/kibana/helpers.js +1 -1
- package/lib/esm/kibana/helpers.js.map +1 -0
- package/lib/esm/kibana/index.js +1 -1
- package/lib/esm/kibana/index.js.map +1 -0
- package/lib/esm/kibana/services/KibanaAuthService.js +1 -1
- package/lib/esm/kibana/services/KibanaAuthService.js.map +1 -0
- package/lib/esm/kibana/services/KibanaDashboardService.js +1 -1
- package/lib/esm/kibana/services/KibanaDashboardService.js.map +1 -0
- package/lib/esm/kibana/services/KibanaDataViewService.js +1 -1
- package/lib/esm/kibana/services/KibanaDataViewService.js.map +1 -0
- package/lib/esm/kibana/services/KibanaRoleService.js +1 -1
- package/lib/esm/kibana/services/KibanaRoleService.js.map +1 -0
- package/lib/esm/kibana/services/KibanaService.js +1 -1
- package/lib/esm/kibana/services/KibanaService.js.map +1 -0
- package/lib/esm/kibana/services/KibanaSpaceService.js +1 -1
- package/lib/esm/kibana/services/KibanaSpaceService.js.map +1 -0
- package/lib/esm/kibana/services/KibanaUserService.js +1 -1
- package/lib/esm/kibana/services/KibanaUserService.js.map +1 -0
- package/lib/esm/kibana/services/index.js +1 -1
- package/lib/esm/kibana/services/index.js.map +1 -0
- package/lib/esm/kibana/services/runtime.js +1 -1
- package/lib/esm/kibana/services/runtime.js.map +1 -0
- package/lib/esm/kibana/types.js +1 -1
- package/lib/esm/kibana/types.js.map +1 -0
- package/lib/esm/loader/ObjectLoader.js +1 -1
- package/lib/esm/loader/ObjectLoader.js.map +1 -0
- package/lib/esm/loader/families.js +1 -1
- package/lib/esm/loader/families.js.map +1 -0
- package/lib/esm/loader/index.js +1 -1
- package/lib/esm/loader/index.js.map +1 -0
- package/lib/esm/loader/types.js +1 -1
- package/lib/esm/loader/types.js.map +1 -0
- package/lib/esm/namespaces/index.js +1 -1
- package/lib/esm/namespaces/index.js.map +1 -0
- package/lib/esm/namespaces/models/authorization-model.js +1 -1
- package/lib/esm/namespaces/models/authorization-model.js.map +1 -0
- package/lib/esm/namespaces/models/effective-permission.model.js +1 -1
- package/lib/esm/namespaces/models/effective-permission.model.js.map +1 -0
- package/lib/esm/namespaces/models/group-membership.model.js +1 -1
- package/lib/esm/namespaces/models/group-membership.model.js.map +1 -0
- package/lib/esm/namespaces/models/group.model.js +1 -1
- package/lib/esm/namespaces/models/group.model.js.map +1 -0
- package/lib/esm/namespaces/models/index.js +1 -1
- package/lib/esm/namespaces/models/index.js.map +1 -0
- package/lib/esm/namespaces/models/inheritance-block.model.js +1 -1
- package/lib/esm/namespaces/models/inheritance-block.model.js.map +1 -0
- package/lib/esm/namespaces/models/org-unit-closure.model.js +1 -1
- package/lib/esm/namespaces/models/org-unit-closure.model.js.map +1 -0
- package/lib/esm/namespaces/models/org-unit-membership.model.js +1 -1
- package/lib/esm/namespaces/models/org-unit-membership.model.js.map +1 -0
- package/lib/esm/namespaces/models/org-unit-profile.model.js +1 -1
- package/lib/esm/namespaces/models/org-unit-profile.model.js.map +1 -0
- package/lib/esm/namespaces/models/org-unit.model.js +1 -1
- package/lib/esm/namespaces/models/org-unit.model.js.map +1 -0
- package/lib/esm/namespaces/models/permission.model.js +1 -1
- package/lib/esm/namespaces/models/permission.model.js.map +1 -0
- package/lib/esm/namespaces/models/principal.model.js +1 -1
- package/lib/esm/namespaces/models/principal.model.js.map +1 -0
- package/lib/esm/namespaces/models/protected-resource.model.js +1 -1
- package/lib/esm/namespaces/models/protected-resource.model.js.map +1 -0
- package/lib/esm/namespaces/models/resource-grant.model.js +1 -1
- package/lib/esm/namespaces/models/resource-grant.model.js.map +1 -0
- package/lib/esm/namespaces/models/role-assignment.model.js +1 -1
- package/lib/esm/namespaces/models/role-assignment.model.js.map +1 -0
- package/lib/esm/namespaces/models/role-permission.model.js +1 -1
- package/lib/esm/namespaces/models/role-permission.model.js.map +1 -0
- package/lib/esm/namespaces/models/role.model.js +1 -1
- package/lib/esm/namespaces/models/role.model.js.map +1 -0
- package/lib/esm/namespaces/models/storage-binding.model.js +1 -1
- package/lib/esm/namespaces/models/storage-binding.model.js.map +1 -0
- package/lib/esm/namespaces/models/tenant-membership.model.js +1 -1
- package/lib/esm/namespaces/models/tenant-membership.model.js.map +1 -0
- package/lib/esm/namespaces/models/tenant-profile.model.js +1 -1
- package/lib/esm/namespaces/models/tenant-profile.model.js.map +1 -0
- package/lib/esm/namespaces/models/tenant.model.js +1 -1
- package/lib/esm/namespaces/models/tenant.model.js.map +1 -0
- package/lib/esm/namespaces/models/user.model.js +1 -1
- package/lib/esm/namespaces/models/user.model.js.map +1 -0
- package/lib/esm/namespaces/org-based-authorization-system.js +1 -1
- package/lib/esm/namespaces/org-based-authorization-system.js.map +1 -0
- package/lib/esm/namespaces/org-based-authorization-system.models.js +1 -1
- package/lib/esm/namespaces/org-based-authorization-system.models.js.map +1 -0
- package/lib/esm/namespaces/org-based-authorization-system.services.js +1 -1
- package/lib/esm/namespaces/org-based-authorization-system.services.js.map +1 -0
- package/lib/esm/namespaces/services/authz.service.js +1 -1
- package/lib/esm/namespaces/services/authz.service.js.map +1 -0
- package/lib/esm/namespaces/services/bootstrap.service.js +1 -1
- package/lib/esm/namespaces/services/bootstrap.service.js.map +1 -0
- package/lib/esm/namespaces/services/effective-permission.service.js +1 -1
- package/lib/esm/namespaces/services/effective-permission.service.js.map +1 -0
- package/lib/esm/namespaces/services/group-membership.service.js +1 -1
- package/lib/esm/namespaces/services/group-membership.service.js.map +1 -0
- package/lib/esm/namespaces/services/group.service.js +1 -1
- package/lib/esm/namespaces/services/group.service.js.map +1 -0
- package/lib/esm/namespaces/services/index.js +1 -1
- package/lib/esm/namespaces/services/index.js.map +1 -0
- package/lib/esm/namespaces/services/inheritance-block.service.js +1 -1
- package/lib/esm/namespaces/services/inheritance-block.service.js.map +1 -0
- package/lib/esm/namespaces/services/org-unit-closure.service.js +1 -1
- package/lib/esm/namespaces/services/org-unit-closure.service.js.map +1 -0
- package/lib/esm/namespaces/services/org-unit-membership.service.js +1 -1
- package/lib/esm/namespaces/services/org-unit-membership.service.js.map +1 -0
- package/lib/esm/namespaces/services/org-unit-profile.service.js +1 -1
- package/lib/esm/namespaces/services/org-unit-profile.service.js.map +1 -0
- package/lib/esm/namespaces/services/org-unit.service.js +1 -1
- package/lib/esm/namespaces/services/org-unit.service.js.map +1 -0
- package/lib/esm/namespaces/services/permission.service.js +1 -1
- package/lib/esm/namespaces/services/permission.service.js.map +1 -0
- package/lib/esm/namespaces/services/principal.service.js +1 -1
- package/lib/esm/namespaces/services/principal.service.js.map +1 -0
- package/lib/esm/namespaces/services/protected-resource.service.js +1 -1
- package/lib/esm/namespaces/services/protected-resource.service.js.map +1 -0
- package/lib/esm/namespaces/services/resource-grant.service.js +1 -1
- package/lib/esm/namespaces/services/resource-grant.service.js.map +1 -0
- package/lib/esm/namespaces/services/resource-lifecycle.service.js +1 -1
- package/lib/esm/namespaces/services/resource-lifecycle.service.js.map +1 -0
- package/lib/esm/namespaces/services/role-assignment.service.js +1 -1
- package/lib/esm/namespaces/services/role-assignment.service.js.map +1 -0
- package/lib/esm/namespaces/services/role-permission.service.js +1 -1
- package/lib/esm/namespaces/services/role-permission.service.js.map +1 -0
- package/lib/esm/namespaces/services/role.service.js +1 -1
- package/lib/esm/namespaces/services/role.service.js.map +1 -0
- package/lib/esm/namespaces/services/storage-binding.service.js +1 -1
- package/lib/esm/namespaces/services/storage-binding.service.js.map +1 -0
- package/lib/esm/namespaces/services/system-management.service.js +1 -1
- package/lib/esm/namespaces/services/system-management.service.js.map +1 -0
- package/lib/esm/namespaces/services/tenant-membership.service.js +1 -1
- package/lib/esm/namespaces/services/tenant-membership.service.js.map +1 -0
- package/lib/esm/namespaces/services/tenant-profile.service.js +1 -1
- package/lib/esm/namespaces/services/tenant-profile.service.js.map +1 -0
- package/lib/esm/namespaces/services/tenant.service.js +1 -1
- package/lib/esm/namespaces/services/tenant.service.js.map +1 -0
- package/lib/esm/namespaces/services/user.service.js +1 -1
- package/lib/esm/namespaces/services/user.service.js.map +1 -0
- package/lib/esm/namespaces/types.js +1 -1
- package/lib/esm/namespaces/types.js.map +1 -0
- package/lib/esm/namespaces/utils.js +1 -1
- package/lib/esm/namespaces/utils.js.map +1 -0
- package/lib/esm/nest/decorators.js +1 -1
- package/lib/esm/nest/decorators.js.map +1 -0
- package/lib/esm/nest/graph/GraphExecutionController.js +1 -1
- package/lib/esm/nest/graph/GraphExecutionController.js.map +1 -0
- package/lib/esm/nest/graph/GraphExecutionModule.js +1 -1
- package/lib/esm/nest/graph/GraphExecutionModule.js.map +1 -0
- package/lib/esm/nest/graph/GraphExecutionResultModel.js +1 -1
- package/lib/esm/nest/graph/GraphExecutionResultModel.js.map +1 -0
- package/lib/esm/nest/graph/GraphExecutorRegistryFactory.js +1 -1
- package/lib/esm/nest/graph/GraphExecutorRegistryFactory.js.map +1 -0
- package/lib/esm/nest/graph/GraphResultService.js +1 -1
- package/lib/esm/nest/graph/GraphResultService.js.map +1 -0
- package/lib/esm/nest/graph/GraphWorkflowModel.js +1 -1
- package/lib/esm/nest/graph/GraphWorkflowModel.js.map +1 -0
- package/lib/esm/nest/graph/GraphWorkflowService.js +1 -1
- package/lib/esm/nest/graph/GraphWorkflowService.js.map +1 -0
- package/lib/esm/nest/graph/index.js +1 -1
- package/lib/esm/nest/graph/index.js.map +1 -0
- package/lib/esm/nest/graph/main.js +1 -1
- package/lib/esm/nest/graph/main.js.map +1 -0
- package/lib/esm/nest/index.js +1 -1
- package/lib/esm/nest/index.js.map +1 -0
- package/lib/esm/nest/keycloakAuthHandler.js +4 -2
- package/lib/esm/nest/keycloakAuthHandler.js.map +1 -0
- package/lib/esm/nest/keycloakModule.js +1 -1
- package/lib/esm/nest/keycloakModule.js.map +1 -0
- package/lib/esm/nest/logging.js +1 -1
- package/lib/esm/nest/logging.js.map +1 -0
- package/lib/esm/nest/types.js +1 -1
- package/lib/esm/nest/types.js.map +1 -0
- package/lib/esm/nest/utils.js +14 -3
- package/lib/esm/nest/utils.js.map +1 -0
- package/lib/esm/plugins/contract.js +1 -1
- package/lib/esm/plugins/contract.js.map +1 -0
- package/lib/esm/plugins/index.js +1 -1
- package/lib/esm/plugins/index.js.map +1 -0
- package/lib/esm/plugins/kibana/host.js +1 -1
- package/lib/esm/plugins/kibana/host.js.map +1 -0
- package/lib/esm/plugins/kibana/index.js +1 -1
- package/lib/esm/plugins/kibana/index.js.map +1 -0
- package/lib/esm/plugins/kibana/installer.js +1 -1
- package/lib/esm/plugins/kibana/installer.js.map +1 -0
- package/lib/esm/plugins/kibana/manifest.js +1 -1
- package/lib/esm/plugins/kibana/manifest.js.map +1 -0
- package/lib/esm/plugins/kibana/templates.js +1 -1
- package/lib/esm/plugins/kibana/templates.js.map +1 -0
- package/lib/esm/plugins/kibana/types.js +1 -1
- package/lib/esm/plugins/kibana/types.js.map +1 -0
- package/lib/esm/plugins/superset/host.js +1 -1
- package/lib/esm/plugins/superset/host.js.map +1 -0
- package/lib/esm/plugins/superset/index.js +1 -1
- package/lib/esm/plugins/superset/index.js.map +1 -0
- package/lib/esm/plugins/superset/installer.js +1 -1
- package/lib/esm/plugins/superset/installer.js.map +1 -0
- package/lib/esm/plugins/superset/manifest.js +1 -1
- package/lib/esm/plugins/superset/manifest.js.map +1 -0
- package/lib/esm/plugins/superset/templates.js +1 -1
- package/lib/esm/plugins/superset/templates.js.map +1 -0
- package/lib/esm/plugins/superset/types.js +1 -1
- package/lib/esm/plugins/superset/types.js.map +1 -0
- package/lib/esm/secrets/aws/AwsSecretService.js +1 -1
- package/lib/esm/secrets/aws/AwsSecretService.js.map +1 -0
- package/lib/esm/secrets/aws/AwsSecretServiceConfig.js +1 -1
- package/lib/esm/secrets/aws/AwsSecretServiceConfig.js.map +1 -0
- package/lib/esm/secrets/aws/index.js +1 -1
- package/lib/esm/secrets/aws/index.js.map +1 -0
- package/lib/esm/secrets/azure/AzureKeyVaultSecretService.js +1 -1
- package/lib/esm/secrets/azure/AzureKeyVaultSecretService.js.map +1 -0
- package/lib/esm/secrets/azure/AzureKeyVaultSecretServiceConfig.js +1 -1
- package/lib/esm/secrets/azure/AzureKeyVaultSecretServiceConfig.js.map +1 -0
- package/lib/esm/secrets/azure/index.js +1 -1
- package/lib/esm/secrets/azure/index.js.map +1 -0
- package/lib/esm/secrets/core/SecretErrors.js +1 -1
- package/lib/esm/secrets/core/SecretErrors.js.map +1 -0
- package/lib/esm/secrets/core/SecretName.js +1 -1
- package/lib/esm/secrets/core/SecretName.js.map +1 -0
- package/lib/esm/secrets/core/SecretReference.js +1 -1
- package/lib/esm/secrets/core/SecretReference.js.map +1 -0
- package/lib/esm/secrets/core/SecretSerialization.js +1 -1
- package/lib/esm/secrets/core/SecretSerialization.js.map +1 -0
- package/lib/esm/secrets/core/SecretService.js +1 -1
- package/lib/esm/secrets/core/SecretService.js.map +1 -0
- package/lib/esm/secrets/core/SecretTypes.js +1 -1
- package/lib/esm/secrets/core/SecretTypes.js.map +1 -0
- package/lib/esm/secrets/core/index.js +1 -1
- package/lib/esm/secrets/core/index.js.map +1 -0
- package/lib/esm/secrets/gcp/GcpSecretManagerService.js +1 -1
- package/lib/esm/secrets/gcp/GcpSecretManagerService.js.map +1 -0
- package/lib/esm/secrets/gcp/GcpSecretManagerServiceConfig.js +1 -1
- package/lib/esm/secrets/gcp/GcpSecretManagerServiceConfig.js.map +1 -0
- package/lib/esm/secrets/gcp/index.js +1 -1
- package/lib/esm/secrets/gcp/index.js.map +1 -0
- package/lib/esm/secrets/index.js +1 -1
- package/lib/esm/secrets/index.js.map +1 -0
- package/lib/esm/secrets/model/ModelSecretCrypto.js +1 -1
- package/lib/esm/secrets/model/ModelSecretCrypto.js.map +1 -0
- package/lib/esm/secrets/model/ModelSecretService.js +1 -1
- package/lib/esm/secrets/model/ModelSecretService.js.map +1 -0
- package/lib/esm/secrets/model/ModelSecretServiceConfig.js +1 -1
- package/lib/esm/secrets/model/ModelSecretServiceConfig.js.map +1 -0
- package/lib/esm/secrets/model/Secret.js +1 -1
- package/lib/esm/secrets/model/Secret.js.map +1 -0
- package/lib/esm/secrets/model/index.js +1 -1
- package/lib/esm/secrets/model/index.js.map +1 -0
- package/lib/esm/secrets/onepassword/OnePasswordSecretService.js +1 -1
- package/lib/esm/secrets/onepassword/OnePasswordSecretService.js.map +1 -0
- package/lib/esm/secrets/onepassword/OnePasswordSecretServiceConfig.js +1 -1
- package/lib/esm/secrets/onepassword/OnePasswordSecretServiceConfig.js.map +1 -0
- package/lib/esm/secrets/onepassword/index.js +1 -1
- package/lib/esm/secrets/onepassword/index.js.map +1 -0
- package/lib/esm/secrets/vault/VaultSecretService.js +1 -1
- package/lib/esm/secrets/vault/VaultSecretService.js.map +1 -0
- package/lib/esm/secrets/vault/VaultSecretServiceConfig.js +1 -1
- package/lib/esm/secrets/vault/VaultSecretServiceConfig.js.map +1 -0
- package/lib/esm/secrets/vault/index.js +1 -1
- package/lib/esm/secrets/vault/index.js.map +1 -0
- package/lib/esm/shared/runtime.js +1 -1
- package/lib/esm/shared/runtime.js.map +1 -0
- package/lib/esm/utils.js +1 -1
- package/lib/esm/utils.js.map +1 -0
- package/lib/types/index.d.cts +2 -2
- package/lib/types/index.d.mts +2 -2
- package/package.json +3 -3
package/dist/integrations.js
CHANGED
|
@@ -1,2356 +1,2 @@
|
|
|
1
|
-
import { exec } from "child_process";
|
|
2
|
-
|
|
3
|
-
import { LogLevel, LoggedEnvironment } from "@decaf-ts/logging";
|
|
4
|
-
|
|
5
|
-
import { InternalError, NotFoundError } from "@decaf-ts/db-decorators";
|
|
6
|
-
|
|
7
|
-
import { Cascade, ModelService, pk, uuid, manyToOne, column, createdAt, updatedAt, table, unique, oneToMany, transactional, AuthorizationError, BaseModel, Repository, Condition, repository, service } from "@decaf-ts/core";
|
|
8
|
-
|
|
9
|
-
export { AuthorizationError, transactional } from "@decaf-ts/core";
|
|
10
|
-
|
|
11
|
-
import { Model, required, type, option, model } from "@decaf-ts/decorator-validation";
|
|
12
|
-
|
|
13
|
-
import { __decorate, __metadata } from "tslib";
|
|
14
|
-
|
|
15
|
-
import { Metadata, metadata, methodMetadata, propMetadata } from "@decaf-ts/decoration";
|
|
16
|
-
|
|
17
|
-
async function execWithLogging(command, options, log, level = LogLevel.info) {
|
|
18
|
-
log.debug(`Executing: ${command}`);
|
|
19
|
-
return new Promise((resolve, reject) => {
|
|
20
|
-
const child = exec(command, options);
|
|
21
|
-
const stdout = [];
|
|
22
|
-
const stderr = [];
|
|
23
|
-
child.stdout?.on("data", data => {
|
|
24
|
-
stdout.push(data);
|
|
25
|
-
log[level](data.trim());
|
|
26
|
-
});
|
|
27
|
-
child.stderr?.on("data", data => {
|
|
28
|
-
stderr.push(data);
|
|
29
|
-
log.debug(data.trim());
|
|
30
|
-
});
|
|
31
|
-
child.on("close", code => {
|
|
32
|
-
if (code === 0) {
|
|
33
|
-
log.silly(`Command completed successfully`);
|
|
34
|
-
resolve({
|
|
35
|
-
stdout: stdout.join("\n"),
|
|
36
|
-
stderr: stderr.join("\n")
|
|
37
|
-
});
|
|
38
|
-
} else {
|
|
39
|
-
log.critical(`Command failed with code ${code}:\n ${stderr.join("\n")}`);
|
|
40
|
-
reject(new InternalError(`Command failed with code ${code}: ${stderr.join("\n")}`));
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
child.on("error", err => {
|
|
44
|
-
log.critical(`Command execution error`, err);
|
|
45
|
-
reject(err);
|
|
46
|
-
});
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
var IsolationTier;
|
|
51
|
-
|
|
52
|
-
(function(IsolationTier) {
|
|
53
|
-
IsolationTier["Pooled"] = "pooled";
|
|
54
|
-
IsolationTier["Bridge"] = "bridge";
|
|
55
|
-
IsolationTier["Silo"] = "silo";
|
|
56
|
-
})(IsolationTier || (IsolationTier = {}));
|
|
57
|
-
|
|
58
|
-
var MembershipStatus;
|
|
59
|
-
|
|
60
|
-
(function(MembershipStatus) {
|
|
61
|
-
MembershipStatus["Invited"] = "invited";
|
|
62
|
-
MembershipStatus["Active"] = "active";
|
|
63
|
-
MembershipStatus["Suspended"] = "suspended";
|
|
64
|
-
MembershipStatus["Removed"] = "removed";
|
|
65
|
-
})(MembershipStatus || (MembershipStatus = {}));
|
|
66
|
-
|
|
67
|
-
var PrincipalKind;
|
|
68
|
-
|
|
69
|
-
(function(PrincipalKind) {
|
|
70
|
-
PrincipalKind["User"] = "user";
|
|
71
|
-
PrincipalKind["Group"] = "group";
|
|
72
|
-
PrincipalKind["ServiceAccount"] = "service_account";
|
|
73
|
-
PrincipalKind["Agent"] = "agent";
|
|
74
|
-
PrincipalKind["ApiKey"] = "api_key";
|
|
75
|
-
})(PrincipalKind || (PrincipalKind = {}));
|
|
76
|
-
|
|
77
|
-
var ScopeKind;
|
|
78
|
-
|
|
79
|
-
(function(ScopeKind) {
|
|
80
|
-
ScopeKind["Tenant"] = "tenant";
|
|
81
|
-
ScopeKind["OrgUnit"] = "org_unit";
|
|
82
|
-
ScopeKind["Resource"] = "resource";
|
|
83
|
-
})(ScopeKind || (ScopeKind = {}));
|
|
84
|
-
|
|
85
|
-
var PermissionCategory;
|
|
86
|
-
|
|
87
|
-
(function(PermissionCategory) {
|
|
88
|
-
PermissionCategory["Admin"] = "admin";
|
|
89
|
-
PermissionCategory["ContentRead"] = "content_read";
|
|
90
|
-
PermissionCategory["ContentWrite"] = "content_write";
|
|
91
|
-
PermissionCategory["Memory"] = "memory";
|
|
92
|
-
PermissionCategory["Graph"] = "graph";
|
|
93
|
-
PermissionCategory["Vector"] = "vector";
|
|
94
|
-
PermissionCategory["Export"] = "export";
|
|
95
|
-
PermissionCategory["Billing"] = "billing";
|
|
96
|
-
PermissionCategory["Audit"] = "audit";
|
|
97
|
-
PermissionCategory["Security"] = "security";
|
|
98
|
-
PermissionCategory["Data"] = "data";
|
|
99
|
-
PermissionCategory["Automation"] = "automation";
|
|
100
|
-
})(PermissionCategory || (PermissionCategory = {}));
|
|
101
|
-
|
|
102
|
-
var ResourceVisibility;
|
|
103
|
-
|
|
104
|
-
(function(ResourceVisibility) {
|
|
105
|
-
ResourceVisibility["Private"] = "private";
|
|
106
|
-
ResourceVisibility["ResourceAcl"] = "resource_acl";
|
|
107
|
-
ResourceVisibility["OrgUnit"] = "org_unit";
|
|
108
|
-
ResourceVisibility["OrgSubtree"] = "org_subtree";
|
|
109
|
-
ResourceVisibility["Tenant"] = "tenant";
|
|
110
|
-
})(ResourceVisibility || (ResourceVisibility = {}));
|
|
111
|
-
|
|
112
|
-
var StorageKind;
|
|
113
|
-
|
|
114
|
-
(function(StorageKind) {
|
|
115
|
-
StorageKind["Postgres"] = "postgres";
|
|
116
|
-
StorageKind["Arango"] = "arango";
|
|
117
|
-
StorageKind["Qdrant"] = "qdrant";
|
|
118
|
-
StorageKind["ObjectStorage"] = "object_storage";
|
|
119
|
-
})(StorageKind || (StorageKind = {}));
|
|
120
|
-
|
|
121
|
-
var StorageBindingKind;
|
|
122
|
-
|
|
123
|
-
(function(StorageBindingKind) {
|
|
124
|
-
StorageBindingKind["Shared"] = "shared";
|
|
125
|
-
StorageBindingKind["Dedicated"] = "dedicated";
|
|
126
|
-
})(StorageBindingKind || (StorageBindingKind = {}));
|
|
127
|
-
|
|
128
|
-
const IsolationTierOptions = Object.values(IsolationTier);
|
|
129
|
-
|
|
130
|
-
const MembershipStatusOptions = Object.values(MembershipStatus);
|
|
131
|
-
|
|
132
|
-
const PrincipalKindOptions = Object.values(PrincipalKind);
|
|
133
|
-
|
|
134
|
-
const ScopeKindOptions = Object.values(ScopeKind);
|
|
135
|
-
|
|
136
|
-
const PermissionCategoryOptions = Object.values(PermissionCategory);
|
|
137
|
-
|
|
138
|
-
const ResourceVisibilityOptions = Object.values(ResourceVisibility);
|
|
139
|
-
|
|
140
|
-
const StorageKindOptions = Object.values(StorageKind);
|
|
141
|
-
|
|
142
|
-
const StorageBindingKindOptions = Object.values(StorageBindingKind);
|
|
143
|
-
|
|
144
|
-
const REL_RESTRICT = {
|
|
145
|
-
update: Cascade.NONE,
|
|
146
|
-
delete: Cascade.NONE,
|
|
147
|
-
nullable: false
|
|
148
|
-
};
|
|
149
|
-
|
|
150
|
-
const REL_NULLIFY = {
|
|
151
|
-
update: Cascade.NONE,
|
|
152
|
-
delete: Cascade.NONE,
|
|
153
|
-
nullable: true
|
|
154
|
-
};
|
|
155
|
-
|
|
156
|
-
const REL_CASCADE_DEPENDENT = {
|
|
157
|
-
update: Cascade.CASCADE,
|
|
158
|
-
delete: Cascade.CASCADE,
|
|
159
|
-
nullable: false
|
|
160
|
-
};
|
|
161
|
-
|
|
162
|
-
const REL_CASCADE_INSERT_UPDATE = {
|
|
163
|
-
update: Cascade.CASCADE,
|
|
164
|
-
delete: Cascade.NONE,
|
|
165
|
-
nullable: false
|
|
166
|
-
};
|
|
167
|
-
|
|
168
|
-
function buildArangoContext(options) {
|
|
169
|
-
return {
|
|
170
|
-
tenantId: options.tenantId,
|
|
171
|
-
principalId: options.principalId,
|
|
172
|
-
permissionKey: options.permissionKey,
|
|
173
|
-
allowedOrgUnitIds: [ ...options.allowedOrgUnitIds ],
|
|
174
|
-
allowedResourceIds: [ ...options.allowedResourceIds ]
|
|
175
|
-
};
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
function buildQdrantFilter(options) {
|
|
179
|
-
return {
|
|
180
|
-
must: [ {
|
|
181
|
-
key: "tenant_id",
|
|
182
|
-
match: {
|
|
183
|
-
value: options.tenantId
|
|
184
|
-
}
|
|
185
|
-
}, {
|
|
186
|
-
should: [ {
|
|
187
|
-
key: "org_unit_id",
|
|
188
|
-
match: {
|
|
189
|
-
any: options.allowedOrgUnitIds
|
|
190
|
-
}
|
|
191
|
-
}, {
|
|
192
|
-
key: "protected_resource_id",
|
|
193
|
-
match: {
|
|
194
|
-
any: options.allowedResourceIds
|
|
195
|
-
}
|
|
196
|
-
}, {
|
|
197
|
-
key: "owner_principal_id",
|
|
198
|
-
match: {
|
|
199
|
-
value: options.principalId
|
|
200
|
-
}
|
|
201
|
-
} ]
|
|
202
|
-
} ]
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
function scopeKey$1(scopeKind, scopeId) {
|
|
207
|
-
return `${scopeKind}:${scopeId}`;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
function nowIso() {
|
|
211
|
-
return new Date;
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
function asArray(value) {
|
|
215
|
-
return value ?? [];
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
function sameTenant(rowTenant, tenantId) {
|
|
219
|
-
return relationId(rowTenant) === tenantId;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
function relationMatch(value, target) {
|
|
223
|
-
return target ? relationId(value) === target : false;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
function lowerSlug(value) {
|
|
227
|
-
return value.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "") || "item";
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
function isTimeValid(at, startsAt, expiresAt) {
|
|
231
|
-
const instant = at ?? new Date;
|
|
232
|
-
if (startsAt && instant < startsAt) return false;
|
|
233
|
-
if (expiresAt && instant > expiresAt) return false;
|
|
234
|
-
return true;
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
function buildAccessContext(options) {
|
|
238
|
-
const permissionsByScope = {};
|
|
239
|
-
const allowedOrgUnitIdsByPermission = {};
|
|
240
|
-
for (const permission of options.permissions) {
|
|
241
|
-
const key = scopeKey$1(permission.scopeKind, permission.scopeId);
|
|
242
|
-
permissionsByScope[key] = permissionsByScope[key] ?? [];
|
|
243
|
-
permissionsByScope[key].push(permission.permissionKey);
|
|
244
|
-
if (permission.scopeKind === ScopeKind.OrgUnit) {
|
|
245
|
-
allowedOrgUnitIdsByPermission[permission.permissionKey] = allowedOrgUnitIdsByPermission[permission.permissionKey] ?? [];
|
|
246
|
-
allowedOrgUnitIdsByPermission[permission.permissionKey].push(permission.scopeId);
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
return {
|
|
250
|
-
tenantId: options.tenantId,
|
|
251
|
-
principalId: options.principalId,
|
|
252
|
-
permissionsByScope: permissionsByScope,
|
|
253
|
-
allowedOrgUnitIdsByPermission: allowedOrgUnitIdsByPermission,
|
|
254
|
-
resourceGrants: options.grants.map(grant => ({
|
|
255
|
-
resourceId: grant.resourceId,
|
|
256
|
-
permissionKey: grant.permissionKey
|
|
257
|
-
}))
|
|
258
|
-
};
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
class BaseModelService extends ModelService {
|
|
262
|
-
constructor(clazz) {
|
|
263
|
-
super(clazz);
|
|
264
|
-
}
|
|
265
|
-
newModel(clazz, data) {
|
|
266
|
-
return Object.assign(new clazz, data);
|
|
267
|
-
}
|
|
268
|
-
async create(data, ...args) {
|
|
269
|
-
return this.repo.create(Object.assign({}, data), ...args);
|
|
270
|
-
}
|
|
271
|
-
async createOne(data, ...args) {
|
|
272
|
-
return this.create(data, ...args);
|
|
273
|
-
}
|
|
274
|
-
async getById(id, ...args) {
|
|
275
|
-
return this.repo.read(id, ...args);
|
|
276
|
-
}
|
|
277
|
-
async updateOne(id, patch, ...args) {
|
|
278
|
-
const existing = await this.repo.read(id, ...args);
|
|
279
|
-
return this.repo.update(Object.assign(existing, patch), ...args);
|
|
280
|
-
}
|
|
281
|
-
async deleteById(id, ...args) {
|
|
282
|
-
await this.repo.delete(id, ...args);
|
|
283
|
-
}
|
|
284
|
-
async findOneBy(key, value, ...args) {
|
|
285
|
-
return this.repo.findOneBy(key, value, ...args);
|
|
286
|
-
}
|
|
287
|
-
async findManyBy(key, value, ...args) {
|
|
288
|
-
return this.repo.select().where({
|
|
289
|
-
[key]: value
|
|
290
|
-
}).execute(...args);
|
|
291
|
-
}
|
|
292
|
-
async listAll(...args) {
|
|
293
|
-
return this.repo.select().execute(...args);
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
function id() {
|
|
298
|
-
return crypto.randomUUID();
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
function relationId(value) {
|
|
302
|
-
return typeof value === "string" ? value : value.id;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
class AuthorizationModel extends Model {
|
|
306
|
-
constructor(data) {
|
|
307
|
-
super(data);
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
let TenantMembership = class TenantMembership extends AuthorizationModel {
|
|
312
|
-
constructor(data) {
|
|
313
|
-
super(data);
|
|
314
|
-
}
|
|
315
|
-
};
|
|
316
|
-
|
|
317
|
-
__decorate([ pk({
|
|
318
|
-
type: String
|
|
319
|
-
}), uuid(), __metadata("design:type", String) ], TenantMembership.prototype, "id", void 0);
|
|
320
|
-
|
|
321
|
-
__decorate([ manyToOne(() => Tenant, REL_CASCADE_DEPENDENT, false, undefined, "fk_tenant_memberships_tenant"), required(), __metadata("design:type", Object) ], TenantMembership.prototype, "tenant", void 0);
|
|
322
|
-
|
|
323
|
-
__decorate([ manyToOne(() => User, REL_CASCADE_DEPENDENT, false, undefined, "fk_tenant_memberships_user"), required(), __metadata("design:type", Object) ], TenantMembership.prototype, "user", void 0);
|
|
324
|
-
|
|
325
|
-
__decorate([ required(), type(String), option(MembershipStatusOptions), column(), __metadata("design:type", String) ], TenantMembership.prototype, "status", void 0);
|
|
326
|
-
|
|
327
|
-
__decorate([ createdAt(), __metadata("design:type", Date) ], TenantMembership.prototype, "createdAt", void 0);
|
|
328
|
-
|
|
329
|
-
__decorate([ updatedAt(), __metadata("design:type", Date) ], TenantMembership.prototype, "updatedAt", void 0);
|
|
330
|
-
|
|
331
|
-
TenantMembership = __decorate([ table("tenant_memberships"), model(), __metadata("design:paramtypes", [ Object ]) ], TenantMembership);
|
|
332
|
-
|
|
333
|
-
let User = class User extends AuthorizationModel {
|
|
334
|
-
constructor(data) {
|
|
335
|
-
super(data);
|
|
336
|
-
}
|
|
337
|
-
};
|
|
338
|
-
|
|
339
|
-
__decorate([ pk({
|
|
340
|
-
type: String
|
|
341
|
-
}), uuid(), __metadata("design:type", String) ], User.prototype, "id", void 0);
|
|
342
|
-
|
|
343
|
-
__decorate([ unique(), type(String), column(), __metadata("design:type", String) ], User.prototype, "email", void 0);
|
|
344
|
-
|
|
345
|
-
__decorate([ unique(), type(String), column(), __metadata("design:type", String) ], User.prototype, "phone", void 0);
|
|
346
|
-
|
|
347
|
-
__decorate([ required(), type(String), column(), __metadata("design:type", String) ], User.prototype, "displayName", void 0);
|
|
348
|
-
|
|
349
|
-
__decorate([ oneToMany(() => TenantMembership, REL_RESTRICT, false), __metadata("design:type", Array) ], User.prototype, "tenantMemberships", void 0);
|
|
350
|
-
|
|
351
|
-
__decorate([ oneToMany(() => OrgUnitMembership, REL_RESTRICT, false), __metadata("design:type", Array) ], User.prototype, "orgUnitMemberships", void 0);
|
|
352
|
-
|
|
353
|
-
__decorate([ createdAt(), __metadata("design:type", Date) ], User.prototype, "createdAt", void 0);
|
|
354
|
-
|
|
355
|
-
__decorate([ updatedAt(), __metadata("design:type", Date) ], User.prototype, "updatedAt", void 0);
|
|
356
|
-
|
|
357
|
-
User = __decorate([ table("users"), model(), __metadata("design:paramtypes", [ Object ]) ], User);
|
|
358
|
-
|
|
359
|
-
let OrgUnitMembership = class OrgUnitMembership extends AuthorizationModel {
|
|
360
|
-
constructor(data) {
|
|
361
|
-
super(data);
|
|
362
|
-
}
|
|
363
|
-
};
|
|
364
|
-
|
|
365
|
-
__decorate([ pk({
|
|
366
|
-
type: String
|
|
367
|
-
}), uuid(), __metadata("design:type", String) ], OrgUnitMembership.prototype, "id", void 0);
|
|
368
|
-
|
|
369
|
-
__decorate([ manyToOne(() => Tenant, REL_CASCADE_DEPENDENT, false, undefined, "fk_org_memberships_tenant"), required(), __metadata("design:type", Object) ], OrgUnitMembership.prototype, "tenant", void 0);
|
|
370
|
-
|
|
371
|
-
__decorate([ manyToOne(() => OrgUnit, REL_CASCADE_DEPENDENT, false, undefined, "fk_org_memberships_org_unit"), required(), __metadata("design:type", Object) ], OrgUnitMembership.prototype, "orgUnit", void 0);
|
|
372
|
-
|
|
373
|
-
__decorate([ manyToOne(() => User, REL_RESTRICT, false, undefined, "fk_org_memberships_user"), required(), __metadata("design:type", Object) ], OrgUnitMembership.prototype, "user", void 0);
|
|
374
|
-
|
|
375
|
-
__decorate([ required(), type(String), option(MembershipStatusOptions), column(), __metadata("design:type", String) ], OrgUnitMembership.prototype, "status", void 0);
|
|
376
|
-
|
|
377
|
-
__decorate([ createdAt(), __metadata("design:type", Date) ], OrgUnitMembership.prototype, "createdAt", void 0);
|
|
378
|
-
|
|
379
|
-
__decorate([ updatedAt(), __metadata("design:type", Date) ], OrgUnitMembership.prototype, "updatedAt", void 0);
|
|
380
|
-
|
|
381
|
-
OrgUnitMembership = __decorate([ table("org_unit_memberships"), model(), __metadata("design:paramtypes", [ Object ]) ], OrgUnitMembership);
|
|
382
|
-
|
|
383
|
-
let OrgUnitClosure = class OrgUnitClosure extends AuthorizationModel {
|
|
384
|
-
constructor(data) {
|
|
385
|
-
super(data);
|
|
386
|
-
}
|
|
387
|
-
};
|
|
388
|
-
|
|
389
|
-
__decorate([ pk({
|
|
390
|
-
type: String
|
|
391
|
-
}), uuid(), __metadata("design:type", String) ], OrgUnitClosure.prototype, "id", void 0);
|
|
392
|
-
|
|
393
|
-
__decorate([ manyToOne(() => Tenant, REL_CASCADE_DEPENDENT, false, undefined, "fk_org_closure_tenant"), required(), __metadata("design:type", Object) ], OrgUnitClosure.prototype, "tenant", void 0);
|
|
394
|
-
|
|
395
|
-
__decorate([ manyToOne(() => OrgUnit, REL_CASCADE_DEPENDENT, false, undefined, "fk_org_closure_ancestor"), required(), __metadata("design:type", Object) ], OrgUnitClosure.prototype, "ancestor", void 0);
|
|
396
|
-
|
|
397
|
-
__decorate([ manyToOne(() => OrgUnit, REL_CASCADE_DEPENDENT, false, undefined, "fk_org_closure_descendant"), required(), __metadata("design:type", Object) ], OrgUnitClosure.prototype, "descendant", void 0);
|
|
398
|
-
|
|
399
|
-
__decorate([ required(), type(Number), column(), __metadata("design:type", Number) ], OrgUnitClosure.prototype, "depth", void 0);
|
|
400
|
-
|
|
401
|
-
__decorate([ createdAt(), __metadata("design:type", Date) ], OrgUnitClosure.prototype, "createdAt", void 0);
|
|
402
|
-
|
|
403
|
-
OrgUnitClosure = __decorate([ table("org_unit_closure"), model(), __metadata("design:paramtypes", [ Object ]) ], OrgUnitClosure);
|
|
404
|
-
|
|
405
|
-
let Permission = class Permission extends AuthorizationModel {
|
|
406
|
-
constructor(data) {
|
|
407
|
-
super(data);
|
|
408
|
-
}
|
|
409
|
-
};
|
|
410
|
-
|
|
411
|
-
__decorate([ pk({
|
|
412
|
-
type: String
|
|
413
|
-
}), uuid(), __metadata("design:type", String) ], Permission.prototype, "id", void 0);
|
|
414
|
-
|
|
415
|
-
__decorate([ unique(), required(), type(String), column(), __metadata("design:type", String) ], Permission.prototype, "key", void 0);
|
|
416
|
-
|
|
417
|
-
__decorate([ required(), type(String), option(PermissionCategoryOptions), column(), __metadata("design:type", String) ], Permission.prototype, "category", void 0);
|
|
418
|
-
|
|
419
|
-
__decorate([ type(String), column(), __metadata("design:type", String) ], Permission.prototype, "description", void 0);
|
|
420
|
-
|
|
421
|
-
__decorate([ oneToMany(() => RolePermission, REL_RESTRICT, false), __metadata("design:type", Array) ], Permission.prototype, "rolePermissions", void 0);
|
|
422
|
-
|
|
423
|
-
Permission = __decorate([ table("permissions"), model(), __metadata("design:paramtypes", [ Object ]) ], Permission);
|
|
424
|
-
|
|
425
|
-
let RolePermission = class RolePermission extends AuthorizationModel {
|
|
426
|
-
constructor(data) {
|
|
427
|
-
super(data);
|
|
428
|
-
}
|
|
429
|
-
};
|
|
430
|
-
|
|
431
|
-
__decorate([ pk({
|
|
432
|
-
type: String
|
|
433
|
-
}), uuid(), __metadata("design:type", String) ], RolePermission.prototype, "id", void 0);
|
|
434
|
-
|
|
435
|
-
__decorate([ manyToOne(() => Role, REL_CASCADE_DEPENDENT, false, undefined, "fk_role_permissions_role"), required(), __metadata("design:type", Object) ], RolePermission.prototype, "role", void 0);
|
|
436
|
-
|
|
437
|
-
__decorate([ manyToOne(() => Permission, REL_CASCADE_DEPENDENT, false, undefined, "fk_role_permissions_permission"), required(), __metadata("design:type", Object) ], RolePermission.prototype, "permission", void 0);
|
|
438
|
-
|
|
439
|
-
__decorate([ createdAt(), __metadata("design:type", Date) ], RolePermission.prototype, "createdAt", void 0);
|
|
440
|
-
|
|
441
|
-
RolePermission = __decorate([ table("role_permissions"), model(), __metadata("design:paramtypes", [ Object ]) ], RolePermission);
|
|
442
|
-
|
|
443
|
-
let Role = class Role extends AuthorizationModel {
|
|
444
|
-
constructor(data) {
|
|
445
|
-
super(data);
|
|
446
|
-
}
|
|
447
|
-
};
|
|
448
|
-
|
|
449
|
-
__decorate([ pk({
|
|
450
|
-
type: String
|
|
451
|
-
}), uuid(), __metadata("design:type", String) ], Role.prototype, "id", void 0);
|
|
452
|
-
|
|
453
|
-
__decorate([ manyToOne(() => Tenant, REL_NULLIFY, false, undefined, "fk_roles_tenant"), __metadata("design:type", Object) ], Role.prototype, "tenant", void 0);
|
|
454
|
-
|
|
455
|
-
__decorate([ required(), type(String), column(), __metadata("design:type", String) ], Role.prototype, "key", void 0);
|
|
456
|
-
|
|
457
|
-
__decorate([ required(), type(String), column(), __metadata("design:type", String) ], Role.prototype, "name", void 0);
|
|
458
|
-
|
|
459
|
-
__decorate([ type(String), column(), __metadata("design:type", String) ], Role.prototype, "description", void 0);
|
|
460
|
-
|
|
461
|
-
__decorate([ type(Object), column(), __metadata("design:type", Object) ], Role.prototype, "metadata", void 0);
|
|
462
|
-
|
|
463
|
-
__decorate([ oneToMany(() => RolePermission, REL_RESTRICT, false), __metadata("design:type", Array) ], Role.prototype, "rolePermissions", void 0);
|
|
464
|
-
|
|
465
|
-
__decorate([ oneToMany(() => RoleAssignment, REL_RESTRICT, false), __metadata("design:type", Array) ], Role.prototype, "assignments", void 0);
|
|
466
|
-
|
|
467
|
-
__decorate([ createdAt(), __metadata("design:type", Date) ], Role.prototype, "createdAt", void 0);
|
|
468
|
-
|
|
469
|
-
__decorate([ updatedAt(), __metadata("design:type", Date) ], Role.prototype, "updatedAt", void 0);
|
|
470
|
-
|
|
471
|
-
Role = __decorate([ table("roles"), model(), __metadata("design:paramtypes", [ Object ]) ], Role);
|
|
472
|
-
|
|
473
|
-
let RoleAssignment = class RoleAssignment extends AuthorizationModel {
|
|
474
|
-
constructor(data) {
|
|
475
|
-
super(data);
|
|
476
|
-
}
|
|
477
|
-
};
|
|
478
|
-
|
|
479
|
-
__decorate([ pk({
|
|
480
|
-
type: String
|
|
481
|
-
}), uuid(), __metadata("design:type", String) ], RoleAssignment.prototype, "id", void 0);
|
|
482
|
-
|
|
483
|
-
__decorate([ manyToOne(() => Tenant, REL_CASCADE_DEPENDENT, false, undefined, "fk_role_assignments_tenant"), required(), __metadata("design:type", Object) ], RoleAssignment.prototype, "tenant", void 0);
|
|
484
|
-
|
|
485
|
-
__decorate([ manyToOne(() => Principal, REL_CASCADE_DEPENDENT, false, undefined, "fk_role_assignments_principal"), required(), __metadata("design:type", Object) ], RoleAssignment.prototype, "principal", void 0);
|
|
486
|
-
|
|
487
|
-
__decorate([ manyToOne(() => Role, REL_RESTRICT, false, undefined, "fk_role_assignments_role"), required(), __metadata("design:type", Object) ], RoleAssignment.prototype, "role", void 0);
|
|
488
|
-
|
|
489
|
-
__decorate([ required(), type(String), option(ScopeKindOptions), column(), __metadata("design:type", String) ], RoleAssignment.prototype, "scopeKind", void 0);
|
|
490
|
-
|
|
491
|
-
__decorate([ required(), type(String), column(), __metadata("design:type", String) ], RoleAssignment.prototype, "scopeId", void 0);
|
|
492
|
-
|
|
493
|
-
__decorate([ required(), type(Boolean), column(), __metadata("design:type", Boolean) ], RoleAssignment.prototype, "inheritDown", void 0);
|
|
494
|
-
|
|
495
|
-
__decorate([ column(), __metadata("design:type", Date) ], RoleAssignment.prototype, "startsAt", void 0);
|
|
496
|
-
|
|
497
|
-
__decorate([ column(), __metadata("design:type", Date) ], RoleAssignment.prototype, "expiresAt", void 0);
|
|
498
|
-
|
|
499
|
-
__decorate([ type(Object), column(), __metadata("design:type", Object) ], RoleAssignment.prototype, "conditions", void 0);
|
|
500
|
-
|
|
501
|
-
__decorate([ createdAt(), __metadata("design:type", Date) ], RoleAssignment.prototype, "createdAt", void 0);
|
|
502
|
-
|
|
503
|
-
__decorate([ updatedAt(), __metadata("design:type", Date) ], RoleAssignment.prototype, "updatedAt", void 0);
|
|
504
|
-
|
|
505
|
-
RoleAssignment = __decorate([ table("role_assignments"), model(), __metadata("design:paramtypes", [ Object ]) ], RoleAssignment);
|
|
506
|
-
|
|
507
|
-
let ResourceGrant = class ResourceGrant extends AuthorizationModel {
|
|
508
|
-
constructor(data) {
|
|
509
|
-
super(data);
|
|
510
|
-
}
|
|
511
|
-
};
|
|
512
|
-
|
|
513
|
-
__decorate([ pk({
|
|
514
|
-
type: String
|
|
515
|
-
}), uuid(), __metadata("design:type", String) ], ResourceGrant.prototype, "id", void 0);
|
|
516
|
-
|
|
517
|
-
__decorate([ manyToOne(() => Tenant, REL_CASCADE_DEPENDENT, false, undefined, "fk_resource_grants_tenant"), required(), __metadata("design:type", Object) ], ResourceGrant.prototype, "tenant", void 0);
|
|
518
|
-
|
|
519
|
-
__decorate([ manyToOne(() => ProtectedResource, REL_CASCADE_DEPENDENT, false, undefined, "fk_resource_grants_resource"), required(), __metadata("design:type", Object) ], ResourceGrant.prototype, "resource", void 0);
|
|
520
|
-
|
|
521
|
-
__decorate([ manyToOne(() => Principal, REL_CASCADE_DEPENDENT, false, undefined, "fk_resource_grants_principal"), required(), __metadata("design:type", Object) ], ResourceGrant.prototype, "principal", void 0);
|
|
522
|
-
|
|
523
|
-
__decorate([ required(), type(String), column(), __metadata("design:type", String) ], ResourceGrant.prototype, "permissionKey", void 0);
|
|
524
|
-
|
|
525
|
-
__decorate([ column(), __metadata("design:type", Date) ], ResourceGrant.prototype, "startsAt", void 0);
|
|
526
|
-
|
|
527
|
-
__decorate([ column(), __metadata("design:type", Date) ], ResourceGrant.prototype, "expiresAt", void 0);
|
|
528
|
-
|
|
529
|
-
__decorate([ type(Object), column(), __metadata("design:type", Object) ], ResourceGrant.prototype, "conditions", void 0);
|
|
530
|
-
|
|
531
|
-
__decorate([ manyToOne(() => Principal, REL_RESTRICT, false, undefined, "fk_resource_grants_created_by"), __metadata("design:type", Object) ], ResourceGrant.prototype, "createdBy", void 0);
|
|
532
|
-
|
|
533
|
-
__decorate([ createdAt(), __metadata("design:type", Date) ], ResourceGrant.prototype, "createdAt", void 0);
|
|
534
|
-
|
|
535
|
-
__decorate([ updatedAt(), __metadata("design:type", Date) ], ResourceGrant.prototype, "updatedAt", void 0);
|
|
536
|
-
|
|
537
|
-
ResourceGrant = __decorate([ table("resource_grants"), model(), __metadata("design:paramtypes", [ Object ]) ], ResourceGrant);
|
|
538
|
-
|
|
539
|
-
let Principal = class Principal extends AuthorizationModel {
|
|
540
|
-
constructor(data) {
|
|
541
|
-
super(data);
|
|
542
|
-
}
|
|
543
|
-
};
|
|
544
|
-
|
|
545
|
-
__decorate([ pk({
|
|
546
|
-
type: String
|
|
547
|
-
}), uuid(), __metadata("design:type", String) ], Principal.prototype, "id", void 0);
|
|
548
|
-
|
|
549
|
-
__decorate([ manyToOne(() => Tenant, REL_RESTRICT, false, undefined, "fk_principals_tenant"), required(), __metadata("design:type", Object) ], Principal.prototype, "tenant", void 0);
|
|
550
|
-
|
|
551
|
-
__decorate([ required(), type(String), option(PrincipalKindOptions), column(), __metadata("design:type", String) ], Principal.prototype, "kind", void 0);
|
|
552
|
-
|
|
553
|
-
__decorate([ required(), type(String), column(), __metadata("design:type", String) ], Principal.prototype, "subjectId", void 0);
|
|
554
|
-
|
|
555
|
-
__decorate([ oneToMany(() => RoleAssignment, REL_RESTRICT, false), __metadata("design:type", Array) ], Principal.prototype, "roleAssignments", void 0);
|
|
556
|
-
|
|
557
|
-
__decorate([ oneToMany(() => ResourceGrant, REL_RESTRICT, false), __metadata("design:type", Array) ], Principal.prototype, "resourceGrants", void 0);
|
|
558
|
-
|
|
559
|
-
__decorate([ createdAt(), __metadata("design:type", Date) ], Principal.prototype, "createdAt", void 0);
|
|
560
|
-
|
|
561
|
-
__decorate([ updatedAt(), __metadata("design:type", Date) ], Principal.prototype, "updatedAt", void 0);
|
|
562
|
-
|
|
563
|
-
Principal = __decorate([ table("principals"), model(), __metadata("design:paramtypes", [ Object ]) ], Principal);
|
|
564
|
-
|
|
565
|
-
let ProtectedResource = class ProtectedResource extends AuthorizationModel {
|
|
566
|
-
constructor(data) {
|
|
567
|
-
super(data);
|
|
568
|
-
}
|
|
569
|
-
};
|
|
570
|
-
|
|
571
|
-
__decorate([ pk({
|
|
572
|
-
type: String
|
|
573
|
-
}), uuid(), __metadata("design:type", String) ], ProtectedResource.prototype, "id", void 0);
|
|
574
|
-
|
|
575
|
-
__decorate([ manyToOne(() => Tenant, REL_RESTRICT, false, undefined, "fk_protected_resources_tenant"), required(), __metadata("design:type", Object) ], ProtectedResource.prototype, "tenant", void 0);
|
|
576
|
-
|
|
577
|
-
__decorate([ manyToOne(() => OrgUnit, REL_RESTRICT, false, undefined, "fk_protected_resources_org_unit"), required(), __metadata("design:type", Object) ], ProtectedResource.prototype, "orgUnit", void 0);
|
|
578
|
-
|
|
579
|
-
__decorate([ required(), type(String), column(), __metadata("design:type", String) ], ProtectedResource.prototype, "resourceType", void 0);
|
|
580
|
-
|
|
581
|
-
__decorate([ required(), type(String), column(), __metadata("design:type", String) ], ProtectedResource.prototype, "resourceId", void 0);
|
|
582
|
-
|
|
583
|
-
__decorate([ required(), type(String), option(ResourceVisibilityOptions), column(), __metadata("design:type", String) ], ProtectedResource.prototype, "visibility", void 0);
|
|
584
|
-
|
|
585
|
-
__decorate([ manyToOne(() => Principal, REL_NULLIFY, false, undefined, "fk_protected_resources_owner"), __metadata("design:type", Object) ], ProtectedResource.prototype, "owner", void 0);
|
|
586
|
-
|
|
587
|
-
__decorate([ type(String), column(), __metadata("design:type", String) ], ProtectedResource.prototype, "sensitivity", void 0);
|
|
588
|
-
|
|
589
|
-
__decorate([ type(Object), column(), __metadata("design:type", Object) ], ProtectedResource.prototype, "metadata", void 0);
|
|
590
|
-
|
|
591
|
-
__decorate([ oneToMany(() => ResourceGrant, REL_RESTRICT, false), __metadata("design:type", Array) ], ProtectedResource.prototype, "grants", void 0);
|
|
592
|
-
|
|
593
|
-
__decorate([ createdAt(), __metadata("design:type", Date) ], ProtectedResource.prototype, "createdAt", void 0);
|
|
594
|
-
|
|
595
|
-
__decorate([ updatedAt(), __metadata("design:type", Date) ], ProtectedResource.prototype, "updatedAt", void 0);
|
|
596
|
-
|
|
597
|
-
ProtectedResource = __decorate([ table("protected_resources"), model(), __metadata("design:paramtypes", [ Object ]) ], ProtectedResource);
|
|
598
|
-
|
|
599
|
-
let InheritanceBlock = class InheritanceBlock extends AuthorizationModel {
|
|
600
|
-
constructor(data) {
|
|
601
|
-
super(data);
|
|
602
|
-
}
|
|
603
|
-
};
|
|
604
|
-
|
|
605
|
-
__decorate([ pk({
|
|
606
|
-
type: String
|
|
607
|
-
}), uuid(), __metadata("design:type", String) ], InheritanceBlock.prototype, "id", void 0);
|
|
608
|
-
|
|
609
|
-
__decorate([ manyToOne(() => Tenant, REL_CASCADE_DEPENDENT, false, undefined, "fk_inheritance_blocks_tenant"), required(), __metadata("design:type", Object) ], InheritanceBlock.prototype, "tenant", void 0);
|
|
610
|
-
|
|
611
|
-
__decorate([ manyToOne(() => OrgUnit, REL_CASCADE_DEPENDENT, false, undefined, "fk_inheritance_blocks_org_unit"), required(), __metadata("design:type", Object) ], InheritanceBlock.prototype, "orgUnit", void 0);
|
|
612
|
-
|
|
613
|
-
__decorate([ manyToOne(() => OrgUnit, REL_NULLIFY, false, undefined, "fk_inheritance_blocks_blocked_ancestor"), __metadata("design:type", Object) ], InheritanceBlock.prototype, "blockedFromAncestor", void 0);
|
|
614
|
-
|
|
615
|
-
__decorate([ required(), type(String), option(PermissionCategoryOptions), column(), __metadata("design:type", String) ], InheritanceBlock.prototype, "permissionCategory", void 0);
|
|
616
|
-
|
|
617
|
-
__decorate([ type(String), column(), __metadata("design:type", String) ], InheritanceBlock.prototype, "reason", void 0);
|
|
618
|
-
|
|
619
|
-
__decorate([ createdAt(), __metadata("design:type", Date) ], InheritanceBlock.prototype, "createdAt", void 0);
|
|
620
|
-
|
|
621
|
-
__decorate([ updatedAt(), __metadata("design:type", Date) ], InheritanceBlock.prototype, "updatedAt", void 0);
|
|
622
|
-
|
|
623
|
-
InheritanceBlock = __decorate([ table("inheritance_blocks"), model(), __metadata("design:paramtypes", [ Object ]) ], InheritanceBlock);
|
|
624
|
-
|
|
625
|
-
let OrgUnit = class OrgUnit extends AuthorizationModel {
|
|
626
|
-
constructor(data) {
|
|
627
|
-
super(data);
|
|
628
|
-
}
|
|
629
|
-
};
|
|
630
|
-
|
|
631
|
-
__decorate([ pk({
|
|
632
|
-
type: String
|
|
633
|
-
}), uuid(), __metadata("design:type", String) ], OrgUnit.prototype, "id", void 0);
|
|
634
|
-
|
|
635
|
-
__decorate([ manyToOne(() => Tenant, REL_RESTRICT, false, undefined, "fk_org_units_tenant"), required(), __metadata("design:type", Object) ], OrgUnit.prototype, "tenant", void 0);
|
|
636
|
-
|
|
637
|
-
__decorate([ manyToOne(() => OrgUnit, REL_RESTRICT, false, undefined, "fk_org_units_parent"), __metadata("design:type", Object) ], OrgUnit.prototype, "parent", void 0);
|
|
638
|
-
|
|
639
|
-
__decorate([ oneToMany(() => OrgUnit, REL_RESTRICT, false), __metadata("design:type", Array) ], OrgUnit.prototype, "children", void 0);
|
|
640
|
-
|
|
641
|
-
__decorate([ required(), type(String), column(), __metadata("design:type", String) ], OrgUnit.prototype, "name", void 0);
|
|
642
|
-
|
|
643
|
-
__decorate([ required(), type(String), column(), __metadata("design:type", String) ], OrgUnit.prototype, "path", void 0);
|
|
644
|
-
|
|
645
|
-
__decorate([ type(Object), column(), __metadata("design:type", Object) ], OrgUnit.prototype, "metadata", void 0);
|
|
646
|
-
|
|
647
|
-
__decorate([ oneToMany(() => OrgUnitMembership, REL_RESTRICT, false), __metadata("design:type", Array) ], OrgUnit.prototype, "memberships", void 0);
|
|
648
|
-
|
|
649
|
-
__decorate([ oneToMany(() => ProtectedResource, REL_RESTRICT, false), __metadata("design:type", Array) ], OrgUnit.prototype, "resources", void 0);
|
|
650
|
-
|
|
651
|
-
__decorate([ oneToMany(() => InheritanceBlock, REL_RESTRICT, false), __metadata("design:type", Array) ], OrgUnit.prototype, "inheritanceBlocks", void 0);
|
|
652
|
-
|
|
653
|
-
__decorate([ oneToMany(() => OrgUnitClosure, REL_RESTRICT, false), __metadata("design:type", Array) ], OrgUnit.prototype, "ancestorLinks", void 0);
|
|
654
|
-
|
|
655
|
-
__decorate([ oneToMany(() => OrgUnitClosure, REL_RESTRICT, false), __metadata("design:type", Array) ], OrgUnit.prototype, "descendantLinks", void 0);
|
|
656
|
-
|
|
657
|
-
__decorate([ createdAt(), __metadata("design:type", Date) ], OrgUnit.prototype, "createdAt", void 0);
|
|
658
|
-
|
|
659
|
-
__decorate([ updatedAt(), __metadata("design:type", Date) ], OrgUnit.prototype, "updatedAt", void 0);
|
|
660
|
-
|
|
661
|
-
OrgUnit = __decorate([ table("org_units"), model(), __metadata("design:paramtypes", [ Object ]) ], OrgUnit);
|
|
662
|
-
|
|
663
|
-
let StorageBinding = class StorageBinding extends AuthorizationModel {
|
|
664
|
-
constructor(data) {
|
|
665
|
-
super(data);
|
|
666
|
-
}
|
|
667
|
-
};
|
|
668
|
-
|
|
669
|
-
__decorate([ pk({
|
|
670
|
-
type: String
|
|
671
|
-
}), uuid(), __metadata("design:type", String) ], StorageBinding.prototype, "id", void 0);
|
|
672
|
-
|
|
673
|
-
__decorate([ manyToOne(() => Tenant, REL_CASCADE_DEPENDENT, false, undefined, "fk_storage_bindings_tenant"), required(), __metadata("design:type", Object) ], StorageBinding.prototype, "tenant", void 0);
|
|
674
|
-
|
|
675
|
-
__decorate([ required(), type(String), option(StorageKindOptions), column(), __metadata("design:type", String) ], StorageBinding.prototype, "storageKind", void 0);
|
|
676
|
-
|
|
677
|
-
__decorate([ required(), type(String), option(StorageBindingKindOptions), column(), __metadata("design:type", String) ], StorageBinding.prototype, "bindingKind", void 0);
|
|
678
|
-
|
|
679
|
-
__decorate([ required(), type(String), column(), __metadata("design:type", String) ], StorageBinding.prototype, "bindingKey", void 0);
|
|
680
|
-
|
|
681
|
-
__decorate([ required(), type(String), column(), __metadata("design:type", String) ], StorageBinding.prototype, "region", void 0);
|
|
682
|
-
|
|
683
|
-
__decorate([ type(Object), column(), __metadata("design:type", Object) ], StorageBinding.prototype, "config", void 0);
|
|
684
|
-
|
|
685
|
-
__decorate([ createdAt(), __metadata("design:type", Date) ], StorageBinding.prototype, "createdAt", void 0);
|
|
686
|
-
|
|
687
|
-
__decorate([ updatedAt(), __metadata("design:type", Date) ], StorageBinding.prototype, "updatedAt", void 0);
|
|
688
|
-
|
|
689
|
-
StorageBinding = __decorate([ table("storage_bindings"), model(), __metadata("design:paramtypes", [ Object ]) ], StorageBinding);
|
|
690
|
-
|
|
691
|
-
let Tenant = class Tenant extends AuthorizationModel {
|
|
692
|
-
constructor(data) {
|
|
693
|
-
super(data);
|
|
694
|
-
}
|
|
695
|
-
};
|
|
696
|
-
|
|
697
|
-
__decorate([ pk({
|
|
698
|
-
type: String
|
|
699
|
-
}), uuid(), __metadata("design:type", String) ], Tenant.prototype, "id", void 0);
|
|
700
|
-
|
|
701
|
-
__decorate([ unique(), required(), type(String), column(), __metadata("design:type", String) ], Tenant.prototype, "slug", void 0);
|
|
702
|
-
|
|
703
|
-
__decorate([ required(), type(String), column(), __metadata("design:type", String) ], Tenant.prototype, "name", void 0);
|
|
704
|
-
|
|
705
|
-
__decorate([ required(), type(String), option(IsolationTierOptions), column(), __metadata("design:type", String) ], Tenant.prototype, "isolationTier", void 0);
|
|
706
|
-
|
|
707
|
-
__decorate([ oneToMany(() => OrgUnit, REL_RESTRICT, false), __metadata("design:type", Array) ], Tenant.prototype, "orgUnits", void 0);
|
|
708
|
-
|
|
709
|
-
__decorate([ oneToMany(() => TenantMembership, REL_RESTRICT, false), __metadata("design:type", Array) ], Tenant.prototype, "memberships", void 0);
|
|
710
|
-
|
|
711
|
-
__decorate([ oneToMany(() => Principal, REL_RESTRICT, false), __metadata("design:type", Array) ], Tenant.prototype, "principals", void 0);
|
|
712
|
-
|
|
713
|
-
__decorate([ oneToMany(() => StorageBinding, REL_RESTRICT, false), __metadata("design:type", Array) ], Tenant.prototype, "storageBindings", void 0);
|
|
714
|
-
|
|
715
|
-
__decorate([ createdAt(), __metadata("design:type", Date) ], Tenant.prototype, "createdAt", void 0);
|
|
716
|
-
|
|
717
|
-
__decorate([ updatedAt(), __metadata("design:type", Date) ], Tenant.prototype, "updatedAt", void 0);
|
|
718
|
-
|
|
719
|
-
Tenant = __decorate([ table("tenants"), model(), __metadata("design:paramtypes", [ Object ]) ], Tenant);
|
|
720
|
-
|
|
721
|
-
let TenantProfile = class TenantProfile extends AuthorizationModel {
|
|
722
|
-
constructor(data) {
|
|
723
|
-
super(data);
|
|
724
|
-
}
|
|
725
|
-
};
|
|
726
|
-
|
|
727
|
-
__decorate([ pk({
|
|
728
|
-
type: String
|
|
729
|
-
}), uuid(), __metadata("design:type", String) ], TenantProfile.prototype, "id", void 0);
|
|
730
|
-
|
|
731
|
-
__decorate([ manyToOne(() => Tenant, REL_CASCADE_DEPENDENT, false, undefined, "fk_tenant_profiles_tenant"), required(), __metadata("design:type", Object) ], TenantProfile.prototype, "tenant", void 0);
|
|
732
|
-
|
|
733
|
-
__decorate([ required(), type(String), column(), __metadata("design:type", String) ], TenantProfile.prototype, "profileKey", void 0);
|
|
734
|
-
|
|
735
|
-
__decorate([ type(Object), column(), __metadata("design:type", Object) ], TenantProfile.prototype, "metadata", void 0);
|
|
736
|
-
|
|
737
|
-
__decorate([ createdAt(), __metadata("design:type", Date) ], TenantProfile.prototype, "createdAt", void 0);
|
|
738
|
-
|
|
739
|
-
__decorate([ updatedAt(), __metadata("design:type", Date) ], TenantProfile.prototype, "updatedAt", void 0);
|
|
740
|
-
|
|
741
|
-
TenantProfile = __decorate([ table("tenant_profiles"), model(), __metadata("design:paramtypes", [ Object ]) ], TenantProfile);
|
|
742
|
-
|
|
743
|
-
let OrgUnitProfile = class OrgUnitProfile extends AuthorizationModel {
|
|
744
|
-
constructor(data) {
|
|
745
|
-
super(data);
|
|
746
|
-
}
|
|
747
|
-
};
|
|
748
|
-
|
|
749
|
-
__decorate([ pk({
|
|
750
|
-
type: String
|
|
751
|
-
}), uuid(), __metadata("design:type", String) ], OrgUnitProfile.prototype, "id", void 0);
|
|
752
|
-
|
|
753
|
-
__decorate([ manyToOne(() => OrgUnit, REL_CASCADE_DEPENDENT, false, undefined, "fk_org_unit_profiles_org_unit"), required(), __metadata("design:type", Object) ], OrgUnitProfile.prototype, "orgUnit", void 0);
|
|
754
|
-
|
|
755
|
-
__decorate([ required(), type(String), column(), __metadata("design:type", String) ], OrgUnitProfile.prototype, "profileKey", void 0);
|
|
756
|
-
|
|
757
|
-
__decorate([ type(Object), column(), __metadata("design:type", Object) ], OrgUnitProfile.prototype, "metadata", void 0);
|
|
758
|
-
|
|
759
|
-
__decorate([ createdAt(), __metadata("design:type", Date) ], OrgUnitProfile.prototype, "createdAt", void 0);
|
|
760
|
-
|
|
761
|
-
__decorate([ updatedAt(), __metadata("design:type", Date) ], OrgUnitProfile.prototype, "updatedAt", void 0);
|
|
762
|
-
|
|
763
|
-
OrgUnitProfile = __decorate([ table("org_unit_profiles"), model(), __metadata("design:paramtypes", [ Object ]) ], OrgUnitProfile);
|
|
764
|
-
|
|
765
|
-
let GroupMembership = class GroupMembership extends AuthorizationModel {
|
|
766
|
-
constructor(data) {
|
|
767
|
-
super(data);
|
|
768
|
-
}
|
|
769
|
-
};
|
|
770
|
-
|
|
771
|
-
__decorate([ pk({
|
|
772
|
-
type: String
|
|
773
|
-
}), uuid(), __metadata("design:type", String) ], GroupMembership.prototype, "id", void 0);
|
|
774
|
-
|
|
775
|
-
__decorate([ manyToOne(() => Tenant, REL_CASCADE_DEPENDENT, false, undefined, "fk_group_memberships_tenant"), required(), __metadata("design:type", Object) ], GroupMembership.prototype, "tenant", void 0);
|
|
776
|
-
|
|
777
|
-
__decorate([ manyToOne(() => Group, REL_CASCADE_DEPENDENT, false, undefined, "fk_group_memberships_group"), required(), __metadata("design:type", Object) ], GroupMembership.prototype, "group", void 0);
|
|
778
|
-
|
|
779
|
-
__decorate([ manyToOne(() => Principal, REL_CASCADE_DEPENDENT, false, undefined, "fk_group_memberships_principal"), required(), __metadata("design:type", Object) ], GroupMembership.prototype, "principal", void 0);
|
|
780
|
-
|
|
781
|
-
__decorate([ type(Object), column(), __metadata("design:type", Object) ], GroupMembership.prototype, "metadata", void 0);
|
|
782
|
-
|
|
783
|
-
__decorate([ createdAt(), __metadata("design:type", Date) ], GroupMembership.prototype, "createdAt", void 0);
|
|
784
|
-
|
|
785
|
-
GroupMembership = __decorate([ table("group_memberships"), model(), __metadata("design:paramtypes", [ Object ]) ], GroupMembership);
|
|
786
|
-
|
|
787
|
-
let Group = class Group extends AuthorizationModel {
|
|
788
|
-
constructor(data) {
|
|
789
|
-
super(data);
|
|
790
|
-
}
|
|
791
|
-
};
|
|
792
|
-
|
|
793
|
-
__decorate([ pk({
|
|
794
|
-
type: String
|
|
795
|
-
}), uuid(), __metadata("design:type", String) ], Group.prototype, "id", void 0);
|
|
796
|
-
|
|
797
|
-
__decorate([ manyToOne(() => Tenant, REL_RESTRICT, false, undefined, "fk_groups_tenant"), required(), __metadata("design:type", Object) ], Group.prototype, "tenant", void 0);
|
|
798
|
-
|
|
799
|
-
__decorate([ manyToOne(() => OrgUnit, REL_NULLIFY, false, undefined, "fk_groups_org_unit"), __metadata("design:type", Object) ], Group.prototype, "orgUnit", void 0);
|
|
800
|
-
|
|
801
|
-
__decorate([ required(), type(String), column(), __metadata("design:type", String) ], Group.prototype, "name", void 0);
|
|
802
|
-
|
|
803
|
-
__decorate([ type(Object), column(), __metadata("design:type", Object) ], Group.prototype, "metadata", void 0);
|
|
804
|
-
|
|
805
|
-
__decorate([ oneToMany(() => GroupMembership, REL_RESTRICT, false), __metadata("design:type", Array) ], Group.prototype, "members", void 0);
|
|
806
|
-
|
|
807
|
-
__decorate([ createdAt(), __metadata("design:type", Date) ], Group.prototype, "createdAt", void 0);
|
|
808
|
-
|
|
809
|
-
__decorate([ updatedAt(), __metadata("design:type", Date) ], Group.prototype, "updatedAt", void 0);
|
|
810
|
-
|
|
811
|
-
Group = __decorate([ table("groups"), model(), __metadata("design:paramtypes", [ Object ]) ], Group);
|
|
812
|
-
|
|
813
|
-
let EffectivePermission = class EffectivePermission extends AuthorizationModel {
|
|
814
|
-
constructor(data) {
|
|
815
|
-
super(data);
|
|
816
|
-
}
|
|
817
|
-
};
|
|
818
|
-
|
|
819
|
-
__decorate([ pk({
|
|
820
|
-
type: String
|
|
821
|
-
}), uuid(), __metadata("design:type", String) ], EffectivePermission.prototype, "id", void 0);
|
|
822
|
-
|
|
823
|
-
__decorate([ manyToOne(() => Tenant, REL_CASCADE_DEPENDENT, false, undefined, "fk_effective_permissions_tenant"), required(), __metadata("design:type", Object) ], EffectivePermission.prototype, "tenant", void 0);
|
|
824
|
-
|
|
825
|
-
__decorate([ manyToOne(() => Principal, REL_CASCADE_DEPENDENT, false, undefined, "fk_effective_permissions_principal"), required(), __metadata("design:type", Object) ], EffectivePermission.prototype, "principal", void 0);
|
|
826
|
-
|
|
827
|
-
__decorate([ required(), type(String), column(), __metadata("design:type", String) ], EffectivePermission.prototype, "permissionKey", void 0);
|
|
828
|
-
|
|
829
|
-
__decorate([ required(), type(String), option(ScopeKindOptions), column(), __metadata("design:type", String) ], EffectivePermission.prototype, "scopeKind", void 0);
|
|
830
|
-
|
|
831
|
-
__decorate([ required(), type(String), column(), __metadata("design:type", String) ], EffectivePermission.prototype, "scopeId", void 0);
|
|
832
|
-
|
|
833
|
-
__decorate([ required(), type(String), column(), __metadata("design:type", String) ], EffectivePermission.prototype, "sourceKind", void 0);
|
|
834
|
-
|
|
835
|
-
__decorate([ required(), type(String), column(), __metadata("design:type", String) ], EffectivePermission.prototype, "sourceId", void 0);
|
|
836
|
-
|
|
837
|
-
__decorate([ column(), __metadata("design:type", Date) ], EffectivePermission.prototype, "startsAt", void 0);
|
|
838
|
-
|
|
839
|
-
__decorate([ column(), __metadata("design:type", Date) ], EffectivePermission.prototype, "expiresAt", void 0);
|
|
840
|
-
|
|
841
|
-
__decorate([ createdAt(), __metadata("design:type", Date) ], EffectivePermission.prototype, "createdAt", void 0);
|
|
842
|
-
|
|
843
|
-
EffectivePermission = __decorate([ table("effective_permissions"), model(), __metadata("design:paramtypes", [ Object ]) ], EffectivePermission);
|
|
844
|
-
|
|
845
|
-
class TenantProfileService extends BaseModelService {
|
|
846
|
-
constructor() {
|
|
847
|
-
super(TenantProfile);
|
|
848
|
-
}
|
|
849
|
-
async createProfile(tenantId, profileKey, metadata, ...args) {
|
|
850
|
-
return this.create({
|
|
851
|
-
tenant: tenantId,
|
|
852
|
-
profileKey: profileKey,
|
|
853
|
-
metadata: metadata
|
|
854
|
-
}, ...args);
|
|
855
|
-
}
|
|
856
|
-
async listForTenant(tenantId, ...args) {
|
|
857
|
-
return (await this.listAll(...args)).filter(profile => sameTenant(profile.tenant, tenantId));
|
|
858
|
-
}
|
|
859
|
-
async deleteForTenant(tenantId, ...args) {
|
|
860
|
-
for (const row of await this.listForTenant(tenantId, ...args)) {
|
|
861
|
-
await this.deleteById(row.id, ...args);
|
|
862
|
-
}
|
|
863
|
-
}
|
|
864
|
-
}
|
|
865
|
-
|
|
866
|
-
class OrgUnitProfileService extends BaseModelService {
|
|
867
|
-
constructor() {
|
|
868
|
-
super(OrgUnitProfile);
|
|
869
|
-
}
|
|
870
|
-
async createProfile(orgUnitId, profileKey, metadata, ...args) {
|
|
871
|
-
return this.create({
|
|
872
|
-
orgUnit: orgUnitId,
|
|
873
|
-
profileKey: profileKey,
|
|
874
|
-
metadata: metadata
|
|
875
|
-
}, ...args);
|
|
876
|
-
}
|
|
877
|
-
async listForOrgUnit(orgUnitId, ...args) {
|
|
878
|
-
return (await this.listAll(...args)).filter(profile => relationMatch(profile.orgUnit, orgUnitId));
|
|
879
|
-
}
|
|
880
|
-
}
|
|
881
|
-
|
|
882
|
-
class OrgUnitClosureService extends BaseModelService {
|
|
883
|
-
constructor() {
|
|
884
|
-
super(OrgUnitClosure);
|
|
885
|
-
}
|
|
886
|
-
async listAncestors(tenantId, orgUnitId, ...args) {
|
|
887
|
-
return (await this.listAll(...args)).filter(row => sameTenant(row.tenant, tenantId) && relationMatch(row.descendant, orgUnitId)).sort((left, right) => left.depth - right.depth);
|
|
888
|
-
}
|
|
889
|
-
async listDescendants(tenantId, orgUnitId, ...args) {
|
|
890
|
-
return (await this.listAll(...args)).filter(row => sameTenant(row.tenant, tenantId) && relationMatch(row.ancestor, orgUnitId)).sort((left, right) => left.depth - right.depth);
|
|
891
|
-
}
|
|
892
|
-
async isAncestorOf(tenantId, ancestorOrgUnitId, descendantOrgUnitId, ...args) {
|
|
893
|
-
return (await this.listAncestors(tenantId, descendantOrgUnitId, ...args)).some(row => relationMatch(row.ancestor, ancestorOrgUnitId));
|
|
894
|
-
}
|
|
895
|
-
async createSelfLink(tenantId, orgUnitId, ...args) {
|
|
896
|
-
return this.create({
|
|
897
|
-
tenant: tenantId,
|
|
898
|
-
ancestor: orgUnitId,
|
|
899
|
-
descendant: orgUnitId,
|
|
900
|
-
depth: 0
|
|
901
|
-
}, ...args);
|
|
902
|
-
}
|
|
903
|
-
async insertAncestorLinksForNewChild(tenantId, parentOrgUnitId, childOrgUnitId, ...args) {
|
|
904
|
-
const ancestorLinks = await this.listAncestors(tenantId, parentOrgUnitId, ...args);
|
|
905
|
-
for (const link of ancestorLinks) {
|
|
906
|
-
await this.create({
|
|
907
|
-
tenant: tenantId,
|
|
908
|
-
ancestor: link.ancestor,
|
|
909
|
-
descendant: childOrgUnitId,
|
|
910
|
-
depth: link.depth + 1
|
|
911
|
-
}, ...args);
|
|
912
|
-
}
|
|
913
|
-
}
|
|
914
|
-
async deleteLinksForSubtree(tenantId, orgUnitId, ...args) {
|
|
915
|
-
const subtree = await this.listDescendants(tenantId, orgUnitId, ...args);
|
|
916
|
-
const descendantIds = new Set([ orgUnitId, ...subtree.map(row => relationId(row.descendant)) ]);
|
|
917
|
-
const ancestorIds = new Set([ orgUnitId, ...subtree.map(row => relationId(row.ancestor)) ]);
|
|
918
|
-
const rows = (await this.listAll(...args)).filter(row => sameTenant(row.tenant, tenantId) && (descendantIds.has(relationId(row.descendant)) || ancestorIds.has(relationId(row.ancestor))));
|
|
919
|
-
for (const row of rows) {
|
|
920
|
-
await this.deleteById(row.id, ...args);
|
|
921
|
-
}
|
|
922
|
-
}
|
|
923
|
-
}
|
|
924
|
-
|
|
925
|
-
class InheritanceBlockService extends BaseModelService {
|
|
926
|
-
constructor() {
|
|
927
|
-
super(InheritanceBlock);
|
|
928
|
-
}
|
|
929
|
-
async blockCategory(tenantId, orgUnitId, permissionCategory, blockedFromAncestorId, reason, ...args) {
|
|
930
|
-
return this.create({
|
|
931
|
-
tenant: tenantId,
|
|
932
|
-
orgUnit: orgUnitId,
|
|
933
|
-
blockedFromAncestor: blockedFromAncestorId,
|
|
934
|
-
permissionCategory: permissionCategory,
|
|
935
|
-
reason: reason
|
|
936
|
-
}, ...args);
|
|
937
|
-
}
|
|
938
|
-
async unblockCategory(blockId, ...args) {
|
|
939
|
-
await this.deleteById(blockId, ...args);
|
|
940
|
-
}
|
|
941
|
-
async listForOrgUnit(tenantId, orgUnitId, ...args) {
|
|
942
|
-
return (await this.listAll(...args)).filter(block => sameTenant(block.tenant, tenantId) && relationMatch(block.orgUnit, orgUnitId));
|
|
943
|
-
}
|
|
944
|
-
async categoryBlockedForAncestor(tenantId, orgUnitId, ancestorOrgUnitId, category, ...args) {
|
|
945
|
-
return (await this.listForOrgUnit(tenantId, orgUnitId, ...args)).some(block => block.permissionCategory === category && (!block.blockedFromAncestor || relationMatch(block.blockedFromAncestor, ancestorOrgUnitId)));
|
|
946
|
-
}
|
|
947
|
-
}
|
|
948
|
-
|
|
949
|
-
class TenantService extends BaseModelService {
|
|
950
|
-
constructor() {
|
|
951
|
-
super(Tenant);
|
|
952
|
-
}
|
|
953
|
-
async createTenant(input, ...args) {
|
|
954
|
-
return this.create({
|
|
955
|
-
slug: input.slug,
|
|
956
|
-
name: input.name,
|
|
957
|
-
isolationTier: input.isolationTier ?? IsolationTier.Pooled
|
|
958
|
-
}, ...args);
|
|
959
|
-
}
|
|
960
|
-
async getBySlug(slug, ...args) {
|
|
961
|
-
return this.findOneBy("slug", slug, ...args);
|
|
962
|
-
}
|
|
963
|
-
async renameTenant(tenantId, name, ...args) {
|
|
964
|
-
return this.updateOne(tenantId, {
|
|
965
|
-
name: name
|
|
966
|
-
}, ...args);
|
|
967
|
-
}
|
|
968
|
-
async changeSlug(tenantId, slug, ...args) {
|
|
969
|
-
return this.updateOne(tenantId, {
|
|
970
|
-
slug: slug
|
|
971
|
-
}, ...args);
|
|
972
|
-
}
|
|
973
|
-
async setIsolationTier(tenantId, isolationTier, ...args) {
|
|
974
|
-
return this.updateOne(tenantId, {
|
|
975
|
-
isolationTier: isolationTier
|
|
976
|
-
}, ...args);
|
|
977
|
-
}
|
|
978
|
-
async deleteTenantControlled(tenantId, ...args) {
|
|
979
|
-
await this.deleteById(tenantId, ...args);
|
|
980
|
-
}
|
|
981
|
-
}
|
|
982
|
-
|
|
983
|
-
async function deleteRowsById$1(service, rows, ...args) {
|
|
984
|
-
for (const row of rows) {
|
|
985
|
-
await service.deleteById(row.id, ...args);
|
|
986
|
-
}
|
|
987
|
-
}
|
|
988
|
-
|
|
989
|
-
class OrgUnitService extends BaseModelService {
|
|
990
|
-
constructor() {
|
|
991
|
-
super(OrgUnit);
|
|
992
|
-
}
|
|
993
|
-
orgUnitPath(parentPath, name) {
|
|
994
|
-
const segment = lowerSlug(name);
|
|
995
|
-
return parentPath ? `${parentPath.replace(/\/+$/, "")}/${segment}` : `/${segment}`;
|
|
996
|
-
}
|
|
997
|
-
async createProfileIfNeeded(orgUnitId, profileKey, profileMetadata, ...args) {
|
|
998
|
-
if (!profileKey) return;
|
|
999
|
-
await (new OrgUnitProfileService).createProfile(orgUnitId, profileKey, profileMetadata, ...args);
|
|
1000
|
-
}
|
|
1001
|
-
async createRoot(tenantId, name, metadata, profileKey, profileMetadata, ...args) {
|
|
1002
|
-
const orgUnit = await this.create({
|
|
1003
|
-
tenant: tenantId,
|
|
1004
|
-
name: name,
|
|
1005
|
-
path: this.orgUnitPath(undefined, name),
|
|
1006
|
-
metadata: metadata
|
|
1007
|
-
}, ...args);
|
|
1008
|
-
await this.createProfileIfNeeded(orgUnit.id, profileKey, profileMetadata, ...args);
|
|
1009
|
-
await (new OrgUnitClosureService).createSelfLink(tenantId, orgUnit.id, ...args);
|
|
1010
|
-
return orgUnit;
|
|
1011
|
-
}
|
|
1012
|
-
async createChild(input, ...args) {
|
|
1013
|
-
const parent = input.parentOrgUnitId ? await this.getById(input.parentOrgUnitId, ...args) : undefined;
|
|
1014
|
-
const orgUnit = await this.create({
|
|
1015
|
-
tenant: input.tenantId,
|
|
1016
|
-
parent: parent?.id ?? input.parentOrgUnitId,
|
|
1017
|
-
name: input.name,
|
|
1018
|
-
path: this.orgUnitPath(parent?.path, input.name),
|
|
1019
|
-
metadata: input.metadata
|
|
1020
|
-
}, ...args);
|
|
1021
|
-
await this.createProfileIfNeeded(orgUnit.id, input.profileKey, input.profileMetadata, ...args);
|
|
1022
|
-
const closureService = new OrgUnitClosureService;
|
|
1023
|
-
await closureService.createSelfLink(input.tenantId, orgUnit.id, ...args);
|
|
1024
|
-
if (input.parentOrgUnitId) {
|
|
1025
|
-
await closureService.insertAncestorLinksForNewChild(input.tenantId, input.parentOrgUnitId, orgUnit.id, ...args);
|
|
1026
|
-
}
|
|
1027
|
-
return orgUnit;
|
|
1028
|
-
}
|
|
1029
|
-
async listChildren(parentOrgUnitId, ...args) {
|
|
1030
|
-
return (await this.listAll(...args)).filter(orgUnit => relationMatch(orgUnit.parent, parentOrgUnitId));
|
|
1031
|
-
}
|
|
1032
|
-
async listTenantOrgUnits(tenantId, ...args) {
|
|
1033
|
-
return (await this.listAll(...args)).filter(orgUnit => sameTenant(orgUnit.tenant, tenantId));
|
|
1034
|
-
}
|
|
1035
|
-
async listDescendantOrgUnits(tenantId, orgUnitId, includeSelf = false, ...args) {
|
|
1036
|
-
const descendants = await (new OrgUnitClosureService).listDescendants(tenantId, orgUnitId, ...args);
|
|
1037
|
-
const ids = new Set(descendants.map(row => relationId(row.descendant)));
|
|
1038
|
-
if (includeSelf) ids.add(orgUnitId);
|
|
1039
|
-
return (await this.listTenantOrgUnits(tenantId, ...args)).filter(orgUnit => ids.has(orgUnit.id));
|
|
1040
|
-
}
|
|
1041
|
-
async listAncestorOrgUnits(tenantId, orgUnitId, includeSelf = false, ...args) {
|
|
1042
|
-
const ancestors = await (new OrgUnitClosureService).listAncestors(tenantId, orgUnitId, ...args);
|
|
1043
|
-
const ids = new Set(ancestors.map(row => relationId(row.ancestor)));
|
|
1044
|
-
if (includeSelf) ids.add(orgUnitId);
|
|
1045
|
-
return (await this.listTenantOrgUnits(tenantId, ...args)).filter(orgUnit => ids.has(orgUnit.id));
|
|
1046
|
-
}
|
|
1047
|
-
async renameOrgUnit(orgUnitId, name, ...args) {
|
|
1048
|
-
const existing = await this.getById(orgUnitId, ...args);
|
|
1049
|
-
return this.updateOne(orgUnitId, {
|
|
1050
|
-
name: name,
|
|
1051
|
-
path: this.orgUnitPath(existing.path.includes("/") ? existing.path.replace(/\/[^/]+$/, "") : undefined, name)
|
|
1052
|
-
}, ...args);
|
|
1053
|
-
}
|
|
1054
|
-
async moveOrgUnit(tenantId, orgUnitId, newParentOrgUnitId, ...args) {
|
|
1055
|
-
const newParent = await this.getById(newParentOrgUnitId, ...args);
|
|
1056
|
-
const existing = await this.getById(orgUnitId, ...args);
|
|
1057
|
-
const updated = await this.updateOne(orgUnitId, {
|
|
1058
|
-
parent: newParent.id,
|
|
1059
|
-
path: this.orgUnitPath(newParent.path, existing.name)
|
|
1060
|
-
}, ...args);
|
|
1061
|
-
await this.rebuildTenantClosure(tenantId, ...args);
|
|
1062
|
-
return updated;
|
|
1063
|
-
}
|
|
1064
|
-
async rebuildTenantClosure(tenantId, ...args) {
|
|
1065
|
-
const closureService = new OrgUnitClosureService;
|
|
1066
|
-
const existingLinks = await closureService.listAll(...args);
|
|
1067
|
-
await deleteRowsById$1(closureService, existingLinks.filter(row => sameTenant(row.tenant, tenantId)), ...args);
|
|
1068
|
-
const orgUnits = (await this.listTenantOrgUnits(tenantId, ...args)).sort((left, right) => {
|
|
1069
|
-
const leftDepth = left.path.split("/").filter(Boolean).length;
|
|
1070
|
-
const rightDepth = right.path.split("/").filter(Boolean).length;
|
|
1071
|
-
return leftDepth - rightDepth;
|
|
1072
|
-
});
|
|
1073
|
-
for (const orgUnit of orgUnits) {
|
|
1074
|
-
await closureService.createSelfLink(tenantId, orgUnit.id, ...args);
|
|
1075
|
-
if (orgUnit.parent) {
|
|
1076
|
-
await closureService.insertAncestorLinksForNewChild(tenantId, relationId(orgUnit.parent), orgUnit.id, ...args);
|
|
1077
|
-
}
|
|
1078
|
-
}
|
|
1079
|
-
}
|
|
1080
|
-
async deleteOrgUnitTree(tenantId, orgUnitId, ...args) {
|
|
1081
|
-
const closureService = new OrgUnitClosureService;
|
|
1082
|
-
const descendants = await this.listDescendantOrgUnits(tenantId, orgUnitId, true, ...args);
|
|
1083
|
-
const descendantIds = new Set(descendants.map(orgUnit => orgUnit.id));
|
|
1084
|
-
const orgUnits = (await this.listTenantOrgUnits(tenantId, ...args)).filter(orgUnit => descendantIds.has(orgUnit.id));
|
|
1085
|
-
await deleteRowsById$1(this, orgUnits, ...args);
|
|
1086
|
-
await closureService.deleteLinksForSubtree(tenantId, orgUnitId, ...args);
|
|
1087
|
-
}
|
|
1088
|
-
}
|
|
1089
|
-
|
|
1090
|
-
__decorate([ transactional(), __metadata("design:type", Function), __metadata("design:paramtypes", [ String, String, Object, String, Object, Object ]), __metadata("design:returntype", Promise) ], OrgUnitService.prototype, "createRoot", null);
|
|
1091
|
-
|
|
1092
|
-
__decorate([ transactional(), __metadata("design:type", Function), __metadata("design:paramtypes", [ Object, Object ]), __metadata("design:returntype", Promise) ], OrgUnitService.prototype, "createChild", null);
|
|
1093
|
-
|
|
1094
|
-
__decorate([ transactional(), __metadata("design:type", Function), __metadata("design:paramtypes", [ String, String, String, Object ]), __metadata("design:returntype", Promise) ], OrgUnitService.prototype, "moveOrgUnit", null);
|
|
1095
|
-
|
|
1096
|
-
__decorate([ transactional(), __metadata("design:type", Function), __metadata("design:paramtypes", [ String, Object ]), __metadata("design:returntype", Promise) ], OrgUnitService.prototype, "rebuildTenantClosure", null);
|
|
1097
|
-
|
|
1098
|
-
__decorate([ transactional(), __metadata("design:type", Function), __metadata("design:paramtypes", [ String, String, Object ]), __metadata("design:returntype", Promise) ], OrgUnitService.prototype, "deleteOrgUnitTree", null);
|
|
1099
|
-
|
|
1100
|
-
class UserService extends BaseModelService {
|
|
1101
|
-
constructor() {
|
|
1102
|
-
super(User);
|
|
1103
|
-
}
|
|
1104
|
-
async createUser(input, ...args) {
|
|
1105
|
-
return this.create({
|
|
1106
|
-
email: input.email,
|
|
1107
|
-
phone: input.phone,
|
|
1108
|
-
displayName: input.displayName
|
|
1109
|
-
}, ...args);
|
|
1110
|
-
}
|
|
1111
|
-
async getByEmail(email, ...args) {
|
|
1112
|
-
return (await this.listAll(...args)).find(user => user.email === email);
|
|
1113
|
-
}
|
|
1114
|
-
async updateDisplayName(userId, displayName, ...args) {
|
|
1115
|
-
return this.updateOne(userId, {
|
|
1116
|
-
displayName: displayName
|
|
1117
|
-
}, ...args);
|
|
1118
|
-
}
|
|
1119
|
-
async updateEmail(userId, email, ...args) {
|
|
1120
|
-
return this.updateOne(userId, {
|
|
1121
|
-
email: email
|
|
1122
|
-
}, ...args);
|
|
1123
|
-
}
|
|
1124
|
-
async updatePhone(userId, phone, ...args) {
|
|
1125
|
-
return this.updateOne(userId, {
|
|
1126
|
-
phone: phone
|
|
1127
|
-
}, ...args);
|
|
1128
|
-
}
|
|
1129
|
-
}
|
|
1130
|
-
|
|
1131
|
-
class PrincipalService extends BaseModelService {
|
|
1132
|
-
constructor() {
|
|
1133
|
-
super(Principal);
|
|
1134
|
-
}
|
|
1135
|
-
async createPrincipal(tenantId, kind, subjectId, ...args) {
|
|
1136
|
-
return this.create({
|
|
1137
|
-
tenant: tenantId,
|
|
1138
|
-
kind: kind,
|
|
1139
|
-
subjectId: subjectId
|
|
1140
|
-
}, ...args);
|
|
1141
|
-
}
|
|
1142
|
-
async getForSubject(tenantId, kind, subjectId, ...args) {
|
|
1143
|
-
return (await this.listAll(...args)).find(principal => sameTenant(principal.tenant, tenantId) && principal.kind === kind && principal.subjectId === subjectId);
|
|
1144
|
-
}
|
|
1145
|
-
async getOrCreateForSubject(tenantId, kind, subjectId, ...args) {
|
|
1146
|
-
return await this.getForSubject(tenantId, kind, subjectId, ...args) ?? await this.createPrincipal(tenantId, kind, subjectId, ...args);
|
|
1147
|
-
}
|
|
1148
|
-
async getUserPrincipal(tenantId, userId, ...args) {
|
|
1149
|
-
return this.getOrCreateForSubject(tenantId, PrincipalKind.User, userId, ...args);
|
|
1150
|
-
}
|
|
1151
|
-
async getGroupPrincipal(tenantId, groupId, ...args) {
|
|
1152
|
-
return this.getOrCreateForSubject(tenantId, PrincipalKind.Group, groupId, ...args);
|
|
1153
|
-
}
|
|
1154
|
-
}
|
|
1155
|
-
|
|
1156
|
-
class TenantMembershipService extends BaseModelService {
|
|
1157
|
-
constructor() {
|
|
1158
|
-
super(TenantMembership);
|
|
1159
|
-
}
|
|
1160
|
-
async addUserToTenant(tenantId, userId, status = MembershipStatus.Active, ...args) {
|
|
1161
|
-
return this.create({
|
|
1162
|
-
tenant: tenantId,
|
|
1163
|
-
user: userId,
|
|
1164
|
-
status: status
|
|
1165
|
-
}, ...args);
|
|
1166
|
-
}
|
|
1167
|
-
async setStatus(membershipId, status, ...args) {
|
|
1168
|
-
return this.updateOne(membershipId, {
|
|
1169
|
-
status: status
|
|
1170
|
-
}, ...args);
|
|
1171
|
-
}
|
|
1172
|
-
async listUserTenants(userId, ...args) {
|
|
1173
|
-
return (await this.listAll(...args)).filter(membership => relationMatch(membership.user, userId));
|
|
1174
|
-
}
|
|
1175
|
-
async listTenantUsers(tenantId, ...args) {
|
|
1176
|
-
return (await this.listAll(...args)).filter(membership => sameTenant(membership.tenant, tenantId));
|
|
1177
|
-
}
|
|
1178
|
-
async removeUserFromTenant(membershipId, ...args) {
|
|
1179
|
-
await this.deleteById(membershipId, ...args);
|
|
1180
|
-
}
|
|
1181
|
-
}
|
|
1182
|
-
|
|
1183
|
-
class OrgUnitMembershipService extends BaseModelService {
|
|
1184
|
-
constructor() {
|
|
1185
|
-
super(OrgUnitMembership);
|
|
1186
|
-
}
|
|
1187
|
-
async addUserToOrgUnit(tenantId, orgUnitId, userId, status = MembershipStatus.Active, ...args) {
|
|
1188
|
-
return this.create({
|
|
1189
|
-
tenant: tenantId,
|
|
1190
|
-
orgUnit: orgUnitId,
|
|
1191
|
-
user: userId,
|
|
1192
|
-
status: status
|
|
1193
|
-
}, ...args);
|
|
1194
|
-
}
|
|
1195
|
-
async setStatus(membershipId, status, ...args) {
|
|
1196
|
-
return this.updateOne(membershipId, {
|
|
1197
|
-
status: status
|
|
1198
|
-
}, ...args);
|
|
1199
|
-
}
|
|
1200
|
-
async listUserOrgUnits(userId, ...args) {
|
|
1201
|
-
return (await this.listAll(...args)).filter(membership => relationMatch(membership.user, userId));
|
|
1202
|
-
}
|
|
1203
|
-
async listOrgUnitUsers(orgUnitId, ...args) {
|
|
1204
|
-
return (await this.listAll(...args)).filter(membership => relationMatch(membership.orgUnit, orgUnitId));
|
|
1205
|
-
}
|
|
1206
|
-
async removeUserFromOrgUnit(membershipId, ...args) {
|
|
1207
|
-
await this.deleteById(membershipId, ...args);
|
|
1208
|
-
}
|
|
1209
|
-
}
|
|
1210
|
-
|
|
1211
|
-
class GroupService extends BaseModelService {
|
|
1212
|
-
constructor() {
|
|
1213
|
-
super(Group);
|
|
1214
|
-
}
|
|
1215
|
-
async createGroup(tenantId, name, orgUnitId, metadata, ...args) {
|
|
1216
|
-
return this.create({
|
|
1217
|
-
tenant: tenantId,
|
|
1218
|
-
orgUnit: orgUnitId,
|
|
1219
|
-
name: name,
|
|
1220
|
-
metadata: metadata
|
|
1221
|
-
}, ...args);
|
|
1222
|
-
}
|
|
1223
|
-
async renameGroup(groupId, name, ...args) {
|
|
1224
|
-
return this.updateOne(groupId, {
|
|
1225
|
-
name: name
|
|
1226
|
-
}, ...args);
|
|
1227
|
-
}
|
|
1228
|
-
async moveGroupToOrgUnit(groupId, orgUnitId, ...args) {
|
|
1229
|
-
return this.updateOne(groupId, {
|
|
1230
|
-
orgUnit: orgUnitId
|
|
1231
|
-
}, ...args);
|
|
1232
|
-
}
|
|
1233
|
-
async listTenantGroups(tenantId, ...args) {
|
|
1234
|
-
return (await this.listAll(...args)).filter(group => sameTenant(group.tenant, tenantId));
|
|
1235
|
-
}
|
|
1236
|
-
}
|
|
1237
|
-
|
|
1238
|
-
class GroupMembershipService extends BaseModelService {
|
|
1239
|
-
constructor() {
|
|
1240
|
-
super(GroupMembership);
|
|
1241
|
-
}
|
|
1242
|
-
async addPrincipalToGroup(tenantId, groupId, principalId, metadata, ...args) {
|
|
1243
|
-
return this.create({
|
|
1244
|
-
tenant: tenantId,
|
|
1245
|
-
group: groupId,
|
|
1246
|
-
principal: principalId,
|
|
1247
|
-
metadata: metadata
|
|
1248
|
-
}, ...args);
|
|
1249
|
-
}
|
|
1250
|
-
async listGroupMembers(groupId, ...args) {
|
|
1251
|
-
return (await this.listAll(...args)).filter(membership => relationMatch(membership.group, groupId));
|
|
1252
|
-
}
|
|
1253
|
-
async listPrincipalGroups(principalId, ...args) {
|
|
1254
|
-
return (await this.listAll(...args)).filter(membership => relationMatch(membership.principal, principalId));
|
|
1255
|
-
}
|
|
1256
|
-
async removePrincipalFromGroup(membershipId, ...args) {
|
|
1257
|
-
await this.deleteById(membershipId, ...args);
|
|
1258
|
-
}
|
|
1259
|
-
async resolveGroupPrincipalIdsForPrincipal(principalId, ...args) {
|
|
1260
|
-
const principalService = new PrincipalService;
|
|
1261
|
-
const memberships = await this.listPrincipalGroups(principalId, ...args);
|
|
1262
|
-
const principals = await Promise.all(memberships.map(async membership => {
|
|
1263
|
-
const tenantId = relationId(membership.tenant);
|
|
1264
|
-
const groupId = relationId(membership.group);
|
|
1265
|
-
const principal = await principalService.getGroupPrincipal(tenantId, groupId, ...args);
|
|
1266
|
-
return principal.id;
|
|
1267
|
-
}));
|
|
1268
|
-
return principals;
|
|
1269
|
-
}
|
|
1270
|
-
}
|
|
1271
|
-
|
|
1272
|
-
class PermissionService extends BaseModelService {
|
|
1273
|
-
constructor() {
|
|
1274
|
-
super(Permission);
|
|
1275
|
-
}
|
|
1276
|
-
async createPermission(input, ...args) {
|
|
1277
|
-
return this.create({
|
|
1278
|
-
key: input.key,
|
|
1279
|
-
category: input.category,
|
|
1280
|
-
description: input.description
|
|
1281
|
-
}, ...args);
|
|
1282
|
-
}
|
|
1283
|
-
async getByKey(key, ...args) {
|
|
1284
|
-
return (await this.listAll(...args)).find(permission => permission.key === key);
|
|
1285
|
-
}
|
|
1286
|
-
async listByCategory(category, ...args) {
|
|
1287
|
-
return (await this.listAll(...args)).filter(permission => permission.category === category);
|
|
1288
|
-
}
|
|
1289
|
-
async updateDescription(permissionId, description, ...args) {
|
|
1290
|
-
return this.updateOne(permissionId, {
|
|
1291
|
-
description: description
|
|
1292
|
-
}, ...args);
|
|
1293
|
-
}
|
|
1294
|
-
}
|
|
1295
|
-
|
|
1296
|
-
class RoleService extends BaseModelService {
|
|
1297
|
-
constructor() {
|
|
1298
|
-
super(Role);
|
|
1299
|
-
}
|
|
1300
|
-
async createRole(input, ...args) {
|
|
1301
|
-
return this.create({
|
|
1302
|
-
tenant: input.tenantId,
|
|
1303
|
-
key: input.key,
|
|
1304
|
-
name: input.name,
|
|
1305
|
-
description: input.description,
|
|
1306
|
-
metadata: input.metadata
|
|
1307
|
-
}, ...args);
|
|
1308
|
-
}
|
|
1309
|
-
async getSystemRoleByKey(key, ...args) {
|
|
1310
|
-
const role = (await this.listAll(...args)).find(candidate => !candidate.tenant && candidate.key === key);
|
|
1311
|
-
if (!role) {
|
|
1312
|
-
throw new Error(`Role "${key}" not found`);
|
|
1313
|
-
}
|
|
1314
|
-
return role;
|
|
1315
|
-
}
|
|
1316
|
-
async getTenantRoleByKey(tenantId, key, ...args) {
|
|
1317
|
-
const role = (await this.listAll(...args)).find(candidate => sameTenant(candidate.tenant, tenantId) && candidate.key === key);
|
|
1318
|
-
if (!role) {
|
|
1319
|
-
throw new Error(`Role "${key}" not found for tenant ${tenantId}`);
|
|
1320
|
-
}
|
|
1321
|
-
return role;
|
|
1322
|
-
}
|
|
1323
|
-
async renameRole(roleId, name, ...args) {
|
|
1324
|
-
return this.updateOne(roleId, {
|
|
1325
|
-
name: name
|
|
1326
|
-
}, ...args);
|
|
1327
|
-
}
|
|
1328
|
-
async updateRoleMetadata(roleId, metadata, ...args) {
|
|
1329
|
-
return this.updateOne(roleId, {
|
|
1330
|
-
metadata: metadata
|
|
1331
|
-
}, ...args);
|
|
1332
|
-
}
|
|
1333
|
-
async listTenantRoles(tenantId, includeSystem = false, ...args) {
|
|
1334
|
-
return (await this.listAll(...args)).filter(role => includeSystem ? !role.tenant || sameTenant(role.tenant, tenantId) : sameTenant(role.tenant, tenantId));
|
|
1335
|
-
}
|
|
1336
|
-
}
|
|
1337
|
-
|
|
1338
|
-
async function deleteRowsById(service, rows, ...args) {
|
|
1339
|
-
for (const row of rows) {
|
|
1340
|
-
await service.deleteById(row.id, ...args);
|
|
1341
|
-
}
|
|
1342
|
-
}
|
|
1343
|
-
|
|
1344
|
-
class RolePermissionService extends BaseModelService {
|
|
1345
|
-
constructor() {
|
|
1346
|
-
super(RolePermission);
|
|
1347
|
-
}
|
|
1348
|
-
async addPermissionToRole(roleId, permissionId, ...args) {
|
|
1349
|
-
return this.create({
|
|
1350
|
-
role: roleId,
|
|
1351
|
-
permission: permissionId
|
|
1352
|
-
}, ...args);
|
|
1353
|
-
}
|
|
1354
|
-
async addPermissionKeyToRole(roleId, permissionKey, ...args) {
|
|
1355
|
-
const permission = await (new PermissionService).getByKey(permissionKey, ...args);
|
|
1356
|
-
return this.addPermissionToRole(roleId, permission.id, ...args);
|
|
1357
|
-
}
|
|
1358
|
-
async removePermissionFromRole(rolePermissionId, ...args) {
|
|
1359
|
-
await this.deleteById(rolePermissionId, ...args);
|
|
1360
|
-
}
|
|
1361
|
-
async listRolePermissions(roleId, ...args) {
|
|
1362
|
-
return (await this.listAll(...args)).filter(rolePermission => relationMatch(rolePermission.role, roleId));
|
|
1363
|
-
}
|
|
1364
|
-
async listPermissionRoles(permissionId, ...args) {
|
|
1365
|
-
return (await this.listAll(...args)).filter(rolePermission => relationMatch(rolePermission.permission, permissionId));
|
|
1366
|
-
}
|
|
1367
|
-
async replaceRolePermissions(roleId, permissionIds, ...args) {
|
|
1368
|
-
const existing = await this.listRolePermissions(roleId, ...args);
|
|
1369
|
-
await deleteRowsById(this, existing, ...args);
|
|
1370
|
-
return Promise.all(permissionIds.map(permissionId => this.addPermissionToRole(roleId, permissionId, ...args)));
|
|
1371
|
-
}
|
|
1372
|
-
async createRoleWithPermissions(input, permissionKeys, ...args) {
|
|
1373
|
-
const role = await (new RoleService).createRole(input, ...args);
|
|
1374
|
-
for (const permissionKey of permissionKeys) {
|
|
1375
|
-
await this.addPermissionKeyToRole(role.id, permissionKey, ...args);
|
|
1376
|
-
}
|
|
1377
|
-
return role;
|
|
1378
|
-
}
|
|
1379
|
-
}
|
|
1380
|
-
|
|
1381
|
-
class RoleAssignmentService extends BaseModelService {
|
|
1382
|
-
constructor() {
|
|
1383
|
-
super(RoleAssignment);
|
|
1384
|
-
}
|
|
1385
|
-
async assignRole(input, ...args) {
|
|
1386
|
-
return this.create({
|
|
1387
|
-
tenant: input.tenantId,
|
|
1388
|
-
principal: input.principalId,
|
|
1389
|
-
role: input.roleId,
|
|
1390
|
-
scopeKind: input.scopeKind,
|
|
1391
|
-
scopeId: input.scopeId,
|
|
1392
|
-
inheritDown: input.inheritDown ?? false,
|
|
1393
|
-
startsAt: input.startsAt,
|
|
1394
|
-
expiresAt: input.expiresAt,
|
|
1395
|
-
conditions: input.conditions
|
|
1396
|
-
}, ...args);
|
|
1397
|
-
}
|
|
1398
|
-
async revokeAssignment(assignmentId, ...args) {
|
|
1399
|
-
await this.deleteById(assignmentId, ...args);
|
|
1400
|
-
}
|
|
1401
|
-
async listPrincipalAssignments(tenantId, principalId, ...args) {
|
|
1402
|
-
return (await this.listAll(...args)).filter(assignment => sameTenant(assignment.tenant, tenantId) && relationMatch(assignment.principal, principalId));
|
|
1403
|
-
}
|
|
1404
|
-
async listRoleAssignments(roleId, ...args) {
|
|
1405
|
-
return (await this.listAll(...args)).filter(assignment => relationMatch(assignment.role, roleId));
|
|
1406
|
-
}
|
|
1407
|
-
async listTenantAssignments(tenantId, ...args) {
|
|
1408
|
-
return (await this.listAll(...args)).filter(assignment => sameTenant(assignment.tenant, tenantId));
|
|
1409
|
-
}
|
|
1410
|
-
async updateAssignmentWindow(assignmentId, startsAt, expiresAt, ...args) {
|
|
1411
|
-
return this.updateOne(assignmentId, {
|
|
1412
|
-
startsAt: startsAt,
|
|
1413
|
-
expiresAt: expiresAt
|
|
1414
|
-
}, ...args);
|
|
1415
|
-
}
|
|
1416
|
-
}
|
|
1417
|
-
|
|
1418
|
-
class EffectivePermissionService extends BaseModelService {
|
|
1419
|
-
constructor() {
|
|
1420
|
-
super(EffectivePermission);
|
|
1421
|
-
}
|
|
1422
|
-
async listForPrincipal(tenantId, principalId, ...args) {
|
|
1423
|
-
return (await this.listAll(...args)).filter(permission => sameTenant(permission.tenant, tenantId) && relationMatch(permission.principal, principalId));
|
|
1424
|
-
}
|
|
1425
|
-
async listForScope(tenantId, scopeKind, scopeId, ...args) {
|
|
1426
|
-
return (await this.listAll(...args)).filter(permission => sameTenant(permission.tenant, tenantId) && permission.scopeKind === scopeKind && permission.scopeId === scopeId);
|
|
1427
|
-
}
|
|
1428
|
-
async hasPermission(tenantId, principalId, permissionKey, scopeKind, scopeId, at, ...args) {
|
|
1429
|
-
return (await this.listForPrincipal(tenantId, principalId, ...args)).some(permission => permission.permissionKey === permissionKey && permission.scopeKind === scopeKind && permission.scopeId === scopeId && (!permission.startsAt || !at || permission.startsAt <= at) && (!permission.expiresAt || !at || permission.expiresAt >= at));
|
|
1430
|
-
}
|
|
1431
|
-
async deleteForPrincipal(tenantId, principalId, ...args) {
|
|
1432
|
-
for (const row of await this.listForPrincipal(tenantId, principalId, ...args)) {
|
|
1433
|
-
await this.deleteById(row.id, ...args);
|
|
1434
|
-
}
|
|
1435
|
-
}
|
|
1436
|
-
async deleteForTenant(tenantId, ...args) {
|
|
1437
|
-
for (const row of (await this.listAll(...args)).filter(permission => sameTenant(permission.tenant, tenantId))) {
|
|
1438
|
-
await this.deleteById(row.id, ...args);
|
|
1439
|
-
}
|
|
1440
|
-
}
|
|
1441
|
-
async rebuildForPrincipal(tenantId, principalId, ...args) {
|
|
1442
|
-
await this.deleteForPrincipal(tenantId, principalId, ...args);
|
|
1443
|
-
const roleAssignmentService = new RoleAssignmentService;
|
|
1444
|
-
const rolePermissionService = new RolePermissionService;
|
|
1445
|
-
const permissionService = new PermissionService;
|
|
1446
|
-
const groupMembershipService = new GroupMembershipService;
|
|
1447
|
-
const principalService = new PrincipalService;
|
|
1448
|
-
const orgUnitClosureService = new OrgUnitClosureService;
|
|
1449
|
-
const inheritanceBlockService = new InheritanceBlockService;
|
|
1450
|
-
const materialized = [];
|
|
1451
|
-
const sourceAssignments = await roleAssignmentService.listPrincipalAssignments(tenantId, principalId, ...args);
|
|
1452
|
-
const groupMemberships = await groupMembershipService.listPrincipalGroups(principalId, ...args);
|
|
1453
|
-
const groupAssignments = (await Promise.all(groupMemberships.map(async membership => {
|
|
1454
|
-
const groupPrincipal = await principalService.getGroupPrincipal(relationId(membership.tenant), relationId(membership.group), ...args);
|
|
1455
|
-
return roleAssignmentService.listPrincipalAssignments(tenantId, groupPrincipal.id, ...args);
|
|
1456
|
-
}))).flat();
|
|
1457
|
-
const assignments = [ ...sourceAssignments, ...groupAssignments ];
|
|
1458
|
-
for (const assignment of assignments) {
|
|
1459
|
-
const rolePermissions = await rolePermissionService.listRolePermissions(relationId(assignment.role), ...args);
|
|
1460
|
-
const permissions = await Promise.all(rolePermissions.map(async rolePermission => permissionService.findOneBy("id", relationId(rolePermission.permission), ...args)));
|
|
1461
|
-
for (const permission of permissions) {
|
|
1462
|
-
if (!permission) continue;
|
|
1463
|
-
const scopeKind = assignment.scopeKind;
|
|
1464
|
-
const scopeId = assignment.scopeId;
|
|
1465
|
-
const scopes = [];
|
|
1466
|
-
if (scopeKind === ScopeKind.Tenant) {
|
|
1467
|
-
scopes.push({
|
|
1468
|
-
scopeKind: scopeKind,
|
|
1469
|
-
scopeId: tenantId
|
|
1470
|
-
});
|
|
1471
|
-
} else if (scopeKind === ScopeKind.Resource) {
|
|
1472
|
-
scopes.push({
|
|
1473
|
-
scopeKind: scopeKind,
|
|
1474
|
-
scopeId: scopeId
|
|
1475
|
-
});
|
|
1476
|
-
} else if (scopeKind === ScopeKind.OrgUnit && !assignment.inheritDown) {
|
|
1477
|
-
scopes.push({
|
|
1478
|
-
scopeKind: scopeKind,
|
|
1479
|
-
scopeId: scopeId
|
|
1480
|
-
});
|
|
1481
|
-
} else if (scopeKind === ScopeKind.OrgUnit && assignment.inheritDown) {
|
|
1482
|
-
const descendants = await orgUnitClosureService.listDescendants(tenantId, scopeId, ...args);
|
|
1483
|
-
scopes.push(...descendants.map(row => ({
|
|
1484
|
-
scopeKind: scopeKind,
|
|
1485
|
-
scopeId: relationId(row.descendant)
|
|
1486
|
-
})));
|
|
1487
|
-
}
|
|
1488
|
-
for (const scoped of scopes) {
|
|
1489
|
-
if (scopeKind === ScopeKind.OrgUnit && assignment.inheritDown && scoped.scopeId !== scopeId && await inheritanceBlockService.categoryBlockedForAncestor(tenantId, scoped.scopeId, scopeId, permission.category, ...args)) {
|
|
1490
|
-
continue;
|
|
1491
|
-
}
|
|
1492
|
-
materialized.push({
|
|
1493
|
-
id: "",
|
|
1494
|
-
tenantId: tenantId,
|
|
1495
|
-
principalId: principalId,
|
|
1496
|
-
permissionKey: permission.key,
|
|
1497
|
-
scopeKind: scoped.scopeKind,
|
|
1498
|
-
scopeId: scoped.scopeId,
|
|
1499
|
-
sourceKind: "role_assignment",
|
|
1500
|
-
sourceId: assignment.id,
|
|
1501
|
-
startsAt: assignment.startsAt,
|
|
1502
|
-
expiresAt: assignment.expiresAt
|
|
1503
|
-
});
|
|
1504
|
-
}
|
|
1505
|
-
}
|
|
1506
|
-
}
|
|
1507
|
-
const created = await Promise.all(materialized.map(permission => this.create({
|
|
1508
|
-
tenant: permission.tenantId,
|
|
1509
|
-
principal: permission.principalId,
|
|
1510
|
-
permissionKey: permission.permissionKey,
|
|
1511
|
-
scopeKind: permission.scopeKind,
|
|
1512
|
-
scopeId: permission.scopeId,
|
|
1513
|
-
sourceKind: permission.sourceKind,
|
|
1514
|
-
sourceId: permission.sourceId,
|
|
1515
|
-
startsAt: permission.startsAt,
|
|
1516
|
-
expiresAt: permission.expiresAt
|
|
1517
|
-
}, ...args)));
|
|
1518
|
-
return created;
|
|
1519
|
-
}
|
|
1520
|
-
async rebuildForTenant(tenantId, ...args) {
|
|
1521
|
-
const principals = (await (new PrincipalService).listAll(...args)).filter(principal => sameTenant(principal.tenant, tenantId));
|
|
1522
|
-
for (const principal of principals) {
|
|
1523
|
-
await this.rebuildForPrincipal(tenantId, principal.id, ...args);
|
|
1524
|
-
}
|
|
1525
|
-
}
|
|
1526
|
-
}
|
|
1527
|
-
|
|
1528
|
-
__decorate([ transactional(), __metadata("design:type", Function), __metadata("design:paramtypes", [ String, String, Object ]), __metadata("design:returntype", Promise) ], EffectivePermissionService.prototype, "rebuildForPrincipal", null);
|
|
1529
|
-
|
|
1530
|
-
__decorate([ transactional(), __metadata("design:type", Function), __metadata("design:paramtypes", [ String, Object ]), __metadata("design:returntype", Promise) ], EffectivePermissionService.prototype, "rebuildForTenant", null);
|
|
1531
|
-
|
|
1532
|
-
class ProtectedResourceService extends BaseModelService {
|
|
1533
|
-
constructor() {
|
|
1534
|
-
super(ProtectedResource);
|
|
1535
|
-
}
|
|
1536
|
-
async registerResource(input, ...args) {
|
|
1537
|
-
return this.create({
|
|
1538
|
-
tenant: input.tenantId,
|
|
1539
|
-
orgUnit: input.orgUnitId,
|
|
1540
|
-
resourceType: input.resourceType,
|
|
1541
|
-
resourceId: input.resourceId,
|
|
1542
|
-
visibility: input.visibility,
|
|
1543
|
-
owner: input.ownerPrincipalId,
|
|
1544
|
-
sensitivity: input.sensitivity,
|
|
1545
|
-
metadata: input.metadata
|
|
1546
|
-
}, ...args);
|
|
1547
|
-
}
|
|
1548
|
-
async getByDomainResource(tenantId, resourceType, resourceId, ...args) {
|
|
1549
|
-
return (await this.listAll(...args)).find(resource => sameTenant(resource.tenant, tenantId) && resource.resourceType === resourceType && resource.resourceId === resourceId);
|
|
1550
|
-
}
|
|
1551
|
-
async moveResourceToOrgUnit(protectedResourceId, orgUnitId, ...args) {
|
|
1552
|
-
return this.updateOne(protectedResourceId, {
|
|
1553
|
-
orgUnit: orgUnitId
|
|
1554
|
-
}, ...args);
|
|
1555
|
-
}
|
|
1556
|
-
async setVisibility(protectedResourceId, visibility, ...args) {
|
|
1557
|
-
return this.updateOne(protectedResourceId, {
|
|
1558
|
-
visibility: visibility
|
|
1559
|
-
}, ...args);
|
|
1560
|
-
}
|
|
1561
|
-
async transferOwnership(protectedResourceId, ownerPrincipalId, ...args) {
|
|
1562
|
-
return this.updateOne(protectedResourceId, {
|
|
1563
|
-
owner: ownerPrincipalId
|
|
1564
|
-
}, ...args);
|
|
1565
|
-
}
|
|
1566
|
-
async listOrgUnitResources(orgUnitId, ...args) {
|
|
1567
|
-
return (await this.listAll(...args)).filter(resource => relationMatch(resource.orgUnit, orgUnitId));
|
|
1568
|
-
}
|
|
1569
|
-
async listTenantResources(tenantId, ...args) {
|
|
1570
|
-
return (await this.listAll(...args)).filter(resource => sameTenant(resource.tenant, tenantId));
|
|
1571
|
-
}
|
|
1572
|
-
}
|
|
1573
|
-
|
|
1574
|
-
class ResourceGrantService extends BaseModelService {
|
|
1575
|
-
constructor() {
|
|
1576
|
-
super(ResourceGrant);
|
|
1577
|
-
}
|
|
1578
|
-
async grantResource(input, ...args) {
|
|
1579
|
-
return this.create({
|
|
1580
|
-
tenant: input.tenantId,
|
|
1581
|
-
resource: input.resourceId,
|
|
1582
|
-
principal: input.principalId,
|
|
1583
|
-
permissionKey: input.permissionKey,
|
|
1584
|
-
startsAt: input.startsAt,
|
|
1585
|
-
expiresAt: input.expiresAt,
|
|
1586
|
-
conditions: input.conditions,
|
|
1587
|
-
createdBy: input.createdByPrincipalId
|
|
1588
|
-
}, ...args);
|
|
1589
|
-
}
|
|
1590
|
-
async revokeGrant(grantId, ...args) {
|
|
1591
|
-
await this.deleteById(grantId, ...args);
|
|
1592
|
-
}
|
|
1593
|
-
async listResourceGrants(protectedResourceId, ...args) {
|
|
1594
|
-
return (await this.listAll(...args)).filter(grant => relationMatch(grant.resource, protectedResourceId));
|
|
1595
|
-
}
|
|
1596
|
-
async listPrincipalGrants(tenantId, principalId, ...args) {
|
|
1597
|
-
return (await this.listAll(...args)).filter(grant => sameTenant(grant.tenant, tenantId) && relationMatch(grant.principal, principalId));
|
|
1598
|
-
}
|
|
1599
|
-
async hasGrant(tenantId, principalId, protectedResourceId, permissionKey, at, ...args) {
|
|
1600
|
-
return (await this.listPrincipalGrants(tenantId, principalId, ...args)).some(grant => relationMatch(grant.resource, protectedResourceId) && grant.permissionKey === permissionKey && (!grant.startsAt || !at || grant.startsAt <= at) && (!grant.expiresAt || !at || grant.expiresAt >= at));
|
|
1601
|
-
}
|
|
1602
|
-
async deleteAllForResource(protectedResourceId, ...args) {
|
|
1603
|
-
for (const row of await this.listResourceGrants(protectedResourceId, ...args)) {
|
|
1604
|
-
await this.deleteById(row.id, ...args);
|
|
1605
|
-
}
|
|
1606
|
-
}
|
|
1607
|
-
}
|
|
1608
|
-
|
|
1609
|
-
class ResourceLifecycleService {
|
|
1610
|
-
async unregisterResource(protectedResourceId, ...args) {
|
|
1611
|
-
await (new ResourceGrantService).deleteAllForResource(protectedResourceId, ...args);
|
|
1612
|
-
await (new ProtectedResourceService).deleteById(protectedResourceId, ...args);
|
|
1613
|
-
}
|
|
1614
|
-
async resolveResourceScope(protectedResourceId, ...args) {
|
|
1615
|
-
const resource = await (new ProtectedResourceService).getById(protectedResourceId, ...args);
|
|
1616
|
-
return {
|
|
1617
|
-
tenantId: relationId(resource.tenant),
|
|
1618
|
-
orgUnitId: relationId(resource.orgUnit),
|
|
1619
|
-
visibility: resource.visibility,
|
|
1620
|
-
ownerPrincipalId: resource.owner ? relationId(resource.owner) : undefined
|
|
1621
|
-
};
|
|
1622
|
-
}
|
|
1623
|
-
}
|
|
1624
|
-
|
|
1625
|
-
class StorageBindingService extends BaseModelService {
|
|
1626
|
-
constructor() {
|
|
1627
|
-
super(StorageBinding);
|
|
1628
|
-
}
|
|
1629
|
-
async createBinding(input, ...args) {
|
|
1630
|
-
return this.create({
|
|
1631
|
-
tenant: input.tenantId,
|
|
1632
|
-
storageKind: input.storageKind,
|
|
1633
|
-
bindingKind: input.bindingKind,
|
|
1634
|
-
bindingKey: input.bindingKey,
|
|
1635
|
-
region: input.region,
|
|
1636
|
-
config: input.config
|
|
1637
|
-
}, ...args);
|
|
1638
|
-
}
|
|
1639
|
-
async listTenantBindings(tenantId, ...args) {
|
|
1640
|
-
return (await this.listAll(...args)).filter(binding => relationId(binding.tenant) === tenantId);
|
|
1641
|
-
}
|
|
1642
|
-
async getBinding(tenantId, storageKind, ...args) {
|
|
1643
|
-
return (await this.listTenantBindings(tenantId, ...args)).find(binding => binding.storageKind === storageKind);
|
|
1644
|
-
}
|
|
1645
|
-
async setBindingConfig(bindingId, config, ...args) {
|
|
1646
|
-
return this.updateOne(bindingId, {
|
|
1647
|
-
config: config
|
|
1648
|
-
}, ...args);
|
|
1649
|
-
}
|
|
1650
|
-
async promoteToDedicated(bindingId, bindingKey, region, config, ...args) {
|
|
1651
|
-
return this.updateOne(bindingId, {
|
|
1652
|
-
bindingKind: StorageBindingKind.Dedicated,
|
|
1653
|
-
bindingKey: bindingKey,
|
|
1654
|
-
region: region,
|
|
1655
|
-
config: config
|
|
1656
|
-
}, ...args);
|
|
1657
|
-
}
|
|
1658
|
-
async setShared(bindingId, bindingKey, region, config, ...args) {
|
|
1659
|
-
return this.updateOne(bindingId, {
|
|
1660
|
-
bindingKind: StorageBindingKind.Shared,
|
|
1661
|
-
bindingKey: bindingKey,
|
|
1662
|
-
region: region,
|
|
1663
|
-
config: config
|
|
1664
|
-
}, ...args);
|
|
1665
|
-
}
|
|
1666
|
-
}
|
|
1667
|
-
|
|
1668
|
-
class BootstrapService {
|
|
1669
|
-
constructor() {
|
|
1670
|
-
this.tenantService = new TenantService;
|
|
1671
|
-
this.tenantProfileService = new TenantProfileService;
|
|
1672
|
-
this.orgUnitService = new OrgUnitService;
|
|
1673
|
-
this.orgUnitProfileService = new OrgUnitProfileService;
|
|
1674
|
-
this.userService = new UserService;
|
|
1675
|
-
this.membershipService = new TenantMembershipService;
|
|
1676
|
-
this.principalService = new PrincipalService;
|
|
1677
|
-
this.permissionService = new PermissionService;
|
|
1678
|
-
this.roleService = new RoleService;
|
|
1679
|
-
this.rolePermissionService = new RolePermissionService;
|
|
1680
|
-
this.roleAssignmentService = new RoleAssignmentService;
|
|
1681
|
-
this.effectivePermissionService = new EffectivePermissionService;
|
|
1682
|
-
}
|
|
1683
|
-
async bootstrapTenantFromTemplate(template, ...args) {
|
|
1684
|
-
const tenant = await this.tenantService.createTenant(template.tenant, ...args);
|
|
1685
|
-
if (template.tenant.profileKey) {
|
|
1686
|
-
await this.tenantProfileService.createProfile(tenant.id, template.tenant.profileKey, template.tenant.profileMetadata, ...args);
|
|
1687
|
-
}
|
|
1688
|
-
const createOrgTree = async (parentId, orgUnit) => {
|
|
1689
|
-
const created = parentId === undefined ? await this.orgUnitService.createRoot(tenant.id, orgUnit.name, orgUnit.metadata, orgUnit.profileKey, orgUnit.metadata, ...args) : await this.orgUnitService.createChild({
|
|
1690
|
-
tenantId: tenant.id,
|
|
1691
|
-
parentOrgUnitId: parentId,
|
|
1692
|
-
name: orgUnit.name,
|
|
1693
|
-
metadata: orgUnit.metadata,
|
|
1694
|
-
profileKey: orgUnit.profileKey,
|
|
1695
|
-
profileMetadata: orgUnit.metadata
|
|
1696
|
-
}, ...args);
|
|
1697
|
-
for (const child of orgUnit.children ?? []) {
|
|
1698
|
-
await createOrgTree(created.id, child);
|
|
1699
|
-
}
|
|
1700
|
-
return created;
|
|
1701
|
-
};
|
|
1702
|
-
const rootOrgUnit = await createOrgTree(undefined, template.rootOrgUnit);
|
|
1703
|
-
const owner = await this.userService.createUser(template.ownerUser, ...args);
|
|
1704
|
-
await this.membershipService.addUserToTenant(tenant.id, owner.id, MembershipStatus.Active, ...args);
|
|
1705
|
-
const ownerPrincipal = await this.principalService.getUserPrincipal(tenant.id, owner.id, ...args);
|
|
1706
|
-
for (const permission of template.permissions) {
|
|
1707
|
-
await this.permissionService.createPermission(permission, ...args);
|
|
1708
|
-
}
|
|
1709
|
-
for (const role of template.roles) {
|
|
1710
|
-
const createdRole = await this.roleService.createRole({
|
|
1711
|
-
tenantId: tenant.id,
|
|
1712
|
-
key: role.key,
|
|
1713
|
-
name: role.name,
|
|
1714
|
-
description: role.description
|
|
1715
|
-
}, ...args);
|
|
1716
|
-
for (const permissionKey of role.permissionKeys) {
|
|
1717
|
-
await this.rolePermissionService.addPermissionKeyToRole(createdRole.id, permissionKey, ...args);
|
|
1718
|
-
}
|
|
1719
|
-
}
|
|
1720
|
-
const ownerRole = await this.roleService.getTenantRoleByKey(tenant.id, template.ownerRoleKey, ...args);
|
|
1721
|
-
await this.roleAssignmentService.assignRole({
|
|
1722
|
-
tenantId: tenant.id,
|
|
1723
|
-
principalId: ownerPrincipal.id,
|
|
1724
|
-
roleId: ownerRole.id,
|
|
1725
|
-
scopeKind: ScopeKind.OrgUnit,
|
|
1726
|
-
scopeId: rootOrgUnit.id,
|
|
1727
|
-
inheritDown: true
|
|
1728
|
-
}, ...args);
|
|
1729
|
-
await this.effectivePermissionService.rebuildForPrincipal(tenant.id, ownerPrincipal.id, ...args);
|
|
1730
|
-
return {
|
|
1731
|
-
tenantId: tenant.id,
|
|
1732
|
-
rootOrgUnitId: rootOrgUnit.id,
|
|
1733
|
-
ownerUserId: owner.id,
|
|
1734
|
-
ownerPrincipalId: ownerPrincipal.id
|
|
1735
|
-
};
|
|
1736
|
-
}
|
|
1737
|
-
}
|
|
1738
|
-
|
|
1739
|
-
__decorate([ transactional(), __metadata("design:type", Function), __metadata("design:paramtypes", [ Object, Object ]), __metadata("design:returntype", Promise) ], BootstrapService.prototype, "bootstrapTenantFromTemplate", null);
|
|
1740
|
-
|
|
1741
|
-
class SystemManagementService {
|
|
1742
|
-
constructor() {
|
|
1743
|
-
this.membershipService = new TenantMembershipService;
|
|
1744
|
-
this.orgMembershipService = new OrgUnitMembershipService;
|
|
1745
|
-
this.principalService = new PrincipalService;
|
|
1746
|
-
this.roleService = new RoleService;
|
|
1747
|
-
this.roleAssignmentService = new RoleAssignmentService;
|
|
1748
|
-
this.effectivePermissionService = new EffectivePermissionService;
|
|
1749
|
-
}
|
|
1750
|
-
async onboardUserToTenantAndOrgUnit(tenantId, userId, orgUnitId, roleKey, ...args) {
|
|
1751
|
-
await this.membershipService.addUserToTenant(tenantId, userId, MembershipStatus.Active, ...args);
|
|
1752
|
-
await this.orgMembershipService.addUserToOrgUnit(tenantId, orgUnitId, userId, MembershipStatus.Active, ...args);
|
|
1753
|
-
const principal = await this.principalService.getUserPrincipal(tenantId, userId, ...args);
|
|
1754
|
-
const role = await this.roleService.getTenantRoleByKey(tenantId, roleKey, ...args);
|
|
1755
|
-
await this.roleAssignmentService.assignRole({
|
|
1756
|
-
tenantId: tenantId,
|
|
1757
|
-
principalId: principal.id,
|
|
1758
|
-
roleId: role.id,
|
|
1759
|
-
scopeKind: ScopeKind.OrgUnit,
|
|
1760
|
-
scopeId: orgUnitId,
|
|
1761
|
-
inheritDown: true
|
|
1762
|
-
}, ...args);
|
|
1763
|
-
await this.effectivePermissionService.rebuildForPrincipal(tenantId, principal.id, ...args);
|
|
1764
|
-
return {
|
|
1765
|
-
principalId: principal.id
|
|
1766
|
-
};
|
|
1767
|
-
}
|
|
1768
|
-
async changeUserOrgRole(tenantId, principalId, orgUnitId, roleKey, inheritDown, ...args) {
|
|
1769
|
-
const role = await this.roleService.getTenantRoleByKey(tenantId, roleKey, ...args);
|
|
1770
|
-
const currentAssignments = await this.roleAssignmentService.listPrincipalAssignments(tenantId, principalId, ...args);
|
|
1771
|
-
for (const assignment of currentAssignments.filter(row => row.scopeKind === ScopeKind.OrgUnit && row.scopeId === orgUnitId)) {
|
|
1772
|
-
await this.roleAssignmentService.revokeAssignment(assignment.id, ...args);
|
|
1773
|
-
}
|
|
1774
|
-
await this.roleAssignmentService.assignRole({
|
|
1775
|
-
tenantId: tenantId,
|
|
1776
|
-
principalId: principalId,
|
|
1777
|
-
roleId: role.id,
|
|
1778
|
-
scopeKind: ScopeKind.OrgUnit,
|
|
1779
|
-
scopeId: orgUnitId,
|
|
1780
|
-
inheritDown: inheritDown
|
|
1781
|
-
}, ...args);
|
|
1782
|
-
await this.effectivePermissionService.rebuildForPrincipal(tenantId, principalId, ...args);
|
|
1783
|
-
}
|
|
1784
|
-
async suspendUserInTenant(tenantMembershipId, tenantId, principalId, ...args) {
|
|
1785
|
-
await this.membershipService.setStatus(tenantMembershipId, MembershipStatus.Suspended, ...args);
|
|
1786
|
-
await this.effectivePermissionService.deleteForPrincipal(tenantId, principalId, ...args);
|
|
1787
|
-
}
|
|
1788
|
-
async reactivateUserInTenant(tenantMembershipId, tenantId, principalId, ...args) {
|
|
1789
|
-
await this.membershipService.setStatus(tenantMembershipId, MembershipStatus.Active, ...args);
|
|
1790
|
-
await this.effectivePermissionService.rebuildForPrincipal(tenantId, principalId, ...args);
|
|
1791
|
-
}
|
|
1792
|
-
}
|
|
1793
|
-
|
|
1794
|
-
__decorate([ transactional(), __metadata("design:type", Function), __metadata("design:paramtypes", [ String, String, String, String, Object ]), __metadata("design:returntype", Promise) ], SystemManagementService.prototype, "onboardUserToTenantAndOrgUnit", null);
|
|
1795
|
-
|
|
1796
|
-
__decorate([ transactional(), __metadata("design:type", Function), __metadata("design:paramtypes", [ String, String, String, String, Boolean, Object ]), __metadata("design:returntype", Promise) ], SystemManagementService.prototype, "changeUserOrgRole", null);
|
|
1797
|
-
|
|
1798
|
-
__decorate([ transactional(), __metadata("design:type", Function), __metadata("design:paramtypes", [ String, String, String, Object ]), __metadata("design:returntype", Promise) ], SystemManagementService.prototype, "suspendUserInTenant", null);
|
|
1799
|
-
|
|
1800
|
-
__decorate([ transactional(), __metadata("design:type", Function), __metadata("design:paramtypes", [ String, String, String, Object ]), __metadata("design:returntype", Promise) ], SystemManagementService.prototype, "reactivateUserInTenant", null);
|
|
1801
|
-
|
|
1802
|
-
function scopeKey(scopeKind, scopeId) {
|
|
1803
|
-
return `${scopeKind}:${scopeId}`;
|
|
1804
|
-
}
|
|
1805
|
-
|
|
1806
|
-
class AuthzService {
|
|
1807
|
-
constructor(dataSources = {}) {
|
|
1808
|
-
this.dataSources = dataSources;
|
|
1809
|
-
}
|
|
1810
|
-
async canAccess(input, ...args) {
|
|
1811
|
-
const at = input.at ?? new Date;
|
|
1812
|
-
if (input.scopeKind && input.scopeId) {
|
|
1813
|
-
const permissions = await (this.dataSources.listEffectivePermissionsForScope?.(input.tenantId, input.scopeKind, input.scopeId));
|
|
1814
|
-
return asArray(permissions).some(permission => permission.permissionKey === input.permissionKey && isTimeValid(at, permission.startsAt, permission.expiresAt));
|
|
1815
|
-
}
|
|
1816
|
-
if (!input.resourceProtectedId) return false;
|
|
1817
|
-
const resource = await (this.dataSources.loadResource?.(input.tenantId, input.resourceProtectedId));
|
|
1818
|
-
if (!resource) return false;
|
|
1819
|
-
if (resource.tenantId !== input.tenantId) return false;
|
|
1820
|
-
if (resource.ownerPrincipalId === input.principalId) return true;
|
|
1821
|
-
const grants = asArray(await (this.dataSources.listResourceGrants?.(input.tenantId, input.resourceProtectedId))).filter(grant => grant.principalId === input.principalId && grant.permissionKey === input.permissionKey && isTimeValid(at, grant.startsAt, grant.expiresAt));
|
|
1822
|
-
if (grants.length > 0) return true;
|
|
1823
|
-
const visibility = resource.visibility;
|
|
1824
|
-
if (visibility === ResourceVisibility.Private || visibility === ResourceVisibility.ResourceAcl) {
|
|
1825
|
-
return false;
|
|
1826
|
-
}
|
|
1827
|
-
if (visibility === ResourceVisibility.OrgUnit || visibility === ResourceVisibility.OrgSubtree) {
|
|
1828
|
-
const effectivePermissions = asArray(await (this.dataSources.listEffectivePermissionsForScope?.(input.tenantId, ScopeKind.OrgUnit, resource.orgUnitId)));
|
|
1829
|
-
return effectivePermissions.some(permission => permission.permissionKey === input.permissionKey && isTimeValid(at, permission.startsAt, permission.expiresAt));
|
|
1830
|
-
}
|
|
1831
|
-
if (visibility === ResourceVisibility.Tenant) {
|
|
1832
|
-
const effectivePermissions = asArray(await (this.dataSources.listEffectivePermissionsForScope?.(input.tenantId, ScopeKind.Tenant, input.tenantId)));
|
|
1833
|
-
return effectivePermissions.some(permission => permission.permissionKey === input.permissionKey && isTimeValid(at, permission.startsAt, permission.expiresAt));
|
|
1834
|
-
}
|
|
1835
|
-
return false;
|
|
1836
|
-
}
|
|
1837
|
-
async requireAccess(input, ...args) {
|
|
1838
|
-
if (!await this.canAccess(input, ...args)) {
|
|
1839
|
-
throw new AuthorizationError(`Access denied for ${input.permissionKey} on ${input.resourceProtectedId ?? scopeKey(input.scopeKind ?? ScopeKind.Resource, input.scopeId ?? "")}`);
|
|
1840
|
-
}
|
|
1841
|
-
}
|
|
1842
|
-
async buildAccessContext(tenantId, principalId, ...args) {
|
|
1843
|
-
const permissions = asArray(await (this.dataSources.listEffectivePermissions?.(tenantId, principalId)));
|
|
1844
|
-
const grants = asArray(await (this.dataSources.listPrincipalGrants?.(tenantId, principalId)));
|
|
1845
|
-
return buildAccessContext({
|
|
1846
|
-
tenantId: tenantId,
|
|
1847
|
-
principalId: principalId,
|
|
1848
|
-
permissions: permissions,
|
|
1849
|
-
grants: grants
|
|
1850
|
-
});
|
|
1851
|
-
}
|
|
1852
|
-
async buildArangoContext(tenantId, principalId, permissionKey, ...args) {
|
|
1853
|
-
const access = await this.buildAccessContext(tenantId, principalId, ...args);
|
|
1854
|
-
const allowedOrgUnitIds = access.allowedOrgUnitIdsByPermission[permissionKey] ?? [];
|
|
1855
|
-
const allowedResourceIds = access.resourceGrants.filter(grant => grant.permissionKey === permissionKey).map(grant => grant.resourceId);
|
|
1856
|
-
return buildArangoContext({
|
|
1857
|
-
tenantId: tenantId,
|
|
1858
|
-
principalId: principalId,
|
|
1859
|
-
permissionKey: permissionKey,
|
|
1860
|
-
allowedOrgUnitIds: allowedOrgUnitIds,
|
|
1861
|
-
allowedResourceIds: allowedResourceIds
|
|
1862
|
-
});
|
|
1863
|
-
}
|
|
1864
|
-
async buildQdrantFilter(tenantId, principalId, permissionKey, ...args) {
|
|
1865
|
-
const access = await this.buildAccessContext(tenantId, principalId, ...args);
|
|
1866
|
-
const allowedOrgUnitIds = access.allowedOrgUnitIdsByPermission[permissionKey] ?? [];
|
|
1867
|
-
const allowedResourceIds = access.resourceGrants.filter(grant => grant.permissionKey === permissionKey).map(grant => grant.resourceId);
|
|
1868
|
-
return buildQdrantFilter({
|
|
1869
|
-
tenantId: tenantId,
|
|
1870
|
-
principalId: principalId,
|
|
1871
|
-
permissionKey: permissionKey,
|
|
1872
|
-
allowedOrgUnitIds: allowedOrgUnitIds,
|
|
1873
|
-
allowedResourceIds: allowedResourceIds
|
|
1874
|
-
});
|
|
1875
|
-
}
|
|
1876
|
-
}
|
|
1877
|
-
|
|
1878
|
-
const FEATURE_FLAG_ENV_ROOT = "featureFlag";
|
|
1879
|
-
|
|
1880
|
-
const FEATURE_FLAG_ENV_PREFIX = "FEATURE_FLAG";
|
|
1881
|
-
|
|
1882
|
-
const FEATURE_FLAG_MODEL_KEY = "feature-flags:model";
|
|
1883
|
-
|
|
1884
|
-
const FEATURE_FLAG_AUTH_KEY = "feature-flags:auth";
|
|
1885
|
-
|
|
1886
|
-
const FEATURE_FLAG_BLOCK_KEY = "feature-flags:block";
|
|
1887
|
-
|
|
1888
|
-
const FEATURE_FLAG_RENDER_KEY = "feature-flags:render-if";
|
|
1889
|
-
|
|
1890
|
-
const FEATURE_FLAG_HIDE_KEY = "feature-flags:hide-on";
|
|
1891
|
-
|
|
1892
|
-
function normalizeFeatureName(name) {
|
|
1893
|
-
const trimmed = name.trim();
|
|
1894
|
-
if (!trimmed) return trimmed;
|
|
1895
|
-
if (/^[a-z][a-zA-Z0-9]*$/.test(trimmed)) return trimmed;
|
|
1896
|
-
const camelized = trimmed.toLowerCase().replace(/[_\-\s]+/g, " ").split(" ").filter(Boolean);
|
|
1897
|
-
if (camelized.length === 0) return trimmed;
|
|
1898
|
-
const [head, ...tail] = camelized;
|
|
1899
|
-
return [ head, ...tail.map(segment => segment ? segment.charAt(0).toUpperCase() + segment.slice(1) : segment) ].join("").replace(/[^a-zA-Z0-9]/g, "");
|
|
1900
|
-
}
|
|
1901
|
-
|
|
1902
|
-
function parseRuntimeValue(value) {
|
|
1903
|
-
if (typeof value !== "string") return value;
|
|
1904
|
-
const trimmed = value.trim();
|
|
1905
|
-
if (trimmed === "true") return true;
|
|
1906
|
-
if (trimmed === "false") return false;
|
|
1907
|
-
if (/^-?\d+(\.\d+)?$/.test(trimmed)) return Number(trimmed);
|
|
1908
|
-
if (trimmed.startsWith("{") && trimmed.endsWith("}") || trimmed.startsWith("[") && trimmed.endsWith("]")) {
|
|
1909
|
-
try {
|
|
1910
|
-
return JSON.parse(trimmed);
|
|
1911
|
-
} catch {
|
|
1912
|
-
return value;
|
|
1913
|
-
}
|
|
1914
|
-
}
|
|
1915
|
-
return value;
|
|
1916
|
-
}
|
|
1917
|
-
|
|
1918
|
-
function normalizeObjectKey(key) {
|
|
1919
|
-
if (!key) return key;
|
|
1920
|
-
if (/^[a-z][a-zA-Z0-9]*$/.test(key)) return key;
|
|
1921
|
-
const normalized = key.replace(/[\s-]+/g, "_").split("_").filter(Boolean);
|
|
1922
|
-
if (normalized.length === 0) return key;
|
|
1923
|
-
const [head, ...tail] = normalized;
|
|
1924
|
-
return [ head.toLowerCase(), ...tail.map(segment => segment.charAt(0).toUpperCase() + segment.slice(1).toLowerCase()) ].join("");
|
|
1925
|
-
}
|
|
1926
|
-
|
|
1927
|
-
function normalizeFeatureConfig(value) {
|
|
1928
|
-
if (typeof value === "undefined") return undefined;
|
|
1929
|
-
if (value === true) return true;
|
|
1930
|
-
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
1931
|
-
return parseRuntimeValue(value);
|
|
1932
|
-
}
|
|
1933
|
-
const result = {};
|
|
1934
|
-
Object.entries(value).forEach(([key, raw]) => {
|
|
1935
|
-
const normalizedKey = normalizeObjectKey(key);
|
|
1936
|
-
if (typeof raw !== "undefined") {
|
|
1937
|
-
result[normalizedKey] = normalizeFeatureConfig(raw) ?? raw;
|
|
1938
|
-
}
|
|
1939
|
-
});
|
|
1940
|
-
return result;
|
|
1941
|
-
}
|
|
1942
|
-
|
|
1943
|
-
function normalizeFeatureRegistry(value) {
|
|
1944
|
-
if (!value || typeof value !== "object" || Array.isArray(value)) return {};
|
|
1945
|
-
return Object.entries(value).reduce((acc, [key, raw]) => {
|
|
1946
|
-
const normalizedKey = normalizeFeatureName(key);
|
|
1947
|
-
const normalizedValue = normalizeFeatureConfig(raw);
|
|
1948
|
-
if (typeof normalizedValue !== "undefined") {
|
|
1949
|
-
acc[normalizedKey] = normalizedValue;
|
|
1950
|
-
}
|
|
1951
|
-
return acc;
|
|
1952
|
-
}, {});
|
|
1953
|
-
}
|
|
1954
|
-
|
|
1955
|
-
function isFeatureFlagEnabled(value) {
|
|
1956
|
-
if (value === true) return true;
|
|
1957
|
-
return !!value && typeof value === "object";
|
|
1958
|
-
}
|
|
1959
|
-
|
|
1960
|
-
function isFeatureFlagEnabledByName(registry, featureName) {
|
|
1961
|
-
return isFeatureFlagEnabled(registry?.[normalizeFeatureName(featureName)]);
|
|
1962
|
-
}
|
|
1963
|
-
|
|
1964
|
-
function normalizeFeatureRule(features, match = "any") {
|
|
1965
|
-
return {
|
|
1966
|
-
features: [ ...new Set(features.map(normalizeFeatureName).filter(Boolean)) ],
|
|
1967
|
-
match: match
|
|
1968
|
-
};
|
|
1969
|
-
}
|
|
1970
|
-
|
|
1971
|
-
function isFeatureRuleSatisfied(rule, registry) {
|
|
1972
|
-
if (!rule || rule.features.length === 0) return true;
|
|
1973
|
-
const enabled = rule.features.filter(feature => isFeatureFlagEnabledByName(registry, feature));
|
|
1974
|
-
if (rule.match === "all") return enabled.length === rule.features.length;
|
|
1975
|
-
return enabled.length > 0;
|
|
1976
|
-
}
|
|
1977
|
-
|
|
1978
|
-
function isFeatureRuleBlocked(rule, registry) {
|
|
1979
|
-
if (!rule || rule.features.length === 0) return false;
|
|
1980
|
-
return rule.features.some(feature => isFeatureFlagEnabledByName(registry, feature));
|
|
1981
|
-
}
|
|
1982
|
-
|
|
1983
|
-
function readMetadata(target, key) {
|
|
1984
|
-
return Metadata.get(target, key);
|
|
1985
|
-
}
|
|
1986
|
-
|
|
1987
|
-
function normalizeFeatureSubjectType(subjectType) {
|
|
1988
|
-
return subjectType.trim().toLowerCase();
|
|
1989
|
-
}
|
|
1990
|
-
|
|
1991
|
-
function normalizeFeatureSubjectKey(subjectKey) {
|
|
1992
|
-
return subjectKey.trim();
|
|
1993
|
-
}
|
|
1994
|
-
|
|
1995
|
-
const FeatureFlagEnvironment = LoggedEnvironment.accumulate({
|
|
1996
|
-
[FEATURE_FLAG_ENV_ROOT]: {}
|
|
1997
|
-
});
|
|
1998
|
-
|
|
1999
|
-
async function loadFeatureFlagsFromEnvironment(source = FeatureFlagEnvironment) {
|
|
2000
|
-
return normalizeFeatureRegistry(source.featureFlag);
|
|
2001
|
-
}
|
|
2002
|
-
|
|
2003
|
-
async function resolveFeatureFlagFromEnvironment(featureName, source = FeatureFlagEnvironment) {
|
|
2004
|
-
const registry = await loadFeatureFlagsFromEnvironment(source);
|
|
2005
|
-
return registry[normalizeFeatureName(featureName)];
|
|
2006
|
-
}
|
|
2007
|
-
|
|
2008
|
-
async function hasFeatureFlagInEnvironment(featureName, source = FeatureFlagEnvironment) {
|
|
2009
|
-
return !!await resolveFeatureFlagFromEnvironment(featureName, source);
|
|
2010
|
-
}
|
|
2011
|
-
|
|
2012
|
-
let FeatureFlag = class FeatureFlag extends BaseModel {
|
|
2013
|
-
constructor(data) {
|
|
2014
|
-
super(data);
|
|
2015
|
-
this.enabled = true;
|
|
2016
|
-
}
|
|
2017
|
-
};
|
|
2018
|
-
|
|
2019
|
-
__decorate([ pk(), uuid(), __metadata("design:type", String) ], FeatureFlag.prototype, "id", void 0);
|
|
2020
|
-
|
|
2021
|
-
__decorate([ unique(), required(), column(), __metadata("design:type", String) ], FeatureFlag.prototype, "key", void 0);
|
|
2022
|
-
|
|
2023
|
-
__decorate([ column(), __metadata("design:type", Boolean) ], FeatureFlag.prototype, "enabled", void 0);
|
|
2024
|
-
|
|
2025
|
-
__decorate([ column(), __metadata("design:type", String) ], FeatureFlag.prototype, "description", void 0);
|
|
2026
|
-
|
|
2027
|
-
__decorate([ column(), __metadata("design:type", String) ], FeatureFlag.prototype, "scope", void 0);
|
|
2028
|
-
|
|
2029
|
-
__decorate([ column(), __metadata("design:type", Object) ], FeatureFlag.prototype, "metadata", void 0);
|
|
2030
|
-
|
|
2031
|
-
__decorate([ column(), __metadata("design:type", Object) ], FeatureFlag.prototype, "config", void 0);
|
|
2032
|
-
|
|
2033
|
-
__decorate([ column(), __metadata("design:type", String) ], FeatureFlag.prototype, "createdBy", void 0);
|
|
2034
|
-
|
|
2035
|
-
__decorate([ column(), __metadata("design:type", String) ], FeatureFlag.prototype, "updatedBy", void 0);
|
|
2036
|
-
|
|
2037
|
-
__decorate([ createdAt(), __metadata("design:type", Date) ], FeatureFlag.prototype, "createdAt", void 0);
|
|
2038
|
-
|
|
2039
|
-
__decorate([ updatedAt(), __metadata("design:type", Date) ], FeatureFlag.prototype, "updatedAt", void 0);
|
|
2040
|
-
|
|
2041
|
-
FeatureFlag = __decorate([ table("feature_flags"), model(), __metadata("design:paramtypes", [ Object ]) ], FeatureFlag);
|
|
2042
|
-
|
|
2043
|
-
let FeatureFlagAccess = class FeatureFlagAccess extends BaseModel {
|
|
2044
|
-
constructor(data) {
|
|
2045
|
-
super(data);
|
|
2046
|
-
this.enabled = true;
|
|
2047
|
-
}
|
|
2048
|
-
};
|
|
2049
|
-
|
|
2050
|
-
__decorate([ pk(), uuid(), __metadata("design:type", String) ], FeatureFlagAccess.prototype, "id", void 0);
|
|
2051
|
-
|
|
2052
|
-
__decorate([ required(), column(), __metadata("design:type", String) ], FeatureFlagAccess.prototype, "featureKey", void 0);
|
|
2053
|
-
|
|
2054
|
-
__decorate([ required(), column(), __metadata("design:type", String) ], FeatureFlagAccess.prototype, "subjectType", void 0);
|
|
2055
|
-
|
|
2056
|
-
__decorate([ required(), column(), __metadata("design:type", String) ], FeatureFlagAccess.prototype, "subjectKey", void 0);
|
|
2057
|
-
|
|
2058
|
-
__decorate([ column(), __metadata("design:type", Boolean) ], FeatureFlagAccess.prototype, "enabled", void 0);
|
|
2059
|
-
|
|
2060
|
-
__decorate([ column(), __metadata("design:type", Object) ], FeatureFlagAccess.prototype, "metadata", void 0);
|
|
2061
|
-
|
|
2062
|
-
__decorate([ column(), __metadata("design:type", String) ], FeatureFlagAccess.prototype, "createdBy", void 0);
|
|
2063
|
-
|
|
2064
|
-
__decorate([ column(), __metadata("design:type", String) ], FeatureFlagAccess.prototype, "updatedBy", void 0);
|
|
2065
|
-
|
|
2066
|
-
__decorate([ createdAt(), __metadata("design:type", Date) ], FeatureFlagAccess.prototype, "createdAt", void 0);
|
|
2067
|
-
|
|
2068
|
-
__decorate([ updatedAt(), __metadata("design:type", Date) ], FeatureFlagAccess.prototype, "updatedAt", void 0);
|
|
2069
|
-
|
|
2070
|
-
FeatureFlagAccess = __decorate([ table("feature_flag_access"), model(), __metadata("design:paramtypes", [ Object ]) ], FeatureFlagAccess);
|
|
2071
|
-
|
|
2072
|
-
class FeatureFlagReader {
|
|
2073
|
-
async readOne(featureName, input) {
|
|
2074
|
-
const registry = await this.read(input);
|
|
2075
|
-
return registry[normalizeFeatureName(featureName)];
|
|
2076
|
-
}
|
|
2077
|
-
}
|
|
2078
|
-
|
|
2079
|
-
class EnvironmeFlagReader extends FeatureFlagReader {
|
|
2080
|
-
async read(input = {}) {
|
|
2081
|
-
const environment = input.source ?? {
|
|
2082
|
-
[FEATURE_FLAG_ENV_ROOT]: {}
|
|
2083
|
-
};
|
|
2084
|
-
return loadFeatureFlagsFromEnvironment(environment);
|
|
2085
|
-
}
|
|
2086
|
-
}
|
|
2087
|
-
|
|
2088
|
-
let FeatureFlagService = class FeatureFlagService extends ModelService {
|
|
2089
|
-
constructor() {
|
|
2090
|
-
super(FeatureFlag);
|
|
2091
|
-
this.reader = new EnvironmeFlagReader;
|
|
2092
|
-
this.cachedRegistry = {};
|
|
2093
|
-
}
|
|
2094
|
-
async initialize(...args) {
|
|
2095
|
-
const config = args[0] ?? {};
|
|
2096
|
-
if (config.repository) {
|
|
2097
|
-
this._repository = config.repository;
|
|
2098
|
-
}
|
|
2099
|
-
this.reader = !config.reader ? new EnvironmeFlagReader : typeof config.reader === "function" ? new config.reader : config.reader;
|
|
2100
|
-
const readerConfig = {
|
|
2101
|
-
...config.readerConfig ?? {},
|
|
2102
|
-
source: config.readerConfig?.source ?? FeatureFlagEnvironment
|
|
2103
|
-
};
|
|
2104
|
-
this.cachedRegistry = await this.refreshCachedRegistry(readerConfig, ...args);
|
|
2105
|
-
const effectiveConfig = {
|
|
2106
|
-
...config,
|
|
2107
|
-
reader: this.reader,
|
|
2108
|
-
readerConfig: readerConfig
|
|
2109
|
-
};
|
|
2110
|
-
return {
|
|
2111
|
-
config: effectiveConfig,
|
|
2112
|
-
client: this.reader
|
|
2113
|
-
};
|
|
2114
|
-
}
|
|
2115
|
-
cloneRegistry(registry) {
|
|
2116
|
-
return Object.entries(registry).reduce((acc, [key, value]) => {
|
|
2117
|
-
acc[key] = value && typeof value === "object" && !Array.isArray(value) ? {
|
|
2118
|
-
...value
|
|
2119
|
-
} : value;
|
|
2120
|
-
return acc;
|
|
2121
|
-
}, {});
|
|
2122
|
-
}
|
|
2123
|
-
async refreshCachedRegistry(options = {}, ...args) {
|
|
2124
|
-
const envRegistry = await this.reader.read({
|
|
2125
|
-
...options,
|
|
2126
|
-
source: options.source ?? FeatureFlagEnvironment
|
|
2127
|
-
});
|
|
2128
|
-
let persisted = [];
|
|
2129
|
-
try {
|
|
2130
|
-
persisted = await this.repo.select().execute(...args);
|
|
2131
|
-
} catch {
|
|
2132
|
-
persisted = [];
|
|
2133
|
-
}
|
|
2134
|
-
const registry = this.cloneRegistry(envRegistry);
|
|
2135
|
-
for (const flag of persisted) {
|
|
2136
|
-
registry[flag.key] = flag.enabled ? flag.config ?? true : false;
|
|
2137
|
-
}
|
|
2138
|
-
return registry;
|
|
2139
|
-
}
|
|
2140
|
-
setCachedFlag(flag) {
|
|
2141
|
-
this.cachedRegistry[flag.key] = flag.enabled ? flag.config ?? true : false;
|
|
2142
|
-
}
|
|
2143
|
-
getAccessRepository() {
|
|
2144
|
-
return this.accessRepository ?? Repository.forModel(FeatureFlagAccess);
|
|
2145
|
-
}
|
|
2146
|
-
assertInitialized() {
|
|
2147
|
-
void this.reader;
|
|
2148
|
-
}
|
|
2149
|
-
normalizeFeatureAccessInput(input) {
|
|
2150
|
-
return {
|
|
2151
|
-
...input,
|
|
2152
|
-
featureKey: normalizeFeatureName(input.featureKey),
|
|
2153
|
-
subjectType: normalizeFeatureSubjectType(input.subjectType),
|
|
2154
|
-
subjectKey: normalizeFeatureSubjectKey(input.subjectKey)
|
|
2155
|
-
};
|
|
2156
|
-
}
|
|
2157
|
-
buildAccessCondition(query) {
|
|
2158
|
-
let condition = Condition.attr("subjectType").eq(normalizeFeatureSubjectType(query.subjectType));
|
|
2159
|
-
condition = condition.and(Condition.attr("subjectKey").eq(normalizeFeatureSubjectKey(query.subjectKey)));
|
|
2160
|
-
if (typeof query.enabled !== "undefined") {
|
|
2161
|
-
condition = condition.and(Condition.attr("enabled").eq(query.enabled));
|
|
2162
|
-
}
|
|
2163
|
-
if (query.featureKeys && query.featureKeys.length > 0) {
|
|
2164
|
-
condition = condition.and(Condition.attr("featureKey").in(query.featureKeys.map(normalizeFeatureName)));
|
|
2165
|
-
}
|
|
2166
|
-
return condition;
|
|
2167
|
-
}
|
|
2168
|
-
async create(model, ...args) {
|
|
2169
|
-
model.key = normalizeFeatureName(model.key);
|
|
2170
|
-
model.enabled ??= true;
|
|
2171
|
-
const created = await super.create(model, ...args);
|
|
2172
|
-
this.setCachedFlag(created);
|
|
2173
|
-
return created;
|
|
2174
|
-
}
|
|
2175
|
-
async update(model, ...args) {
|
|
2176
|
-
model.key = normalizeFeatureName(model.key);
|
|
2177
|
-
model.enabled ??= true;
|
|
2178
|
-
const updated = await super.update(model, ...args);
|
|
2179
|
-
this.setCachedFlag(updated);
|
|
2180
|
-
return updated;
|
|
2181
|
-
}
|
|
2182
|
-
async findOneBy(key, value, ...args) {
|
|
2183
|
-
const normalizedValue = key === "key" && typeof value === "string" ? normalizeFeatureName(value) : value;
|
|
2184
|
-
return this.repo.findOneBy(key, normalizedValue, ...args);
|
|
2185
|
-
}
|
|
2186
|
-
async readAll(keys, ...args) {
|
|
2187
|
-
const result = await this.repo.readAll(keys, ...args);
|
|
2188
|
-
for (const flag of result) this.setCachedFlag(flag);
|
|
2189
|
-
return result;
|
|
2190
|
-
}
|
|
2191
|
-
async listEnabled(...args) {
|
|
2192
|
-
return this.repo.select().where(Condition.attr("enabled").eq(true)).execute(...args);
|
|
2193
|
-
}
|
|
2194
|
-
async grantFeatureAccess(input, ...args) {
|
|
2195
|
-
const normalized = this.normalizeFeatureAccessInput(input);
|
|
2196
|
-
const existing = await this.findFeatureAccess(normalized, ...args).catch(() => undefined);
|
|
2197
|
-
if (!existing) {
|
|
2198
|
-
return this.getAccessRepository().create(new FeatureFlagAccess(normalized), ...args);
|
|
2199
|
-
}
|
|
2200
|
-
return this.getAccessRepository().update(Object.assign(existing, normalized), ...args);
|
|
2201
|
-
}
|
|
2202
|
-
async revokeFeatureAccess(input, ...args) {
|
|
2203
|
-
const existing = await this.findFeatureAccess(input, ...args).catch(() => undefined);
|
|
2204
|
-
if (!existing) return undefined;
|
|
2205
|
-
return this.getAccessRepository().delete(existing.id, ...args);
|
|
2206
|
-
}
|
|
2207
|
-
async findFeatureAccess(query, ...args) {
|
|
2208
|
-
const condition = this.buildAccessCondition(query);
|
|
2209
|
-
const results = await this.getAccessRepository().select().where(condition).execute(...args);
|
|
2210
|
-
const existing = results[0];
|
|
2211
|
-
if (!existing) {
|
|
2212
|
-
throw new NotFoundError(`Feature access for ${normalizeFeatureSubjectType(query.subjectType)}:${normalizeFeatureSubjectKey(query.subjectKey)} not found`);
|
|
2213
|
-
}
|
|
2214
|
-
return existing;
|
|
2215
|
-
}
|
|
2216
|
-
async listFeatureAccess(query, ...args) {
|
|
2217
|
-
return this.getAccessRepository().select().where(this.buildAccessCondition(query)).execute(...args);
|
|
2218
|
-
}
|
|
2219
|
-
async resolveFeatureFlagsForSubject(subject, ...args) {
|
|
2220
|
-
this.assertInitialized();
|
|
2221
|
-
const access = await this.listFeatureAccess({
|
|
2222
|
-
...subject,
|
|
2223
|
-
enabled: true
|
|
2224
|
-
}, ...args);
|
|
2225
|
-
const featureKeys = [ ...new Set(access.map(item => item.featureKey)) ];
|
|
2226
|
-
if (featureKeys.length === 0) return {};
|
|
2227
|
-
const condition = Condition.attr("enabled").eq(true).and(Condition.attr("key").in(featureKeys.map(normalizeFeatureName)));
|
|
2228
|
-
const enabledFlags = await this.repo.select().where(condition).execute(...args);
|
|
2229
|
-
return enabledFlags.reduce((registry, flag) => {
|
|
2230
|
-
registry[flag.key] = flag.config ?? true;
|
|
2231
|
-
return registry;
|
|
2232
|
-
}, {});
|
|
2233
|
-
}
|
|
2234
|
-
async isEnabledForSubject(key, subject, ...args) {
|
|
2235
|
-
const registry = await this.resolveFeatureFlagsForSubject(subject, ...args);
|
|
2236
|
-
return isFeatureFlagEnabledByName(registry, key);
|
|
2237
|
-
}
|
|
2238
|
-
isEnabled(key) {
|
|
2239
|
-
this.assertInitialized();
|
|
2240
|
-
const normalizedKey = normalizeFeatureName(key);
|
|
2241
|
-
return isFeatureFlagEnabledByName(this.cachedRegistry, normalizedKey);
|
|
2242
|
-
}
|
|
2243
|
-
async resolveFeatureFlags() {
|
|
2244
|
-
this.assertInitialized();
|
|
2245
|
-
return this.cloneRegistry(this.cachedRegistry);
|
|
2246
|
-
}
|
|
2247
|
-
async syncFromEnvironment(options = {}, ...args) {
|
|
2248
|
-
this.assertInitialized();
|
|
2249
|
-
const registry = await this.reader.read({
|
|
2250
|
-
...options,
|
|
2251
|
-
source: options.source ?? FeatureFlagEnvironment
|
|
2252
|
-
});
|
|
2253
|
-
const results = [];
|
|
2254
|
-
for (const [key, value] of Object.entries(registry)) {
|
|
2255
|
-
const config = value && typeof value === "object" && !Array.isArray(value) ? value : {
|
|
2256
|
-
enabled: Boolean(value)
|
|
2257
|
-
};
|
|
2258
|
-
const {enabled: _ignoredEnabled, ...restConfig} = config;
|
|
2259
|
-
const normalizedKey = normalizeFeatureName(key);
|
|
2260
|
-
const existing = await this.findOneBy("key", normalizedKey, ...args).catch(() => undefined);
|
|
2261
|
-
const model = existing ? Object.assign(existing, {
|
|
2262
|
-
enabled: isFeatureFlagEnabled(value),
|
|
2263
|
-
description: restConfig.description ?? existing.description,
|
|
2264
|
-
scope: restConfig.scope ?? existing.scope,
|
|
2265
|
-
metadata: restConfig.metadata ?? existing.metadata,
|
|
2266
|
-
config: {
|
|
2267
|
-
...restConfig,
|
|
2268
|
-
enabled: isFeatureFlagEnabled(value)
|
|
2269
|
-
}
|
|
2270
|
-
}) : new FeatureFlag({
|
|
2271
|
-
key: normalizedKey,
|
|
2272
|
-
enabled: isFeatureFlagEnabled(value),
|
|
2273
|
-
description: restConfig.description,
|
|
2274
|
-
scope: restConfig.scope,
|
|
2275
|
-
metadata: restConfig.metadata,
|
|
2276
|
-
config: {
|
|
2277
|
-
...restConfig,
|
|
2278
|
-
enabled: isFeatureFlagEnabled(value)
|
|
2279
|
-
}
|
|
2280
|
-
});
|
|
2281
|
-
results.push(existing ? await this.update(model, ...args) : await this.create(model, ...args));
|
|
2282
|
-
}
|
|
2283
|
-
this.cachedRegistry = await this.refreshCachedRegistry({
|
|
2284
|
-
...options,
|
|
2285
|
-
source: options.source ?? FeatureFlagEnvironment
|
|
2286
|
-
}, ...args);
|
|
2287
|
-
return results;
|
|
2288
|
-
}
|
|
2289
|
-
};
|
|
2290
|
-
|
|
2291
|
-
__decorate([ repository(FeatureFlagAccess), __metadata("design:type", Object) ], FeatureFlagService.prototype, "accessRepository", void 0);
|
|
2292
|
-
|
|
2293
|
-
FeatureFlagService = __decorate([ service(FeatureFlag), __metadata("design:paramtypes", []) ], FeatureFlagService);
|
|
2294
|
-
|
|
2295
|
-
function featureMetadataKey(key, propertyKey) {
|
|
2296
|
-
return typeof propertyKey === "undefined" ? key : Metadata.key(key, propertyKey.toString());
|
|
2297
|
-
}
|
|
2298
|
-
|
|
2299
|
-
function applyFeatureDecorator(key, features, match = "any") {
|
|
2300
|
-
const rule = normalizeFeatureRule(features, match);
|
|
2301
|
-
return function featureDecorator(target, propertyKey, descriptor) {
|
|
2302
|
-
if (typeof propertyKey === "undefined") {
|
|
2303
|
-
return metadata(key, rule)(target);
|
|
2304
|
-
}
|
|
2305
|
-
const scopedKey = featureMetadataKey(key, propertyKey);
|
|
2306
|
-
if (descriptor) {
|
|
2307
|
-
return methodMetadata(scopedKey, rule)(target, propertyKey, descriptor);
|
|
2308
|
-
}
|
|
2309
|
-
return propMetadata(scopedKey, rule)(target, propertyKey);
|
|
2310
|
-
};
|
|
2311
|
-
}
|
|
2312
|
-
|
|
2313
|
-
function featureFlags(...features) {
|
|
2314
|
-
return applyFeatureDecorator(FEATURE_FLAG_MODEL_KEY, features);
|
|
2315
|
-
}
|
|
2316
|
-
|
|
2317
|
-
function featureAuth(...features) {
|
|
2318
|
-
return applyFeatureDecorator(FEATURE_FLAG_AUTH_KEY, features);
|
|
2319
|
-
}
|
|
2320
|
-
|
|
2321
|
-
function blockFeatureOperations(...features) {
|
|
2322
|
-
return applyFeatureDecorator(FEATURE_FLAG_BLOCK_KEY, features);
|
|
2323
|
-
}
|
|
2324
|
-
|
|
2325
|
-
function renderIfFeature(...features) {
|
|
2326
|
-
return applyFeatureDecorator(FEATURE_FLAG_RENDER_KEY, features);
|
|
2327
|
-
}
|
|
2328
|
-
|
|
2329
|
-
function hideOnFeature(...features) {
|
|
2330
|
-
return applyFeatureDecorator(FEATURE_FLAG_HIDE_KEY, features);
|
|
2331
|
-
}
|
|
2332
|
-
|
|
2333
|
-
function getFeatureGateMetadata(target, key, propertyKey) {
|
|
2334
|
-
return readMetadata(target, featureMetadataKey(key, propertyKey));
|
|
2335
|
-
}
|
|
2336
|
-
|
|
2337
|
-
function shouldExposeForFeatures(target, enabledFeatures, key, propertyKey) {
|
|
2338
|
-
const rule = getFeatureGateMetadata(target, key, propertyKey);
|
|
2339
|
-
return isFeatureRuleSatisfied(rule, enabledFeatures);
|
|
2340
|
-
}
|
|
2341
|
-
|
|
2342
|
-
function shouldHideForFeatures(target, enabledFeatures, key, propertyKey) {
|
|
2343
|
-
const rule = getFeatureGateMetadata(target, key, propertyKey);
|
|
2344
|
-
return isFeatureRuleBlocked(rule, enabledFeatures);
|
|
2345
|
-
}
|
|
2346
|
-
|
|
2347
|
-
const VERSION = "0.4.1-1";
|
|
2348
|
-
|
|
2349
|
-
const COMMIT = "7ccddad";
|
|
2350
|
-
|
|
2351
|
-
const FULL_VERSION = "0.4.1-1-7ccddad";
|
|
2352
|
-
|
|
2353
|
-
const PACKAGE_NAME = "@decaf-ts/integrations";
|
|
2354
|
-
|
|
2355
|
-
export { AuthorizationModel, AuthzService, BaseModelService, BootstrapService, COMMIT, EffectivePermission, EffectivePermissionService, EnvironmeFlagReader, FEATURE_FLAG_AUTH_KEY, FEATURE_FLAG_BLOCK_KEY, FEATURE_FLAG_ENV_PREFIX, FEATURE_FLAG_ENV_ROOT, FEATURE_FLAG_HIDE_KEY, FEATURE_FLAG_MODEL_KEY, FEATURE_FLAG_RENDER_KEY, FULL_VERSION, FeatureFlag, FeatureFlagAccess, FeatureFlagEnvironment, FeatureFlagReader, FeatureFlagService, Group, GroupMembership, GroupMembershipService, GroupService, InheritanceBlock, InheritanceBlockService, IsolationTier, IsolationTierOptions, MembershipStatus, MembershipStatusOptions, OrgUnit, OrgUnitClosure, OrgUnitClosureService, OrgUnitMembership, OrgUnitMembershipService, OrgUnitProfile, OrgUnitProfileService, OrgUnitService, PACKAGE_NAME, Permission, PermissionCategory, PermissionCategoryOptions, PermissionService, Principal, PrincipalKind, PrincipalKindOptions, PrincipalService, ProtectedResource, ProtectedResourceService, REL_CASCADE_DEPENDENT, REL_CASCADE_INSERT_UPDATE, REL_NULLIFY, REL_RESTRICT, ResourceGrant, ResourceGrantService, ResourceLifecycleService, ResourceVisibility, ResourceVisibilityOptions, Role, RoleAssignment, RoleAssignmentService, RolePermission, RolePermissionService, RoleService, ScopeKind, ScopeKindOptions, StorageBinding, StorageBindingKind, StorageBindingKindOptions, StorageBindingService, StorageKind, StorageKindOptions, SystemManagementService, Tenant, TenantMembership, TenantMembershipService, TenantProfile, TenantProfileService, TenantService, User, UserService, VERSION, asArray, blockFeatureOperations, buildAccessContext, buildArangoContext, buildQdrantFilter, execWithLogging, featureAuth, featureFlags, getFeatureGateMetadata, hasFeatureFlagInEnvironment, hideOnFeature, id, isFeatureFlagEnabled, isFeatureFlagEnabledByName, isFeatureRuleBlocked, isFeatureRuleSatisfied, isTimeValid, loadFeatureFlagsFromEnvironment, lowerSlug, normalizeFeatureConfig, normalizeFeatureName, normalizeFeatureRegistry, normalizeFeatureRule, normalizeFeatureSubjectKey, normalizeFeatureSubjectType, nowIso, parseRuntimeValue, readMetadata, relationId, relationMatch, renderIfFeature, resolveFeatureFlagFromEnvironment, sameTenant, shouldExposeForFeatures, shouldHideForFeatures };
|
|
2356
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWdyYXRpb25zLmpzIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy90eXBlcy50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3V0aWxzLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL2F1dGhvcml6YXRpb24tbW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvdGVuYW50LW1lbWJlcnNoaXAubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvdXNlci5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9vcmctdW5pdC1tZW1iZXJzaGlwLm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL29yZy11bml0LWNsb3N1cmUubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvcGVybWlzc2lvbi5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9yb2xlLXBlcm1pc3Npb24ubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvcm9sZS5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9yb2xlLWFzc2lnbm1lbnQubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvcmVzb3VyY2UtZ3JhbnQubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvcHJpbmNpcGFsLm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL3Byb3RlY3RlZC1yZXNvdXJjZS5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9pbmhlcml0YW5jZS1ibG9jay5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9vcmctdW5pdC5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9zdG9yYWdlLWJpbmRpbmcubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvdGVuYW50Lm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL3RlbmFudC1wcm9maWxlLm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL29yZy11bml0LXByb2ZpbGUubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvZ3JvdXAtbWVtYmVyc2hpcC5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9ncm91cC5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9lZmZlY3RpdmUtcGVybWlzc2lvbi5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3RlbmFudC1wcm9maWxlLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9vcmctdW5pdC1wcm9maWxlLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9vcmctdW5pdC1jbG9zdXJlLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9pbmhlcml0YW5jZS1ibG9jay5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvdGVuYW50LnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9vcmctdW5pdC5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvdXNlci5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvcHJpbmNpcGFsLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy90ZW5hbnQtbWVtYmVyc2hpcC5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvb3JnLXVuaXQtbWVtYmVyc2hpcC5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvZ3JvdXAuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL2dyb3VwLW1lbWJlcnNoaXAuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3Blcm1pc3Npb24uc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3JvbGUuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3JvbGUtcGVybWlzc2lvbi5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvcm9sZS1hc3NpZ25tZW50LnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9lZmZlY3RpdmUtcGVybWlzc2lvbi5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvcHJvdGVjdGVkLXJlc291cmNlLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9yZXNvdXJjZS1ncmFudC5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvcmVzb3VyY2UtbGlmZWN5Y2xlLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9zdG9yYWdlLWJpbmRpbmcuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL2Jvb3RzdHJhcC5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvc3lzdGVtLW1hbmFnZW1lbnQuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL2F1dGh6LnNlcnZpY2UudHMiLCIuLi9zcmMvZmVhdHVyZS1mbGFncy9jb25zdGFudHMudHMiLCIuLi9zcmMvZmVhdHVyZS1mbGFncy91dGlscy50cyIsIi4uL3NyYy9mZWF0dXJlLWZsYWdzL2Vudmlyb25tZW50LnRzIiwiLi4vc3JjL2ZlYXR1cmUtZmxhZ3MvbW9kZWxzL0ZlYXR1cmVGbGFnLm1vZGVsLnRzIiwiLi4vc3JjL2ZlYXR1cmUtZmxhZ3MvbW9kZWxzL0ZlYXR1cmVGbGFnQWNjZXNzLm1vZGVsLnRzIiwiLi4vc3JjL2ZlYXR1cmUtZmxhZ3MvcmVhZGVycy9GZWF0dXJlRmxhZ1JlYWRlci50cyIsIi4uL3NyYy9mZWF0dXJlLWZsYWdzL3NlcnZpY2VzL0ZlYXR1cmVGbGFnLnNlcnZpY2UudHMiLCIuLi9zcmMvZmVhdHVyZS1mbGFncy9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSBpbnRlZ3JhdGlvbnMvdXRpbHNcbiAqIEBzdW1tYXJ5IFNoYXJlZCBpbnRlZ3JhdGlvbiB1dGlsaXRpZXMuXG4gKiBAZGVzY3JpcHRpb24gVXRpbGl0eSBoZWxwZXJzIHVzZWQgYWNyb3NzIHRoZSBpbnRlZ3JhdGlvbnMgcGFja2FnZS5cbiAqL1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBMb2dnZXIsIExvZ0xldmVsIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjV2l0aExvZ2dpbmcoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgb3B0aW9uczogeyBjd2Q6IHN0cmluZyB9LFxuICBsb2c6IExvZ2dlcixcbiAgbGV2ZWw6IExvZ0xldmVsID0gTG9nTGV2ZWwuaW5mb1xuKTogUHJvbWlzZTx7IHN0ZG91dDogc3RyaW5nOyBzdGRlcnI6IHN0cmluZyB9PiB7XG4gIGxvZy5kZWJ1ZyhgRXhlY3V0aW5nOiAke2NvbW1hbmR9YCk7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBjaGlsZCA9IGV4ZWMoY29tbWFuZCwgb3B0aW9ucyk7XG5cbiAgICBjb25zdCBzdGRvdXQ6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgc3RkZXJyOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgY2hpbGQuc3Rkb3V0Py5vbihcImRhdGFcIiwgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgc3Rkb3V0LnB1c2goZGF0YSk7XG4gICAgICBsb2dbbGV2ZWxdKGRhdGEudHJpbSgpKTtcbiAgICB9KTtcblxuICAgIGNoaWxkLnN0ZGVycj8ub24oXCJkYXRhXCIsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgIHN0ZGVyci5wdXNoKGRhdGEpO1xuICAgICAgbG9nLmRlYnVnKGRhdGEudHJpbSgpKTtcbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKFwiY2xvc2VcIiwgKGNvZGU6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKGNvZGUgPT09IDApIHtcbiAgICAgICAgbG9nLnNpbGx5KGBDb21tYW5kIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlgKTtcbiAgICAgICAgcmVzb2x2ZSh7IHN0ZG91dDogc3Rkb3V0LmpvaW4oXCJcXG5cIiksIHN0ZGVycjogc3RkZXJyLmpvaW4oXCJcXG5cIikgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2cuY3JpdGljYWwoXG4gICAgICAgICAgYENvbW1hbmQgZmFpbGVkIHdpdGggY29kZSAke2NvZGV9OlxcbiAke3N0ZGVyci5qb2luKFwiXFxuXCIpfWBcbiAgICAgICAgKTtcbiAgICAgICAgcmVqZWN0KFxuICAgICAgICAgIG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYENvbW1hbmQgZmFpbGVkIHdpdGggY29kZSAke2NvZGV9OiAke3N0ZGVyci5qb2luKFwiXFxuXCIpfWBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjaGlsZC5vbihcImVycm9yXCIsIChlcnI6IEVycm9yKSA9PiB7XG4gICAgICBsb2cuY3JpdGljYWwoYENvbW1hbmQgZXhlY3V0aW9uIGVycm9yYCwgZXJyKTtcbiAgICAgIHJlamVjdChlcnIpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsImV4cG9ydCBlbnVtIElzb2xhdGlvblRpZXIge1xuICBQb29sZWQgPSBcInBvb2xlZFwiLFxuICBCcmlkZ2UgPSBcImJyaWRnZVwiLFxuICBTaWxvID0gXCJzaWxvXCIsXG59XG5cbmV4cG9ydCBlbnVtIE1lbWJlcnNoaXBTdGF0dXMge1xuICBJbnZpdGVkID0gXCJpbnZpdGVkXCIsXG4gIEFjdGl2ZSA9IFwiYWN0aXZlXCIsXG4gIFN1c3BlbmRlZCA9IFwic3VzcGVuZGVkXCIsXG4gIFJlbW92ZWQgPSBcInJlbW92ZWRcIixcbn1cblxuZXhwb3J0IGVudW0gUHJpbmNpcGFsS2luZCB7XG4gIFVzZXIgPSBcInVzZXJcIixcbiAgR3JvdXAgPSBcImdyb3VwXCIsXG4gIFNlcnZpY2VBY2NvdW50ID0gXCJzZXJ2aWNlX2FjY291bnRcIixcbiAgQWdlbnQgPSBcImFnZW50XCIsXG4gIEFwaUtleSA9IFwiYXBpX2tleVwiLFxufVxuXG5leHBvcnQgZW51bSBTY29wZUtpbmQge1xuICBUZW5hbnQgPSBcInRlbmFudFwiLFxuICBPcmdVbml0ID0gXCJvcmdfdW5pdFwiLFxuICBSZXNvdXJjZSA9IFwicmVzb3VyY2VcIixcbn1cblxuZXhwb3J0IGVudW0gUGVybWlzc2lvbkNhdGVnb3J5IHtcbiAgQWRtaW4gPSBcImFkbWluXCIsXG4gIENvbnRlbnRSZWFkID0gXCJjb250ZW50X3JlYWRcIixcbiAgQ29udGVudFdyaXRlID0gXCJjb250ZW50X3dyaXRlXCIsXG4gIE1lbW9yeSA9IFwibWVtb3J5XCIsXG4gIEdyYXBoID0gXCJncmFwaFwiLFxuICBWZWN0b3IgPSBcInZlY3RvclwiLFxuICBFeHBvcnQgPSBcImV4cG9ydFwiLFxuICBCaWxsaW5nID0gXCJiaWxsaW5nXCIsXG4gIEF1ZGl0ID0gXCJhdWRpdFwiLFxuICBTZWN1cml0eSA9IFwic2VjdXJpdHlcIixcbiAgRGF0YSA9IFwiZGF0YVwiLFxuICBBdXRvbWF0aW9uID0gXCJhdXRvbWF0aW9uXCIsXG59XG5cbmV4cG9ydCBlbnVtIFJlc291cmNlVmlzaWJpbGl0eSB7XG4gIFByaXZhdGUgPSBcInByaXZhdGVcIixcbiAgUmVzb3VyY2VBY2wgPSBcInJlc291cmNlX2FjbFwiLFxuICBPcmdVbml0ID0gXCJvcmdfdW5pdFwiLFxuICBPcmdTdWJ0cmVlID0gXCJvcmdfc3VidHJlZVwiLFxuICBUZW5hbnQgPSBcInRlbmFudFwiLFxufVxuXG5leHBvcnQgZW51bSBTdG9yYWdlS2luZCB7XG4gIFBvc3RncmVzID0gXCJwb3N0Z3Jlc1wiLFxuICBBcmFuZ28gPSBcImFyYW5nb1wiLFxuICBRZHJhbnQgPSBcInFkcmFudFwiLFxuICBPYmplY3RTdG9yYWdlID0gXCJvYmplY3Rfc3RvcmFnZVwiLFxufVxuXG5leHBvcnQgZW51bSBTdG9yYWdlQmluZGluZ0tpbmQge1xuICBTaGFyZWQgPSBcInNoYXJlZFwiLFxuICBEZWRpY2F0ZWQgPSBcImRlZGljYXRlZFwiLFxufVxuXG5leHBvcnQgY29uc3QgSXNvbGF0aW9uVGllck9wdGlvbnMgPSBPYmplY3QudmFsdWVzKElzb2xhdGlvblRpZXIpO1xuZXhwb3J0IGNvbnN0IE1lbWJlcnNoaXBTdGF0dXNPcHRpb25zID0gT2JqZWN0LnZhbHVlcyhNZW1iZXJzaGlwU3RhdHVzKTtcbmV4cG9ydCBjb25zdCBQcmluY2lwYWxLaW5kT3B0aW9ucyA9IE9iamVjdC52YWx1ZXMoUHJpbmNpcGFsS2luZCk7XG5leHBvcnQgY29uc3QgU2NvcGVLaW5kT3B0aW9ucyA9IE9iamVjdC52YWx1ZXMoU2NvcGVLaW5kKTtcbmV4cG9ydCBjb25zdCBQZXJtaXNzaW9uQ2F0ZWdvcnlPcHRpb25zID0gT2JqZWN0LnZhbHVlcyhQZXJtaXNzaW9uQ2F0ZWdvcnkpO1xuZXhwb3J0IGNvbnN0IFJlc291cmNlVmlzaWJpbGl0eU9wdGlvbnMgPSBPYmplY3QudmFsdWVzKFJlc291cmNlVmlzaWJpbGl0eSk7XG5leHBvcnQgY29uc3QgU3RvcmFnZUtpbmRPcHRpb25zID0gT2JqZWN0LnZhbHVlcyhTdG9yYWdlS2luZCk7XG5leHBvcnQgY29uc3QgU3RvcmFnZUJpbmRpbmdLaW5kT3B0aW9ucyA9IE9iamVjdC52YWx1ZXMoU3RvcmFnZUJpbmRpbmdLaW5kKTtcblxuZXhwb3J0IHR5cGUgVHhBcmdzID0gYW55W107XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlVGVuYW50SW5wdXQge1xuICBzbHVnOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgaXNvbGF0aW9uVGllcj86IElzb2xhdGlvblRpZXI7XG4gIHByb2ZpbGVLZXk/OiBzdHJpbmc7XG4gIHByb2ZpbGVNZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVVzZXJJbnB1dCB7XG4gIGVtYWlsPzogc3RyaW5nO1xuICBwaG9uZT86IHN0cmluZztcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVPcmdVbml0SW5wdXQge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICBwYXJlbnRPcmdVbml0SWQ/OiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcHJvZmlsZUtleT86IHN0cmluZztcbiAgcHJvZmlsZU1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlUm9sZUlucHV0IHtcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG4gIGtleTogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVBlcm1pc3Npb25JbnB1dCB7XG4gIGtleTogc3RyaW5nO1xuICBjYXRlZ29yeTogUGVybWlzc2lvbkNhdGVnb3J5O1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBc3NpZ25Sb2xlSW5wdXQge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICBwcmluY2lwYWxJZDogc3RyaW5nO1xuICByb2xlSWQ6IHN0cmluZztcbiAgc2NvcGVLaW5kOiBTY29wZUtpbmQ7XG4gIHNjb3BlSWQ6IHN0cmluZztcbiAgaW5oZXJpdERvd24/OiBib29sZWFuO1xuICBzdGFydHNBdD86IERhdGU7XG4gIGV4cGlyZXNBdD86IERhdGU7XG4gIGNvbmRpdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlclJlc291cmNlSW5wdXQge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICBvcmdVbml0SWQ6IHN0cmluZztcbiAgcmVzb3VyY2VUeXBlOiBzdHJpbmc7XG4gIHJlc291cmNlSWQ6IHN0cmluZztcbiAgdmlzaWJpbGl0eTogUmVzb3VyY2VWaXNpYmlsaXR5O1xuICBvd25lclByaW5jaXBhbElkPzogc3RyaW5nO1xuICBzZW5zaXRpdml0eT86IHN0cmluZztcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHcmFudFJlc291cmNlSW5wdXQge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICByZXNvdXJjZUlkOiBzdHJpbmc7XG4gIHByaW5jaXBhbElkOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25LZXk6IHN0cmluZztcbiAgc3RhcnRzQXQ/OiBEYXRlO1xuICBleHBpcmVzQXQ/OiBEYXRlO1xuICBjb25kaXRpb25zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNyZWF0ZWRCeVByaW5jaXBhbElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbkFjY2Vzc0lucHV0IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcGVybWlzc2lvbktleTogc3RyaW5nO1xuICByZXNvdXJjZVByb3RlY3RlZElkPzogc3RyaW5nO1xuICBzY29wZUtpbmQ/OiBTY29wZUtpbmQ7XG4gIHNjb3BlSWQ/OiBzdHJpbmc7XG4gIGF0PzogRGF0ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBY2Nlc3NDb250ZXh0IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcGVybWlzc2lvbnNCeVNjb3BlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG4gIGFsbG93ZWRPcmdVbml0SWRzQnlQZXJtaXNzaW9uOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG4gIHJlc291cmNlR3JhbnRzOiBBcnJheTx7IHJlc291cmNlSWQ6IHN0cmluZzsgcGVybWlzc2lvbktleTogc3RyaW5nIH0+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFyYW5nb0F1dGhDb250ZXh0IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcGVybWlzc2lvbktleTogc3RyaW5nO1xuICBhbGxvd2VkT3JnVW5pdElkczogc3RyaW5nW107XG4gIGFsbG93ZWRSZXNvdXJjZUlkczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUWRyYW50QXV0aEZpbHRlciB7XG4gIG11c3Q6IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgbXVzdF9ub3Q/OiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlU3RvcmFnZUJpbmRpbmdJbnB1dCB7XG4gIHRlbmFudElkOiBzdHJpbmc7XG4gIHN0b3JhZ2VLaW5kOiBTdG9yYWdlS2luZDtcbiAgYmluZGluZ0tpbmQ6IFN0b3JhZ2VCaW5kaW5nS2luZDtcbiAgYmluZGluZ0tleTogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbiAgY29uZmlnPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQm9vdHN0cmFwUGVybWlzc2lvbiB7XG4gIGtleTogc3RyaW5nO1xuICBjYXRlZ29yeTogUGVybWlzc2lvbkNhdGVnb3J5O1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCb290c3RyYXBSb2xlIHtcbiAga2V5OiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHBlcm1pc3Npb25LZXlzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCb290c3RyYXBPcmdVbml0IHtcbiAgbmFtZTogc3RyaW5nO1xuICBwcm9maWxlS2V5Pzogc3RyaW5nO1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjaGlsZHJlbj86IEJvb3RzdHJhcE9yZ1VuaXRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCb290c3RyYXBUZW1wbGF0ZSB7XG4gIHRlbmFudDogQ3JlYXRlVGVuYW50SW5wdXQ7XG4gIHJvb3RPcmdVbml0OiBCb290c3RyYXBPcmdVbml0O1xuICBwZXJtaXNzaW9uczogQm9vdHN0cmFwUGVybWlzc2lvbltdO1xuICByb2xlczogQm9vdHN0cmFwUm9sZVtdO1xuICBvd25lclVzZXI6IENyZWF0ZVVzZXJJbnB1dDtcbiAgb3duZXJSb2xlS2V5OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VTbmFwc2hvdCB7XG4gIGlkOiBzdHJpbmc7XG4gIHRlbmFudElkOiBzdHJpbmc7XG4gIG9yZ1VuaXRJZDogc3RyaW5nO1xuICByZXNvdXJjZVR5cGU6IHN0cmluZztcbiAgcmVzb3VyY2VJZDogc3RyaW5nO1xuICB2aXNpYmlsaXR5OiBSZXNvdXJjZVZpc2liaWxpdHk7XG4gIG93bmVyUHJpbmNpcGFsSWQ/OiBzdHJpbmc7XG4gIHNlbnNpdGl2aXR5Pzogc3RyaW5nO1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdyYW50U25hcHNob3Qge1xuICBpZDogc3RyaW5nO1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICByZXNvdXJjZUlkOiBzdHJpbmc7XG4gIHByaW5jaXBhbElkOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25LZXk6IHN0cmluZztcbiAgc3RhcnRzQXQ/OiBEYXRlO1xuICBleHBpcmVzQXQ/OiBEYXRlO1xuICBjb25kaXRpb25zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNyZWF0ZWRCeVByaW5jaXBhbElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVmZmVjdGl2ZVBlcm1pc3Npb25TbmFwc2hvdCB7XG4gIGlkOiBzdHJpbmc7XG4gIHRlbmFudElkOiBzdHJpbmc7XG4gIHByaW5jaXBhbElkOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25LZXk6IHN0cmluZztcbiAgc2NvcGVLaW5kOiBTY29wZUtpbmQ7XG4gIHNjb3BlSWQ6IHN0cmluZztcbiAgc291cmNlS2luZDogc3RyaW5nO1xuICBzb3VyY2VJZDogc3RyaW5nO1xuICBzdGFydHNBdD86IERhdGU7XG4gIGV4cGlyZXNBdD86IERhdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aHpEYXRhU291cmNlcyB7XG4gIGxvYWRSZXNvdXJjZT86ICh0ZW5hbnRJZDogc3RyaW5nLCBwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcpID0+IFByb21pc2U8UmVzb3VyY2VTbmFwc2hvdCB8IHVuZGVmaW5lZD47XG4gIGxpc3RSZXNvdXJjZUdyYW50cz86ICh0ZW5hbnRJZDogc3RyaW5nLCBwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcpID0+IFByb21pc2U8R3JhbnRTbmFwc2hvdFtdPjtcbiAgbGlzdFByaW5jaXBhbEdyYW50cz86ICh0ZW5hbnRJZDogc3RyaW5nLCBwcmluY2lwYWxJZDogc3RyaW5nKSA9PiBQcm9taXNlPEdyYW50U25hcHNob3RbXT47XG4gIGxpc3RFZmZlY3RpdmVQZXJtaXNzaW9ucz86IChcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHByaW5jaXBhbElkOiBzdHJpbmdcbiAgKSA9PiBQcm9taXNlPEVmZmVjdGl2ZVBlcm1pc3Npb25TbmFwc2hvdFtdPjtcbiAgbGlzdEVmZmVjdGl2ZVBlcm1pc3Npb25zRm9yU2NvcGU/OiAoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBzY29wZUtpbmQ6IFNjb3BlS2luZCxcbiAgICBzY29wZUlkOiBzdHJpbmdcbiAgKSA9PiBQcm9taXNlPEVmZmVjdGl2ZVBlcm1pc3Npb25TbmFwc2hvdFtdPjtcbn1cbiIsImltcG9ydCB7IENhc2NhZGUsIE1vZGVsU2VydmljZSwgUmVwb3NpdG9yeSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQge1xuICBBY2Nlc3NDb250ZXh0LFxuICBBcmFuZ29BdXRoQ29udGV4dCxcbiAgRWZmZWN0aXZlUGVybWlzc2lvblNuYXBzaG90LFxuICBHcmFudFNuYXBzaG90LFxuICBRZHJhbnRBdXRoRmlsdGVyLFxuICBTY29wZUtpbmQsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCBSRUxfUkVTVFJJQ1QgPSB7XG4gIHVwZGF0ZTogQ2FzY2FkZS5OT05FLFxuICBkZWxldGU6IENhc2NhZGUuTk9ORSxcbiAgbnVsbGFibGU6IGZhbHNlLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFJFTF9OVUxMSUZZID0ge1xuICB1cGRhdGU6IENhc2NhZGUuTk9ORSxcbiAgZGVsZXRlOiBDYXNjYWRlLk5PTkUsXG4gIG51bGxhYmxlOiB0cnVlLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFJFTF9DQVNDQURFX0RFUEVOREVOVCA9IHtcbiAgdXBkYXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gIGRlbGV0ZTogQ2FzY2FkZS5DQVNDQURFLFxuICBudWxsYWJsZTogZmFsc2UsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgUkVMX0NBU0NBREVfSU5TRVJUX1VQREFURSA9IHtcbiAgdXBkYXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gIGRlbGV0ZTogQ2FzY2FkZS5OT05FLFxuICBudWxsYWJsZTogZmFsc2UsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBcmFuZ29Db250ZXh0KG9wdGlvbnM6IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcGVybWlzc2lvbktleTogc3RyaW5nO1xuICBhbGxvd2VkT3JnVW5pdElkczogc3RyaW5nW107XG4gIGFsbG93ZWRSZXNvdXJjZUlkczogc3RyaW5nW107XG59KTogQXJhbmdvQXV0aENvbnRleHQge1xuICByZXR1cm4ge1xuICAgIHRlbmFudElkOiBvcHRpb25zLnRlbmFudElkLFxuICAgIHByaW5jaXBhbElkOiBvcHRpb25zLnByaW5jaXBhbElkLFxuICAgIHBlcm1pc3Npb25LZXk6IG9wdGlvbnMucGVybWlzc2lvbktleSxcbiAgICBhbGxvd2VkT3JnVW5pdElkczogWy4uLm9wdGlvbnMuYWxsb3dlZE9yZ1VuaXRJZHNdLFxuICAgIGFsbG93ZWRSZXNvdXJjZUlkczogWy4uLm9wdGlvbnMuYWxsb3dlZFJlc291cmNlSWRzXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUWRyYW50RmlsdGVyKG9wdGlvbnM6IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcGVybWlzc2lvbktleTogc3RyaW5nO1xuICBhbGxvd2VkT3JnVW5pdElkczogc3RyaW5nW107XG4gIGFsbG93ZWRSZXNvdXJjZUlkczogc3RyaW5nW107XG59KTogUWRyYW50QXV0aEZpbHRlciB7XG4gIHJldHVybiB7XG4gICAgbXVzdDogW1xuICAgICAge1xuICAgICAgICBrZXk6IFwidGVuYW50X2lkXCIsXG4gICAgICAgIG1hdGNoOiB7IHZhbHVlOiBvcHRpb25zLnRlbmFudElkIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzaG91bGQ6IFtcbiAgICAgICAgICB7IGtleTogXCJvcmdfdW5pdF9pZFwiLCBtYXRjaDogeyBhbnk6IG9wdGlvbnMuYWxsb3dlZE9yZ1VuaXRJZHMgfSB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGtleTogXCJwcm90ZWN0ZWRfcmVzb3VyY2VfaWRcIixcbiAgICAgICAgICAgIG1hdGNoOiB7IGFueTogb3B0aW9ucy5hbGxvd2VkUmVzb3VyY2VJZHMgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsga2V5OiBcIm93bmVyX3ByaW5jaXBhbF9pZFwiLCBtYXRjaDogeyB2YWx1ZTogb3B0aW9ucy5wcmluY2lwYWxJZCB9IH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIF0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNjb3BlS2V5KHNjb3BlS2luZDogU2NvcGVLaW5kLCBzY29wZUlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7c2NvcGVLaW5kfToke3Njb3BlSWR9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vd0lzbygpOiBEYXRlIHtcbiAgcmV0dXJuIG5ldyBEYXRlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc0FycmF5PFQ+KHZhbHVlOiBUW10gfCB1bmRlZmluZWQpOiBUW10ge1xuICByZXR1cm4gdmFsdWUgPz8gW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzYW1lVGVuYW50KHJvd1RlbmFudDogdW5rbm93biwgdGVuYW50SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcmVsYXRpb25JZChyb3dUZW5hbnQgYXMgeyBpZDogc3RyaW5nIH0gfCBzdHJpbmcpID09PSB0ZW5hbnRJZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aW9uTWF0Y2goXG4gIHZhbHVlOiB1bmtub3duLFxuICB0YXJnZXQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogYm9vbGVhbiB7XG4gIHJldHVybiB0YXJnZXRcbiAgICA/IHJlbGF0aW9uSWQodmFsdWUgYXMgeyBpZDogc3RyaW5nIH0gfCBzdHJpbmcpID09PSB0YXJnZXRcbiAgICA6IGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbG93ZXJTbHVnKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gKFxuICAgIHZhbHVlXG4gICAgICAudHJpbSgpXG4gICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgLnJlcGxhY2UoL1teYS16MC05XSsvZywgXCItXCIpXG4gICAgICAucmVwbGFjZSgvXi0rfC0rJC9nLCBcIlwiKSB8fCBcIml0ZW1cIlxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUaW1lVmFsaWQoXG4gIGF0OiBEYXRlIHwgdW5kZWZpbmVkLFxuICBzdGFydHNBdD86IERhdGUsXG4gIGV4cGlyZXNBdD86IERhdGVcbik6IGJvb2xlYW4ge1xuICBjb25zdCBpbnN0YW50ID0gYXQgPz8gbmV3IERhdGUoKTtcbiAgaWYgKHN0YXJ0c0F0ICYmIGluc3RhbnQgPCBzdGFydHNBdCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoZXhwaXJlc0F0ICYmIGluc3RhbnQgPiBleHBpcmVzQXQpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEFjY2Vzc0NvbnRleHQob3B0aW9uczoge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICBwcmluY2lwYWxJZDogc3RyaW5nO1xuICBwZXJtaXNzaW9uczogRWZmZWN0aXZlUGVybWlzc2lvblNuYXBzaG90W107XG4gIGdyYW50czogR3JhbnRTbmFwc2hvdFtdO1xufSk6IEFjY2Vzc0NvbnRleHQge1xuICBjb25zdCBwZXJtaXNzaW9uc0J5U2NvcGU6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuICBjb25zdCBhbGxvd2VkT3JnVW5pdElkc0J5UGVybWlzc2lvbjogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG5cbiAgZm9yIChjb25zdCBwZXJtaXNzaW9uIG9mIG9wdGlvbnMucGVybWlzc2lvbnMpIHtcbiAgICBjb25zdCBrZXkgPSBzY29wZUtleShwZXJtaXNzaW9uLnNjb3BlS2luZCwgcGVybWlzc2lvbi5zY29wZUlkKTtcbiAgICBwZXJtaXNzaW9uc0J5U2NvcGVba2V5XSA9IHBlcm1pc3Npb25zQnlTY29wZVtrZXldID8/IFtdO1xuICAgIHBlcm1pc3Npb25zQnlTY29wZVtrZXldLnB1c2gocGVybWlzc2lvbi5wZXJtaXNzaW9uS2V5KTtcbiAgICBpZiAocGVybWlzc2lvbi5zY29wZUtpbmQgPT09IFNjb3BlS2luZC5PcmdVbml0KSB7XG4gICAgICBhbGxvd2VkT3JnVW5pdElkc0J5UGVybWlzc2lvbltwZXJtaXNzaW9uLnBlcm1pc3Npb25LZXldID1cbiAgICAgICAgYWxsb3dlZE9yZ1VuaXRJZHNCeVBlcm1pc3Npb25bcGVybWlzc2lvbi5wZXJtaXNzaW9uS2V5XSA/PyBbXTtcbiAgICAgIGFsbG93ZWRPcmdVbml0SWRzQnlQZXJtaXNzaW9uW3Blcm1pc3Npb24ucGVybWlzc2lvbktleV0ucHVzaChcbiAgICAgICAgcGVybWlzc2lvbi5zY29wZUlkXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdGVuYW50SWQ6IG9wdGlvbnMudGVuYW50SWQsXG4gICAgcHJpbmNpcGFsSWQ6IG9wdGlvbnMucHJpbmNpcGFsSWQsXG4gICAgcGVybWlzc2lvbnNCeVNjb3BlLFxuICAgIGFsbG93ZWRPcmdVbml0SWRzQnlQZXJtaXNzaW9uLFxuICAgIHJlc291cmNlR3JhbnRzOiBvcHRpb25zLmdyYW50cy5tYXAoKGdyYW50KSA9PiAoe1xuICAgICAgcmVzb3VyY2VJZDogZ3JhbnQucmVzb3VyY2VJZCxcbiAgICAgIHBlcm1pc3Npb25LZXk6IGdyYW50LnBlcm1pc3Npb25LZXksXG4gICAgfSkpLFxuICB9O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU1vZGVsU2VydmljZTxcbiAgTSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+ICYgeyBpZDogc3RyaW5nIH0sXG4+IGV4dGVuZHMgTW9kZWxTZXJ2aWNlPE0sIFJlcG9zaXRvcnk8TSwgYW55Pj4ge1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoY2xheno6IG5ldyAoKSA9PiBNKSB7XG4gICAgc3VwZXIoY2xhenopO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld01vZGVsPFQ+KGNsYXp6OiBuZXcgKCkgPT4gVCwgZGF0YTogUGFydGlhbDxUPik6IFQge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBjbGF6eigpIGFzIG9iamVjdCwgZGF0YSBhcyBvYmplY3QpIGFzIFQ7XG4gIH1cblxuICBhc3luYyBjcmVhdGUoZGF0YTogUGFydGlhbDxNPiwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICByZXR1cm4gdGhpcy5yZXBvLmNyZWF0ZShPYmplY3QuYXNzaWduKHt9IGFzIE0sIGRhdGEgYXMgb2JqZWN0KSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVPbmUoZGF0YTogUGFydGlhbDxNPiwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoZGF0YSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBnZXRCeUlkKGlkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgcmV0dXJuIHRoaXMucmVwby5yZWFkKGlkLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZU9uZShpZDogc3RyaW5nLCBwYXRjaDogUGFydGlhbDxNPiwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMucmVwby5yZWFkKGlkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5yZXBvLnVwZGF0ZShPYmplY3QuYXNzaWduKGV4aXN0aW5nLCBwYXRjaCksIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlQnlJZChpZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucmVwby5kZWxldGUoaWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgZmluZE9uZUJ5PEsgZXh0ZW5kcyBrZXlvZiBNICYgc3RyaW5nPihcbiAgICBrZXk6IEssXG4gICAgdmFsdWU6IE1bS10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxNPiB7XG4gICAgcmV0dXJuIHRoaXMucmVwby5maW5kT25lQnkoa2V5LCB2YWx1ZSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBmaW5kTWFueUJ5PEsgZXh0ZW5kcyBrZXlvZiBNICYgc3RyaW5nPihcbiAgICBrZXk6IEssXG4gICAgdmFsdWU6IE1bS10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICByZXR1cm4gdGhpcy5yZXBvXG4gICAgICAuc2VsZWN0KClcbiAgICAgIC53aGVyZSh7IFtrZXldOiB2YWx1ZSB9IGFzIGFueSlcbiAgICAgIC5leGVjdXRlKC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbGlzdEFsbCguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVwby5zZWxlY3QoKS5leGVjdXRlKC4uLmFyZ3MpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZCgpOiBzdHJpbmcge1xuICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aW9uSWQodmFsdWU6IHN0cmluZyB8IHsgaWQ6IHN0cmluZyB9KTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdmFsdWUuaWQ7XG59XG5cbmV4cG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciwgdHJhbnNhY3Rpb25hbCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBdXRob3JpemF0aW9uTW9kZWwgZXh0ZW5kcyBNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSBhcyBuZXZlcik7XG4gIH1cbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIHBrLCB0YWJsZSwgdXBkYXRlZEF0LCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgb3B0aW9uLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBNZW1iZXJzaGlwU3RhdHVzLCBNZW1iZXJzaGlwU3RhdHVzT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUkVMX0NBU0NBREVfREVQRU5ERU5UIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IFVzZXIgfSBmcm9tIFwiLi91c2VyLm1vZGVsXCI7XG5cbkB0YWJsZShcInRlbmFudF9tZW1iZXJzaGlwc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBUZW5hbnRNZW1iZXJzaGlwIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3RlbmFudF9tZW1iZXJzaGlwc190ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFVzZXIsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma190ZW5hbnRfbWVtYmVyc2hpcHNfdXNlclwiKVxuICBAcmVxdWlyZWQoKVxuICB1c2VyITogVXNlciB8IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBvcHRpb24oTWVtYmVyc2hpcFN0YXR1c09wdGlvbnMpIEBjb2x1bW4oKSBzdGF0dXMhOiBNZW1iZXJzaGlwU3RhdHVzO1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQge1xuICBjb2x1bW4sXG4gIGNyZWF0ZWRBdCxcbiAgb25lVG9NYW55LFxuICBwayxcbiAgdGFibGUsXG4gIHVuaXF1ZSxcbiAgdXBkYXRlZEF0LFxuICB1dWlkLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCByZXF1aXJlZCwgdHlwZSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9SRVNUUklDVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50TWVtYmVyc2hpcCB9IGZyb20gXCIuL3RlbmFudC1tZW1iZXJzaGlwLm1vZGVsXCI7XG5pbXBvcnQgeyBPcmdVbml0TWVtYmVyc2hpcCB9IGZyb20gXCIuL29yZy11bml0LW1lbWJlcnNoaXAubW9kZWxcIjtcblxuQHRhYmxlKFwidXNlcnNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgVXNlciBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KVxuICBAdXVpZCgpXG4gIGlkITogc3RyaW5nO1xuXG4gIEB1bmlxdWUoKVxuICBAdHlwZShTdHJpbmcpXG4gIEBjb2x1bW4oKVxuICBlbWFpbD86IHN0cmluZztcblxuICBAdW5pcXVlKClcbiAgQHR5cGUoU3RyaW5nKVxuICBAY29sdW1uKClcbiAgcGhvbmU/OiBzdHJpbmc7XG5cbiAgQHJlcXVpcmVkKClcbiAgQHR5cGUoU3RyaW5nKVxuICBAY29sdW1uKClcbiAgZGlzcGxheU5hbWUhOiBzdHJpbmc7XG5cbiAgQG9uZVRvTWFueSgoKSA9PiBUZW5hbnRNZW1iZXJzaGlwLCBSRUxfUkVTVFJJQ1QsIGZhbHNlKVxuICB0ZW5hbnRNZW1iZXJzaGlwcz86IFRlbmFudE1lbWJlcnNoaXBbXSB8IHN0cmluZ1tdO1xuXG4gIEBvbmVUb01hbnkoKCkgPT4gT3JnVW5pdE1lbWJlcnNoaXAsIFJFTF9SRVNUUklDVCwgZmFsc2UpXG4gIG9yZ1VuaXRNZW1iZXJzaGlwcz86IE9yZ1VuaXRNZW1iZXJzaGlwW10gfCBzdHJpbmdbXTtcblxuICBAY3JlYXRlZEF0KClcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICBAdXBkYXRlZEF0KClcbiAgdXBkYXRlZEF0ITogRGF0ZTtcblxuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIG9wdGlvbiwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgTWVtYmVyc2hpcFN0YXR1cywgTWVtYmVyc2hpcFN0YXR1c09wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJFTF9DQVNDQURFX0RFUEVOREVOVCwgUkVMX1JFU1RSSUNUIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXQgfSBmcm9tIFwiLi9vcmctdW5pdC5tb2RlbFwiO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gXCIuL3VzZXIubW9kZWxcIjtcblxuQHRhYmxlKFwib3JnX3VuaXRfbWVtYmVyc2hpcHNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgT3JnVW5pdE1lbWJlcnNoaXAgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVGVuYW50LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfb3JnX21lbWJlcnNoaXBzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gT3JnVW5pdCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX29yZ19tZW1iZXJzaGlwc19vcmdfdW5pdFwiKVxuICBAcmVxdWlyZWQoKVxuICBvcmdVbml0ITogT3JnVW5pdCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBVc2VyLCBSRUxfUkVTVFJJQ1QsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfb3JnX21lbWJlcnNoaXBzX3VzZXJcIilcbiAgQHJlcXVpcmVkKClcbiAgdXNlciE6IFVzZXIgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKE1lbWJlcnNoaXBTdGF0dXNPcHRpb25zKSBAY29sdW1uKCkgc3RhdHVzITogTWVtYmVyc2hpcFN0YXR1cztcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgcGssIHRhYmxlLCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUkVMX0NBU0NBREVfREVQRU5ERU5UIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXQgfSBmcm9tIFwiLi9vcmctdW5pdC5tb2RlbFwiO1xuXG5AdGFibGUoXCJvcmdfdW5pdF9jbG9zdXJlXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIE9yZ1VuaXRDbG9zdXJlIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX29yZ19jbG9zdXJlX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gT3JnVW5pdCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX29yZ19jbG9zdXJlX2FuY2VzdG9yXCIpXG4gIEByZXF1aXJlZCgpXG4gIGFuY2VzdG9yITogT3JnVW5pdCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBPcmdVbml0LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfb3JnX2Nsb3N1cmVfZGVzY2VuZGFudFwiKVxuICBAcmVxdWlyZWQoKVxuICBkZXNjZW5kYW50ITogT3JnVW5pdCB8IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihOdW1iZXIpIEBjb2x1bW4oKSBkZXB0aCE6IG51bWJlcjtcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIG9uZVRvTWFueSwgcGssIHRhYmxlLCB1bmlxdWUsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCBvcHRpb24sIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFBlcm1pc3Npb25DYXRlZ29yeSwgUGVybWlzc2lvbkNhdGVnb3J5T3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUkVMX1JFU1RSSUNUIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBSb2xlUGVybWlzc2lvbiB9IGZyb20gXCIuL3JvbGUtcGVybWlzc2lvbi5tb2RlbFwiO1xuXG5AdGFibGUoXCJwZXJtaXNzaW9uc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBQZXJtaXNzaW9uIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAdW5pcXVlKCkgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBrZXkhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKFBlcm1pc3Npb25DYXRlZ29yeU9wdGlvbnMpIEBjb2x1bW4oKSBjYXRlZ29yeSE6IFBlcm1pc3Npb25DYXRlZ29yeTtcbiAgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgQG9uZVRvTWFueSgoKSA9PiBSb2xlUGVybWlzc2lvbiwgUkVMX1JFU1RSSUNULCBmYWxzZSkgcm9sZVBlcm1pc3Npb25zPzogUm9sZVBlcm1pc3Npb25bXSB8IHN0cmluZ1tdO1xufVxuIiwiaW1wb3J0IHsgY3JlYXRlZEF0LCBtYW55VG9PbmUsIHBrLCB0YWJsZSwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUkVMX0NBU0NBREVfREVQRU5ERU5UIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBSb2xlIH0gZnJvbSBcIi4vcm9sZS5tb2RlbFwiO1xuaW1wb3J0IHsgUGVybWlzc2lvbiB9IGZyb20gXCIuL3Blcm1pc3Npb24ubW9kZWxcIjtcblxuQHRhYmxlKFwicm9sZV9wZXJtaXNzaW9uc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBSb2xlUGVybWlzc2lvbiBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBSb2xlLCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcm9sZV9wZXJtaXNzaW9uc19yb2xlXCIpXG4gIEByZXF1aXJlZCgpXG4gIHJvbGUhOiBSb2xlIHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFBlcm1pc3Npb24sIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19yb2xlX3Blcm1pc3Npb25zX3Blcm1pc3Npb25cIilcbiAgQHJlcXVpcmVkKClcbiAgcGVybWlzc2lvbiE6IFBlcm1pc3Npb24gfCBzdHJpbmc7XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgb25lVG9NYW55LCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9OVUxMSUZZLCBSRUxfUkVTVFJJQ1QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgUm9sZVBlcm1pc3Npb24gfSBmcm9tIFwiLi9yb2xlLXBlcm1pc3Npb24ubW9kZWxcIjtcbmltcG9ydCB7IFJvbGVBc3NpZ25tZW50IH0gZnJvbSBcIi4vcm9sZS1hc3NpZ25tZW50Lm1vZGVsXCI7XG5cbkB0YWJsZShcInJvbGVzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIFJvbGUgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVGVuYW50LCBSRUxfTlVMTElGWSwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19yb2xlc190ZW5hbnRcIilcbiAgdGVuYW50PzogVGVuYW50IHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIGtleSE6IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBuYW1lITogc3RyaW5nO1xuICBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBAdHlwZU9mKE9iamVjdCkgQGNvbHVtbigpIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBvbmVUb01hbnkoKCkgPT4gUm9sZVBlcm1pc3Npb24sIFJFTF9SRVNUUklDVCwgZmFsc2UpIHJvbGVQZXJtaXNzaW9ucz86IFJvbGVQZXJtaXNzaW9uW10gfCBzdHJpbmdbXTtcbiAgQG9uZVRvTWFueSgoKSA9PiBSb2xlQXNzaWdubWVudCwgUkVMX1JFU1RSSUNULCBmYWxzZSkgYXNzaWdubWVudHM/OiBSb2xlQXNzaWdubWVudFtdIHwgc3RyaW5nW107XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIHBrLCB0YWJsZSwgdXBkYXRlZEF0LCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgb3B0aW9uLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBTY29wZUtpbmQsIFNjb3BlS2luZE9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJFTF9DQVNDQURFX0RFUEVOREVOVCwgUkVMX1JFU1RSSUNUIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IFByaW5jaXBhbCB9IGZyb20gXCIuL3ByaW5jaXBhbC5tb2RlbFwiO1xuaW1wb3J0IHsgUm9sZSB9IGZyb20gXCIuL3JvbGUubW9kZWxcIjtcblxuQHRhYmxlKFwicm9sZV9hc3NpZ25tZW50c1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBSb2xlQXNzaWdubWVudCBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19yb2xlX2Fzc2lnbm1lbnRzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gUHJpbmNpcGFsLCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcm9sZV9hc3NpZ25tZW50c19wcmluY2lwYWxcIilcbiAgQHJlcXVpcmVkKClcbiAgcHJpbmNpcGFsITogUHJpbmNpcGFsIHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFJvbGUsIFJFTF9SRVNUUklDVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19yb2xlX2Fzc2lnbm1lbnRzX3JvbGVcIilcbiAgQHJlcXVpcmVkKClcbiAgcm9sZSE6IFJvbGUgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKFNjb3BlS2luZE9wdGlvbnMpIEBjb2x1bW4oKSBzY29wZUtpbmQhOiBTY29wZUtpbmQ7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgc2NvcGVJZCE6IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihCb29sZWFuKSBAY29sdW1uKCkgaW5oZXJpdERvd24hOiBib29sZWFuO1xuICBAY29sdW1uKCkgc3RhcnRzQXQ/OiBEYXRlO1xuICBAY29sdW1uKCkgZXhwaXJlc0F0PzogRGF0ZTtcbiAgQHR5cGVPZihPYmplY3QpIEBjb2x1bW4oKSBjb25kaXRpb25zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIHBrLCB0YWJsZSwgdXBkYXRlZEF0LCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBSRUxfUkVTVFJJQ1QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsIH0gZnJvbSBcIi4vcHJpbmNpcGFsLm1vZGVsXCI7XG5pbXBvcnQgeyBQcm90ZWN0ZWRSZXNvdXJjZSB9IGZyb20gXCIuL3Byb3RlY3RlZC1yZXNvdXJjZS5tb2RlbFwiO1xuXG5AdGFibGUoXCJyZXNvdXJjZV9ncmFudHNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VHcmFudCBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19yZXNvdXJjZV9ncmFudHNfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBQcm90ZWN0ZWRSZXNvdXJjZSwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3Jlc291cmNlX2dyYW50c19yZXNvdXJjZVwiKVxuICBAcmVxdWlyZWQoKVxuICByZXNvdXJjZSE6IFByb3RlY3RlZFJlc291cmNlIHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFByaW5jaXBhbCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3Jlc291cmNlX2dyYW50c19wcmluY2lwYWxcIilcbiAgQHJlcXVpcmVkKClcbiAgcHJpbmNpcGFsITogUHJpbmNpcGFsIHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHBlcm1pc3Npb25LZXkhOiBzdHJpbmc7XG4gIEBjb2x1bW4oKSBzdGFydHNBdD86IERhdGU7XG4gIEBjb2x1bW4oKSBleHBpcmVzQXQ/OiBEYXRlO1xuICBAdHlwZU9mKE9iamVjdCkgQGNvbHVtbigpIGNvbmRpdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgQG1hbnlUb09uZSgoKSA9PiBQcmluY2lwYWwsIFJFTF9SRVNUUklDVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19yZXNvdXJjZV9ncmFudHNfY3JlYXRlZF9ieVwiKVxuICBjcmVhdGVkQnk/OiBQcmluY2lwYWwgfCBzdHJpbmc7XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIG9uZVRvTWFueSwgcGssIHRhYmxlLCB1cGRhdGVkQXQsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCBvcHRpb24sIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFByaW5jaXBhbEtpbmQsIFByaW5jaXBhbEtpbmRPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBSRUxfUkVTVFJJQ1QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgUm9sZUFzc2lnbm1lbnQgfSBmcm9tIFwiLi9yb2xlLWFzc2lnbm1lbnQubW9kZWxcIjtcbmltcG9ydCB7IFJlc291cmNlR3JhbnQgfSBmcm9tIFwiLi9yZXNvdXJjZS1ncmFudC5tb2RlbFwiO1xuXG5AdGFibGUoXCJwcmluY2lwYWxzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIFByaW5jaXBhbCBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9SRVNUUklDVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19wcmluY2lwYWxzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKFByaW5jaXBhbEtpbmRPcHRpb25zKSBAY29sdW1uKCkga2luZCE6IFByaW5jaXBhbEtpbmQ7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgc3ViamVjdElkITogc3RyaW5nO1xuICBAb25lVG9NYW55KCgpID0+IFJvbGVBc3NpZ25tZW50LCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSByb2xlQXNzaWdubWVudHM/OiBSb2xlQXNzaWdubWVudFtdIHwgc3RyaW5nW107XG4gIEBvbmVUb01hbnkoKCkgPT4gUmVzb3VyY2VHcmFudCwgUkVMX1JFU1RSSUNULCBmYWxzZSkgcmVzb3VyY2VHcmFudHM/OiBSZXNvdXJjZUdyYW50W10gfCBzdHJpbmdbXTtcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgb25lVG9NYW55LCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIG9wdGlvbiwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUkVMX05VTExJRlksIFJFTF9SRVNUUklDVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgUmVzb3VyY2VWaXNpYmlsaXR5LCBSZXNvdXJjZVZpc2liaWxpdHlPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXQgfSBmcm9tIFwiLi9vcmctdW5pdC5tb2RlbFwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsIH0gZnJvbSBcIi4vcHJpbmNpcGFsLm1vZGVsXCI7XG5pbXBvcnQgeyBSZXNvdXJjZUdyYW50IH0gZnJvbSBcIi4vcmVzb3VyY2UtZ3JhbnQubW9kZWxcIjtcblxuQHRhYmxlKFwicHJvdGVjdGVkX3Jlc291cmNlc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBQcm90ZWN0ZWRSZXNvdXJjZSBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9SRVNUUklDVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19wcm90ZWN0ZWRfcmVzb3VyY2VzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gT3JnVW5pdCwgUkVMX1JFU1RSSUNULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3Byb3RlY3RlZF9yZXNvdXJjZXNfb3JnX3VuaXRcIilcbiAgQHJlcXVpcmVkKClcbiAgb3JnVW5pdCE6IE9yZ1VuaXQgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgcmVzb3VyY2VUeXBlITogc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHJlc291cmNlSWQhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKFJlc291cmNlVmlzaWJpbGl0eU9wdGlvbnMpIEBjb2x1bW4oKSB2aXNpYmlsaXR5ITogUmVzb3VyY2VWaXNpYmlsaXR5O1xuICBAbWFueVRvT25lKCgpID0+IFByaW5jaXBhbCwgUkVMX05VTExJRlksIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcHJvdGVjdGVkX3Jlc291cmNlc19vd25lclwiKVxuICBvd25lcj86IFByaW5jaXBhbCB8IHN0cmluZztcbiAgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBzZW5zaXRpdml0eT86IHN0cmluZztcbiAgQHR5cGVPZihPYmplY3QpIEBjb2x1bW4oKSBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBAb25lVG9NYW55KCgpID0+IFJlc291cmNlR3JhbnQsIFJFTF9SRVNUUklDVCwgZmFsc2UpIGdyYW50cz86IFJlc291cmNlR3JhbnRbXSB8IHN0cmluZ1tdO1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIG9wdGlvbiwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUGVybWlzc2lvbkNhdGVnb3J5LCBQZXJtaXNzaW9uQ2F0ZWdvcnlPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIFJFTF9OVUxMSUZZIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXQgfSBmcm9tIFwiLi9vcmctdW5pdC5tb2RlbFwiO1xuXG5AdGFibGUoXCJpbmhlcml0YW5jZV9ibG9ja3NcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgSW5oZXJpdGFuY2VCbG9jayBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19pbmhlcml0YW5jZV9ibG9ja3NfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBPcmdVbml0LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfaW5oZXJpdGFuY2VfYmxvY2tzX29yZ191bml0XCIpXG4gIEByZXF1aXJlZCgpXG4gIG9yZ1VuaXQhOiBPcmdVbml0IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IE9yZ1VuaXQsIFJFTF9OVUxMSUZZLCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX2luaGVyaXRhbmNlX2Jsb2Nrc19ibG9ja2VkX2FuY2VzdG9yXCIpXG4gIGJsb2NrZWRGcm9tQW5jZXN0b3I/OiBPcmdVbml0IHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQG9wdGlvbihQZXJtaXNzaW9uQ2F0ZWdvcnlPcHRpb25zKSBAY29sdW1uKCkgcGVybWlzc2lvbkNhdGVnb3J5ITogUGVybWlzc2lvbkNhdGVnb3J5O1xuICBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHJlYXNvbj86IHN0cmluZztcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgb25lVG9NYW55LCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9SRVNUUklDVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50Lm1vZGVsXCI7XG5pbXBvcnQgeyBPcmdVbml0TWVtYmVyc2hpcCB9IGZyb20gXCIuL29yZy11bml0LW1lbWJlcnNoaXAubW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXRDbG9zdXJlIH0gZnJvbSBcIi4vb3JnLXVuaXQtY2xvc3VyZS5tb2RlbFwiO1xuaW1wb3J0IHsgUHJvdGVjdGVkUmVzb3VyY2UgfSBmcm9tIFwiLi9wcm90ZWN0ZWQtcmVzb3VyY2UubW9kZWxcIjtcbmltcG9ydCB7IEluaGVyaXRhbmNlQmxvY2sgfSBmcm9tIFwiLi9pbmhlcml0YW5jZS1ibG9jay5tb2RlbFwiO1xuXG5AdGFibGUoXCJvcmdfdW5pdHNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgT3JnVW5pdCBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9SRVNUUklDVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19vcmdfdW5pdHNfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBPcmdVbml0LCBSRUxfUkVTVFJJQ1QsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfb3JnX3VuaXRzX3BhcmVudFwiKVxuICBwYXJlbnQ/OiBPcmdVbml0IHwgc3RyaW5nO1xuICBAb25lVG9NYW55KCgpID0+IE9yZ1VuaXQsIFJFTF9SRVNUUklDVCwgZmFsc2UpIGNoaWxkcmVuPzogT3JnVW5pdFtdIHwgc3RyaW5nW107XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgbmFtZSE6IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBwYXRoITogc3RyaW5nO1xuICBAdHlwZU9mKE9iamVjdCkgQGNvbHVtbigpIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBvbmVUb01hbnkoKCkgPT4gT3JnVW5pdE1lbWJlcnNoaXAsIFJFTF9SRVNUUklDVCwgZmFsc2UpIG1lbWJlcnNoaXBzPzogT3JnVW5pdE1lbWJlcnNoaXBbXSB8IHN0cmluZ1tdO1xuICBAb25lVG9NYW55KCgpID0+IFByb3RlY3RlZFJlc291cmNlLCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSByZXNvdXJjZXM/OiBQcm90ZWN0ZWRSZXNvdXJjZVtdIHwgc3RyaW5nW107XG4gIEBvbmVUb01hbnkoKCkgPT4gSW5oZXJpdGFuY2VCbG9jaywgUkVMX1JFU1RSSUNULCBmYWxzZSkgaW5oZXJpdGFuY2VCbG9ja3M/OiBJbmhlcml0YW5jZUJsb2NrW10gfCBzdHJpbmdbXTtcbiAgQG9uZVRvTWFueSgoKSA9PiBPcmdVbml0Q2xvc3VyZSwgUkVMX1JFU1RSSUNULCBmYWxzZSkgYW5jZXN0b3JMaW5rcz86IE9yZ1VuaXRDbG9zdXJlW10gfCBzdHJpbmdbXTtcbiAgQG9uZVRvTWFueSgoKSA9PiBPcmdVbml0Q2xvc3VyZSwgUkVMX1JFU1RSSUNULCBmYWxzZSkgZGVzY2VuZGFudExpbmtzPzogT3JnVW5pdENsb3N1cmVbXSB8IHN0cmluZ1tdO1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIG9wdGlvbiwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgU3RvcmFnZUJpbmRpbmdLaW5kLCBTdG9yYWdlQmluZGluZ0tpbmRPcHRpb25zLCBTdG9yYWdlS2luZCwgU3RvcmFnZUtpbmRPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuXG5AdGFibGUoXCJzdG9yYWdlX2JpbmRpbmdzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIFN0b3JhZ2VCaW5kaW5nIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3N0b3JhZ2VfYmluZGluZ3NfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBvcHRpb24oU3RvcmFnZUtpbmRPcHRpb25zKSBAY29sdW1uKCkgc3RvcmFnZUtpbmQhOiBTdG9yYWdlS2luZDtcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBvcHRpb24oU3RvcmFnZUJpbmRpbmdLaW5kT3B0aW9ucykgQGNvbHVtbigpIGJpbmRpbmdLaW5kITogU3RvcmFnZUJpbmRpbmdLaW5kO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIGJpbmRpbmdLZXkhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgcmVnaW9uITogc3RyaW5nO1xuICBAdHlwZU9mKE9iamVjdCkgQGNvbHVtbigpIGNvbmZpZz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQge1xuICBjb2x1bW4sXG4gIGNyZWF0ZWRBdCxcbiAgb25lVG9NYW55LFxuICBwayxcbiAgdGFibGUsXG4gIHVuaXF1ZSxcbiAgdXBkYXRlZEF0LFxuICB1dWlkLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7XG4gIG1vZGVsLFxuICBvcHRpb24sXG4gIHJlcXVpcmVkLFxuICB0eXBlIGFzIHR5cGVPZixcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSXNvbGF0aW9uVGllciwgSXNvbGF0aW9uVGllck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJFTF9SRVNUUklDVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgT3JnVW5pdCB9IGZyb20gXCIuL29yZy11bml0Lm1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnRNZW1iZXJzaGlwIH0gZnJvbSBcIi4vdGVuYW50LW1lbWJlcnNoaXAubW9kZWxcIjtcbmltcG9ydCB7IFByaW5jaXBhbCB9IGZyb20gXCIuL3ByaW5jaXBhbC5tb2RlbFwiO1xuaW1wb3J0IHsgU3RvcmFnZUJpbmRpbmcgfSBmcm9tIFwiLi9zdG9yYWdlLWJpbmRpbmcubW9kZWxcIjtcblxuQHRhYmxlKFwidGVuYW50c1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBUZW5hbnQgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEB1bmlxdWUoKSBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHNsdWchOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgbmFtZSE6IHN0cmluZztcbiAgQHJlcXVpcmVkKClcbiAgQHR5cGVPZihTdHJpbmcpXG4gIEBvcHRpb24oSXNvbGF0aW9uVGllck9wdGlvbnMpXG4gIEBjb2x1bW4oKVxuICBpc29sYXRpb25UaWVyITogSXNvbGF0aW9uVGllcjtcbiAgQG9uZVRvTWFueSgoKSA9PiBPcmdVbml0LCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSBvcmdVbml0cz86XG4gICAgfCBPcmdVbml0W11cbiAgICB8IHN0cmluZ1tdO1xuICBAb25lVG9NYW55KCgpID0+IFRlbmFudE1lbWJlcnNoaXAsIFJFTF9SRVNUUklDVCwgZmFsc2UpIG1lbWJlcnNoaXBzPzpcbiAgICB8IFRlbmFudE1lbWJlcnNoaXBbXVxuICAgIHwgc3RyaW5nW107XG4gIEBvbmVUb01hbnkoKCkgPT4gUHJpbmNpcGFsLCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSBwcmluY2lwYWxzPzpcbiAgICB8IFByaW5jaXBhbFtdXG4gICAgfCBzdHJpbmdbXTtcbiAgQG9uZVRvTWFueSgoKSA9PiBTdG9yYWdlQmluZGluZywgUkVMX1JFU1RSSUNULCBmYWxzZSkgc3RvcmFnZUJpbmRpbmdzPzpcbiAgICB8IFN0b3JhZ2VCaW5kaW5nW11cbiAgICB8IHN0cmluZ1tdO1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9DQVNDQURFX0RFUEVOREVOVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50Lm1vZGVsXCI7XG5cbkB0YWJsZShcInRlbmFudF9wcm9maWxlc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBUZW5hbnRQcm9maWxlIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3RlbmFudF9wcm9maWxlc190ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHByb2ZpbGVLZXkhOiBzdHJpbmc7XG4gIEB0eXBlT2YoT2JqZWN0KSBAY29sdW1uKCkgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgcGssIHRhYmxlLCB1cGRhdGVkQXQsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXQgfSBmcm9tIFwiLi9vcmctdW5pdC5tb2RlbFwiO1xuXG5AdGFibGUoXCJvcmdfdW5pdF9wcm9maWxlc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBPcmdVbml0UHJvZmlsZSBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBPcmdVbml0LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfb3JnX3VuaXRfcHJvZmlsZXNfb3JnX3VuaXRcIilcbiAgQHJlcXVpcmVkKClcbiAgb3JnVW5pdCE6IE9yZ1VuaXQgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgcHJvZmlsZUtleSE6IHN0cmluZztcbiAgQHR5cGVPZihPYmplY3QpIEBjb2x1bW4oKSBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgR3JvdXAgfSBmcm9tIFwiLi9ncm91cC5tb2RlbFwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsIH0gZnJvbSBcIi4vcHJpbmNpcGFsLm1vZGVsXCI7XG5cbkB0YWJsZShcImdyb3VwX21lbWJlcnNoaXBzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIEdyb3VwTWVtYmVyc2hpcCBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19ncm91cF9tZW1iZXJzaGlwc190ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IEdyb3VwLCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfZ3JvdXBfbWVtYmVyc2hpcHNfZ3JvdXBcIilcbiAgQHJlcXVpcmVkKClcbiAgZ3JvdXAhOiBHcm91cCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBQcmluY2lwYWwsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19ncm91cF9tZW1iZXJzaGlwc19wcmluY2lwYWxcIilcbiAgQHJlcXVpcmVkKClcbiAgcHJpbmNpcGFsITogUHJpbmNpcGFsIHwgc3RyaW5nO1xuICBAdHlwZU9mKE9iamVjdCkgQGNvbHVtbigpIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgb25lVG9NYW55LCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9OVUxMSUZZLCBSRUxfUkVTVFJJQ1QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgT3JnVW5pdCB9IGZyb20gXCIuL29yZy11bml0Lm1vZGVsXCI7XG5pbXBvcnQgeyBHcm91cE1lbWJlcnNoaXAgfSBmcm9tIFwiLi9ncm91cC1tZW1iZXJzaGlwLm1vZGVsXCI7XG5cbkB0YWJsZShcImdyb3Vwc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBHcm91cCBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9SRVNUUklDVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19ncm91cHNfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBPcmdVbml0LCBSRUxfTlVMTElGWSwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19ncm91cHNfb3JnX3VuaXRcIilcbiAgb3JnVW5pdD86IE9yZ1VuaXQgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgbmFtZSE6IHN0cmluZztcbiAgQHR5cGVPZihPYmplY3QpIEBjb2x1bW4oKSBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBAb25lVG9NYW55KCgpID0+IEdyb3VwTWVtYmVyc2hpcCwgUkVMX1JFU1RSSUNULCBmYWxzZSkgbWVtYmVycz86IEdyb3VwTWVtYmVyc2hpcFtdIHwgc3RyaW5nW107XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIHBrLCB0YWJsZSwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIG9wdGlvbiwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgU2NvcGVLaW5kLCBTY29wZUtpbmRPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsIH0gZnJvbSBcIi4vcHJpbmNpcGFsLm1vZGVsXCI7XG5cbkB0YWJsZShcImVmZmVjdGl2ZV9wZXJtaXNzaW9uc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBFZmZlY3RpdmVQZXJtaXNzaW9uIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX2VmZmVjdGl2ZV9wZXJtaXNzaW9uc190ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFByaW5jaXBhbCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX2VmZmVjdGl2ZV9wZXJtaXNzaW9uc19wcmluY2lwYWxcIilcbiAgQHJlcXVpcmVkKClcbiAgcHJpbmNpcGFsITogUHJpbmNpcGFsIHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHBlcm1pc3Npb25LZXkhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKFNjb3BlS2luZE9wdGlvbnMpIEBjb2x1bW4oKSBzY29wZUtpbmQhOiBTY29wZUtpbmQ7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgc2NvcGVJZCE6IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBzb3VyY2VLaW5kITogc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHNvdXJjZUlkITogc3RyaW5nO1xuICBAY29sdW1uKCkgc3RhcnRzQXQ/OiBEYXRlO1xuICBAY29sdW1uKCkgZXhwaXJlc0F0PzogRGF0ZTtcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCBzYW1lVGVuYW50IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBUZW5hbnRQcm9maWxlIH0gZnJvbSBcIi4uL21vZGVscy90ZW5hbnQtcHJvZmlsZS5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgVGVuYW50UHJvZmlsZVNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFRlbmFudFByb2ZpbGU+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoVGVuYW50UHJvZmlsZSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVQcm9maWxlKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgcHJvZmlsZUtleTogc3RyaW5nLFxuICAgIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxUZW5hbnRQcm9maWxlPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IHRlbmFudElkLFxuICAgICAgICBwcm9maWxlS2V5LFxuICAgICAgICBtZXRhZGF0YSxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RGb3JUZW5hbnQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFRlbmFudFByb2ZpbGVbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKHByb2ZpbGUpID0+XG4gICAgICBzYW1lVGVuYW50KHByb2ZpbGUudGVuYW50LCB0ZW5hbnRJZClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlRm9yVGVuYW50KHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCByb3cgb2YgYXdhaXQgdGhpcy5saXN0Rm9yVGVuYW50KHRlbmFudElkLCAuLi5hcmdzKSkge1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKHJvdy5pZCwgLi4uYXJncyk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCByZWxhdGlvbk1hdGNoIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBPcmdVbml0UHJvZmlsZSB9IGZyb20gXCIuLi9tb2RlbHMvb3JnLXVuaXQtcHJvZmlsZS5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgT3JnVW5pdFByb2ZpbGVTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxPcmdVbml0UHJvZmlsZT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihPcmdVbml0UHJvZmlsZSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVQcm9maWxlKFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIHByb2ZpbGVLZXk6IHN0cmluZyxcbiAgICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8T3JnVW5pdFByb2ZpbGU+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIG9yZ1VuaXQ6IG9yZ1VuaXRJZCxcbiAgICAgICAgcHJvZmlsZUtleSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBsaXN0Rm9yT3JnVW5pdChcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXRQcm9maWxlW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChwcm9maWxlKSA9PlxuICAgICAgcmVsYXRpb25NYXRjaChwcm9maWxlLm9yZ1VuaXQsIG9yZ1VuaXRJZClcbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBCYXNlTW9kZWxTZXJ2aWNlLFxuICByZWxhdGlvbklkLFxuICByZWxhdGlvbk1hdGNoLFxuICBzYW1lVGVuYW50LFxufSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IE9yZ1VuaXRDbG9zdXJlIH0gZnJvbSBcIi4uL21vZGVscy9vcmctdW5pdC1jbG9zdXJlLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBPcmdVbml0Q2xvc3VyZVNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPE9yZ1VuaXRDbG9zdXJlPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKE9yZ1VuaXRDbG9zdXJlKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RBbmNlc3RvcnMoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXRDbG9zdXJlW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSlcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChyb3cpID0+XG4gICAgICAgICAgc2FtZVRlbmFudChyb3cudGVuYW50LCB0ZW5hbnRJZCkgJiZcbiAgICAgICAgICByZWxhdGlvbk1hdGNoKHJvdy5kZXNjZW5kYW50LCBvcmdVbml0SWQpXG4gICAgICApXG4gICAgICAuc29ydCgobGVmdCwgcmlnaHQpID0+IGxlZnQuZGVwdGggLSByaWdodC5kZXB0aCk7XG4gIH1cblxuICBhc3luYyBsaXN0RGVzY2VuZGFudHMoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXRDbG9zdXJlW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSlcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChyb3cpID0+XG4gICAgICAgICAgc2FtZVRlbmFudChyb3cudGVuYW50LCB0ZW5hbnRJZCkgJiZcbiAgICAgICAgICByZWxhdGlvbk1hdGNoKHJvdy5hbmNlc3Rvciwgb3JnVW5pdElkKVxuICAgICAgKVxuICAgICAgLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0LmRlcHRoIC0gcmlnaHQuZGVwdGgpO1xuICB9XG5cbiAgYXN5bmMgaXNBbmNlc3Rvck9mKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgYW5jZXN0b3JPcmdVbml0SWQ6IHN0cmluZyxcbiAgICBkZXNjZW5kYW50T3JnVW5pdElkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGF3YWl0IHRoaXMubGlzdEFuY2VzdG9ycyh0ZW5hbnRJZCwgZGVzY2VuZGFudE9yZ1VuaXRJZCwgLi4uYXJncylcbiAgICApLnNvbWUoKHJvdykgPT4gcmVsYXRpb25NYXRjaChyb3cuYW5jZXN0b3IsIGFuY2VzdG9yT3JnVW5pdElkKSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVTZWxmTGluayhcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8T3JnVW5pdENsb3N1cmU+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogdGVuYW50SWQsXG4gICAgICAgIGFuY2VzdG9yOiBvcmdVbml0SWQsXG4gICAgICAgIGRlc2NlbmRhbnQ6IG9yZ1VuaXRJZCxcbiAgICAgICAgZGVwdGg6IDAsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBpbnNlcnRBbmNlc3RvckxpbmtzRm9yTmV3Q2hpbGQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBwYXJlbnRPcmdVbml0SWQ6IHN0cmluZyxcbiAgICBjaGlsZE9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFuY2VzdG9yTGlua3MgPSBhd2FpdCB0aGlzLmxpc3RBbmNlc3RvcnMoXG4gICAgICB0ZW5hbnRJZCxcbiAgICAgIHBhcmVudE9yZ1VuaXRJZCxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGZvciAoY29uc3QgbGluayBvZiBhbmNlc3RvckxpbmtzKSB7XG4gICAgICBhd2FpdCB0aGlzLmNyZWF0ZShcbiAgICAgICAge1xuICAgICAgICAgIHRlbmFudDogdGVuYW50SWQsXG4gICAgICAgICAgYW5jZXN0b3I6IGxpbmsuYW5jZXN0b3IsXG4gICAgICAgICAgZGVzY2VuZGFudDogY2hpbGRPcmdVbml0SWQsXG4gICAgICAgICAgZGVwdGg6IGxpbmsuZGVwdGggKyAxLFxuICAgICAgICB9LFxuICAgICAgICAuLi5hcmdzXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUxpbmtzRm9yU3VidHJlZShcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN1YnRyZWUgPSBhd2FpdCB0aGlzLmxpc3REZXNjZW5kYW50cyh0ZW5hbnRJZCwgb3JnVW5pdElkLCAuLi5hcmdzKTtcbiAgICBjb25zdCBkZXNjZW5kYW50SWRzID0gbmV3IFNldChbXG4gICAgICBvcmdVbml0SWQsXG4gICAgICAuLi5zdWJ0cmVlLm1hcCgocm93KSA9PiByZWxhdGlvbklkKHJvdy5kZXNjZW5kYW50KSksXG4gICAgXSk7XG4gICAgY29uc3QgYW5jZXN0b3JJZHMgPSBuZXcgU2V0KFtcbiAgICAgIG9yZ1VuaXRJZCxcbiAgICAgIC4uLnN1YnRyZWUubWFwKChyb3cpID0+IHJlbGF0aW9uSWQocm93LmFuY2VzdG9yKSksXG4gICAgXSk7XG4gICAgY29uc3Qgcm93cyA9IChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcihcbiAgICAgIChyb3cpID0+XG4gICAgICAgIHNhbWVUZW5hbnQocm93LnRlbmFudCwgdGVuYW50SWQpICYmXG4gICAgICAgIChkZXNjZW5kYW50SWRzLmhhcyhyZWxhdGlvbklkKHJvdy5kZXNjZW5kYW50KSkgfHxcbiAgICAgICAgICBhbmNlc3Rvcklkcy5oYXMocmVsYXRpb25JZChyb3cuYW5jZXN0b3IpKSlcbiAgICApO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlQnlJZChyb3cuaWQsIC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgcmVsYXRpb25NYXRjaCwgc2FtZVRlbmFudCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgUGVybWlzc2lvbkNhdGVnb3J5IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBJbmhlcml0YW5jZUJsb2NrIH0gZnJvbSBcIi4uL21vZGVscy9pbmhlcml0YW5jZS1ibG9jay5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgSW5oZXJpdGFuY2VCbG9ja1NlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPEluaGVyaXRhbmNlQmxvY2s+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoSW5oZXJpdGFuY2VCbG9jayk7XG4gIH1cblxuICBhc3luYyBibG9ja0NhdGVnb3J5KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgcGVybWlzc2lvbkNhdGVnb3J5OiBQZXJtaXNzaW9uQ2F0ZWdvcnksXG4gICAgYmxvY2tlZEZyb21BbmNlc3RvcklkPzogc3RyaW5nLFxuICAgIHJlYXNvbj86IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEluaGVyaXRhbmNlQmxvY2s+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogdGVuYW50SWQsXG4gICAgICAgIG9yZ1VuaXQ6IG9yZ1VuaXRJZCxcbiAgICAgICAgYmxvY2tlZEZyb21BbmNlc3RvcjogYmxvY2tlZEZyb21BbmNlc3RvcklkLFxuICAgICAgICBwZXJtaXNzaW9uQ2F0ZWdvcnksXG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHVuYmxvY2tDYXRlZ29yeShibG9ja0lkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKGJsb2NrSWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbGlzdEZvck9yZ1VuaXQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEluaGVyaXRhbmNlQmxvY2tbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoXG4gICAgICAoYmxvY2spID0+XG4gICAgICAgIHNhbWVUZW5hbnQoYmxvY2sudGVuYW50LCB0ZW5hbnRJZCkgJiZcbiAgICAgICAgcmVsYXRpb25NYXRjaChibG9jay5vcmdVbml0LCBvcmdVbml0SWQpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGNhdGVnb3J5QmxvY2tlZEZvckFuY2VzdG9yKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgYW5jZXN0b3JPcmdVbml0SWQ6IHN0cmluZyxcbiAgICBjYXRlZ29yeTogUGVybWlzc2lvbkNhdGVnb3J5LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0Rm9yT3JnVW5pdCh0ZW5hbnRJZCwgb3JnVW5pdElkLCAuLi5hcmdzKSkuc29tZShcbiAgICAgIChibG9jaykgPT5cbiAgICAgICAgYmxvY2sucGVybWlzc2lvbkNhdGVnb3J5ID09PSBjYXRlZ29yeSAmJlxuICAgICAgICAoIWJsb2NrLmJsb2NrZWRGcm9tQW5jZXN0b3IgfHxcbiAgICAgICAgICByZWxhdGlvbk1hdGNoKGJsb2NrLmJsb2NrZWRGcm9tQW5jZXN0b3IsIGFuY2VzdG9yT3JnVW5pdElkKSlcbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBJc29sYXRpb25UaWVyLCBDcmVhdGVUZW5hbnRJbnB1dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4uL21vZGVscy90ZW5hbnQubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIFRlbmFudFNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFRlbmFudD4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihUZW5hbnQpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlVGVuYW50KGlucHV0OiBDcmVhdGVUZW5hbnRJbnB1dCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFRlbmFudD4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgc2x1ZzogaW5wdXQuc2x1ZyxcbiAgICAgICAgbmFtZTogaW5wdXQubmFtZSxcbiAgICAgICAgaXNvbGF0aW9uVGllcjogaW5wdXQuaXNvbGF0aW9uVGllciA/PyBJc29sYXRpb25UaWVyLlBvb2xlZCxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGdldEJ5U2x1ZyhzbHVnOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxUZW5hbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5maW5kT25lQnkoXCJzbHVnXCIsIHNsdWcgYXMgbmV2ZXIsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgcmVuYW1lVGVuYW50KHRlbmFudElkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFRlbmFudD4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZSh0ZW5hbnRJZCwgeyBuYW1lIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgY2hhbmdlU2x1Zyh0ZW5hbnRJZDogc3RyaW5nLCBzbHVnOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxUZW5hbnQ+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUodGVuYW50SWQsIHsgc2x1ZyB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIHNldElzb2xhdGlvblRpZXIoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBpc29sYXRpb25UaWVyOiBJc29sYXRpb25UaWVyLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8VGVuYW50PiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKHRlbmFudElkLCB7IGlzb2xhdGlvblRpZXIgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBkZWxldGVUZW5hbnRDb250cm9sbGVkKHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKHRlbmFudElkLCAuLi5hcmdzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgbG93ZXJTbHVnLCByZWxhdGlvbklkLCByZWxhdGlvbk1hdGNoLCBzYW1lVGVuYW50IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IENyZWF0ZU9yZ1VuaXRJbnB1dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgT3JnVW5pdCB9IGZyb20gXCIuLi9tb2RlbHMvb3JnLXVuaXQubW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXRQcm9maWxlU2VydmljZSB9IGZyb20gXCIuL29yZy11bml0LXByb2ZpbGUuc2VydmljZVwiO1xuaW1wb3J0IHsgT3JnVW5pdENsb3N1cmVTZXJ2aWNlIH0gZnJvbSBcIi4vb3JnLXVuaXQtY2xvc3VyZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyB0cmFuc2FjdGlvbmFsIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVJvd3NCeUlkKFxuICBzZXJ2aWNlOiBCYXNlTW9kZWxTZXJ2aWNlPGFueT4sXG4gIHJvd3M6IEFycmF5PHsgaWQ6IHN0cmluZyB9PixcbiAgLi4uYXJnczogYW55W11cbik6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgYXdhaXQgc2VydmljZS5kZWxldGVCeUlkKHJvdy5pZCwgLi4uYXJncyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE9yZ1VuaXRTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxPcmdVbml0PiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKE9yZ1VuaXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBvcmdVbml0UGF0aChwYXJlbnRQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2VnbWVudCA9IGxvd2VyU2x1ZyhuYW1lKTtcbiAgICByZXR1cm4gcGFyZW50UGF0aCA/IGAke3BhcmVudFBhdGgucmVwbGFjZSgvXFwvKyQvLCBcIlwiKX0vJHtzZWdtZW50fWAgOiBgLyR7c2VnbWVudH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVQcm9maWxlSWZOZWVkZWQoXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgcHJvZmlsZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHByb2ZpbGVNZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFwcm9maWxlS2V5KSByZXR1cm47XG4gICAgYXdhaXQgbmV3IE9yZ1VuaXRQcm9maWxlU2VydmljZSgpLmNyZWF0ZVByb2ZpbGUob3JnVW5pdElkLCBwcm9maWxlS2V5LCBwcm9maWxlTWV0YWRhdGEsIC4uLmFyZ3MpO1xuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyBjcmVhdGVSb290KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgcHJvZmlsZUtleT86IHN0cmluZyxcbiAgICBwcm9maWxlTWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXQ+IHtcbiAgICBjb25zdCBvcmdVbml0ID0gYXdhaXQgdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogdGVuYW50SWQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHBhdGg6IHRoaXMub3JnVW5pdFBhdGgodW5kZWZpbmVkLCBuYW1lKSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgYXdhaXQgdGhpcy5jcmVhdGVQcm9maWxlSWZOZWVkZWQob3JnVW5pdC5pZCwgcHJvZmlsZUtleSwgcHJvZmlsZU1ldGFkYXRhLCAuLi5hcmdzKTtcbiAgICBhd2FpdCBuZXcgT3JnVW5pdENsb3N1cmVTZXJ2aWNlKCkuY3JlYXRlU2VsZkxpbmsodGVuYW50SWQsIG9yZ1VuaXQuaWQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiBvcmdVbml0O1xuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyBjcmVhdGVDaGlsZChpbnB1dDogQ3JlYXRlT3JnVW5pdElucHV0LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8T3JnVW5pdD4ge1xuICAgIGNvbnN0IHBhcmVudCA9IGlucHV0LnBhcmVudE9yZ1VuaXRJZCA/IGF3YWl0IHRoaXMuZ2V0QnlJZChpbnB1dC5wYXJlbnRPcmdVbml0SWQsIC4uLmFyZ3MpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IG9yZ1VuaXQgPSBhd2FpdCB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgcGFyZW50OiBwYXJlbnQ/LmlkID8/IGlucHV0LnBhcmVudE9yZ1VuaXRJZCxcbiAgICAgICAgbmFtZTogaW5wdXQubmFtZSxcbiAgICAgICAgcGF0aDogdGhpcy5vcmdVbml0UGF0aChwYXJlbnQ/LnBhdGgsIGlucHV0Lm5hbWUpLFxuICAgICAgICBtZXRhZGF0YTogaW5wdXQubWV0YWRhdGEsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgYXdhaXQgdGhpcy5jcmVhdGVQcm9maWxlSWZOZWVkZWQob3JnVW5pdC5pZCwgaW5wdXQucHJvZmlsZUtleSwgaW5wdXQucHJvZmlsZU1ldGFkYXRhLCAuLi5hcmdzKTtcbiAgICBjb25zdCBjbG9zdXJlU2VydmljZSA9IG5ldyBPcmdVbml0Q2xvc3VyZVNlcnZpY2UoKTtcbiAgICBhd2FpdCBjbG9zdXJlU2VydmljZS5jcmVhdGVTZWxmTGluayhpbnB1dC50ZW5hbnRJZCwgb3JnVW5pdC5pZCwgLi4uYXJncyk7XG4gICAgaWYgKGlucHV0LnBhcmVudE9yZ1VuaXRJZCkge1xuICAgICAgYXdhaXQgY2xvc3VyZVNlcnZpY2UuaW5zZXJ0QW5jZXN0b3JMaW5rc0Zvck5ld0NoaWxkKFxuICAgICAgICBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgaW5wdXQucGFyZW50T3JnVW5pdElkLFxuICAgICAgICBvcmdVbml0LmlkLFxuICAgICAgICAuLi5hcmdzXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gb3JnVW5pdDtcbiAgfVxuXG4gIGFzeW5jIGxpc3RDaGlsZHJlbihwYXJlbnRPcmdVbml0SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE9yZ1VuaXRbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKG9yZ1VuaXQpID0+IHJlbGF0aW9uTWF0Y2gob3JnVW5pdC5wYXJlbnQsIHBhcmVudE9yZ1VuaXRJZCkpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFRlbmFudE9yZ1VuaXRzKHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxPcmdVbml0W10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChvcmdVbml0KSA9PiBzYW1lVGVuYW50KG9yZ1VuaXQudGVuYW50LCB0ZW5hbnRJZCkpO1xuICB9XG5cbiAgYXN5bmMgbGlzdERlc2NlbmRhbnRPcmdVbml0cyhcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIGluY2x1ZGVTZWxmID0gZmFsc2UsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxPcmdVbml0W10+IHtcbiAgICBjb25zdCBkZXNjZW5kYW50cyA9IGF3YWl0IG5ldyBPcmdVbml0Q2xvc3VyZVNlcnZpY2UoKS5saXN0RGVzY2VuZGFudHModGVuYW50SWQsIG9yZ1VuaXRJZCwgLi4uYXJncyk7XG4gICAgY29uc3QgaWRzID0gbmV3IFNldChkZXNjZW5kYW50cy5tYXAoKHJvdykgPT4gcmVsYXRpb25JZChyb3cuZGVzY2VuZGFudCkpKTtcbiAgICBpZiAoaW5jbHVkZVNlbGYpIGlkcy5hZGQob3JnVW5pdElkKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdFRlbmFudE9yZ1VuaXRzKHRlbmFudElkLCAuLi5hcmdzKSkuZmlsdGVyKChvcmdVbml0KSA9PiBpZHMuaGFzKG9yZ1VuaXQuaWQpKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RBbmNlc3Rvck9yZ1VuaXRzKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgaW5jbHVkZVNlbGYgPSBmYWxzZSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXRbXT4ge1xuICAgIGNvbnN0IGFuY2VzdG9ycyA9IGF3YWl0IG5ldyBPcmdVbml0Q2xvc3VyZVNlcnZpY2UoKS5saXN0QW5jZXN0b3JzKHRlbmFudElkLCBvcmdVbml0SWQsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IGlkcyA9IG5ldyBTZXQoYW5jZXN0b3JzLm1hcCgocm93KSA9PiByZWxhdGlvbklkKHJvdy5hbmNlc3RvcikpKTtcbiAgICBpZiAoaW5jbHVkZVNlbGYpIGlkcy5hZGQob3JnVW5pdElkKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdFRlbmFudE9yZ1VuaXRzKHRlbmFudElkLCAuLi5hcmdzKSkuZmlsdGVyKChvcmdVbml0KSA9PiBpZHMuaGFzKG9yZ1VuaXQuaWQpKTtcbiAgfVxuXG4gIGFzeW5jIHJlbmFtZU9yZ1VuaXQob3JnVW5pdElkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE9yZ1VuaXQ+IHtcbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMuZ2V0QnlJZChvcmdVbml0SWQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShcbiAgICAgIG9yZ1VuaXRJZCxcbiAgICAgIHsgbmFtZSwgcGF0aDogdGhpcy5vcmdVbml0UGF0aChleGlzdGluZy5wYXRoLmluY2x1ZGVzKFwiL1wiKSA/IGV4aXN0aW5nLnBhdGgucmVwbGFjZSgvXFwvW14vXSskLywgXCJcIikgOiB1bmRlZmluZWQsIG5hbWUpIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIEB0cmFuc2FjdGlvbmFsKClcbiAgYXN5bmMgbW92ZU9yZ1VuaXQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICBuZXdQYXJlbnRPcmdVbml0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXQ+IHtcbiAgICBjb25zdCBuZXdQYXJlbnQgPSBhd2FpdCB0aGlzLmdldEJ5SWQobmV3UGFyZW50T3JnVW5pdElkLCAuLi5hcmdzKTtcbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMuZ2V0QnlJZChvcmdVbml0SWQsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB0aGlzLnVwZGF0ZU9uZShcbiAgICAgIG9yZ1VuaXRJZCxcbiAgICAgIHtcbiAgICAgICAgcGFyZW50OiBuZXdQYXJlbnQuaWQsXG4gICAgICAgIHBhdGg6IHRoaXMub3JnVW5pdFBhdGgobmV3UGFyZW50LnBhdGgsIGV4aXN0aW5nLm5hbWUpLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGF3YWl0IHRoaXMucmVidWlsZFRlbmFudENsb3N1cmUodGVuYW50SWQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB1cGRhdGVkO1xuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyByZWJ1aWxkVGVuYW50Q2xvc3VyZSh0ZW5hbnRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNsb3N1cmVTZXJ2aWNlID0gbmV3IE9yZ1VuaXRDbG9zdXJlU2VydmljZSgpO1xuICAgIGNvbnN0IGV4aXN0aW5nTGlua3MgPSBhd2FpdCBjbG9zdXJlU2VydmljZS5saXN0QWxsKC4uLmFyZ3MpO1xuICAgIGF3YWl0IGRlbGV0ZVJvd3NCeUlkKFxuICAgICAgY2xvc3VyZVNlcnZpY2UsXG4gICAgICBleGlzdGluZ0xpbmtzLmZpbHRlcigocm93KSA9PiBzYW1lVGVuYW50KHJvdy50ZW5hbnQsIHRlbmFudElkKSksXG4gICAgICAuLi5hcmdzXG4gICAgKTtcblxuICAgIGNvbnN0IG9yZ1VuaXRzID0gKGF3YWl0IHRoaXMubGlzdFRlbmFudE9yZ1VuaXRzKHRlbmFudElkLCAuLi5hcmdzKSkuc29ydCgobGVmdCwgcmlnaHQpID0+IHtcbiAgICAgIGNvbnN0IGxlZnREZXB0aCA9IGxlZnQucGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pLmxlbmd0aDtcbiAgICAgIGNvbnN0IHJpZ2h0RGVwdGggPSByaWdodC5wYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlZnREZXB0aCAtIHJpZ2h0RGVwdGg7XG4gICAgfSk7XG5cbiAgICBmb3IgKGNvbnN0IG9yZ1VuaXQgb2Ygb3JnVW5pdHMpIHtcbiAgICAgIGF3YWl0IGNsb3N1cmVTZXJ2aWNlLmNyZWF0ZVNlbGZMaW5rKHRlbmFudElkLCBvcmdVbml0LmlkLCAuLi5hcmdzKTtcbiAgICAgIGlmIChvcmdVbml0LnBhcmVudCkge1xuICAgICAgICBhd2FpdCBjbG9zdXJlU2VydmljZS5pbnNlcnRBbmNlc3RvckxpbmtzRm9yTmV3Q2hpbGQoXG4gICAgICAgICAgdGVuYW50SWQsXG4gICAgICAgICAgcmVsYXRpb25JZChvcmdVbml0LnBhcmVudCksXG4gICAgICAgICAgb3JnVW5pdC5pZCxcbiAgICAgICAgICAuLi5hcmdzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyBkZWxldGVPcmdVbml0VHJlZSh0ZW5hbnRJZDogc3RyaW5nLCBvcmdVbml0SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjbG9zdXJlU2VydmljZSA9IG5ldyBPcmdVbml0Q2xvc3VyZVNlcnZpY2UoKTtcbiAgICBjb25zdCBkZXNjZW5kYW50cyA9IGF3YWl0IHRoaXMubGlzdERlc2NlbmRhbnRPcmdVbml0cyh0ZW5hbnRJZCwgb3JnVW5pdElkLCB0cnVlLCAuLi5hcmdzKTtcbiAgICBjb25zdCBkZXNjZW5kYW50SWRzID0gbmV3IFNldChkZXNjZW5kYW50cy5tYXAoKG9yZ1VuaXQpID0+IG9yZ1VuaXQuaWQpKTtcbiAgICBjb25zdCBvcmdVbml0cyA9IChhd2FpdCB0aGlzLmxpc3RUZW5hbnRPcmdVbml0cyh0ZW5hbnRJZCwgLi4uYXJncykpLmZpbHRlcigob3JnVW5pdCkgPT5cbiAgICAgIGRlc2NlbmRhbnRJZHMuaGFzKG9yZ1VuaXQuaWQpXG4gICAgKTtcbiAgICBhd2FpdCBkZWxldGVSb3dzQnlJZCh0aGlzLCBvcmdVbml0cywgLi4uYXJncyk7XG4gICAgYXdhaXQgY2xvc3VyZVNlcnZpY2UuZGVsZXRlTGlua3NGb3JTdWJ0cmVlKHRlbmFudElkLCBvcmdVbml0SWQsIC4uLmFyZ3MpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBDcmVhdGVVc2VySW5wdXQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFVzZXIgfSBmcm9tIFwiLi4vbW9kZWxzL3VzZXIubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIFVzZXJTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxVc2VyPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFVzZXIpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlVXNlcihpbnB1dDogQ3JlYXRlVXNlcklucHV0LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8VXNlcj4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgZW1haWw6IGlucHV0LmVtYWlsLFxuICAgICAgICBwaG9uZTogaW5wdXQucGhvbmUsXG4gICAgICAgIGRpc3BsYXlOYW1lOiBpbnB1dC5kaXNwbGF5TmFtZSxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGdldEJ5RW1haWwoZW1haWw6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFVzZXI+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmluZCgodXNlcikgPT4gdXNlci5lbWFpbCA9PT0gZW1haWwpIGFzIFVzZXI7XG4gIH1cblxuICBhc3luYyB1cGRhdGVEaXNwbGF5TmFtZSh1c2VySWQ6IHN0cmluZywgZGlzcGxheU5hbWU6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFVzZXI+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUodXNlcklkLCB7IGRpc3BsYXlOYW1lIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlRW1haWwodXNlcklkOiBzdHJpbmcsIGVtYWlsOiBzdHJpbmcgfCB1bmRlZmluZWQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxVc2VyPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKHVzZXJJZCwgeyBlbWFpbCB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZVBob25lKHVzZXJJZDogc3RyaW5nLCBwaG9uZTogc3RyaW5nIHwgdW5kZWZpbmVkLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8VXNlcj4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZSh1c2VySWQsIHsgcGhvbmUgfSwgLi4uYXJncyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHNhbWVUZW5hbnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IFByaW5jaXBhbEtpbmQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFByaW5jaXBhbCB9IGZyb20gXCIuLi9tb2RlbHMvcHJpbmNpcGFsLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBQcmluY2lwYWxTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxQcmluY2lwYWw+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoUHJpbmNpcGFsKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVByaW5jaXBhbChcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIGtpbmQ6IFByaW5jaXBhbEtpbmQsXG4gICAgc3ViamVjdElkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxQcmluY2lwYWw+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogdGVuYW50SWQsXG4gICAgICAgIGtpbmQsXG4gICAgICAgIHN1YmplY3RJZCxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGdldEZvclN1YmplY3QoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBraW5kOiBQcmluY2lwYWxLaW5kLFxuICAgIHN1YmplY3RJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UHJpbmNpcGFsIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbmQoXG4gICAgICAocHJpbmNpcGFsKSA9PlxuICAgICAgICBzYW1lVGVuYW50KHByaW5jaXBhbC50ZW5hbnQsIHRlbmFudElkKSAmJlxuICAgICAgICBwcmluY2lwYWwua2luZCA9PT0ga2luZCAmJlxuICAgICAgICBwcmluY2lwYWwuc3ViamVjdElkID09PSBzdWJqZWN0SWRcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZ2V0T3JDcmVhdGVGb3JTdWJqZWN0KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAga2luZDogUHJpbmNpcGFsS2luZCxcbiAgICBzdWJqZWN0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFByaW5jaXBhbD4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5nZXRGb3JTdWJqZWN0KHRlbmFudElkLCBraW5kLCBzdWJqZWN0SWQsIC4uLmFyZ3MpKSA/PyAoYXdhaXQgdGhpcy5jcmVhdGVQcmluY2lwYWwodGVuYW50SWQsIGtpbmQsIHN1YmplY3RJZCwgLi4uYXJncykpO1xuICB9XG5cbiAgYXN5bmMgZ2V0VXNlclByaW5jaXBhbCh0ZW5hbnRJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFByaW5jaXBhbD4ge1xuICAgIHJldHVybiB0aGlzLmdldE9yQ3JlYXRlRm9yU3ViamVjdCh0ZW5hbnRJZCwgUHJpbmNpcGFsS2luZC5Vc2VyLCB1c2VySWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgZ2V0R3JvdXBQcmluY2lwYWwodGVuYW50SWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8UHJpbmNpcGFsPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3JDcmVhdGVGb3JTdWJqZWN0KHRlbmFudElkLCBQcmluY2lwYWxLaW5kLkdyb3VwLCBncm91cElkLCAuLi5hcmdzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgcmVsYXRpb25NYXRjaCwgc2FtZVRlbmFudCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgTWVtYmVyc2hpcFN0YXR1cyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVGVuYW50TWVtYmVyc2hpcCB9IGZyb20gXCIuLi9tb2RlbHMvdGVuYW50LW1lbWJlcnNoaXAubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIFRlbmFudE1lbWJlcnNoaXBTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxUZW5hbnRNZW1iZXJzaGlwPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFRlbmFudE1lbWJlcnNoaXApO1xuICB9XG5cbiAgYXN5bmMgYWRkVXNlclRvVGVuYW50KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgc3RhdHVzOiBNZW1iZXJzaGlwU3RhdHVzID0gTWVtYmVyc2hpcFN0YXR1cy5BY3RpdmUsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxUZW5hbnRNZW1iZXJzaGlwPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IHRlbmFudElkLFxuICAgICAgICB1c2VyOiB1c2VySWQsXG4gICAgICAgIHN0YXR1cyxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHNldFN0YXR1cyhtZW1iZXJzaGlwSWQ6IHN0cmluZywgc3RhdHVzOiBNZW1iZXJzaGlwU3RhdHVzLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8VGVuYW50TWVtYmVyc2hpcD4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShtZW1iZXJzaGlwSWQsIHsgc3RhdHVzIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFVzZXJUZW5hbnRzKHVzZXJJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8VGVuYW50TWVtYmVyc2hpcFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigobWVtYmVyc2hpcCkgPT4gcmVsYXRpb25NYXRjaChtZW1iZXJzaGlwLnVzZXIsIHVzZXJJZCkpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFRlbmFudFVzZXJzKHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxUZW5hbnRNZW1iZXJzaGlwW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChtZW1iZXJzaGlwKSA9PiBzYW1lVGVuYW50KG1lbWJlcnNoaXAudGVuYW50LCB0ZW5hbnRJZCkpO1xuICB9XG5cbiAgYXN5bmMgcmVtb3ZlVXNlckZyb21UZW5hbnQobWVtYmVyc2hpcElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKG1lbWJlcnNoaXBJZCwgLi4uYXJncyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHJlbGF0aW9uTWF0Y2ggfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IE1lbWJlcnNoaXBTdGF0dXMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IE9yZ1VuaXRNZW1iZXJzaGlwIH0gZnJvbSBcIi4uL21vZGVscy9vcmctdW5pdC1tZW1iZXJzaGlwLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBPcmdVbml0TWVtYmVyc2hpcFNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPE9yZ1VuaXRNZW1iZXJzaGlwPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKE9yZ1VuaXRNZW1iZXJzaGlwKTtcbiAgfVxuXG4gIGFzeW5jIGFkZFVzZXJUb09yZ1VuaXQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgICBzdGF0dXM6IE1lbWJlcnNoaXBTdGF0dXMgPSBNZW1iZXJzaGlwU3RhdHVzLkFjdGl2ZSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXRNZW1iZXJzaGlwPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IHRlbmFudElkLFxuICAgICAgICBvcmdVbml0OiBvcmdVbml0SWQsXG4gICAgICAgIHVzZXI6IHVzZXJJZCxcbiAgICAgICAgc3RhdHVzLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgc2V0U3RhdHVzKG1lbWJlcnNoaXBJZDogc3RyaW5nLCBzdGF0dXM6IE1lbWJlcnNoaXBTdGF0dXMsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxPcmdVbml0TWVtYmVyc2hpcD4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShtZW1iZXJzaGlwSWQsIHsgc3RhdHVzIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFVzZXJPcmdVbml0cyh1c2VySWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE9yZ1VuaXRNZW1iZXJzaGlwW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChtZW1iZXJzaGlwKSA9PiByZWxhdGlvbk1hdGNoKG1lbWJlcnNoaXAudXNlciwgdXNlcklkKSk7XG4gIH1cblxuICBhc3luYyBsaXN0T3JnVW5pdFVzZXJzKG9yZ1VuaXRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8T3JnVW5pdE1lbWJlcnNoaXBbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKG1lbWJlcnNoaXApID0+IHJlbGF0aW9uTWF0Y2gobWVtYmVyc2hpcC5vcmdVbml0LCBvcmdVbml0SWQpKTtcbiAgfVxuXG4gIGFzeW5jIHJlbW92ZVVzZXJGcm9tT3JnVW5pdChtZW1iZXJzaGlwSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRlbGV0ZUJ5SWQobWVtYmVyc2hpcElkLCAuLi5hcmdzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgc2FtZVRlbmFudCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgR3JvdXAgfSBmcm9tIFwiLi4vbW9kZWxzL2dyb3VwLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBHcm91cFNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPEdyb3VwPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKEdyb3VwKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUdyb3VwKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG9yZ1VuaXRJZD86IHN0cmluZyxcbiAgICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8R3JvdXA+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogdGVuYW50SWQsXG4gICAgICAgIG9yZ1VuaXQ6IG9yZ1VuaXRJZCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyByZW5hbWVHcm91cChncm91cElkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPEdyb3VwPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKGdyb3VwSWQsIHsgbmFtZSB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIG1vdmVHcm91cFRvT3JnVW5pdChncm91cElkOiBzdHJpbmcsIG9yZ1VuaXRJZDogc3RyaW5nIHwgdW5kZWZpbmVkLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8R3JvdXA+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUoZ3JvdXBJZCwgeyBvcmdVbml0OiBvcmdVbml0SWQgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBsaXN0VGVuYW50R3JvdXBzKHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxHcm91cFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigoZ3JvdXApID0+IHNhbWVUZW5hbnQoZ3JvdXAudGVuYW50LCB0ZW5hbnRJZCkpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCByZWxhdGlvbklkLCByZWxhdGlvbk1hdGNoIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBHcm91cE1lbWJlcnNoaXAgfSBmcm9tIFwiLi4vbW9kZWxzL2dyb3VwLW1lbWJlcnNoaXAubW9kZWxcIjtcbmltcG9ydCB7IFByaW5jaXBhbFNlcnZpY2UgfSBmcm9tIFwiLi9wcmluY2lwYWwuc2VydmljZVwiO1xuXG5leHBvcnQgY2xhc3MgR3JvdXBNZW1iZXJzaGlwU2VydmljZSBleHRlbmRzIEJhc2VNb2RlbFNlcnZpY2U8R3JvdXBNZW1iZXJzaGlwPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKEdyb3VwTWVtYmVyc2hpcCk7XG4gIH1cblxuICBhc3luYyBhZGRQcmluY2lwYWxUb0dyb3VwKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgZ3JvdXBJZDogc3RyaW5nLFxuICAgIHByaW5jaXBhbElkOiBzdHJpbmcsXG4gICAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEdyb3VwTWVtYmVyc2hpcD4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiB0ZW5hbnRJZCxcbiAgICAgICAgZ3JvdXA6IGdyb3VwSWQsXG4gICAgICAgIHByaW5jaXBhbDogcHJpbmNpcGFsSWQsXG4gICAgICAgIG1ldGFkYXRhLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgbGlzdEdyb3VwTWVtYmVycyhncm91cElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxHcm91cE1lbWJlcnNoaXBbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKG1lbWJlcnNoaXApID0+IHJlbGF0aW9uTWF0Y2gobWVtYmVyc2hpcC5ncm91cCwgZ3JvdXBJZCkpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFByaW5jaXBhbEdyb3VwcyhwcmluY2lwYWxJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8R3JvdXBNZW1iZXJzaGlwW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChtZW1iZXJzaGlwKSA9PiByZWxhdGlvbk1hdGNoKG1lbWJlcnNoaXAucHJpbmNpcGFsLCBwcmluY2lwYWxJZCkpO1xuICB9XG5cbiAgYXN5bmMgcmVtb3ZlUHJpbmNpcGFsRnJvbUdyb3VwKG1lbWJlcnNoaXBJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGVsZXRlQnlJZChtZW1iZXJzaGlwSWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgcmVzb2x2ZUdyb3VwUHJpbmNpcGFsSWRzRm9yUHJpbmNpcGFsKHByaW5jaXBhbElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHByaW5jaXBhbFNlcnZpY2UgPSBuZXcgUHJpbmNpcGFsU2VydmljZSgpO1xuICAgIGNvbnN0IG1lbWJlcnNoaXBzID0gYXdhaXQgdGhpcy5saXN0UHJpbmNpcGFsR3JvdXBzKHByaW5jaXBhbElkLCAuLi5hcmdzKTtcbiAgICBjb25zdCBwcmluY2lwYWxzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtZW1iZXJzaGlwcy5tYXAoYXN5bmMgKG1lbWJlcnNoaXApID0+IHtcbiAgICAgICAgY29uc3QgdGVuYW50SWQgPSByZWxhdGlvbklkKG1lbWJlcnNoaXAudGVuYW50KTtcbiAgICAgICAgY29uc3QgZ3JvdXBJZCA9IHJlbGF0aW9uSWQobWVtYmVyc2hpcC5ncm91cCk7XG4gICAgICAgIGNvbnN0IHByaW5jaXBhbCA9IGF3YWl0IHByaW5jaXBhbFNlcnZpY2UuZ2V0R3JvdXBQcmluY2lwYWwodGVuYW50SWQsIGdyb3VwSWQsIC4uLmFyZ3MpO1xuICAgICAgICByZXR1cm4gcHJpbmNpcGFsLmlkO1xuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiBwcmluY2lwYWxzO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBQZXJtaXNzaW9uQ2F0ZWdvcnksIENyZWF0ZVBlcm1pc3Npb25JbnB1dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUGVybWlzc2lvbiB9IGZyb20gXCIuLi9tb2RlbHMvcGVybWlzc2lvbi5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvblNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFBlcm1pc3Npb24+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoUGVybWlzc2lvbik7XG4gIH1cblxuICBhc3luYyBjcmVhdGVQZXJtaXNzaW9uKGlucHV0OiBDcmVhdGVQZXJtaXNzaW9uSW5wdXQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQZXJtaXNzaW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICBrZXk6IGlucHV0LmtleSxcbiAgICAgICAgY2F0ZWdvcnk6IGlucHV0LmNhdGVnb3J5LFxuICAgICAgICBkZXNjcmlwdGlvbjogaW5wdXQuZGVzY3JpcHRpb24sXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBnZXRCeUtleShrZXk6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFBlcm1pc3Npb24+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmluZCgocGVybWlzc2lvbikgPT4gcGVybWlzc2lvbi5rZXkgPT09IGtleSkgYXMgUGVybWlzc2lvbjtcbiAgfVxuXG4gIGFzeW5jIGxpc3RCeUNhdGVnb3J5KGNhdGVnb3J5OiBQZXJtaXNzaW9uQ2F0ZWdvcnksIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQZXJtaXNzaW9uW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChwZXJtaXNzaW9uKSA9PiBwZXJtaXNzaW9uLmNhdGVnb3J5ID09PSBjYXRlZ29yeSk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVEZXNjcmlwdGlvbihwZXJtaXNzaW9uSWQ6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFBlcm1pc3Npb24+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUocGVybWlzc2lvbklkLCB7IGRlc2NyaXB0aW9uIH0sIC4uLmFyZ3MpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCBzYW1lVGVuYW50IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBDcmVhdGVSb2xlSW5wdXQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJvbGUgfSBmcm9tIFwiLi4vbW9kZWxzL3JvbGUubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIFJvbGVTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxSb2xlPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFJvbGUpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlUm9sZShpbnB1dDogQ3JlYXRlUm9sZUlucHV0LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Um9sZT4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAga2V5OiBpbnB1dC5rZXksXG4gICAgICAgIG5hbWU6IGlucHV0Lm5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBpbnB1dC5kZXNjcmlwdGlvbixcbiAgICAgICAgbWV0YWRhdGE6IGlucHV0Lm1ldGFkYXRhLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZ2V0U3lzdGVtUm9sZUJ5S2V5KGtleTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Um9sZT4ge1xuICAgIGNvbnN0IHJvbGUgPSAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maW5kKChjYW5kaWRhdGUpID0+ICFjYW5kaWRhdGUudGVuYW50ICYmIGNhbmRpZGF0ZS5rZXkgPT09IGtleSk7XG4gICAgaWYgKCFyb2xlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJvbGUgXCIke2tleX1cIiBub3QgZm91bmRgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJvbGU7XG4gIH1cblxuICBhc3luYyBnZXRUZW5hbnRSb2xlQnlLZXkodGVuYW50SWQ6IHN0cmluZywga2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSb2xlPiB7XG4gICAgY29uc3Qgcm9sZSA9IChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbmQoXG4gICAgICAoY2FuZGlkYXRlKSA9PiBzYW1lVGVuYW50KGNhbmRpZGF0ZS50ZW5hbnQsIHRlbmFudElkKSAmJiBjYW5kaWRhdGUua2V5ID09PSBrZXlcbiAgICApO1xuICAgIGlmICghcm9sZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSb2xlIFwiJHtrZXl9XCIgbm90IGZvdW5kIGZvciB0ZW5hbnQgJHt0ZW5hbnRJZH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJvbGU7XG4gIH1cblxuICBhc3luYyByZW5hbWVSb2xlKHJvbGVJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSb2xlPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKHJvbGVJZCwgeyBuYW1lIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlUm9sZU1ldGFkYXRhKFxuICAgIHJvbGVJZDogc3RyaW5nLFxuICAgIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJvbGU+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUocm9sZUlkLCB7IG1ldGFkYXRhIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFRlbmFudFJvbGVzKHRlbmFudElkOiBzdHJpbmcsIGluY2x1ZGVTeXN0ZW0gPSBmYWxzZSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFJvbGVbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKHJvbGUpID0+XG4gICAgICBpbmNsdWRlU3lzdGVtID8gIXJvbGUudGVuYW50IHx8IHNhbWVUZW5hbnQocm9sZS50ZW5hbnQsIHRlbmFudElkKSA6IHNhbWVUZW5hbnQocm9sZS50ZW5hbnQsIHRlbmFudElkKVxuICAgICk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHJlbGF0aW9uTWF0Y2ggfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IFJvbGVQZXJtaXNzaW9uIH0gZnJvbSBcIi4uL21vZGVscy9yb2xlLXBlcm1pc3Npb24ubW9kZWxcIjtcbmltcG9ydCB7IFBlcm1pc3Npb25TZXJ2aWNlIH0gZnJvbSBcIi4vcGVybWlzc2lvbi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBSb2xlU2VydmljZSB9IGZyb20gXCIuL3JvbGUuc2VydmljZVwiO1xuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVSb3dzQnlJZChcbiAgc2VydmljZTogQmFzZU1vZGVsU2VydmljZTxhbnk+LFxuICByb3dzOiBBcnJheTx7IGlkOiBzdHJpbmcgfT4sXG4gIC4uLmFyZ3M6IGFueVtdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgIGF3YWl0IHNlcnZpY2UuZGVsZXRlQnlJZChyb3cuaWQsIC4uLmFyZ3MpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSb2xlUGVybWlzc2lvblNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFJvbGVQZXJtaXNzaW9uPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFJvbGVQZXJtaXNzaW9uKTtcbiAgfVxuXG4gIGFzeW5jIGFkZFBlcm1pc3Npb25Ub1JvbGUocm9sZUlkOiBzdHJpbmcsIHBlcm1pc3Npb25JZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Um9sZVBlcm1pc3Npb24+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHJvbGU6IHJvbGVJZCxcbiAgICAgICAgcGVybWlzc2lvbjogcGVybWlzc2lvbklkLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgYWRkUGVybWlzc2lvbktleVRvUm9sZShyb2xlSWQ6IHN0cmluZywgcGVybWlzc2lvbktleTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Um9sZVBlcm1pc3Npb24+IHtcbiAgICBjb25zdCBwZXJtaXNzaW9uID0gYXdhaXQgbmV3IFBlcm1pc3Npb25TZXJ2aWNlKCkuZ2V0QnlLZXkocGVybWlzc2lvbktleSwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRkUGVybWlzc2lvblRvUm9sZShyb2xlSWQsIHBlcm1pc3Npb24uaWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgcmVtb3ZlUGVybWlzc2lvbkZyb21Sb2xlKHJvbGVQZXJtaXNzaW9uSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRlbGV0ZUJ5SWQocm9sZVBlcm1pc3Npb25JZCwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBsaXN0Um9sZVBlcm1pc3Npb25zKHJvbGVJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Um9sZVBlcm1pc3Npb25bXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKHJvbGVQZXJtaXNzaW9uKSA9PiByZWxhdGlvbk1hdGNoKHJvbGVQZXJtaXNzaW9uLnJvbGUsIHJvbGVJZCkpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFBlcm1pc3Npb25Sb2xlcyhwZXJtaXNzaW9uSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFJvbGVQZXJtaXNzaW9uW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChyb2xlUGVybWlzc2lvbikgPT4gcmVsYXRpb25NYXRjaChyb2xlUGVybWlzc2lvbi5wZXJtaXNzaW9uLCBwZXJtaXNzaW9uSWQpKTtcbiAgfVxuXG4gIGFzeW5jIHJlcGxhY2VSb2xlUGVybWlzc2lvbnMocm9sZUlkOiBzdHJpbmcsIHBlcm1pc3Npb25JZHM6IHN0cmluZ1tdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Um9sZVBlcm1pc3Npb25bXT4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5saXN0Um9sZVBlcm1pc3Npb25zKHJvbGVJZCwgLi4uYXJncyk7XG4gICAgYXdhaXQgZGVsZXRlUm93c0J5SWQodGhpcywgZXhpc3RpbmcsIC4uLmFyZ3MpO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChwZXJtaXNzaW9uSWRzLm1hcCgocGVybWlzc2lvbklkKSA9PiB0aGlzLmFkZFBlcm1pc3Npb25Ub1JvbGUocm9sZUlkLCBwZXJtaXNzaW9uSWQsIC4uLmFyZ3MpKSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVSb2xlV2l0aFBlcm1pc3Npb25zKFxuICAgIGlucHV0OiBpbXBvcnQoXCIuLi90eXBlc1wiKS5DcmVhdGVSb2xlSW5wdXQsXG4gICAgcGVybWlzc2lvbktleXM6IHN0cmluZ1tdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8aW1wb3J0KFwiLi4vbW9kZWxzL3JvbGUubW9kZWxcIikuUm9sZT4ge1xuICAgIGNvbnN0IHJvbGUgPSBhd2FpdCBuZXcgUm9sZVNlcnZpY2UoKS5jcmVhdGVSb2xlKGlucHV0LCAuLi5hcmdzKTtcbiAgICBmb3IgKGNvbnN0IHBlcm1pc3Npb25LZXkgb2YgcGVybWlzc2lvbktleXMpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRkUGVybWlzc2lvbktleVRvUm9sZShyb2xlLmlkLCBwZXJtaXNzaW9uS2V5LCAuLi5hcmdzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJvbGU7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHJlbGF0aW9uTWF0Y2gsIHNhbWVUZW5hbnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEFzc2lnblJvbGVJbnB1dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUm9sZUFzc2lnbm1lbnQgfSBmcm9tIFwiLi4vbW9kZWxzL3JvbGUtYXNzaWdubWVudC5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgUm9sZUFzc2lnbm1lbnRTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxSb2xlQXNzaWdubWVudD4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihSb2xlQXNzaWdubWVudCk7XG4gIH1cblxuICBhc3luYyBhc3NpZ25Sb2xlKFxuICAgIGlucHV0OiBBc3NpZ25Sb2xlSW5wdXQsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSb2xlQXNzaWdubWVudD4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgcHJpbmNpcGFsOiBpbnB1dC5wcmluY2lwYWxJZCxcbiAgICAgICAgcm9sZTogaW5wdXQucm9sZUlkLFxuICAgICAgICBzY29wZUtpbmQ6IGlucHV0LnNjb3BlS2luZCxcbiAgICAgICAgc2NvcGVJZDogaW5wdXQuc2NvcGVJZCxcbiAgICAgICAgaW5oZXJpdERvd246IGlucHV0LmluaGVyaXREb3duID8/IGZhbHNlLFxuICAgICAgICBzdGFydHNBdDogaW5wdXQuc3RhcnRzQXQsXG4gICAgICAgIGV4cGlyZXNBdDogaW5wdXQuZXhwaXJlc0F0LFxuICAgICAgICBjb25kaXRpb25zOiBpbnB1dC5jb25kaXRpb25zLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgcmV2b2tlQXNzaWdubWVudChhc3NpZ25tZW50SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRlbGV0ZUJ5SWQoYXNzaWdubWVudElkLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RQcmluY2lwYWxBc3NpZ25tZW50cyhcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHByaW5jaXBhbElkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSb2xlQXNzaWdubWVudFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcihcbiAgICAgIChhc3NpZ25tZW50KSA9PlxuICAgICAgICBzYW1lVGVuYW50KGFzc2lnbm1lbnQudGVuYW50LCB0ZW5hbnRJZCkgJiZcbiAgICAgICAgcmVsYXRpb25NYXRjaChhc3NpZ25tZW50LnByaW5jaXBhbCwgcHJpbmNpcGFsSWQpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RSb2xlQXNzaWdubWVudHMoXG4gICAgcm9sZUlkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSb2xlQXNzaWdubWVudFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigoYXNzaWdubWVudCkgPT5cbiAgICAgIHJlbGF0aW9uTWF0Y2goYXNzaWdubWVudC5yb2xlLCByb2xlSWQpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RUZW5hbnRBc3NpZ25tZW50cyhcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Um9sZUFzc2lnbm1lbnRbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKGFzc2lnbm1lbnQpID0+XG4gICAgICBzYW1lVGVuYW50KGFzc2lnbm1lbnQudGVuYW50LCB0ZW5hbnRJZClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlQXNzaWdubWVudFdpbmRvdyhcbiAgICBhc3NpZ25tZW50SWQ6IHN0cmluZyxcbiAgICBzdGFydHNBdDogRGF0ZSB8IHVuZGVmaW5lZCxcbiAgICBleHBpcmVzQXQ6IERhdGUgfCB1bmRlZmluZWQsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSb2xlQXNzaWdubWVudD4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShhc3NpZ25tZW50SWQsIHsgc3RhcnRzQXQsIGV4cGlyZXNBdCB9LCAuLi5hcmdzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgcmVsYXRpb25JZCwgcmVsYXRpb25NYXRjaCwgc2FtZVRlbmFudCwgdHJhbnNhY3Rpb25hbCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgRWZmZWN0aXZlUGVybWlzc2lvblNuYXBzaG90LCBTY29wZUtpbmQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IEVmZmVjdGl2ZVBlcm1pc3Npb24gfSBmcm9tIFwiLi4vbW9kZWxzL2VmZmVjdGl2ZS1wZXJtaXNzaW9uLm1vZGVsXCI7XG5pbXBvcnQgeyBSb2xlQXNzaWdubWVudFNlcnZpY2UgfSBmcm9tIFwiLi9yb2xlLWFzc2lnbm1lbnQuc2VydmljZVwiO1xuaW1wb3J0IHsgUm9sZVBlcm1pc3Npb25TZXJ2aWNlIH0gZnJvbSBcIi4vcm9sZS1wZXJtaXNzaW9uLnNlcnZpY2VcIjtcbmltcG9ydCB7IFBlcm1pc3Npb25TZXJ2aWNlIH0gZnJvbSBcIi4vcGVybWlzc2lvbi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBHcm91cE1lbWJlcnNoaXBTZXJ2aWNlIH0gZnJvbSBcIi4vZ3JvdXAtbWVtYmVyc2hpcC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBQcmluY2lwYWxTZXJ2aWNlIH0gZnJvbSBcIi4vcHJpbmNpcGFsLnNlcnZpY2VcIjtcbmltcG9ydCB7IE9yZ1VuaXRDbG9zdXJlU2VydmljZSB9IGZyb20gXCIuL29yZy11bml0LWNsb3N1cmUuc2VydmljZVwiO1xuaW1wb3J0IHsgSW5oZXJpdGFuY2VCbG9ja1NlcnZpY2UgfSBmcm9tIFwiLi9pbmhlcml0YW5jZS1ibG9jay5zZXJ2aWNlXCI7XG5cbmV4cG9ydCBjbGFzcyBFZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZSBleHRlbmRzIEJhc2VNb2RlbFNlcnZpY2U8RWZmZWN0aXZlUGVybWlzc2lvbj4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihFZmZlY3RpdmVQZXJtaXNzaW9uKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RGb3JQcmluY2lwYWwodGVuYW50SWQ6IHN0cmluZywgcHJpbmNpcGFsSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPEVmZmVjdGl2ZVBlcm1pc3Npb25bXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoXG4gICAgICAocGVybWlzc2lvbikgPT4gc2FtZVRlbmFudChwZXJtaXNzaW9uLnRlbmFudCwgdGVuYW50SWQpICYmIHJlbGF0aW9uTWF0Y2gocGVybWlzc2lvbi5wcmluY2lwYWwsIHByaW5jaXBhbElkKVxuICAgICk7XG4gIH1cblxuICBhc3luYyBsaXN0Rm9yU2NvcGUoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBzY29wZUtpbmQ6IFNjb3BlS2luZCxcbiAgICBzY29wZUlkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxFZmZlY3RpdmVQZXJtaXNzaW9uW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKFxuICAgICAgKHBlcm1pc3Npb24pID0+IHNhbWVUZW5hbnQocGVybWlzc2lvbi50ZW5hbnQsIHRlbmFudElkKSAmJiBwZXJtaXNzaW9uLnNjb3BlS2luZCA9PT0gc2NvcGVLaW5kICYmIHBlcm1pc3Npb24uc2NvcGVJZCA9PT0gc2NvcGVJZFxuICAgICk7XG4gIH1cblxuICBhc3luYyBoYXNQZXJtaXNzaW9uKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgcHJpbmNpcGFsSWQ6IHN0cmluZyxcbiAgICBwZXJtaXNzaW9uS2V5OiBzdHJpbmcsXG4gICAgc2NvcGVLaW5kOiBTY29wZUtpbmQsXG4gICAgc2NvcGVJZDogc3RyaW5nLFxuICAgIGF0PzogRGF0ZSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEZvclByaW5jaXBhbCh0ZW5hbnRJZCwgcHJpbmNpcGFsSWQsIC4uLmFyZ3MpKS5zb21lKFxuICAgICAgKHBlcm1pc3Npb24pID0+XG4gICAgICAgIHBlcm1pc3Npb24ucGVybWlzc2lvbktleSA9PT0gcGVybWlzc2lvbktleSAmJlxuICAgICAgICBwZXJtaXNzaW9uLnNjb3BlS2luZCA9PT0gc2NvcGVLaW5kICYmXG4gICAgICAgIHBlcm1pc3Npb24uc2NvcGVJZCA9PT0gc2NvcGVJZCAmJlxuICAgICAgICAoIXBlcm1pc3Npb24uc3RhcnRzQXQgfHwgIWF0IHx8IHBlcm1pc3Npb24uc3RhcnRzQXQgPD0gYXQpICYmXG4gICAgICAgICghcGVybWlzc2lvbi5leHBpcmVzQXQgfHwgIWF0IHx8IHBlcm1pc3Npb24uZXhwaXJlc0F0ID49IGF0KVxuICAgICk7XG4gIH1cblxuICBhc3luYyBkZWxldGVGb3JQcmluY2lwYWwodGVuYW50SWQ6IHN0cmluZywgcHJpbmNpcGFsSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiBhd2FpdCB0aGlzLmxpc3RGb3JQcmluY2lwYWwodGVuYW50SWQsIHByaW5jaXBhbElkLCAuLi5hcmdzKSkge1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKHJvdy5pZCwgLi4uYXJncyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlRm9yVGVuYW50KHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCByb3cgb2YgKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChwZXJtaXNzaW9uKSA9PiBzYW1lVGVuYW50KHBlcm1pc3Npb24udGVuYW50LCB0ZW5hbnRJZCkpKSB7XG4gICAgICBhd2FpdCB0aGlzLmRlbGV0ZUJ5SWQocm93LmlkLCAuLi5hcmdzKTtcbiAgICB9XG4gIH1cblxuICBAdHJhbnNhY3Rpb25hbCgpXG4gIGFzeW5jIHJlYnVpbGRGb3JQcmluY2lwYWwodGVuYW50SWQ6IHN0cmluZywgcHJpbmNpcGFsSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPEVmZmVjdGl2ZVBlcm1pc3Npb25bXT4ge1xuICAgIGF3YWl0IHRoaXMuZGVsZXRlRm9yUHJpbmNpcGFsKHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncyk7XG5cbiAgICBjb25zdCByb2xlQXNzaWdubWVudFNlcnZpY2UgPSBuZXcgUm9sZUFzc2lnbm1lbnRTZXJ2aWNlKCk7XG4gICAgY29uc3Qgcm9sZVBlcm1pc3Npb25TZXJ2aWNlID0gbmV3IFJvbGVQZXJtaXNzaW9uU2VydmljZSgpO1xuICAgIGNvbnN0IHBlcm1pc3Npb25TZXJ2aWNlID0gbmV3IFBlcm1pc3Npb25TZXJ2aWNlKCk7XG4gICAgY29uc3QgZ3JvdXBNZW1iZXJzaGlwU2VydmljZSA9IG5ldyBHcm91cE1lbWJlcnNoaXBTZXJ2aWNlKCk7XG4gICAgY29uc3QgcHJpbmNpcGFsU2VydmljZSA9IG5ldyBQcmluY2lwYWxTZXJ2aWNlKCk7XG4gICAgY29uc3Qgb3JnVW5pdENsb3N1cmVTZXJ2aWNlID0gbmV3IE9yZ1VuaXRDbG9zdXJlU2VydmljZSgpO1xuICAgIGNvbnN0IGluaGVyaXRhbmNlQmxvY2tTZXJ2aWNlID0gbmV3IEluaGVyaXRhbmNlQmxvY2tTZXJ2aWNlKCk7XG5cbiAgICBjb25zdCBtYXRlcmlhbGl6ZWQ6IEVmZmVjdGl2ZVBlcm1pc3Npb25TbmFwc2hvdFtdID0gW107XG4gICAgY29uc3Qgc291cmNlQXNzaWdubWVudHMgPSBhd2FpdCByb2xlQXNzaWdubWVudFNlcnZpY2UubGlzdFByaW5jaXBhbEFzc2lnbm1lbnRzKHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncyk7XG4gICAgY29uc3QgZ3JvdXBNZW1iZXJzaGlwcyA9IGF3YWl0IGdyb3VwTWVtYmVyc2hpcFNlcnZpY2UubGlzdFByaW5jaXBhbEdyb3VwcyhwcmluY2lwYWxJZCwgLi4uYXJncyk7XG4gICAgY29uc3QgZ3JvdXBBc3NpZ25tZW50cyA9IChcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBncm91cE1lbWJlcnNoaXBzLm1hcChhc3luYyAobWVtYmVyc2hpcCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGdyb3VwUHJpbmNpcGFsID0gYXdhaXQgcHJpbmNpcGFsU2VydmljZS5nZXRHcm91cFByaW5jaXBhbChyZWxhdGlvbklkKG1lbWJlcnNoaXAudGVuYW50KSwgcmVsYXRpb25JZChtZW1iZXJzaGlwLmdyb3VwKSwgLi4uYXJncyk7XG4gICAgICAgICAgcmV0dXJuIHJvbGVBc3NpZ25tZW50U2VydmljZS5saXN0UHJpbmNpcGFsQXNzaWdubWVudHModGVuYW50SWQsIGdyb3VwUHJpbmNpcGFsLmlkLCAuLi5hcmdzKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApLmZsYXQoKTtcblxuICAgIGNvbnN0IGFzc2lnbm1lbnRzID0gWy4uLnNvdXJjZUFzc2lnbm1lbnRzLCAuLi5ncm91cEFzc2lnbm1lbnRzXTtcbiAgICBmb3IgKGNvbnN0IGFzc2lnbm1lbnQgb2YgYXNzaWdubWVudHMpIHtcbiAgICAgIGNvbnN0IHJvbGVQZXJtaXNzaW9ucyA9IGF3YWl0IHJvbGVQZXJtaXNzaW9uU2VydmljZS5saXN0Um9sZVBlcm1pc3Npb25zKHJlbGF0aW9uSWQoYXNzaWdubWVudC5yb2xlKSwgLi4uYXJncyk7XG4gICAgICBjb25zdCBwZXJtaXNzaW9ucyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICByb2xlUGVybWlzc2lvbnMubWFwKGFzeW5jIChyb2xlUGVybWlzc2lvbikgPT5cbiAgICAgICAgICBwZXJtaXNzaW9uU2VydmljZS5maW5kT25lQnkoXCJpZFwiLCByZWxhdGlvbklkKHJvbGVQZXJtaXNzaW9uLnBlcm1pc3Npb24pIGFzIG5ldmVyLCAuLi5hcmdzKVxuICAgICAgICApXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBwZXJtaXNzaW9uIG9mIHBlcm1pc3Npb25zKSB7XG4gICAgICAgIGlmICghcGVybWlzc2lvbikgY29udGludWU7XG4gICAgICAgIGNvbnN0IHNjb3BlS2luZCA9IGFzc2lnbm1lbnQuc2NvcGVLaW5kO1xuICAgICAgICBjb25zdCBzY29wZUlkID0gYXNzaWdubWVudC5zY29wZUlkO1xuICAgICAgICBjb25zdCBzY29wZXM6IEFycmF5PHsgc2NvcGVLaW5kOiBTY29wZUtpbmQ7IHNjb3BlSWQ6IHN0cmluZyB9PiA9IFtdO1xuICAgICAgICBpZiAoc2NvcGVLaW5kID09PSBTY29wZUtpbmQuVGVuYW50KSB7XG4gICAgICAgICAgc2NvcGVzLnB1c2goeyBzY29wZUtpbmQsIHNjb3BlSWQ6IHRlbmFudElkIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHNjb3BlS2luZCA9PT0gU2NvcGVLaW5kLlJlc291cmNlKSB7XG4gICAgICAgICAgc2NvcGVzLnB1c2goeyBzY29wZUtpbmQsIHNjb3BlSWQgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2NvcGVLaW5kID09PSBTY29wZUtpbmQuT3JnVW5pdCAmJiAhYXNzaWdubWVudC5pbmhlcml0RG93bikge1xuICAgICAgICAgIHNjb3Blcy5wdXNoKHsgc2NvcGVLaW5kLCBzY29wZUlkIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHNjb3BlS2luZCA9PT0gU2NvcGVLaW5kLk9yZ1VuaXQgJiYgYXNzaWdubWVudC5pbmhlcml0RG93bikge1xuICAgICAgICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gYXdhaXQgb3JnVW5pdENsb3N1cmVTZXJ2aWNlLmxpc3REZXNjZW5kYW50cyh0ZW5hbnRJZCwgc2NvcGVJZCwgLi4uYXJncyk7XG4gICAgICAgICAgc2NvcGVzLnB1c2goLi4uZGVzY2VuZGFudHMubWFwKChyb3cpID0+ICh7IHNjb3BlS2luZCwgc2NvcGVJZDogcmVsYXRpb25JZChyb3cuZGVzY2VuZGFudCkgfSkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qgc2NvcGVkIG9mIHNjb3Blcykge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHNjb3BlS2luZCA9PT0gU2NvcGVLaW5kLk9yZ1VuaXQgJiZcbiAgICAgICAgICAgIGFzc2lnbm1lbnQuaW5oZXJpdERvd24gJiZcbiAgICAgICAgICAgIHNjb3BlZC5zY29wZUlkICE9PSBzY29wZUlkICYmXG4gICAgICAgICAgICAoYXdhaXQgaW5oZXJpdGFuY2VCbG9ja1NlcnZpY2UuY2F0ZWdvcnlCbG9ja2VkRm9yQW5jZXN0b3IoXG4gICAgICAgICAgICAgIHRlbmFudElkLFxuICAgICAgICAgICAgICBzY29wZWQuc2NvcGVJZCxcbiAgICAgICAgICAgICAgc2NvcGVJZCxcbiAgICAgICAgICAgICAgcGVybWlzc2lvbi5jYXRlZ29yeSxcbiAgICAgICAgICAgICAgLi4uYXJnc1xuICAgICAgICAgICAgKSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtYXRlcmlhbGl6ZWQucHVzaCh7XG4gICAgICAgICAgICBpZDogXCJcIixcbiAgICAgICAgICAgIHRlbmFudElkLFxuICAgICAgICAgICAgcHJpbmNpcGFsSWQsXG4gICAgICAgICAgICBwZXJtaXNzaW9uS2V5OiBwZXJtaXNzaW9uLmtleSxcbiAgICAgICAgICAgIHNjb3BlS2luZDogc2NvcGVkLnNjb3BlS2luZCxcbiAgICAgICAgICAgIHNjb3BlSWQ6IHNjb3BlZC5zY29wZUlkLFxuICAgICAgICAgICAgc291cmNlS2luZDogXCJyb2xlX2Fzc2lnbm1lbnRcIixcbiAgICAgICAgICAgIHNvdXJjZUlkOiBhc3NpZ25tZW50LmlkLFxuICAgICAgICAgICAgc3RhcnRzQXQ6IGFzc2lnbm1lbnQuc3RhcnRzQXQsXG4gICAgICAgICAgICBleHBpcmVzQXQ6IGFzc2lnbm1lbnQuZXhwaXJlc0F0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbWF0ZXJpYWxpemVkLm1hcCgocGVybWlzc2lvbikgPT5cbiAgICAgICAgdGhpcy5jcmVhdGUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGVuYW50OiBwZXJtaXNzaW9uLnRlbmFudElkLFxuICAgICAgICAgICAgcHJpbmNpcGFsOiBwZXJtaXNzaW9uLnByaW5jaXBhbElkLFxuICAgICAgICAgICAgcGVybWlzc2lvbktleTogcGVybWlzc2lvbi5wZXJtaXNzaW9uS2V5LFxuICAgICAgICAgICAgc2NvcGVLaW5kOiBwZXJtaXNzaW9uLnNjb3BlS2luZCxcbiAgICAgICAgICAgIHNjb3BlSWQ6IHBlcm1pc3Npb24uc2NvcGVJZCxcbiAgICAgICAgICAgIHNvdXJjZUtpbmQ6IHBlcm1pc3Npb24uc291cmNlS2luZCxcbiAgICAgICAgICAgIHNvdXJjZUlkOiBwZXJtaXNzaW9uLnNvdXJjZUlkLFxuICAgICAgICAgICAgc3RhcnRzQXQ6IHBlcm1pc3Npb24uc3RhcnRzQXQsXG4gICAgICAgICAgICBleHBpcmVzQXQ6IHBlcm1pc3Npb24uZXhwaXJlc0F0LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uYXJnc1xuICAgICAgICApXG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm4gY3JlYXRlZDtcbiAgfVxuXG4gIEB0cmFuc2FjdGlvbmFsKClcbiAgYXN5bmMgcmVidWlsZEZvclRlbmFudCh0ZW5hbnRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHByaW5jaXBhbHMgPSAoYXdhaXQgbmV3IFByaW5jaXBhbFNlcnZpY2UoKS5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKHByaW5jaXBhbCkgPT4gc2FtZVRlbmFudChwcmluY2lwYWwudGVuYW50LCB0ZW5hbnRJZCkpO1xuICAgIGZvciAoY29uc3QgcHJpbmNpcGFsIG9mIHByaW5jaXBhbHMpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVidWlsZEZvclByaW5jaXBhbCh0ZW5hbnRJZCwgcHJpbmNpcGFsLmlkLCAuLi5hcmdzKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHJlbGF0aW9uTWF0Y2gsIHNhbWVUZW5hbnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IFJlZ2lzdGVyUmVzb3VyY2VJbnB1dCwgUmVzb3VyY2VWaXNpYmlsaXR5IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBQcm90ZWN0ZWRSZXNvdXJjZSB9IGZyb20gXCIuLi9tb2RlbHMvcHJvdGVjdGVkLXJlc291cmNlLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBQcm90ZWN0ZWRSZXNvdXJjZVNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFByb3RlY3RlZFJlc291cmNlPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFByb3RlY3RlZFJlc291cmNlKTtcbiAgfVxuXG4gIGFzeW5jIHJlZ2lzdGVyUmVzb3VyY2UoaW5wdXQ6IFJlZ2lzdGVyUmVzb3VyY2VJbnB1dCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFByb3RlY3RlZFJlc291cmNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IGlucHV0LnRlbmFudElkLFxuICAgICAgICBvcmdVbml0OiBpbnB1dC5vcmdVbml0SWQsXG4gICAgICAgIHJlc291cmNlVHlwZTogaW5wdXQucmVzb3VyY2VUeXBlLFxuICAgICAgICByZXNvdXJjZUlkOiBpbnB1dC5yZXNvdXJjZUlkLFxuICAgICAgICB2aXNpYmlsaXR5OiBpbnB1dC52aXNpYmlsaXR5LFxuICAgICAgICBvd25lcjogaW5wdXQub3duZXJQcmluY2lwYWxJZCxcbiAgICAgICAgc2Vuc2l0aXZpdHk6IGlucHV0LnNlbnNpdGl2aXR5LFxuICAgICAgICBtZXRhZGF0YTogaW5wdXQubWV0YWRhdGEsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBnZXRCeURvbWFpblJlc291cmNlKHRlbmFudElkOiBzdHJpbmcsIHJlc291cmNlVHlwZTogc3RyaW5nLCByZXNvdXJjZUlkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQcm90ZWN0ZWRSZXNvdXJjZSB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maW5kKFxuICAgICAgKHJlc291cmNlKSA9PiBzYW1lVGVuYW50KHJlc291cmNlLnRlbmFudCwgdGVuYW50SWQpICYmIHJlc291cmNlLnJlc291cmNlVHlwZSA9PT0gcmVzb3VyY2VUeXBlICYmIHJlc291cmNlLnJlc291cmNlSWQgPT09IHJlc291cmNlSWRcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgbW92ZVJlc291cmNlVG9PcmdVbml0KHByb3RlY3RlZFJlc291cmNlSWQ6IHN0cmluZywgb3JnVW5pdElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQcm90ZWN0ZWRSZXNvdXJjZT4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShwcm90ZWN0ZWRSZXNvdXJjZUlkLCB7IG9yZ1VuaXQ6IG9yZ1VuaXRJZCB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIHNldFZpc2liaWxpdHkocHJvdGVjdGVkUmVzb3VyY2VJZDogc3RyaW5nLCB2aXNpYmlsaXR5OiBSZXNvdXJjZVZpc2liaWxpdHksIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQcm90ZWN0ZWRSZXNvdXJjZT4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShwcm90ZWN0ZWRSZXNvdXJjZUlkLCB7IHZpc2liaWxpdHkgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyB0cmFuc2Zlck93bmVyc2hpcChwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcsIG93bmVyUHJpbmNpcGFsSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFByb3RlY3RlZFJlc291cmNlPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKHByb3RlY3RlZFJlc291cmNlSWQsIHsgb3duZXI6IG93bmVyUHJpbmNpcGFsSWQgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBsaXN0T3JnVW5pdFJlc291cmNlcyhvcmdVbml0SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFByb3RlY3RlZFJlc291cmNlW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChyZXNvdXJjZSkgPT4gcmVsYXRpb25NYXRjaChyZXNvdXJjZS5vcmdVbml0LCBvcmdVbml0SWQpKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RUZW5hbnRSZXNvdXJjZXModGVuYW50SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFByb3RlY3RlZFJlc291cmNlW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChyZXNvdXJjZSkgPT4gc2FtZVRlbmFudChyZXNvdXJjZS50ZW5hbnQsIHRlbmFudElkKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHJlbGF0aW9uTWF0Y2gsIHNhbWVUZW5hbnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEdyYW50UmVzb3VyY2VJbnB1dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUmVzb3VyY2VHcmFudCB9IGZyb20gXCIuLi9tb2RlbHMvcmVzb3VyY2UtZ3JhbnQubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIFJlc291cmNlR3JhbnRTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxSZXNvdXJjZUdyYW50PiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFJlc291cmNlR3JhbnQpO1xuICB9XG5cbiAgYXN5bmMgZ3JhbnRSZXNvdXJjZShpbnB1dDogR3JhbnRSZXNvdXJjZUlucHV0LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8UmVzb3VyY2VHcmFudD4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgcmVzb3VyY2U6IGlucHV0LnJlc291cmNlSWQsXG4gICAgICAgIHByaW5jaXBhbDogaW5wdXQucHJpbmNpcGFsSWQsXG4gICAgICAgIHBlcm1pc3Npb25LZXk6IGlucHV0LnBlcm1pc3Npb25LZXksXG4gICAgICAgIHN0YXJ0c0F0OiBpbnB1dC5zdGFydHNBdCxcbiAgICAgICAgZXhwaXJlc0F0OiBpbnB1dC5leHBpcmVzQXQsXG4gICAgICAgIGNvbmRpdGlvbnM6IGlucHV0LmNvbmRpdGlvbnMsXG4gICAgICAgIGNyZWF0ZWRCeTogaW5wdXQuY3JlYXRlZEJ5UHJpbmNpcGFsSWQsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyByZXZva2VHcmFudChncmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKGdyYW50SWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFJlc291cmNlR3JhbnRzKHByb3RlY3RlZFJlc291cmNlSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFJlc291cmNlR3JhbnRbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKGdyYW50KSA9PiByZWxhdGlvbk1hdGNoKGdyYW50LnJlc291cmNlLCBwcm90ZWN0ZWRSZXNvdXJjZUlkKSk7XG4gIH1cblxuICBhc3luYyBsaXN0UHJpbmNpcGFsR3JhbnRzKHRlbmFudElkOiBzdHJpbmcsIHByaW5jaXBhbElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSZXNvdXJjZUdyYW50W10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKFxuICAgICAgKGdyYW50KSA9PiBzYW1lVGVuYW50KGdyYW50LnRlbmFudCwgdGVuYW50SWQpICYmIHJlbGF0aW9uTWF0Y2goZ3JhbnQucHJpbmNpcGFsLCBwcmluY2lwYWxJZClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgaGFzR3JhbnQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBwcmluY2lwYWxJZDogc3RyaW5nLFxuICAgIHByb3RlY3RlZFJlc291cmNlSWQ6IHN0cmluZyxcbiAgICBwZXJtaXNzaW9uS2V5OiBzdHJpbmcsXG4gICAgYXQ/OiBEYXRlLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0UHJpbmNpcGFsR3JhbnRzKHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncykpLnNvbWUoXG4gICAgICAoZ3JhbnQpID0+XG4gICAgICAgIHJlbGF0aW9uTWF0Y2goZ3JhbnQucmVzb3VyY2UsIHByb3RlY3RlZFJlc291cmNlSWQpICYmXG4gICAgICAgIGdyYW50LnBlcm1pc3Npb25LZXkgPT09IHBlcm1pc3Npb25LZXkgJiZcbiAgICAgICAgKCFncmFudC5zdGFydHNBdCB8fCAhYXQgfHwgZ3JhbnQuc3RhcnRzQXQgPD0gYXQpICYmXG4gICAgICAgICghZ3JhbnQuZXhwaXJlc0F0IHx8ICFhdCB8fCBncmFudC5leHBpcmVzQXQgPj0gYXQpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUFsbEZvclJlc291cmNlKHByb3RlY3RlZFJlc291cmNlSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiBhd2FpdCB0aGlzLmxpc3RSZXNvdXJjZUdyYW50cyhwcm90ZWN0ZWRSZXNvdXJjZUlkLCAuLi5hcmdzKSkge1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKHJvdy5pZCwgLi4uYXJncyk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBQcm90ZWN0ZWRSZXNvdXJjZVNlcnZpY2UgfSBmcm9tIFwiLi9wcm90ZWN0ZWQtcmVzb3VyY2Uuc2VydmljZVwiO1xuaW1wb3J0IHsgUmVzb3VyY2VHcmFudFNlcnZpY2UgfSBmcm9tIFwiLi9yZXNvdXJjZS1ncmFudC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyByZWxhdGlvbklkIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBSZXNvdXJjZVZpc2liaWxpdHkgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGNsYXNzIFJlc291cmNlTGlmZWN5Y2xlU2VydmljZSB7XG4gIGFzeW5jIHVucmVnaXN0ZXJSZXNvdXJjZShwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbmV3IFJlc291cmNlR3JhbnRTZXJ2aWNlKCkuZGVsZXRlQWxsRm9yUmVzb3VyY2UocHJvdGVjdGVkUmVzb3VyY2VJZCwgLi4uYXJncyk7XG4gICAgYXdhaXQgbmV3IFByb3RlY3RlZFJlc291cmNlU2VydmljZSgpLmRlbGV0ZUJ5SWQocHJvdGVjdGVkUmVzb3VyY2VJZCwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyByZXNvbHZlUmVzb3VyY2VTY29wZShcbiAgICBwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTx7XG4gICAgdGVuYW50SWQ6IHN0cmluZztcbiAgICBvcmdVbml0SWQ6IHN0cmluZztcbiAgICB2aXNpYmlsaXR5OiBSZXNvdXJjZVZpc2liaWxpdHk7XG4gICAgb3duZXJQcmluY2lwYWxJZD86IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gYXdhaXQgbmV3IFByb3RlY3RlZFJlc291cmNlU2VydmljZSgpLmdldEJ5SWQocHJvdGVjdGVkUmVzb3VyY2VJZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRlbmFudElkOiByZWxhdGlvbklkKHJlc291cmNlLnRlbmFudCksXG4gICAgICBvcmdVbml0SWQ6IHJlbGF0aW9uSWQocmVzb3VyY2Uub3JnVW5pdCksXG4gICAgICB2aXNpYmlsaXR5OiByZXNvdXJjZS52aXNpYmlsaXR5LFxuICAgICAgb3duZXJQcmluY2lwYWxJZDogcmVzb3VyY2Uub3duZXIgPyByZWxhdGlvbklkKHJlc291cmNlLm93bmVyKSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCByZWxhdGlvbklkIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBDcmVhdGVTdG9yYWdlQmluZGluZ0lucHV0LCBTdG9yYWdlQmluZGluZ0tpbmQsIFN0b3JhZ2VLaW5kIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBTdG9yYWdlQmluZGluZyB9IGZyb20gXCIuLi9tb2RlbHMvc3RvcmFnZS1iaW5kaW5nLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBTdG9yYWdlQmluZGluZ1NlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFN0b3JhZ2VCaW5kaW5nPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFN0b3JhZ2VCaW5kaW5nKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUJpbmRpbmcoaW5wdXQ6IENyZWF0ZVN0b3JhZ2VCaW5kaW5nSW5wdXQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxTdG9yYWdlQmluZGluZz4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgc3RvcmFnZUtpbmQ6IGlucHV0LnN0b3JhZ2VLaW5kLFxuICAgICAgICBiaW5kaW5nS2luZDogaW5wdXQuYmluZGluZ0tpbmQsXG4gICAgICAgIGJpbmRpbmdLZXk6IGlucHV0LmJpbmRpbmdLZXksXG4gICAgICAgIHJlZ2lvbjogaW5wdXQucmVnaW9uLFxuICAgICAgICBjb25maWc6IGlucHV0LmNvbmZpZyxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RUZW5hbnRCaW5kaW5ncyh0ZW5hbnRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8U3RvcmFnZUJpbmRpbmdbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKGJpbmRpbmcpID0+IHJlbGF0aW9uSWQoYmluZGluZy50ZW5hbnQpID09PSB0ZW5hbnRJZCk7XG4gIH1cblxuICBhc3luYyBnZXRCaW5kaW5nKHRlbmFudElkOiBzdHJpbmcsIHN0b3JhZ2VLaW5kOiBTdG9yYWdlS2luZCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFN0b3JhZ2VCaW5kaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RUZW5hbnRCaW5kaW5ncyh0ZW5hbnRJZCwgLi4uYXJncykpLmZpbmQoKGJpbmRpbmcpID0+IGJpbmRpbmcuc3RvcmFnZUtpbmQgPT09IHN0b3JhZ2VLaW5kKTtcbiAgfVxuXG4gIGFzeW5jIHNldEJpbmRpbmdDb25maWcoXG4gICAgYmluZGluZ0lkOiBzdHJpbmcsXG4gICAgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFN0b3JhZ2VCaW5kaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKGJpbmRpbmdJZCwgeyBjb25maWcgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBwcm9tb3RlVG9EZWRpY2F0ZWQoXG4gICAgYmluZGluZ0lkOiBzdHJpbmcsXG4gICAgYmluZGluZ0tleTogc3RyaW5nLFxuICAgIHJlZ2lvbjogc3RyaW5nLFxuICAgIGNvbmZpZz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8U3RvcmFnZUJpbmRpbmc+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUoYmluZGluZ0lkLCB7IGJpbmRpbmdLaW5kOiBTdG9yYWdlQmluZGluZ0tpbmQuRGVkaWNhdGVkLCBiaW5kaW5nS2V5LCByZWdpb24sIGNvbmZpZyB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIHNldFNoYXJlZChcbiAgICBiaW5kaW5nSWQ6IHN0cmluZyxcbiAgICBiaW5kaW5nS2V5OiBzdHJpbmcsXG4gICAgcmVnaW9uOiBzdHJpbmcsXG4gICAgY29uZmlnPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxTdG9yYWdlQmluZGluZz4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShiaW5kaW5nSWQsIHsgYmluZGluZ0tpbmQ6IFN0b3JhZ2VCaW5kaW5nS2luZC5TaGFyZWQsIGJpbmRpbmdLZXksIHJlZ2lvbiwgY29uZmlnIH0sIC4uLmFyZ3MpO1xuICB9XG59XG4iLCJpbXBvcnQgeyB0cmFuc2FjdGlvbmFsIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEJvb3RzdHJhcE9yZ1VuaXQsIEJvb3RzdHJhcFRlbXBsYXRlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBNZW1iZXJzaGlwU3RhdHVzLCBTY29wZUtpbmQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFRlbmFudFNlcnZpY2UgfSBmcm9tIFwiLi90ZW5hbnQuc2VydmljZVwiO1xuaW1wb3J0IHsgVGVuYW50UHJvZmlsZVNlcnZpY2UgfSBmcm9tIFwiLi90ZW5hbnQtcHJvZmlsZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBPcmdVbml0U2VydmljZSB9IGZyb20gXCIuL29yZy11bml0LnNlcnZpY2VcIjtcbmltcG9ydCB7IE9yZ1VuaXRQcm9maWxlU2VydmljZSB9IGZyb20gXCIuL29yZy11bml0LXByb2ZpbGUuc2VydmljZVwiO1xuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tIFwiLi91c2VyLnNlcnZpY2VcIjtcbmltcG9ydCB7IFRlbmFudE1lbWJlcnNoaXBTZXJ2aWNlIH0gZnJvbSBcIi4vdGVuYW50LW1lbWJlcnNoaXAuc2VydmljZVwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsU2VydmljZSB9IGZyb20gXCIuL3ByaW5jaXBhbC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gXCIuL3Blcm1pc3Npb24uc2VydmljZVwiO1xuaW1wb3J0IHsgUm9sZVNlcnZpY2UgfSBmcm9tIFwiLi9yb2xlLnNlcnZpY2VcIjtcbmltcG9ydCB7IFJvbGVQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gXCIuL3JvbGUtcGVybWlzc2lvbi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBSb2xlQXNzaWdubWVudFNlcnZpY2UgfSBmcm9tIFwiLi9yb2xlLWFzc2lnbm1lbnQuc2VydmljZVwiO1xuaW1wb3J0IHsgRWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UgfSBmcm9tIFwiLi9lZmZlY3RpdmUtcGVybWlzc2lvbi5zZXJ2aWNlXCI7XG5cbmV4cG9ydCBjbGFzcyBCb290c3RyYXBTZXJ2aWNlIHtcbiAgcHJpdmF0ZSB0ZW5hbnRTZXJ2aWNlID0gbmV3IFRlbmFudFNlcnZpY2UoKTtcbiAgcHJpdmF0ZSB0ZW5hbnRQcm9maWxlU2VydmljZSA9IG5ldyBUZW5hbnRQcm9maWxlU2VydmljZSgpO1xuICBwcml2YXRlIG9yZ1VuaXRTZXJ2aWNlID0gbmV3IE9yZ1VuaXRTZXJ2aWNlKCk7XG4gIHByaXZhdGUgb3JnVW5pdFByb2ZpbGVTZXJ2aWNlID0gbmV3IE9yZ1VuaXRQcm9maWxlU2VydmljZSgpO1xuICBwcml2YXRlIHVzZXJTZXJ2aWNlID0gbmV3IFVzZXJTZXJ2aWNlKCk7XG4gIHByaXZhdGUgbWVtYmVyc2hpcFNlcnZpY2UgPSBuZXcgVGVuYW50TWVtYmVyc2hpcFNlcnZpY2UoKTtcbiAgcHJpdmF0ZSBwcmluY2lwYWxTZXJ2aWNlID0gbmV3IFByaW5jaXBhbFNlcnZpY2UoKTtcbiAgcHJpdmF0ZSBwZXJtaXNzaW9uU2VydmljZSA9IG5ldyBQZXJtaXNzaW9uU2VydmljZSgpO1xuICBwcml2YXRlIHJvbGVTZXJ2aWNlID0gbmV3IFJvbGVTZXJ2aWNlKCk7XG4gIHByaXZhdGUgcm9sZVBlcm1pc3Npb25TZXJ2aWNlID0gbmV3IFJvbGVQZXJtaXNzaW9uU2VydmljZSgpO1xuICBwcml2YXRlIHJvbGVBc3NpZ25tZW50U2VydmljZSA9IG5ldyBSb2xlQXNzaWdubWVudFNlcnZpY2UoKTtcbiAgcHJpdmF0ZSBlZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZSA9IG5ldyBFZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZSgpO1xuXG4gIEB0cmFuc2FjdGlvbmFsKClcbiAgYXN5bmMgYm9vdHN0cmFwVGVuYW50RnJvbVRlbXBsYXRlKFxuICAgIHRlbXBsYXRlOiBCb290c3RyYXBUZW1wbGF0ZSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHtcbiAgICB0ZW5hbnRJZDogc3RyaW5nO1xuICAgIHJvb3RPcmdVbml0SWQ6IHN0cmluZztcbiAgICBvd25lclVzZXJJZDogc3RyaW5nO1xuICAgIG93bmVyUHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IHRlbmFudCA9IGF3YWl0IHRoaXMudGVuYW50U2VydmljZS5jcmVhdGVUZW5hbnQoXG4gICAgICB0ZW1wbGF0ZS50ZW5hbnQsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBpZiAodGVtcGxhdGUudGVuYW50LnByb2ZpbGVLZXkpIHtcbiAgICAgIGF3YWl0IHRoaXMudGVuYW50UHJvZmlsZVNlcnZpY2UuY3JlYXRlUHJvZmlsZShcbiAgICAgICAgdGVuYW50LmlkLFxuICAgICAgICB0ZW1wbGF0ZS50ZW5hbnQucHJvZmlsZUtleSxcbiAgICAgICAgdGVtcGxhdGUudGVuYW50LnByb2ZpbGVNZXRhZGF0YSxcbiAgICAgICAgLi4uYXJnc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjcmVhdGVPcmdUcmVlID0gYXN5bmMgKFxuICAgICAgcGFyZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgIG9yZ1VuaXQ6IEJvb3RzdHJhcE9yZ1VuaXRcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IGNyZWF0ZWQgPVxuICAgICAgICBwYXJlbnRJZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBhd2FpdCB0aGlzLm9yZ1VuaXRTZXJ2aWNlLmNyZWF0ZVJvb3QoXG4gICAgICAgICAgICAgIHRlbmFudC5pZCxcbiAgICAgICAgICAgICAgb3JnVW5pdC5uYW1lLFxuICAgICAgICAgICAgICBvcmdVbml0Lm1ldGFkYXRhLFxuICAgICAgICAgICAgICBvcmdVbml0LnByb2ZpbGVLZXksXG4gICAgICAgICAgICAgIG9yZ1VuaXQubWV0YWRhdGEsXG4gICAgICAgICAgICAgIC4uLmFyZ3NcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IGF3YWl0IHRoaXMub3JnVW5pdFNlcnZpY2UuY3JlYXRlQ2hpbGQoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0ZW5hbnRJZDogdGVuYW50LmlkLFxuICAgICAgICAgICAgICAgIHBhcmVudE9yZ1VuaXRJZDogcGFyZW50SWQsXG4gICAgICAgICAgICAgICAgbmFtZTogb3JnVW5pdC5uYW1lLFxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBvcmdVbml0Lm1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIHByb2ZpbGVLZXk6IG9yZ1VuaXQucHJvZmlsZUtleSxcbiAgICAgICAgICAgICAgICBwcm9maWxlTWV0YWRhdGE6IG9yZ1VuaXQubWV0YWRhdGEsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIC4uLmFyZ3NcbiAgICAgICAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG9yZ1VuaXQuY2hpbGRyZW4gPz8gW10pIHtcbiAgICAgICAgYXdhaXQgY3JlYXRlT3JnVHJlZShjcmVhdGVkLmlkLCBjaGlsZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9O1xuXG4gICAgY29uc3Qgcm9vdE9yZ1VuaXQgPSBhd2FpdCBjcmVhdGVPcmdUcmVlKHVuZGVmaW5lZCwgdGVtcGxhdGUucm9vdE9yZ1VuaXQpO1xuICAgIGNvbnN0IG93bmVyID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5jcmVhdGVVc2VyKFxuICAgICAgdGVtcGxhdGUub3duZXJVc2VyLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgYXdhaXQgdGhpcy5tZW1iZXJzaGlwU2VydmljZS5hZGRVc2VyVG9UZW5hbnQoXG4gICAgICB0ZW5hbnQuaWQsXG4gICAgICBvd25lci5pZCxcbiAgICAgIE1lbWJlcnNoaXBTdGF0dXMuQWN0aXZlLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgY29uc3Qgb3duZXJQcmluY2lwYWwgPSBhd2FpdCB0aGlzLnByaW5jaXBhbFNlcnZpY2UuZ2V0VXNlclByaW5jaXBhbChcbiAgICAgIHRlbmFudC5pZCxcbiAgICAgIG93bmVyLmlkLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IHBlcm1pc3Npb24gb2YgdGVtcGxhdGUucGVybWlzc2lvbnMpIHtcbiAgICAgIGF3YWl0IHRoaXMucGVybWlzc2lvblNlcnZpY2UuY3JlYXRlUGVybWlzc2lvbihwZXJtaXNzaW9uLCAuLi5hcmdzKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCByb2xlIG9mIHRlbXBsYXRlLnJvbGVzKSB7XG4gICAgICBjb25zdCBjcmVhdGVkUm9sZSA9IGF3YWl0IHRoaXMucm9sZVNlcnZpY2UuY3JlYXRlUm9sZShcbiAgICAgICAge1xuICAgICAgICAgIHRlbmFudElkOiB0ZW5hbnQuaWQsXG4gICAgICAgICAga2V5OiByb2xlLmtleSxcbiAgICAgICAgICBuYW1lOiByb2xlLm5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHJvbGUuZGVzY3JpcHRpb24sXG4gICAgICAgIH0sXG4gICAgICAgIC4uLmFyZ3NcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IHBlcm1pc3Npb25LZXkgb2Ygcm9sZS5wZXJtaXNzaW9uS2V5cykge1xuICAgICAgICBhd2FpdCB0aGlzLnJvbGVQZXJtaXNzaW9uU2VydmljZS5hZGRQZXJtaXNzaW9uS2V5VG9Sb2xlKFxuICAgICAgICAgIGNyZWF0ZWRSb2xlLmlkLFxuICAgICAgICAgIHBlcm1pc3Npb25LZXksXG4gICAgICAgICAgLi4uYXJnc1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG93bmVyUm9sZSA9IGF3YWl0IHRoaXMucm9sZVNlcnZpY2UuZ2V0VGVuYW50Um9sZUJ5S2V5KFxuICAgICAgdGVuYW50LmlkLFxuICAgICAgdGVtcGxhdGUub3duZXJSb2xlS2V5LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgYXdhaXQgdGhpcy5yb2xlQXNzaWdubWVudFNlcnZpY2UuYXNzaWduUm9sZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50SWQ6IHRlbmFudC5pZCxcbiAgICAgICAgcHJpbmNpcGFsSWQ6IG93bmVyUHJpbmNpcGFsLmlkLFxuICAgICAgICByb2xlSWQ6IG93bmVyUm9sZS5pZCxcbiAgICAgICAgc2NvcGVLaW5kOiBTY29wZUtpbmQuT3JnVW5pdCxcbiAgICAgICAgc2NvcGVJZDogcm9vdE9yZ1VuaXQuaWQsXG4gICAgICAgIGluaGVyaXREb3duOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGF3YWl0IHRoaXMuZWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UucmVidWlsZEZvclByaW5jaXBhbChcbiAgICAgIHRlbmFudC5pZCxcbiAgICAgIG93bmVyUHJpbmNpcGFsLmlkLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGVuYW50SWQ6IHRlbmFudC5pZCxcbiAgICAgIHJvb3RPcmdVbml0SWQ6IHJvb3RPcmdVbml0LmlkLFxuICAgICAgb3duZXJVc2VySWQ6IG93bmVyLmlkLFxuICAgICAgb3duZXJQcmluY2lwYWxJZDogb3duZXJQcmluY2lwYWwuaWQsXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgdHJhbnNhY3Rpb25hbCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgTWVtYmVyc2hpcFN0YXR1cywgU2NvcGVLaW5kIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW5hbnRNZW1iZXJzaGlwU2VydmljZSB9IGZyb20gXCIuL3RlbmFudC1tZW1iZXJzaGlwLnNlcnZpY2VcIjtcbmltcG9ydCB7IE9yZ1VuaXRNZW1iZXJzaGlwU2VydmljZSB9IGZyb20gXCIuL29yZy11bml0LW1lbWJlcnNoaXAuc2VydmljZVwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsU2VydmljZSB9IGZyb20gXCIuL3ByaW5jaXBhbC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBSb2xlU2VydmljZSB9IGZyb20gXCIuL3JvbGUuc2VydmljZVwiO1xuaW1wb3J0IHsgUm9sZUFzc2lnbm1lbnRTZXJ2aWNlIH0gZnJvbSBcIi4vcm9sZS1hc3NpZ25tZW50LnNlcnZpY2VcIjtcbmltcG9ydCB7IEVmZmVjdGl2ZVBlcm1pc3Npb25TZXJ2aWNlIH0gZnJvbSBcIi4vZWZmZWN0aXZlLXBlcm1pc3Npb24uc2VydmljZVwiO1xuXG5leHBvcnQgY2xhc3MgU3lzdGVtTWFuYWdlbWVudFNlcnZpY2Uge1xuICBwcml2YXRlIG1lbWJlcnNoaXBTZXJ2aWNlID0gbmV3IFRlbmFudE1lbWJlcnNoaXBTZXJ2aWNlKCk7XG4gIHByaXZhdGUgb3JnTWVtYmVyc2hpcFNlcnZpY2UgPSBuZXcgT3JnVW5pdE1lbWJlcnNoaXBTZXJ2aWNlKCk7XG4gIHByaXZhdGUgcHJpbmNpcGFsU2VydmljZSA9IG5ldyBQcmluY2lwYWxTZXJ2aWNlKCk7XG4gIHByaXZhdGUgcm9sZVNlcnZpY2UgPSBuZXcgUm9sZVNlcnZpY2UoKTtcbiAgcHJpdmF0ZSByb2xlQXNzaWdubWVudFNlcnZpY2UgPSBuZXcgUm9sZUFzc2lnbm1lbnRTZXJ2aWNlKCk7XG4gIHByaXZhdGUgZWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UgPSBuZXcgRWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UoKTtcblxuICBAdHJhbnNhY3Rpb25hbCgpXG4gIGFzeW5jIG9uYm9hcmRVc2VyVG9UZW5hbnRBbmRPcmdVbml0KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgcm9sZUtleTogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8eyBwcmluY2lwYWxJZDogc3RyaW5nIH0+IHtcbiAgICBhd2FpdCB0aGlzLm1lbWJlcnNoaXBTZXJ2aWNlLmFkZFVzZXJUb1RlbmFudCh0ZW5hbnRJZCwgdXNlcklkLCBNZW1iZXJzaGlwU3RhdHVzLkFjdGl2ZSwgLi4uYXJncyk7XG4gICAgYXdhaXQgdGhpcy5vcmdNZW1iZXJzaGlwU2VydmljZS5hZGRVc2VyVG9PcmdVbml0KHRlbmFudElkLCBvcmdVbml0SWQsIHVzZXJJZCwgTWVtYmVyc2hpcFN0YXR1cy5BY3RpdmUsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IHByaW5jaXBhbCA9IGF3YWl0IHRoaXMucHJpbmNpcGFsU2VydmljZS5nZXRVc2VyUHJpbmNpcGFsKHRlbmFudElkLCB1c2VySWQsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IHJvbGUgPSBhd2FpdCB0aGlzLnJvbGVTZXJ2aWNlLmdldFRlbmFudFJvbGVCeUtleSh0ZW5hbnRJZCwgcm9sZUtleSwgLi4uYXJncyk7XG4gICAgYXdhaXQgdGhpcy5yb2xlQXNzaWdubWVudFNlcnZpY2UuYXNzaWduUm9sZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50SWQsXG4gICAgICAgIHByaW5jaXBhbElkOiBwcmluY2lwYWwuaWQsXG4gICAgICAgIHJvbGVJZDogcm9sZS5pZCxcbiAgICAgICAgc2NvcGVLaW5kOiBTY29wZUtpbmQuT3JnVW5pdCxcbiAgICAgICAgc2NvcGVJZDogb3JnVW5pdElkLFxuICAgICAgICBpbmhlcml0RG93bjogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLmVmZmVjdGl2ZVBlcm1pc3Npb25TZXJ2aWNlLnJlYnVpbGRGb3JQcmluY2lwYWwodGVuYW50SWQsIHByaW5jaXBhbC5pZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHsgcHJpbmNpcGFsSWQ6IHByaW5jaXBhbC5pZCB9O1xuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyBjaGFuZ2VVc2VyT3JnUm9sZShcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHByaW5jaXBhbElkOiBzdHJpbmcsXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgcm9sZUtleTogc3RyaW5nLFxuICAgIGluaGVyaXREb3duOiBib29sZWFuLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJvbGUgPSBhd2FpdCB0aGlzLnJvbGVTZXJ2aWNlLmdldFRlbmFudFJvbGVCeUtleSh0ZW5hbnRJZCwgcm9sZUtleSwgLi4uYXJncyk7XG4gICAgY29uc3QgY3VycmVudEFzc2lnbm1lbnRzID0gYXdhaXQgdGhpcy5yb2xlQXNzaWdubWVudFNlcnZpY2UubGlzdFByaW5jaXBhbEFzc2lnbm1lbnRzKHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncyk7XG4gICAgZm9yIChjb25zdCBhc3NpZ25tZW50IG9mIGN1cnJlbnRBc3NpZ25tZW50cy5maWx0ZXIoKHJvdykgPT4gcm93LnNjb3BlS2luZCA9PT0gU2NvcGVLaW5kLk9yZ1VuaXQgJiYgcm93LnNjb3BlSWQgPT09IG9yZ1VuaXRJZCkpIHtcbiAgICAgIGF3YWl0IHRoaXMucm9sZUFzc2lnbm1lbnRTZXJ2aWNlLnJldm9rZUFzc2lnbm1lbnQoYXNzaWdubWVudC5pZCwgLi4uYXJncyk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMucm9sZUFzc2lnbm1lbnRTZXJ2aWNlLmFzc2lnblJvbGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudElkLFxuICAgICAgICBwcmluY2lwYWxJZCxcbiAgICAgICAgcm9sZUlkOiByb2xlLmlkLFxuICAgICAgICBzY29wZUtpbmQ6IFNjb3BlS2luZC5PcmdVbml0LFxuICAgICAgICBzY29wZUlkOiBvcmdVbml0SWQsXG4gICAgICAgIGluaGVyaXREb3duLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGF3YWl0IHRoaXMuZWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UucmVidWlsZEZvclByaW5jaXBhbCh0ZW5hbnRJZCwgcHJpbmNpcGFsSWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyBzdXNwZW5kVXNlckluVGVuYW50KHRlbmFudE1lbWJlcnNoaXBJZDogc3RyaW5nLCB0ZW5hbnRJZDogc3RyaW5nLCBwcmluY2lwYWxJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMubWVtYmVyc2hpcFNlcnZpY2Uuc2V0U3RhdHVzKHRlbmFudE1lbWJlcnNoaXBJZCwgTWVtYmVyc2hpcFN0YXR1cy5TdXNwZW5kZWQsIC4uLmFyZ3MpO1xuICAgIGF3YWl0IHRoaXMuZWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UuZGVsZXRlRm9yUHJpbmNpcGFsKHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncyk7XG4gIH1cblxuICBAdHJhbnNhY3Rpb25hbCgpXG4gIGFzeW5jIHJlYWN0aXZhdGVVc2VySW5UZW5hbnQodGVuYW50TWVtYmVyc2hpcElkOiBzdHJpbmcsIHRlbmFudElkOiBzdHJpbmcsIHByaW5jaXBhbElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5tZW1iZXJzaGlwU2VydmljZS5zZXRTdGF0dXModGVuYW50TWVtYmVyc2hpcElkLCBNZW1iZXJzaGlwU3RhdHVzLkFjdGl2ZSwgLi4uYXJncyk7XG4gICAgYXdhaXQgdGhpcy5lZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZS5yZWJ1aWxkRm9yUHJpbmNpcGFsKHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgQXV0aHpEYXRhU291cmNlcyxcbiAgQ2FuQWNjZXNzSW5wdXQsXG4gIFJlc291cmNlVmlzaWJpbGl0eSxcbiAgU2NvcGVLaW5kLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGFzQXJyYXksXG4gIGJ1aWxkQWNjZXNzQ29udGV4dCxcbiAgYnVpbGRBcmFuZ29Db250ZXh0LFxuICBidWlsZFFkcmFudEZpbHRlcixcbiAgaXNUaW1lVmFsaWQsXG59IGZyb20gXCIuLi91dGlsc1wiO1xuXG5mdW5jdGlvbiBzY29wZUtleShzY29wZUtpbmQ6IFNjb3BlS2luZCwgc2NvcGVJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3Njb3BlS2luZH06JHtzY29wZUlkfWA7XG59XG5cbmV4cG9ydCBjbGFzcyBBdXRoelNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFTb3VyY2VzOiBBdXRoekRhdGFTb3VyY2VzO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGFTb3VyY2VzOiBBdXRoekRhdGFTb3VyY2VzID0ge30pIHtcbiAgICB0aGlzLmRhdGFTb3VyY2VzID0gZGF0YVNvdXJjZXM7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGFzeW5jIGNhbkFjY2VzcyhpbnB1dDogQ2FuQWNjZXNzSW5wdXQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgYXQgPSBpbnB1dC5hdCA/PyBuZXcgRGF0ZSgpO1xuXG4gICAgaWYgKGlucHV0LnNjb3BlS2luZCAmJiBpbnB1dC5zY29wZUlkKSB7XG4gICAgICBjb25zdCBwZXJtaXNzaW9ucyA9XG4gICAgICAgIGF3YWl0IHRoaXMuZGF0YVNvdXJjZXMubGlzdEVmZmVjdGl2ZVBlcm1pc3Npb25zRm9yU2NvcGU/LihcbiAgICAgICAgICBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgICBpbnB1dC5zY29wZUtpbmQsXG4gICAgICAgICAgaW5wdXQuc2NvcGVJZFxuICAgICAgICApO1xuICAgICAgcmV0dXJuIGFzQXJyYXkocGVybWlzc2lvbnMpLnNvbWUoXG4gICAgICAgIChwZXJtaXNzaW9uKSA9PlxuICAgICAgICAgIHBlcm1pc3Npb24ucGVybWlzc2lvbktleSA9PT0gaW5wdXQucGVybWlzc2lvbktleSAmJlxuICAgICAgICAgIGlzVGltZVZhbGlkKGF0LCBwZXJtaXNzaW9uLnN0YXJ0c0F0LCBwZXJtaXNzaW9uLmV4cGlyZXNBdClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFpbnB1dC5yZXNvdXJjZVByb3RlY3RlZElkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IHRoaXMuZGF0YVNvdXJjZXMubG9hZFJlc291cmNlPy4oXG4gICAgICBpbnB1dC50ZW5hbnRJZCxcbiAgICAgIGlucHV0LnJlc291cmNlUHJvdGVjdGVkSWRcbiAgICApO1xuICAgIGlmICghcmVzb3VyY2UpIHJldHVybiBmYWxzZTtcbiAgICBpZiAocmVzb3VyY2UudGVuYW50SWQgIT09IGlucHV0LnRlbmFudElkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAocmVzb3VyY2Uub3duZXJQcmluY2lwYWxJZCA9PT0gaW5wdXQucHJpbmNpcGFsSWQpIHJldHVybiB0cnVlO1xuXG4gICAgY29uc3QgZ3JhbnRzID0gYXNBcnJheShcbiAgICAgIGF3YWl0IHRoaXMuZGF0YVNvdXJjZXMubGlzdFJlc291cmNlR3JhbnRzPy4oXG4gICAgICAgIGlucHV0LnRlbmFudElkLFxuICAgICAgICBpbnB1dC5yZXNvdXJjZVByb3RlY3RlZElkXG4gICAgICApXG4gICAgKS5maWx0ZXIoXG4gICAgICAoZ3JhbnQpID0+XG4gICAgICAgIGdyYW50LnByaW5jaXBhbElkID09PSBpbnB1dC5wcmluY2lwYWxJZCAmJlxuICAgICAgICBncmFudC5wZXJtaXNzaW9uS2V5ID09PSBpbnB1dC5wZXJtaXNzaW9uS2V5ICYmXG4gICAgICAgIGlzVGltZVZhbGlkKGF0LCBncmFudC5zdGFydHNBdCwgZ3JhbnQuZXhwaXJlc0F0KVxuICAgICk7XG4gICAgaWYgKGdyYW50cy5sZW5ndGggPiAwKSByZXR1cm4gdHJ1ZTtcblxuICAgIGNvbnN0IHZpc2liaWxpdHkgPSByZXNvdXJjZS52aXNpYmlsaXR5O1xuICAgIGlmIChcbiAgICAgIHZpc2liaWxpdHkgPT09IFJlc291cmNlVmlzaWJpbGl0eS5Qcml2YXRlIHx8XG4gICAgICB2aXNpYmlsaXR5ID09PSBSZXNvdXJjZVZpc2liaWxpdHkuUmVzb3VyY2VBY2xcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB2aXNpYmlsaXR5ID09PSBSZXNvdXJjZVZpc2liaWxpdHkuT3JnVW5pdCB8fFxuICAgICAgdmlzaWJpbGl0eSA9PT0gUmVzb3VyY2VWaXNpYmlsaXR5Lk9yZ1N1YnRyZWVcbiAgICApIHtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZVBlcm1pc3Npb25zID0gYXNBcnJheShcbiAgICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlcy5saXN0RWZmZWN0aXZlUGVybWlzc2lvbnNGb3JTY29wZT8uKFxuICAgICAgICAgIGlucHV0LnRlbmFudElkLFxuICAgICAgICAgIFNjb3BlS2luZC5PcmdVbml0LFxuICAgICAgICAgIHJlc291cmNlLm9yZ1VuaXRJZFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcmV0dXJuIGVmZmVjdGl2ZVBlcm1pc3Npb25zLnNvbWUoXG4gICAgICAgIChwZXJtaXNzaW9uKSA9PlxuICAgICAgICAgIHBlcm1pc3Npb24ucGVybWlzc2lvbktleSA9PT0gaW5wdXQucGVybWlzc2lvbktleSAmJlxuICAgICAgICAgIGlzVGltZVZhbGlkKGF0LCBwZXJtaXNzaW9uLnN0YXJ0c0F0LCBwZXJtaXNzaW9uLmV4cGlyZXNBdClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHZpc2liaWxpdHkgPT09IFJlc291cmNlVmlzaWJpbGl0eS5UZW5hbnQpIHtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZVBlcm1pc3Npb25zID0gYXNBcnJheShcbiAgICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlcy5saXN0RWZmZWN0aXZlUGVybWlzc2lvbnNGb3JTY29wZT8uKFxuICAgICAgICAgIGlucHV0LnRlbmFudElkLFxuICAgICAgICAgIFNjb3BlS2luZC5UZW5hbnQsXG4gICAgICAgICAgaW5wdXQudGVuYW50SWRcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHJldHVybiBlZmZlY3RpdmVQZXJtaXNzaW9ucy5zb21lKFxuICAgICAgICAocGVybWlzc2lvbikgPT5cbiAgICAgICAgICBwZXJtaXNzaW9uLnBlcm1pc3Npb25LZXkgPT09IGlucHV0LnBlcm1pc3Npb25LZXkgJiZcbiAgICAgICAgICBpc1RpbWVWYWxpZChhdCwgcGVybWlzc2lvbi5zdGFydHNBdCwgcGVybWlzc2lvbi5leHBpcmVzQXQpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGFzeW5jIHJlcXVpcmVBY2Nlc3MoaW5wdXQ6IENhbkFjY2Vzc0lucHV0LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghKGF3YWl0IHRoaXMuY2FuQWNjZXNzKGlucHV0LCAuLi5hcmdzKSkpIHtcbiAgICAgIHRocm93IG5ldyBBdXRob3JpemF0aW9uRXJyb3IoXG4gICAgICAgIGBBY2Nlc3MgZGVuaWVkIGZvciAke2lucHV0LnBlcm1pc3Npb25LZXl9IG9uICR7aW5wdXQucmVzb3VyY2VQcm90ZWN0ZWRJZCA/PyBzY29wZUtleShpbnB1dC5zY29wZUtpbmQgPz8gU2NvcGVLaW5kLlJlc291cmNlLCBpbnB1dC5zY29wZUlkID8/IFwiXCIpfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYnVpbGRBY2Nlc3NDb250ZXh0KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgcHJpbmNpcGFsSWQ6IHN0cmluZyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxpbXBvcnQoXCIuLi90eXBlc1wiKS5BY2Nlc3NDb250ZXh0PiB7XG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSBhc0FycmF5KFxuICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlcy5saXN0RWZmZWN0aXZlUGVybWlzc2lvbnM/Lih0ZW5hbnRJZCwgcHJpbmNpcGFsSWQpXG4gICAgKTtcbiAgICBjb25zdCBncmFudHMgPSBhc0FycmF5KFxuICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlcy5saXN0UHJpbmNpcGFsR3JhbnRzPy4odGVuYW50SWQsIHByaW5jaXBhbElkKVxuICAgICk7XG4gICAgcmV0dXJuIGJ1aWxkQWNjZXNzQ29udGV4dCh7XG4gICAgICB0ZW5hbnRJZCxcbiAgICAgIHByaW5jaXBhbElkLFxuICAgICAgcGVybWlzc2lvbnMsXG4gICAgICBncmFudHMsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBidWlsZEFyYW5nb0NvbnRleHQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBwcmluY2lwYWxJZDogc3RyaW5nLFxuICAgIHBlcm1pc3Npb25LZXk6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApIHtcbiAgICBjb25zdCBhY2Nlc3MgPSBhd2FpdCB0aGlzLmJ1aWxkQWNjZXNzQ29udGV4dChcbiAgICAgIHRlbmFudElkLFxuICAgICAgcHJpbmNpcGFsSWQsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBjb25zdCBhbGxvd2VkT3JnVW5pdElkcyA9XG4gICAgICBhY2Nlc3MuYWxsb3dlZE9yZ1VuaXRJZHNCeVBlcm1pc3Npb25bcGVybWlzc2lvbktleV0gPz8gW107XG4gICAgY29uc3QgYWxsb3dlZFJlc291cmNlSWRzID0gYWNjZXNzLnJlc291cmNlR3JhbnRzXG4gICAgICAuZmlsdGVyKChncmFudCkgPT4gZ3JhbnQucGVybWlzc2lvbktleSA9PT0gcGVybWlzc2lvbktleSlcbiAgICAgIC5tYXAoKGdyYW50KSA9PiBncmFudC5yZXNvdXJjZUlkKTtcbiAgICByZXR1cm4gYnVpbGRBcmFuZ29Db250ZXh0KHtcbiAgICAgIHRlbmFudElkLFxuICAgICAgcHJpbmNpcGFsSWQsXG4gICAgICBwZXJtaXNzaW9uS2V5LFxuICAgICAgYWxsb3dlZE9yZ1VuaXRJZHMsXG4gICAgICBhbGxvd2VkUmVzb3VyY2VJZHMsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBidWlsZFFkcmFudEZpbHRlcihcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHByaW5jaXBhbElkOiBzdHJpbmcsXG4gICAgcGVybWlzc2lvbktleTogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICkge1xuICAgIGNvbnN0IGFjY2VzcyA9IGF3YWl0IHRoaXMuYnVpbGRBY2Nlc3NDb250ZXh0KFxuICAgICAgdGVuYW50SWQsXG4gICAgICBwcmluY2lwYWxJZCxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGNvbnN0IGFsbG93ZWRPcmdVbml0SWRzID1cbiAgICAgIGFjY2Vzcy5hbGxvd2VkT3JnVW5pdElkc0J5UGVybWlzc2lvbltwZXJtaXNzaW9uS2V5XSA/PyBbXTtcbiAgICBjb25zdCBhbGxvd2VkUmVzb3VyY2VJZHMgPSBhY2Nlc3MucmVzb3VyY2VHcmFudHNcbiAgICAgIC5maWx0ZXIoKGdyYW50KSA9PiBncmFudC5wZXJtaXNzaW9uS2V5ID09PSBwZXJtaXNzaW9uS2V5KVxuICAgICAgLm1hcCgoZ3JhbnQpID0+IGdyYW50LnJlc291cmNlSWQpO1xuICAgIHJldHVybiBidWlsZFFkcmFudEZpbHRlcih7XG4gICAgICB0ZW5hbnRJZCxcbiAgICAgIHByaW5jaXBhbElkLFxuICAgICAgcGVybWlzc2lvbktleSxcbiAgICAgIGFsbG93ZWRPcmdVbml0SWRzLFxuICAgICAgYWxsb3dlZFJlc291cmNlSWRzLFxuICAgIH0pO1xuICB9XG59XG4iLCIvKipcbiAqIEBtb2R1bGUgaW50ZWdyYXRpb25zL2ZlYXR1cmUtZmxhZ3NcbiAqIEBzdW1tYXJ5IEZlYXR1cmUgZmxhZyBjb25zdGFudHMgYW5kIG1ldGFkYXRhIGtleXMuXG4gKi9cblxuZXhwb3J0IGNvbnN0IEZFQVRVUkVfRkxBR19FTlZfUk9PVCA9IFwiZmVhdHVyZUZsYWdcIjtcbmV4cG9ydCBjb25zdCBGRUFUVVJFX0ZMQUdfRU5WX1BSRUZJWCA9IFwiRkVBVFVSRV9GTEFHXCI7XG5cbmV4cG9ydCBjb25zdCBGRUFUVVJFX0ZMQUdfTU9ERUxfS0VZID0gXCJmZWF0dXJlLWZsYWdzOm1vZGVsXCI7XG5leHBvcnQgY29uc3QgRkVBVFVSRV9GTEFHX0FVVEhfS0VZID0gXCJmZWF0dXJlLWZsYWdzOmF1dGhcIjtcbmV4cG9ydCBjb25zdCBGRUFUVVJFX0ZMQUdfQkxPQ0tfS0VZID0gXCJmZWF0dXJlLWZsYWdzOmJsb2NrXCI7XG5leHBvcnQgY29uc3QgRkVBVFVSRV9GTEFHX1JFTkRFUl9LRVkgPSBcImZlYXR1cmUtZmxhZ3M6cmVuZGVyLWlmXCI7XG5leHBvcnQgY29uc3QgRkVBVFVSRV9GTEFHX0hJREVfS0VZID0gXCJmZWF0dXJlLWZsYWdzOmhpZGUtb25cIjtcblxuIiwiaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIEZlYXR1cmVGbGFnQ29uZmlnLFxuICBGZWF0dXJlRmxhZ0FjY2Vzc1N1YmplY3RUeXBlLFxuICBGZWF0dXJlRmxhZ01hdGNoTW9kZSxcbiAgRmVhdHVyZUZsYWdSZWdpc3RyeSxcbiAgRmVhdHVyZUZsYWdSdWxlLFxuICBGZWF0dXJlRmxhZ1ZhbHVlLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRmVhdHVyZU5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdHJpbW1lZCA9IG5hbWUudHJpbSgpO1xuICBpZiAoIXRyaW1tZWQpIHJldHVybiB0cmltbWVkO1xuICBpZiAoL15bYS16XVthLXpBLVowLTldKiQvLnRlc3QodHJpbW1lZCkpIHJldHVybiB0cmltbWVkO1xuICBjb25zdCBjYW1lbGl6ZWQgPSB0cmltbWVkXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZSgvW19cXC1cXHNdKy9nLCBcIiBcIilcbiAgICAuc3BsaXQoXCIgXCIpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbiAgaWYgKGNhbWVsaXplZC5sZW5ndGggPT09IDApIHJldHVybiB0cmltbWVkO1xuICBjb25zdCBbaGVhZCwgLi4udGFpbF0gPSBjYW1lbGl6ZWQ7XG4gIHJldHVybiBbXG4gICAgaGVhZCxcbiAgICAuLi50YWlsLm1hcCgoc2VnbWVudCkgPT5cbiAgICAgIHNlZ21lbnQgPyBzZWdtZW50LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc2VnbWVudC5zbGljZSgxKSA6IHNlZ21lbnRcbiAgICApLFxuICBdXG4gICAgLmpvaW4oXCJcIilcbiAgICAucmVwbGFjZSgvW15hLXpBLVowLTldL2csIFwiXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSdW50aW1lVmFsdWUodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHZhbHVlO1xuICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpO1xuICBpZiAodHJpbW1lZCA9PT0gXCJ0cnVlXCIpIHJldHVybiB0cnVlO1xuICBpZiAodHJpbW1lZCA9PT0gXCJmYWxzZVwiKSByZXR1cm4gZmFsc2U7XG4gIGlmICgvXi0/XFxkKyhcXC5cXGQrKT8kLy50ZXN0KHRyaW1tZWQpKSByZXR1cm4gTnVtYmVyKHRyaW1tZWQpO1xuICBpZiAoXG4gICAgKHRyaW1tZWQuc3RhcnRzV2l0aChcIntcIikgJiYgdHJpbW1lZC5lbmRzV2l0aChcIn1cIikpIHx8XG4gICAgKHRyaW1tZWQuc3RhcnRzV2l0aChcIltcIikgJiYgdHJpbW1lZC5lbmRzV2l0aChcIl1cIikpXG4gICkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZSh0cmltbWVkKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVPYmplY3RLZXkoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIWtleSkgcmV0dXJuIGtleTtcbiAgaWYgKC9eW2Etel1bYS16QS1aMC05XSokLy50ZXN0KGtleSkpIHJldHVybiBrZXk7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBrZXlcbiAgICAucmVwbGFjZSgvW1xccy1dKy9nLCBcIl9cIilcbiAgICAuc3BsaXQoXCJfXCIpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbiAgaWYgKG5vcm1hbGl6ZWQubGVuZ3RoID09PSAwKSByZXR1cm4ga2V5O1xuICBjb25zdCBbaGVhZCwgLi4udGFpbF0gPSBub3JtYWxpemVkO1xuICByZXR1cm4gW1xuICAgIGhlYWQudG9Mb3dlckNhc2UoKSxcbiAgICAuLi50YWlsLm1hcChcbiAgICAgIChzZWdtZW50KSA9PlxuICAgICAgICBzZWdtZW50LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc2VnbWVudC5zbGljZSgxKS50b0xvd2VyQ2FzZSgpXG4gICAgKSxcbiAgXS5qb2luKFwiXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRmVhdHVyZUNvbmZpZyhcbiAgdmFsdWU6IHVua25vd25cbik6IEZlYXR1cmVGbGFnVmFsdWUgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodmFsdWUgPT09IHRydWUpIHJldHVybiB0cnVlO1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiBwYXJzZVJ1bnRpbWVWYWx1ZSh2YWx1ZSkgYXMgRmVhdHVyZUZsYWdWYWx1ZTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogRmVhdHVyZUZsYWdDb25maWcgPSB7fTtcbiAgT2JqZWN0LmVudHJpZXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmZvckVhY2goKFtrZXksIHJhd10pID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkS2V5ID0gbm9ybWFsaXplT2JqZWN0S2V5KGtleSk7XG4gICAgaWYgKHR5cGVvZiByYXcgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHJlc3VsdFtub3JtYWxpemVkS2V5XSA9IG5vcm1hbGl6ZUZlYXR1cmVDb25maWcocmF3KSA/PyByYXc7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUZlYXR1cmVSZWdpc3RyeShcbiAgdmFsdWU6IHVua25vd25cbik6IEZlYXR1cmVGbGFnUmVnaXN0cnkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHt9O1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnJlZHVjZShcbiAgICAoYWNjLCBba2V5LCByYXddKSA9PiB7XG4gICAgICBjb25zdCBub3JtYWxpemVkS2V5ID0gbm9ybWFsaXplRmVhdHVyZU5hbWUoa2V5KTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IG5vcm1hbGl6ZUZlYXR1cmVDb25maWcocmF3KTtcbiAgICAgIGlmICh0eXBlb2Ygbm9ybWFsaXplZFZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGFjY1tub3JtYWxpemVkS2V5XSA9IG5vcm1hbGl6ZWRWYWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSxcbiAgICB7fSBhcyBGZWF0dXJlRmxhZ1JlZ2lzdHJ5XG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZlYXR1cmVGbGFnRW5hYmxlZCh2YWx1ZTogRmVhdHVyZUZsYWdWYWx1ZSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAodmFsdWUgPT09IHRydWUpIHJldHVybiB0cnVlO1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZlYXR1cmVGbGFnRW5hYmxlZEJ5TmFtZShcbiAgcmVnaXN0cnk6IEZlYXR1cmVGbGFnUmVnaXN0cnkgfCB1bmRlZmluZWQsXG4gIGZlYXR1cmVOYW1lOiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNGZWF0dXJlRmxhZ0VuYWJsZWQocmVnaXN0cnk/Lltub3JtYWxpemVGZWF0dXJlTmFtZShmZWF0dXJlTmFtZSldKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUZlYXR1cmVSdWxlKFxuICBmZWF0dXJlczogc3RyaW5nW10sXG4gIG1hdGNoOiBGZWF0dXJlRmxhZ01hdGNoTW9kZSA9IFwiYW55XCJcbik6IEZlYXR1cmVGbGFnUnVsZSB7XG4gIHJldHVybiB7XG4gICAgZmVhdHVyZXM6IFsuLi5uZXcgU2V0KGZlYXR1cmVzLm1hcChub3JtYWxpemVGZWF0dXJlTmFtZSkuZmlsdGVyKEJvb2xlYW4pKV0sXG4gICAgbWF0Y2gsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZlYXR1cmVSdWxlU2F0aXNmaWVkKFxuICBydWxlOiBGZWF0dXJlRmxhZ1J1bGUgfCB1bmRlZmluZWQsXG4gIHJlZ2lzdHJ5OiBGZWF0dXJlRmxhZ1JlZ2lzdHJ5IHwgdW5kZWZpbmVkXG4pOiBib29sZWFuIHtcbiAgaWYgKCFydWxlIHx8IHJ1bGUuZmVhdHVyZXMubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgZW5hYmxlZCA9IHJ1bGUuZmVhdHVyZXMuZmlsdGVyKChmZWF0dXJlKSA9PlxuICAgIGlzRmVhdHVyZUZsYWdFbmFibGVkQnlOYW1lKHJlZ2lzdHJ5LCBmZWF0dXJlKVxuICApO1xuICBpZiAocnVsZS5tYXRjaCA9PT0gXCJhbGxcIikgcmV0dXJuIGVuYWJsZWQubGVuZ3RoID09PSBydWxlLmZlYXR1cmVzLmxlbmd0aDtcbiAgcmV0dXJuIGVuYWJsZWQubGVuZ3RoID4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRmVhdHVyZVJ1bGVCbG9ja2VkKFxuICBydWxlOiBGZWF0dXJlRmxhZ1J1bGUgfCB1bmRlZmluZWQsXG4gIHJlZ2lzdHJ5OiBGZWF0dXJlRmxhZ1JlZ2lzdHJ5IHwgdW5kZWZpbmVkXG4pOiBib29sZWFuIHtcbiAgaWYgKCFydWxlIHx8IHJ1bGUuZmVhdHVyZXMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBydWxlLmZlYXR1cmVzLnNvbWUoKGZlYXR1cmUpID0+IGlzRmVhdHVyZUZsYWdFbmFibGVkQnlOYW1lKHJlZ2lzdHJ5LCBmZWF0dXJlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkTWV0YWRhdGE8VCA9IHVua25vd24+KFxuICB0YXJnZXQ6IG9iamVjdCxcbiAga2V5OiBzdHJpbmdcbik6IFQgfCB1bmRlZmluZWQge1xuICByZXR1cm4gTWV0YWRhdGEuZ2V0KHRhcmdldCBhcyBhbnksIGtleSkgYXMgVCB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUZlYXR1cmVTdWJqZWN0VHlwZShcbiAgc3ViamVjdFR5cGU6IEZlYXR1cmVGbGFnQWNjZXNzU3ViamVjdFR5cGUgfCBzdHJpbmdcbik6IEZlYXR1cmVGbGFnQWNjZXNzU3ViamVjdFR5cGUge1xuICByZXR1cm4gc3ViamVjdFR5cGUudHJpbSgpLnRvTG93ZXJDYXNlKCkgYXMgRmVhdHVyZUZsYWdBY2Nlc3NTdWJqZWN0VHlwZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUZlYXR1cmVTdWJqZWN0S2V5KHN1YmplY3RLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzdWJqZWN0S2V5LnRyaW0oKTtcbn1cbiIsImltcG9ydCB7IExvZ2dlZEVudmlyb25tZW50IH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQge1xuICBGRUFUVVJFX0ZMQUdfRU5WX1JPT1QsXG4gIEZFQVRVUkVfRkxBR19FTlZfUFJFRklYLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUZlYXR1cmVOYW1lLCBub3JtYWxpemVGZWF0dXJlUmVnaXN0cnkgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHR5cGUge1xuICBGZWF0dXJlRmxhZ0Vudmlyb25tZW50U2hhcGUsXG4gIEZlYXR1cmVGbGFnUmVnaXN0cnksXG4gIEZlYXR1cmVGbGFnVmFsdWUsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCBGZWF0dXJlRmxhZ0Vudmlyb25tZW50ID0gTG9nZ2VkRW52aXJvbm1lbnQuYWNjdW11bGF0ZSh7XG4gIFtGRUFUVVJFX0ZMQUdfRU5WX1JPT1RdOiB7fSxcbn0gYXMgRmVhdHVyZUZsYWdFbnZpcm9ubWVudFNoYXBlKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRGZWF0dXJlRmxhZ3NGcm9tRW52aXJvbm1lbnQoXG4gIHNvdXJjZTogUGljazxGZWF0dXJlRmxhZ0Vudmlyb25tZW50U2hhcGUsIFwiZmVhdHVyZUZsYWdcIj4gPSBGZWF0dXJlRmxhZ0Vudmlyb25tZW50XG4pOiBQcm9taXNlPEZlYXR1cmVGbGFnUmVnaXN0cnk+IHtcbiAgcmV0dXJuIG5vcm1hbGl6ZUZlYXR1cmVSZWdpc3RyeShzb3VyY2UuZmVhdHVyZUZsYWcpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUZlYXR1cmVGbGFnRnJvbUVudmlyb25tZW50KFxuICBmZWF0dXJlTmFtZTogc3RyaW5nLFxuICBzb3VyY2U6IFBpY2s8RmVhdHVyZUZsYWdFbnZpcm9ubWVudFNoYXBlLCBcImZlYXR1cmVGbGFnXCI+ID0gRmVhdHVyZUZsYWdFbnZpcm9ubWVudFxuKTogUHJvbWlzZTxGZWF0dXJlRmxhZ1ZhbHVlIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gYXdhaXQgbG9hZEZlYXR1cmVGbGFnc0Zyb21FbnZpcm9ubWVudChzb3VyY2UpO1xuICByZXR1cm4gcmVnaXN0cnlbbm9ybWFsaXplRmVhdHVyZU5hbWUoZmVhdHVyZU5hbWUpXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhc0ZlYXR1cmVGbGFnSW5FbnZpcm9ubWVudChcbiAgZmVhdHVyZU5hbWU6IHN0cmluZyxcbiAgc291cmNlOiBQaWNrPEZlYXR1cmVGbGFnRW52aXJvbm1lbnRTaGFwZSwgXCJmZWF0dXJlRmxhZ1wiPiA9IEZlYXR1cmVGbGFnRW52aXJvbm1lbnRcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gISEoYXdhaXQgcmVzb2x2ZUZlYXR1cmVGbGFnRnJvbUVudmlyb25tZW50KGZlYXR1cmVOYW1lLCBzb3VyY2UpKTtcbn1cblxuZXhwb3J0IHsgRkVBVFVSRV9GTEFHX0VOVl9QUkVGSVgsIEZFQVRVUkVfRkxBR19FTlZfUk9PVCB9O1xuIiwiaW1wb3J0IHsgQmFzZU1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQge1xuICBjb2x1bW4sXG4gIGNyZWF0ZWRBdCxcbiAgcGssXG4gIHRhYmxlLFxuICB1cGRhdGVkQXQsXG4gIHV1aWQsXG4gIHVuaXF1ZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgcmVxdWlyZWQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVGbGFnQ29uZmlnIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbkB0YWJsZShcImZlYXR1cmVfZmxhZ3NcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgRmVhdHVyZUZsYWcgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogUGFydGlhbDxGZWF0dXJlRmxhZz4pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwaygpXG4gIEB1dWlkKClcbiAgaWQhOiBzdHJpbmc7XG5cbiAgQHVuaXF1ZSgpXG4gIEByZXF1aXJlZCgpXG4gIEBjb2x1bW4oKVxuICBrZXkhOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIGVuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBjb2x1bW4oKVxuICBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICBAY29sdW1uKClcbiAgc2NvcGU/OiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgQGNvbHVtbigpXG4gIGNvbmZpZz86IEZlYXR1cmVGbGFnQ29uZmlnO1xuXG4gIEBjb2x1bW4oKVxuICBjcmVhdGVkQnk/OiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIHVwZGF0ZWRCeT86IHN0cmluZztcblxuICBAY3JlYXRlZEF0KClcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICBAdXBkYXRlZEF0KClcbiAgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIHBrLCB0YWJsZSwgdXBkYXRlZEF0LCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgcmVxdWlyZWQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVGbGFnQWNjZXNzU3ViamVjdFR5cGUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuQHRhYmxlKFwiZmVhdHVyZV9mbGFnX2FjY2Vzc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBGZWF0dXJlRmxhZ0FjY2VzcyBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiBQYXJ0aWFsPEZlYXR1cmVGbGFnQWNjZXNzPikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKClcbiAgQHV1aWQoKVxuICBpZCE6IHN0cmluZztcblxuICBAcmVxdWlyZWQoKVxuICBAY29sdW1uKClcbiAgZmVhdHVyZUtleSE6IHN0cmluZztcblxuICBAcmVxdWlyZWQoKVxuICBAY29sdW1uKClcbiAgc3ViamVjdFR5cGUhOiBGZWF0dXJlRmxhZ0FjY2Vzc1N1YmplY3RUeXBlIHwgc3RyaW5nO1xuXG4gIEByZXF1aXJlZCgpXG4gIEBjb2x1bW4oKVxuICBzdWJqZWN0S2V5ITogc3RyaW5nO1xuXG4gIEBjb2x1bW4oKVxuICBlbmFibGVkOiBib29sZWFuID0gdHJ1ZTtcblxuICBAY29sdW1uKClcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICBAY29sdW1uKClcbiAgY3JlYXRlZEJ5Pzogc3RyaW5nO1xuXG4gIEBjb2x1bW4oKVxuICB1cGRhdGVkQnk/OiBzdHJpbmc7XG5cbiAgQGNyZWF0ZWRBdCgpXG4gIGNyZWF0ZWRBdCE6IERhdGU7XG5cbiAgQHVwZGF0ZWRBdCgpXG4gIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQge1xuICBGRUFUVVJFX0ZMQUdfRU5WX1JPT1QsXG59IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIGxvYWRGZWF0dXJlRmxhZ3NGcm9tRW52aXJvbm1lbnQsXG59IGZyb20gXCIuLi9lbnZpcm9ubWVudFwiO1xuaW1wb3J0IHR5cGUge1xuICBGZWF0dXJlRmxhZ0Vudmlyb25tZW50U2hhcGUsXG4gIEZlYXR1cmVGbGFnUmVhZGVySW5wdXQsXG4gIEZlYXR1cmVGbGFnUmVnaXN0cnksXG4gIEZlYXR1cmVGbGFnVmFsdWUsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplRmVhdHVyZU5hbWUgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZlYXR1cmVGbGFnUmVhZGVyIHtcbiAgYWJzdHJhY3QgcmVhZChcbiAgICBpbnB1dD86IEZlYXR1cmVGbGFnUmVhZGVySW5wdXRcbiAgKTogUHJvbWlzZTxGZWF0dXJlRmxhZ1JlZ2lzdHJ5PjtcblxuICBhc3luYyByZWFkT25lKFxuICAgIGZlYXR1cmVOYW1lOiBzdHJpbmcsXG4gICAgaW5wdXQ/OiBGZWF0dXJlRmxhZ1JlYWRlcklucHV0XG4gICk6IFByb21pc2U8RmVhdHVyZUZsYWdWYWx1ZSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHJlZ2lzdHJ5ID0gYXdhaXQgdGhpcy5yZWFkKGlucHV0KTtcbiAgICByZXR1cm4gcmVnaXN0cnlbbm9ybWFsaXplRmVhdHVyZU5hbWUoZmVhdHVyZU5hbWUpXTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW52aXJvbm1lRmxhZ1JlYWRlciBleHRlbmRzIEZlYXR1cmVGbGFnUmVhZGVyIHtcbiAgYXN5bmMgcmVhZChcbiAgICBpbnB1dDogRmVhdHVyZUZsYWdSZWFkZXJJbnB1dCA9IHt9XG4gICk6IFByb21pc2U8RmVhdHVyZUZsYWdSZWdpc3RyeT4ge1xuICAgIGNvbnN0IGVudmlyb25tZW50ID1cbiAgICAgIChpbnB1dC5zb3VyY2UgYXMgRmVhdHVyZUZsYWdFbnZpcm9ubWVudFNoYXBlIHwgdW5kZWZpbmVkKSA/P1xuICAgICAgKHtcbiAgICAgICAgW0ZFQVRVUkVfRkxBR19FTlZfUk9PVF06IHt9LFxuICAgICAgfSBhcyBGZWF0dXJlRmxhZ0Vudmlyb25tZW50U2hhcGUpO1xuICAgIHJldHVybiBsb2FkRmVhdHVyZUZsYWdzRnJvbUVudmlyb25tZW50KGVudmlyb25tZW50KTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBGZWF0dXJlRmxhZ1JlYWRlckNvbnN0cnVjdG9yID0gbmV3ICgpID0+IEZlYXR1cmVGbGFnUmVhZGVyO1xuZXhwb3J0IHR5cGUgRmVhdHVyZUZsYWdSZWFkZXJMaWtlID1cbiAgfCBGZWF0dXJlRmxhZ1JlYWRlclxuICB8IEZlYXR1cmVGbGFnUmVhZGVyQ29uc3RydWN0b3I7XG4iLCJpbXBvcnQge1xuICBDb25kaXRpb24sXG4gIE1vZGVsU2VydmljZSxcbiAgUmVwb3NpdG9yeSxcbiAgcmVwb3NpdG9yeSxcbiAgc2VydmljZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IFJlcG8gfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE5vdEZvdW5kRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IEZlYXR1cmVGbGFnRW52aXJvbm1lbnQgfSBmcm9tIFwiLi4vZW52aXJvbm1lbnRcIjtcbmltcG9ydCB7IEZlYXR1cmVGbGFnQWNjZXNzIH0gZnJvbSBcIi4uL21vZGVscy9GZWF0dXJlRmxhZ0FjY2Vzcy5tb2RlbFwiO1xuaW1wb3J0IHsgRmVhdHVyZUZsYWcgfSBmcm9tIFwiLi4vbW9kZWxzL0ZlYXR1cmVGbGFnLm1vZGVsXCI7XG5pbXBvcnQge1xuICBFbnZpcm9ubWVGbGFnUmVhZGVyLFxuICBGZWF0dXJlRmxhZ1JlYWRlcixcbiAgRmVhdHVyZUZsYWdSZWFkZXJMaWtlLFxufSBmcm9tIFwiLi4vcmVhZGVyc1wiO1xuaW1wb3J0IHR5cGUge1xuICBGZWF0dXJlRmxhZ0FjY2Vzc0lucHV0LFxuICBGZWF0dXJlRmxhZ0FjY2Vzc1F1ZXJ5LFxuICBGZWF0dXJlRmxhZ0FjY2Vzc1N1YmplY3QsXG4gIEZlYXR1cmVGbGFnQ29uZmlnLFxuICBGZWF0dXJlRmxhZ1JlYWRlckNvbmZpZyxcbiAgRmVhdHVyZUZsYWdSZWFkZXJJbnB1dCxcbiAgRmVhdHVyZUZsYWdSZWdpc3RyeSxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQge1xuICBpc0ZlYXR1cmVGbGFnRW5hYmxlZCxcbiAgaXNGZWF0dXJlRmxhZ0VuYWJsZWRCeU5hbWUsXG4gIG5vcm1hbGl6ZUZlYXR1cmVOYW1lLFxufSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUZlYXR1cmVTdWJqZWN0S2V5LCBub3JtYWxpemVGZWF0dXJlU3ViamVjdFR5cGUgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGZWF0dXJlRmxhZ1NlcnZpY2VDb25maWcgZXh0ZW5kcyBGZWF0dXJlRmxhZ1JlYWRlckNvbmZpZyB7XG4gIHJlYWRlcj86IEZlYXR1cmVGbGFnUmVhZGVyTGlrZTtcbiAgcmVwb3NpdG9yeT86IFJlcG9zaXRvcnk8RmVhdHVyZUZsYWcsIGFueT47XG59XG5cbkBzZXJ2aWNlKEZlYXR1cmVGbGFnKVxuZXhwb3J0IGNsYXNzIEZlYXR1cmVGbGFnU2VydmljZSBleHRlbmRzIE1vZGVsU2VydmljZTxGZWF0dXJlRmxhZz4ge1xuICBwcml2YXRlIHJlYWRlcjogRmVhdHVyZUZsYWdSZWFkZXIgPSBuZXcgRW52aXJvbm1lRmxhZ1JlYWRlcigpO1xuICBwcml2YXRlIGNhY2hlZFJlZ2lzdHJ5OiBGZWF0dXJlRmxhZ1JlZ2lzdHJ5ID0ge307XG4gIEByZXBvc2l0b3J5KEZlYXR1cmVGbGFnQWNjZXNzKVxuICBwcm90ZWN0ZWQgYWNjZXNzUmVwb3NpdG9yeSE6IFJlcG88RmVhdHVyZUZsYWdBY2Nlc3M+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKEZlYXR1cmVGbGFnKTtcbiAgfVxuXG4gIGFzeW5jIGluaXRpYWxpemUoXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTx7IGNvbmZpZzogRmVhdHVyZUZsYWdTZXJ2aWNlQ29uZmlnOyBjbGllbnQ6IEZlYXR1cmVGbGFnUmVhZGVyIH0+IHtcbiAgICBjb25zdCBjb25maWcgPSAoYXJnc1swXSBhcyBGZWF0dXJlRmxhZ1NlcnZpY2VDb25maWcgfCB1bmRlZmluZWQpID8/IHt9O1xuICAgIGlmIChjb25maWcucmVwb3NpdG9yeSkge1xuICAgICAgdGhpcy5fcmVwb3NpdG9yeSA9IGNvbmZpZy5yZXBvc2l0b3J5IGFzIGFueTtcbiAgICB9XG4gICAgdGhpcy5yZWFkZXIgPSAhY29uZmlnLnJlYWRlclxuICAgICAgPyBuZXcgRW52aXJvbm1lRmxhZ1JlYWRlcigpXG4gICAgICA6IHR5cGVvZiBjb25maWcucmVhZGVyID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBuZXcgY29uZmlnLnJlYWRlcigpXG4gICAgICAgIDogY29uZmlnLnJlYWRlcjtcbiAgICBjb25zdCByZWFkZXJDb25maWcgPSB7XG4gICAgICAuLi4oY29uZmlnLnJlYWRlckNvbmZpZyA/PyB7fSksXG4gICAgICBzb3VyY2U6IGNvbmZpZy5yZWFkZXJDb25maWc/LnNvdXJjZSA/PyBGZWF0dXJlRmxhZ0Vudmlyb25tZW50LFxuICAgIH07XG4gICAgdGhpcy5jYWNoZWRSZWdpc3RyeSA9IGF3YWl0IHRoaXMucmVmcmVzaENhY2hlZFJlZ2lzdHJ5KHJlYWRlckNvbmZpZywgLi4uYXJncyk7XG4gICAgY29uc3QgZWZmZWN0aXZlQ29uZmlnOiBGZWF0dXJlRmxhZ1NlcnZpY2VDb25maWcgPSB7XG4gICAgICAuLi5jb25maWcsXG4gICAgICByZWFkZXI6IHRoaXMucmVhZGVyLFxuICAgICAgcmVhZGVyQ29uZmlnLFxuICAgIH07XG4gICAgcmV0dXJuIHsgY29uZmlnOiBlZmZlY3RpdmVDb25maWcsIGNsaWVudDogdGhpcy5yZWFkZXIgfTtcbiAgfVxuXG4gIHByaXZhdGUgY2xvbmVSZWdpc3RyeShyZWdpc3RyeTogRmVhdHVyZUZsYWdSZWdpc3RyeSk6IEZlYXR1cmVGbGFnUmVnaXN0cnkge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhyZWdpc3RyeSkucmVkdWNlKChhY2MsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgYWNjW2tleV0gPVxuICAgICAgICB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgICAgICAgPyAoeyAuLi4odmFsdWUgYXMgRmVhdHVyZUZsYWdDb25maWcpIH0gYXMgRmVhdHVyZUZsYWdDb25maWcpXG4gICAgICAgICAgOiB2YWx1ZTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30gYXMgRmVhdHVyZUZsYWdSZWdpc3RyeSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hDYWNoZWRSZWdpc3RyeShcbiAgICBvcHRpb25zOiBGZWF0dXJlRmxhZ1JlYWRlcklucHV0ID0ge30sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxGZWF0dXJlRmxhZ1JlZ2lzdHJ5PiB7XG4gICAgY29uc3QgZW52UmVnaXN0cnkgPSBhd2FpdCB0aGlzLnJlYWRlci5yZWFkKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBzb3VyY2U6IG9wdGlvbnMuc291cmNlID8/IEZlYXR1cmVGbGFnRW52aXJvbm1lbnQsXG4gICAgfSk7XG4gICAgbGV0IHBlcnNpc3RlZDogRmVhdHVyZUZsYWdbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBwZXJzaXN0ZWQgPSBhd2FpdCB0aGlzLnJlcG8uc2VsZWN0KCkuZXhlY3V0ZSguLi5hcmdzKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHBlcnNpc3RlZCA9IFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHJlZ2lzdHJ5ID0gdGhpcy5jbG9uZVJlZ2lzdHJ5KGVudlJlZ2lzdHJ5KTtcbiAgICBmb3IgKGNvbnN0IGZsYWcgb2YgcGVyc2lzdGVkKSB7XG4gICAgICByZWdpc3RyeVtmbGFnLmtleV0gPSBmbGFnLmVuYWJsZWQgPyAoZmxhZy5jb25maWcgPz8gdHJ1ZSkgOiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdHJ5O1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRDYWNoZWRGbGFnKGZsYWc6IEZlYXR1cmVGbGFnKTogdm9pZCB7XG4gICAgdGhpcy5jYWNoZWRSZWdpc3RyeVtmbGFnLmtleV0gPSBmbGFnLmVuYWJsZWRcbiAgICAgID8gKGZsYWcuY29uZmlnID8/IHRydWUpXG4gICAgICA6IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBY2Nlc3NSZXBvc2l0b3J5KCk6IFJlcG88RmVhdHVyZUZsYWdBY2Nlc3M+IHtcbiAgICByZXR1cm4gdGhpcy5hY2Nlc3NSZXBvc2l0b3J5ID8/IFJlcG9zaXRvcnkuZm9yTW9kZWwoRmVhdHVyZUZsYWdBY2Nlc3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3NlcnRJbml0aWFsaXplZCgpOiB2b2lkIHtcbiAgICB2b2lkIHRoaXMucmVhZGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVGZWF0dXJlQWNjZXNzSW5wdXQoXG4gICAgaW5wdXQ6IEZlYXR1cmVGbGFnQWNjZXNzSW5wdXRcbiAgKTogRmVhdHVyZUZsYWdBY2Nlc3NJbnB1dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmlucHV0LFxuICAgICAgZmVhdHVyZUtleTogbm9ybWFsaXplRmVhdHVyZU5hbWUoaW5wdXQuZmVhdHVyZUtleSksXG4gICAgICBzdWJqZWN0VHlwZTogbm9ybWFsaXplRmVhdHVyZVN1YmplY3RUeXBlKGlucHV0LnN1YmplY3RUeXBlKSxcbiAgICAgIHN1YmplY3RLZXk6IG5vcm1hbGl6ZUZlYXR1cmVTdWJqZWN0S2V5KGlucHV0LnN1YmplY3RLZXkpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQWNjZXNzQ29uZGl0aW9uKFxuICAgIHF1ZXJ5OiBGZWF0dXJlRmxhZ0FjY2Vzc1F1ZXJ5XG4gICk6IENvbmRpdGlvbjxGZWF0dXJlRmxhZ0FjY2Vzcz4ge1xuICAgIGxldCBjb25kaXRpb24gPSBDb25kaXRpb24uYXR0cjxGZWF0dXJlRmxhZ0FjY2Vzcz4oXCJzdWJqZWN0VHlwZVwiKS5lcShcbiAgICAgIG5vcm1hbGl6ZUZlYXR1cmVTdWJqZWN0VHlwZShxdWVyeS5zdWJqZWN0VHlwZSlcbiAgICApO1xuICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbi5hbmQoXG4gICAgICBDb25kaXRpb24uYXR0cjxGZWF0dXJlRmxhZ0FjY2Vzcz4oXCJzdWJqZWN0S2V5XCIpLmVxKFxuICAgICAgICBub3JtYWxpemVGZWF0dXJlU3ViamVjdEtleShxdWVyeS5zdWJqZWN0S2V5KVxuICAgICAgKVxuICAgICk7XG4gICAgaWYgKHR5cGVvZiBxdWVyeS5lbmFibGVkICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBjb25kaXRpb24gPSBjb25kaXRpb24uYW5kKFxuICAgICAgICBDb25kaXRpb24uYXR0cjxGZWF0dXJlRmxhZ0FjY2Vzcz4oXCJlbmFibGVkXCIpLmVxKHF1ZXJ5LmVuYWJsZWQpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAocXVlcnkuZmVhdHVyZUtleXMgJiYgcXVlcnkuZmVhdHVyZUtleXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uLmFuZChcbiAgICAgICAgQ29uZGl0aW9uLmF0dHI8RmVhdHVyZUZsYWdBY2Nlc3M+KFwiZmVhdHVyZUtleVwiKS5pbihcbiAgICAgICAgICBxdWVyeS5mZWF0dXJlS2V5cy5tYXAobm9ybWFsaXplRmVhdHVyZU5hbWUpXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBjb25kaXRpb247XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjcmVhdGUoXG4gICAgbW9kZWw6IEZlYXR1cmVGbGFnLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8RmVhdHVyZUZsYWc+IHtcbiAgICBtb2RlbC5rZXkgPSBub3JtYWxpemVGZWF0dXJlTmFtZShtb2RlbC5rZXkpO1xuICAgIG1vZGVsLmVuYWJsZWQgPz89IHRydWU7XG4gICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IHN1cGVyLmNyZWF0ZShtb2RlbCwgLi4uYXJncyk7XG4gICAgdGhpcy5zZXRDYWNoZWRGbGFnKGNyZWF0ZWQpO1xuICAgIHJldHVybiBjcmVhdGVkO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlKFxuICAgIG1vZGVsOiBGZWF0dXJlRmxhZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEZlYXR1cmVGbGFnPiB7XG4gICAgbW9kZWwua2V5ID0gbm9ybWFsaXplRmVhdHVyZU5hbWUobW9kZWwua2V5KTtcbiAgICBtb2RlbC5lbmFibGVkID8/PSB0cnVlO1xuICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCBzdXBlci51cGRhdGUobW9kZWwsIC4uLmFyZ3MpO1xuICAgIHRoaXMuc2V0Q2FjaGVkRmxhZyh1cGRhdGVkKTtcbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGZpbmRPbmVCeShcbiAgICBrZXk6IGtleW9mIEZlYXR1cmVGbGFnLFxuICAgIHZhbHVlOiBhbnksXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxGZWF0dXJlRmxhZz4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9XG4gICAgICBrZXkgPT09IFwia2V5XCIgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gbm9ybWFsaXplRmVhdHVyZU5hbWUodmFsdWUpXG4gICAgICAgIDogdmFsdWU7XG4gICAgcmV0dXJuIHRoaXMucmVwby5maW5kT25lQnkoa2V5LCBub3JtYWxpemVkVmFsdWUsIC4uLmFyZ3MpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChcbiAgICBrZXlzOiBhbnlbXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEZlYXR1cmVGbGFnW10+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlcG8ucmVhZEFsbChrZXlzLCAuLi5hcmdzKTtcbiAgICBmb3IgKGNvbnN0IGZsYWcgb2YgcmVzdWx0KSB0aGlzLnNldENhY2hlZEZsYWcoZmxhZyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGFzeW5jIGxpc3RFbmFibGVkKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxGZWF0dXJlRmxhZ1tdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVwb1xuICAgICAgLnNlbGVjdCgpXG4gICAgICAud2hlcmUoQ29uZGl0aW9uLmF0dHI8RmVhdHVyZUZsYWc+KFwiZW5hYmxlZFwiKS5lcSh0cnVlKSlcbiAgICAgIC5leGVjdXRlKC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgZ3JhbnRGZWF0dXJlQWNjZXNzKFxuICAgIGlucHV0OiBGZWF0dXJlRmxhZ0FjY2Vzc0lucHV0LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8RmVhdHVyZUZsYWdBY2Nlc3M+IHtcbiAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy5ub3JtYWxpemVGZWF0dXJlQWNjZXNzSW5wdXQoaW5wdXQpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5maW5kRmVhdHVyZUFjY2Vzcyhub3JtYWxpemVkLCAuLi5hcmdzKS5jYXRjaChcbiAgICAgICgpID0+IHVuZGVmaW5lZFxuICAgICk7XG4gICAgaWYgKCFleGlzdGluZykge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0QWNjZXNzUmVwb3NpdG9yeSgpLmNyZWF0ZShcbiAgICAgICAgbmV3IEZlYXR1cmVGbGFnQWNjZXNzKG5vcm1hbGl6ZWQpLFxuICAgICAgICAuLi5hcmdzXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRBY2Nlc3NSZXBvc2l0b3J5KCkudXBkYXRlKFxuICAgICAgT2JqZWN0LmFzc2lnbihleGlzdGluZywgbm9ybWFsaXplZCksXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHJldm9rZUZlYXR1cmVBY2Nlc3MoXG4gICAgaW5wdXQ6IEZlYXR1cmVGbGFnQWNjZXNzU3ViamVjdCAmIHsgZmVhdHVyZUtleTogc3RyaW5nIH0sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxGZWF0dXJlRmxhZ0FjY2VzcyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5maW5kRmVhdHVyZUFjY2VzcyhpbnB1dCwgLi4uYXJncykuY2F0Y2goXG4gICAgICAoKSA9PiB1bmRlZmluZWRcbiAgICApO1xuICAgIGlmICghZXhpc3RpbmcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWNjZXNzUmVwb3NpdG9yeSgpLmRlbGV0ZShleGlzdGluZy5pZCwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBmaW5kRmVhdHVyZUFjY2VzcyhcbiAgICBxdWVyeTogRmVhdHVyZUZsYWdBY2Nlc3NRdWVyeSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEZlYXR1cmVGbGFnQWNjZXNzPiB7XG4gICAgY29uc3QgY29uZGl0aW9uID0gdGhpcy5idWlsZEFjY2Vzc0NvbmRpdGlvbihxdWVyeSk7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuZ2V0QWNjZXNzUmVwb3NpdG9yeSgpXG4gICAgICAuc2VsZWN0KClcbiAgICAgIC53aGVyZShjb25kaXRpb24pXG4gICAgICAuZXhlY3V0ZSguLi5hcmdzKTtcbiAgICBjb25zdCBleGlzdGluZyA9IHJlc3VsdHNbMF07XG4gICAgaWYgKCFleGlzdGluZykge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBGZWF0dXJlIGFjY2VzcyBmb3IgJHtub3JtYWxpemVGZWF0dXJlU3ViamVjdFR5cGUocXVlcnkuc3ViamVjdFR5cGUpfToke25vcm1hbGl6ZUZlYXR1cmVTdWJqZWN0S2V5KHF1ZXJ5LnN1YmplY3RLZXkpfSBub3QgZm91bmRgXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZXhpc3Rpbmc7XG4gIH1cblxuICBhc3luYyBsaXN0RmVhdHVyZUFjY2VzcyhcbiAgICBxdWVyeTogRmVhdHVyZUZsYWdBY2Nlc3NRdWVyeSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEZlYXR1cmVGbGFnQWNjZXNzW10+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRBY2Nlc3NSZXBvc2l0b3J5KClcbiAgICAgIC5zZWxlY3QoKVxuICAgICAgLndoZXJlKHRoaXMuYnVpbGRBY2Nlc3NDb25kaXRpb24ocXVlcnkpKVxuICAgICAgLmV4ZWN1dGUoLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyByZXNvbHZlRmVhdHVyZUZsYWdzRm9yU3ViamVjdChcbiAgICBzdWJqZWN0OiBGZWF0dXJlRmxhZ0FjY2Vzc1N1YmplY3QsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxGZWF0dXJlRmxhZ1JlZ2lzdHJ5PiB7XG4gICAgdGhpcy5hc3NlcnRJbml0aWFsaXplZCgpO1xuICAgIGNvbnN0IGFjY2VzcyA9IGF3YWl0IHRoaXMubGlzdEZlYXR1cmVBY2Nlc3MoXG4gICAgICB7XG4gICAgICAgIC4uLnN1YmplY3QsXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgY29uc3QgZmVhdHVyZUtleXMgPSBbLi4ubmV3IFNldChhY2Nlc3MubWFwKChpdGVtKSA9PiBpdGVtLmZlYXR1cmVLZXkpKV07XG4gICAgaWYgKGZlYXR1cmVLZXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHt9O1xuXG4gICAgY29uc3QgY29uZGl0aW9uID0gQ29uZGl0aW9uLmF0dHI8RmVhdHVyZUZsYWc+KFwiZW5hYmxlZFwiKS5lcSh0cnVlKS5hbmQoXG4gICAgICBDb25kaXRpb24uYXR0cjxGZWF0dXJlRmxhZz4oXCJrZXlcIikuaW4oXG4gICAgICAgIGZlYXR1cmVLZXlzLm1hcChub3JtYWxpemVGZWF0dXJlTmFtZSlcbiAgICAgIClcbiAgICApO1xuXG4gICAgY29uc3QgZW5hYmxlZEZsYWdzID0gYXdhaXQgdGhpcy5yZXBvLnNlbGVjdCgpLndoZXJlKGNvbmRpdGlvbikuZXhlY3V0ZSguLi5hcmdzKTtcbiAgICByZXR1cm4gZW5hYmxlZEZsYWdzLnJlZHVjZSgocmVnaXN0cnksIGZsYWcpID0+IHtcbiAgICAgIHJlZ2lzdHJ5W2ZsYWcua2V5XSA9IGZsYWcuY29uZmlnID8/IHRydWU7XG4gICAgICByZXR1cm4gcmVnaXN0cnk7XG4gICAgfSwge30gYXMgRmVhdHVyZUZsYWdSZWdpc3RyeSk7XG4gIH1cblxuICBhc3luYyBpc0VuYWJsZWRGb3JTdWJqZWN0KFxuICAgIGtleTogc3RyaW5nLFxuICAgIHN1YmplY3Q6IEZlYXR1cmVGbGFnQWNjZXNzU3ViamVjdCxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCByZWdpc3RyeSA9IGF3YWl0IHRoaXMucmVzb2x2ZUZlYXR1cmVGbGFnc0ZvclN1YmplY3Qoc3ViamVjdCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIGlzRmVhdHVyZUZsYWdFbmFibGVkQnlOYW1lKHJlZ2lzdHJ5LCBrZXkpO1xuICB9XG5cbiAgaXNFbmFibGVkKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhpcy5hc3NlcnRJbml0aWFsaXplZCgpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRLZXkgPSBub3JtYWxpemVGZWF0dXJlTmFtZShrZXkpO1xuICAgIHJldHVybiBpc0ZlYXR1cmVGbGFnRW5hYmxlZEJ5TmFtZSh0aGlzLmNhY2hlZFJlZ2lzdHJ5LCBub3JtYWxpemVkS2V5KTtcbiAgfVxuXG4gIGFzeW5jIHJlc29sdmVGZWF0dXJlRmxhZ3MoKTogUHJvbWlzZTxGZWF0dXJlRmxhZ1JlZ2lzdHJ5PiB7XG4gICAgdGhpcy5hc3NlcnRJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmNsb25lUmVnaXN0cnkodGhpcy5jYWNoZWRSZWdpc3RyeSk7XG4gIH1cblxuICBhc3luYyBzeW5jRnJvbUVudmlyb25tZW50KFxuICAgIG9wdGlvbnM6IEZlYXR1cmVGbGFnUmVhZGVySW5wdXQgPSB7fSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEZlYXR1cmVGbGFnW10+IHtcbiAgICB0aGlzLmFzc2VydEluaXRpYWxpemVkKCk7XG4gICAgY29uc3QgcmVnaXN0cnkgPSBhd2FpdCB0aGlzLnJlYWRlci5yZWFkKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBzb3VyY2U6IG9wdGlvbnMuc291cmNlID8/IEZlYXR1cmVGbGFnRW52aXJvbm1lbnQsXG4gICAgfSk7XG4gICAgY29uc3QgcmVzdWx0czogRmVhdHVyZUZsYWdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlZ2lzdHJ5KSkge1xuICAgICAgY29uc3QgY29uZmlnID1cbiAgICAgICAgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgICAgID8gKHZhbHVlIGFzIEZlYXR1cmVGbGFnQ29uZmlnKVxuICAgICAgICAgIDogeyBlbmFibGVkOiBCb29sZWFuKHZhbHVlKSB9O1xuICAgICAgY29uc3QgeyBlbmFibGVkOiBfaWdub3JlZEVuYWJsZWQsIC4uLnJlc3RDb25maWcgfSA9IGNvbmZpZztcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRLZXkgPSBub3JtYWxpemVGZWF0dXJlTmFtZShrZXkpO1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLmZpbmRPbmVCeShcbiAgICAgICAgXCJrZXlcIixcbiAgICAgICAgbm9ybWFsaXplZEtleSxcbiAgICAgICAgLi4uYXJnc1xuICAgICAgKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgY29uc3QgbW9kZWwgPSBleGlzdGluZ1xuICAgICAgICA/IE9iamVjdC5hc3NpZ24oZXhpc3RpbmcsIHtcbiAgICAgICAgICAgIGVuYWJsZWQ6IGlzRmVhdHVyZUZsYWdFbmFibGVkKHZhbHVlKSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiByZXN0Q29uZmlnLmRlc2NyaXB0aW9uID8/IGV4aXN0aW5nLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgc2NvcGU6IHJlc3RDb25maWcuc2NvcGUgPz8gZXhpc3Rpbmcuc2NvcGUsXG4gICAgICAgICAgICBtZXRhZGF0YTogcmVzdENvbmZpZy5tZXRhZGF0YSA/PyBleGlzdGluZy5tZXRhZGF0YSxcbiAgICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgICAuLi5yZXN0Q29uZmlnLFxuICAgICAgICAgICAgICBlbmFibGVkOiBpc0ZlYXR1cmVGbGFnRW5hYmxlZCh2YWx1ZSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pXG4gICAgICAgIDogbmV3IEZlYXR1cmVGbGFnKHtcbiAgICAgICAgICAgIGtleTogbm9ybWFsaXplZEtleSxcbiAgICAgICAgICAgIGVuYWJsZWQ6IGlzRmVhdHVyZUZsYWdFbmFibGVkKHZhbHVlKSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiByZXN0Q29uZmlnLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgc2NvcGU6IHJlc3RDb25maWcuc2NvcGUsXG4gICAgICAgICAgICBtZXRhZGF0YTogcmVzdENvbmZpZy5tZXRhZGF0YSxcbiAgICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgICAuLi5yZXN0Q29uZmlnLFxuICAgICAgICAgICAgICBlbmFibGVkOiBpc0ZlYXR1cmVGbGFnRW5hYmxlZCh2YWx1ZSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgcmVzdWx0cy5wdXNoKGV4aXN0aW5nID8gYXdhaXQgdGhpcy51cGRhdGUobW9kZWwsIC4uLmFyZ3MpIDogYXdhaXQgdGhpcy5jcmVhdGUobW9kZWwsIC4uLmFyZ3MpKTtcbiAgICB9XG4gICAgdGhpcy5jYWNoZWRSZWdpc3RyeSA9IGF3YWl0IHRoaXMucmVmcmVzaENhY2hlZFJlZ2lzdHJ5KFxuICAgICAge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBzb3VyY2U6IG9wdGlvbnMuc291cmNlID8/IEZlYXR1cmVGbGFnRW52aXJvbm1lbnQsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIE1ldGFkYXRhLFxuICBtZXRhZGF0YSxcbiAgbWV0aG9kTWV0YWRhdGEsXG4gIHByb3BNZXRhZGF0YSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQge1xuICBGRUFUVVJFX0ZMQUdfQVVUSF9LRVksXG4gIEZFQVRVUkVfRkxBR19CTE9DS19LRVksXG4gIEZFQVRVUkVfRkxBR19ISURFX0tFWSxcbiAgRkVBVFVSRV9GTEFHX01PREVMX0tFWSxcbiAgRkVBVFVSRV9GTEFHX1JFTkRFUl9LRVksXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHR5cGUgeyBGZWF0dXJlRmxhZ1J1bGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplRmVhdHVyZVJ1bGUsXG4gIGlzRmVhdHVyZVJ1bGVCbG9ja2VkLFxuICBpc0ZlYXR1cmVSdWxlU2F0aXNmaWVkLFxuICByZWFkTWV0YWRhdGEsXG59IGZyb20gXCIuL3V0aWxzXCI7XG5cbnR5cGUgRmVhdHVyZURlY29yYXRvcktleSA9XG4gIHwgdHlwZW9mIEZFQVRVUkVfRkxBR19NT0RFTF9LRVlcbiAgfCB0eXBlb2YgRkVBVFVSRV9GTEFHX0FVVEhfS0VZXG4gIHwgdHlwZW9mIEZFQVRVUkVfRkxBR19CTE9DS19LRVlcbiAgfCB0eXBlb2YgRkVBVFVSRV9GTEFHX1JFTkRFUl9LRVlcbiAgfCB0eXBlb2YgRkVBVFVSRV9GTEFHX0hJREVfS0VZO1xuXG5mdW5jdGlvbiBmZWF0dXJlTWV0YWRhdGFLZXkoXG4gIGtleTogRmVhdHVyZURlY29yYXRvcktleSxcbiAgcHJvcGVydHlLZXk/OiBzdHJpbmcgfCBzeW1ib2xcbik6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgcHJvcGVydHlLZXkgPT09IFwidW5kZWZpbmVkXCJcbiAgICA/IGtleVxuICAgIDogTWV0YWRhdGEua2V5KGtleSwgcHJvcGVydHlLZXkudG9TdHJpbmcoKSk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5RmVhdHVyZURlY29yYXRvcihcbiAga2V5OiBGZWF0dXJlRGVjb3JhdG9yS2V5LFxuICBmZWF0dXJlczogc3RyaW5nW10sXG4gIG1hdGNoOiBGZWF0dXJlRmxhZ1J1bGVbXCJtYXRjaFwiXSA9IFwiYW55XCJcbikge1xuICBjb25zdCBydWxlID0gbm9ybWFsaXplRmVhdHVyZVJ1bGUoZmVhdHVyZXMsIG1hdGNoKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIGZlYXR1cmVEZWNvcmF0b3IoXG4gICAgdGFyZ2V0OiBhbnksXG4gICAgcHJvcGVydHlLZXk/OiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgZGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvclxuICApIHtcbiAgICBpZiAodHlwZW9mIHByb3BlcnR5S2V5ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICByZXR1cm4gbWV0YWRhdGEoa2V5LCBydWxlKSh0YXJnZXQpO1xuICAgIH1cbiAgICBjb25zdCBzY29wZWRLZXkgPSBmZWF0dXJlTWV0YWRhdGFLZXkoa2V5LCBwcm9wZXJ0eUtleSk7XG4gICAgaWYgKGRlc2NyaXB0b3IpIHtcbiAgICAgIHJldHVybiBtZXRob2RNZXRhZGF0YShzY29wZWRLZXksIHJ1bGUpKHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvcE1ldGFkYXRhKHNjb3BlZEtleSwgcnVsZSkodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmZWF0dXJlRmxhZ3MoLi4uZmVhdHVyZXM6IHN0cmluZ1tdKSB7XG4gIHJldHVybiBhcHBseUZlYXR1cmVEZWNvcmF0b3IoRkVBVFVSRV9GTEFHX01PREVMX0tFWSwgZmVhdHVyZXMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmVhdHVyZUF1dGgoLi4uZmVhdHVyZXM6IHN0cmluZ1tdKSB7XG4gIHJldHVybiBhcHBseUZlYXR1cmVEZWNvcmF0b3IoRkVBVFVSRV9GTEFHX0FVVEhfS0VZLCBmZWF0dXJlcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBibG9ja0ZlYXR1cmVPcGVyYXRpb25zKC4uLmZlYXR1cmVzOiBzdHJpbmdbXSkge1xuICByZXR1cm4gYXBwbHlGZWF0dXJlRGVjb3JhdG9yKEZFQVRVUkVfRkxBR19CTE9DS19LRVksIGZlYXR1cmVzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlcklmRmVhdHVyZSguLi5mZWF0dXJlczogc3RyaW5nW10pIHtcbiAgcmV0dXJuIGFwcGx5RmVhdHVyZURlY29yYXRvcihGRUFUVVJFX0ZMQUdfUkVOREVSX0tFWSwgZmVhdHVyZXMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGlkZU9uRmVhdHVyZSguLi5mZWF0dXJlczogc3RyaW5nW10pIHtcbiAgcmV0dXJuIGFwcGx5RmVhdHVyZURlY29yYXRvcihGRUFUVVJFX0ZMQUdfSElERV9LRVksIGZlYXR1cmVzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZlYXR1cmVHYXRlTWV0YWRhdGEoXG4gIHRhcmdldDogb2JqZWN0LFxuICBrZXk6XG4gICAgfCB0eXBlb2YgRkVBVFVSRV9GTEFHX01PREVMX0tFWVxuICAgIHwgdHlwZW9mIEZFQVRVUkVfRkxBR19BVVRIX0tFWVxuICAgIHwgdHlwZW9mIEZFQVRVUkVfRkxBR19CTE9DS19LRVlcbiAgICB8IHR5cGVvZiBGRUFUVVJFX0ZMQUdfUkVOREVSX0tFWVxuICAgIHwgdHlwZW9mIEZFQVRVUkVfRkxBR19ISURFX0tFWSxcbiAgcHJvcGVydHlLZXk/OiBzdHJpbmcgfCBzeW1ib2xcbik6IEZlYXR1cmVGbGFnUnVsZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiByZWFkTWV0YWRhdGE8RmVhdHVyZUZsYWdSdWxlPihcbiAgICB0YXJnZXQsXG4gICAgZmVhdHVyZU1ldGFkYXRhS2V5KGtleSwgcHJvcGVydHlLZXkpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRFeHBvc2VGb3JGZWF0dXJlcyhcbiAgdGFyZ2V0OiBvYmplY3QsXG4gIGVuYWJsZWRGZWF0dXJlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGtleTpcbiAgICB8IHR5cGVvZiBGRUFUVVJFX0ZMQUdfTU9ERUxfS0VZXG4gICAgfCB0eXBlb2YgRkVBVFVSRV9GTEFHX0FVVEhfS0VZXG4gICAgfCB0eXBlb2YgRkVBVFVSRV9GTEFHX0JMT0NLX0tFWVxuICAgIHwgdHlwZW9mIEZFQVRVUkVfRkxBR19SRU5ERVJfS0VZXG4gICAgfCB0eXBlb2YgRkVBVFVSRV9GTEFHX0hJREVfS0VZLFxuICBwcm9wZXJ0eUtleT86IHN0cmluZyB8IHN5bWJvbFxuKSB7XG4gIGNvbnN0IHJ1bGUgPSBnZXRGZWF0dXJlR2F0ZU1ldGFkYXRhKHRhcmdldCwga2V5LCBwcm9wZXJ0eUtleSk7XG4gIHJldHVybiBpc0ZlYXR1cmVSdWxlU2F0aXNmaWVkKHJ1bGUsIGVuYWJsZWRGZWF0dXJlcyBhcyBhbnkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkSGlkZUZvckZlYXR1cmVzKFxuICB0YXJnZXQ6IG9iamVjdCxcbiAgZW5hYmxlZEZlYXR1cmVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAga2V5OlxuICAgIHwgdHlwZW9mIEZFQVRVUkVfRkxBR19NT0RFTF9LRVlcbiAgICB8IHR5cGVvZiBGRUFUVVJFX0ZMQUdfQVVUSF9LRVlcbiAgICB8IHR5cGVvZiBGRUFUVVJFX0ZMQUdfQkxPQ0tfS0VZXG4gICAgfCB0eXBlb2YgRkVBVFVSRV9GTEFHX1JFTkRFUl9LRVlcbiAgICB8IHR5cGVvZiBGRUFUVVJFX0ZMQUdfSElERV9LRVksXG4gIHByb3BlcnR5S2V5Pzogc3RyaW5nIHwgc3ltYm9sXG4pIHtcbiAgY29uc3QgcnVsZSA9IGdldEZlYXR1cmVHYXRlTWV0YWRhdGEodGFyZ2V0LCBrZXksIHByb3BlcnR5S2V5KTtcbiAgcmV0dXJuIGlzRmVhdHVyZVJ1bGVCbG9ja2VkKHJ1bGUsIGVuYWJsZWRGZWF0dXJlcyBhcyBhbnkpO1xufVxuXG5leHBvcnQge1xuICBGRUFUVVJFX0ZMQUdfQVVUSF9LRVksXG4gIEZFQVRVUkVfRkxBR19CTE9DS19LRVksXG4gIEZFQVRVUkVfRkxBR19ISURFX0tFWSxcbiAgRkVBVFVSRV9GTEFHX01PREVMX0tFWSxcbiAgRkVBVFVSRV9GTEFHX1JFTkRFUl9LRVksXG59O1xuIiwiLyoqXG4gKiBAbW9kdWxlIGludGVncmF0aW9uc1xuICogQHN1bW1hcnkgUGFja2FnZSBlbnRyeSBwb2ludCBmb3Igc2hhcmVkIGludGVncmF0aW9uIGhlbHBlcnMuXG4gKiBAZGVzY3JpcHRpb24gRXhwb3NlcyB0aGUgcGFja2FnZSB1dGlsaXRpZXMgYW5kIGJ1aWxkLXRpbWUgdmVyc2lvbiBtZXRhZGF0YSBmb3IgYEBkZWNhZi10cy9pbnRlZ3JhdGlvbnNgLlxuICovXG5leHBvcnQgKiBmcm9tIFwiLi91dGlsc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbmFtZXNwYWNlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmVhdHVyZS1mbGFnc1wiO1xuXG5leHBvcnQgY29uc3QgVkVSU0lPTjogc3RyaW5nID0gXCIjI1ZFUlNJT04jI1wiO1xuXG5leHBvcnQgY29uc3QgQ09NTUlUID0gXCIjI0NPTU1JVCMjXCI7XG5cbmV4cG9ydCBjb25zdCBGVUxMX1ZFUlNJT04gPSBcIiMjRlVMTF9WRVJTSU9OIyNcIjtcblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRTogc3RyaW5nID0gXCIjI1BBQ0tBR0UjI1wiO1xuIl0sIm5hbWVzIjpbImFzeW5jIiwiZXhlY1dpdGhMb2dnaW5nIiwiY29tbWFuZCIsIm9wdGlvbnMiLCJsb2ciLCJsZXZlbCIsIkxvZ0xldmVsIiwiaW5mbyIsImRlYnVnIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJjaGlsZCIsImV4ZWMiLCJzdGRvdXQiLCJzdGRlcnIiLCJvbiIsImRhdGEiLCJwdXNoIiwidHJpbSIsImNvZGUiLCJzaWxseSIsImpvaW4iLCJjcml0aWNhbCIsIkludGVybmFsRXJyb3IiLCJlcnIiLCJJc29sYXRpb25UaWVyIiwiTWVtYmVyc2hpcFN0YXR1cyIsIlByaW5jaXBhbEtpbmQiLCJTY29wZUtpbmQiLCJQZXJtaXNzaW9uQ2F0ZWdvcnkiLCJSZXNvdXJjZVZpc2liaWxpdHkiLCJTdG9yYWdlS2luZCIsIlN0b3JhZ2VCaW5kaW5nS2luZCIsIklzb2xhdGlvblRpZXJPcHRpb25zIiwiT2JqZWN0IiwidmFsdWVzIiwiTWVtYmVyc2hpcFN0YXR1c09wdGlvbnMiLCJQcmluY2lwYWxLaW5kT3B0aW9ucyIsIlNjb3BlS2luZE9wdGlvbnMiLCJQZXJtaXNzaW9uQ2F0ZWdvcnlPcHRpb25zIiwiUmVzb3VyY2VWaXNpYmlsaXR5T3B0aW9ucyIsIlN0b3JhZ2VLaW5kT3B0aW9ucyIsIlN0b3JhZ2VCaW5kaW5nS2luZE9wdGlvbnMiLCJSRUxfUkVTVFJJQ1QiLCJ1cGRhdGUiLCJDYXNjYWRlIiwiTk9ORSIsImRlbGV0ZSIsIm51bGxhYmxlIiwiUkVMX05VTExJRlkiLCJSRUxfQ0FTQ0FERV9ERVBFTkRFTlQiLCJDQVNDQURFIiwiUkVMX0NBU0NBREVfSU5TRVJUX1VQREFURSIsImJ1aWxkQXJhbmdvQ29udGV4dCIsInRlbmFudElkIiwicHJpbmNpcGFsSWQiLCJwZXJtaXNzaW9uS2V5IiwiYWxsb3dlZE9yZ1VuaXRJZHMiLCJhbGxvd2VkUmVzb3VyY2VJZHMiLCJidWlsZFFkcmFudEZpbHRlciIsIm11c3QiLCJrZXkiLCJtYXRjaCIsInZhbHVlIiwic2hvdWxkIiwiYW55Iiwic2NvcGVLZXkiLCJzY29wZUtpbmQiLCJzY29wZUlkIiwibm93SXNvIiwiRGF0ZSIsImFzQXJyYXkiLCJzYW1lVGVuYW50Iiwicm93VGVuYW50IiwicmVsYXRpb25JZCIsInJlbGF0aW9uTWF0Y2giLCJ0YXJnZXQiLCJsb3dlclNsdWciLCJ0b0xvd2VyQ2FzZSIsInJlcGxhY2UiLCJpc1RpbWVWYWxpZCIsImF0Iiwic3RhcnRzQXQiLCJleHBpcmVzQXQiLCJpbnN0YW50IiwiYnVpbGRBY2Nlc3NDb250ZXh0IiwicGVybWlzc2lvbnNCeVNjb3BlIiwiYWxsb3dlZE9yZ1VuaXRJZHNCeVBlcm1pc3Npb24iLCJwZXJtaXNzaW9uIiwicGVybWlzc2lvbnMiLCJPcmdVbml0IiwicmVzb3VyY2VHcmFudHMiLCJncmFudHMiLCJtYXAiLCJncmFudCIsInJlc291cmNlSWQiLCJCYXNlTW9kZWxTZXJ2aWNlIiwiTW9kZWxTZXJ2aWNlIiwiY29uc3RydWN0b3IiLCJjbGF6eiIsInN1cGVyIiwibmV3TW9kZWwiLCJhc3NpZ24iLCJjcmVhdGUiLCJhcmdzIiwidGhpcyIsInJlcG8iLCJjcmVhdGVPbmUiLCJnZXRCeUlkIiwiaWQiLCJyZWFkIiwidXBkYXRlT25lIiwicGF0Y2giLCJleGlzdGluZyIsImRlbGV0ZUJ5SWQiLCJmaW5kT25lQnkiLCJmaW5kTWFueUJ5Iiwic2VsZWN0Iiwid2hlcmUiLCJleGVjdXRlIiwibGlzdEFsbCIsImNyeXB0byIsInJhbmRvbVVVSUQiLCJBdXRob3JpemF0aW9uTW9kZWwiLCJNb2RlbCIsIlRlbmFudE1lbWJlcnNoaXAiLCJfX2RlY29yYXRlIiwicGsiLCJ0eXBlIiwiU3RyaW5nIiwidXVpZCIsInByb3RvdHlwZSIsIm1hbnlUb09uZSIsIlRlbmFudCIsInVuZGVmaW5lZCIsInJlcXVpcmVkIiwiVXNlciIsInR5cGVPZiIsIm9wdGlvbiIsImNvbHVtbiIsImNyZWF0ZWRBdCIsInVwZGF0ZWRBdCIsInRhYmxlIiwibW9kZWwiLCJ1bmlxdWUiLCJvbmVUb01hbnkiLCJPcmdVbml0TWVtYmVyc2hpcCIsIk9yZ1VuaXRDbG9zdXJlIiwiTnVtYmVyIiwiUGVybWlzc2lvbiIsIlJvbGVQZXJtaXNzaW9uIiwiUm9sZSIsIlJvbGVBc3NpZ25tZW50IiwiUHJpbmNpcGFsIiwiQm9vbGVhbiIsIlJlc291cmNlR3JhbnQiLCJQcm90ZWN0ZWRSZXNvdXJjZSIsIkluaGVyaXRhbmNlQmxvY2siLCJTdG9yYWdlQmluZGluZyIsIlRlbmFudFByb2ZpbGUiLCJPcmdVbml0UHJvZmlsZSIsIkdyb3VwTWVtYmVyc2hpcCIsIkdyb3VwIiwiRWZmZWN0aXZlUGVybWlzc2lvbiIsIlRlbmFudFByb2ZpbGVTZXJ2aWNlIiwiY3JlYXRlUHJvZmlsZSIsInByb2ZpbGVLZXkiLCJtZXRhZGF0YSIsInRlbmFudCIsImxpc3RGb3JUZW5hbnQiLCJmaWx0ZXIiLCJwcm9maWxlIiwiZGVsZXRlRm9yVGVuYW50Iiwicm93IiwiT3JnVW5pdFByb2ZpbGVTZXJ2aWNlIiwib3JnVW5pdElkIiwib3JnVW5pdCIsImxpc3RGb3JPcmdVbml0IiwiT3JnVW5pdENsb3N1cmVTZXJ2aWNlIiwibGlzdEFuY2VzdG9ycyIsImRlc2NlbmRhbnQiLCJzb3J0IiwibGVmdCIsInJpZ2h0IiwiZGVwdGgiLCJsaXN0RGVzY2VuZGFudHMiLCJhbmNlc3RvciIsImlzQW5jZXN0b3JPZiIsImFuY2VzdG9yT3JnVW5pdElkIiwiZGVzY2VuZGFudE9yZ1VuaXRJZCIsInNvbWUiLCJjcmVhdGVTZWxmTGluayIsImluc2VydEFuY2VzdG9yTGlua3NGb3JOZXdDaGlsZCIsInBhcmVudE9yZ1VuaXRJZCIsImNoaWxkT3JnVW5pdElkIiwiYW5jZXN0b3JMaW5rcyIsImxpbmsiLCJkZWxldGVMaW5rc0ZvclN1YnRyZWUiLCJzdWJ0cmVlIiwiZGVzY2VuZGFudElkcyIsIlNldCIsImFuY2VzdG9ySWRzIiwicm93cyIsImhhcyIsIkluaGVyaXRhbmNlQmxvY2tTZXJ2aWNlIiwiYmxvY2tDYXRlZ29yeSIsInBlcm1pc3Npb25DYXRlZ29yeSIsImJsb2NrZWRGcm9tQW5jZXN0b3JJZCIsInJlYXNvbiIsImJsb2NrZWRGcm9tQW5jZXN0b3IiLCJ1bmJsb2NrQ2F0ZWdvcnkiLCJibG9ja0lkIiwiYmxvY2siLCJjYXRlZ29yeUJsb2NrZWRGb3JBbmNlc3RvciIsImNhdGVnb3J5IiwiVGVuYW50U2VydmljZSIsImNyZWF0ZVRlbmFudCIsImlucHV0Iiwic2x1ZyIsIm5hbWUiLCJpc29sYXRpb25UaWVyIiwiUG9vbGVkIiwiZ2V0QnlTbHVnIiwicmVuYW1lVGVuYW50IiwiY2hhbmdlU2x1ZyIsInNldElzb2xhdGlvblRpZXIiLCJkZWxldGVUZW5hbnRDb250cm9sbGVkIiwiZGVsZXRlUm93c0J5SWQiLCJzZXJ2aWNlIiwiT3JnVW5pdFNlcnZpY2UiLCJvcmdVbml0UGF0aCIsInBhcmVudFBhdGgiLCJzZWdtZW50IiwiY3JlYXRlUHJvZmlsZUlmTmVlZGVkIiwicHJvZmlsZU1ldGFkYXRhIiwiY3JlYXRlUm9vdCIsInBhdGgiLCJjcmVhdGVDaGlsZCIsInBhcmVudCIsImNsb3N1cmVTZXJ2aWNlIiwibGlzdENoaWxkcmVuIiwibGlzdFRlbmFudE9yZ1VuaXRzIiwibGlzdERlc2NlbmRhbnRPcmdVbml0cyIsImluY2x1ZGVTZWxmIiwiZGVzY2VuZGFudHMiLCJpZHMiLCJhZGQiLCJsaXN0QW5jZXN0b3JPcmdVbml0cyIsImFuY2VzdG9ycyIsInJlbmFtZU9yZ1VuaXQiLCJpbmNsdWRlcyIsIm1vdmVPcmdVbml0IiwibmV3UGFyZW50T3JnVW5pdElkIiwibmV3UGFyZW50IiwidXBkYXRlZCIsInJlYnVpbGRUZW5hbnRDbG9zdXJlIiwiZXhpc3RpbmdMaW5rcyIsIm9yZ1VuaXRzIiwibGVmdERlcHRoIiwic3BsaXQiLCJsZW5ndGgiLCJyaWdodERlcHRoIiwiZGVsZXRlT3JnVW5pdFRyZWUiLCJ0cmFuc2FjdGlvbmFsIiwiVXNlclNlcnZpY2UiLCJjcmVhdGVVc2VyIiwiZW1haWwiLCJwaG9uZSIsImRpc3BsYXlOYW1lIiwiZ2V0QnlFbWFpbCIsImZpbmQiLCJ1c2VyIiwidXBkYXRlRGlzcGxheU5hbWUiLCJ1c2VySWQiLCJ1cGRhdGVFbWFpbCIsInVwZGF0ZVBob25lIiwiUHJpbmNpcGFsU2VydmljZSIsImNyZWF0ZVByaW5jaXBhbCIsImtpbmQiLCJzdWJqZWN0SWQiLCJnZXRGb3JTdWJqZWN0IiwicHJpbmNpcGFsIiwiZ2V0T3JDcmVhdGVGb3JTdWJqZWN0IiwiZ2V0VXNlclByaW5jaXBhbCIsImdldEdyb3VwUHJpbmNpcGFsIiwiZ3JvdXBJZCIsIlRlbmFudE1lbWJlcnNoaXBTZXJ2aWNlIiwiYWRkVXNlclRvVGVuYW50Iiwic3RhdHVzIiwiQWN0aXZlIiwic2V0U3RhdHVzIiwibWVtYmVyc2hpcElkIiwibGlzdFVzZXJUZW5hbnRzIiwibWVtYmVyc2hpcCIsImxpc3RUZW5hbnRVc2VycyIsInJlbW92ZVVzZXJGcm9tVGVuYW50IiwiT3JnVW5pdE1lbWJlcnNoaXBTZXJ2aWNlIiwiYWRkVXNlclRvT3JnVW5pdCIsImxpc3RVc2VyT3JnVW5pdHMiLCJsaXN0T3JnVW5pdFVzZXJzIiwicmVtb3ZlVXNlckZyb21PcmdVbml0IiwiR3JvdXBTZXJ2aWNlIiwiY3JlYXRlR3JvdXAiLCJyZW5hbWVHcm91cCIsIm1vdmVHcm91cFRvT3JnVW5pdCIsImxpc3RUZW5hbnRHcm91cHMiLCJncm91cCIsIkdyb3VwTWVtYmVyc2hpcFNlcnZpY2UiLCJhZGRQcmluY2lwYWxUb0dyb3VwIiwibGlzdEdyb3VwTWVtYmVycyIsImxpc3RQcmluY2lwYWxHcm91cHMiLCJyZW1vdmVQcmluY2lwYWxGcm9tR3JvdXAiLCJyZXNvbHZlR3JvdXBQcmluY2lwYWxJZHNGb3JQcmluY2lwYWwiLCJwcmluY2lwYWxTZXJ2aWNlIiwibWVtYmVyc2hpcHMiLCJwcmluY2lwYWxzIiwiYWxsIiwiUGVybWlzc2lvblNlcnZpY2UiLCJjcmVhdGVQZXJtaXNzaW9uIiwiZGVzY3JpcHRpb24iLCJnZXRCeUtleSIsImxpc3RCeUNhdGVnb3J5IiwidXBkYXRlRGVzY3JpcHRpb24iLCJwZXJtaXNzaW9uSWQiLCJSb2xlU2VydmljZSIsImNyZWF0ZVJvbGUiLCJnZXRTeXN0ZW1Sb2xlQnlLZXkiLCJyb2xlIiwiY2FuZGlkYXRlIiwiRXJyb3IiLCJnZXRUZW5hbnRSb2xlQnlLZXkiLCJyZW5hbWVSb2xlIiwicm9sZUlkIiwidXBkYXRlUm9sZU1ldGFkYXRhIiwibGlzdFRlbmFudFJvbGVzIiwiaW5jbHVkZVN5c3RlbSIsIlJvbGVQZXJtaXNzaW9uU2VydmljZSIsImFkZFBlcm1pc3Npb25Ub1JvbGUiLCJhZGRQZXJtaXNzaW9uS2V5VG9Sb2xlIiwicmVtb3ZlUGVybWlzc2lvbkZyb21Sb2xlIiwicm9sZVBlcm1pc3Npb25JZCIsImxpc3RSb2xlUGVybWlzc2lvbnMiLCJyb2xlUGVybWlzc2lvbiIsImxpc3RQZXJtaXNzaW9uUm9sZXMiLCJyZXBsYWNlUm9sZVBlcm1pc3Npb25zIiwicGVybWlzc2lvbklkcyIsImNyZWF0ZVJvbGVXaXRoUGVybWlzc2lvbnMiLCJwZXJtaXNzaW9uS2V5cyIsIlJvbGVBc3NpZ25tZW50U2VydmljZSIsImFzc2lnblJvbGUiLCJpbmhlcml0RG93biIsImNvbmRpdGlvbnMiLCJyZXZva2VBc3NpZ25tZW50IiwiYXNzaWdubWVudElkIiwibGlzdFByaW5jaXBhbEFzc2lnbm1lbnRzIiwiYXNzaWdubWVudCIsImxpc3RSb2xlQXNzaWdubWVudHMiLCJsaXN0VGVuYW50QXNzaWdubWVudHMiLCJ1cGRhdGVBc3NpZ25tZW50V2luZG93IiwiRWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UiLCJsaXN0Rm9yUHJpbmNpcGFsIiwibGlzdEZvclNjb3BlIiwiaGFzUGVybWlzc2lvbiIsImRlbGV0ZUZvclByaW5jaXBhbCIsInJlYnVpbGRGb3JQcmluY2lwYWwiLCJyb2xlQXNzaWdubWVudFNlcnZpY2UiLCJyb2xlUGVybWlzc2lvblNlcnZpY2UiLCJwZXJtaXNzaW9uU2VydmljZSIsImdyb3VwTWVtYmVyc2hpcFNlcnZpY2UiLCJvcmdVbml0Q2xvc3VyZVNlcnZpY2UiLCJpbmhlcml0YW5jZUJsb2NrU2VydmljZSIsIm1hdGVyaWFsaXplZCIsInNvdXJjZUFzc2lnbm1lbnRzIiwiZ3JvdXBNZW1iZXJzaGlwcyIsImdyb3VwQXNzaWdubWVudHMiLCJncm91cFByaW5jaXBhbCIsImZsYXQiLCJhc3NpZ25tZW50cyIsInJvbGVQZXJtaXNzaW9ucyIsInNjb3BlcyIsIlJlc291cmNlIiwic2NvcGVkIiwic291cmNlS2luZCIsInNvdXJjZUlkIiwiY3JlYXRlZCIsInJlYnVpbGRGb3JUZW5hbnQiLCJQcm90ZWN0ZWRSZXNvdXJjZVNlcnZpY2UiLCJyZWdpc3RlclJlc291cmNlIiwicmVzb3VyY2VUeXBlIiwidmlzaWJpbGl0eSIsIm93bmVyIiwib3duZXJQcmluY2lwYWxJZCIsInNlbnNpdGl2aXR5IiwiZ2V0QnlEb21haW5SZXNvdXJjZSIsInJlc291cmNlIiwibW92ZVJlc291cmNlVG9PcmdVbml0IiwicHJvdGVjdGVkUmVzb3VyY2VJZCIsInNldFZpc2liaWxpdHkiLCJ0cmFuc2Zlck93bmVyc2hpcCIsImxpc3RPcmdVbml0UmVzb3VyY2VzIiwibGlzdFRlbmFudFJlc291cmNlcyIsIlJlc291cmNlR3JhbnRTZXJ2aWNlIiwiZ3JhbnRSZXNvdXJjZSIsImNyZWF0ZWRCeSIsImNyZWF0ZWRCeVByaW5jaXBhbElkIiwicmV2b2tlR3JhbnQiLCJncmFudElkIiwibGlzdFJlc291cmNlR3JhbnRzIiwibGlzdFByaW5jaXBhbEdyYW50cyIsImhhc0dyYW50IiwiZGVsZXRlQWxsRm9yUmVzb3VyY2UiLCJSZXNvdXJjZUxpZmVjeWNsZVNlcnZpY2UiLCJ1bnJlZ2lzdGVyUmVzb3VyY2UiLCJyZXNvbHZlUmVzb3VyY2VTY29wZSIsIlN0b3JhZ2VCaW5kaW5nU2VydmljZSIsImNyZWF0ZUJpbmRpbmciLCJzdG9yYWdlS2luZCIsImJpbmRpbmdLaW5kIiwiYmluZGluZ0tleSIsInJlZ2lvbiIsImNvbmZpZyIsImxpc3RUZW5hbnRCaW5kaW5ncyIsImJpbmRpbmciLCJnZXRCaW5kaW5nIiwic2V0QmluZGluZ0NvbmZpZyIsImJpbmRpbmdJZCIsInByb21vdGVUb0RlZGljYXRlZCIsIkRlZGljYXRlZCIsInNldFNoYXJlZCIsIlNoYXJlZCIsIkJvb3RzdHJhcFNlcnZpY2UiLCJ0ZW5hbnRTZXJ2aWNlIiwidGVuYW50UHJvZmlsZVNlcnZpY2UiLCJvcmdVbml0U2VydmljZSIsIm9yZ1VuaXRQcm9maWxlU2VydmljZSIsInVzZXJTZXJ2aWNlIiwibWVtYmVyc2hpcFNlcnZpY2UiLCJyb2xlU2VydmljZSIsImVmZmVjdGl2ZVBlcm1pc3Npb25TZXJ2aWNlIiwiYm9vdHN0cmFwVGVuYW50RnJvbVRlbXBsYXRlIiwidGVtcGxhdGUiLCJjcmVhdGVPcmdUcmVlIiwicGFyZW50SWQiLCJjaGlsZHJlbiIsInJvb3RPcmdVbml0Iiwib3duZXJVc2VyIiwib3duZXJQcmluY2lwYWwiLCJyb2xlcyIsImNyZWF0ZWRSb2xlIiwib3duZXJSb2xlIiwib3duZXJSb2xlS2V5Iiwicm9vdE9yZ1VuaXRJZCIsIm93bmVyVXNlcklkIiwiU3lzdGVtTWFuYWdlbWVudFNlcnZpY2UiLCJvcmdNZW1iZXJzaGlwU2VydmljZSIsIm9uYm9hcmRVc2VyVG9UZW5hbnRBbmRPcmdVbml0Iiwicm9sZUtleSIsImNoYW5nZVVzZXJPcmdSb2xlIiwiY3VycmVudEFzc2lnbm1lbnRzIiwic3VzcGVuZFVzZXJJblRlbmFudCIsInRlbmFudE1lbWJlcnNoaXBJZCIsIlN1c3BlbmRlZCIsInJlYWN0aXZhdGVVc2VySW5UZW5hbnQiLCJBdXRoelNlcnZpY2UiLCJkYXRhU291cmNlcyIsImNhbkFjY2VzcyIsImxpc3RFZmZlY3RpdmVQZXJtaXNzaW9uc0ZvclNjb3BlIiwicmVzb3VyY2VQcm90ZWN0ZWRJZCIsImxvYWRSZXNvdXJjZSIsIlByaXZhdGUiLCJSZXNvdXJjZUFjbCIsIk9yZ1N1YnRyZWUiLCJlZmZlY3RpdmVQZXJtaXNzaW9ucyIsInJlcXVpcmVBY2Nlc3MiLCJBdXRob3JpemF0aW9uRXJyb3IiLCJsaXN0RWZmZWN0aXZlUGVybWlzc2lvbnMiLCJhY2Nlc3MiLCJGRUFUVVJFX0ZMQUdfRU5WX1JPT1QiLCJGRUFUVVJFX0ZMQUdfRU5WX1BSRUZJWCIsIkZFQVRVUkVfRkxBR19NT0RFTF9LRVkiLCJGRUFUVVJFX0ZMQUdfQVVUSF9LRVkiLCJGRUFUVVJFX0ZMQUdfQkxPQ0tfS0VZIiwiRkVBVFVSRV9GTEFHX1JFTkRFUl9LRVkiLCJGRUFUVVJFX0ZMQUdfSElERV9LRVkiLCJub3JtYWxpemVGZWF0dXJlTmFtZSIsInRyaW1tZWQiLCJ0ZXN0IiwiY2FtZWxpemVkIiwiaGVhZCIsInRhaWwiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInNsaWNlIiwicGFyc2VSdW50aW1lVmFsdWUiLCJzdGFydHNXaXRoIiwiZW5kc1dpdGgiLCJKU09OIiwicGFyc2UiLCJub3JtYWxpemVPYmplY3RLZXkiLCJub3JtYWxpemVkIiwibm9ybWFsaXplRmVhdHVyZUNvbmZpZyIsIkFycmF5IiwiaXNBcnJheSIsInJlc3VsdCIsImVudHJpZXMiLCJmb3JFYWNoIiwicmF3Iiwibm9ybWFsaXplZEtleSIsIm5vcm1hbGl6ZUZlYXR1cmVSZWdpc3RyeSIsInJlZHVjZSIsImFjYyIsIm5vcm1hbGl6ZWRWYWx1ZSIsImlzRmVhdHVyZUZsYWdFbmFibGVkIiwiaXNGZWF0dXJlRmxhZ0VuYWJsZWRCeU5hbWUiLCJyZWdpc3RyeSIsImZlYXR1cmVOYW1lIiwibm9ybWFsaXplRmVhdHVyZVJ1bGUiLCJmZWF0dXJlcyIsImlzRmVhdHVyZVJ1bGVTYXRpc2ZpZWQiLCJydWxlIiwiZW5hYmxlZCIsImZlYXR1cmUiLCJpc0ZlYXR1cmVSdWxlQmxvY2tlZCIsInJlYWRNZXRhZGF0YSIsIk1ldGFkYXRhIiwiZ2V0Iiwibm9ybWFsaXplRmVhdHVyZVN1YmplY3RUeXBlIiwic3ViamVjdFR5cGUiLCJub3JtYWxpemVGZWF0dXJlU3ViamVjdEtleSIsInN1YmplY3RLZXkiLCJGZWF0dXJlRmxhZ0Vudmlyb25tZW50IiwiTG9nZ2VkRW52aXJvbm1lbnQiLCJhY2N1bXVsYXRlIiwibG9hZEZlYXR1cmVGbGFnc0Zyb21FbnZpcm9ubWVudCIsInNvdXJjZSIsImZlYXR1cmVGbGFnIiwicmVzb2x2ZUZlYXR1cmVGbGFnRnJvbUVudmlyb25tZW50IiwiaGFzRmVhdHVyZUZsYWdJbkVudmlyb25tZW50IiwiRmVhdHVyZUZsYWciLCJCYXNlTW9kZWwiLCJGZWF0dXJlRmxhZ0FjY2VzcyIsIkZlYXR1cmVGbGFnUmVhZGVyIiwicmVhZE9uZSIsIkVudmlyb25tZUZsYWdSZWFkZXIiLCJlbnZpcm9ubWVudCIsIkZlYXR1cmVGbGFnU2VydmljZSIsInJlYWRlciIsImNhY2hlZFJlZ2lzdHJ5IiwiaW5pdGlhbGl6ZSIsInJlcG9zaXRvcnkiLCJfcmVwb3NpdG9yeSIsInJlYWRlckNvbmZpZyIsInJlZnJlc2hDYWNoZWRSZWdpc3RyeSIsImVmZmVjdGl2ZUNvbmZpZyIsImNsaWVudCIsImNsb25lUmVnaXN0cnkiLCJlbnZSZWdpc3RyeSIsInBlcnNpc3RlZCIsImZsYWciLCJzZXRDYWNoZWRGbGFnIiwiZ2V0QWNjZXNzUmVwb3NpdG9yeSIsImFjY2Vzc1JlcG9zaXRvcnkiLCJSZXBvc2l0b3J5IiwiZm9yTW9kZWwiLCJhc3NlcnRJbml0aWFsaXplZCIsIm5vcm1hbGl6ZUZlYXR1cmVBY2Nlc3NJbnB1dCIsImZlYXR1cmVLZXkiLCJidWlsZEFjY2Vzc0NvbmRpdGlvbiIsInF1ZXJ5IiwiY29uZGl0aW9uIiwiQ29uZGl0aW9uIiwiYXR0ciIsImVxIiwiYW5kIiwiZmVhdHVyZUtleXMiLCJpbiIsInJlYWRBbGwiLCJrZXlzIiwibGlzdEVuYWJsZWQiLCJncmFudEZlYXR1cmVBY2Nlc3MiLCJmaW5kRmVhdHVyZUFjY2VzcyIsImNhdGNoIiwicmV2b2tlRmVhdHVyZUFjY2VzcyIsInJlc3VsdHMiLCJOb3RGb3VuZEVycm9yIiwibGlzdEZlYXR1cmVBY2Nlc3MiLCJyZXNvbHZlRmVhdHVyZUZsYWdzRm9yU3ViamVjdCIsInN1YmplY3QiLCJpdGVtIiwiZW5hYmxlZEZsYWdzIiwiaXNFbmFibGVkRm9yU3ViamVjdCIsImlzRW5hYmxlZCIsInJlc29sdmVGZWF0dXJlRmxhZ3MiLCJzeW5jRnJvbUVudmlyb25tZW50IiwiX2lnbm9yZWRFbmFibGVkIiwicmVzdENvbmZpZyIsInNjb3BlIiwiZmVhdHVyZU1ldGFkYXRhS2V5IiwicHJvcGVydHlLZXkiLCJ0b1N0cmluZyIsImFwcGx5RmVhdHVyZURlY29yYXRvciIsImZlYXR1cmVEZWNvcmF0b3IiLCJkZXNjcmlwdG9yIiwic2NvcGVkS2V5IiwibWV0aG9kTWV0YWRhdGEiLCJwcm9wTWV0YWRhdGEiLCJmZWF0dXJlRmxhZ3MiLCJmZWF0dXJlQXV0aCIsImJsb2NrRmVhdHVyZU9wZXJhdGlvbnMiLCJyZW5kZXJJZkZlYXR1cmUiLCJoaWRlT25GZWF0dXJlIiwiZ2V0RmVhdHVyZUdhdGVNZXRhZGF0YSIsInNob3VsZEV4cG9zZUZvckZlYXR1cmVzIiwiZW5hYmxlZEZlYXR1cmVzIiwic2hvdWxkSGlkZUZvckZlYXR1cmVzIiwiVkVSU0lPTiIsIkNPTU1JVCIsIkZVTExfVkVSU0lPTiIsIlBBQ0tBR0VfTkFNRSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQVNPQSxlQUFlQyxnQkFDcEJDLFNBQ0FDLFNBQ0FDLEtBQ0FDLFFBQWtCQyxTQUFTQztJQUUzQkgsSUFBSUksTUFBTSxjQUFjTjtJQUV4QixPQUFPLElBQUlPLFFBQVEsQ0FBQ0MsU0FBU0M7UUFDM0IsTUFBTUMsUUFBUUMsS0FBS1gsU0FBU0M7UUFFNUIsTUFBTVcsU0FBbUI7UUFDekIsTUFBTUMsU0FBbUI7UUFFekJILE1BQU1FLFFBQVFFLEdBQUcsUUFBU0M7WUFDeEJILE9BQU9JLEtBQUtEO1lBQ1piLElBQUlDLE9BQU9ZLEtBQUtFOztRQUdsQlAsTUFBTUcsUUFBUUMsR0FBRyxRQUFTQztZQUN4QkYsT0FBT0csS0FBS0Q7WUFDWmIsSUFBSUksTUFBTVMsS0FBS0U7O1FBR2pCUCxNQUFNSSxHQUFHLFNBQVVJO1lBQ2pCLElBQUlBLFNBQVMsR0FBRztnQkFDZGhCLElBQUlpQixNQUFNO2dCQUNWWCxRQUFRO29CQUFFSSxRQUFRQSxPQUFPUSxLQUFLO29CQUFPUCxRQUFRQSxPQUFPTyxLQUFLOztBQUMzRCxtQkFBTztnQkFDTGxCLElBQUltQixTQUNGLDRCQUE0QkgsV0FBV0wsT0FBT08sS0FBSztnQkFFckRYLE9BQ0UsSUFBSWEsY0FDRiw0QkFBNEJKLFNBQVNMLE9BQU9PLEtBQUs7QUFHdkQ7O1FBR0ZWLE1BQU1JLEdBQUcsU0FBVVM7WUFD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
|
|
1
|
+
import{exec as e}from"child_process";import{LogLevel as t,LoggedEnvironment as i}from"@decaf-ts/logging";import{InternalError as r,NotFoundError as n}from"@decaf-ts/db-decorators";import{Cascade as s,ModelService as o,pk as a,uuid as d,manyToOne as p,column as c,createdAt as y,updatedAt as l,table as u,unique as g,oneToMany as h,transactional as m,AuthorizationError as f,BaseModel as v,repository as w,service as b,Repository as S,Condition as A}from"@decaf-ts/core";export{AuthorizationError,transactional}from"@decaf-ts/core";import{Model as O,required as I,type as _,option as j,model as U}from"@decaf-ts/decorator-validation";import{__decorate as P,__metadata as K}from"tslib";import{Metadata as k,metadata as F,methodMetadata as R,propMetadata as T}from"@decaf-ts/decoration";async function x(i,n,s,o=t.info){return s.debug("Executing: "+i),new Promise((t,a)=>{const d=e(i,n),p=[],c=[];d.stdout?.on("data",e=>{p.push(e),s[o](e.trim())}),d.stderr?.on("data",e=>{c.push(e),s.debug(e.trim())}),d.on("close",e=>{0===e?(s.silly("Command completed successfully"),t({stdout:p.join("\n"),stderr:c.join("\n")})):(s.critical(`Command failed with code ${e}:\n ${c.join("\n")}`),a(new r(`Command failed with code ${e}: ${c.join("\n")}`)))}),d.on("error",e=>{s.critical("Command execution error",e),a(e)})})}var B,D,C,G,E,N,$,L;(e=>{e.Pooled="pooled",e.Bridge="bridge",e.Silo="silo"})(B||(B={})),(e=>{e.Invited="invited",e.Active="active",e.Suspended="suspended",e.Removed="removed"})(D||(D={})),(e=>{e.User="user",e.Group="group",e.ServiceAccount="service_account",e.Agent="agent",e.ApiKey="api_key"})(C||(C={})),(e=>{e.Tenant="tenant",e.OrgUnit="org_unit",e.Resource="resource"})(G||(G={})),(e=>{e.Admin="admin",e.ContentRead="content_read",e.ContentWrite="content_write",e.Memory="memory",e.Graph="graph",e.Vector="vector",e.Export="export",e.Billing="billing",e.Audit="audit",e.Security="security",e.Data="data",e.Automation="automation"})(E||(E={})),(e=>{e.Private="private",e.ResourceAcl="resource_acl",e.OrgUnit="org_unit",e.OrgSubtree="org_subtree",e.Tenant="tenant"})(N||(N={})),(e=>{e.Postgres="postgres",e.Arango="arango",e.Qdrant="qdrant",e.ObjectStorage="object_storage"})($||($={})),(e=>{e.Shared="shared",e.Dedicated="dedicated"})(L||(L={}));const z=Object.values(B),M=Object.values(D),q=Object.values(C),W=Object.values(G),V=Object.values(E),Z=Object.values(N),Q=Object.values($),J=Object.values(L),H={update:s.NONE,delete:s.NONE,nullable:!1},X={update:s.NONE,delete:s.NONE,nullable:!0},Y={update:s.CASCADE,delete:s.CASCADE,nullable:!1},ee={update:s.CASCADE,delete:s.NONE,nullable:!1};function te(e){return{tenantId:e.tenantId,principalId:e.principalId,permissionKey:e.permissionKey,allowedOrgUnitIds:[...e.allowedOrgUnitIds],allowedResourceIds:[...e.allowedResourceIds]}}function ie(e){return{must:[{key:"tenant_id",match:{value:e.tenantId}},{should:[{key:"org_unit_id",match:{any:e.allowedOrgUnitIds}},{key:"protected_resource_id",match:{any:e.allowedResourceIds}},{key:"owner_principal_id",match:{value:e.principalId}}]}]}}function re(e,t){return`${e}:${t}`}function ne(){return new Date}function se(e){return e??[]}function oe(e,t){return ue(e)===t}function ae(e,t){return!!t&&ue(e)===t}function de(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function pe(e,t,i){const r=e??new Date;return!(t&&t>r||i&&r>i)}function ce(e){const t={},i={};for(const r of e.permissions){const e=re(r.scopeKind,r.scopeId);t[e]=t[e]??[],t[e].push(r.permissionKey),r.scopeKind===G.OrgUnit&&(i[r.permissionKey]=i[r.permissionKey]??[],i[r.permissionKey].push(r.scopeId))}return{tenantId:e.tenantId,principalId:e.principalId,permissionsByScope:t,allowedOrgUnitIdsByPermission:i,resourceGrants:e.grants.map(e=>({resourceId:e.resourceId,permissionKey:e.permissionKey}))}}class ye extends o{constructor(e){super(e)}newModel(e,t){return Object.assign(new e,t)}async create(e,...t){return this.repo.create(Object.assign({},e),...t)}async createOne(e,...t){return this.create(e,...t)}async getById(e,...t){return this.repo.read(e,...t)}async updateOne(e,t,...i){const r=await this.repo.read(e,...i);return this.repo.update(Object.assign(r,t),...i)}async deleteById(e,...t){await this.repo.delete(e,...t)}async findOneBy(e,t,...i){return this.repo.findOneBy(e,t,...i)}async findManyBy(e,t,...i){return this.repo.select().where({[e]:t}).execute(...i)}async listAll(...e){return this.repo.select().execute(...e)}}function le(){return crypto.randomUUID()}function ue(e){return"string"==typeof e?e:e.id}class ge extends O{constructor(e){super(e)}}let he=class extends ge{constructor(e){super(e)}};P([a({type:String}),d(),K("design:type",String)],he.prototype,"id",void 0),P([p(()=>Ke,Y,!1,void 0,"fk_tenant_memberships_tenant"),I(),K("design:type",Object)],he.prototype,"tenant",void 0),P([p(()=>me,Y,!1,void 0,"fk_tenant_memberships_user"),I(),K("design:type",Object)],he.prototype,"user",void 0),P([I(),_(String),j(M),c(),K("design:type",String)],he.prototype,"status",void 0),P([y(),K("design:type",Date)],he.prototype,"createdAt",void 0),P([l(),K("design:type",Date)],he.prototype,"updatedAt",void 0),he=P([u("tenant_memberships"),U(),K("design:paramtypes",[Object])],he);let me=class extends ge{constructor(e){super(e)}};P([a({type:String}),d(),K("design:type",String)],me.prototype,"id",void 0),P([g(),_(String),c(),K("design:type",String)],me.prototype,"email",void 0),P([g(),_(String),c(),K("design:type",String)],me.prototype,"phone",void 0),P([I(),_(String),c(),K("design:type",String)],me.prototype,"displayName",void 0),P([h(()=>he,H,!1),K("design:type",Array)],me.prototype,"tenantMemberships",void 0),P([h(()=>fe,H,!1),K("design:type",Array)],me.prototype,"orgUnitMemberships",void 0),P([y(),K("design:type",Date)],me.prototype,"createdAt",void 0),P([l(),K("design:type",Date)],me.prototype,"updatedAt",void 0),me=P([u("users"),U(),K("design:paramtypes",[Object])],me);let fe=class extends ge{constructor(e){super(e)}};P([a({type:String}),d(),K("design:type",String)],fe.prototype,"id",void 0),P([p(()=>Ke,Y,!1,void 0,"fk_org_memberships_tenant"),I(),K("design:type",Object)],fe.prototype,"tenant",void 0),P([p(()=>Ue,Y,!1,void 0,"fk_org_memberships_org_unit"),I(),K("design:type",Object)],fe.prototype,"orgUnit",void 0),P([p(()=>me,H,!1,void 0,"fk_org_memberships_user"),I(),K("design:type",Object)],fe.prototype,"user",void 0),P([I(),_(String),j(M),c(),K("design:type",String)],fe.prototype,"status",void 0),P([y(),K("design:type",Date)],fe.prototype,"createdAt",void 0),P([l(),K("design:type",Date)],fe.prototype,"updatedAt",void 0),fe=P([u("org_unit_memberships"),U(),K("design:paramtypes",[Object])],fe);let ve=class extends ge{constructor(e){super(e)}};P([a({type:String}),d(),K("design:type",String)],ve.prototype,"id",void 0),P([p(()=>Ke,Y,!1,void 0,"fk_org_closure_tenant"),I(),K("design:type",Object)],ve.prototype,"tenant",void 0),P([p(()=>Ue,Y,!1,void 0,"fk_org_closure_ancestor"),I(),K("design:type",Object)],ve.prototype,"ancestor",void 0),P([p(()=>Ue,Y,!1,void 0,"fk_org_closure_descendant"),I(),K("design:type",Object)],ve.prototype,"descendant",void 0),P([I(),_(Number),c(),K("design:type",Number)],ve.prototype,"depth",void 0),P([y(),K("design:type",Date)],ve.prototype,"createdAt",void 0),ve=P([u("org_unit_closure"),U(),K("design:paramtypes",[Object])],ve);let we=class extends ge{constructor(e){super(e)}};P([a({type:String}),d(),K("design:type",String)],we.prototype,"id",void 0),P([g(),I(),_(String),c(),K("design:type",String)],we.prototype,"key",void 0),P([I(),_(String),j(V),c(),K("design:type",String)],we.prototype,"category",void 0),P([_(String),c(),K("design:type",String)],we.prototype,"description",void 0),P([h(()=>be,H,!1),K("design:type",Array)],we.prototype,"rolePermissions",void 0),we=P([u("permissions"),U(),K("design:paramtypes",[Object])],we);let be=class extends ge{constructor(e){super(e)}};P([a({type:String}),d(),K("design:type",String)],be.prototype,"id",void 0),P([p(()=>Se,Y,!1,void 0,"fk_role_permissions_role"),I(),K("design:type",Object)],be.prototype,"role",void 0),P([p(()=>we,Y,!1,void 0,"fk_role_permissions_permission"),I(),K("design:type",Object)],be.prototype,"permission",void 0),P([y(),K("design:type",Date)],be.prototype,"createdAt",void 0),be=P([u("role_permissions"),U(),K("design:paramtypes",[Object])],be);let Se=class extends ge{constructor(e){super(e)}};P([a({type:String}),d(),K("design:type",String)],Se.prototype,"id",void 0),P([p(()=>Ke,X,!1,void 0,"fk_roles_tenant"),K("design:type",Object)],Se.prototype,"tenant",void 0),P([I(),_(String),c(),K("design:type",String)],Se.prototype,"key",void 0),P([I(),_(String),c(),K("design:type",String)],Se.prototype,"name",void 0),P([_(String),c(),K("design:type",String)],Se.prototype,"description",void 0),P([_(Object),c(),K("design:type",Object)],Se.prototype,"metadata",void 0),P([h(()=>be,H,!1),K("design:type",Array)],Se.prototype,"rolePermissions",void 0),P([h(()=>Ae,H,!1),K("design:type",Array)],Se.prototype,"assignments",void 0),P([y(),K("design:type",Date)],Se.prototype,"createdAt",void 0),P([l(),K("design:type",Date)],Se.prototype,"updatedAt",void 0),Se=P([u("roles"),U(),K("design:paramtypes",[Object])],Se);let Ae=class extends ge{constructor(e){super(e)}};P([a({type:String}),d(),K("design:type",String)],Ae.prototype,"id",void 0),P([p(()=>Ke,Y,!1,void 0,"fk_role_assignments_tenant"),I(),K("design:type",Object)],Ae.prototype,"tenant",void 0),P([p(()=>Ie,Y,!1,void 0,"fk_role_assignments_principal"),I(),K("design:type",Object)],Ae.prototype,"principal",void 0),P([p(()=>Se,H,!1,void 0,"fk_role_assignments_role"),I(),K("design:type",Object)],Ae.prototype,"role",void 0),P([I(),_(String),j(W),c(),K("design:type",String)],Ae.prototype,"scopeKind",void 0),P([I(),_(String),c(),K("design:type",String)],Ae.prototype,"scopeId",void 0),P([I(),_(Boolean),c(),K("design:type",Boolean)],Ae.prototype,"inheritDown",void 0),P([c(),K("design:type",Date)],Ae.prototype,"startsAt",void 0),P([c(),K("design:type",Date)],Ae.prototype,"expiresAt",void 0),P([_(Object),c(),K("design:type",Object)],Ae.prototype,"conditions",void 0),P([y(),K("design:type",Date)],Ae.prototype,"createdAt",void 0),P([l(),K("design:type",Date)],Ae.prototype,"updatedAt",void 0),Ae=P([u("role_assignments"),U(),K("design:paramtypes",[Object])],Ae);let Oe=class extends ge{constructor(e){super(e)}};P([a({type:String}),d(),K("design:type",String)],Oe.prototype,"id",void 0),P([p(()=>Ke,Y,!1,void 0,"fk_resource_grants_tenant"),I(),K("design:type",Object)],Oe.prototype,"tenant",void 0),P([p(()=>_e,Y,!1,void 0,"fk_resource_grants_resource"),I(),K("design:type",Object)],Oe.prototype,"resource",void 0),P([p(()=>Ie,Y,!1,void 0,"fk_resource_grants_principal"),I(),K("design:type",Object)],Oe.prototype,"principal",void 0),P([I(),_(String),c(),K("design:type",String)],Oe.prototype,"permissionKey",void 0),P([c(),K("design:type",Date)],Oe.prototype,"startsAt",void 0),P([c(),K("design:type",Date)],Oe.prototype,"expiresAt",void 0),P([_(Object),c(),K("design:type",Object)],Oe.prototype,"conditions",void 0),P([p(()=>Ie,H,!1,void 0,"fk_resource_grants_created_by"),K("design:type",Object)],Oe.prototype,"createdBy",void 0),P([y(),K("design:type",Date)],Oe.prototype,"createdAt",void 0),P([l(),K("design:type",Date)],Oe.prototype,"updatedAt",void 0),Oe=P([u("resource_grants"),U(),K("design:paramtypes",[Object])],Oe);let Ie=class extends ge{constructor(e){super(e)}};P([a({type:String}),d(),K("design:type",String)],Ie.prototype,"id",void 0),P([p(()=>Ke,H,!1,void 0,"fk_principals_tenant"),I(),K("design:type",Object)],Ie.prototype,"tenant",void 0),P([I(),_(String),j(q),c(),K("design:type",String)],Ie.prototype,"kind",void 0),P([I(),_(String),c(),K("design:type",String)],Ie.prototype,"subjectId",void 0),P([h(()=>Ae,H,!1),K("design:type",Array)],Ie.prototype,"roleAssignments",void 0),P([h(()=>Oe,H,!1),K("design:type",Array)],Ie.prototype,"resourceGrants",void 0),P([y(),K("design:type",Date)],Ie.prototype,"createdAt",void 0),P([l(),K("design:type",Date)],Ie.prototype,"updatedAt",void 0),Ie=P([u("principals"),U(),K("design:paramtypes",[Object])],Ie);let _e=class extends ge{constructor(e){super(e)}};P([a({type:String}),d(),K("design:type",String)],_e.prototype,"id",void 0),P([p(()=>Ke,H,!1,void 0,"fk_protected_resources_tenant"),I(),K("design:type",Object)],_e.prototype,"tenant",void 0),P([p(()=>Ue,H,!1,void 0,"fk_protected_resources_org_unit"),I(),K("design:type",Object)],_e.prototype,"orgUnit",void 0),P([I(),_(String),c(),K("design:type",String)],_e.prototype,"resourceType",void 0),P([I(),_(String),c(),K("design:type",String)],_e.prototype,"resourceId",void 0),P([I(),_(String),j(Z),c(),K("design:type",String)],_e.prototype,"visibility",void 0),P([p(()=>Ie,X,!1,void 0,"fk_protected_resources_owner"),K("design:type",Object)],_e.prototype,"owner",void 0),P([_(String),c(),K("design:type",String)],_e.prototype,"sensitivity",void 0),P([_(Object),c(),K("design:type",Object)],_e.prototype,"metadata",void 0),P([h(()=>Oe,H,!1),K("design:type",Array)],_e.prototype,"grants",void 0),P([y(),K("design:type",Date)],_e.prototype,"createdAt",void 0),P([l(),K("design:type",Date)],_e.prototype,"updatedAt",void 0),_e=P([u("protected_resources"),U(),K("design:paramtypes",[Object])],_e);let je=class extends ge{constructor(e){super(e)}};P([a({type:String}),d(),K("design:type",String)],je.prototype,"id",void 0),P([p(()=>Ke,Y,!1,void 0,"fk_inheritance_blocks_tenant"),I(),K("design:type",Object)],je.prototype,"tenant",void 0),P([p(()=>Ue,Y,!1,void 0,"fk_inheritance_blocks_org_unit"),I(),K("design:type",Object)],je.prototype,"orgUnit",void 0),P([p(()=>Ue,X,!1,void 0,"fk_inheritance_blocks_blocked_ancestor"),K("design:type",Object)],je.prototype,"blockedFromAncestor",void 0),P([I(),_(String),j(V),c(),K("design:type",String)],je.prototype,"permissionCategory",void 0),P([_(String),c(),K("design:type",String)],je.prototype,"reason",void 0),P([y(),K("design:type",Date)],je.prototype,"createdAt",void 0),P([l(),K("design:type",Date)],je.prototype,"updatedAt",void 0),je=P([u("inheritance_blocks"),U(),K("design:paramtypes",[Object])],je);let Ue=class extends ge{constructor(e){super(e)}};P([a({type:String}),d(),K("design:type",String)],Ue.prototype,"id",void 0),P([p(()=>Ke,H,!1,void 0,"fk_org_units_tenant"),I(),K("design:type",Object)],Ue.prototype,"tenant",void 0),P([p(()=>Ue,H,!1,void 0,"fk_org_units_parent"),K("design:type",Object)],Ue.prototype,"parent",void 0),P([h(()=>Ue,H,!1),K("design:type",Array)],Ue.prototype,"children",void 0),P([I(),_(String),c(),K("design:type",String)],Ue.prototype,"name",void 0),P([I(),_(String),c(),K("design:type",String)],Ue.prototype,"path",void 0),P([_(Object),c(),K("design:type",Object)],Ue.prototype,"metadata",void 0),P([h(()=>fe,H,!1),K("design:type",Array)],Ue.prototype,"memberships",void 0),P([h(()=>_e,H,!1),K("design:type",Array)],Ue.prototype,"resources",void 0),P([h(()=>je,H,!1),K("design:type",Array)],Ue.prototype,"inheritanceBlocks",void 0),P([h(()=>ve,H,!1),K("design:type",Array)],Ue.prototype,"ancestorLinks",void 0),P([h(()=>ve,H,!1),K("design:type",Array)],Ue.prototype,"descendantLinks",void 0),P([y(),K("design:type",Date)],Ue.prototype,"createdAt",void 0),P([l(),K("design:type",Date)],Ue.prototype,"updatedAt",void 0),Ue=P([u("org_units"),U(),K("design:paramtypes",[Object])],Ue);let Pe=class extends ge{constructor(e){super(e)}};P([a({type:String}),d(),K("design:type",String)],Pe.prototype,"id",void 0),P([p(()=>Ke,Y,!1,void 0,"fk_storage_bindings_tenant"),I(),K("design:type",Object)],Pe.prototype,"tenant",void 0),P([I(),_(String),j(Q),c(),K("design:type",String)],Pe.prototype,"storageKind",void 0),P([I(),_(String),j(J),c(),K("design:type",String)],Pe.prototype,"bindingKind",void 0),P([I(),_(String),c(),K("design:type",String)],Pe.prototype,"bindingKey",void 0),P([I(),_(String),c(),K("design:type",String)],Pe.prototype,"region",void 0),P([_(Object),c(),K("design:type",Object)],Pe.prototype,"config",void 0),P([y(),K("design:type",Date)],Pe.prototype,"createdAt",void 0),P([l(),K("design:type",Date)],Pe.prototype,"updatedAt",void 0),Pe=P([u("storage_bindings"),U(),K("design:paramtypes",[Object])],Pe);let Ke=class extends ge{constructor(e){super(e)}};P([a({type:String}),d(),K("design:type",String)],Ke.prototype,"id",void 0),P([g(),I(),_(String),c(),K("design:type",String)],Ke.prototype,"slug",void 0),P([I(),_(String),c(),K("design:type",String)],Ke.prototype,"name",void 0),P([I(),_(String),j(z),c(),K("design:type",String)],Ke.prototype,"isolationTier",void 0),P([h(()=>Ue,H,!1),K("design:type",Array)],Ke.prototype,"orgUnits",void 0),P([h(()=>he,H,!1),K("design:type",Array)],Ke.prototype,"memberships",void 0),P([h(()=>Ie,H,!1),K("design:type",Array)],Ke.prototype,"principals",void 0),P([h(()=>Pe,H,!1),K("design:type",Array)],Ke.prototype,"storageBindings",void 0),P([y(),K("design:type",Date)],Ke.prototype,"createdAt",void 0),P([l(),K("design:type",Date)],Ke.prototype,"updatedAt",void 0),Ke=P([u("tenants"),U(),K("design:paramtypes",[Object])],Ke);let ke=class extends ge{constructor(e){super(e)}};P([a({type:String}),d(),K("design:type",String)],ke.prototype,"id",void 0),P([p(()=>Ke,Y,!1,void 0,"fk_tenant_profiles_tenant"),I(),K("design:type",Object)],ke.prototype,"tenant",void 0),P([I(),_(String),c(),K("design:type",String)],ke.prototype,"profileKey",void 0),P([_(Object),c(),K("design:type",Object)],ke.prototype,"metadata",void 0),P([y(),K("design:type",Date)],ke.prototype,"createdAt",void 0),P([l(),K("design:type",Date)],ke.prototype,"updatedAt",void 0),ke=P([u("tenant_profiles"),U(),K("design:paramtypes",[Object])],ke);let Fe=class extends ge{constructor(e){super(e)}};P([a({type:String}),d(),K("design:type",String)],Fe.prototype,"id",void 0),P([p(()=>Ue,Y,!1,void 0,"fk_org_unit_profiles_org_unit"),I(),K("design:type",Object)],Fe.prototype,"orgUnit",void 0),P([I(),_(String),c(),K("design:type",String)],Fe.prototype,"profileKey",void 0),P([_(Object),c(),K("design:type",Object)],Fe.prototype,"metadata",void 0),P([y(),K("design:type",Date)],Fe.prototype,"createdAt",void 0),P([l(),K("design:type",Date)],Fe.prototype,"updatedAt",void 0),Fe=P([u("org_unit_profiles"),U(),K("design:paramtypes",[Object])],Fe);let Re=class extends ge{constructor(e){super(e)}};P([a({type:String}),d(),K("design:type",String)],Re.prototype,"id",void 0),P([p(()=>Ke,Y,!1,void 0,"fk_group_memberships_tenant"),I(),K("design:type",Object)],Re.prototype,"tenant",void 0),P([p(()=>Te,Y,!1,void 0,"fk_group_memberships_group"),I(),K("design:type",Object)],Re.prototype,"group",void 0),P([p(()=>Ie,Y,!1,void 0,"fk_group_memberships_principal"),I(),K("design:type",Object)],Re.prototype,"principal",void 0),P([_(Object),c(),K("design:type",Object)],Re.prototype,"metadata",void 0),P([y(),K("design:type",Date)],Re.prototype,"createdAt",void 0),Re=P([u("group_memberships"),U(),K("design:paramtypes",[Object])],Re);let Te=class extends ge{constructor(e){super(e)}};P([a({type:String}),d(),K("design:type",String)],Te.prototype,"id",void 0),P([p(()=>Ke,H,!1,void 0,"fk_groups_tenant"),I(),K("design:type",Object)],Te.prototype,"tenant",void 0),P([p(()=>Ue,X,!1,void 0,"fk_groups_org_unit"),K("design:type",Object)],Te.prototype,"orgUnit",void 0),P([I(),_(String),c(),K("design:type",String)],Te.prototype,"name",void 0),P([_(Object),c(),K("design:type",Object)],Te.prototype,"metadata",void 0),P([h(()=>Re,H,!1),K("design:type",Array)],Te.prototype,"members",void 0),P([y(),K("design:type",Date)],Te.prototype,"createdAt",void 0),P([l(),K("design:type",Date)],Te.prototype,"updatedAt",void 0),Te=P([u("groups"),U(),K("design:paramtypes",[Object])],Te);let xe=class extends ge{constructor(e){super(e)}};P([a({type:String}),d(),K("design:type",String)],xe.prototype,"id",void 0),P([p(()=>Ke,Y,!1,void 0,"fk_effective_permissions_tenant"),I(),K("design:type",Object)],xe.prototype,"tenant",void 0),P([p(()=>Ie,Y,!1,void 0,"fk_effective_permissions_principal"),I(),K("design:type",Object)],xe.prototype,"principal",void 0),P([I(),_(String),c(),K("design:type",String)],xe.prototype,"permissionKey",void 0),P([I(),_(String),j(W),c(),K("design:type",String)],xe.prototype,"scopeKind",void 0),P([I(),_(String),c(),K("design:type",String)],xe.prototype,"scopeId",void 0),P([I(),_(String),c(),K("design:type",String)],xe.prototype,"sourceKind",void 0),P([I(),_(String),c(),K("design:type",String)],xe.prototype,"sourceId",void 0),P([c(),K("design:type",Date)],xe.prototype,"startsAt",void 0),P([c(),K("design:type",Date)],xe.prototype,"expiresAt",void 0),P([y(),K("design:type",Date)],xe.prototype,"createdAt",void 0),xe=P([u("effective_permissions"),U(),K("design:paramtypes",[Object])],xe);class Be extends ye{constructor(){super(ke)}async createProfile(e,t,i,...r){return this.create({tenant:e,profileKey:t,metadata:i},...r)}async listForTenant(e,...t){return(await this.listAll(...t)).filter(t=>oe(t.tenant,e))}async deleteForTenant(e,...t){for(const i of await this.listForTenant(e,...t))await this.deleteById(i.id,...t)}}class De extends ye{constructor(){super(Fe)}async createProfile(e,t,i,...r){return this.create({orgUnit:e,profileKey:t,metadata:i},...r)}async listForOrgUnit(e,...t){return(await this.listAll(...t)).filter(t=>ae(t.orgUnit,e))}}class Ce extends ye{constructor(){super(ve)}async listAncestors(e,t,...i){return(await this.listAll(...i)).filter(i=>oe(i.tenant,e)&&ae(i.descendant,t)).sort((e,t)=>e.depth-t.depth)}async listDescendants(e,t,...i){return(await this.listAll(...i)).filter(i=>oe(i.tenant,e)&&ae(i.ancestor,t)).sort((e,t)=>e.depth-t.depth)}async isAncestorOf(e,t,i,...r){return(await this.listAncestors(e,i,...r)).some(e=>ae(e.ancestor,t))}async createSelfLink(e,t,...i){return this.create({tenant:e,ancestor:t,descendant:t,depth:0},...i)}async insertAncestorLinksForNewChild(e,t,i,...r){const n=await this.listAncestors(e,t,...r);for(const t of n)await this.create({tenant:e,ancestor:t.ancestor,descendant:i,depth:t.depth+1},...r)}async deleteLinksForSubtree(e,t,...i){const r=await this.listDescendants(e,t,...i),n=new Set([t,...r.map(e=>ue(e.descendant))]),s=new Set([t,...r.map(e=>ue(e.ancestor))]),o=(await this.listAll(...i)).filter(t=>oe(t.tenant,e)&&(n.has(ue(t.descendant))||s.has(ue(t.ancestor))));for(const e of o)await this.deleteById(e.id,...i)}}class Ge extends ye{constructor(){super(je)}async blockCategory(e,t,i,r,n,...s){return this.create({tenant:e,orgUnit:t,blockedFromAncestor:r,permissionCategory:i,reason:n},...s)}async unblockCategory(e,...t){await this.deleteById(e,...t)}async listForOrgUnit(e,t,...i){return(await this.listAll(...i)).filter(i=>oe(i.tenant,e)&&ae(i.orgUnit,t))}async categoryBlockedForAncestor(e,t,i,r,...n){return(await this.listForOrgUnit(e,t,...n)).some(e=>e.permissionCategory===r&&(!e.blockedFromAncestor||ae(e.blockedFromAncestor,i)))}}class Ee extends ye{constructor(){super(Ke)}async createTenant(e,...t){return this.create({slug:e.slug,name:e.name,isolationTier:e.isolationTier??B.Pooled},...t)}async getBySlug(e,...t){return this.findOneBy("slug",e,...t)}async renameTenant(e,t,...i){return this.updateOne(e,{name:t},...i)}async changeSlug(e,t,...i){return this.updateOne(e,{slug:t},...i)}async setIsolationTier(e,t,...i){return this.updateOne(e,{isolationTier:t},...i)}async deleteTenantControlled(e,...t){await this.deleteById(e,...t)}}async function Ne(e,t,...i){for(const r of t)await e.deleteById(r.id,...i)}class $e extends ye{constructor(){super(Ue)}orgUnitPath(e,t){const i=de(t);return e?`${e.replace(/\/+$/,"")}/${i}`:"/"+i}async createProfileIfNeeded(e,t,i,...r){t&&await(new De).createProfile(e,t,i,...r)}async createRoot(e,t,i,r,n,...s){const o=await this.create({tenant:e,name:t,path:this.orgUnitPath(void 0,t),metadata:i},...s);return await this.createProfileIfNeeded(o.id,r,n,...s),await(new Ce).createSelfLink(e,o.id,...s),o}async createChild(e,...t){const i=e.parentOrgUnitId?await this.getById(e.parentOrgUnitId,...t):void 0,r=await this.create({tenant:e.tenantId,parent:i?.id??e.parentOrgUnitId,name:e.name,path:this.orgUnitPath(i?.path,e.name),metadata:e.metadata},...t);await this.createProfileIfNeeded(r.id,e.profileKey,e.profileMetadata,...t);const n=new Ce;return await n.createSelfLink(e.tenantId,r.id,...t),e.parentOrgUnitId&&await n.insertAncestorLinksForNewChild(e.tenantId,e.parentOrgUnitId,r.id,...t),r}async listChildren(e,...t){return(await this.listAll(...t)).filter(t=>ae(t.parent,e))}async listTenantOrgUnits(e,...t){return(await this.listAll(...t)).filter(t=>oe(t.tenant,e))}async listDescendantOrgUnits(e,t,i=!1,...r){const n=await(new Ce).listDescendants(e,t,...r),s=new Set(n.map(e=>ue(e.descendant)));return i&&s.add(t),(await this.listTenantOrgUnits(e,...r)).filter(e=>s.has(e.id))}async listAncestorOrgUnits(e,t,i=!1,...r){const n=await(new Ce).listAncestors(e,t,...r),s=new Set(n.map(e=>ue(e.ancestor)));return i&&s.add(t),(await this.listTenantOrgUnits(e,...r)).filter(e=>s.has(e.id))}async renameOrgUnit(e,t,...i){const r=await this.getById(e,...i);return this.updateOne(e,{name:t,path:this.orgUnitPath(r.path.includes("/")?r.path.replace(/\/[^/]+$/,""):void 0,t)},...i)}async moveOrgUnit(e,t,i,...r){const n=await this.getById(i,...r),s=await this.getById(t,...r),o=await this.updateOne(t,{parent:n.id,path:this.orgUnitPath(n.path,s.name)},...r);return await this.rebuildTenantClosure(e,...r),o}async rebuildTenantClosure(e,...t){const i=new Ce,r=await i.listAll(...t);await Ne(i,r.filter(t=>oe(t.tenant,e)),...t);const n=(await this.listTenantOrgUnits(e,...t)).sort((e,t)=>e.path.split("/").filter(Boolean).length-t.path.split("/").filter(Boolean).length);for(const r of n)await i.createSelfLink(e,r.id,...t),r.parent&&await i.insertAncestorLinksForNewChild(e,ue(r.parent),r.id,...t)}async deleteOrgUnitTree(e,t,...i){const r=new Ce,n=await this.listDescendantOrgUnits(e,t,!0,...i),s=new Set(n.map(e=>e.id)),o=(await this.listTenantOrgUnits(e,...i)).filter(e=>s.has(e.id));await Ne(this,o,...i),await r.deleteLinksForSubtree(e,t,...i)}}P([m(),K("design:type",Function),K("design:paramtypes",[String,String,Object,String,Object,Object]),K("design:returntype",Promise)],$e.prototype,"createRoot",null),P([m(),K("design:type",Function),K("design:paramtypes",[Object,Object]),K("design:returntype",Promise)],$e.prototype,"createChild",null),P([m(),K("design:type",Function),K("design:paramtypes",[String,String,String,Object]),K("design:returntype",Promise)],$e.prototype,"moveOrgUnit",null),P([m(),K("design:type",Function),K("design:paramtypes",[String,Object]),K("design:returntype",Promise)],$e.prototype,"rebuildTenantClosure",null),P([m(),K("design:type",Function),K("design:paramtypes",[String,String,Object]),K("design:returntype",Promise)],$e.prototype,"deleteOrgUnitTree",null);class Le extends ye{constructor(){super(me)}async createUser(e,...t){return this.create({email:e.email,phone:e.phone,displayName:e.displayName},...t)}async getByEmail(e,...t){return(await this.listAll(...t)).find(t=>t.email===e)}async updateDisplayName(e,t,...i){return this.updateOne(e,{displayName:t},...i)}async updateEmail(e,t,...i){return this.updateOne(e,{email:t},...i)}async updatePhone(e,t,...i){return this.updateOne(e,{phone:t},...i)}}class ze extends ye{constructor(){super(Ie)}async createPrincipal(e,t,i,...r){return this.create({tenant:e,kind:t,subjectId:i},...r)}async getForSubject(e,t,i,...r){return(await this.listAll(...r)).find(r=>oe(r.tenant,e)&&r.kind===t&&r.subjectId===i)}async getOrCreateForSubject(e,t,i,...r){return await this.getForSubject(e,t,i,...r)??await this.createPrincipal(e,t,i,...r)}async getUserPrincipal(e,t,...i){return this.getOrCreateForSubject(e,C.User,t,...i)}async getGroupPrincipal(e,t,...i){return this.getOrCreateForSubject(e,C.Group,t,...i)}}class Me extends ye{constructor(){super(he)}async addUserToTenant(e,t,i=D.Active,...r){return this.create({tenant:e,user:t,status:i},...r)}async setStatus(e,t,...i){return this.updateOne(e,{status:t},...i)}async listUserTenants(e,...t){return(await this.listAll(...t)).filter(t=>ae(t.user,e))}async listTenantUsers(e,...t){return(await this.listAll(...t)).filter(t=>oe(t.tenant,e))}async removeUserFromTenant(e,...t){await this.deleteById(e,...t)}}class qe extends ye{constructor(){super(fe)}async addUserToOrgUnit(e,t,i,r=D.Active,...n){return this.create({tenant:e,orgUnit:t,user:i,status:r},...n)}async setStatus(e,t,...i){return this.updateOne(e,{status:t},...i)}async listUserOrgUnits(e,...t){return(await this.listAll(...t)).filter(t=>ae(t.user,e))}async listOrgUnitUsers(e,...t){return(await this.listAll(...t)).filter(t=>ae(t.orgUnit,e))}async removeUserFromOrgUnit(e,...t){await this.deleteById(e,...t)}}class We extends ye{constructor(){super(Te)}async createGroup(e,t,i,r,...n){return this.create({tenant:e,orgUnit:i,name:t,metadata:r},...n)}async renameGroup(e,t,...i){return this.updateOne(e,{name:t},...i)}async moveGroupToOrgUnit(e,t,...i){return this.updateOne(e,{orgUnit:t},...i)}async listTenantGroups(e,...t){return(await this.listAll(...t)).filter(t=>oe(t.tenant,e))}}class Ve extends ye{constructor(){super(Re)}async addPrincipalToGroup(e,t,i,r,...n){return this.create({tenant:e,group:t,principal:i,metadata:r},...n)}async listGroupMembers(e,...t){return(await this.listAll(...t)).filter(t=>ae(t.group,e))}async listPrincipalGroups(e,...t){return(await this.listAll(...t)).filter(t=>ae(t.principal,e))}async removePrincipalFromGroup(e,...t){await this.deleteById(e,...t)}async resolveGroupPrincipalIdsForPrincipal(e,...t){const i=new ze,r=await this.listPrincipalGroups(e,...t);return await Promise.all(r.map(async e=>{const r=ue(e.tenant),n=ue(e.group);return(await i.getGroupPrincipal(r,n,...t)).id}))}}class Ze extends ye{constructor(){super(we)}async createPermission(e,...t){return this.create({key:e.key,category:e.category,description:e.description},...t)}async getByKey(e,...t){return(await this.listAll(...t)).find(t=>t.key===e)}async listByCategory(e,...t){return(await this.listAll(...t)).filter(t=>t.category===e)}async updateDescription(e,t,...i){return this.updateOne(e,{description:t},...i)}}class Qe extends ye{constructor(){super(Se)}async createRole(e,...t){return this.create({tenant:e.tenantId,key:e.key,name:e.name,description:e.description,metadata:e.metadata},...t)}async getSystemRoleByKey(e,...t){const i=(await this.listAll(...t)).find(t=>!t.tenant&&t.key===e);if(!i)throw Error(`Role "${e}" not found`);return i}async getTenantRoleByKey(e,t,...i){const r=(await this.listAll(...i)).find(i=>oe(i.tenant,e)&&i.key===t);if(!r)throw Error(`Role "${t}" not found for tenant ${e}`);return r}async renameRole(e,t,...i){return this.updateOne(e,{name:t},...i)}async updateRoleMetadata(e,t,...i){return this.updateOne(e,{metadata:t},...i)}async listTenantRoles(e,t=!1,...i){return(await this.listAll(...i)).filter(i=>t&&!i.tenant||oe(i.tenant,e))}}class Je extends ye{constructor(){super(be)}async addPermissionToRole(e,t,...i){return this.create({role:e,permission:t},...i)}async addPermissionKeyToRole(e,t,...i){const r=await(new Ze).getByKey(t,...i);return this.addPermissionToRole(e,r.id,...i)}async removePermissionFromRole(e,...t){await this.deleteById(e,...t)}async listRolePermissions(e,...t){return(await this.listAll(...t)).filter(t=>ae(t.role,e))}async listPermissionRoles(e,...t){return(await this.listAll(...t)).filter(t=>ae(t.permission,e))}async replaceRolePermissions(e,t,...i){const r=await this.listRolePermissions(e,...i);return await(async(e,t,...i)=>{for(const r of t)await e.deleteById(r.id,...i)})(this,r,...i),Promise.all(t.map(t=>this.addPermissionToRole(e,t,...i)))}async createRoleWithPermissions(e,t,...i){const r=await(new Qe).createRole(e,...i);for(const e of t)await this.addPermissionKeyToRole(r.id,e,...i);return r}}class He extends ye{constructor(){super(Ae)}async assignRole(e,...t){return this.create({tenant:e.tenantId,principal:e.principalId,role:e.roleId,scopeKind:e.scopeKind,scopeId:e.scopeId,inheritDown:e.inheritDown??!1,startsAt:e.startsAt,expiresAt:e.expiresAt,conditions:e.conditions},...t)}async revokeAssignment(e,...t){await this.deleteById(e,...t)}async listPrincipalAssignments(e,t,...i){return(await this.listAll(...i)).filter(i=>oe(i.tenant,e)&&ae(i.principal,t))}async listRoleAssignments(e,...t){return(await this.listAll(...t)).filter(t=>ae(t.role,e))}async listTenantAssignments(e,...t){return(await this.listAll(...t)).filter(t=>oe(t.tenant,e))}async updateAssignmentWindow(e,t,i,...r){return this.updateOne(e,{startsAt:t,expiresAt:i},...r)}}class Xe extends ye{constructor(){super(xe)}async listForPrincipal(e,t,...i){return(await this.listAll(...i)).filter(i=>oe(i.tenant,e)&&ae(i.principal,t))}async listForScope(e,t,i,...r){return(await this.listAll(...r)).filter(r=>oe(r.tenant,e)&&r.scopeKind===t&&r.scopeId===i)}async hasPermission(e,t,i,r,n,s,...o){return(await this.listForPrincipal(e,t,...o)).some(e=>!(e.permissionKey!==i||e.scopeKind!==r||e.scopeId!==n||e.startsAt&&s&&e.startsAt>s||e.expiresAt&&s&&e.expiresAt<s))}async deleteForPrincipal(e,t,...i){for(const r of await this.listForPrincipal(e,t,...i))await this.deleteById(r.id,...i)}async deleteForTenant(e,...t){for(const i of(await this.listAll(...t)).filter(t=>oe(t.tenant,e)))await this.deleteById(i.id,...t)}async rebuildForPrincipal(e,t,...i){await this.deleteForPrincipal(e,t,...i);const r=new He,n=new Je,s=new Ze,o=new Ve,a=new ze,d=new Ce,p=new Ge,c=[],y=await r.listPrincipalAssignments(e,t,...i),l=await o.listPrincipalGroups(t,...i),u=[...y,...(await Promise.all(l.map(async t=>{const n=await a.getGroupPrincipal(ue(t.tenant),ue(t.group),...i);return r.listPrincipalAssignments(e,n.id,...i)}))).flat()];for(const r of u){const o=await n.listRolePermissions(ue(r.role),...i),a=await Promise.all(o.map(async e=>s.findOneBy("id",ue(e.permission),...i)));for(const n of a){if(!n)continue;const s=r.scopeKind,o=r.scopeId,a=[];if(s===G.Tenant)a.push({scopeKind:s,scopeId:e});else if(s===G.Resource)a.push({scopeKind:s,scopeId:o});else if(s!==G.OrgUnit||r.inheritDown){if(s===G.OrgUnit&&r.inheritDown){const t=await d.listDescendants(e,o,...i);a.push(...t.map(e=>({scopeKind:s,scopeId:ue(e.descendant)})))}}else a.push({scopeKind:s,scopeId:o});for(const d of a)s===G.OrgUnit&&r.inheritDown&&d.scopeId!==o&&await p.categoryBlockedForAncestor(e,d.scopeId,o,n.category,...i)||c.push({id:"",tenantId:e,principalId:t,permissionKey:n.key,scopeKind:d.scopeKind,scopeId:d.scopeId,sourceKind:"role_assignment",sourceId:r.id,startsAt:r.startsAt,expiresAt:r.expiresAt})}}return await Promise.all(c.map(e=>this.create({tenant:e.tenantId,principal:e.principalId,permissionKey:e.permissionKey,scopeKind:e.scopeKind,scopeId:e.scopeId,sourceKind:e.sourceKind,sourceId:e.sourceId,startsAt:e.startsAt,expiresAt:e.expiresAt},...i)))}async rebuildForTenant(e,...t){const i=(await(new ze).listAll(...t)).filter(t=>oe(t.tenant,e));for(const r of i)await this.rebuildForPrincipal(e,r.id,...t)}}P([m(),K("design:type",Function),K("design:paramtypes",[String,String,Object]),K("design:returntype",Promise)],Xe.prototype,"rebuildForPrincipal",null),P([m(),K("design:type",Function),K("design:paramtypes",[String,Object]),K("design:returntype",Promise)],Xe.prototype,"rebuildForTenant",null);class Ye extends ye{constructor(){super(_e)}async registerResource(e,...t){return this.create({tenant:e.tenantId,orgUnit:e.orgUnitId,resourceType:e.resourceType,resourceId:e.resourceId,visibility:e.visibility,owner:e.ownerPrincipalId,sensitivity:e.sensitivity,metadata:e.metadata},...t)}async getByDomainResource(e,t,i,...r){return(await this.listAll(...r)).find(r=>oe(r.tenant,e)&&r.resourceType===t&&r.resourceId===i)}async moveResourceToOrgUnit(e,t,...i){return this.updateOne(e,{orgUnit:t},...i)}async setVisibility(e,t,...i){return this.updateOne(e,{visibility:t},...i)}async transferOwnership(e,t,...i){return this.updateOne(e,{owner:t},...i)}async listOrgUnitResources(e,...t){return(await this.listAll(...t)).filter(t=>ae(t.orgUnit,e))}async listTenantResources(e,...t){return(await this.listAll(...t)).filter(t=>oe(t.tenant,e))}}class et extends ye{constructor(){super(Oe)}async grantResource(e,...t){return this.create({tenant:e.tenantId,resource:e.resourceId,principal:e.principalId,permissionKey:e.permissionKey,startsAt:e.startsAt,expiresAt:e.expiresAt,conditions:e.conditions,createdBy:e.createdByPrincipalId},...t)}async revokeGrant(e,...t){await this.deleteById(e,...t)}async listResourceGrants(e,...t){return(await this.listAll(...t)).filter(t=>ae(t.resource,e))}async listPrincipalGrants(e,t,...i){return(await this.listAll(...i)).filter(i=>oe(i.tenant,e)&&ae(i.principal,t))}async hasGrant(e,t,i,r,n,...s){return(await this.listPrincipalGrants(e,t,...s)).some(e=>ae(e.resource,i)&&e.permissionKey===r&&(!e.startsAt||!n||e.startsAt<=n)&&(!e.expiresAt||!n||e.expiresAt>=n))}async deleteAllForResource(e,...t){for(const i of await this.listResourceGrants(e,...t))await this.deleteById(i.id,...t)}}class tt{async unregisterResource(e,...t){await(new et).deleteAllForResource(e,...t),await(new Ye).deleteById(e,...t)}async resolveResourceScope(e,...t){const i=await(new Ye).getById(e,...t);return{tenantId:ue(i.tenant),orgUnitId:ue(i.orgUnit),visibility:i.visibility,ownerPrincipalId:i.owner?ue(i.owner):void 0}}}class it extends ye{constructor(){super(Pe)}async createBinding(e,...t){return this.create({tenant:e.tenantId,storageKind:e.storageKind,bindingKind:e.bindingKind,bindingKey:e.bindingKey,region:e.region,config:e.config},...t)}async listTenantBindings(e,...t){return(await this.listAll(...t)).filter(t=>ue(t.tenant)===e)}async getBinding(e,t,...i){return(await this.listTenantBindings(e,...i)).find(e=>e.storageKind===t)}async setBindingConfig(e,t,...i){return this.updateOne(e,{config:t},...i)}async promoteToDedicated(e,t,i,r,...n){return this.updateOne(e,{bindingKind:L.Dedicated,bindingKey:t,region:i,config:r},...n)}async setShared(e,t,i,r,...n){return this.updateOne(e,{bindingKind:L.Shared,bindingKey:t,region:i,config:r},...n)}}class rt{constructor(){this.tenantService=new Ee,this.tenantProfileService=new Be,this.orgUnitService=new $e,this.orgUnitProfileService=new De,this.userService=new Le,this.membershipService=new Me,this.principalService=new ze,this.permissionService=new Ze,this.roleService=new Qe,this.rolePermissionService=new Je,this.roleAssignmentService=new He,this.effectivePermissionService=new Xe}async bootstrapTenantFromTemplate(e,...t){const i=await this.tenantService.createTenant(e.tenant,...t);e.tenant.profileKey&&await this.tenantProfileService.createProfile(i.id,e.tenant.profileKey,e.tenant.profileMetadata,...t);const r=async(e,n)=>{const s=void 0===e?await this.orgUnitService.createRoot(i.id,n.name,n.metadata,n.profileKey,n.metadata,...t):await this.orgUnitService.createChild({tenantId:i.id,parentOrgUnitId:e,name:n.name,metadata:n.metadata,profileKey:n.profileKey,profileMetadata:n.metadata},...t);for(const e of n.children??[])await r(s.id,e);return s},n=await r(void 0,e.rootOrgUnit),s=await this.userService.createUser(e.ownerUser,...t);await this.membershipService.addUserToTenant(i.id,s.id,D.Active,...t);const o=await this.principalService.getUserPrincipal(i.id,s.id,...t);for(const i of e.permissions)await this.permissionService.createPermission(i,...t);for(const r of e.roles){const e=await this.roleService.createRole({tenantId:i.id,key:r.key,name:r.name,description:r.description},...t);for(const i of r.permissionKeys)await this.rolePermissionService.addPermissionKeyToRole(e.id,i,...t)}const a=await this.roleService.getTenantRoleByKey(i.id,e.ownerRoleKey,...t);return await this.roleAssignmentService.assignRole({tenantId:i.id,principalId:o.id,roleId:a.id,scopeKind:G.OrgUnit,scopeId:n.id,inheritDown:!0},...t),await this.effectivePermissionService.rebuildForPrincipal(i.id,o.id,...t),{tenantId:i.id,rootOrgUnitId:n.id,ownerUserId:s.id,ownerPrincipalId:o.id}}}P([m(),K("design:type",Function),K("design:paramtypes",[Object,Object]),K("design:returntype",Promise)],rt.prototype,"bootstrapTenantFromTemplate",null);class nt{constructor(){this.membershipService=new Me,this.orgMembershipService=new qe,this.principalService=new ze,this.roleService=new Qe,this.roleAssignmentService=new He,this.effectivePermissionService=new Xe}async onboardUserToTenantAndOrgUnit(e,t,i,r,...n){await this.membershipService.addUserToTenant(e,t,D.Active,...n),await this.orgMembershipService.addUserToOrgUnit(e,i,t,D.Active,...n);const s=await this.principalService.getUserPrincipal(e,t,...n),o=await this.roleService.getTenantRoleByKey(e,r,...n);return await this.roleAssignmentService.assignRole({tenantId:e,principalId:s.id,roleId:o.id,scopeKind:G.OrgUnit,scopeId:i,inheritDown:!0},...n),await this.effectivePermissionService.rebuildForPrincipal(e,s.id,...n),{principalId:s.id}}async changeUserOrgRole(e,t,i,r,n,...s){const o=await this.roleService.getTenantRoleByKey(e,r,...s),a=await this.roleAssignmentService.listPrincipalAssignments(e,t,...s);for(const e of a.filter(e=>e.scopeKind===G.OrgUnit&&e.scopeId===i))await this.roleAssignmentService.revokeAssignment(e.id,...s);await this.roleAssignmentService.assignRole({tenantId:e,principalId:t,roleId:o.id,scopeKind:G.OrgUnit,scopeId:i,inheritDown:n},...s),await this.effectivePermissionService.rebuildForPrincipal(e,t,...s)}async suspendUserInTenant(e,t,i,...r){await this.membershipService.setStatus(e,D.Suspended,...r),await this.effectivePermissionService.deleteForPrincipal(t,i,...r)}async reactivateUserInTenant(e,t,i,...r){await this.membershipService.setStatus(e,D.Active,...r),await this.effectivePermissionService.rebuildForPrincipal(t,i,...r)}}P([m(),K("design:type",Function),K("design:paramtypes",[String,String,String,String,Object]),K("design:returntype",Promise)],nt.prototype,"onboardUserToTenantAndOrgUnit",null),P([m(),K("design:type",Function),K("design:paramtypes",[String,String,String,String,Boolean,Object]),K("design:returntype",Promise)],nt.prototype,"changeUserOrgRole",null),P([m(),K("design:type",Function),K("design:paramtypes",[String,String,String,Object]),K("design:returntype",Promise)],nt.prototype,"suspendUserInTenant",null),P([m(),K("design:type",Function),K("design:paramtypes",[String,String,String,Object]),K("design:returntype",Promise)],nt.prototype,"reactivateUserInTenant",null);class st{constructor(e={}){this.dataSources=e}async canAccess(e,...t){const i=e.at??new Date;if(e.scopeKind&&e.scopeId)return se(await(this.dataSources.listEffectivePermissionsForScope?.(e.tenantId,e.scopeKind,e.scopeId))).some(t=>t.permissionKey===e.permissionKey&&pe(i,t.startsAt,t.expiresAt));if(!e.resourceProtectedId)return!1;const r=await(this.dataSources.loadResource?.(e.tenantId,e.resourceProtectedId));if(!r)return!1;if(r.tenantId!==e.tenantId)return!1;if(r.ownerPrincipalId===e.principalId)return!0;if(se(await(this.dataSources.listResourceGrants?.(e.tenantId,e.resourceProtectedId))).filter(t=>t.principalId===e.principalId&&t.permissionKey===e.permissionKey&&pe(i,t.startsAt,t.expiresAt)).length>0)return!0;const n=r.visibility;return n!==N.Private&&n!==N.ResourceAcl&&(n===N.OrgUnit||n===N.OrgSubtree?se(await(this.dataSources.listEffectivePermissionsForScope?.(e.tenantId,G.OrgUnit,r.orgUnitId))).some(t=>t.permissionKey===e.permissionKey&&pe(i,t.startsAt,t.expiresAt)):n===N.Tenant&&se(await(this.dataSources.listEffectivePermissionsForScope?.(e.tenantId,G.Tenant,e.tenantId))).some(t=>t.permissionKey===e.permissionKey&&pe(i,t.startsAt,t.expiresAt)))}async requireAccess(e,...t){if(!await this.canAccess(e,...t))throw new f(`Access denied for ${e.permissionKey} on ${e.resourceProtectedId??(i=e.scopeKind??G.Resource,r=e.scopeId??"",`${i}:${r}`)}`);var i,r}async buildAccessContext(e,t,...i){return ce({tenantId:e,principalId:t,permissions:se(await(this.dataSources.listEffectivePermissions?.(e,t))),grants:se(await(this.dataSources.listPrincipalGrants?.(e,t)))})}async buildArangoContext(e,t,i,...r){const n=await this.buildAccessContext(e,t,...r),s=n.allowedOrgUnitIdsByPermission[i]??[],o=n.resourceGrants.filter(e=>e.permissionKey===i).map(e=>e.resourceId);return te({tenantId:e,principalId:t,permissionKey:i,allowedOrgUnitIds:s,allowedResourceIds:o})}async buildQdrantFilter(e,t,i,...r){const n=await this.buildAccessContext(e,t,...r);return ie({tenantId:e,principalId:t,allowedOrgUnitIds:n.allowedOrgUnitIdsByPermission[i]??[],allowedResourceIds:n.resourceGrants.filter(e=>e.permissionKey===i).map(e=>e.resourceId)})}}const ot="featureFlag",at="FEATURE_FLAG",dt="feature-flags:model",pt="feature-flags:auth",ct="feature-flags:block",yt="feature-flags:render-if",lt="feature-flags:hide-on";function ut(e){const t=e.trim();if(!t)return t;if(/^[a-z][a-zA-Z0-9]*$/.test(t))return t;const i=t.toLowerCase().replace(/[_\-\s]+/g," ").split(" ").filter(Boolean);if(0===i.length)return t;const[r,...n]=i;return[r,...n.map(e=>e?e.charAt(0).toUpperCase()+e.slice(1):e)].join("").replace(/[^a-zA-Z0-9]/g,"")}function gt(e){if("string"!=typeof e)return e;const t=e.trim();if("true"===t)return!0;if("false"===t)return!1;if(/^-?\d+(\.\d+)?$/.test(t))return Number(t);if(t.startsWith("{")&&t.endsWith("}")||t.startsWith("[")&&t.endsWith("]"))try{return JSON.parse(t)}catch{return e}return e}function ht(e){if(void 0===e)return;if(!0===e)return!0;if(!e||"object"!=typeof e||Array.isArray(e))return gt(e);const t={};return Object.entries(e).forEach(([e,i])=>{const r=(e=>{if(!e)return e;if(/^[a-z][a-zA-Z0-9]*$/.test(e))return e;const t=e.replace(/[\s-]+/g,"_").split("_").filter(Boolean);if(0===t.length)return e;const[i,...r]=t;return[i.toLowerCase(),...r.map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase())].join("")})(e);void 0!==i&&(t[r]=ht(i)??i)}),t}function mt(e){return!e||"object"!=typeof e||Array.isArray(e)?{}:Object.entries(e).reduce((e,[t,i])=>{const r=ut(t),n=ht(i);return void 0!==n&&(e[r]=n),e},{})}function ft(e){return!0===e||!!e&&"object"==typeof e}function vt(e,t){return ft(e?.[ut(t)])}function wt(e,t="any"){return{features:[...new Set(e.map(ut).filter(Boolean))],match:t}}function bt(e,t){if(!e||0===e.features.length)return!0;const i=e.features.filter(e=>vt(t,e));return"all"===e.match?i.length===e.features.length:i.length>0}function St(e,t){return!(!e||0===e.features.length)&&e.features.some(e=>vt(t,e))}function At(e,t){return k.get(e,t)}function Ot(e){return e.trim().toLowerCase()}function It(e){return e.trim()}const _t=i.accumulate({[ot]:{}});async function jt(e=_t){return mt(e.featureFlag)}async function Ut(e,t=_t){return(await jt(t))[ut(e)]}async function Pt(e,t=_t){return!!await Ut(e,t)}let Kt=class extends v{constructor(e){super(e),this.enabled=!0}};P([a(),d(),K("design:type",String)],Kt.prototype,"id",void 0),P([g(),I(),c(),K("design:type",String)],Kt.prototype,"key",void 0),P([c(),K("design:type",Boolean)],Kt.prototype,"enabled",void 0),P([c(),K("design:type",String)],Kt.prototype,"description",void 0),P([c(),K("design:type",String)],Kt.prototype,"scope",void 0),P([c(),K("design:type",Object)],Kt.prototype,"metadata",void 0),P([c(),K("design:type",Object)],Kt.prototype,"config",void 0),P([c(),K("design:type",String)],Kt.prototype,"createdBy",void 0),P([c(),K("design:type",String)],Kt.prototype,"updatedBy",void 0),P([y(),K("design:type",Date)],Kt.prototype,"createdAt",void 0),P([l(),K("design:type",Date)],Kt.prototype,"updatedAt",void 0),Kt=P([u("feature_flags"),U(),K("design:paramtypes",[Object])],Kt);let kt=class extends v{constructor(e){super(e),this.enabled=!0}};P([a(),d(),K("design:type",String)],kt.prototype,"id",void 0),P([I(),c(),K("design:type",String)],kt.prototype,"featureKey",void 0),P([I(),c(),K("design:type",String)],kt.prototype,"subjectType",void 0),P([I(),c(),K("design:type",String)],kt.prototype,"subjectKey",void 0),P([c(),K("design:type",Boolean)],kt.prototype,"enabled",void 0),P([c(),K("design:type",Object)],kt.prototype,"metadata",void 0),P([c(),K("design:type",String)],kt.prototype,"createdBy",void 0),P([c(),K("design:type",String)],kt.prototype,"updatedBy",void 0),P([y(),K("design:type",Date)],kt.prototype,"createdAt",void 0),P([l(),K("design:type",Date)],kt.prototype,"updatedAt",void 0),kt=P([u("feature_flag_access"),U(),K("design:paramtypes",[Object])],kt);class Ft{async readOne(e,t){return(await this.read(t))[ut(e)]}}class Rt extends Ft{async read(e={}){return jt(e.source??{[ot]:{}})}}let Tt=class extends o{constructor(){super(Kt),this.reader=new Rt,this.cachedRegistry={}}async initialize(...e){const t=e[0]??{};t.repository&&(this._repository=t.repository),this.reader=t.reader?"function"==typeof t.reader?new t.reader:t.reader:new Rt;const i={...t.readerConfig??{},source:t.readerConfig?.source??_t};return this.cachedRegistry=await this.refreshCachedRegistry(i,...e),{config:{...t,reader:this.reader,readerConfig:i},client:this.reader}}cloneRegistry(e){return Object.entries(e).reduce((e,[t,i])=>(e[t]=i&&"object"==typeof i&&!Array.isArray(i)?{...i}:i,e),{})}async refreshCachedRegistry(e={},...t){const i=await this.reader.read({...e,source:e.source??_t});let r=[];try{r=await this.repo.select().execute(...t)}catch{r=[]}const n=this.cloneRegistry(i);for(const e of r)n[e.key]=!!e.enabled&&(e.config??!0);return n}setCachedFlag(e){this.cachedRegistry[e.key]=!!e.enabled&&(e.config??!0)}getAccessRepository(){return this.accessRepository??S.forModel(kt)}assertInitialized(){this.reader}normalizeFeatureAccessInput(e){return{...e,featureKey:ut(e.featureKey),subjectType:Ot(e.subjectType),subjectKey:It(e.subjectKey)}}buildAccessCondition(e){let t=A.attr("subjectType").eq(Ot(e.subjectType));return t=t.and(A.attr("subjectKey").eq(It(e.subjectKey))),void 0!==e.enabled&&(t=t.and(A.attr("enabled").eq(e.enabled))),e.featureKeys&&e.featureKeys.length>0&&(t=t.and(A.attr("featureKey").in(e.featureKeys.map(ut)))),t}async create(e,...t){e.key=ut(e.key),e.enabled??=!0;const i=await super.create(e,...t);return this.setCachedFlag(i),i}async update(e,...t){e.key=ut(e.key),e.enabled??=!0;const i=await super.update(e,...t);return this.setCachedFlag(i),i}async findOneBy(e,t,...i){const r="key"===e&&"string"==typeof t?ut(t):t;return this.repo.findOneBy(e,r,...i)}async readAll(e,...t){const i=await this.repo.readAll(e,...t);for(const e of i)this.setCachedFlag(e);return i}async listEnabled(...e){return this.repo.select().where(A.attr("enabled").eq(!0)).execute(...e)}async grantFeatureAccess(e,...t){const i=this.normalizeFeatureAccessInput(e),r=await this.findFeatureAccess(i,...t).catch(()=>{});return r?this.getAccessRepository().update(Object.assign(r,i),...t):this.getAccessRepository().create(new kt(i),...t)}async revokeFeatureAccess(e,...t){const i=await this.findFeatureAccess(e,...t).catch(()=>{});if(i)return this.getAccessRepository().delete(i.id,...t)}async findFeatureAccess(e,...t){const i=this.buildAccessCondition(e),r=(await this.getAccessRepository().select().where(i).execute(...t))[0];if(!r)throw new n(`Feature access for ${Ot(e.subjectType)}:${It(e.subjectKey)} not found`);return r}async listFeatureAccess(e,...t){return this.getAccessRepository().select().where(this.buildAccessCondition(e)).execute(...t)}async resolveFeatureFlagsForSubject(e,...t){this.assertInitialized();const i=await this.listFeatureAccess({...e,enabled:!0},...t),r=[...new Set(i.map(e=>e.featureKey))];if(0===r.length)return{};const n=A.attr("enabled").eq(!0).and(A.attr("key").in(r.map(ut)));return(await this.repo.select().where(n).execute(...t)).reduce((e,t)=>(e[t.key]=t.config??!0,e),{})}async isEnabledForSubject(e,t,...i){return vt(await this.resolveFeatureFlagsForSubject(t,...i),e)}isEnabled(e){this.assertInitialized();const t=ut(e);return vt(this.cachedRegistry,t)}async resolveFeatureFlags(){return this.assertInitialized(),this.cloneRegistry(this.cachedRegistry)}async syncFromEnvironment(e={},...t){this.assertInitialized();const i=await this.reader.read({...e,source:e.source??_t}),r=[];for(const[e,n]of Object.entries(i)){const i=n&&"object"==typeof n&&!Array.isArray(n)?n:{enabled:!!n},{enabled:s,...o}=i,a=ut(e),d=await this.findOneBy("key",a,...t).catch(()=>{}),p=d?Object.assign(d,{enabled:ft(n),description:o.description??d.description,scope:o.scope??d.scope,metadata:o.metadata??d.metadata,config:{...o,enabled:ft(n)}}):new Kt({key:a,enabled:ft(n),description:o.description,scope:o.scope,metadata:o.metadata,config:{...o,enabled:ft(n)}});r.push(d?await this.update(p,...t):await this.create(p,...t))}return this.cachedRegistry=await this.refreshCachedRegistry({...e,source:e.source??_t},...t),r}};function xt(e,t){return void 0===t?e:k.key(e,t.toString())}function Bt(e,t,i="any"){const r=wt(t,i);return(t,i,n)=>{if(void 0===i)return F(e,r)(t);const s=xt(e,i);return n?R(s,r)(t,i,n):T(s,r)(t,i)}}function Dt(...e){return Bt(dt,e)}function Ct(...e){return Bt(pt,e)}function Gt(...e){return Bt(ct,e)}function Et(...e){return Bt(yt,e)}function Nt(...e){return Bt(lt,e)}function $t(e,t,i){return At(e,xt(t,i))}function Lt(e,t,i,r){return bt($t(e,i,r),t)}function zt(e,t,i,r){return St($t(e,i,r),t)}P([w(kt),K("design:type",Object)],Tt.prototype,"accessRepository",void 0),Tt=P([b(Kt),K("design:paramtypes",[])],Tt);const Mt="##VERSION##",qt="##COMMIT##",Wt="##FULL_VERSION##",Vt="##PACKAGE##";export{ge as AuthorizationModel,st as AuthzService,ye as BaseModelService,rt as BootstrapService,qt as COMMIT,xe as EffectivePermission,Xe as EffectivePermissionService,Rt as EnvironmeFlagReader,pt as FEATURE_FLAG_AUTH_KEY,ct as FEATURE_FLAG_BLOCK_KEY,at as FEATURE_FLAG_ENV_PREFIX,ot as FEATURE_FLAG_ENV_ROOT,lt as FEATURE_FLAG_HIDE_KEY,dt as FEATURE_FLAG_MODEL_KEY,yt as FEATURE_FLAG_RENDER_KEY,Wt as FULL_VERSION,Kt as FeatureFlag,kt as FeatureFlagAccess,_t as FeatureFlagEnvironment,Ft as FeatureFlagReader,Tt as FeatureFlagService,Te as Group,Re as GroupMembership,Ve as GroupMembershipService,We as GroupService,je as InheritanceBlock,Ge as InheritanceBlockService,B as IsolationTier,z as IsolationTierOptions,D as MembershipStatus,M as MembershipStatusOptions,Ue as OrgUnit,ve as OrgUnitClosure,Ce as OrgUnitClosureService,fe as OrgUnitMembership,qe as OrgUnitMembershipService,Fe as OrgUnitProfile,De as OrgUnitProfileService,$e as OrgUnitService,Vt as PACKAGE_NAME,we as Permission,E as PermissionCategory,V as PermissionCategoryOptions,Ze as PermissionService,Ie as Principal,C as PrincipalKind,q as PrincipalKindOptions,ze as PrincipalService,_e as ProtectedResource,Ye as ProtectedResourceService,Y as REL_CASCADE_DEPENDENT,ee as REL_CASCADE_INSERT_UPDATE,X as REL_NULLIFY,H as REL_RESTRICT,Oe as ResourceGrant,et as ResourceGrantService,tt as ResourceLifecycleService,N as ResourceVisibility,Z as ResourceVisibilityOptions,Se as Role,Ae as RoleAssignment,He as RoleAssignmentService,be as RolePermission,Je as RolePermissionService,Qe as RoleService,G as ScopeKind,W as ScopeKindOptions,Pe as StorageBinding,L as StorageBindingKind,J as StorageBindingKindOptions,it as StorageBindingService,$ as StorageKind,Q as StorageKindOptions,nt as SystemManagementService,Ke as Tenant,he as TenantMembership,Me as TenantMembershipService,ke as TenantProfile,Be as TenantProfileService,Ee as TenantService,me as User,Le as UserService,Mt as VERSION,se as asArray,Gt as blockFeatureOperations,ce as buildAccessContext,te as buildArangoContext,ie as buildQdrantFilter,x as execWithLogging,Ct as featureAuth,Dt as featureFlags,$t as getFeatureGateMetadata,Pt as hasFeatureFlagInEnvironment,Nt as hideOnFeature,le as id,ft as isFeatureFlagEnabled,vt as isFeatureFlagEnabledByName,St as isFeatureRuleBlocked,bt as isFeatureRuleSatisfied,pe as isTimeValid,jt as loadFeatureFlagsFromEnvironment,de as lowerSlug,ht as normalizeFeatureConfig,ut as normalizeFeatureName,mt as normalizeFeatureRegistry,wt as normalizeFeatureRule,It as normalizeFeatureSubjectKey,Ot as normalizeFeatureSubjectType,ne as nowIso,gt as parseRuntimeValue,At as readMetadata,ue as relationId,ae as relationMatch,Et as renderIfFeature,Ut as resolveFeatureFlagFromEnvironment,oe as sameTenant,Lt as shouldExposeForFeatures,zt as shouldHideForFeatures};
|
|
2
|
+
//# sourceMappingURL=integrations.js.map
|