@decaf-ts/integrations 0.3.8 → 0.3.10
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 -1649
- package/dist/integrations.cjs.map +1 -0
- package/dist/integrations.js +2 -1885
- 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/graph/engine/constants.cjs +58 -0
- package/lib/cjs/graph/engine/constants.cjs.map +1 -0
- package/lib/cjs/graph/engine/decorators.cjs +4 -0
- package/lib/cjs/graph/engine/decorators.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphCycleError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphCycleError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphExecutionError.cjs +27 -0
- package/lib/cjs/graph/engine/errors/GraphExecutionError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphInputError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphInputError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphLoopLimitError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphLoopLimitError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphPinningError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphPinningError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphPortError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphPortError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphStoreError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphStoreError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphTopologyError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphTopologyError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/index.cjs +31 -0
- package/lib/cjs/graph/engine/errors/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/events/GraphExecutionEvent.cjs +4 -0
- package/lib/cjs/graph/engine/events/GraphExecutionEvent.cjs.map +1 -0
- package/lib/cjs/graph/engine/events/GraphExecutionEventEmitter.cjs +40 -0
- package/lib/cjs/graph/engine/events/GraphExecutionEventEmitter.cjs.map +1 -0
- package/lib/cjs/graph/engine/events/GraphExecutionEventFactory.cjs +37 -0
- package/lib/cjs/graph/engine/events/GraphExecutionEventFactory.cjs.map +1 -0
- package/lib/cjs/graph/engine/events/GraphExecutionObserver.cjs +4 -0
- package/lib/cjs/graph/engine/events/GraphExecutionObserver.cjs.map +1 -0
- package/lib/cjs/graph/engine/events/index.cjs +27 -0
- package/lib/cjs/graph/engine/events/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/CodeSandboxEvaluator.cjs +4 -0
- package/lib/cjs/graph/engine/execution/CodeSandboxEvaluator.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionContext.cjs +79 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionContext.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionEngine.cjs +413 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionEngine.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionFrame.cjs +32 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionFrame.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionResult.cjs +30 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionResult.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/GraphNodeExecutor.cjs +4 -0
- package/lib/cjs/graph/engine/execution/GraphNodeExecutor.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/SwitchGraphNodeExecutor.cjs +103 -0
- package/lib/cjs/graph/engine/execution/SwitchGraphNodeExecutor.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/index.cjs +30 -0
- package/lib/cjs/graph/engine/execution/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/index.cjs +84 -0
- package/lib/cjs/graph/engine/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/loops/ConditionExpressionEvaluator.cjs +87 -0
- package/lib/cjs/graph/engine/loops/ConditionExpressionEvaluator.cjs.map +1 -0
- package/lib/cjs/graph/engine/loops/ForeachGraphNodeExecutor.cjs +85 -0
- package/lib/cjs/graph/engine/loops/ForeachGraphNodeExecutor.cjs.map +1 -0
- package/lib/cjs/graph/engine/loops/GraphConditionEvaluator.cjs +85 -0
- package/lib/cjs/graph/engine/loops/GraphConditionEvaluator.cjs.map +1 -0
- package/lib/cjs/graph/engine/loops/GraphLoopExecutionContext.cjs +16 -0
- package/lib/cjs/graph/engine/loops/GraphLoopExecutionContext.cjs.map +1 -0
- package/lib/cjs/graph/engine/loops/UntilGraphNodeExecutor.cjs +77 -0
- package/lib/cjs/graph/engine/loops/UntilGraphNodeExecutor.cjs.map +1 -0
- package/lib/cjs/graph/engine/loops/WhileGraphNodeExecutor.cjs +78 -0
- package/lib/cjs/graph/engine/loops/WhileGraphNodeExecutor.cjs.map +1 -0
- package/lib/cjs/graph/engine/loops/index.cjs +29 -0
- package/lib/cjs/graph/engine/loops/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningDependencyResolver.cjs +28 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningDependencyResolver.cjs.map +1 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningMetadata.cjs +20 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningMetadata.cjs.map +1 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningPolicy.cjs +34 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningPolicy.cjs.map +1 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningService.cjs +191 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningService.cjs.map +1 -0
- package/lib/cjs/graph/engine/pinning/index.cjs +27 -0
- package/lib/cjs/graph/engine/pinning/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlan.cjs +4 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlan.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanEdge.cjs +4 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanEdge.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanLayer.cjs +4 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanLayer.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanNode.cjs +4 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanNode.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanner.cjs +197 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanner.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/GraphRelationResolver.cjs +172 -0
- package/lib/cjs/graph/engine/planning/GraphRelationResolver.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/GraphTopology.cjs +57 -0
- package/lib/cjs/graph/engine/planning/GraphTopology.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/index.cjs +30 -0
- package/lib/cjs/graph/engine/planning/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/registry/GraphNodeExecutorRegistry.cjs +44 -0
- package/lib/cjs/graph/engine/registry/GraphNodeExecutorRegistry.cjs.map +1 -0
- package/lib/cjs/graph/engine/registry/GraphNodeExecutorResolver.cjs +27 -0
- package/lib/cjs/graph/engine/registry/GraphNodeExecutorResolver.cjs.map +1 -0
- package/lib/cjs/graph/engine/registry/index.cjs +25 -0
- package/lib/cjs/graph/engine/registry/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/snapshots/GraphExecutionSnapshotMapper.cjs +53 -0
- package/lib/cjs/graph/engine/snapshots/GraphExecutionSnapshotMapper.cjs.map +1 -0
- package/lib/cjs/graph/engine/snapshots/index.cjs +24 -0
- package/lib/cjs/graph/engine/snapshots/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/store/GraphCachedValue.cjs +4 -0
- package/lib/cjs/graph/engine/store/GraphCachedValue.cjs.map +1 -0
- package/lib/cjs/graph/engine/store/GraphValueKey.cjs +4 -0
- package/lib/cjs/graph/engine/store/GraphValueKey.cjs.map +1 -0
- package/lib/cjs/graph/engine/store/GraphValueStore.cjs +76 -0
- package/lib/cjs/graph/engine/store/GraphValueStore.cjs.map +1 -0
- package/lib/cjs/graph/engine/store/GraphValueStoreAdapter.cjs +4 -0
- package/lib/cjs/graph/engine/store/GraphValueStoreAdapter.cjs.map +1 -0
- package/lib/cjs/graph/engine/store/InMemoryGraphValueStoreAdapter.cjs +69 -0
- package/lib/cjs/graph/engine/store/InMemoryGraphValueStoreAdapter.cjs.map +1 -0
- package/lib/cjs/graph/engine/store/index.cjs +28 -0
- package/lib/cjs/graph/engine/store/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/types.cjs +4 -0
- package/lib/cjs/graph/engine/types.cjs.map +1 -0
- package/lib/cjs/graph/engine/validation/GraphDefinitionValidator.cjs +33 -0
- package/lib/cjs/graph/engine/validation/GraphDefinitionValidator.cjs.map +1 -0
- package/lib/cjs/graph/engine/validation/GraphPortSchemaResolver.cjs +58 -0
- package/lib/cjs/graph/engine/validation/GraphPortSchemaResolver.cjs.map +1 -0
- package/lib/cjs/graph/engine/validation/GraphValueValidator.cjs +52 -0
- package/lib/cjs/graph/engine/validation/GraphValueValidator.cjs.map +1 -0
- package/lib/cjs/graph/engine/validation/index.cjs +26 -0
- package/lib/cjs/graph/engine/validation/index.cjs.map +1 -0
- package/lib/cjs/graph/index.cjs +10 -60
- package/lib/cjs/graph/index.cjs.map +1 -0
- package/lib/cjs/graph/shared/constants.cjs +44 -0
- package/lib/cjs/graph/shared/constants.cjs.map +1 -0
- package/lib/cjs/graph/shared/index.cjs +38 -0
- package/lib/cjs/graph/shared/index.cjs.map +1 -0
- package/lib/cjs/graph/shared/nodes/agent.cjs +110 -0
- package/lib/cjs/graph/shared/nodes/agent.cjs.map +1 -0
- package/lib/cjs/graph/shared/nodes/base.cjs +36 -0
- package/lib/cjs/graph/shared/nodes/base.cjs.map +1 -0
- package/lib/cjs/graph/shared/nodes/category-styles.cjs +38 -0
- package/lib/cjs/graph/shared/nodes/category-styles.cjs.map +1 -0
- package/lib/cjs/graph/shared/nodes/flow-control.cjs +464 -0
- package/lib/cjs/graph/shared/nodes/flow-control.cjs.map +1 -0
- package/lib/cjs/graph/shared/nodes/index.cjs +35 -0
- package/lib/cjs/graph/shared/nodes/index.cjs.map +1 -0
- package/lib/cjs/graph/shared/nodes/triggers.cjs +250 -0
- package/lib/cjs/graph/shared/nodes/triggers.cjs.map +1 -0
- package/lib/cjs/graph/shared/types.cjs +4 -0
- 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/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/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 +10 -4
- 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 +19 -10
- package/lib/cjs/namespaces/org-based-authorization-system.services.cjs.map +1 -0
- package/lib/cjs/namespaces/services/authz.service.cjs +39 -13
- 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 +6 -4
- package/lib/cjs/namespaces/services/inheritance-block.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/org-unit-closure.service.cjs +16 -7
- 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 +4 -3
- 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 +13 -5
- package/lib/cjs/namespaces/utils.cjs.map +1 -0
- package/lib/cjs/nest/authService.cjs +2 -2
- package/lib/cjs/nest/authService.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 +6 -4
- 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/GraphExecutionResultRepository.cjs +2 -2
- package/lib/cjs/nest/graph/GraphExecutionResultRepository.cjs.map +1 -0
- package/lib/cjs/nest/graph/GraphExecutorRegistryFactory.cjs +97 -11
- package/lib/cjs/nest/graph/GraphExecutorRegistryFactory.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 +30 -0
- 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 +2 -2
- 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 +2 -2
- package/lib/cjs/nest/utils.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/graph/engine/constants.js +62 -0
- package/lib/esm/graph/engine/constants.js.map +1 -0
- package/lib/esm/graph/engine/decorators.js +2 -0
- package/lib/esm/graph/engine/decorators.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphCycleError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphCycleError.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphExecutionError.js +22 -0
- package/lib/esm/graph/engine/errors/GraphExecutionError.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphInputError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphInputError.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphLoopLimitError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphLoopLimitError.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphPinningError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphPinningError.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphPortError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphPortError.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphStoreError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphStoreError.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphTopologyError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphTopologyError.js.map +1 -0
- package/lib/esm/graph/engine/errors/index.js +14 -0
- package/lib/esm/graph/engine/errors/index.js.map +1 -0
- package/lib/esm/graph/engine/events/GraphExecutionEvent.js +2 -0
- package/lib/esm/graph/engine/events/GraphExecutionEvent.js.map +1 -0
- package/lib/esm/graph/engine/events/GraphExecutionEventEmitter.js +35 -0
- package/lib/esm/graph/engine/events/GraphExecutionEventEmitter.js.map +1 -0
- package/lib/esm/graph/engine/events/GraphExecutionEventFactory.js +32 -0
- package/lib/esm/graph/engine/events/GraphExecutionEventFactory.js.map +1 -0
- package/lib/esm/graph/engine/events/GraphExecutionObserver.js +2 -0
- package/lib/esm/graph/engine/events/GraphExecutionObserver.js.map +1 -0
- package/lib/esm/graph/engine/events/index.js +10 -0
- package/lib/esm/graph/engine/events/index.js.map +1 -0
- package/lib/esm/graph/engine/execution/CodeSandboxEvaluator.js +18 -0
- package/lib/esm/graph/engine/execution/CodeSandboxEvaluator.js.map +1 -0
- package/lib/esm/graph/engine/execution/GraphExecutionContext.js +74 -0
- package/lib/esm/graph/engine/execution/GraphExecutionContext.js.map +1 -0
- package/lib/esm/graph/engine/execution/GraphExecutionEngine.js +408 -0
- package/lib/esm/graph/engine/execution/GraphExecutionEngine.js.map +1 -0
- package/lib/esm/graph/engine/execution/GraphExecutionFrame.js +27 -0
- package/lib/esm/graph/engine/execution/GraphExecutionFrame.js.map +1 -0
- package/lib/esm/graph/engine/execution/GraphExecutionResult.js +26 -0
- package/lib/esm/graph/engine/execution/GraphExecutionResult.js.map +1 -0
- package/lib/esm/graph/engine/execution/GraphNodeExecutor.js +2 -0
- package/lib/esm/graph/engine/execution/GraphNodeExecutor.js.map +1 -0
- package/lib/esm/graph/engine/execution/SwitchGraphNodeExecutor.js +98 -0
- package/lib/esm/graph/engine/execution/SwitchGraphNodeExecutor.js.map +1 -0
- package/lib/esm/graph/engine/execution/index.js +13 -0
- package/lib/esm/graph/engine/execution/index.js.map +1 -0
- package/lib/esm/graph/engine/index.js +67 -0
- package/lib/esm/graph/engine/index.js.map +1 -0
- package/lib/esm/graph/engine/loops/ConditionExpressionEvaluator.js +82 -0
- package/lib/esm/graph/engine/loops/ConditionExpressionEvaluator.js.map +1 -0
- package/lib/esm/graph/engine/loops/ForeachGraphNodeExecutor.js +80 -0
- package/lib/esm/graph/engine/loops/ForeachGraphNodeExecutor.js.map +1 -0
- package/lib/esm/graph/engine/loops/GraphConditionEvaluator.js +80 -0
- package/lib/esm/graph/engine/loops/GraphConditionEvaluator.js.map +1 -0
- package/lib/esm/graph/engine/loops/GraphLoopExecutionContext.js +11 -0
- package/lib/esm/graph/engine/loops/GraphLoopExecutionContext.js.map +1 -0
- package/lib/esm/graph/engine/loops/UntilGraphNodeExecutor.js +72 -0
- package/lib/esm/graph/engine/loops/UntilGraphNodeExecutor.js.map +1 -0
- package/lib/esm/graph/engine/loops/WhileGraphNodeExecutor.js +73 -0
- package/lib/esm/graph/engine/loops/WhileGraphNodeExecutor.js.map +1 -0
- package/lib/esm/graph/engine/loops/index.js +12 -0
- package/lib/esm/graph/engine/loops/index.js.map +1 -0
- package/lib/esm/graph/engine/pinning/GraphPinningDependencyResolver.js +23 -0
- package/lib/esm/graph/engine/pinning/GraphPinningDependencyResolver.js.map +1 -0
- package/lib/esm/graph/engine/pinning/GraphPinningMetadata.js +15 -0
- package/lib/esm/graph/engine/pinning/GraphPinningMetadata.js.map +1 -0
- package/lib/esm/graph/engine/pinning/GraphPinningPolicy.js +29 -0
- package/lib/esm/graph/engine/pinning/GraphPinningPolicy.js.map +1 -0
- package/lib/esm/graph/engine/pinning/GraphPinningService.js +186 -0
- package/lib/esm/graph/engine/pinning/GraphPinningService.js.map +1 -0
- package/lib/esm/graph/engine/pinning/index.js +10 -0
- package/lib/esm/graph/engine/pinning/index.js.map +1 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlan.js +2 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlan.js.map +1 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanEdge.js +7 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanEdge.js.map +1 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanLayer.js +2 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanLayer.js.map +1 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanNode.js +2 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanNode.js.map +1 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanner.js +192 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanner.js.map +1 -0
- package/lib/esm/graph/engine/planning/GraphRelationResolver.js +167 -0
- package/lib/esm/graph/engine/planning/GraphRelationResolver.js.map +1 -0
- package/lib/esm/graph/engine/planning/GraphTopology.js +52 -0
- package/lib/esm/graph/engine/planning/GraphTopology.js.map +1 -0
- package/lib/esm/graph/engine/planning/index.js +13 -0
- package/lib/esm/graph/engine/planning/index.js.map +1 -0
- package/lib/esm/graph/engine/registry/GraphNodeExecutorRegistry.js +39 -0
- package/lib/esm/graph/engine/registry/GraphNodeExecutorRegistry.js.map +1 -0
- package/lib/esm/graph/engine/registry/GraphNodeExecutorResolver.js +22 -0
- package/lib/esm/graph/engine/registry/GraphNodeExecutorResolver.js.map +1 -0
- package/lib/esm/graph/engine/registry/index.js +8 -0
- package/lib/esm/graph/engine/registry/index.js.map +1 -0
- package/lib/esm/graph/engine/snapshots/GraphExecutionSnapshotMapper.js +48 -0
- package/lib/esm/graph/engine/snapshots/GraphExecutionSnapshotMapper.js.map +1 -0
- package/lib/esm/graph/engine/snapshots/index.js +7 -0
- package/lib/esm/graph/engine/snapshots/index.js.map +1 -0
- package/lib/esm/graph/engine/store/GraphCachedValue.js +2 -0
- package/lib/esm/graph/engine/store/GraphCachedValue.js.map +1 -0
- package/lib/esm/graph/engine/store/GraphValueKey.js +7 -0
- package/lib/esm/graph/engine/store/GraphValueKey.js.map +1 -0
- package/lib/esm/graph/engine/store/GraphValueStore.js +71 -0
- package/lib/esm/graph/engine/store/GraphValueStore.js.map +1 -0
- package/lib/esm/graph/engine/store/GraphValueStoreAdapter.js +2 -0
- package/lib/esm/graph/engine/store/GraphValueStoreAdapter.js.map +1 -0
- package/lib/esm/graph/engine/store/InMemoryGraphValueStoreAdapter.js +64 -0
- package/lib/esm/graph/engine/store/InMemoryGraphValueStoreAdapter.js.map +1 -0
- package/lib/esm/graph/engine/store/index.js +11 -0
- package/lib/esm/graph/engine/store/index.js.map +1 -0
- package/lib/esm/graph/engine/types.js +2 -0
- package/lib/esm/graph/engine/types.js.map +1 -0
- package/lib/esm/graph/engine/validation/GraphDefinitionValidator.js +28 -0
- package/lib/esm/graph/engine/validation/GraphDefinitionValidator.js.map +1 -0
- package/lib/esm/graph/engine/validation/GraphPortSchemaResolver.js +53 -0
- package/lib/esm/graph/engine/validation/GraphPortSchemaResolver.js.map +1 -0
- package/lib/esm/graph/engine/validation/GraphValueValidator.js +47 -0
- package/lib/esm/graph/engine/validation/GraphValueValidator.js.map +1 -0
- package/lib/esm/graph/engine/validation/index.js +9 -0
- package/lib/esm/graph/engine/validation/index.js.map +1 -0
- package/lib/esm/graph/index.js +9 -59
- package/lib/esm/graph/index.js.map +1 -0
- package/lib/esm/graph/shared/constants.js +56 -0
- package/lib/esm/graph/shared/constants.js.map +1 -0
- package/lib/esm/graph/shared/index.js +19 -0
- package/lib/esm/graph/shared/index.js.map +1 -0
- package/lib/esm/graph/shared/nodes/agent.js +101 -0
- package/lib/esm/graph/shared/nodes/agent.js.map +1 -0
- package/lib/esm/graph/shared/nodes/base.js +31 -0
- package/lib/esm/graph/shared/nodes/base.js.map +1 -0
- package/lib/esm/graph/shared/nodes/category-styles.js +34 -0
- package/lib/esm/graph/shared/nodes/category-styles.js.map +1 -0
- package/lib/esm/graph/shared/nodes/flow-control.js +455 -0
- package/lib/esm/graph/shared/nodes/flow-control.js.map +1 -0
- package/lib/esm/graph/shared/nodes/index.js +18 -0
- package/lib/esm/graph/shared/nodes/index.js.map +1 -0
- package/lib/esm/graph/shared/nodes/triggers.js +241 -0
- package/lib/esm/graph/shared/nodes/triggers.js.map +1 -0
- package/lib/esm/graph/shared/types.js +2 -0
- 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/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/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 +3 -3
- 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 +10 -4
- 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 +18 -9
- package/lib/esm/namespaces/org-based-authorization-system.services.js.map +1 -0
- package/lib/esm/namespaces/services/authz.service.js +40 -14
- 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 +5 -3
- package/lib/esm/namespaces/services/inheritance-block.service.js.map +1 -0
- package/lib/esm/namespaces/services/org-unit-closure.service.js +16 -7
- 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 +3 -2
- 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 +12 -4
- package/lib/esm/namespaces/utils.js.map +1 -0
- package/lib/esm/nest/authService.js +1 -1
- package/lib/esm/nest/authService.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 +6 -4
- 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/GraphExecutionResultRepository.js +1 -1
- package/lib/esm/nest/graph/GraphExecutionResultRepository.js.map +1 -0
- package/lib/esm/nest/graph/GraphExecutorRegistryFactory.js +96 -11
- package/lib/esm/nest/graph/GraphExecutorRegistryFactory.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 +27 -0
- 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 +1 -1
- 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 +1 -1
- package/lib/esm/nest/utils.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/graph/engine/constants.d.cts +59 -0
- package/lib/types/graph/engine/constants.d.mts +59 -0
- package/lib/types/graph/{execution → engine/execution}/GraphExecutionResult.d.cts +1 -1
- package/lib/types/graph/{execution → engine/execution}/GraphExecutionResult.d.mts +1 -1
- package/lib/types/graph/engine/index.d.cts +61 -0
- package/lib/types/graph/engine/index.d.mts +61 -0
- package/lib/types/graph/{loops → engine/loops}/ConditionExpressionEvaluator.d.cts +1 -1
- package/lib/types/graph/{loops → engine/loops}/ConditionExpressionEvaluator.d.mts +1 -1
- package/lib/types/graph/{loops → engine/loops}/GraphConditionEvaluator.d.cts +2 -1
- package/lib/types/graph/{loops → engine/loops}/GraphConditionEvaluator.d.mts +2 -1
- package/lib/types/graph/{types.d.cts → engine/types.d.cts} +12 -148
- package/lib/types/graph/{types.d.mts → engine/types.d.mts} +12 -148
- package/lib/types/graph/index.d.cts +8 -53
- package/lib/types/graph/index.d.mts +8 -53
- package/lib/types/graph/shared/constants.d.cts +53 -0
- package/lib/types/graph/shared/constants.d.mts +53 -0
- package/lib/types/graph/shared/index.d.cts +18 -0
- package/lib/types/graph/shared/index.d.mts +18 -0
- package/lib/types/graph/shared/types.d.cts +162 -0
- package/lib/types/graph/shared/types.d.mts +162 -0
- package/lib/types/index.d.cts +2 -2
- package/lib/types/index.d.mts +2 -2
- package/lib/types/nest/graph/GraphExecutorRegistryFactory.d.cts +33 -5
- package/lib/types/nest/graph/GraphExecutorRegistryFactory.d.mts +33 -5
- package/lib/types/nest/graph/main.d.cts +1 -0
- package/lib/types/nest/graph/main.d.mts +1 -0
- package/package.json +19 -8
- package/lib/cjs/graph/constants.cjs +0 -94
- package/lib/cjs/graph/decorators.cjs +0 -4
- package/lib/cjs/graph/errors/GraphCycleError.cjs +0 -20
- package/lib/cjs/graph/errors/GraphExecutionError.cjs +0 -27
- package/lib/cjs/graph/errors/GraphInputError.cjs +0 -20
- package/lib/cjs/graph/errors/GraphLoopLimitError.cjs +0 -20
- package/lib/cjs/graph/errors/GraphPinningError.cjs +0 -20
- package/lib/cjs/graph/errors/GraphPortError.cjs +0 -20
- package/lib/cjs/graph/errors/GraphStoreError.cjs +0 -20
- package/lib/cjs/graph/errors/GraphTopologyError.cjs +0 -20
- package/lib/cjs/graph/errors/index.cjs +0 -31
- package/lib/cjs/graph/events/GraphExecutionEvent.cjs +0 -4
- package/lib/cjs/graph/events/GraphExecutionEventEmitter.cjs +0 -40
- package/lib/cjs/graph/events/GraphExecutionEventFactory.cjs +0 -37
- package/lib/cjs/graph/events/GraphExecutionObserver.cjs +0 -4
- package/lib/cjs/graph/events/index.cjs +0 -27
- package/lib/cjs/graph/execution/CodeSandboxEvaluator.cjs +0 -4
- package/lib/cjs/graph/execution/GraphExecutionContext.cjs +0 -79
- package/lib/cjs/graph/execution/GraphExecutionEngine.cjs +0 -407
- package/lib/cjs/graph/execution/GraphExecutionFrame.cjs +0 -32
- package/lib/cjs/graph/execution/GraphExecutionResult.cjs +0 -30
- package/lib/cjs/graph/execution/GraphNodeExecutor.cjs +0 -4
- package/lib/cjs/graph/execution/SwitchGraphNodeExecutor.cjs +0 -103
- package/lib/cjs/graph/execution/index.cjs +0 -30
- package/lib/cjs/graph/loops/ConditionExpressionEvaluator.cjs +0 -87
- package/lib/cjs/graph/loops/ForeachGraphNodeExecutor.cjs +0 -84
- package/lib/cjs/graph/loops/GraphConditionEvaluator.cjs +0 -85
- package/lib/cjs/graph/loops/GraphLoopExecutionContext.cjs +0 -16
- package/lib/cjs/graph/loops/UntilGraphNodeExecutor.cjs +0 -76
- package/lib/cjs/graph/loops/WhileGraphNodeExecutor.cjs +0 -77
- package/lib/cjs/graph/loops/index.cjs +0 -29
- package/lib/cjs/graph/nodes/agent.cjs +0 -110
- package/lib/cjs/graph/nodes/base.cjs +0 -35
- package/lib/cjs/graph/nodes/category-styles.cjs +0 -38
- package/lib/cjs/graph/nodes/flow-control.cjs +0 -464
- package/lib/cjs/graph/nodes/index.cjs +0 -35
- package/lib/cjs/graph/nodes/triggers.cjs +0 -250
- package/lib/cjs/graph/pinning/GraphPinningDependencyResolver.cjs +0 -28
- package/lib/cjs/graph/pinning/GraphPinningMetadata.cjs +0 -20
- package/lib/cjs/graph/pinning/GraphPinningPolicy.cjs +0 -34
- package/lib/cjs/graph/pinning/GraphPinningService.cjs +0 -191
- package/lib/cjs/graph/pinning/index.cjs +0 -27
- package/lib/cjs/graph/planning/GraphExecutionPlan.cjs +0 -4
- package/lib/cjs/graph/planning/GraphExecutionPlanEdge.cjs +0 -4
- package/lib/cjs/graph/planning/GraphExecutionPlanLayer.cjs +0 -4
- package/lib/cjs/graph/planning/GraphExecutionPlanNode.cjs +0 -4
- package/lib/cjs/graph/planning/GraphExecutionPlanner.cjs +0 -197
- package/lib/cjs/graph/planning/GraphRelationResolver.cjs +0 -172
- package/lib/cjs/graph/planning/GraphTopology.cjs +0 -57
- package/lib/cjs/graph/planning/index.cjs +0 -30
- package/lib/cjs/graph/registry/GraphNodeExecutorRegistry.cjs +0 -44
- package/lib/cjs/graph/registry/GraphNodeExecutorResolver.cjs +0 -27
- package/lib/cjs/graph/registry/index.cjs +0 -25
- package/lib/cjs/graph/snapshots/GraphExecutionSnapshotMapper.cjs +0 -53
- package/lib/cjs/graph/snapshots/index.cjs +0 -24
- package/lib/cjs/graph/store/GraphCachedValue.cjs +0 -4
- package/lib/cjs/graph/store/GraphValueKey.cjs +0 -4
- package/lib/cjs/graph/store/GraphValueStore.cjs +0 -76
- package/lib/cjs/graph/store/GraphValueStoreAdapter.cjs +0 -4
- package/lib/cjs/graph/store/InMemoryGraphValueStoreAdapter.cjs +0 -69
- package/lib/cjs/graph/store/index.cjs +0 -28
- package/lib/cjs/graph/types.cjs +0 -4
- package/lib/cjs/graph/validation/GraphDefinitionValidator.cjs +0 -33
- package/lib/cjs/graph/validation/GraphPortSchemaResolver.cjs +0 -58
- package/lib/cjs/graph/validation/GraphValueValidator.cjs +0 -52
- package/lib/cjs/graph/validation/index.cjs +0 -26
- package/lib/esm/graph/constants.js +0 -106
- package/lib/esm/graph/decorators.js +0 -2
- package/lib/esm/graph/errors/GraphCycleError.js +0 -15
- package/lib/esm/graph/errors/GraphExecutionError.js +0 -22
- package/lib/esm/graph/errors/GraphInputError.js +0 -15
- package/lib/esm/graph/errors/GraphLoopLimitError.js +0 -15
- package/lib/esm/graph/errors/GraphPinningError.js +0 -15
- package/lib/esm/graph/errors/GraphPortError.js +0 -15
- package/lib/esm/graph/errors/GraphStoreError.js +0 -15
- package/lib/esm/graph/errors/GraphTopologyError.js +0 -15
- package/lib/esm/graph/errors/index.js +0 -14
- package/lib/esm/graph/events/GraphExecutionEvent.js +0 -2
- package/lib/esm/graph/events/GraphExecutionEventEmitter.js +0 -35
- package/lib/esm/graph/events/GraphExecutionEventFactory.js +0 -32
- package/lib/esm/graph/events/GraphExecutionObserver.js +0 -2
- package/lib/esm/graph/events/index.js +0 -10
- package/lib/esm/graph/execution/CodeSandboxEvaluator.js +0 -18
- package/lib/esm/graph/execution/GraphExecutionContext.js +0 -74
- package/lib/esm/graph/execution/GraphExecutionEngine.js +0 -402
- package/lib/esm/graph/execution/GraphExecutionFrame.js +0 -27
- package/lib/esm/graph/execution/GraphExecutionResult.js +0 -26
- package/lib/esm/graph/execution/GraphNodeExecutor.js +0 -2
- package/lib/esm/graph/execution/SwitchGraphNodeExecutor.js +0 -98
- package/lib/esm/graph/execution/index.js +0 -13
- package/lib/esm/graph/loops/ConditionExpressionEvaluator.js +0 -82
- package/lib/esm/graph/loops/ForeachGraphNodeExecutor.js +0 -79
- package/lib/esm/graph/loops/GraphConditionEvaluator.js +0 -80
- package/lib/esm/graph/loops/GraphLoopExecutionContext.js +0 -11
- package/lib/esm/graph/loops/UntilGraphNodeExecutor.js +0 -71
- package/lib/esm/graph/loops/WhileGraphNodeExecutor.js +0 -72
- package/lib/esm/graph/loops/index.js +0 -12
- package/lib/esm/graph/nodes/agent.js +0 -101
- package/lib/esm/graph/nodes/base.js +0 -30
- package/lib/esm/graph/nodes/category-styles.js +0 -34
- package/lib/esm/graph/nodes/flow-control.js +0 -455
- package/lib/esm/graph/nodes/index.js +0 -18
- package/lib/esm/graph/nodes/triggers.js +0 -241
- package/lib/esm/graph/pinning/GraphPinningDependencyResolver.js +0 -23
- package/lib/esm/graph/pinning/GraphPinningMetadata.js +0 -15
- package/lib/esm/graph/pinning/GraphPinningPolicy.js +0 -29
- package/lib/esm/graph/pinning/GraphPinningService.js +0 -186
- package/lib/esm/graph/pinning/index.js +0 -10
- package/lib/esm/graph/planning/GraphExecutionPlan.js +0 -2
- package/lib/esm/graph/planning/GraphExecutionPlanEdge.js +0 -7
- package/lib/esm/graph/planning/GraphExecutionPlanLayer.js +0 -2
- package/lib/esm/graph/planning/GraphExecutionPlanNode.js +0 -2
- package/lib/esm/graph/planning/GraphExecutionPlanner.js +0 -192
- package/lib/esm/graph/planning/GraphRelationResolver.js +0 -167
- package/lib/esm/graph/planning/GraphTopology.js +0 -52
- package/lib/esm/graph/planning/index.js +0 -13
- package/lib/esm/graph/registry/GraphNodeExecutorRegistry.js +0 -39
- package/lib/esm/graph/registry/GraphNodeExecutorResolver.js +0 -22
- package/lib/esm/graph/registry/index.js +0 -8
- package/lib/esm/graph/snapshots/GraphExecutionSnapshotMapper.js +0 -48
- package/lib/esm/graph/snapshots/index.js +0 -7
- package/lib/esm/graph/store/GraphCachedValue.js +0 -2
- package/lib/esm/graph/store/GraphValueKey.js +0 -7
- package/lib/esm/graph/store/GraphValueStore.js +0 -71
- package/lib/esm/graph/store/GraphValueStoreAdapter.js +0 -2
- package/lib/esm/graph/store/InMemoryGraphValueStoreAdapter.js +0 -64
- package/lib/esm/graph/store/index.js +0 -11
- package/lib/esm/graph/types.js +0 -2
- package/lib/esm/graph/validation/GraphDefinitionValidator.js +0 -28
- package/lib/esm/graph/validation/GraphPortSchemaResolver.js +0 -53
- package/lib/esm/graph/validation/GraphValueValidator.js +0 -47
- package/lib/esm/graph/validation/index.js +0 -9
- package/lib/types/graph/constants.d.cts +0 -101
- package/lib/types/graph/constants.d.mts +0 -101
- /package/lib/types/graph/{decorators.d.cts → engine/decorators.d.cts} +0 -0
- /package/lib/types/graph/{decorators.d.mts → engine/decorators.d.mts} +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphCycleError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphCycleError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphExecutionError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphExecutionError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphInputError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphInputError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphLoopLimitError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphLoopLimitError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphPinningError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphPinningError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphPortError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphPortError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphStoreError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphStoreError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphTopologyError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphTopologyError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/index.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/index.d.mts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionEvent.d.cts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionEvent.d.mts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionEventEmitter.d.cts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionEventEmitter.d.mts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionEventFactory.d.cts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionEventFactory.d.mts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionObserver.d.cts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionObserver.d.mts +0 -0
- /package/lib/types/graph/{events → engine/events}/index.d.cts +0 -0
- /package/lib/types/graph/{events → engine/events}/index.d.mts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/CodeSandboxEvaluator.d.cts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/CodeSandboxEvaluator.d.mts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphExecutionContext.d.cts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphExecutionContext.d.mts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphExecutionEngine.d.cts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphExecutionEngine.d.mts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphExecutionFrame.d.cts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphExecutionFrame.d.mts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphNodeExecutor.d.cts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphNodeExecutor.d.mts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/SwitchGraphNodeExecutor.d.cts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/SwitchGraphNodeExecutor.d.mts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/index.d.cts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/index.d.mts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/ForeachGraphNodeExecutor.d.cts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/ForeachGraphNodeExecutor.d.mts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/GraphLoopExecutionContext.d.cts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/GraphLoopExecutionContext.d.mts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/UntilGraphNodeExecutor.d.cts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/UntilGraphNodeExecutor.d.mts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/WhileGraphNodeExecutor.d.cts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/WhileGraphNodeExecutor.d.mts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/index.d.cts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/index.d.mts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningDependencyResolver.d.cts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningDependencyResolver.d.mts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningMetadata.d.cts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningMetadata.d.mts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningPolicy.d.cts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningPolicy.d.mts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningService.d.cts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningService.d.mts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/index.d.cts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/index.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlan.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlan.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanEdge.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanEdge.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanLayer.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanLayer.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanNode.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanNode.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanner.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanner.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphRelationResolver.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphRelationResolver.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphTopology.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphTopology.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/index.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/index.d.mts +0 -0
- /package/lib/types/graph/{registry → engine/registry}/GraphNodeExecutorRegistry.d.cts +0 -0
- /package/lib/types/graph/{registry → engine/registry}/GraphNodeExecutorRegistry.d.mts +0 -0
- /package/lib/types/graph/{registry → engine/registry}/GraphNodeExecutorResolver.d.cts +0 -0
- /package/lib/types/graph/{registry → engine/registry}/GraphNodeExecutorResolver.d.mts +0 -0
- /package/lib/types/graph/{registry → engine/registry}/index.d.cts +0 -0
- /package/lib/types/graph/{registry → engine/registry}/index.d.mts +0 -0
- /package/lib/types/graph/{snapshots → engine/snapshots}/GraphExecutionSnapshotMapper.d.cts +0 -0
- /package/lib/types/graph/{snapshots → engine/snapshots}/GraphExecutionSnapshotMapper.d.mts +0 -0
- /package/lib/types/graph/{snapshots → engine/snapshots}/index.d.cts +0 -0
- /package/lib/types/graph/{snapshots → engine/snapshots}/index.d.mts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphCachedValue.d.cts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphCachedValue.d.mts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphValueKey.d.cts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphValueKey.d.mts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphValueStore.d.cts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphValueStore.d.mts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphValueStoreAdapter.d.cts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphValueStoreAdapter.d.mts +0 -0
- /package/lib/types/graph/{store → engine/store}/InMemoryGraphValueStoreAdapter.d.cts +0 -0
- /package/lib/types/graph/{store → engine/store}/InMemoryGraphValueStoreAdapter.d.mts +0 -0
- /package/lib/types/graph/{store → engine/store}/index.d.cts +0 -0
- /package/lib/types/graph/{store → engine/store}/index.d.mts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/GraphDefinitionValidator.d.cts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/GraphDefinitionValidator.d.mts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/GraphPortSchemaResolver.d.cts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/GraphPortSchemaResolver.d.mts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/GraphValueValidator.d.cts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/GraphValueValidator.d.mts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/index.d.cts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/index.d.mts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/agent.d.cts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/agent.d.mts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/base.d.cts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/base.d.mts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/category-styles.d.cts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/category-styles.d.mts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/flow-control.d.cts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/flow-control.d.mts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/index.d.cts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/index.d.mts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/triggers.d.cts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/triggers.d.mts +0 -0
|
@@ -1,407 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.GraphExecutionEngine = void 0;
|
|
4
|
-
const constants_js_1 = require("./../constants.cjs");
|
|
5
|
-
const GraphExecutionEventEmitter_js_1 = require("./../events/GraphExecutionEventEmitter.cjs");
|
|
6
|
-
const GraphExecutionEventFactory_js_1 = require("./../events/GraphExecutionEventFactory.cjs");
|
|
7
|
-
const GraphExecutionPlanner_js_1 = require("./../planning/GraphExecutionPlanner.cjs");
|
|
8
|
-
const InMemoryGraphValueStoreAdapter_js_1 = require("./../store/InMemoryGraphValueStoreAdapter.cjs");
|
|
9
|
-
const GraphValueStore_js_1 = require("./../store/GraphValueStore.cjs");
|
|
10
|
-
const GraphPinningService_js_1 = require("./../pinning/GraphPinningService.cjs");
|
|
11
|
-
const GraphPinningPolicy_js_1 = require("./../pinning/GraphPinningPolicy.cjs");
|
|
12
|
-
const GraphPinningDependencyResolver_js_1 = require("./../pinning/GraphPinningDependencyResolver.cjs");
|
|
13
|
-
const GraphExecutionContext_js_1 = require("./GraphExecutionContext.cjs");
|
|
14
|
-
const GraphExecutionFrame_js_1 = require("./GraphExecutionFrame.cjs");
|
|
15
|
-
const GraphExecutionResult_js_1 = require("./GraphExecutionResult.cjs");
|
|
16
|
-
/**
|
|
17
|
-
* Reference graph execution engine.
|
|
18
|
-
*
|
|
19
|
-
* Executes a {@link GraphWorkflowDefinition} by:
|
|
20
|
-
* 1. Planning the workflow into topological layers.
|
|
21
|
-
* 2. Seeding workflow inputs into the value store.
|
|
22
|
-
* 3. Executing nodes layer-by-layer with configurable concurrency.
|
|
23
|
-
* 4. Routing values along edges.
|
|
24
|
-
* 5. Emitting structured events through Decaf's Observable pipeline.
|
|
25
|
-
* 6. Returning a complete {@link GraphExecutionResult}.
|
|
26
|
-
*/
|
|
27
|
-
class GraphExecutionEngine {
|
|
28
|
-
constructor(config) {
|
|
29
|
-
this.emitter = config.eventEmitter ?? new GraphExecutionEventEmitter_js_1.GraphExecutionEventEmitter();
|
|
30
|
-
this.planner = config.planner ?? new GraphExecutionPlanner_js_1.GraphExecutionPlanner();
|
|
31
|
-
this.valueStoreAdapter =
|
|
32
|
-
config.valueStoreAdapter ?? new InMemoryGraphValueStoreAdapter_js_1.InMemoryGraphValueStoreAdapter();
|
|
33
|
-
this.defaultOptions = config.defaultOptions ?? {};
|
|
34
|
-
this.codeSandboxEvaluator = config.codeSandboxEvaluator;
|
|
35
|
-
this.config = config;
|
|
36
|
-
config.onEngineCreated?.(this);
|
|
37
|
-
}
|
|
38
|
-
observe(observer) {
|
|
39
|
-
return this.emitter.observe(observer);
|
|
40
|
-
}
|
|
41
|
-
unObserve(observer) {
|
|
42
|
-
this.emitter.unObserve(observer);
|
|
43
|
-
}
|
|
44
|
-
async updateObservers(event) {
|
|
45
|
-
await this.emitter.updateObservers(event);
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Executes a workflow with the given inputs and options.
|
|
49
|
-
*/
|
|
50
|
-
async execute(workflow, inputs = {}, options = {}) {
|
|
51
|
-
const opts = this.mergeOptions(options);
|
|
52
|
-
const runId = opts.runId ?? this.generateRunId();
|
|
53
|
-
const path = opts.path ?? [];
|
|
54
|
-
const eventFactory = new GraphExecutionEventFactory_js_1.GraphExecutionEventFactory();
|
|
55
|
-
const valueStore = new GraphValueStore_js_1.GraphValueStore(this.valueStoreAdapter);
|
|
56
|
-
valueStore.seedWorkflowInputs(inputs);
|
|
57
|
-
const plan = this.planner.plan(workflow);
|
|
58
|
-
const frame = new GraphExecutionFrame_js_1.GraphExecutionFrame(runId, plan, valueStore, eventFactory);
|
|
59
|
-
const emitFn = async (partial) => {
|
|
60
|
-
await this.emitEvent(frame, {
|
|
61
|
-
type: partial.type ?? constants_js_1.GraphExecutionEventType.NODE_OUTPUT,
|
|
62
|
-
runId,
|
|
63
|
-
parentRunId: opts.parentRunId,
|
|
64
|
-
workflowId: workflow.name,
|
|
65
|
-
nodeId: partial.nodeId,
|
|
66
|
-
path: partial.path ?? path,
|
|
67
|
-
...partial,
|
|
68
|
-
});
|
|
69
|
-
};
|
|
70
|
-
await this.emitEvent(frame, {
|
|
71
|
-
type: constants_js_1.GraphExecutionEventType.WORKFLOW_STARTED,
|
|
72
|
-
runId,
|
|
73
|
-
parentRunId: opts.parentRunId,
|
|
74
|
-
workflowId: workflow.name,
|
|
75
|
-
path,
|
|
76
|
-
status: constants_js_1.GraphExecutionStatus.RUNNING,
|
|
77
|
-
payload: { inputs },
|
|
78
|
-
});
|
|
79
|
-
await this.emitEvent(frame, {
|
|
80
|
-
type: constants_js_1.GraphExecutionEventType.WORKFLOW_PLANNED,
|
|
81
|
-
runId,
|
|
82
|
-
parentRunId: opts.parentRunId,
|
|
83
|
-
workflowId: workflow.name,
|
|
84
|
-
path,
|
|
85
|
-
status: constants_js_1.GraphExecutionStatus.PLANNING,
|
|
86
|
-
payload: { layers: plan.layers.length, nodes: plan.nodes.length },
|
|
87
|
-
});
|
|
88
|
-
try {
|
|
89
|
-
for (const layer of plan.layers) {
|
|
90
|
-
await this.executeLayer(frame, plan, layer.nodes, opts, emitFn);
|
|
91
|
-
}
|
|
92
|
-
frame.finish();
|
|
93
|
-
await this.emitEvent(frame, {
|
|
94
|
-
type: constants_js_1.GraphExecutionEventType.WORKFLOW_COMPLETED,
|
|
95
|
-
runId,
|
|
96
|
-
parentRunId: opts.parentRunId,
|
|
97
|
-
workflowId: workflow.name,
|
|
98
|
-
path,
|
|
99
|
-
status: constants_js_1.GraphExecutionStatus.SUCCEEDED,
|
|
100
|
-
payload: { outputs: valueStore.getWorkflowValues() },
|
|
101
|
-
});
|
|
102
|
-
return (0, GraphExecutionResult_js_1.buildGraphExecutionResult)(frame, workflow, inputs, constants_js_1.GraphExecutionStatus.SUCCEEDED, opts.metadata);
|
|
103
|
-
}
|
|
104
|
-
catch (error) {
|
|
105
|
-
frame.finish();
|
|
106
|
-
const errorPayload = this.toErrorPayload(error);
|
|
107
|
-
await this.emitEvent(frame, {
|
|
108
|
-
type: constants_js_1.GraphExecutionEventType.WORKFLOW_FAILED,
|
|
109
|
-
runId,
|
|
110
|
-
parentRunId: opts.parentRunId,
|
|
111
|
-
workflowId: workflow.name,
|
|
112
|
-
path,
|
|
113
|
-
status: constants_js_1.GraphExecutionStatus.FAILED,
|
|
114
|
-
error: errorPayload,
|
|
115
|
-
});
|
|
116
|
-
return (0, GraphExecutionResult_js_1.buildGraphExecutionResult)(frame, workflow, inputs, constants_js_1.GraphExecutionStatus.FAILED, opts.metadata);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* Pins a node and its upstream dependencies after a completed run.
|
|
121
|
-
*
|
|
122
|
-
* Delegates to {@link GraphPinningService}. The plan and result must come
|
|
123
|
-
* from a prior successful execution of the same workflow.
|
|
124
|
-
*/
|
|
125
|
-
async pinNode(options) {
|
|
126
|
-
const service = this.createPinningService();
|
|
127
|
-
await service.pinNode(options);
|
|
128
|
-
await this.emitPinningEvent(options.nodeId, constants_js_1.GraphExecutionEventType.NODE_PINNED);
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Unpins a node by its fingerprint.
|
|
132
|
-
*/
|
|
133
|
-
async unpinNode(options) {
|
|
134
|
-
const service = this.createPinningService();
|
|
135
|
-
await service.unpinNode(options);
|
|
136
|
-
await this.emitPinningEvent(options.nodeId, constants_js_1.GraphExecutionEventType.NODE_UNPINNED);
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Creates a {@link GraphPinningService} backed by this engine's value store
|
|
140
|
-
* adapter.
|
|
141
|
-
*/
|
|
142
|
-
createPinningService() {
|
|
143
|
-
const store = new GraphValueStore_js_1.GraphValueStore(this.valueStoreAdapter);
|
|
144
|
-
return new GraphPinningService_js_1.GraphPinningService(store, new GraphPinningPolicy_js_1.GraphPinningPolicy(), new GraphPinningDependencyResolver_js_1.GraphPinningDependencyResolver());
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Emits a pinning-related event to all observers.
|
|
148
|
-
*/
|
|
149
|
-
async emitPinningEvent(nodeId, type) {
|
|
150
|
-
const factory = new GraphExecutionEventFactory_js_1.GraphExecutionEventFactory();
|
|
151
|
-
const event = factory.create({
|
|
152
|
-
id: "",
|
|
153
|
-
sequence: 0,
|
|
154
|
-
timestamp: new Date(),
|
|
155
|
-
runId: "pinning",
|
|
156
|
-
workflowId: "",
|
|
157
|
-
type,
|
|
158
|
-
nodeId,
|
|
159
|
-
path: [],
|
|
160
|
-
});
|
|
161
|
-
await this.emitter.updateObservers(event);
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* Executes a layer of nodes with the configured concurrency.
|
|
165
|
-
*/
|
|
166
|
-
async executeLayer(frame, plan, nodes, opts, emitFn) {
|
|
167
|
-
const concurrency = Math.max(1, opts.concurrency ?? constants_js_1.GRAPH_DEFAULT_CONCURRENCY);
|
|
168
|
-
const queue = [...nodes];
|
|
169
|
-
while (queue.length > 0) {
|
|
170
|
-
const batch = queue.splice(0, concurrency);
|
|
171
|
-
await Promise.all(batch.map((node) => this.executeNode(frame, plan, node, opts, emitFn)));
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Executes a single node.
|
|
176
|
-
*/
|
|
177
|
-
async executeNode(frame, plan, planNode, opts, emitFn) {
|
|
178
|
-
const startedAt = new Date();
|
|
179
|
-
const nodePath = [...(opts.path ?? []), planNode.id];
|
|
180
|
-
await this.emitEvent(frame, {
|
|
181
|
-
type: constants_js_1.GraphExecutionEventType.NODE_STARTED,
|
|
182
|
-
runId: frame.runId,
|
|
183
|
-
workflowId: plan.workflowId,
|
|
184
|
-
nodeId: planNode.id,
|
|
185
|
-
path: nodePath,
|
|
186
|
-
status: constants_js_1.GraphExecutionStatus.RUNNING,
|
|
187
|
-
});
|
|
188
|
-
const inputs = this.resolveNodeInputs(frame, plan, planNode);
|
|
189
|
-
// Cache-hit: check for a pinned value before executing the node
|
|
190
|
-
if (opts.usePinnedValues) {
|
|
191
|
-
const cached = await this.tryPinnedValue(frame, plan, planNode, inputs);
|
|
192
|
-
if (cached) {
|
|
193
|
-
frame.valueStore.setNodeOutputs(planNode.id, cached.outputs);
|
|
194
|
-
this.routeOutgoingEdges(frame, plan, planNode, cached.outputs);
|
|
195
|
-
const finishedAt = new Date();
|
|
196
|
-
const result = {
|
|
197
|
-
nodeId: planNode.id,
|
|
198
|
-
status: constants_js_1.GraphExecutionStatus.CACHED,
|
|
199
|
-
inputs,
|
|
200
|
-
outputs: cached.outputs,
|
|
201
|
-
startedAt,
|
|
202
|
-
finishedAt,
|
|
203
|
-
fromCache: true,
|
|
204
|
-
pinned: true,
|
|
205
|
-
events: [],
|
|
206
|
-
};
|
|
207
|
-
frame.recordNodeResult(result);
|
|
208
|
-
await this.emitEvent(frame, {
|
|
209
|
-
type: constants_js_1.GraphExecutionEventType.NODE_CACHE_HIT,
|
|
210
|
-
runId: frame.runId,
|
|
211
|
-
workflowId: plan.workflowId,
|
|
212
|
-
nodeId: planNode.id,
|
|
213
|
-
path: nodePath,
|
|
214
|
-
status: constants_js_1.GraphExecutionStatus.CACHED,
|
|
215
|
-
payload: { outputs: cached.outputs },
|
|
216
|
-
});
|
|
217
|
-
await this.emitEvent(frame, {
|
|
218
|
-
type: constants_js_1.GraphExecutionEventType.NODE_COMPLETED,
|
|
219
|
-
runId: frame.runId,
|
|
220
|
-
workflowId: plan.workflowId,
|
|
221
|
-
nodeId: planNode.id,
|
|
222
|
-
path: nodePath,
|
|
223
|
-
status: constants_js_1.GraphExecutionStatus.SUCCEEDED,
|
|
224
|
-
payload: { outputs: cached.outputs, fromCache: true },
|
|
225
|
-
});
|
|
226
|
-
return;
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
try {
|
|
230
|
-
const executor = this.config.registry.resolve(planNode.kind);
|
|
231
|
-
const context = new GraphExecutionContext_js_1.GraphExecutionContext(frame.runId, opts.parentRunId, plan.workflow, planNode.definition, nodePath, emitFn, opts.metadata);
|
|
232
|
-
const outputs = await executor.execute(inputs, context);
|
|
233
|
-
const resolvedOutputs = outputs ?? {};
|
|
234
|
-
frame.valueStore.setNodeOutputs(planNode.id, resolvedOutputs);
|
|
235
|
-
this.routeOutgoingEdges(frame, plan, planNode, resolvedOutputs);
|
|
236
|
-
const finishedAt = new Date();
|
|
237
|
-
const result = {
|
|
238
|
-
nodeId: planNode.id,
|
|
239
|
-
status: constants_js_1.GraphExecutionStatus.SUCCEEDED,
|
|
240
|
-
inputs,
|
|
241
|
-
outputs: resolvedOutputs,
|
|
242
|
-
startedAt,
|
|
243
|
-
finishedAt,
|
|
244
|
-
events: [],
|
|
245
|
-
};
|
|
246
|
-
frame.recordNodeResult(result);
|
|
247
|
-
await this.emitEvent(frame, {
|
|
248
|
-
type: constants_js_1.GraphExecutionEventType.NODE_COMPLETED,
|
|
249
|
-
runId: frame.runId,
|
|
250
|
-
workflowId: plan.workflowId,
|
|
251
|
-
nodeId: planNode.id,
|
|
252
|
-
path: nodePath,
|
|
253
|
-
status: constants_js_1.GraphExecutionStatus.SUCCEEDED,
|
|
254
|
-
payload: { outputs: resolvedOutputs },
|
|
255
|
-
});
|
|
256
|
-
}
|
|
257
|
-
catch (error) {
|
|
258
|
-
const finishedAt = new Date();
|
|
259
|
-
const errorPayload = this.toErrorPayload(error);
|
|
260
|
-
const result = {
|
|
261
|
-
nodeId: planNode.id,
|
|
262
|
-
status: constants_js_1.GraphExecutionStatus.FAILED,
|
|
263
|
-
inputs,
|
|
264
|
-
error: errorPayload,
|
|
265
|
-
startedAt,
|
|
266
|
-
finishedAt,
|
|
267
|
-
events: [],
|
|
268
|
-
};
|
|
269
|
-
frame.recordNodeResult(result);
|
|
270
|
-
await this.emitEvent(frame, {
|
|
271
|
-
type: constants_js_1.GraphExecutionEventType.NODE_FAILED,
|
|
272
|
-
runId: frame.runId,
|
|
273
|
-
workflowId: plan.workflowId,
|
|
274
|
-
nodeId: planNode.id,
|
|
275
|
-
path: nodePath,
|
|
276
|
-
status: constants_js_1.GraphExecutionStatus.FAILED,
|
|
277
|
-
error: errorPayload,
|
|
278
|
-
});
|
|
279
|
-
if (opts.failFast ?? true)
|
|
280
|
-
throw error;
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
/**
|
|
284
|
-
* Resolves a node's input values from incoming edges.
|
|
285
|
-
*/
|
|
286
|
-
resolveNodeInputs(frame, plan, planNode) {
|
|
287
|
-
const inputs = {};
|
|
288
|
-
const incoming = plan.incomingByNode.get(planNode.id) ?? [];
|
|
289
|
-
for (const edge of incoming) {
|
|
290
|
-
inputs[edge.targetPort] = frame.valueStore.getPort(edge.sourceNodeId, edge.sourcePort);
|
|
291
|
-
}
|
|
292
|
-
return inputs;
|
|
293
|
-
}
|
|
294
|
-
/**
|
|
295
|
-
* Attempts to read a pinned value for the node. Returns the cached outputs
|
|
296
|
-
* when a valid pinned value exists, or `undefined` to proceed with normal
|
|
297
|
-
* execution.
|
|
298
|
-
*/
|
|
299
|
-
async tryPinnedValue(frame, plan, planNode, inputs) {
|
|
300
|
-
const policy = new GraphPinningPolicy_js_1.GraphPinningPolicy();
|
|
301
|
-
if (!policy.shouldUsePinnedValue(planNode))
|
|
302
|
-
return undefined;
|
|
303
|
-
const service = this.createPinningService();
|
|
304
|
-
const depFingerprints = this.computeDependencyFingerprints(frame, plan, planNode.id);
|
|
305
|
-
return service.readPinnedValue(plan.workflow, planNode, inputs, depFingerprints);
|
|
306
|
-
}
|
|
307
|
-
/**
|
|
308
|
-
* Recursively computes fingerprints for all upstream dependencies of a node
|
|
309
|
-
* using the results already accumulated in the frame.
|
|
310
|
-
*/
|
|
311
|
-
computeDependencyFingerprints(frame, plan, nodeId) {
|
|
312
|
-
const service = this.createPinningService();
|
|
313
|
-
const depResolver = new GraphPinningDependencyResolver_js_1.GraphPinningDependencyResolver();
|
|
314
|
-
const deps = depResolver.getDependencies(plan, nodeId);
|
|
315
|
-
const fingerprints = {};
|
|
316
|
-
for (const dep of deps) {
|
|
317
|
-
const node = plan.nodes.find((n) => n.id === dep);
|
|
318
|
-
if (node) {
|
|
319
|
-
const depResult = frame.nodeResults.get(dep);
|
|
320
|
-
const inputs = depResult?.inputs ?? {};
|
|
321
|
-
const nestedDeps = this.computeDependencyFingerprints(frame, plan, dep);
|
|
322
|
-
fingerprints[dep] = service.computeFingerprint(plan.workflow, node, inputs, nestedDeps);
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
return fingerprints;
|
|
326
|
-
}
|
|
327
|
-
/**
|
|
328
|
-
* Routes a node's outputs to downstream inputs and workflow outputs.
|
|
329
|
-
*/
|
|
330
|
-
routeOutgoingEdges(frame, plan, planNode, outputs) {
|
|
331
|
-
const outgoing = plan.outgoingByNode.get(planNode.id) ?? [];
|
|
332
|
-
for (const edge of outgoing) {
|
|
333
|
-
const value = outputs[edge.sourcePort];
|
|
334
|
-
if (edge.targetNodeId === constants_js_1.GRAPH_WORKFLOW_BOUNDARY) {
|
|
335
|
-
frame.valueStore.setWorkflowOutput(edge.targetPort, value);
|
|
336
|
-
}
|
|
337
|
-
this.emitEvent(frame, {
|
|
338
|
-
type: constants_js_1.GraphExecutionEventType.EDGE_VALUE_ROUTED,
|
|
339
|
-
runId: frame.runId,
|
|
340
|
-
workflowId: plan.workflowId,
|
|
341
|
-
edgeId: edge.id,
|
|
342
|
-
nodeId: planNode.id,
|
|
343
|
-
path: [],
|
|
344
|
-
payload: { edge, value },
|
|
345
|
-
}).catch(() => {
|
|
346
|
-
// observer failures must not crash
|
|
347
|
-
});
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
/**
|
|
351
|
-
* Emits an event, records it in the frame, and dispatches to observers.
|
|
352
|
-
*/
|
|
353
|
-
async emitEvent(frame, partial) {
|
|
354
|
-
const event = frame.eventFactory.create({
|
|
355
|
-
id: "",
|
|
356
|
-
sequence: 0,
|
|
357
|
-
timestamp: new Date(),
|
|
358
|
-
...partial,
|
|
359
|
-
});
|
|
360
|
-
frame.appendEvent(event);
|
|
361
|
-
await this.emitter.updateObservers(event);
|
|
362
|
-
}
|
|
363
|
-
/**
|
|
364
|
-
* Merges default options with the given options.
|
|
365
|
-
*/
|
|
366
|
-
mergeOptions(options) {
|
|
367
|
-
return {
|
|
368
|
-
concurrency: constants_js_1.GRAPH_DEFAULT_CONCURRENCY,
|
|
369
|
-
failFast: true,
|
|
370
|
-
validateInputs: true,
|
|
371
|
-
validateOutputs: true,
|
|
372
|
-
usePinnedValues: true,
|
|
373
|
-
writeThroughCache: false,
|
|
374
|
-
path: [],
|
|
375
|
-
metadata: {},
|
|
376
|
-
...this.defaultOptions,
|
|
377
|
-
...options,
|
|
378
|
-
};
|
|
379
|
-
}
|
|
380
|
-
/**
|
|
381
|
-
* Generates a unique run id.
|
|
382
|
-
*/
|
|
383
|
-
generateRunId() {
|
|
384
|
-
return (globalThis.crypto?.randomUUID?.() ??
|
|
385
|
-
`graph-run-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
386
|
-
}
|
|
387
|
-
/**
|
|
388
|
-
* Converts an error into a serialized payload.
|
|
389
|
-
*/
|
|
390
|
-
toErrorPayload(error) {
|
|
391
|
-
if (error instanceof Error) {
|
|
392
|
-
return {
|
|
393
|
-
name: error.name,
|
|
394
|
-
message: error.message,
|
|
395
|
-
stack: error.stack,
|
|
396
|
-
code: error.graphCode ??
|
|
397
|
-
(typeof error.code === "number"
|
|
398
|
-
? String(error.code)
|
|
399
|
-
: error.code),
|
|
400
|
-
};
|
|
401
|
-
}
|
|
402
|
-
return { name: "UnknownError", message: String(error) };
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
exports.GraphExecutionEngine = GraphExecutionEngine;
|
|
406
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhFeGVjdXRpb25FbmdpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZ3JhcGgvZXhlY3V0aW9uL0dyYXBoRXhlY3V0aW9uRW5naW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsdUJBQXVCLEVBQ3ZCLHVCQUF1QixFQUN2QixvQkFBb0IsR0FDckIsMEJBQXFCO0FBYXRCLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxrREFBNkM7QUFDbEYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLGtEQUE2QztBQUVsRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsK0NBQTBDO0FBSTFFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxxREFBZ0Q7QUFDekYsT0FBTyxFQUFFLGVBQWUsRUFBRSxzQ0FBaUM7QUFFM0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLDRDQUF1QztBQUNyRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsMkNBQXNDO0FBQ25FLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSx1REFBa0Q7QUFDM0YsT0FBTyxFQUFFLHFCQUFxQixFQUFFLG1DQUFnQztBQUNoRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsaUNBQThCO0FBQzVELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxrQ0FBK0I7QUE0Qm5FOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLE9BQU8sb0JBQW9CO0lBUy9CLFlBQVksTUFBa0M7UUFDNUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsWUFBWSxJQUFJLElBQUksMEJBQTBCLEVBQUUsQ0FBQztRQUN2RSxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1FBQzdELElBQUksQ0FBQyxpQkFBaUI7WUFDcEIsTUFBTSxDQUFDLGlCQUFpQixJQUFJLElBQUksOEJBQThCLEVBQUUsQ0FBQztRQUNuRSxJQUFJLENBQUMsY0FB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QUFlLEVBQUUsSUFBSTtZQUNyQixlQUFlLEVBQUUsSUFBSTtZQUNyQixpQkFBaUIsRUFBRSxLQUFLO1lBQ3hCLElBQUksRUFBRSxFQUFFO1lBQ1IsUUFBUSxFQUFFLEVBQUU7WUFDWixHQUFHLElBQUksQ0FBQyxjQUFjO1lBQ3RCLEdBQUcsT0FBTztTQUNYLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSyxhQUFhO1FBQ25CLE9BQU8sQ0FDTCxVQUFVLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxFQUFFO1lBQ2pDLGFBQWEsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ2pFLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSyxjQUFjLENBQUMsS0FBYztRQUNuQyxJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUUsQ0FBQztZQUMzQixPQUFPO2dCQUNMLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtnQkFDaEIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO2dCQUN0QixLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7Z0JBQ2xCLElBQUksRUFDRCxLQUFhLENBQUMsU0FBUztvQkFDeEIsQ0FBQyxPQUFRLEtBQWEsQ0FBQyxJQUFJLEtBQUssUUFBUTt3QkFDdEMsQ0FBQyxDQUFDLE1BQU0sQ0FBRSxLQUFhLENBQUMsSUFBSSxDQUFDO3dCQUM3QixDQUFDLENBQUUsS0FBYSxDQUFDLElBQUksQ0FBQzthQUMzQixDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztJQUMxRCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgaW50ZWdyYXRpb25zL2dyYXBoL2V4ZWN1dGlvbi9HcmFwaEV4ZWN1dGlvbkVuZ2luZVxuICogQHN1bW1hcnkgUmVmZXJlbmNlIGdyYXBoIGV4ZWN1dGlvbiBlbmdpbmUuXG4gKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgZ3JhcGggd29ya2Zsb3dzIGRlY2xhcmVkIHdpdGggYEBkZWNhZi10cy91aS1kZWNvcmF0b3JzL2dyYXBoYCwgZW1pdHMgZXZlbnRzIHRocm91Z2ggRGVjYWYncyBPYnNlcnZhYmxlIHBpcGVsaW5lLCBzdXBwb3J0cyBwYXJhbGxlbCBub2RlIGV4ZWN1dGlvbiB3aXRoaW4gdG9wb2xvZ2ljYWwgbGF5ZXJzLCBhbmQgcmV0dXJucyBhIGNvbXBsZXRlIGV4ZWN1dGlvbiByZXN1bHQuXG4gKi9cbmltcG9ydCB0eXBlIHsgT2JzZXJ2YWJsZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBHcmFwaFdvcmtmbG93RGVmaW5pdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvdWktZGVjb3JhdG9ycy9ncmFwaFwiO1xuXG5pbXBvcnQge1xuICBHUkFQSF9ERUZBVUxUX0NPTkNVUlJFTkNZLFxuICBHUkFQSF9XT1JLRkxPV19CT1VOREFSWSxcbiAgR3JhcGhFeGVjdXRpb25FdmVudFR5cGUsXG4gIEdyYXBoRXhlY3V0aW9uU3RhdHVzLFxufSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEdyYXBoRXhlY3V0aW9uRXJyb3JQYXlsb2FkLFxuICBHcmFwaEV4ZWN1dGlvbkV2ZW50LFxuICBHcmFwaEV4ZWN1dGlvbk9wdGlvbnMsXG4gIEdyYXBoRXhlY3V0aW9uUmVzdWx0LFxuICBHcmFwaEV4ZWN1dGlvblZhbHVlcyxcbiAgR3JhcGhOb2RlRXhlY3V0aW9uUmVzdWx0LFxuICBHcmFwaFBpbk5vZGVPcHRpb25zLFxuICBHcmFwaFVucGluTm9kZU9wdGlvbnMsXG4gIEdyYXBoUnVuSWQsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBHcmFwaEV4ZWN1dGlvbk9ic2VydmVyIH0gZnJvbSBcIi4uL2V2ZW50cy9HcmFwaEV4ZWN1dGlvbk9ic2VydmVyXCI7XG5pbXBvcnQgeyBHcmFwaEV4ZWN1dGlvbkV2ZW50RW1pdHRlciB9IGZyb20gXCIuLi9ldmVudHMvR3JhcGhFeGVjdXRpb25FdmVudEVtaXR0ZXJcIjtcbmltcG9ydCB7IEdyYXBoRXhlY3V0aW9uRXZlbnRGYWN0b3J5IH0gZnJvbSBcIi4uL2V2ZW50cy9HcmFwaEV4ZWN1dGlvbkV2ZW50RmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgeyBHcmFwaE5vZGVFeGVjdXRvclJlZ2lzdHJ5IH0gZnJvbSBcIi4uL3JlZ2lzdHJ5L0dyYXBoTm9kZUV4ZWN1dG9yUmVnaXN0cnlcIjtcbmltcG9ydCB7IEdyYXBoRXhlY3V0aW9uUGxhbm5lciB9IGZyb20gXCIuLi9wbGFubmluZy9HcmFwaEV4ZWN1dGlvblBsYW5uZXJcIjtcbmltcG9ydCB0eXBlIHsgR3JhcGhFeGVjdXRpb25QbGFuIH0gZnJvbSBcIi4uL3BsYW5uaW5nL0dyYXBoRXhlY3V0aW9uUGxhblwiO1xuaW1wb3J0IHR5cGUgeyBHcmFwaEV4ZWN1dGlvblBsYW5Ob2RlIH0gZnJvbSBcIi4uL3BsYW5uaW5nL0dyYXBoRXhlY3V0aW9uUGxhbk5vZGVcIjtcbmltcG9ydCB0eXBlIHsgR3JhcGhWYWx1ZVN0b3JlQWRhcHRlciB9IGZyb20gXCIuLi9zdG9yZS9HcmFwaFZhbHVlU3RvcmVBZGFwdGVyXCI7XG5pbXBvcnQgeyBJbk1lbW9yeUdyYXBoVmFsdWVTdG9yZUFkYXB0ZXIgfSBmcm9tIFwiLi4vc3RvcmUvSW5NZW1vcnlHcmFwaFZhbHVlU3RvcmVBZGFwdGVyXCI7XG5pbXBvcnQgeyBHcmFwaFZhbHVlU3RvcmUgfSBmcm9tIFwiLi4vc3RvcmUvR3JhcGhWYWx1ZVN0b3JlXCI7XG5pbXBvcnQgdHlwZSB7IEdyYXBoQ2FjaGVkVmFsdWUgfSBmcm9tIFwiLi4vc3RvcmUvR3JhcGhDYWNoZWRWYWx1ZVwiO1xuaW1wb3J0IHsgR3JhcGhQaW5uaW5nU2VydmljZSB9IGZyb20gXCIuLi9waW5uaW5nL0dyYXBoUGlubmluZ1NlcnZpY2VcIjtcbmltcG9ydCB7IEdyYXBoUGlubmluZ1BvbGljeSB9IGZyb20gXCIuLi9waW5uaW5nL0dyYXBoUGlubmluZ1BvbGljeVwiO1xuaW1wb3J0IHsgR3JhcGhQaW5uaW5nRGVwZW5kZW5jeVJlc29sdmVyIH0gZnJvbSBcIi4uL3Bpbm5pbmcvR3JhcGhQaW5uaW5nRGVwZW5kZW5jeVJlc29sdmVyXCI7XG5pbXBvcnQgeyBHcmFwaEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9HcmFwaEV4ZWN1dGlvbkNvbnRleHRcIjtcbmltcG9ydCB7IEdyYXBoRXhlY3V0aW9uRnJhbWUgfSBmcm9tIFwiLi9HcmFwaEV4ZWN1dGlvbkZyYW1lXCI7XG5pbXBvcnQgeyBidWlsZEdyYXBoRXhlY3V0aW9uUmVzdWx0IH0gZnJvbSBcIi4vR3JhcGhFeGVjdXRpb25SZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgQ29kZVNhbmRib3hFdmFsdWF0b3IgfSBmcm9tIFwiLi9Db2RlU2FuZGJveEV2YWx1YXRvclwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSB7QGxpbmsgR3JhcGhFeGVjdXRpb25FbmdpbmV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdyYXBoRXhlY3V0aW9uRW5naW5lQ29uZmlnIHtcbiAgcmVnaXN0cnk6IEdyYXBoTm9kZUV4ZWN1dG9yUmVnaXN0cnk7XG4gIHBsYW5uZXI/OiBHcmFwaEV4ZWN1dGlvblBsYW5uZXI7XG4gIHZhbHVlU3RvcmVBZGFwdGVyPzogR3JhcGhWYWx1ZVN0b3JlQWRhcHRlcjtcbiAgZXZlbnRFbWl0dGVyPzogR3JhcGhFeGVjdXRpb25FdmVudEVtaXR0ZXI7XG4gIGRlZmF1bHRPcHRpb25zPzogUGFydGlhbDxHcmFwaEV4ZWN1dGlvbk9wdGlvbnM+O1xuICAvKipcbiAgICogT3B0aW9uYWwgcGx1Z2dhYmxlIGNvZGUgc2FuZGJveCBldmFsdWF0b3IgZm9yIGNvZGUtYmFzZWQgY29uZGl0aW9uc1xuICAgKiAoREVDQUYtMzIgwqcyMi40KS4gV2hlbiBhYnNlbnQsIGNvZGUgY29uZGl0aW9ucyB0aHJvd1xuICAgKiBgR1JBUEhfQ09ERV9TQU5EQk9YX05PVF9DT05GSUdVUkVEYC4gRG93bnN0cmVhbSBwcm9qZWN0cyAoZS5nLiBBTEZSRUQpXG4gICAqIHN1cHBseSB0aGUgYWN0dWFsIFZNIHNhbmRib3ggaW1wbGVtZW50YXRpb24uXG4gICAqL1xuICBjb2RlU2FuZGJveEV2YWx1YXRvcj86IENvZGVTYW5kYm94RXZhbHVhdG9yO1xuICAvKipcbiAgICogT3B0aW9uYWwgY2FsbGJhY2sgaW52b2tlZCBhdCB0aGUgZW5kIG9mIGVuZ2luZSBjb25zdHJ1Y3Rpb24gd2l0aCB0aGVcbiAgICogZnVsbHktaW5pdGlhbGlzZWQgZW5naW5lIGluc3RhbmNlLiBVc2UgdGhpcyB0byByZWdpc3RlciBleGVjdXRvcnMgdGhhdFxuICAgKiBuZWVkIGEgYmFjay1yZWZlcmVuY2UgdG8gdGhlIGVuZ2luZSAoZS5nLiBsb29wIGV4ZWN1dG9ycyB0aGF0IGV4ZWN1dGVcbiAgICogc3ViLXdvcmtmbG93cyB0aHJvdWdoIHRoZSBzYW1lIGVuZ2luZSkuXG4gICAqL1xuICBvbkVuZ2luZUNyZWF0ZWQ/OiAoZW5naW5lOiBHcmFwaEV4ZWN1dGlvbkVuZ2luZSkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBSZWZlcmVuY2UgZ3JhcGggZXhlY3V0aW9uIGVuZ2luZS5cbiAqXG4gKiBFeGVjdXRlcyBhIHtAbGluayBHcmFwaFdvcmtmbG93RGVmaW5pdGlvbn0gYnk6XG4gKiAxLiBQbGFubmluZyB0aGUgd29ya2Zsb3cgaW50byB0b3BvbG9naWNhbCBsYXllcnMuXG4gKiAyLiBTZWVkaW5nIHdvcmtmbG93IGlucHV0cyBpbnRvIHRoZSB2YWx1ZSBzdG9yZS5cbiAqIDMuIEV4ZWN1dGluZyBub2RlcyBsYXllci1ieS1sYXllciB3aXRoIGNvbmZpZ3VyYWJsZSBjb25jdXJyZW5jeS5cbiAqIDQuIFJvdXRpbmcgdmFsdWVzIGFsb25nIGVkZ2VzLlxuICogNS4gRW1pdHRpbmcgc3RydWN0dXJlZCBldmVudHMgdGhyb3VnaCBEZWNhZidzIE9ic2VydmFibGUgcGlwZWxpbmUuXG4gKiA2LiBSZXR1cm5pbmcgYSBjb21wbGV0ZSB7QGxpbmsgR3JhcGhFeGVjdXRpb25SZXN1bHR9LlxuICovXG5leHBvcnQgY2xhc3MgR3JhcGhFeGVjdXRpb25FbmdpbmVcbiAgaW1wbGVtZW50cyBPYnNlcnZhYmxlPFtHcmFwaEV4ZWN1dGlvbk9ic2VydmVyXSwgW0dyYXBoRXhlY3V0aW9uRXZlbnRdPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW1pdHRlcjogR3JhcGhFeGVjdXRpb25FdmVudEVtaXR0ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGxhbm5lcjogR3JhcGhFeGVjdXRpb25QbGFubmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHZhbHVlU3RvcmVBZGFwdGVyOiBHcmFwaFZhbHVlU3RvcmVBZGFwdGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRPcHRpb25zOiBQYXJ0aWFsPEdyYXBoRXhlY3V0aW9uT3B0aW9ucz47XG4gIC8qKiBQbHVnZ2FibGUgY29kZSBzYW5kYm94IGV2YWx1YXRvciAowqcyMi40KTsgbWF5IGJlIHVuZGVmaW5lZC4gKi9cbiAgcmVhZG9ubHkgY29kZVNhbmRib3hFdmFsdWF0b3I/OiBDb2RlU2FuZGJveEV2YWx1YXRvcjtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IEdyYXBoRXhlY3V0aW9uRW5naW5lQ29uZmlnKSB7XG4gICAgdGhpcy5lbWl0dGVyID0gY29uZmlnLmV2ZW50RW1pdHRlciA/PyBuZXcgR3JhcGhFeGVjdXRpb25FdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLnBsYW5uZXIgPSBjb25maWcucGxhbm5lciA/PyBuZXcgR3JhcGhFeGVjdXRpb25QbGFubmVyKCk7XG4gICAgdGhpcy52YWx1ZVN0b3JlQWRhcHRlciA9XG4gICAgICBjb25maWcudmFsdWVTdG9yZUFkYXB0ZXIgPz8gbmV3IEluTWVtb3J5R3JhcGhWYWx1ZVN0b3JlQWRhcHRlcigpO1xuICAgIHRoaXMuZGVmYXVsdE9wdGlvbnMgPSBjb25maWcuZGVmYXVsdE9wdGlvbnMgPz8ge307XG4gICAgdGhpcy5jb2RlU2FuZGJveEV2YWx1YXRvciA9IGNvbmZpZy5jb2RlU2FuZGJveEV2YWx1YXRvcjtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICBjb25maWcub25FbmdpbmVDcmVhdGVkPy4odGhpcyk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogR3JhcGhFeGVjdXRpb25FbmdpbmVDb25maWc7XG5cbiAgb2JzZXJ2ZShvYnNlcnZlcjogR3JhcGhFeGVjdXRpb25PYnNlcnZlcik6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmVtaXR0ZXIub2JzZXJ2ZShvYnNlcnZlcik7XG4gIH1cblxuICB1bk9ic2VydmUob2JzZXJ2ZXI6IEdyYXBoRXhlY3V0aW9uT2JzZXJ2ZXIpOiB2b2lkIHtcbiAgICB0aGlzLmVtaXR0ZXIudW5PYnNlcnZlKG9ic2VydmVyKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhldmVudDogR3JhcGhFeGVjdXRpb25FdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZW1pdHRlci51cGRhdGVPYnNlcnZlcnMoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGEgd29ya2Zsb3cgd2l0aCB0aGUgZ2l2ZW4gaW5wdXRzIGFuZCBvcHRpb25zLlxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZShcbiAgICB3b3JrZmxvdzogR3JhcGhXb3JrZmxvd0RlZmluaXRpb24sXG4gICAgaW5wdXRzOiBHcmFwaEV4ZWN1dGlvblZhbHVlcyA9IHt9LFxuICAgIG9wdGlvbnM6IEdyYXBoRXhlY3V0aW9uT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8R3JhcGhFeGVjdXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCBvcHRzID0gdGhpcy5tZXJnZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgY29uc3QgcnVuSWQgPSBvcHRzLnJ1bklkID8/IHRoaXMuZ2VuZXJhdGVSdW5JZCgpO1xuICAgIGNvbnN0IHBhdGggPSBvcHRzLnBhdGggPz8gW107XG4gICAgY29uc3QgZXZlbnRGYWN0b3J5ID0gbmV3IEdyYXBoRXhlY3V0aW9uRXZlbnRGYWN0b3J5KCk7XG4gICAgY29uc3QgdmFsdWVTdG9yZSA9IG5ldyBHcmFwaFZhbHVlU3RvcmUodGhpcy52YWx1ZVN0b3JlQWRhcHRlcik7XG4gICAgdmFsdWVTdG9yZS5zZWVkV29ya2Zsb3dJbnB1dHMoaW5wdXRzKTtcblxuICAgIGNvbnN0IHBsYW4gPSB0aGlzLnBsYW5uZXIucGxhbih3b3JrZmxvdyk7XG4gICAgY29uc3QgZnJhbWUgPSBuZXcgR3JhcGhFeGVjdXRpb25GcmFtZShcbiAgICAgIHJ1bklkLFxuICAgICAgcGxhbixcbiAgICAgIHZhbHVlU3RvcmUsXG4gICAgICBldmVudEZhY3RvcnlcbiAgICApO1xuXG4gICAgY29uc3QgZW1pdEZuID0gYXN5bmMgKHBhcnRpYWw6IFBhcnRpYWw8R3JhcGhFeGVjdXRpb25FdmVudD4pID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuZW1pdEV2ZW50KGZyYW1lLCB7XG4gICAgICAgIHR5cGU6IHBhcnRpYWwudHlwZSA/PyBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZS5OT0RFX09VVFBVVCxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIHBhcmVudFJ1bklkOiBvcHRzLnBhcmVudFJ1bklkLFxuICAgICAgICB3b3JrZmxvd0lkOiB3b3JrZmxvdy5uYW1lLFxuICAgICAgICBub2RlSWQ6IHBhcnRpYWwubm9kZUlkLFxuICAgICAgICBwYXRoOiBwYXJ0aWFsLnBhdGggPz8gcGF0aCxcbiAgICAgICAgLi4ucGFydGlhbCxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBhd2FpdCB0aGlzLmVtaXRFdmVudChmcmFtZSwge1xuICAgICAgdHlwZTogR3JhcGhFeGVjdXRpb25FdmVudFR5cGUuV09SS0ZMT1dfU1RBUlRFRCxcbiAgICAgIHJ1bklkLFxuICAgICAgcGFyZW50UnVuSWQ6IG9wdHMucGFyZW50UnVuSWQsXG4gICAgICB3b3JrZmxvd0lkOiB3b3JrZmxvdy5uYW1lLFxuICAgICAgcGF0aCxcbiAgICAgIHN0YXR1czogR3JhcGhFeGVjdXRpb25TdGF0dXMuUlVOTklORyxcbiAgICAgIHBheWxvYWQ6IHsgaW5wdXRzIH0sXG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLmVtaXRFdmVudChmcmFtZSwge1xuICAgICAgdHlwZTogR3JhcGhFeGVjdXRpb25FdmVudFR5cGUuV09SS0ZMT1dfUExBTk5FRCxcbiAgICAgIHJ1bklkLFxuICAgICAgcGFyZW50UnVuSWQ6IG9wdHMucGFyZW50UnVuSWQsXG4gICAgICB3b3JrZmxvd0lkOiB3b3JrZmxvdy5uYW1lLFxuICAgICAgcGF0aCxcbiAgICAgIHN0YXR1czogR3JhcGhFeGVjdXRpb25TdGF0dXMuUExBTk5JTkcsXG4gICAgICBwYXlsb2FkOiB7IGxheWVyczogcGxhbi5sYXllcnMubGVuZ3RoLCBub2RlczogcGxhbi5ub2Rlcy5sZW5ndGggfSxcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHBsYW4ubGF5ZXJzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZUxheWVyKGZyYW1lLCBwbGFuLCBsYXllci5ub2Rlcywgb3B0cywgZW1pdEZuKTtcbiAgICAgIH1cblxuICAgICAgZnJhbWUuZmluaXNoKCk7XG5cbiAgICAgIGF3YWl0IHRoaXMuZW1pdEV2ZW50KGZyYW1lLCB7XG4gICAgICAgIHR5cGU6IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLldPUktGTE9XX0NPTVBMRVRFRCxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIHBhcmVudFJ1bklkOiBvcHRzLnBhcmVudFJ1bklkLFxuICAgICAgICB3b3JrZmxvd0lkOiB3b3JrZmxvdy5uYW1lLFxuICAgICAgICBwYXRoLFxuICAgICAgICBzdGF0dXM6IEdyYXBoRXhlY3V0aW9uU3RhdHVzLlNVQ0NFRURFRCxcbiAgICAgICAgcGF5bG9hZDogeyBvdXRwdXRzOiB2YWx1ZVN0b3JlLmdldFdvcmtmbG93VmFsdWVzKCkgfSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYnVpbGRHcmFwaEV4ZWN1dGlvblJlc3VsdChcbiAgICAgICAgZnJhbWUsXG4gICAgICAgIHdvcmtmbG93LFxuICAgICAgICBpbnB1dHMsXG4gICAgICAgIEdyYXBoRXhlY3V0aW9uU3RhdHVzLlNVQ0NFRURFRCxcbiAgICAgICAgb3B0cy5tZXRhZGF0YVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZnJhbWUuZmluaXNoKCk7XG4gICAgICBjb25zdCBlcnJvclBheWxvYWQgPSB0aGlzLnRvRXJyb3JQYXlsb2FkKGVycm9yKTtcblxuICAgICAgYXdhaXQgdGhpcy5lbWl0RXZlbnQoZnJhbWUsIHtcbiAgICAgICAgdHlwZTogR3JhcGhFeGVjdXRpb25FdmVudFR5cGUuV09SS0ZMT1dfRkFJTEVELFxuICAgICAgICBydW5JZCxcbiAgICAgICAgcGFyZW50UnVuSWQ6IG9wdHMucGFyZW50UnVuSWQsXG4gICAgICAgIHdvcmtmbG93SWQ6IHdvcmtmbG93Lm5hbWUsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIHN0YXR1czogR3JhcGhFeGVjdXRpb25TdGF0dXMuRkFJTEVELFxuICAgICAgICBlcnJvcjogZXJyb3JQYXlsb2FkLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBidWlsZEdyYXBoRXhlY3V0aW9uUmVzdWx0KFxuICAgICAgICBmcmFtZSxcbiAgICAgICAgd29ya2Zsb3csXG4gICAgICAgIGlucHV0cyxcbiAgICAgICAgR3JhcGhFeGVjdXRpb25TdGF0dXMuRkFJTEVELFxuICAgICAgICBvcHRzLm1ldGFkYXRhXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQaW5zIGEgbm9kZSBhbmQgaXRzIHVwc3RyZWFtIGRlcGVuZGVuY2llcyBhZnRlciBhIGNvbXBsZXRlZCBydW4uXG4gICAqXG4gICAqIERlbGVnYXRlcyB0byB7QGxpbmsgR3JhcGhQaW5uaW5nU2VydmljZX0uIFRoZSBwbGFuIGFuZCByZXN1bHQgbXVzdCBjb21lXG4gICAqIGZyb20gYSBwcmlvciBzdWNjZXNzZnVsIGV4ZWN1dGlvbiBvZiB0aGUgc2FtZSB3b3JrZmxvdy5cbiAgICovXG4gIGFzeW5jIHBpbk5vZGUob3B0aW9uczogR3JhcGhQaW5Ob2RlT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLmNyZWF0ZVBpbm5pbmdTZXJ2aWNlKCk7XG4gICAgYXdhaXQgc2VydmljZS5waW5Ob2RlKG9wdGlvbnMpO1xuICAgIGF3YWl0IHRoaXMuZW1pdFBpbm5pbmdFdmVudChvcHRpb25zLm5vZGVJZCwgR3JhcGhFeGVjdXRpb25FdmVudFR5cGUuTk9ERV9QSU5ORUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucGlucyBhIG5vZGUgYnkgaXRzIGZpbmdlcnByaW50LlxuICAgKi9cbiAgYXN5bmMgdW5waW5Ob2RlKG9wdGlvbnM6IEdyYXBoVW5waW5Ob2RlT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLmNyZWF0ZVBpbm5pbmdTZXJ2aWNlKCk7XG4gICAgYXdhaXQgc2VydmljZS51bnBpbk5vZGUob3B0aW9ucyk7XG4gICAgYXdhaXQgdGhpcy5lbWl0UGlubmluZ0V2ZW50KG9wdGlvbnMubm9kZUlkLCBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZS5OT0RFX1VOUElOTkVEKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEge0BsaW5rIEdyYXBoUGlubmluZ1NlcnZpY2V9IGJhY2tlZCBieSB0aGlzIGVuZ2luZSdzIHZhbHVlIHN0b3JlXG4gICAqIGFkYXB0ZXIuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVBpbm5pbmdTZXJ2aWNlKCk6IEdyYXBoUGlubmluZ1NlcnZpY2Uge1xuICAgIGNvbnN0IHN0b3JlID0gbmV3IEdyYXBoVmFsdWVTdG9yZSh0aGlzLnZhbHVlU3RvcmVBZGFwdGVyKTtcbiAgICByZXR1cm4gbmV3IEdyYXBoUGlubmluZ1NlcnZpY2UoXG4gICAgICBzdG9yZSxcbiAgICAgIG5ldyBHcmFwaFBpbm5pbmdQb2xpY3koKSxcbiAgICAgIG5ldyBHcmFwaFBpbm5pbmdEZXBlbmRlbmN5UmVzb2x2ZXIoKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgYSBwaW5uaW5nLXJlbGF0ZWQgZXZlbnQgdG8gYWxsIG9ic2VydmVycy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW1pdFBpbm5pbmdFdmVudChcbiAgICBub2RlSWQ6IHN0cmluZyxcbiAgICB0eXBlOiBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmYWN0b3J5ID0gbmV3IEdyYXBoRXhlY3V0aW9uRXZlbnRGYWN0b3J5KCk7XG4gICAgY29uc3QgZXZlbnQgPSBmYWN0b3J5LmNyZWF0ZSh7XG4gICAgICBpZDogXCJcIixcbiAgICAgIHNlcXVlbmNlOiAwLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgcnVuSWQ6IFwicGlubmluZ1wiLFxuICAgICAgd29ya2Zsb3dJZDogXCJcIixcbiAgICAgIHR5cGUsXG4gICAgICBub2RlSWQsXG4gICAgICBwYXRoOiBbXSxcbiAgICB9IGFzIE9taXQ8R3JhcGhFeGVjdXRpb25FdmVudCwgXCJpZFwiIHwgXCJzZXF1ZW5jZVwiIHwgXCJ0aW1lc3RhbXBcIj4pO1xuICAgIGF3YWl0IHRoaXMuZW1pdHRlci51cGRhdGVPYnNlcnZlcnMoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGEgbGF5ZXIgb2Ygbm9kZXMgd2l0aCB0aGUgY29uZmlndXJlZCBjb25jdXJyZW5jeS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUxheWVyKFxuICAgIGZyYW1lOiBHcmFwaEV4ZWN1dGlvbkZyYW1lLFxuICAgIHBsYW46IEdyYXBoRXhlY3V0aW9uUGxhbixcbiAgICBub2RlczogR3JhcGhFeGVjdXRpb25QbGFuTm9kZVtdLFxuICAgIG9wdHM6IEdyYXBoRXhlY3V0aW9uT3B0aW9ucyxcbiAgICBlbWl0Rm46IChldmVudDogUGFydGlhbDxHcmFwaEV4ZWN1dGlvbkV2ZW50PikgPT4gUHJvbWlzZTx2b2lkPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb25jdXJyZW5jeSA9IE1hdGgubWF4KFxuICAgICAgMSxcbiAgICAgIG9wdHMuY29uY3VycmVuY3kgPz8gR1JBUEhfREVGQVVMVF9DT05DVVJSRU5DWVxuICAgICk7XG4gICAgY29uc3QgcXVldWUgPSBbLi4ubm9kZXNdO1xuXG4gICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGJhdGNoID0gcXVldWUuc3BsaWNlKDAsIGNvbmN1cnJlbmN5KTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBiYXRjaC5tYXAoKG5vZGUpID0+IHRoaXMuZXhlY3V0ZU5vZGUoZnJhbWUsIHBsYW4sIG5vZGUsIG9wdHMsIGVtaXRGbikpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIHNpbmdsZSBub2RlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlTm9kZShcbiAgICBmcmFtZTogR3JhcGhFeGVjdXRpb25GcmFtZSxcbiAgICBwbGFuOiBHcmFwaEV4ZWN1dGlvblBsYW4sXG4gICAgcGxhbk5vZGU6IEdyYXBoRXhlY3V0aW9uUGxhbk5vZGUsXG4gICAgb3B0czogR3JhcGhFeGVjdXRpb25PcHRpb25zLFxuICAgIGVtaXRGbjogKGV2ZW50OiBQYXJ0aWFsPEdyYXBoRXhlY3V0aW9uRXZlbnQ+KSA9PiBQcm9taXNlPHZvaWQ+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3Qgbm9kZVBhdGggPSBbLi4uKG9wdHMucGF0aCA/PyBbXSksIHBsYW5Ob2RlLmlkXTtcblxuICAgIGF3YWl0IHRoaXMuZW1pdEV2ZW50KGZyYW1lLCB7XG4gICAgICB0eXBlOiBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZS5OT0RFX1NUQVJURUQsXG4gICAgICBydW5JZDogZnJhbWUucnVuSWQsXG4gICAgICB3b3JrZmxvd0lkOiBwbGFuLndvcmtmbG93SWQsXG4gICAgICBub2RlSWQ6IHBsYW5Ob2RlLmlkLFxuICAgICAgcGF0aDogbm9kZVBhdGgsXG4gICAgICBzdGF0dXM6IEdyYXBoRXhlY3V0aW9uU3RhdHVzLlJVTk5JTkcsXG4gICAgfSk7XG5cbiAgICBjb25zdCBpbnB1dHMgPSB0aGlzLnJlc29sdmVOb2RlSW5wdXRzKGZyYW1lLCBwbGFuLCBwbGFuTm9kZSk7XG5cbiAgICAvLyBDYWNoZS1oaXQ6IGNoZWNrIGZvciBhIHBpbm5lZCB2YWx1ZSBiZWZvcmUgZXhlY3V0aW5nIHRoZSBub2RlXG4gICAgaWYgKG9wdHMudXNlUGlubmVkVmFsdWVzKSB7XG4gICAgICBjb25zdCBjYWNoZWQgPSBhd2FpdCB0aGlzLnRyeVBpbm5lZFZhbHVlKGZyYW1lLCBwbGFuLCBwbGFuTm9kZSwgaW5wdXRzKTtcbiAgICAgIGlmIChjYWNoZWQpIHtcbiAgICAgICAgZnJhbWUudmFsdWVTdG9yZS5zZXROb2RlT3V0cHV0cyhwbGFuTm9kZS5pZCwgY2FjaGVkLm91dHB1dHMpO1xuICAgICAgICB0aGlzLnJvdXRlT3V0Z29pbmdFZGdlcyhmcmFtZSwgcGxhbiwgcGxhbk5vZGUsIGNhY2hlZC5vdXRwdXRzKTtcblxuICAgICAgICBjb25zdCBmaW5pc2hlZEF0ID0gbmV3IERhdGUoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBHcmFwaE5vZGVFeGVjdXRpb25SZXN1bHQgPSB7XG4gICAgICAgICAgbm9kZUlkOiBwbGFuTm9kZS5pZCxcbiAgICAgICAgICBzdGF0dXM6IEdyYXBoRXhlY3V0aW9uU3RhdHVzLkNBQ0hFRCxcbiAgICAgICAgICBpbnB1dHMsXG4gICAgICAgICAgb3V0cHV0czogY2FjaGVkLm91dHB1dHMsXG4gICAgICAgICAgc3RhcnRlZEF0LFxuICAgICAgICAgIGZpbmlzaGVkQXQsXG4gICAgICAgICAgZnJvbUNhY2hlOiB0cnVlLFxuICAgICAgICAgIHBpbm5lZDogdHJ1ZSxcbiAgICAgICAgICBldmVudHM6IFtdLFxuICAgICAgICB9O1xuICAgICAgICBmcmFtZS5yZWNvcmROb2RlUmVzdWx0KHJlc3VsdCk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0RXZlbnQoZnJhbWUsIHtcbiAgICAgICAgICB0eXBlOiBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZS5OT0RFX0NBQ0hFX0hJVCxcbiAgICAgICAgICBydW5JZDogZnJhbWUucnVuSWQsXG4gICAgICAgICAgd29ya2Zsb3dJZDogcGxhbi53b3JrZmxvd0lkLFxuICAgICAgICAgIG5vZGVJZDogcGxhbk5vZGUuaWQsXG4gICAgICAgICAgcGF0aDogbm9kZVBhdGgsXG4gICAgICAgICAgc3RhdHVzOiBHcmFwaEV4ZWN1dGlvblN0YXR1cy5DQUNIRUQsXG4gICAgICAgICAgcGF5bG9hZDogeyBvdXRwdXRzOiBjYWNoZWQub3V0cHV0cyB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCB0aGlzLmVtaXRFdmVudChmcmFtZSwge1xuICAgICAgICAgIHR5cGU6IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLk5PREVfQ09NUExFVEVELFxuICAgICAgICAgIHJ1bklkOiBmcmFtZS5ydW5JZCxcbiAgICAgICAgICB3b3JrZmxvd0lkOiBwbGFuLndvcmtmbG93SWQsXG4gICAgICAgICAgbm9kZUlkOiBwbGFuTm9kZS5pZCxcbiAgICAgICAgICBwYXRoOiBub2RlUGF0aCxcbiAgICAgICAgICBzdGF0dXM6IEdyYXBoRXhlY3V0aW9uU3RhdHVzLlNVQ0NFRURFRCxcbiAgICAgICAgICBwYXlsb2FkOiB7IG91dHB1dHM6IGNhY2hlZC5vdXRwdXRzLCBmcm9tQ2FjaGU6IHRydWUgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhlY3V0b3IgPSB0aGlzLmNvbmZpZy5yZWdpc3RyeS5yZXNvbHZlKHBsYW5Ob2RlLmtpbmQpO1xuICAgICAgY29uc3QgY29udGV4dCA9IG5ldyBHcmFwaEV4ZWN1dGlvbkNvbnRleHQoXG4gICAgICAgIGZyYW1lLnJ1bklkLFxuICAgICAgICBvcHRzLnBhcmVudFJ1bklkLFxuICAgICAgICBwbGFuLndvcmtmbG93LFxuICAgICAgICBwbGFuTm9kZS5kZWZpbml0aW9uLFxuICAgICAgICBub2RlUGF0aCxcbiAgICAgICAgZW1pdEZuLFxuICAgICAgICBvcHRzLm1ldGFkYXRhXG4gICAgICApO1xuXG4gICAgICBjb25zdCBvdXRwdXRzID0gYXdhaXQgZXhlY3V0b3IuZXhlY3V0ZShpbnB1dHMsIGNvbnRleHQpO1xuICAgICAgY29uc3QgcmVzb2x2ZWRPdXRwdXRzID0gb3V0cHV0cyA/PyB7fTtcblxuICAgICAgZnJhbWUudmFsdWVTdG9yZS5zZXROb2RlT3V0cHV0cyhwbGFuTm9kZS5pZCwgcmVzb2x2ZWRPdXRwdXRzKTtcbiAgICAgIHRoaXMucm91dGVPdXRnb2luZ0VkZ2VzKGZyYW1lLCBwbGFuLCBwbGFuTm9kZSwgcmVzb2x2ZWRPdXRwdXRzKTtcblxuICAgICAgY29uc3QgZmluaXNoZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgICBjb25zdCByZXN1bHQ6IEdyYXBoTm9kZUV4ZWN1dGlvblJlc3VsdCA9IHtcbiAgICAgICAgbm9kZUlkOiBwbGFuTm9kZS5pZCxcbiAgICAgICAgc3RhdHVzOiBHcmFwaEV4ZWN1dGlvblN0YXR1cy5TVUNDRUVERUQsXG4gICAgICAgIGlucHV0cyxcbiAgICAgICAgb3V0cHV0czogcmVzb2x2ZWRPdXRwdXRzLFxuICAgICAgICBzdGFydGVkQXQsXG4gICAgICAgIGZpbmlzaGVkQXQsXG4gICAgICAgIGV2ZW50czogW10sXG4gICAgICB9O1xuICAgICAgZnJhbWUucmVjb3JkTm9kZVJlc3VsdChyZXN1bHQpO1xuXG4gICAgICBhd2FpdCB0aGlzLmVtaXRFdmVudChmcmFtZSwge1xuICAgICAgICB0eXBlOiBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZS5OT0RFX0NPTVBMRVRFRCxcbiAgICAgICAgcnVuSWQ6IGZyYW1lLnJ1bklkLFxuICAgICAgICB3b3JrZmxvd0lkOiBwbGFuLndvcmtmbG93SWQsXG4gICAgICAgIG5vZGVJZDogcGxhbk5vZGUuaWQsXG4gICAgICAgIHBhdGg6IG5vZGVQYXRoLFxuICAgICAgICBzdGF0dXM6IEdyYXBoRXhlY3V0aW9uU3RhdHVzLlNVQ0NFRURFRCxcbiAgICAgICAgcGF5bG9hZDogeyBvdXRwdXRzOiByZXNvbHZlZE91dHB1dHMgfSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBmaW5pc2hlZEF0ID0gbmV3IERhdGUoKTtcbiAgICAgIGNvbnN0IGVycm9yUGF5bG9hZCA9IHRoaXMudG9FcnJvclBheWxvYWQoZXJyb3IpO1xuICAgICAgY29uc3QgcmVzdWx0OiBHcmFwaE5vZGVFeGVjdXRpb25SZXN1bHQgPSB7XG4gICAgICAgIG5vZGVJZDogcGxhbk5vZGUuaWQsXG4gICAgICAgIHN0YXR1czogR3JhcGhFeGVjdXRpb25TdGF0dXMuRkFJTEVELFxuICAgICAgICBpbnB1dHMsXG4gICAgICAgIGVycm9yOiBlcnJvclBheWxvYWQsXG4gICAgICAgIHN0YXJ0ZWRBdCxcbiAgICAgICAgZmluaXNoZWRBdCxcbiAgICAgICAgZXZlbnRzOiBbXSxcbiAgICAgIH07XG4gICAgICBmcmFtZS5yZWNvcmROb2RlUmVzdWx0KHJlc3VsdCk7XG5cbiAgICAgIGF3YWl0IHRoaXMuZW1pdEV2ZW50KGZyYW1lLCB7XG4gICAgICAgIHR5cGU6IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLk5PREVfRkFJTEVELFxuICAgICAgICBydW5JZDogZnJhbWUucnVuSWQsXG4gICAgICAgIHdvcmtmbG93SWQ6IHBsYW4ud29ya2Zsb3dJZCxcbiAgICAgICAgbm9kZUlkOiBwbGFuTm9kZS5pZCxcbiAgICAgICAgcGF0aDogbm9kZVBhdGgsXG4gICAgICAgIHN0YXR1czogR3JhcGhFeGVjdXRpb25TdGF0dXMuRkFJTEVELFxuICAgICAgICBlcnJvcjogZXJyb3JQYXlsb2FkLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChvcHRzLmZhaWxGYXN0ID8/IHRydWUpIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhIG5vZGUncyBpbnB1dCB2YWx1ZXMgZnJvbSBpbmNvbWluZyBlZGdlcy5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZU5vZGVJbnB1dHMoXG4gICAgZnJhbWU6IEdyYXBoRXhlY3V0aW9uRnJhbWUsXG4gICAgcGxhbjogR3JhcGhFeGVjdXRpb25QbGFuLFxuICAgIHBsYW5Ob2RlOiBHcmFwaEV4ZWN1dGlvblBsYW5Ob2RlXG4gICk6IEdyYXBoRXhlY3V0aW9uVmFsdWVzIHtcbiAgICBjb25zdCBpbnB1dHM6IEdyYXBoRXhlY3V0aW9uVmFsdWVzID0ge307XG4gICAgY29uc3QgaW5jb21pbmcgPSBwbGFuLmluY29taW5nQnlOb2RlLmdldChwbGFuTm9kZS5pZCkgPz8gW107XG4gICAgZm9yIChjb25zdCBlZGdlIG9mIGluY29taW5nKSB7XG4gICAgICBpbnB1dHNbZWRnZS50YXJnZXRQb3J0XSA9IGZyYW1lLnZhbHVlU3RvcmUuZ2V0UG9ydChcbiAgICAgICAgZWRnZS5zb3VyY2VOb2RlSWQsXG4gICAgICAgIGVkZ2Uuc291cmNlUG9ydFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGlucHV0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0cyB0byByZWFkIGEgcGlubmVkIHZhbHVlIGZvciB0aGUgbm9kZS4gUmV0dXJucyB0aGUgY2FjaGVkIG91dHB1dHNcbiAgICogd2hlbiBhIHZhbGlkIHBpbm5lZCB2YWx1ZSBleGlzdHMsIG9yIGB1bmRlZmluZWRgIHRvIHByb2NlZWQgd2l0aCBub3JtYWxcbiAgICogZXhlY3V0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB0cnlQaW5uZWRWYWx1ZShcbiAgICBmcmFtZTogR3JhcGhFeGVjdXRpb25GcmFtZSxcbiAgICBwbGFuOiBHcmFwaEV4ZWN1dGlvblBsYW4sXG4gICAgcGxhbk5vZGU6IEdyYXBoRXhlY3V0aW9uUGxhbk5vZGUsXG4gICAgaW5wdXRzOiBHcmFwaEV4ZWN1dGlvblZhbHVlc1xuICApOiBQcm9taXNlPEdyYXBoQ2FjaGVkVmFsdWUgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBwb2xpY3kgPSBuZXcgR3JhcGhQaW5uaW5nUG9saWN5KCk7XG4gICAgaWYgKCFwb2xpY3kuc2hvdWxkVXNlUGlubmVkVmFsdWUocGxhbk5vZGUpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IHRoaXMuY3JlYXRlUGlubmluZ1NlcnZpY2UoKTtcbiAgICBjb25zdCBkZXBGaW5nZXJwcmludHMgPSB0aGlzLmNvbXB1dGVEZXBlbmRlbmN5RmluZ2VycHJpbnRzKGZyYW1lLCBwbGFuLCBwbGFuTm9kZS5pZCk7XG4gICAgcmV0dXJuIHNlcnZpY2UucmVhZFBpbm5lZFZhbHVlKFxuICAgICAgcGxhbi53b3JrZmxvdyxcbiAgICAgIHBsYW5Ob2RlLFxuICAgICAgaW5wdXRzLFxuICAgICAgZGVwRmluZ2VycHJpbnRzXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWN1cnNpdmVseSBjb21wdXRlcyBmaW5nZXJwcmludHMgZm9yIGFsbCB1cHN0cmVhbSBkZXBlbmRlbmNpZXMgb2YgYSBub2RlXG4gICAqIHVzaW5nIHRoZSByZXN1bHRzIGFscmVhZHkgYWNjdW11bGF0ZWQgaW4gdGhlIGZyYW1lLlxuICAgKi9cbiAgcHJpdmF0ZSBjb21wdXRlRGVwZW5kZW5jeUZpbmdlcnByaW50cyhcbiAgICBmcmFtZTogR3JhcGhFeGVjdXRpb25GcmFtZSxcbiAgICBwbGFuOiBHcmFwaEV4ZWN1dGlvblBsYW4sXG4gICAgbm9kZUlkOiBzdHJpbmdcbiAgKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3Qgc2VydmljZSA9IHRoaXMuY3JlYXRlUGlubmluZ1NlcnZpY2UoKTtcbiAgICBjb25zdCBkZXBSZXNvbHZlciA9IG5ldyBHcmFwaFBpbm5pbmdEZXBlbmRlbmN5UmVzb2x2ZXIoKTtcbiAgICBjb25zdCBkZXBzID0gZGVwUmVzb2x2ZXIuZ2V0RGVwZW5kZW5jaWVzKHBsYW4sIG5vZGVJZCk7XG4gICAgY29uc3QgZmluZ2VycHJpbnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgZm9yIChjb25zdCBkZXAgb2YgZGVwcykge1xuICAgICAgY29uc3Qgbm9kZSA9IHBsYW4ubm9kZXMuZmluZCgobikgPT4gbi5pZCA9PT0gZGVwKTtcbiAgICAgIGlmIChub2RlKSB7XG4gICAgICAgIGNvbnN0IGRlcFJlc3VsdCA9IGZyYW1lLm5vZGVSZXN1bHRzLmdldChkZXApO1xuICAgICAgICBjb25zdCBpbnB1dHMgPSBkZXBSZXN1bHQ/LmlucHV0cyA/PyB7fTtcbiAgICAgICAgY29uc3QgbmVzdGVkRGVwcyA9IHRoaXMuY29tcHV0ZURlcGVuZGVuY3lGaW5nZXJwcmludHMoZnJhbWUsIHBsYW4sIGRlcCk7XG4gICAgICAgIGZpbmdlcnByaW50c1tkZXBdID0gc2VydmljZS5jb21wdXRlRmluZ2VycHJpbnQoXG4gICAgICAgICAgcGxhbi53b3JrZmxvdyxcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIGlucHV0cyxcbiAgICAgICAgICBuZXN0ZWREZXBzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmaW5nZXJwcmludHM7XG4gIH1cblxuICAvKipcbiAgICogUm91dGVzIGEgbm9kZSdzIG91dHB1dHMgdG8gZG93bnN0cmVhbSBpbnB1dHMgYW5kIHdvcmtmbG93IG91dHB1dHMuXG4gICAqL1xuICBwcml2YXRlIHJvdXRlT3V0Z29pbmdFZGdlcyhcbiAgICBmcmFtZTogR3JhcGhFeGVjdXRpb25GcmFtZSxcbiAgICBwbGFuOiBHcmFwaEV4ZWN1dGlvblBsYW4sXG4gICAgcGxhbk5vZGU6IEdyYXBoRXhlY3V0aW9uUGxhbk5vZGUsXG4gICAgb3V0cHV0czogR3JhcGhFeGVjdXRpb25WYWx1ZXNcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgb3V0Z29pbmcgPSBwbGFuLm91dGdvaW5nQnlOb2RlLmdldChwbGFuTm9kZS5pZCkgPz8gW107XG4gICAgZm9yIChjb25zdCBlZGdlIG9mIG91dGdvaW5nKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG91dHB1dHNbZWRnZS5zb3VyY2VQb3J0XTtcbiAgICAgIGlmIChlZGdlLnRhcmdldE5vZGVJZCA9PT0gR1JBUEhfV09SS0ZMT1dfQk9VTkRBUlkpIHtcbiAgICAgICAgZnJhbWUudmFsdWVTdG9yZS5zZXRXb3JrZmxvd091dHB1dChlZGdlLnRhcmdldFBvcnQsIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZW1pdEV2ZW50KGZyYW1lLCB7XG4gICAgICAgIHR5cGU6IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLkVER0VfVkFMVUVfUk9VVEVELFxuICAgICAgICBydW5JZDogZnJhbWUucnVuSWQsXG4gICAgICAgIHdvcmtmbG93SWQ6IHBsYW4ud29ya2Zsb3dJZCxcbiAgICAgICAgZWRnZUlkOiBlZGdlLmlkLFxuICAgICAgICBub2RlSWQ6IHBsYW5Ob2RlLmlkLFxuICAgICAgICBwYXRoOiBbXSxcbiAgICAgICAgcGF5bG9hZDogeyBlZGdlLCB2YWx1ZSB9LFxuICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAvLyBvYnNlcnZlciBmYWlsdXJlcyBtdXN0IG5vdCBjcmFzaFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGFuIGV2ZW50LCByZWNvcmRzIGl0IGluIHRoZSBmcmFtZSwgYW5kIGRpc3BhdGNoZXMgdG8gb2JzZXJ2ZXJzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbWl0RXZlbnQoXG4gICAgZnJhbWU6IEdyYXBoRXhlY3V0aW9uRnJhbWUsXG4gICAgcGFydGlhbDogUGFydGlhbDxHcmFwaEV4ZWN1dGlvbkV2ZW50PiAmIHtcbiAgICAgIHR5cGU6IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlO1xuICAgICAgcnVuSWQ6IEdyYXBoUnVuSWQ7XG4gICAgICB3b3JrZmxvd0lkOiBzdHJpbmc7XG4gICAgICBwYXRoOiBzdHJpbmdbXTtcbiAgICB9XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGV2ZW50ID0gZnJhbWUuZXZlbnRGYWN0b3J5LmNyZWF0ZSh7XG4gICAgICBpZDogXCJcIixcbiAgICAgIHNlcXVlbmNlOiAwLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgLi4ucGFydGlhbCxcbiAgICB9IGFzIE9taXQ8R3JhcGhFeGVjdXRpb25FdmVudCwgXCJpZFwiIHwgXCJzZXF1ZW5jZVwiIHwgXCJ0aW1lc3RhbXBcIj4pO1xuICAgIGZyYW1lLmFwcGVuZEV2ZW50KGV2ZW50KTtcbiAgICBhd2FpdCB0aGlzLmVtaXR0ZXIudXBkYXRlT2JzZXJ2ZXJzKGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXJnZXMgZGVmYXVsdCBvcHRpb25zIHdpdGggdGhlIGdpdmVuIG9wdGlvbnMuXG4gICAqL1xuICBwcml2YXRlIG1lcmdlT3B0aW9ucyhcbiAgICBvcHRpb25zOiBHcmFwaEV4ZWN1dGlvbk9wdGlvbnNcbiAgKTogR3JhcGhFeGVjdXRpb25PcHRpb25zIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29uY3VycmVuY3k6IEdSQVBIX0RFRkFVTFRfQ09OQ1VSUkVOQ1ksXG4gICAgICBmYWlsRmFzdDogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlSW5wdXRzOiB0cnVlLFxuICAgICAgdmFsaWRhdGVPdXRwdXRzOiB0cnVlLFxuICAgICAgdXNlUGlubmVkVmFsdWVzOiB0cnVlLFxuICAgICAgd3JpdGVUaHJvdWdoQ2FjaGU6IGZhbHNlLFxuICAgICAgcGF0aDogW10sXG4gICAgICBtZXRhZGF0YToge30sXG4gICAgICAuLi50aGlzLmRlZmF1bHRPcHRpb25zLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBydW4gaWQuXG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlUnVuSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKFxuICAgICAgZ2xvYmFsVGhpcy5jcnlwdG8/LnJhbmRvbVVVSUQ/LigpID8/XG4gICAgICBgZ3JhcGgtcnVuLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKX1gXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhbiBlcnJvciBpbnRvIGEgc2VyaWFsaXplZCBwYXlsb2FkLlxuICAgKi9cbiAgcHJpdmF0ZSB0b0Vycm9yUGF5bG9hZChlcnJvcjogdW5rbm93bik6IEdyYXBoRXhlY3V0aW9uRXJyb3JQYXlsb2FkIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogZXJyb3IubmFtZSxcbiAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgc3RhY2s6IGVycm9yLnN0YWNrLFxuICAgICAgICBjb2RlOlxuICAgICAgICAgIChlcnJvciBhcyBhbnkpLmdyYXBoQ29kZSA/P1xuICAgICAgICAgICh0eXBlb2YgKGVycm9yIGFzIGFueSkuY29kZSA9PT0gXCJudW1iZXJcIlxuICAgICAgICAgICAgPyBTdHJpbmcoKGVycm9yIGFzIGFueSkuY29kZSlcbiAgICAgICAgICAgIDogKGVycm9yIGFzIGFueSkuY29kZSksXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4geyBuYW1lOiBcIlVua25vd25FcnJvclwiLCBtZXNzYWdlOiBTdHJpbmcoZXJyb3IpIH07XG4gIH1cbn1cbiJdfQ==
|
|
407
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhFeGVjdXRpb25FbmdpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJHcmFwaEV4ZWN1dGlvbkVuZ2luZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxvREFBdUk7QUFDdkksNkZBQXVGO0FBQ3ZGLDZGQUF1RjtBQUN2RixxRkFBK0U7QUFDL0Usb0dBQThGO0FBQzlGLHNFQUFnRTtBQUNoRSxnRkFBMEU7QUFDMUUsOEVBQXdFO0FBQ3hFLHNHQUFnRztBQUNoRyx5RUFBbUU7QUFDbkUscUVBQStEO0FBQy9ELHVFQUFzRTtBQUN0RTs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBYSxvQkFBb0I7SUFDN0IsWUFBWSxNQUFNO1FBQ2QsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsWUFBWSxJQUFJLElBQUksMERBQTBCLEVBQUUsQ0FBQztRQUN2RSxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksSUFBSSxnREFBcUIsRUFBRSxDQUFDO1FBQzdELElBQUksQ0FBQyxpQkFBaUI7WUFDbEIsTUFBTSxDQUFDLGlCQUFpQixJQUFJLElBQUksa0VBQThCLEVBQUUsQ0FBQztRQUNyRSxJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDO1FBQ2xELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUM7UUFDeEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFDRCxPQUFPLENBQUMsUUFBUTtRQUNaLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUNELFNBQVMsQ0FBQyxRQUFRO1FBQ2QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7SUFD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QUksS0FBSyxZQUFZLEtBQUssRUFBRSxDQUFDO1lBQ3pCLE9BQU87Z0JBQ0gsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO2dCQUNoQixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87Z0JBQ3RCLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztnQkFDbEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxTQUFTO29CQUNqQixDQUFDLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRO3dCQUMzQixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7d0JBQ3BCLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO2FBQ3hCLENBQUM7UUFDTixDQUFDO1FBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO0lBQzVELENBQUM7Q0FDSjtBQXpYRCxvREF5WEM7QUFDRCxrcjBDQUFrcjBDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgR1JBUEhfREVGQVVMVF9DT05DVVJSRU5DWSwgR1JBUEhfV09SS0ZMT1dfQk9VTkRBUlksIEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLCBHcmFwaEV4ZWN1dGlvblN0YXR1cywgfSBmcm9tIFwiLi8uLi9jb25zdGFudHMuanNcIjtcbmltcG9ydCB7IEdyYXBoRXhlY3V0aW9uRXZlbnRFbWl0dGVyIH0gZnJvbSBcIi4vLi4vZXZlbnRzL0dyYXBoRXhlY3V0aW9uRXZlbnRFbWl0dGVyLmpzXCI7XG5pbXBvcnQgeyBHcmFwaEV4ZWN1dGlvbkV2ZW50RmFjdG9yeSB9IGZyb20gXCIuLy4uL2V2ZW50cy9HcmFwaEV4ZWN1dGlvbkV2ZW50RmFjdG9yeS5qc1wiO1xuaW1wb3J0IHsgR3JhcGhFeGVjdXRpb25QbGFubmVyIH0gZnJvbSBcIi4vLi4vcGxhbm5pbmcvR3JhcGhFeGVjdXRpb25QbGFubmVyLmpzXCI7XG5pbXBvcnQgeyBJbk1lbW9yeUdyYXBoVmFsdWVTdG9yZUFkYXB0ZXIgfSBmcm9tIFwiLi8uLi9zdG9yZS9Jbk1lbW9yeUdyYXBoVmFsdWVTdG9yZUFkYXB0ZXIuanNcIjtcbmltcG9ydCB7IEdyYXBoVmFsdWVTdG9yZSB9IGZyb20gXCIuLy4uL3N0b3JlL0dyYXBoVmFsdWVTdG9yZS5qc1wiO1xuaW1wb3J0IHsgR3JhcGhQaW5uaW5nU2VydmljZSB9IGZyb20gXCIuLy4uL3Bpbm5pbmcvR3JhcGhQaW5uaW5nU2VydmljZS5qc1wiO1xuaW1wb3J0IHsgR3JhcGhQaW5uaW5nUG9saWN5IH0gZnJvbSBcIi4vLi4vcGlubmluZy9HcmFwaFBpbm5pbmdQb2xpY3kuanNcIjtcbmltcG9ydCB7IEdyYXBoUGlubmluZ0RlcGVuZGVuY3lSZXNvbHZlciB9IGZyb20gXCIuLy4uL3Bpbm5pbmcvR3JhcGhQaW5uaW5nRGVwZW5kZW5jeVJlc29sdmVyLmpzXCI7XG5pbXBvcnQgeyBHcmFwaEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9HcmFwaEV4ZWN1dGlvbkNvbnRleHQuanNcIjtcbmltcG9ydCB7IEdyYXBoRXhlY3V0aW9uRnJhbWUgfSBmcm9tIFwiLi9HcmFwaEV4ZWN1dGlvbkZyYW1lLmpzXCI7XG5pbXBvcnQgeyBidWlsZEdyYXBoRXhlY3V0aW9uUmVzdWx0IH0gZnJvbSBcIi4vR3JhcGhFeGVjdXRpb25SZXN1bHQuanNcIjtcbi8qKlxuICogUmVmZXJlbmNlIGdyYXBoIGV4ZWN1dGlvbiBlbmdpbmUuXG4gKlxuICogRXhlY3V0ZXMgYSB7QGxpbmsgR3JhcGhXb3JrZmxvd0RlZmluaXRpb259IGJ5OlxuICogMS4gUGxhbm5pbmcgdGhlIHdvcmtmbG93IGludG8gdG9wb2xvZ2ljYWwgbGF5ZXJzLlxuICogMi4gU2VlZGluZyB3b3JrZmxvdyBpbnB1dHMgaW50byB0aGUgdmFsdWUgc3RvcmUuXG4gKiAzLiBFeGVjdXRpbmcgbm9kZXMgbGF5ZXItYnktbGF5ZXIgd2l0aCBjb25maWd1cmFibGUgY29uY3VycmVuY3kuXG4gKiA0LiBSb3V0aW5nIHZhbHVlcyBhbG9uZyBlZGdlcy5cbiAqIDUuIEVtaXR0aW5nIHN0cnVjdHVyZWQgZXZlbnRzIHRocm91Z2ggRGVjYWYncyBPYnNlcnZhYmxlIHBpcGVsaW5lLlxuICogNi4gUmV0dXJuaW5nIGEgY29tcGxldGUge0BsaW5rIEdyYXBoRXhlY3V0aW9uUmVzdWx0fS5cbiAqL1xuZXhwb3J0IGNsYXNzIEdyYXBoRXhlY3V0aW9uRW5naW5lIHtcbiAgICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICAgICAgdGhpcy5lbWl0dGVyID0gY29uZmlnLmV2ZW50RW1pdHRlciA/PyBuZXcgR3JhcGhFeGVjdXRpb25FdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5wbGFubmVyID0gY29uZmlnLnBsYW5uZXIgPz8gbmV3IEdyYXBoRXhlY3V0aW9uUGxhbm5lcigpO1xuICAgICAgICB0aGlzLnZhbHVlU3RvcmVBZGFwdGVyID1cbiAgICAgICAgICAgIGNvbmZpZy52YWx1ZVN0b3JlQWRhcHRlciA/PyBuZXcgSW5NZW1vcnlHcmFwaFZhbHVlU3RvcmVBZGFwdGVyKCk7XG4gICAgICAgIHRoaXMuZGVmYXVsdE9wdGlvbnMgPSBjb25maWcuZGVmYXVsdE9wdGlvbnMgPz8ge307XG4gICAgICAgIHRoaXMuY29kZVNhbmRib3hFdmFsdWF0b3IgPSBjb25maWcuY29kZVNhbmRib3hFdmFsdWF0b3I7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICBjb25maWcub25FbmdpbmVDcmVhdGVkPy4odGhpcyk7XG4gICAgfVxuICAgIG9ic2VydmUob2JzZXJ2ZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1pdHRlci5vYnNlcnZlKG9ic2VydmVyKTtcbiAgICB9XG4gICAgdW5PYnNlcnZlKG9ic2VydmVyKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlci51bk9ic2VydmUob2JzZXJ2ZXIpO1xuICAgIH1cbiAgICBhc3luYyB1cGRhdGVPYnNlcnZlcnMoZXZlbnQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0dGVyLnVwZGF0ZU9ic2VydmVycyhldmVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIGEgd29ya2Zsb3cgd2l0aCB0aGUgZ2l2ZW4gaW5wdXRzIGFuZCBvcHRpb25zLlxuICAgICAqL1xuICAgIGFzeW5jIGV4ZWN1dGUod29ya2Zsb3csIGlucHV0cyA9IHt9LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMubWVyZ2VPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBydW5JZCA9IG9wdHMucnVuSWQgPz8gdGhpcy5nZW5lcmF0ZVJ1bklkKCk7XG4gICAgICAgIGNvbnN0IHBhdGggPSBvcHRzLnBhdGggPz8gW107XG4gICAgICAgIGNvbnN0IGV2ZW50RmFjdG9yeSA9IG5ldyBHcmFwaEV4ZWN1dGlvbkV2ZW50RmFjdG9yeSgpO1xuICAgICAgICBjb25zdCB2YWx1ZVN0b3JlID0gbmV3IEdyYXBoVmFsdWVTdG9yZSh0aGlzLnZhbHVlU3RvcmVBZGFwdGVyKTtcbiAgICAgICAgdmFsdWVTdG9yZS5zZWVkV29ya2Zsb3dJbnB1dHMoaW5wdXRzKTtcbiAgICAgICAgY29uc3QgcGxhbiA9IHRoaXMucGxhbm5lci5wbGFuKHdvcmtmbG93KTtcbiAgICAgICAgY29uc3QgZnJhbWUgPSBuZXcgR3JhcGhFeGVjdXRpb25GcmFtZShydW5JZCwgcGxhbiwgdmFsdWVTdG9yZSwgZXZlbnRGYWN0b3J5KTtcbiAgICAgICAgY29uc3QgZW1pdEZuID0gYXN5bmMgKHBhcnRpYWwpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZW1pdEV2ZW50KGZyYW1lLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogcGFydGlhbC50eXBlID8/IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLk5PREVfT1VUUFVULFxuICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgIHBhcmVudFJ1bklkOiBvcHRzLnBhcmVudFJ1bklkLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93SWQ6IHdvcmtmbG93Lm5hbWUsXG4gICAgICAgICAgICAgICAgbm9kZUlkOiBwYXJ0aWFsLm5vZGVJZCxcbiAgICAgICAgICAgICAgICBwYXRoOiBwYXJ0aWFsLnBhdGggPz8gcGF0aCxcbiAgICAgICAgICAgICAgICAuLi5wYXJ0aWFsLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdEV2ZW50KGZyYW1lLCB7XG4gICAgICAgICAgICB0eXBlOiBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZS5XT1JLRkxPV19TVEFSVEVELFxuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICBwYXJlbnRSdW5JZDogb3B0cy5wYXJlbnRSdW5JZCxcbiAgICAgICAgICAgIHdvcmtmbG93SWQ6IHdvcmtmbG93Lm5hbWUsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgc3RhdHVzOiBHcmFwaEV4ZWN1dGlvblN0YXR1cy5SVU5OSU5HLFxuICAgICAgICAgICAgcGF5bG9hZDogeyBpbnB1dHMgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdEV2ZW50KGZyYW1lLCB7XG4gICAgICAgICAgICB0eXBlOiBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZS5XT1JLRkxPV19QTEFOTkVELFxuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICBwYXJlbnRSdW5JZDogb3B0cy5wYXJlbnRSdW5JZCxcbiAgICAgICAgICAgIHdvcmtmbG93SWQ6IHdvcmtmbG93Lm5hbWUsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgc3RhdHVzOiBHcmFwaEV4ZWN1dGlvblN0YXR1cy5QTEFOTklORyxcbiAgICAgICAgICAgIHBheWxvYWQ6IHsgbGF5ZXJzOiBwbGFuLmxheWVycy5sZW5ndGgsIG5vZGVzOiBwbGFuLm5vZGVzLmxlbmd0aCB9LFxuICAgICAgICB9KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgcGxhbi5sYXllcnMpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGVMYXllcihmcmFtZSwgcGxhbiwgbGF5ZXIubm9kZXMsIG9wdHMsIGVtaXRGbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmcmFtZS5maW5pc2goKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZW1pdEV2ZW50KGZyYW1lLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogR3JhcGhFeGVjdXRpb25FdmVudFR5cGUuV09SS0ZMT1dfQ09NUExFVEVELFxuICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgIHBhcmVudFJ1bklkOiBvcHRzLnBhcmVudFJ1bklkLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93SWQ6IHdvcmtmbG93Lm5hbWUsXG4gICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6IEdyYXBoRXhlY3V0aW9uU3RhdHVzLlNVQ0NFRURFRCxcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiB7IG91dHB1dHM6IHZhbHVlU3RvcmUuZ2V0V29ya2Zsb3dWYWx1ZXMoKSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRHcmFwaEV4ZWN1dGlvblJlc3VsdChmcmFtZSwgd29ya2Zsb3csIGlucHV0cywgR3JhcGhFeGVjdXRpb25TdGF0dXMuU1VDQ0VFREVELCBvcHRzLm1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGZyYW1lLmZpbmlzaCgpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3JQYXlsb2FkID0gdGhpcy50b0Vycm9yUGF5bG9hZChlcnJvcik7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmVtaXRFdmVudChmcmFtZSwge1xuICAgICAgICAgICAgICAgIHR5cGU6IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLldPUktGTE9XX0ZBSUxFRCxcbiAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICBwYXJlbnRSdW5JZDogb3B0cy5wYXJlbnRSdW5JZCxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd0lkOiB3b3JrZmxvdy5uYW1lLFxuICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBHcmFwaEV4ZWN1dGlvblN0YXR1cy5GQUlMRUQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yUGF5bG9hZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkR3JhcGhFeGVjdXRpb25SZXN1bHQoZnJhbWUsIHdvcmtmbG93LCBpbnB1dHMsIEdyYXBoRXhlY3V0aW9uU3RhdHVzLkZBSUxFRCwgb3B0cy5tZXRhZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUGlucyBhIG5vZGUgYW5kIGl0cyB1cHN0cmVhbSBkZXBlbmRlbmNpZXMgYWZ0ZXIgYSBjb21wbGV0ZWQgcnVuLlxuICAgICAqXG4gICAgICogRGVsZWdhdGVzIHRvIHtAbGluayBHcmFwaFBpbm5pbmdTZXJ2aWNlfS4gVGhlIHBsYW4gYW5kIHJlc3VsdCBtdXN0IGNvbWVcbiAgICAgKiBmcm9tIGEgcHJpb3Igc3VjY2Vzc2Z1bCBleGVjdXRpb24gb2YgdGhlIHNhbWUgd29ya2Zsb3cuXG4gICAgICovXG4gICAgYXN5bmMgcGluTm9kZShvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLmNyZWF0ZVBpbm5pbmdTZXJ2aWNlKCk7XG4gICAgICAgIGF3YWl0IHNlcnZpY2UucGluTm9kZShvcHRpb25zKTtcbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0UGlubmluZ0V2ZW50KG9wdGlvbnMubm9kZUlkLCBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZS5OT0RFX1BJTk5FRCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVucGlucyBhIG5vZGUgYnkgaXRzIGZpbmdlcnByaW50LlxuICAgICAqL1xuICAgIGFzeW5jIHVucGluTm9kZShvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLmNyZWF0ZVBpbm5pbmdTZXJ2aWNlKCk7XG4gICAgICAgIGF3YWl0IHNlcnZpY2UudW5waW5Ob2RlKG9wdGlvbnMpO1xuICAgICAgICBhd2FpdCB0aGlzLmVtaXRQaW5uaW5nRXZlbnQob3B0aW9ucy5ub2RlSWQsIEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLk5PREVfVU5QSU5ORUQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEge0BsaW5rIEdyYXBoUGlubmluZ1NlcnZpY2V9IGJhY2tlZCBieSB0aGlzIGVuZ2luZSdzIHZhbHVlIHN0b3JlXG4gICAgICogYWRhcHRlci5cbiAgICAgKi9cbiAgICBjcmVhdGVQaW5uaW5nU2VydmljZSgpIHtcbiAgICAgICAgY29uc3Qgc3RvcmUgPSBuZXcgR3JhcGhWYWx1ZVN0b3JlKHRoaXMudmFsdWVTdG9yZUFkYXB0ZXIpO1xuICAgICAgICByZXR1cm4gbmV3IEdyYXBoUGlubmluZ1NlcnZpY2Uoc3RvcmUsIG5ldyBHcmFwaFBpbm5pbmdQb2xpY3koKSwgbmV3IEdyYXBoUGlubmluZ0RlcGVuZGVuY3lSZXNvbHZlcigpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW1pdHMgYSBwaW5uaW5nLXJlbGF0ZWQgZXZlbnQgdG8gYWxsIG9ic2VydmVycy5cbiAgICAgKi9cbiAgICBhc3luYyBlbWl0UGlubmluZ0V2ZW50KG5vZGVJZCwgdHlwZSkge1xuICAgICAgICBjb25zdCBmYWN0b3J5ID0gbmV3IEdyYXBoRXhlY3V0aW9uRXZlbnRGYWN0b3J5KCk7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gZmFjdG9yeS5jcmVhdGUoe1xuICAgICAgICAgICAgaWQ6IFwiXCIsXG4gICAgICAgICAgICBzZXF1ZW5jZTogMCxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgIHJ1bklkOiBcInBpbm5pbmdcIixcbiAgICAgICAgICAgIHdvcmtmbG93SWQ6IFwiXCIsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgbm9kZUlkLFxuICAgICAgICAgICAgcGF0aDogW10sXG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCB0aGlzLmVtaXR0ZXIudXBkYXRlT2JzZXJ2ZXJzKGV2ZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgYSBsYXllciBvZiBub2RlcyB3aXRoIHRoZSBjb25maWd1cmVkIGNvbmN1cnJlbmN5LlxuICAgICAqL1xuICAgIGFzeW5jIGV4ZWN1dGVMYXllcihmcmFtZSwgcGxhbiwgbm9kZXMsIG9wdHMsIGVtaXRGbikge1xuICAgICAgICBjb25zdCBjb25jdXJyZW5jeSA9IE1hdGgubWF4KDEsIG9wdHMuY29uY3VycmVuY3kgPz8gR1JBUEhfREVGQVVMVF9DT05DVVJSRU5DWSk7XG4gICAgICAgIGNvbnN0IHF1ZXVlID0gWy4uLm5vZGVzXTtcbiAgICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGJhdGNoID0gcXVldWUuc3BsaWNlKDAsIGNvbmN1cnJlbmN5KTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGJhdGNoLm1hcCgobm9kZSkgPT4gdGhpcy5leGVjdXRlTm9kZShmcmFtZSwgcGxhbiwgbm9kZSwgb3B0cywgZW1pdEZuKSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIGEgc2luZ2xlIG5vZGUuXG4gICAgICovXG4gICAgYXN5bmMgZXhlY3V0ZU5vZGUoZnJhbWUsIHBsYW4sIHBsYW5Ob2RlLCBvcHRzLCBlbWl0Rm4pIHtcbiAgICAgICAgY29uc3Qgc3RhcnRlZEF0ID0gbmV3IERhdGUoKTtcbiAgICAgICAgY29uc3Qgbm9kZVBhdGggPSBbLi4uKG9wdHMucGF0aCA/PyBbXSksIHBsYW5Ob2RlLmlkXTtcbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0RXZlbnQoZnJhbWUsIHtcbiAgICAgICAgICAgIHR5cGU6IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLk5PREVfU1RBUlRFRCxcbiAgICAgICAgICAgIHJ1bklkOiBmcmFtZS5ydW5JZCxcbiAgICAgICAgICAgIHdvcmtmbG93SWQ6IHBsYW4ud29ya2Zsb3dJZCxcbiAgICAgICAgICAgIG5vZGVJZDogcGxhbk5vZGUuaWQsXG4gICAgICAgICAgICBwYXRoOiBub2RlUGF0aCxcbiAgICAgICAgICAgIHN0YXR1czogR3JhcGhFeGVjdXRpb25TdGF0dXMuUlVOTklORyxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGlucHV0cyA9IHRoaXMucmVzb2x2ZU5vZGVJbnB1dHMoZnJhbWUsIHBsYW4sIHBsYW5Ob2RlKTtcbiAgICAgICAgLy8gQ2FjaGUtaGl0OiBjaGVjayBmb3IgYSBwaW5uZWQgdmFsdWUgYmVmb3JlIGV4ZWN1dGluZyB0aGUgbm9kZVxuICAgICAgICBpZiAob3B0cy51c2VQaW5uZWRWYWx1ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlZCA9IGF3YWl0IHRoaXMudHJ5UGlubmVkVmFsdWUoZnJhbWUsIHBsYW4sIHBsYW5Ob2RlLCBpbnB1dHMpO1xuICAgICAgICAgICAgaWYgKGNhY2hlZCkge1xuICAgICAgICAgICAgICAgIGZyYW1lLnZhbHVlU3RvcmUuc2V0Tm9kZU91dHB1dHMocGxhbk5vZGUuaWQsIGNhY2hlZC5vdXRwdXRzKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJvdXRlT3V0Z29pbmdFZGdlcyhmcmFtZSwgcGxhbiwgcGxhbk5vZGUsIGNhY2hlZC5vdXRwdXRzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaW5pc2hlZEF0ID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVJZDogcGxhbk5vZGUuaWQsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogR3JhcGhFeGVjdXRpb25TdGF0dXMuQ0FDSEVELFxuICAgICAgICAgICAgICAgICAgICBpbnB1dHMsXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dHM6IGNhY2hlZC5vdXRwdXRzLFxuICAgICAgICAgICAgICAgICAgICBzdGFydGVkQXQsXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkQXQsXG4gICAgICAgICAgICAgICAgICAgIGZyb21DYWNoZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgcGlubmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBldmVudHM6IFtdLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgZnJhbWUucmVjb3JkTm9kZVJlc3VsdChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZW1pdEV2ZW50KGZyYW1lLCB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLk5PREVfQ0FDSEVfSElULFxuICAgICAgICAgICAgICAgICAgICBydW5JZDogZnJhbWUucnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtmbG93SWQ6IHBsYW4ud29ya2Zsb3dJZCxcbiAgICAgICAgICAgICAgICAgICAgbm9kZUlkOiBwbGFuTm9kZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogbm9kZVBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogR3JhcGhFeGVjdXRpb25TdGF0dXMuQ0FDSEVELFxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7IG91dHB1dHM6IGNhY2hlZC5vdXRwdXRzIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0RXZlbnQoZnJhbWUsIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogR3JhcGhFeGVjdXRpb25FdmVudFR5cGUuTk9ERV9DT01QTEVURUQsXG4gICAgICAgICAgICAgICAgICAgIHJ1bklkOiBmcmFtZS5ydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dJZDogcGxhbi53b3JrZmxvd0lkLFxuICAgICAgICAgICAgICAgICAgICBub2RlSWQ6IHBsYW5Ob2RlLmlkLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBub2RlUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBHcmFwaEV4ZWN1dGlvblN0YXR1cy5TVUNDRUVERUQsXG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgb3V0cHV0czogY2FjaGVkLm91dHB1dHMsIGZyb21DYWNoZTogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZXhlY3V0b3IgPSB0aGlzLmNvbmZpZy5yZWdpc3RyeS5yZXNvbHZlKHBsYW5Ob2RlLmtpbmQpO1xuICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IG5ldyBHcmFwaEV4ZWN1dGlvbkNvbnRleHQoZnJhbWUucnVuSWQsIG9wdHMucGFyZW50UnVuSWQsIHBsYW4ud29ya2Zsb3csIHBsYW5Ob2RlLmRlZmluaXRpb24sIG5vZGVQYXRoLCBlbWl0Rm4sIG9wdHMubWV0YWRhdGEpO1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0cyA9IGF3YWl0IGV4ZWN1dG9yLmV4ZWN1dGUoaW5wdXRzLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkT3V0cHV0cyA9IG91dHB1dHMgPz8ge307XG4gICAgICAgICAgICBmcmFtZS52YWx1ZVN0b3JlLnNldE5vZGVPdXRwdXRzKHBsYW5Ob2RlLmlkLCByZXNvbHZlZE91dHB1dHMpO1xuICAgICAgICAgICAgdGhpcy5yb3V0ZU91dGdvaW5nRWRnZXMoZnJhbWUsIHBsYW4sIHBsYW5Ob2RlLCByZXNvbHZlZE91dHB1dHMpO1xuICAgICAgICAgICAgY29uc3QgZmluaXNoZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgbm9kZUlkOiBwbGFuTm9kZS5pZCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6IEdyYXBoRXhlY3V0aW9uU3RhdHVzLlNVQ0NFRURFRCxcbiAgICAgICAgICAgICAgICBpbnB1dHMsXG4gICAgICAgICAgICAgICAgb3V0cHV0czogcmVzb2x2ZWRPdXRwdXRzLFxuICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICBmaW5pc2hlZEF0LFxuICAgICAgICAgICAgICAgIGV2ZW50czogW10sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZnJhbWUucmVjb3JkTm9kZVJlc3VsdChyZXN1bHQpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0RXZlbnQoZnJhbWUsIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZS5OT0RFX0NPTVBMRVRFRCxcbiAgICAgICAgICAgICAgICBydW5JZDogZnJhbWUucnVuSWQsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dJZDogcGxhbi53b3JrZmxvd0lkLFxuICAgICAgICAgICAgICAgIG5vZGVJZDogcGxhbk5vZGUuaWQsXG4gICAgICAgICAgICAgICAgcGF0aDogbm9kZVBhdGgsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBHcmFwaEV4ZWN1dGlvblN0YXR1cy5TVUNDRUVERUQsXG4gICAgICAgICAgICAgICAgcGF5bG9hZDogeyBvdXRwdXRzOiByZXNvbHZlZE91dHB1dHMgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc3QgZmluaXNoZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICBjb25zdCBlcnJvclBheWxvYWQgPSB0aGlzLnRvRXJyb3JQYXlsb2FkKGVycm9yKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICBub2RlSWQ6IHBsYW5Ob2RlLmlkLFxuICAgICAgICAgICAgICAgIHN0YXR1czogR3JhcGhFeGVjdXRpb25TdGF0dXMuRkFJTEVELFxuICAgICAgICAgICAgICAgIGlucHV0cyxcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3JQYXlsb2FkLFxuICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICBmaW5pc2hlZEF0LFxuICAgICAgICAgICAgICAgIGV2ZW50czogW10sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZnJhbWUucmVjb3JkTm9kZVJlc3VsdChyZXN1bHQpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0RXZlbnQoZnJhbWUsIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBHcmFwaEV4ZWN1dGlvbkV2ZW50VHlwZS5OT0RFX0ZBSUxFRCxcbiAgICAgICAgICAgICAgICBydW5JZDogZnJhbWUucnVuSWQsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dJZDogcGxhbi53b3JrZmxvd0lkLFxuICAgICAgICAgICAgICAgIG5vZGVJZDogcGxhbk5vZGUuaWQsXG4gICAgICAgICAgICAgICAgcGF0aDogbm9kZVBhdGgsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBHcmFwaEV4ZWN1dGlvblN0YXR1cy5GQUlMRUQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yUGF5bG9hZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKG9wdHMuZmFpbEZhc3QgPz8gdHJ1ZSlcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyBhIG5vZGUncyBpbnB1dCB2YWx1ZXMgZnJvbSBpbmNvbWluZyBlZGdlcy5cbiAgICAgKi9cbiAgICByZXNvbHZlTm9kZUlucHV0cyhmcmFtZSwgcGxhbiwgcGxhbk5vZGUpIHtcbiAgICAgICAgY29uc3QgaW5wdXRzID0ge307XG4gICAgICAgIGNvbnN0IGluY29taW5nID0gcGxhbi5pbmNvbWluZ0J5Tm9kZS5nZXQocGxhbk5vZGUuaWQpID8/IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGVkZ2Ugb2YgaW5jb21pbmcpIHtcbiAgICAgICAgICAgIGlucHV0c1tlZGdlLnRhcmdldFBvcnRdID0gZnJhbWUudmFsdWVTdG9yZS5nZXRQb3J0KGVkZ2Uuc291cmNlTm9kZUlkLCBlZGdlLnNvdXJjZVBvcnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnB1dHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEF0dGVtcHRzIHRvIHJlYWQgYSBwaW5uZWQgdmFsdWUgZm9yIHRoZSBub2RlLiBSZXR1cm5zIHRoZSBjYWNoZWQgb3V0cHV0c1xuICAgICAqIHdoZW4gYSB2YWxpZCBwaW5uZWQgdmFsdWUgZXhpc3RzLCBvciBgdW5kZWZpbmVkYCB0byBwcm9jZWVkIHdpdGggbm9ybWFsXG4gICAgICogZXhlY3V0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHRyeVBpbm5lZFZhbHVlKGZyYW1lLCBwbGFuLCBwbGFuTm9kZSwgaW5wdXRzKSB7XG4gICAgICAgIGNvbnN0IHBvbGljeSA9IG5ldyBHcmFwaFBpbm5pbmdQb2xpY3koKTtcbiAgICAgICAgaWYgKCFwb2xpY3kuc2hvdWxkVXNlUGlubmVkVmFsdWUocGxhbk5vZGUpKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMuY3JlYXRlUGlubmluZ1NlcnZpY2UoKTtcbiAgICAgICAgY29uc3QgZGVwRmluZ2VycHJpbnRzID0gdGhpcy5jb21wdXRlRGVwZW5kZW5jeUZpbmdlcnByaW50cyhmcmFtZSwgcGxhbiwgcGxhbk5vZGUuaWQpO1xuICAgICAgICByZXR1cm4gc2VydmljZS5yZWFkUGlubmVkVmFsdWUocGxhbi53b3JrZmxvdywgcGxhbk5vZGUsIGlucHV0cywgZGVwRmluZ2VycHJpbnRzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVjdXJzaXZlbHkgY29tcHV0ZXMgZmluZ2VycHJpbnRzIGZvciBhbGwgdXBzdHJlYW0gZGVwZW5kZW5jaWVzIG9mIGEgbm9kZVxuICAgICAqIHVzaW5nIHRoZSByZXN1bHRzIGFscmVhZHkgYWNjdW11bGF0ZWQgaW4gdGhlIGZyYW1lLlxuICAgICAqL1xuICAgIGNvbXB1dGVEZXBlbmRlbmN5RmluZ2VycHJpbnRzKGZyYW1lLCBwbGFuLCBub2RlSWQpIHtcbiAgICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMuY3JlYXRlUGlubmluZ1NlcnZpY2UoKTtcbiAgICAgICAgY29uc3QgZGVwUmVzb2x2ZXIgPSBuZXcgR3JhcGhQaW5uaW5nRGVwZW5kZW5jeVJlc29sdmVyKCk7XG4gICAgICAgIGNvbnN0IGRlcHMgPSBkZXBSZXNvbHZlci5nZXREZXBlbmRlbmNpZXMocGxhbiwgbm9kZUlkKTtcbiAgICAgICAgY29uc3QgZmluZ2VycHJpbnRzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgZGVwIG9mIGRlcHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBwbGFuLm5vZGVzLmZpbmQoKG4pID0+IG4uaWQgPT09IGRlcCk7XG4gICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlcFJlc3VsdCA9IGZyYW1lLm5vZGVSZXN1bHRzLmdldChkZXApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0cyA9IGRlcFJlc3VsdD8uaW5wdXRzID8/IHt9O1xuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZERlcHMgPSB0aGlzLmNvbXB1dGVEZXBlbmRlbmN5RmluZ2VycHJpbnRzKGZyYW1lLCBwbGFuLCBkZXApO1xuICAgICAgICAgICAgICAgIGZpbmdlcnByaW50c1tkZXBdID0gc2VydmljZS5jb21wdXRlRmluZ2VycHJpbnQocGxhbi53b3JrZmxvdywgbm9kZSwgaW5wdXRzLCBuZXN0ZWREZXBzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmluZ2VycHJpbnRzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSb3V0ZXMgYSBub2RlJ3Mgb3V0cHV0cyB0byBkb3duc3RyZWFtIGlucHV0cyBhbmQgd29ya2Zsb3cgb3V0cHV0cy5cbiAgICAgKi9cbiAgICByb3V0ZU91dGdvaW5nRWRnZXMoZnJhbWUsIHBsYW4sIHBsYW5Ob2RlLCBvdXRwdXRzKSB7XG4gICAgICAgIGNvbnN0IG91dGdvaW5nID0gcGxhbi5vdXRnb2luZ0J5Tm9kZS5nZXQocGxhbk5vZGUuaWQpID8/IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGVkZ2Ugb2Ygb3V0Z29pbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gb3V0cHV0c1tlZGdlLnNvdXJjZVBvcnRdO1xuICAgICAgICAgICAgaWYgKGVkZ2UudGFyZ2V0Tm9kZUlkID09PSBHUkFQSF9XT1JLRkxPV19CT1VOREFSWSkge1xuICAgICAgICAgICAgICAgIGZyYW1lLnZhbHVlU3RvcmUuc2V0V29ya2Zsb3dPdXRwdXQoZWRnZS50YXJnZXRQb3J0LCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmVtaXRFdmVudChmcmFtZSwge1xuICAgICAgICAgICAgICAgIHR5cGU6IEdyYXBoRXhlY3V0aW9uRXZlbnRUeXBlLkVER0VfVkFMVUVfUk9VVEVELFxuICAgICAgICAgICAgICAgIHJ1bklkOiBmcmFtZS5ydW5JZCxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd0lkOiBwbGFuLndvcmtmbG93SWQsXG4gICAgICAgICAgICAgICAgZWRnZUlkOiBlZGdlLmlkLFxuICAgICAgICAgICAgICAgIG5vZGVJZDogcGxhbk5vZGUuaWQsXG4gICAgICAgICAgICAgICAgcGF0aDogW10sXG4gICAgICAgICAgICAgICAgcGF5bG9hZDogeyBlZGdlLCB2YWx1ZSB9LFxuICAgICAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIG9ic2VydmVyIGZhaWx1cmVzIG11c3Qgbm90IGNyYXNoXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbWl0cyBhbiBldmVudCwgcmVjb3JkcyBpdCBpbiB0aGUgZnJhbWUsIGFuZCBkaXNwYXRjaGVzIHRvIG9ic2VydmVycy5cbiAgICAgKi9cbiAgICBhc3luYyBlbWl0RXZlbnQoZnJhbWUsIHBhcnRpYWwpIHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSBmcmFtZS5ldmVudEZhY3RvcnkuY3JlYXRlKHtcbiAgICAgICAgICAgIGlkOiBcIlwiLFxuICAgICAgICAgICAgc2VxdWVuY2U6IDAsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAuLi5wYXJ0aWFsLFxuICAgICAgICB9KTtcbiAgICAgICAgZnJhbWUuYXBwZW5kRXZlbnQoZXZlbnQpO1xuICAgICAgICBhd2FpdCB0aGlzLmVtaXR0ZXIudXBkYXRlT2JzZXJ2ZXJzKGV2ZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWVyZ2VzIGRlZmF1bHQgb3B0aW9ucyB3aXRoIHRoZSBnaXZlbiBvcHRpb25zLlxuICAgICAqL1xuICAgIG1lcmdlT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb25jdXJyZW5jeTogR1JBUEhfREVGQVVMVF9DT05DVVJSRU5DWSxcbiAgICAgICAgICAgIGZhaWxGYXN0OiB0cnVlLFxuICAgICAgICAgICAgdmFsaWRhdGVJbnB1dHM6IHRydWUsXG4gICAgICAgICAgICB2YWxpZGF0ZU91dHB1dHM6IHRydWUsXG4gICAgICAgICAgICB1c2VQaW5uZWRWYWx1ZXM6IHRydWUsXG4gICAgICAgICAgICB3cml0ZVRocm91Z2hDYWNoZTogZmFsc2UsXG4gICAgICAgICAgICBwYXRoOiBbXSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7fSxcbiAgICAgICAgICAgIC4uLnRoaXMuZGVmYXVsdE9wdGlvbnMsXG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSB1bmlxdWUgcnVuIGlkLlxuICAgICAqL1xuICAgIGdlbmVyYXRlUnVuSWQoKSB7XG4gICAgICAgIHJldHVybiAoZ2xvYmFsVGhpcy5jcnlwdG8/LnJhbmRvbVVVSUQ/LigpID8/XG4gICAgICAgICAgICBgZ3JhcGgtcnVuLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKX1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYW4gZXJyb3IgaW50byBhIHNlcmlhbGl6ZWQgcGF5bG9hZC5cbiAgICAgKi9cbiAgICB0b0Vycm9yUGF5bG9hZChlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBlcnJvci5uYW1lLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgc3RhY2s6IGVycm9yLnN0YWNrLFxuICAgICAgICAgICAgICAgIGNvZGU6IGVycm9yLmdyYXBoQ29kZSA/P1xuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIGVycm9yLmNvZGUgPT09IFwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gU3RyaW5nKGVycm9yLmNvZGUpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGVycm9yLmNvZGUpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBuYW1lOiBcIlVua25vd25FcnJvclwiLCBtZXNzYWdlOiBTdHJpbmcoZXJyb3IpIH07XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pUjNKaGNHaEZlR1ZqZFhScGIyNUZibWRwYm1VdWFuTWlMQ0p6YjNWeVkyVlNiMjkwSWpvaUlpd2ljMjkxY21ObGN5STZXeUl1TGk4dUxpOHVMaTh1TGk5emNtTXZaM0poY0dndlpYaGxZM1YwYVc5dUwwZHlZWEJvUlhobFkzVjBhVzl1Ulc1bmFXNWxMblJ6SWwwc0ltNWhiV1Z6SWpwYlhTd2liV0Z3Y0dsdVozTWlPaUpCUVZGQkxFOUJRVThzUlVGRFRDeDVRa0ZCZVVJc1JVRkRla0lzZFVKQlFYVkNMRVZCUTNaQ0xIVkNRVUYxUWl4RlFVTjJRaXh2UWtGQmIwSXNSMEZEY2tJc01FSkJRWEZDTzBGQllYUkNMRTlCUVU4c1JVRkJSU3d3UWtGQk1FSXNSVUZCUlN4clJFRkJOa003UVVGRGJFWXNUMEZCVHl4RlFVRkZMREJDUVVFd1FpeEZRVUZGTEd0RVFVRTJRenRCUVVWc1JpeFBRVUZQTEVWQlFVVXNjVUpCUVhGQ0xFVkJRVVVzSzBOQlFUQkRPMEZCU1RGRkxFOUJRVThzUlVGQlJTdzRRa0ZCT0VJc1JVRkJSU3h4UkVGQlowUTdRVUZEZWtZc1QwRkJUeXhGUVVGRkxHVkJRV1VzUlVGQlJTeHpRMEZCYVVNN1FVRkZNMFFzVDBGQlR5eEZRVUZGTEcxQ1FVRnRRaXhGUVVGRkxEUkRRVUYxUXp0QlFVTnlSU3hQUVVGUExFVkJRVVVzYTBKQlFXdENMRVZCUVVVc01rTkJRWE5ETzBGQlEyNUZMRTlCUVU4c1JVRkJSU3c0UWtGQk9FSXNSVUZCUlN4MVJFRkJhMFE3UVVGRE0wWXNUMEZCVHl4RlFVRkZMSEZDUVVGeFFpeEZRVUZGTEcxRFFVRm5RenRCUVVOb1JTeFBRVUZQTEVWQlFVVXNiVUpCUVcxQ0xFVkJRVVVzYVVOQlFUaENPMEZCUXpWRUxFOUJRVThzUlVGQlJTeDVRa0ZCZVVJc1JVRkJSU3hyUTBGQkswSTdRVUUwUW01Rk96czdPenM3T3pzN08wZEJWVWM3UVVGRFNDeE5RVUZOTEU5QlFVOHNiMEpCUVc5Q08wbEJVeTlDTEZsQlFWa3NUVUZCYTBNN1VVRkROVU1zU1VGQlNTeERRVUZETEU5QlFVOHNSMEZCUnl4TlFVRk5MRU5CUVVNc1dVRkJXU3hKUVVGSkxFbEJRVWtzTUVKQlFUQkNMRVZCUVVVc1EwRkJRenRSUVVOMlJTeEpRVUZKTEVOQlFVTXNUMEZCVHl4SFFVRkhMRTFCUVUwc1EwRkJReXhQUVVGUExFbEJRVWtzU1VGQlNTeHhRa0ZCY1VJc1JVRkJSU3hEUVVGRE8xRkJRemRFTEVsQlFVa3NRMEZCUXl4cFFrRkJhVUk3V1VGRGNFSXNUVUZCVFN4RFFVRkRMR2xDUVVGcFFpeEpRVUZKTEVsQlFVa3NPRUpCUVRoQ0xFVkJRVVVzUTBGQlF6dFJRVU51UlN4SlFVRkpMRU5CUVVNc1kwRkJZeXhIUVVGSExFMUJRVTBzUTBGQlF5eGpRVUZqTEVsQlFVa3NSVUZCUlN4RFFVRkRPMUZCUTJ4RUxFbEJRVWtzUTBGQlF5eHZRa0ZCYjBJc1IwRkJSeXhOUVVGTkxFTkJRVU1zYjBKQlFXOUNMRU5CUVVNN1VVRkRlRVFzU1VGQlNTeERRVUZETEUxQlFVMHNSMEZCUnl4TlFVRk5MRU5CUVVNN1VVRkRja0lzVFVGQlRTeERRVUZETEdWQlFXVXNSVUZCUlN4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRE8wbEJRMnBETEVOQlFVTTdTVUZKUkN4UFFVRlBMRU5CUVVNc1VVRkJaME03VVVGRGRFTXNUMEZCVHl4SlFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExFOUJRVThzUTBGQlF5eFJRVUZSTEVOQlFVTXNRMEZCUXp0SlFVTjRReXhEUVVGRE8wbEJSVVFzVTBGQlV5eERRVUZETEZGQlFXZERPMUZCUTNoRExFbEJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNVMEZCVXl4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRE8wbEJRMjVETEVOQlFVTTdTVUZGUkN4TFFVRkxMRU5CUVVNc1pVRkJaU3hEUVVGRExFdEJRVEJDTzFGQlF6bERMRTFCUVUwc1NVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eGxRVUZsTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNN1NVRkROVU1zUTBGQlF6dEpRVVZFT3p0UFFVVkhPMGxCUTBnc1MwRkJTeXhEUVVGRExFOUJRVThzUTBGRFdDeFJRVUZwUXl4RlFVTnFReXhUUVVFclFpeEZRVUZGTEVWQlEycERMRlZCUVdsRExFVkJRVVU3VVVGRmJrTXNUVUZCVFN4SlFVRkpMRWRCUVVjc1NVRkJTU3hEUVVGRExGbEJRVmtzUTBGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXp0UlFVTjRReXhOUVVGTkxFdEJRVXNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNTMEZCU3l4SlFVRkpMRWxCUVVrc1EwRkJReXhoUVVGaExFVkJRVVVzUTBGQlF6dFJRVU5xUkN4TlFVRk5MRWxCUVVrc1IwRkJSeXhKUVVGSkxFTkJRVU1zU1VGQlNTeEpRVUZKTEVWQlFVVXNRMEZCUXp0UlFVTTNRaXhOUVVGTkxGbEJRVmtzUjBGQlJ5eEpRVUZKTERCQ1FVRXdRaXhGUVVGRkxFTkJRVU03VVVGRGRFUXNUVUZCVFN4VlFVRlZMRWRCUVVjc1NVRkJTU3hsUVVGbExFTkJRVU1zU1VGQlNTeERRVUZETEdsQ1FVRnBRaXhEUVVGRExFTkJRVU03VVVGREwwUXNWVUZCVlN4RFFVRkRMR3RDUVVGclFpeERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRPMUZCUlhSRExFMUJRVTBzU1VGQlNTeEhRVUZITEVsQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETzFGQlEzcERMRTFCUVUwc1MwRkJTeXhIUVVGSExFbEJRVWtzYlVKQlFXMUNMRU5CUTI1RExFdEJRVXNzUlVGRFRDeEpRVUZKTEVWQlEwb3NWVUZCVlN4RlFVTldMRmxCUVZrc1EwRkRZaXhEUVVGRE8xRkJSVVlzVFVGQlRTeE5RVUZOTEVkQlFVY3NTMEZCU3l4RlFVRkZMRTlCUVhGRExFVkJRVVVzUlVGQlJUdFpRVU0zUkN4TlFVRk5MRWxCUVVrc1EwRkJReXhUUVVGVExFTkJRVU1zUzBGQlN5eEZRVUZGTzJkQ1FVTXhRaXhKUVVGSkxFVkJRVVVzVDBGQlR5eERRVUZETEVsQlFVa3NTVUZCU1N4MVFrRkJkVUlzUTBGQlF5eFhRVUZYTzJkQ1FVTjZSQ3hMUVVGTE8yZENRVU5NTEZkQlFWY3NSVUZCUlN4SlFVRkpMRU5CUVVNc1YwRkJWenRuUWtGRE4wSXNWVUZCVlN4RlFVRkZMRkZCUVZFc1EwRkJReXhKUVVGSk8yZENRVU42UWl4TlFVRk5MRVZCUVVVc1QwRkJUeXhEUVVGRExFMUJRVTA3WjBKQlEzUkNMRWxCUVVrc1JVRkJSU3hQUVVGUExFTkJRVU1zU1VGQlNTeEpRVUZKTEVsQlFVazdaMEpCUXpGQ0xFZEJRVWNzVDBGQlR6dGhRVU5ZTEVOQlFVTXNRMEZCUXp0UlFVTk1MRU5CUVVNc1EwRkJRenRSUVVWR0xFMUJRVTBzU1VGQlNTeERRVUZETEZOQlFWTXNRMEZCUXl4TFFVRkxMRVZCUVVVN1dVRkRNVUlzU1VGQlNTeEZRVUZGTEhWQ1FVRjFRaXhEUVVGRExHZENRVUZuUWp0WlFVTTVReXhMUVVGTE8xbEJRMHdzVjBGQlZ5eEZRVUZGTEVsQlFVa3NRMEZCUXl4WFFVRlhPMWxCUXpkQ0xGVkJRVlVzUlVGQlJTeFJRVUZSTEVOQlFVTXNTVUZCU1R0WlFVTjZRaXhKUVVGSk8xbEJRMG9zVFVGQlRTeEZRVUZGTEc5Q1FVRnZRaXhEUVVGRExFOUJRVTg3V1VGRGNFTXNUMEZCVHl4RlFVRkZMRVZCUVVVc1RVRkJUU3hGUVVGRk8xTkJRM0JDTEVOQlFVTXNRMEZCUXp0UlFVVklMRTFCUVUwc1NVRkJTU3hEUVVGRExGTkJRVk1zUTBGQlF5eExRVUZMTEVWQlFVVTdXVUZETVVJc1NVRkJTU3hGUVVGRkxIVkNRVUYxUWl4RFFVRkRMR2RDUVVGblFqdFpRVU01UXl4TFFVRkxPMWxCUTB3c1YwRkJWeXhGUVVGRkxFbEJRVWtzUTBGQlF5eFhRVUZYTzFsQlF6ZENMRlZCUVZVc1JVRkJSU3hSUVVGUkxFTkJRVU1zU1VGQlNUdFpRVU42UWl4SlFVRkpPMWxCUTBvc1RVRkJUU3hGUVVGRkxHOUNRVUZ2UWl4RFFVRkRMRkZCUVZFN1dVRkRja01zVDBGQlR5eEZRVUZGTEVWQlFVVXNUVUZCVFN4RlFVRkZMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVFVGQlRTeEZRVUZGTEV0QlFVc3NSVUZCUlN4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFMUJRVTBzUlVGQlJUdFRRVU5zUlN4RFFVRkRMRU5CUVVNN1VVRkZTQ3hKUVVGSkxFTkJRVU03V1VGRFNDeExRVUZMTEUxQlFVMHNTMEZCU3l4SlFVRkpMRWxCUVVrc1EwRkJReXhOUVVGTkxFVkJRVVVzUTBGQlF6dG5Ra0ZEYUVNc1RVRkJUU3hKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEV0QlFVc3NSVUZCUlN4SlFVRkpMRVZCUVVVc1MwRkJTeXhEUVVGRExFdEJRVXNzUlVGQlJTeEpRVUZKTEVWQlFVVXNUVUZCVFN4RFFVRkRMRU5CUVVNN1dVRkRiRVVzUTBGQlF6dFpRVVZFTEV0QlFVc3NRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJRenRaUVVWbUxFMUJRVTBzU1VGQlNTeERRVUZETEZOQlFWTXNRMEZCUXl4TFFVRkxMRVZCUVVVN1owSkJRekZDTEVsQlFVa3NSVUZCUlN4MVFrRkJkVUlzUTBGQlF5eHJRa0ZCYTBJN1owSkJRMmhFTEV0QlFVczdaMEpCUTB3c1YwRkJWeXhGUVVGRkxFbEJRVWtzUTBGQlF5eFhRVUZYTzJkQ1FVTTNRaXhWUVVGVkxFVkJRVVVzVVVGQlVTeERRVUZETEVsQlFVazdaMEpCUTNwQ0xFbEJRVWs3WjBKQlEwb3NUVUZCVFN4RlFVRkZMRzlDUVVGdlFpeERRVUZETEZOQlFWTTdaMEpCUTNSRExFOUJRVThzUlVGQlJTeEZRVUZGTEU5QlFVOHNSVUZCUlN4VlFVRlZMRU5CUVVNc2FVSkJRV2xDTEVWQlFVVXNSVUZCUlR0aFFVTnlSQ3hEUVVGRExFTkJRVU03V1VGRlNDeFBRVUZQTEhsQ1FVRjVRaXhEUVVNNVFpeExRVUZMTEVWQlEwd3NVVUZCVVN4RlFVTlNMRTFCUVUwc1JVRkRUaXh2UWtGQmIwSXNRMEZCUXl4VFFVRlRMRVZCUXpsQ0xFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlEyUXNRMEZCUXp0UlFVTktMRU5CUVVNN1VVRkJReXhQUVVGUExFdEJRVXNzUlVGQlJTeERRVUZETzFsQlEyWXNTMEZCU3l4RFFVRkRMRTFCUVUwc1JVRkJSU3hEUVVGRE8xbEJRMllzVFVGQlRTeFpRVUZaTEVkQlFVY3NTVUZCU1N4RFFVRkRMR05CUVdNc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF6dFpRVVZvUkN4TlFVRk5MRWxCUVVrc1EwRkJReXhUUVVGVExFTkJRVU1zUzBGQlN5eEZRVUZGTzJkQ1FVTXhRaXhKUVVGSkxFVkJRVVVzZFVKQlFYVkNMRU5CUVVNc1pVRkJaVHRuUWtGRE4wTXNTMEZCU3p0blFrRkRUQ3hYUVVGWExFVkJRVVVzU1VGQlNTeERRVUZETEZkQlFWYzdaMEpCUXpkQ0xGVkJRVlVzUlVGQlJTeFJRVUZSTEVOQlFVTXNTVUZCU1R0blFrRkRla0lzU1VGQlNUdG5Ra0ZEU2l4TlFVRk5MRVZCUVVVc2IwSkJRVzlDTEVOQlFVTXNUVUZCVFR0blFrRkRia01zUzBGQlN5eEZRVUZGTEZsQlFWazdZVUZEY0VJc1EwRkJReXhEUVVGRE8xbEJSVWdzVDBGQlR5eDVRa0ZCZVVJc1EwRkRPVUlzUzBGQlN5eEZRVU5NTEZGQlFWRXNSVUZEVWl4TlFVRk5MRVZCUTA0c2IwSkJRVzlDTEVOQlFVTXNUVUZCVFN4RlFVTXpRaXhKUVVGSkxFTkJRVU1zVVVGQlVTeERRVU5rTEVOQlFVTTdVVUZEU2l4RFFVRkRPMGxCUTBnc1EwRkJRenRKUVVWRU96czdPenRQUVV0SE8wbEJRMGdzUzBGQlN5eERRVUZETEU5QlFVOHNRMEZCUXl4UFFVRTBRanRSUVVONFF5eE5RVUZOTEU5QlFVOHNSMEZCUnl4SlFVRkpMRU5CUVVNc2IwSkJRVzlDTEVWQlFVVXNRMEZCUXp0UlFVTTFReXhOUVVGTkxFOUJRVThzUTBGQlF5eFBRVUZQTEVOQlFVTXNUMEZCVHl4RFFVRkRMRU5CUVVNN1VVRkRMMElzVFVGQlRTeEpRVUZKTEVOQlFVTXNaMEpCUVdkQ0xFTkJRVU1zVDBGQlR5eERRVUZETEUxQlFVMHNSVUZCUlN4MVFrRkJkVUlzUTBGQlF5eFhRVUZYTEVOQlFVTXNRMEZCUXp0SlFVTnVSaXhEUVVGRE8wbEJSVVE3TzA5QlJVYzdTVUZEU0N4TFFVRkxMRU5CUVVNc1UwRkJVeXhEUVVGRExFOUJRVGhDTzFGQlF6VkRMRTFCUVUwc1QwRkJUeXhIUVVGSExFbEJRVWtzUTBGQlF5eHZRa0ZCYjBJc1JVRkJSU3hEUVVGRE8xRkJRelZETEUxQlFVMHNUMEZCVHl4RFFVRkRMRk5CUVZNc1EwRkJReXhQUVVGUExFTkJRVU1zUTBGQlF6dFJRVU5xUXl4TlFVRk5MRWxCUVVrc1EwRkJReXhuUWtGQlowSXNRMEZCUXl4UFFVRlBMRU5CUVVNc1RVRkJUU3hGUVVGRkxIVkNRVUYxUWl4RFFVRkRMR0ZCUVdFc1EwRkJReXhEUVVGRE8wbEJRM0pHTEVOQlFVTTdTVUZGUkRzN08wOUJSMGM3U1VGRFN5eHZRa0ZCYjBJN1VVRkRNVUlzVFVGQlRTeExRVUZMTEVkQlFVY3NTVUZCU1N4bFFVRmxMRU5CUVVNc1NVRkJTU3hEUVVGRExHbENRVUZwUWl4RFFVRkRMRU5CUVVNN1VVRkRNVVFzVDBGQlR5eEpRVUZKTEcxQ1FVRnRRaXhEUVVNMVFpeExRVUZMTEVWQlEwd3NTVUZCU1N4clFrRkJhMElzUlVGQlJTeEZRVU40UWl4SlFVRkpMRGhDUVVFNFFpeEZRVUZGTEVOQlEzSkRMRU5CUVVNN1NVRkRTaXhEUVVGRE8wbEJSVVE3TzA5QlJVYzdTVUZEU3l4TFFVRkxMRU5CUVVNc1owSkJRV2RDTEVOQlF6VkNMRTFCUVdNc1JVRkRaQ3hKUVVFMlFqdFJRVVUzUWl4TlFVRk5MRTlCUVU4c1IwRkJSeXhKUVVGSkxEQkNRVUV3UWl4RlFVRkZMRU5CUVVNN1VVRkRha1FzVFVGQlRTeExRVUZMTEVkQlFVY3NUMEZCVHl4RFFVRkRMRTFCUVUwc1EwRkJRenRaUVVNelFpeEZRVUZGTEVWQlFVVXNSVUZCUlR0WlFVTk9MRkZCUVZFc1JVRkJSU3hEUVVGRE8xbEJRMWdzVTBGQlV5eEZRVUZGTEVsQlFVa3NTVUZCU1N4RlFVRkZPMWxCUTNKQ0xFdEJRVXNzUlVGQlJTeFRRVUZUTzFsQlEyaENMRlZCUVZVc1JVRkJSU3hGUVVGRk8xbEJRMlFzU1VGQlNUdFpRVU5LTEUxQlFVMDdXVUZEVGl4SlFVRkpMRVZCUVVVc1JVRkJSVHRUUVVOeFJDeERRVUZETEVOQlFVTTdVVUZEYWtVc1RVRkJUU3hKUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEdWQlFXVXNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJRenRKUVVNMVF5eERRVUZETzBsQlJVUTdPMDlCUlVjN1NVRkRTeXhMUVVGTExFTkJRVU1zV1VGQldTeERRVU40UWl4TFFVRXdRaXhGUVVNeFFpeEpRVUYzUWl4RlFVTjRRaXhMUVVFclFpeEZRVU12UWl4SlFVRXlRaXhGUVVNelFpeE5RVUU0UkR0UlFVVTVSQ3hOUVVGTkxGZEJRVmNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVTXhRaXhEUVVGRExFVkJRMFFzU1VGQlNTeERRVUZETEZkQlFWY3NTVUZCU1N4NVFrRkJlVUlzUTBGRE9VTXNRMEZCUXp0UlFVTkdMRTFCUVUwc1MwRkJTeXhIUVVGSExFTkJRVU1zUjBGQlJ5eExRVUZMTEVOQlFVTXNRMEZCUXp0UlFVVjZRaXhQUVVGUExFdEJRVXNzUTBGQlF5eE5RVUZOTEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNN1dVRkRlRUlzVFVGQlRTeExRVUZMTEVkQlFVY3NTMEZCU3l4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFVkJRVVVzVjBGQlZ5eERRVUZETEVOQlFVTTdXVUZETTBNc1RVRkJUU3hQUVVGUExFTkJRVU1zUjBGQlJ5eERRVU5tTEV0QlFVc3NRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJReXhKUVVGSkxFVkJRVVVzUlVGQlJTeERRVUZETEVsQlFVa3NRMEZCUXl4WFFVRlhMRU5CUVVNc1MwRkJTeXhGUVVGRkxFbEJRVWtzUlVGQlJTeEpRVUZKTEVWQlFVVXNTVUZCU1N4RlFVRkZMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRM1pGTEVOQlFVTTdVVUZEU2l4RFFVRkRPMGxCUTBnc1EwRkJRenRKUVVWRU96dFBRVVZITzBsQlEwc3NTMEZCU3l4RFFVRkRMRmRCUVZjc1EwRkRka0lzUzBGQk1FSXNSVUZETVVJc1NVRkJkMElzUlVGRGVFSXNVVUZCWjBNc1JVRkRhRU1zU1VGQk1rSXNSVUZETTBJc1RVRkJPRVE3VVVGRk9VUXNUVUZCVFN4VFFVRlRMRWRCUVVjc1NVRkJTU3hKUVVGSkxFVkJRVVVzUTBGQlF6dFJRVU0zUWl4TlFVRk5MRkZCUVZFc1IwRkJSeXhEUVVGRExFZEJRVWNzUTBGQlF5eEpRVUZKTEVOQlFVTXNTVUZCU1N4SlFVRkpMRVZCUVVVc1EwRkJReXhGUVVGRkxGRkJRVkVzUTBGQlF5eEZRVUZGTEVOQlFVTXNRMEZCUXp0UlFVVnlSQ3hOUVVGTkxFbEJRVWtzUTBGQlF5eFRRVUZUTEVOQlFVTXNTMEZCU3l4RlFVRkZPMWxCUXpGQ0xFbEJRVWtzUlVGQlJTeDFRa0ZCZFVJc1EwRkJReXhaUVVGWk8xbEJRekZETEV0QlFVc3NSVUZCUlN4TFFVRkxMRU5CUVVNc1MwRkJTenRaUVVOc1FpeFZRVUZWTEVWQlFVVXNTVUZCU1N4RFFVRkRMRlZCUVZVN1dVRkRNMElzVFVGQlRTeEZRVUZGTEZGQlFWRXNRMEZCUXl4RlFVRkZPMWxCUTI1Q0xFbEJRVWtzUlVGQlJTeFJRVUZSTzFsQlEyUXNUVUZCVFN4RlFVRkZMRzlDUVVGdlFpeERRVUZETEU5QlFVODdVMEZEY2tNc1EwRkJReXhEUVVGRE8xRkJSVWdzVFVGQlRTeE5RVUZOTEVkQlFVY3NTVUZCU1N4RFFVRkRMR2xDUVVGcFFpeERRVUZETEV0QlFVc3NSVUZCUlN4SlFVRkpMRVZCUVVVc1VVRkJVU3hEUVVGRExFTkJRVU03VVVGRk4wUXNaMFZCUVdkRk8xRkJRMmhGTEVsQlFVa3NTVUZCU1N4RFFVRkRMR1ZCUVdVc1JVRkJSU3hEUVVGRE8xbEJRM3BDTEUxQlFVMHNUVUZCVFN4SFFVRkhMRTFCUVUwc1NVRkJTU3hEUVVGRExHTkJRV01zUTBGQlF5eExRVUZMTEVWQlFVVXNTVUZCU1N4RlFVRkZMRkZCUVZFc1JVRkJSU3hOUVVGTkxFTkJRVU1zUTBGQlF6dFpRVU40UlN4SlFVRkpMRTFCUVUwc1JVRkJSU3hEUVVGRE8yZENRVU5ZTEV0QlFVc3NRMEZCUXl4VlFVRlZMRU5CUVVNc1kwRkJZeXhEUVVGRExGRkJRVkVzUTBGQlF5eEZRVUZGTEVWQlFVVXNUVUZCVFN4RFFVRkRMRTlCUVU4c1EwRkJReXhEUVVGRE8yZENRVU0zUkN4SlFVRkpMRU5CUVVNc2EwSkJRV3RDTEVOQlFVTXNTMEZCU3l4RlFVRkZMRWxCUVVrc1JVRkJSU3hSUVVGUkxFVkJRVVVzVFVGQlRTeERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRPMmRDUVVVdlJDeE5RVUZOTEZWQlFWVXNSMEZCUnl4SlFVRkpMRWxCUVVrc1JVRkJSU3hEUVVGRE8yZENRVU01UWl4TlFVRk5MRTFCUVUwc1IwRkJOa0k3YjBKQlEzWkRMRTFCUVUwc1JVRkJSU3hSUVVGUkxFTkJRVU1zUlVGQlJUdHZRa0ZEYmtJc1RVRkJUU3hGUVVGRkxHOUNRVUZ2UWl4RFFVRkRMRTFCUVUwN2IwSkJRMjVETEUxQlFVMDdiMEpCUTA0c1QwRkJUeXhGUVVGRkxFMUJRVTBzUTBGQlF5eFBRVUZQTzI5Q1FVTjJRaXhUUVVGVE8yOUNRVU5VTEZWQlFWVTdiMEpCUTFZc1UwRkJVeXhGUVVGRkxFbEJRVWs3YjBKQlEyWXNUVUZCVFN4RlFVRkZMRWxCUVVrN2IwSkJRMW9zVFVGQlRTeEZRVUZGTEVWQlFVVTdhVUpCUTFnc1EwRkJRenRuUWtGRFJpeExRVUZMTEVOQlFVTXNaMEpCUVdkQ0xFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTTdaMEpCUlM5Q0xFMUJRVTBzU1VGQlNTeERRVUZETEZOQlFWTXNRMEZCUXl4TFFVRkxMRVZCUVVVN2IwSkJRekZDTEVsQlFVa3NSVUZCUlN4MVFrRkJkVUlzUTBGQlF5eGpRVUZqTzI5Q1FVTTFReXhMUVVGTExFVkJRVVVzUzBGQlN5eERRVUZETEV0QlFVczdiMEpCUTJ4Q0xGVkJRVlVzUlVGQlJTeEpRVUZKTEVOQlFVTXNWVUZCVlR0dlFrRkRNMElzVFVGQlRTeEZRVUZGTEZGQlFWRXNRMEZCUXl4RlFVRkZPMjlDUVVOdVFpeEpRVUZKTEVWQlFVVXNVVUZCVVR0dlFrRkRaQ3hOUVVGTkxFVkJRVVVzYjBKQlFXOUNMRU5CUVVNc1RVRkJUVHR2UWtGRGJrTXNUMEZCVHl4RlFVRkZMRVZCUVVVc1QwRkJUeXhGUVVGRkxFMUJRVTBzUTBGQlF5eFBRVUZQTEVWQlFVVTdhVUpCUTNKRExFTkJRVU1zUTBGQlF6dG5Ra0ZGU0N4TlFVRk5MRWxCUVVrc1EwRkJReXhUUVVGVExFTkJRVU1zUzBGQlN5eEZRVUZGTzI5Q1FVTXhRaXhKUVVGSkxFVkJRVVVzZFVKQlFYVkNMRU5CUVVNc1kwRkJZenR2UWtGRE5VTXNTMEZCU3l4RlFVRkZMRXRCUVVzc1EwRkJReXhMUVVGTE8yOUNRVU5zUWl4VlFVRlZMRVZCUVVVc1NVRkJTU3hEUVVGRExGVkJRVlU3YjBKQlF6TkNMRTFCUVUwc1JVRkJSU3hSUVVGUkxFTkJRVU1zUlVGQlJUdHZRa0ZEYmtJc1NVRkJTU3hGUVVGRkxGRkJRVkU3YjBKQlEyUXNUVUZCVFN4RlFVRkZMRzlDUVVGdlFpeERRVUZETEZOQlFWTTdiMEpCUTNSRExFOUJRVThzUlVGQlJTeEZRVUZGTEU5QlFVOHNSVUZCUlN4TlFVRk5MRU5CUVVNc1QwRkJUeXhGUVVGRkxGTkJRVk1zUlVGQlJTeEpRVUZKTEVWQlFVVTdhVUpCUTNSRUxFTkJRVU1zUTBGQlF6dG5Ra0ZEU0N4UFFVRlBPMWxCUTFRc1EwRkJRenRSUVVOSUxFTkJRVU03VVVGRlJDeEpRVUZKTEVOQlFVTTdXVUZEU0N4TlFVRk5MRkZCUVZFc1IwRkJSeXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEZGQlFWRXNRMEZCUXl4UFFVRlBMRU5CUVVNc1VVRkJVU3hEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETzFsQlF6ZEVMRTFCUVUwc1QwRkJUeXhIUVVGSExFbEJRVWtzY1VKQlFYRkNMRU5CUTNaRExFdEJRVXNzUTBGQlF5eExRVUZMTEVWQlExZ3NTVUZCU1N4RFFVRkRMRmRCUVZjc1JVRkRhRUlzU1VGQlNTeERRVUZETEZGQlFWRXNSVUZEWWl4UlFVRlJMRU5CUVVNc1ZVRkJWU3hGUVVOdVFpeFJRVUZSTEVWQlExSXNUVUZCVFN4RlFVTk9MRWxCUVVrc1EwRkJReXhSUVVGUkxFTkJRMlFzUTBGQlF6dFpRVVZHTEUxQlFVMHNUMEZCVHl4SFFVRkhMRTFCUVUwc1VVRkJVU3hEUVVGRExFOUJRVThzUTBGQlF5eE5RVUZOTEVWQlFVVXNUMEZCVHl4RFFVRkRMRU5CUVVNN1dVRkRlRVFzVFVGQlRTeGxRVUZsTEVkQlFVY3NUMEZCVHl4SlFVRkpMRVZCUVVVc1EwRkJRenRaUVVWMFF5eExRVUZMTEVOQlFVTXNWVUZCVlN4RFFVRkRMR05CUVdNc1EwRkJReXhSUVVGUkxFTkJRVU1zUlVGQlJTeEZRVUZGTEdWQlFXVXNRMEZCUXl4RFFVRkRPMWxCUXpsRUxFbEJRVWtzUTBGQlF5eHJRa0ZCYTBJc1EwRkJReXhMUVVGTExFVkJRVVVzU1VGQlNTeEZRVUZGTEZGQlFWRXNSVUZCUlN4bFFVRmxMRU5CUVVNc1EwRkJRenRaUVVWb1JTeE5RVUZOTEZWQlFWVXNSMEZCUnl4SlFVRkpMRWxCUVVrc1JVRkJSU3hEUVVGRE8xbEJRemxDTEUxQlFVMHNUVUZCVFN4SFFVRTJRanRuUWtGRGRrTXNUVUZCVFN4RlFVRkZMRkZCUVZFc1EwRkJReXhGUVVGRk8yZENRVU51UWl4TlFVRk5MRVZCUVVVc2IwSkJRVzlDTEVOQlFVTXNVMEZCVXp0blFrRkRkRU1zVFVGQlRUdG5Ra0ZEVGl4UFFVRlBMRVZCUVVVc1pVRkJaVHRuUWtGRGVFSXNVMEZCVXp0blFrRkRWQ3hWUVVGVk8yZENRVU5XTEUxQlFVMHNSVUZCUlN4RlFVRkZPMkZCUTFnc1EwRkJRenRaUVVOR0xFdEJRVXNzUTBGQlF5eG5Ra0ZCWjBJc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF6dFpRVVV2UWl4TlFVRk5MRWxCUVVrc1EwRkJReXhUUVVGVExFTkJRVU1zUzBGQlN5eEZRVUZGTzJkQ1FVTXhRaXhKUVVGSkxFVkJRVVVzZFVKQlFYVkNMRU5CUVVNc1kwRkJZenRuUWtGRE5VTXNTMEZCU3l4RlFVRkZMRXRCUVVzc1EwRkJReXhMUVVGTE8yZENRVU5zUWl4VlFVRlZMRVZCUVVVc1NVRkJTU3hEUVVGRExGVkJRVlU3WjBKQlF6TkNMRTFCUVUwc1JVRkJSU3hSUVVGUkxFTkJRVU1zUlVGQlJUdG5Ra0ZEYmtJc1NVRkJTU3hGUVVGRkxGRkJRVkU3WjBKQlEyUXNUVUZCVFN4RlFVRkZMRzlDUVVGdlFpeERRVUZETEZOQlFWTTdaMEpCUTNSRExFOUJRVThzUlVGQlJTeEZRVUZGTEU5QlFVOHNSVUZCUlN4bFFVRmxMRVZCUVVVN1lVRkRkRU1zUTBGQlF5eERRVUZETzFGQlEwd3NRMEZCUXp0UlFVRkRMRTlCUVU4c1MwRkJTeXhGUVVGRkxFTkJRVU03V1VGRFppeE5RVUZOTEZWQlFWVXNSMEZCUnl4SlFVRkpMRWxCUVVrc1JVRkJSU3hEUVVGRE8xbEJRemxDTEUxQlFVMHNXVUZCV1N4SFFVRkhMRWxCUVVrc1EwRkJReXhqUVVGakxFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTTdXVUZEYUVRc1RVRkJUU3hOUVVGTkxFZEJRVFpDTzJkQ1FVTjJReXhOUVVGTkxFVkJRVVVzVVVGQlVTeERRVUZETEVWQlFVVTdaMEpCUTI1Q0xFMUJRVTBzUlVGQlJTeHZRa0ZCYjBJc1EwRkJReXhOUVVGTk8yZENRVU51UXl4TlFVRk5PMmRDUVVOT0xFdEJRVXNzUlVGQlJTeFpRVUZaTzJkQ1FVTnVRaXhUUVVGVE8yZENRVU5VTEZWQlFWVTdaMEpCUTFZc1RVRkJUU3hGUVVGRkxFVkJRVVU3WVVGRFdDeERRVUZETzFsQlEwWXNTMEZCU3l4RFFVRkRMR2RDUVVGblFpeERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRPMWxCUlM5Q0xFMUJRVTBzU1VGQlNTeERRVUZETEZOQlFWTXNRMEZCUXl4TFFVRkxMRVZCUVVVN1owSkJRekZDTEVsQlFVa3NSVUZCUlN4MVFrRkJkVUlzUTBGQlF5eFhRVUZYTzJkQ1FVTjZReXhMUVVGTExFVkJRVVVzUzBGQlN5eERRVUZETEV0QlFVczdaMEpCUTJ4Q0xGVkJRVlVzUlVGQlJTeEpRVUZKTEVOQlFVTXNWVUZCVlR0blFrRkRNMElzVFVGQlRTeEZRVUZGTEZGQlFWRXNRMEZCUXl4RlFVRkZPMmRDUVVOdVFpeEpRVUZKTEVWQlFVVXNVVUZCVVR0blFrRkRaQ3hOUVVGTkxFVkJRVVVzYjBKQlFXOUNMRU5CUVVNc1RVRkJUVHRuUWtGRGJrTXNTMEZCU3l4RlFVRkZMRmxCUVZrN1lVRkRjRUlzUTBGQlF5eERRVUZETzFsQlJVZ3NTVUZCU1N4SlFVRkpMRU5CUVVNc1VVRkJVU3hKUVVGSkxFbEJRVWs3WjBKQlFVVXNUVUZCVFN4TFFVRkxMRU5CUVVNN1VVRkRla01zUTBGQlF6dEpRVU5JTEVOQlFVTTdTVUZGUkRzN1QwRkZSenRKUVVOTExHbENRVUZwUWl4RFFVTjJRaXhMUVVFd1FpeEZRVU14UWl4SlFVRjNRaXhGUVVONFFpeFJRVUZuUXp0UlFVVm9ReXhOUVVGTkxFMUJRVTBzUjBGQmVVSXNSVUZCUlN4RFFVRkRPMUZCUTNoRExFMUJRVTBzVVVGQlVTeEhRVUZITEVsQlFVa3NRMEZCUXl4alFVRmpMRU5CUVVNc1IwRkJSeXhEUVVGRExGRkJRVkVzUTBGQlF5eEZRVUZGTEVOQlFVTXNTVUZCU1N4RlFVRkZMRU5CUVVNN1VVRkROVVFzUzBGQlN5eE5RVUZOTEVsQlFVa3NTVUZCU1N4UlFVRlJMRVZCUVVVc1EwRkJRenRaUVVNMVFpeE5RVUZOTEVOQlFVTXNTVUZCU1N4RFFVRkRMRlZCUVZVc1EwRkJReXhIUVVGSExFdEJRVXNzUTBGQlF5eFZRVUZWTEVOQlFVTXNUMEZCVHl4RFFVTm9SQ3hKUVVGSkxFTkJRVU1zV1VGQldTeEZRVU5xUWl4SlFVRkpMRU5CUVVNc1ZVRkJWU3hEUVVOb1FpeERRVUZETzFGQlEwb3NRMEZCUXp0UlFVTkVMRTlCUVU4c1RVRkJUU3hEUVVGRE8wbEJRMmhDTEVOQlFVTTdTVUZGUkRzN096dFBRVWxITzBsQlEwc3NTMEZCU3l4RFFVRkRMR05CUVdNc1EwRkRNVUlzUzBGQk1FSXNSVUZETVVJc1NVRkJkMElzUlVGRGVFSXNVVUZCWjBNc1JVRkRhRU1zVFVGQk5FSTdVVUZGTlVJc1RVRkJUU3hOUVVGTkxFZEJRVWNzU1VGQlNTeHJRa0ZCYTBJc1JVRkJSU3hEUVVGRE8xRkJRM2hETEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc2IwSkJRVzlDTEVOQlFVTXNVVUZCVVN4RFFVRkRPMWxCUVVVc1QwRkJUeXhUUVVGVExFTkJRVU03VVVGRk4wUXNUVUZCVFN4UFFVRlBMRWRCUVVjc1NVRkJTU3hEUVVGRExHOUNRVUZ2UWl4RlFVRkZMRU5CUVVNN1VVRkROVU1zVFVGQlRTeGxRVUZsTEVkQlFVY3NTVUZCU1N4RFFVRkRMRFpDUVVFMlFpeERRVUZETEV0QlFVc3NSVUZCUlN4SlFVRkpMRVZCUVVVc1VVRkJVU3hEUVVGRExFVkJRVVVzUTBGQlF5eERRVUZETzFGQlEzSkdMRTlCUVU4c1QwRkJUeXhEUVVGRExHVkJRV1VzUTBGRE5VSXNTVUZCU1N4RFFVRkRMRkZCUVZFc1JVRkRZaXhSUVVGUkxFVkJRMUlzVFVGQlRTeEZRVU5PTEdWQlFXVXNRMEZEYUVJc1EwRkJRenRKUVVOS0xFTkJRVU03U1VGRlJEczdPMDlCUjBjN1NVRkRTeXcyUWtGQk5rSXNRMEZEYmtNc1MwRkJNRUlzUlVGRE1VSXNTVUZCZDBJc1JVRkRlRUlzVFVGQll6dFJRVVZrTEUxQlFVMHNUMEZCVHl4SFFVRkhMRWxCUVVrc1EwRkJReXh2UWtGQmIwSXNSVUZCUlN4RFFVRkRPMUZCUXpWRExFMUJRVTBzVjBGQlZ5eEhRVUZITEVsQlFVa3NPRUpCUVRoQ0xFVkJRVVVzUTBGQlF6dFJRVU42UkN4TlFVRk5MRWxCUVVrc1IwRkJSeXhYUVVGWExFTkJRVU1zWlVGQlpTeERRVUZETEVsQlFVa3NSVUZCUlN4TlFVRk5MRU5CUVVNc1EwRkJRenRSUVVOMlJDeE5RVUZOTEZsQlFWa3NSMEZCTWtJc1JVRkJSU3hEUVVGRE8xRkJRMmhFTEV0QlFVc3NUVUZCVFN4SFFVRkhMRWxCUVVrc1NVRkJTU3hGUVVGRkxFTkJRVU03V1VGRGRrSXNUVUZCVFN4SlFVRkpMRWRCUVVjc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXl4RFFVRkRMRVZCUVVVc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTEV0QlFVc3NSMEZCUnl4RFFVRkRMRU5CUVVNN1dVRkRiRVFzU1VGQlNTeEpRVUZKTEVWQlFVVXNRMEZCUXp0blFrRkRWQ3hOUVVGTkxGTkJRVk1zUjBGQlJ5eExRVUZMTEVOQlFVTXNWMEZCVnl4RFFVRkRMRWRCUVVjc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF6dG5Ra0ZETjBNc1RVRkJUU3hOUVVGTkxFZEJRVWNzVTBGQlV5eEZRVUZGTEUxQlFVMHNTVUZCU1N4RlFVRkZMRU5CUVVNN1owSkJRM1pETEUxQlFVMHNWVUZCVlN4SFFVRkhMRWxCUVVrc1EwRkJReXcyUWtGQk5rSXNRMEZCUXl4TFFVRkxMRVZCUVVVc1NVRkJTU3hGUVVGRkxFZEJRVWNzUTBGQlF5eERRVUZETzJkQ1FVTjRSU3haUVVGWkxFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NUMEZCVHl4RFFVRkRMR3RDUVVGclFpeERRVU0xUXl4SlFVRkpMRU5CUVVNc1VVRkJVU3hGUVVOaUxFbEJRVWtzUlVGRFNpeE5RVUZOTEVWQlEwNHNWVUZCVlN4RFFVTllMRU5CUVVNN1dVRkRTaXhEUVVGRE8xRkJRMGdzUTBGQlF6dFJRVU5FTEU5QlFVOHNXVUZCV1N4RFFVRkRPMGxCUTNSQ0xFTkJRVU03U1VGRlJEczdUMEZGUnp0SlFVTkxMR3RDUVVGclFpeERRVU40UWl4TFFVRXdRaXhGUVVNeFFpeEpRVUYzUWl4RlFVTjRRaXhSUVVGblF5eEZRVU5vUXl4UFFVRTJRanRSUVVVM1FpeE5RVUZOTEZGQlFWRXNSMEZCUnl4SlFVRkpMRU5CUVVNc1kwRkJZeXhEUVVGRExFZEJRVWNzUTBGQlF5eFJRVUZSTEVOQlFVTXNSVUZCUlN4RFFVRkRMRWxCUVVrc1JVRkJSU3hEUVVGRE8xRkJRelZFTEV0QlFVc3NUVUZCVFN4SlFVRkpMRWxCUVVrc1VVRkJVU3hGUVVGRkxFTkJRVU03V1VGRE5VSXNUVUZCVFN4TFFVRkxMRWRCUVVjc1QwRkJUeXhEUVVGRExFbEJRVWtzUTBGQlF5eFZRVUZWTEVOQlFVTXNRMEZCUXp0WlFVTjJReXhKUVVGSkxFbEJRVWtzUTBGQlF5eFpRVUZaTEV0QlFVc3NkVUpCUVhWQ0xFVkJRVVVzUTBGQlF6dG5Ra0ZEYkVRc1MwRkJTeXhEUVVGRExGVkJRVlVzUTBGQlF5eHBRa0ZCYVVJc1EwRkJReXhKUVVGSkxFTkJRVU1zVlVGQlZTeEZRVUZGTEV0QlFVc3NRMEZCUXl4RFFVRkRPMWxCUXpkRUxFTkJRVU03V1VGRFJDeEpRVUZKTEVOQlFVTXNVMEZCVXl4RFFVRkRMRXRCUVVzc1JVRkJSVHRuUWtGRGNFSXNTVUZCU1N4RlFVRkZMSFZDUVVGMVFpeERRVUZETEdsQ1FVRnBRanRuUWtGREwwTXNTMEZCU3l4RlFVRkZMRXRCUVVzc1EwRkJReXhMUVVGTE8yZENRVU5zUWl4VlFVRlZMRVZCUVVVc1NVRkJTU3hEUVVGRExGVkJRVlU3WjBKQlF6TkNMRTFCUVUwc1JVRkJSU3hKUVVGSkxFTkJRVU1zUlVGQlJUdG5Ra0ZEWml4TlFVRk5MRVZCUVVVc1VVRkJVU3hEUVVGRExFVkJRVVU3WjBKQlEyNUNMRWxCUVVrc1JVRkJSU3hGUVVGRk8yZENRVU5TTEU5QlFVOHNSVUZCUlN4RlFVRkZMRWxCUVVrc1JVRkJSU3hMUVVGTExFVkJRVVU3WVVGRGVrSXNRMEZCUXl4RFFVRkRMRXRCUVVzc1EwRkJReXhIUVVGSExFVkJRVVU3WjBKQlExb3NiVU5CUVcxRE8xbEJRM0pETEVOQlFVTXNRMEZCUXl4RFFVRkRPMUZCUTB3c1EwRkJRenRKUVVOSUxFTkJRVU03U1VGRlJEczdUMEZGUnp0SlFVTkxMRXRCUVVzc1EwRkJReXhUUVVGVExFTkJRM0pDTEV0QlFUQkNMRVZCUXpGQ0xFOUJTME03VVVGRlJDeE5RVUZOTEV0QlFVc3NSMEZCUnl4TFFVRkxMRU5CUVVNc1dVRkJXU3hEUVVGRExFMUJRVTBzUTBGQlF6dFpRVU4wUXl4RlFVRkZMRVZCUVVVc1JVRkJSVHRaUVVOT0xGRkJRVkVzUlVGQlJTeERRVUZETzFsQlExZ3NVMEZCVXl4RlFVRkZMRWxCUVVrc1NVRkJTU3hGUVVGRk8xbEJRM0pDTEVkQlFVY3NUMEZCVHp0VFFVTnRSQ3hEUVVGRExFTkJRVU03VVVGRGFrVXNTMEZCU3l4RFFVRkRMRmRCUVZjc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF6dFJRVU42UWl4TlFVRk5MRWxCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zWlVGQlpTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRPMGxCUXpWRExFTkJRVU03U1VGRlJEczdUMEZGUnp0SlFVTkxMRmxCUVZrc1EwRkRiRUlzVDBGQk9FSTdVVUZGT1VJc1QwRkJUenRaUVVOTUxGZEJRVmNzUlVGQlJTeDVRa0ZCZVVJN1dVRkRkRU1zVVVGQlVTeEZRVUZGTEVsQlFVazdXVUZEWkN4alFVRmpMRVZCUVVVc1NVRkJTVHRaUVVOd1FpeGxRVUZsTEVWQlFVVXNTVUZCU1R0WlFVTnlRaXhsUVVGbExFVkJRVVVzU1VGQlNUdFpRVU55UWl4cFFrRkJhVUlzUlVGQlJTeExRVUZMTzFsQlEzaENMRWxCUVVrc1JVRkJSU3hGUVVGRk8xbEJRMUlzVVVGQlVTeEZRVUZGTEVWQlFVVTdXVUZEV2l4SFFVRkhMRWxCUVVrc1EwRkJReXhqUVVGak8xbEJRM1JDTEVkQlFVY3NUMEZCVHp0VFFVTllMRU5CUVVNN1NVRkRTaXhEUVVGRE8wbEJSVVE3TzA5QlJVYzdTVUZEU3l4aFFVRmhPMUZCUTI1Q0xFOUJRVThzUTBGRFRDeFZRVUZWTEVOQlFVTXNUVUZCVFN4RlFVRkZMRlZCUVZVc1JVRkJSU3hGUVVGRk8xbEJRMnBETEdGQlFXRXNTVUZCU1N4RFFVRkRMRWRCUVVjc1JVRkJSU3hKUVVGSkxFbEJRVWtzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXl4UlFVRlJMRU5CUVVNc1JVRkJSU3hEUVVGRExFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRU5CUTJwRkxFTkJRVU03U1VGRFNpeERRVUZETzBsQlJVUTdPMDlCUlVjN1NVRkRTeXhqUVVGakxFTkJRVU1zUzBGQll6dFJRVU51UXl4SlFVRkpMRXRCUVVzc1dVRkJXU3hMUVVGTExFVkJRVVVzUTBGQlF6dFpRVU16UWl4UFFVRlBPMmRDUVVOTUxFbEJRVWtzUlVGQlJTeExRVUZMTEVOQlFVTXNTVUZCU1R0blFrRkRhRUlzVDBGQlR5eEZRVUZGTEV0QlFVc3NRMEZCUXl4UFFVRlBPMmRDUVVOMFFpeExRVUZMTEVWQlFVVXNTMEZCU3l4RFFVRkRMRXRCUVVzN1owSkJRMnhDTEVsQlFVa3NSVUZEUkN4TFFVRmhMRU5CUVVNc1UwRkJVenR2UWtGRGVFSXNRMEZCUXl4UFFVRlJMRXRCUVdFc1EwRkJReXhKUVVGSkxFdEJRVXNzVVVGQlVUdDNRa0ZEZEVNc1EwRkJReXhEUVVGRExFMUJRVTBzUTBGQlJTeExRVUZoTEVOQlFVTXNTVUZCU1N4RFFVRkRPM2RDUVVNM1FpeERRVUZETEVOQlFVVXNTMEZCWVN4RFFVRkRMRWxCUVVrc1EwRkJRenRoUVVNelFpeERRVUZETzFGQlEwb3NRMEZCUXp0UlFVTkVMRTlCUVU4c1JVRkJSU3hKUVVGSkxFVkJRVVVzWTBGQll5eEZRVUZGTEU5QlFVOHNSVUZCUlN4TlFVRk5MRU5CUVVNc1MwRkJTeXhEUVVGRExFVkJRVVVzUTBGQlF6dEpRVU14UkN4RFFVRkRPME5CUTBZaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SXZLaXBjYmlBcUlFQnRiMlIxYkdVZ2FXNTBaV2R5WVhScGIyNXpMMmR5WVhCb0wyVjRaV04xZEdsdmJpOUhjbUZ3YUVWNFpXTjFkR2x2YmtWdVoybHVaVnh1SUNvZ1FITjFiVzFoY25rZ1VtVm1aWEpsYm1ObElHZHlZWEJvSUdWNFpXTjFkR2x2YmlCbGJtZHBibVV1WEc0Z0tpQkFaR1Z6WTNKcGNIUnBiMjRnUlhobFkzVjBaWE1nWjNKaGNHZ2dkMjl5YTJac2IzZHpJR1JsWTJ4aGNtVmtJSGRwZEdnZ1lFQmtaV05oWmkxMGN5OTFhUzFrWldOdmNtRjBiM0p6TDJkeVlYQm9ZQ3dnWlcxcGRITWdaWFpsYm5SeklIUm9jbTkxWjJnZ1JHVmpZV1luY3lCUFluTmxjblpoWW14bElIQnBjR1ZzYVc1bExDQnpkWEJ3YjNKMGN5QndZWEpoYkd4bGJDQnViMlJsSUdWNFpXTjFkR2x2YmlCM2FYUm9hVzRnZEc5d2IyeHZaMmxqWVd3Z2JHRjVaWEp6TENCaGJtUWdjbVYwZFhKdWN5QmhJR052YlhCc1pYUmxJR1Y0WldOMWRHbHZiaUJ5WlhOMWJIUXVYRzRnS2k5Y2JtbHRjRzl5ZENCMGVYQmxJSHNnVDJKelpYSjJZV0pzWlNCOUlHWnliMjBnWENKQVpHVmpZV1l0ZEhNdlkyOXlaVndpTzF4dWFXMXdiM0owSUhSNWNHVWdleUJIY21Gd2FGZHZjbXRtYkc5M1JHVm1hVzVwZEdsdmJpQjlJR1p5YjIwZ1hDSkFaR1ZqWVdZdGRITXZkV2t0WkdWamIzSmhkRzl5Y3k5bmNtRndhRndpTzF4dVhHNXBiWEJ2Y25RZ2UxeHVJQ0JIVWtGUVNGOUVSVVpCVlV4VVgwTlBUa05WVWxKRlRrTlpMRnh1SUNCSFVrRlFTRjlYVDFKTFJreFBWMTlDVDFWT1JFRlNXU3hjYmlBZ1IzSmhjR2hGZUdWamRYUnBiMjVGZG1WdWRGUjVjR1VzWEc0Z0lFZHlZWEJvUlhobFkzVjBhVzl1VTNSaGRIVnpMRnh1ZlNCbWNtOXRJRndpTGk0dlkyOXVjM1JoYm5SelhDSTdYRzVwYlhCdmNuUWdkSGx3WlNCN1hHNGdJRWR5WVhCb1JYaGxZM1YwYVc5dVJYSnliM0pRWVhsc2IyRmtMRnh1SUNCSGNtRndhRVY0WldOMWRHbHZia1YyWlc1MExGeHVJQ0JIY21Gd2FFVjRaV04xZEdsdmJrOXdkR2x2Ym5Nc1hHNGdJRWR5WVhCb1JYaGxZM1YwYVc5dVVtVnpkV3gwTEZ4dUlDQkhjbUZ3YUVWNFpXTjFkR2x2YmxaaGJIVmxjeXhjYmlBZ1IzSmhjR2hPYjJSbFJYaGxZM1YwYVc5dVVtVnpkV3gwTEZ4dUlDQkhjbUZ3YUZCcGJrNXZaR1ZQY0hScGIyNXpMRnh1SUNCSGNtRndhRlZ1Y0dsdVRtOWtaVTl3ZEdsdmJuTXNYRzRnSUVkeVlYQm9VblZ1U1dRc1hHNTlJR1p5YjIwZ1hDSXVMaTkwZVhCbGMxd2lPMXh1YVcxd2IzSjBJSFI1Y0dVZ2V5QkhjbUZ3YUVWNFpXTjFkR2x2Yms5aWMyVnlkbVZ5SUgwZ1puSnZiU0JjSWk0dUwyVjJaVzUwY3k5SGNtRndhRVY0WldOMWRHbHZiazlpYzJWeWRtVnlYQ0k3WEc1cGJYQnZjblFnZXlCSGNtRndhRVY0WldOMWRHbHZia1YyWlc1MFJXMXBkSFJsY2lCOUlHWnliMjBnWENJdUxpOWxkbVZ1ZEhNdlIzSmhjR2hGZUdWamRYUnBiMjVGZG1WdWRFVnRhWFIwWlhKY0lqdGNibWx0Y0c5eWRDQjdJRWR5WVhCb1JYaGxZM1YwYVc5dVJYWmxiblJHWVdOMGIzSjVJSDBnWm5KdmJTQmNJaTR1TDJWMlpXNTBjeTlIY21Gd2FFVjRaV04xZEdsdmJrVjJaVzUwUm1GamRHOXllVndpTzF4dWFXMXdiM0owSUhSNWNHVWdleUJIY21Gd2FFNXZaR1ZGZUdWamRYUnZjbEpsWjJsemRISjVJSDBnWm5KdmJTQmNJaTR1TDNKbFoybHpkSEo1TDBkeVlYQm9UbTlrWlVWNFpXTjFkRzl5VW1WbmFYTjBjbmxjSWp0Y2JtbHRjRzl5ZENCN0lFZHlZWEJvUlhobFkzVjBhVzl1VUd4aGJtNWxjaUI5SUdaeWIyMGdYQ0l1TGk5d2JHRnVibWx1Wnk5SGNtRndhRVY0WldOMWRHbHZibEJzWVc1dVpYSmNJanRjYm1sdGNHOXlkQ0IwZVhCbElIc2dSM0poY0doRmVHVmpkWFJwYjI1UWJHRnVJSDBnWm5KdmJTQmNJaTR1TDNCc1lXNXVhVzVuTDBkeVlYQm9SWGhsWTNWMGFXOXVVR3hoYmx3aU8xeHVhVzF3YjNKMElIUjVjR1VnZXlCSGNtRndhRVY0WldOMWRHbHZibEJzWVc1T2IyUmxJSDBnWm5KdmJTQmNJaTR1TDNCc1lXNXVhVzVuTDBkeVlYQm9SWGhsWTNWMGFXOXVVR3hoYms1dlpHVmNJanRjYm1sdGNHOXlkQ0IwZVhCbElIc2dSM0poY0doV1lXeDFaVk4wYjNKbFFXUmhjSFJsY2lCOUlHWnliMjBnWENJdUxpOXpkRzl5WlM5SGNtRndhRlpoYkhWbFUzUnZjbVZCWkdGd2RHVnlYQ0k3WEc1cGJYQnZjblFnZXlCSmJrMWxiVzl5ZVVkeVlYQm9WbUZzZFdWVGRHOXlaVUZrWVhCMFpYSWdmU0JtY205dElGd2lMaTR2YzNSdmNtVXZTVzVOWlcxdmNubEhjbUZ3YUZaaGJIVmxVM1J2Y21WQlpHRndkR1Z5WENJN1hHNXBiWEJ2Y25RZ2V5QkhjbUZ3YUZaaGJIVmxVM1J2Y21VZ2ZTQm1jbTl0SUZ3aUxpNHZjM1J2Y21VdlIzSmhjR2hXWVd4MVpWTjBiM0psWENJN1hHNXBiWEJ2Y25RZ2RIbHdaU0I3SUVkeVlYQm9RMkZqYUdWa1ZtRnNkV1VnZlNCbWNtOXRJRndpTGk0dmMzUnZjbVV2UjNKaGNHaERZV05vWldSV1lXeDFaVndpTzF4dWFXMXdiM0owSUhzZ1IzSmhjR2hRYVc1dWFXNW5VMlZ5ZG1salpTQjlJR1p5YjIwZ1hDSXVMaTl3YVc1dWFXNW5MMGR5WVhCb1VHbHVibWx1WjFObGNuWnBZMlZjSWp0Y2JtbHRjRzl5ZENCN0lFZHlZWEJvVUdsdWJtbHVaMUJ2YkdsamVTQjlJR1p5YjIwZ1hDSXVMaTl3YVc1dWFXNW5MMGR5WVhCb1VHbHVibWx1WjFCdmJHbGplVndpTzF4dWFXMXdiM0owSUhzZ1IzSmhjR2hRYVc1dWFXNW5SR1Z3Wlc1a1pXNWplVkpsYzI5c2RtVnlJSDBnWm5KdmJTQmNJaTR1TDNCcGJtNXBibWN2UjNKaGNHaFFhVzV1YVc1blJHVndaVzVrWlc1amVWSmxjMjlzZG1WeVhDSTdYRzVwYlhCdmNuUWdleUJIY21Gd2FFVjRaV04xZEdsdmJrTnZiblJsZUhRZ2ZTQm1jbTl0SUZ3aUxpOUhjbUZ3YUVWNFpXTjFkR2x2YmtOdmJuUmxlSFJjSWp0Y2JtbHRjRzl5ZENCN0lFZHlZWEJvUlhobFkzVjBhVzl1Um5KaGJXVWdmU0JtY205dElGd2lMaTlIY21Gd2FFVjRaV04xZEdsdmJrWnlZVzFsWENJN1hHNXBiWEJ2Y25RZ2V5QmlkV2xzWkVkeVlYQm9SWGhsWTNWMGFXOXVVbVZ6ZFd4MElIMGdabkp2YlNCY0lpNHZSM0poY0doRmVHVmpkWFJwYjI1U1pYTjFiSFJjSWp0Y2JtbHRjRzl5ZENCMGVYQmxJSHNnUTI5a1pWTmhibVJpYjNoRmRtRnNkV0YwYjNJZ2ZTQm1jbTl0SUZ3aUxpOURiMlJsVTJGdVpHSnZlRVYyWVd4MVlYUnZjbHdpTzF4dVhHNHZLaXBjYmlBcUlFTnZibVpwWjNWeVlYUnBiMjRnWm05eUlIUm9aU0I3UUd4cGJtc2dSM0poY0doRmVHVmpkWFJwYjI1RmJtZHBibVY5TGx4dUlDb3ZYRzVsZUhCdmNuUWdhVzUwWlhKbVlXTmxJRWR5WVhCb1JYaGxZM1YwYVc5dVJXNW5hVzVsUTI5dVptbG5JSHRjYmlBZ2NtVm5hWE4wY25rNklFZHlZWEJvVG05a1pVVjRaV04xZEc5eVVtVm5hWE4wY25rN1hHNGdJSEJzWVc1dVpYSS9PaUJIY21Gd2FFVjRaV04xZEdsdmJsQnNZVzV1WlhJN1hHNGdJSFpoYkhWbFUzUnZjbVZCWkdGd2RHVnlQem9nUjNKaGNHaFdZV3gxWlZOMGIzSmxRV1JoY0hSbGNqdGNiaUFnWlhabGJuUkZiV2wwZEdWeVB6b2dSM0poY0doRmVHVmpkWFJwYjI1RmRtVnVkRVZ0YVhSMFpYSTdYRzRnSUdSbFptRjFiSFJQY0hScGIyNXpQem9nVUdGeWRHbGhiRHhIY21Gd2FFVjRaV04xZEdsdmJrOXdkR2x2Ym5NK08xeHVJQ0F2S2lwY2JpQWdJQ29nVDNCMGFXOXVZV3dnY0d4MVoyZGhZbXhsSUdOdlpHVWdjMkZ1WkdKdmVDQmxkbUZzZFdGMGIzSWdabTl5SUdOdlpHVXRZbUZ6WldRZ1kyOXVaR2wwYVc5dWMxeHVJQ0FnS2lBb1JFVkRRVVl0TXpJZ3dxY3lNaTQwS1M0Z1YyaGxiaUJoWW5ObGJuUXNJR052WkdVZ1kyOXVaR2wwYVc5dWN5QjBhSEp2ZDF4dUlDQWdLaUJnUjFKQlVFaGZRMDlFUlY5VFFVNUVRazlZWDA1UFZGOURUMDVHU1VkVlVrVkVZQzRnUkc5M2JuTjBjbVZoYlNCd2NtOXFaV04wY3lBb1pTNW5MaUJCVEVaU1JVUXBYRzRnSUNBcUlITjFjSEJzZVNCMGFHVWdZV04wZFdGc0lGWk5JSE5oYm1SaWIzZ2dhVzF3YkdWdFpXNTBZWFJwYjI0dVhHNGdJQ0FxTDF4dUlDQmpiMlJsVTJGdVpHSnZlRVYyWVd4MVlYUnZjajg2SUVOdlpHVlRZVzVrWW05NFJYWmhiSFZoZEc5eU8xeHVJQ0F2S2lwY2JpQWdJQ29nVDNCMGFXOXVZV3dnWTJGc2JHSmhZMnNnYVc1MmIydGxaQ0JoZENCMGFHVWdaVzVrSUc5bUlHVnVaMmx1WlNCamIyNXpkSEoxWTNScGIyNGdkMmwwYUNCMGFHVmNiaUFnSUNvZ1puVnNiSGt0YVc1cGRHbGhiR2x6WldRZ1pXNW5hVzVsSUdsdWMzUmhibU5sTGlCVmMyVWdkR2hwY3lCMGJ5QnlaV2RwYzNSbGNpQmxlR1ZqZFhSdmNuTWdkR2hoZEZ4dUlDQWdLaUJ1WldWa0lHRWdZbUZqYXkxeVpXWmxjbVZ1WTJVZ2RHOGdkR2hsSUdWdVoybHVaU0FvWlM1bkxpQnNiMjl3SUdWNFpXTjFkRzl5Y3lCMGFHRjBJR1Y0WldOMWRHVmNiaUFnSUNvZ2MzVmlMWGR2Y210bWJHOTNjeUIwYUhKdmRXZG9JSFJvWlNCellXMWxJR1Z1WjJsdVpTa3VYRzRnSUNBcUwxeHVJQ0J2YmtWdVoybHVaVU55WldGMFpXUS9PaUFvWlc1bmFXNWxPaUJIY21Gd2FFVjRaV04xZEdsdmJrVnVaMmx1WlNrZ1BUNGdkbTlwWkR0Y2JuMWNibHh1THlvcVhHNGdLaUJTWldabGNtVnVZMlVnWjNKaGNHZ2daWGhsWTNWMGFXOXVJR1Z1WjJsdVpTNWNiaUFxWEc0Z0tpQkZlR1ZqZFhSbGN5QmhJSHRBYkdsdWF5QkhjbUZ3YUZkdmNtdG1iRzkzUkdWbWFXNXBkR2x2Ym4wZ1luazZYRzRnS2lBeExpQlFiR0Z1Ym1sdVp5QjBhR1VnZDI5eWEyWnNiM2NnYVc1MGJ5QjBiM0J2Ykc5bmFXTmhiQ0JzWVhsbGNuTXVYRzRnS2lBeUxpQlRaV1ZrYVc1bklIZHZjbXRtYkc5M0lHbHVjSFYwY3lCcGJuUnZJSFJvWlNCMllXeDFaU0J6ZEc5eVpTNWNiaUFxSURNdUlFVjRaV04xZEdsdVp5QnViMlJsY3lCc1lYbGxjaTFpZVMxc1lYbGxjaUIzYVhSb0lHTnZibVpwWjNWeVlXSnNaU0JqYjI1amRYSnlaVzVqZVM1Y2JpQXFJRFF1SUZKdmRYUnBibWNnZG1Gc2RXVnpJR0ZzYjI1bklHVmtaMlZ6TGx4dUlDb2dOUzRnUlcxcGRIUnBibWNnYzNSeWRXTjBkWEpsWkNCbGRtVnVkSE1nZEdoeWIzVm5hQ0JFWldOaFppZHpJRTlpYzJWeWRtRmliR1VnY0dsd1pXeHBibVV1WEc0Z0tpQTJMaUJTWlhSMWNtNXBibWNnWVNCamIyMXdiR1YwWlNCN1FHeHBibXNnUjNKaGNHaEZlR1ZqZFhScGIyNVNaWE4xYkhSOUxseHVJQ292WEc1bGVIQnZjblFnWTJ4aGMzTWdSM0poY0doRmVHVmpkWFJwYjI1RmJtZHBibVZjYmlBZ2FXMXdiR1Z0Wlc1MGN5QlBZbk5sY25aaFlteGxQRnRIY21Gd2FFVjRaV04xZEdsdmJrOWljMlZ5ZG1WeVhTd2dXMGR5WVhCb1JYaGxZM1YwYVc5dVJYWmxiblJkUGlCN1hHNGdJSEJ5YVhaaGRHVWdjbVZoWkc5dWJIa2daVzFwZEhSbGNqb2dSM0poY0doRmVHVmpkWFJwYjI1RmRtVnVkRVZ0YVhSMFpYSTdYRzRnSUhCeWFYWmhkR1VnY21WaFpHOXViSGtnY0d4aGJtNWxjam9nUjNKaGNHaEZlR1ZqZFhScGIyNVFiR0Z1Ym1WeU8xeHVJQ0J3Y21sMllYUmxJSEpsWVdSdmJteDVJSFpoYkhWbFUzUnZjbVZCWkdGd2RHVnlPaUJIY21Gd2FGWmhiSFZsVTNSdmNtVkJaR0Z3ZEdWeU8xeHVJQ0J3Y21sMllYUmxJSEpsWVdSdmJteDVJR1JsWm1GMWJIUlBjSFJwYjI1ek9pQlFZWEowYVdGc1BFZHlZWEJvUlhobFkzVjBhVzl1VDNCMGFXOXVjejQ3WEc0Z0lDOHFLaUJRYkhWbloyRmliR1VnWTI5a1pTQnpZVzVrWW05NElHVjJZV3gxWVhSdmNpQW93cWN5TWk0MEtUc2diV0Y1SUdKbElIVnVaR1ZtYVc1bFpDNGdLaTljYmlBZ2NtVmhaRzl1YkhrZ1kyOWtaVk5oYm1SaWIzaEZkbUZzZFdGMGIzSS9PaUJEYjJSbFUyRnVaR0p2ZUVWMllXeDFZWFJ2Y2p0Y2JseHVJQ0JqYjI1emRISjFZM1J2Y2loamIyNW1hV2M2SUVkeVlYQm9SWGhsWTNWMGFXOXVSVzVuYVc1bFEyOXVabWxuS1NCN1hHNGdJQ0FnZEdocGN5NWxiV2wwZEdWeUlEMGdZMjl1Wm1sbkxtVjJaVzUwUlcxcGRIUmxjaUEvUHlCdVpYY2dSM0poY0doRmVHVmpkWFJwYjI1RmRtVnVkRVZ0YVhSMFpYSW9LVHRjYmlBZ0lDQjBhR2x6TG5Cc1lXNXVaWElnUFNCamIyNW1hV2N1Y0d4aGJtNWxjaUEvUHlCdVpYY2dSM0poY0doRmVHVmpkWFJwYjI1UWJHRnVibVZ5S0NrN1hHNGdJQ0FnZEdocGN5NTJZV3gxWlZOMGIzSmxRV1JoY0hSbGNpQTlYRzRnSUNBZ0lDQmpiMjVtYVdjdWRtRnNkV1ZUZEc5eVpVRmtZWEIwWlhJZ1B6OGdibVYzSUVsdVRXVnRiM0o1UjNKaGNHaFdZV3gxWlZOMGIzSmxRV1JoY0hSbGNpZ3BPMXh1SUNBZ0lIUm9hWE11WkdWbVlYVnNkRTl3ZEdsdmJuTWdQU0JqYjI1bWFXY3VaR1ZtWVhWc2RFOXdkR2x2Ym5NZ1B6OGdlMzA3WEc0Z0lDQWdkR2hwY3k1amIyUmxVMkZ1WkdKdmVFVjJZV3gxWVhSdmNpQTlJR052Ym1acFp5NWpiMlJsVTJGdVpHSnZlRVYyWVd4MVlYUnZjanRjYmlBZ0lDQjBhR2x6TG1OdmJtWnBaeUE5SUdOdmJtWnBaenRjYmlBZ0lDQmpiMjVtYVdjdWIyNUZibWRwYm1WRGNtVmhkR1ZrUHk0b2RHaHBjeWs3WEc0Z0lIMWNibHh1SUNCd2NtbDJZWFJsSUhKbFlXUnZibXg1SUdOdmJtWnBaem9nUjNKaGNHaEZlR1ZqZFhScGIyNUZibWRwYm1WRGIyNW1hV2M3WEc1Y2JpQWdiMkp6WlhKMlpTaHZZbk5sY25abGNqb2dSM0poY0doRmVHVmpkWFJwYjI1UFluTmxjblpsY2lrNklDZ3BJRDArSUhadmFXUWdlMXh1SUNBZ0lISmxkSFZ5YmlCMGFHbHpMbVZ0YVhSMFpYSXViMkp6WlhKMlpTaHZZbk5sY25abGNpazdYRzRnSUgxY2JseHVJQ0IxYms5aWMyVnlkbVVvYjJKelpYSjJaWEk2SUVkeVlYQm9SWGhsWTNWMGFXOXVUMkp6WlhKMlpYSXBPaUIyYjJsa0lIdGNiaUFnSUNCMGFHbHpMbVZ0YVhSMFpYSXVkVzVQWW5ObGNuWmxLRzlpYzJWeWRtVnlLVHRjYmlBZ2ZWeHVYRzRnSUdGemVXNWpJSFZ3WkdGMFpVOWljMlZ5ZG1WeWN5aGxkbVZ1ZERvZ1IzSmhjR2hGZUdWamRYUnBiMjVGZG1WdWRDazZJRkJ5YjIxcGMyVThkbTlwWkQ0Z2UxeHVJQ0FnSUdGM1lXbDBJSFJvYVhNdVpXMXBkSFJsY2k1MWNHUmhkR1ZQWW5ObGNuWmxjbk1vWlhabGJuUXBPMXh1SUNCOVhHNWNiaUFnTHlvcVhHNGdJQ0FxSUVWNFpXTjFkR1Z6SUdFZ2QyOXlhMlpzYjNjZ2QybDBhQ0IwYUdVZ1oybDJaVzRnYVc1d2RYUnpJR0Z1WkNCdmNIUnBiMjV6TGx4dUlDQWdLaTljYmlBZ1lYTjVibU1nWlhobFkzVjBaU2hjYmlBZ0lDQjNiM0pyWm14dmR6b2dSM0poY0doWGIzSnJabXh2ZDBSbFptbHVhWFJwYjI0c1hHNGdJQ0FnYVc1d2RYUnpPaUJIY21Gd2FFVjRaV04xZEdsdmJsWmhiSFZsY3lBOUlIdDlMRnh1SUNBZ0lHOXdkR2x2Ym5NNklFZHlZWEJvUlhobFkzVjBhVzl1VDNCMGFXOXVjeUE5SUh0OVhHNGdJQ2s2SUZCeWIyMXBjMlU4UjNKaGNHaEZlR1ZqZFhScGIyNVNaWE4xYkhRK0lIdGNiaUFnSUNCamIyNXpkQ0J2Y0hSeklEMGdkR2hwY3k1dFpYSm5aVTl3ZEdsdmJuTW9iM0IwYVc5dWN5azdYRzRnSUNBZ1kyOXVjM1FnY25WdVNXUWdQU0J2Y0hSekxuSjFia2xrSUQ4L0lIUm9hWE11WjJWdVpYSmhkR1ZTZFc1SlpDZ3BPMXh1SUNBZ0lHTnZibk4wSUhCaGRHZ2dQU0J2Y0hSekxuQmhkR2dnUHo4Z1cxMDdYRzRnSUNBZ1kyOXVjM1FnWlhabGJuUkdZV04wYjNKNUlEMGdibVYzSUVkeVlYQm9SWGhsWTNWMGFXOXVSWFpsYm5SR1lXTjBiM0o1S0NrN1hHNGdJQ0FnWTI5dWMzUWdkbUZzZFdWVGRHOXlaU0E5SUc1bGR5QkhjbUZ3YUZaaGJIVmxVM1J2Y21Vb2RHaHBjeTUyWVd4MVpWTjBiM0psUVdSaGNIUmxjaWs3WEc0Z0lDQWdkbUZzZFdWVGRHOXlaUzV6WldWa1YyOXlhMlpzYjNkSmJuQjFkSE1vYVc1d2RYUnpLVHRjYmx4dUlDQWdJR052Ym5OMElIQnNZVzRnUFNCMGFHbHpMbkJzWVc1dVpYSXVjR3hoYmloM2IzSnJabXh2ZHlrN1hHNGdJQ0FnWTI5dWMzUWdabkpoYldVZ1BTQnVaWGNnUjNKaGNHaEZlR1ZqZFhScGIyNUdjbUZ0WlNoY2JpQWdJQ0FnSUhKMWJrbGtMRnh1SUNBZ0lDQWdjR3hoYml4Y2JpQWdJQ0FnSUhaaGJIVmxVM1J2Y21Vc1hHNGdJQ0FnSUNCbGRtVnVkRVpoWTNSdmNubGNiaUFnSUNBcE8xeHVYRzRnSUNBZ1kyOXVjM1FnWlcxcGRFWnVJRDBnWVhONWJtTWdLSEJoY25ScFlXdzZJRkJoY25ScFlXdzhSM0poY0doRmVHVmpkWFJwYjI1RmRtVnVkRDRwSUQwK0lIdGNiaUFnSUNBZ0lHRjNZV2wwSUhSb2FYTXVaVzFwZEVWMlpXNTBLR1p5WVcxbExDQjdYRzRnSUNBZ0lDQWdJSFI1Y0dVNklIQmhjblJwWVd3dWRIbHdaU0EvUHlCSGNtRndhRVY0WldOMWRHbHZia1YyWlc1MFZIbHdaUzVPVDBSRlgwOVZWRkJWVkN4Y2JpQWdJQ0FnSUNBZ2NuVnVTV1FzWEc0Z0lDQWdJQ0FnSUhCaGNtVnVkRkoxYmtsa09pQnZjSFJ6TG5CaGNtVnVkRkoxYmtsa0xGeHVJQ0FnSUNBZ0lDQjNiM0pyWm14dmQwbGtPaUIzYjNKclpteHZkeTV1WVcxbExGeHVJQ0FnSUNBZ0lDQnViMlJsU1dRNklIQmhjblJwWVd3dWJtOWtaVWxrTEZ4dUlDQWdJQ0FnSUNCd1lYUm9PaUJ3WVhKMGFXRnNMbkJoZEdnZ1B6OGdjR0YwYUN4Y2JpQWdJQ0FnSUNBZ0xpNHVjR0Z5ZEdsaGJDeGNiaUFnSUNBZ0lIMHBPMXh1SUNBZ0lIMDdYRzVjYmlBZ0lDQmhkMkZwZENCMGFHbHpMbVZ0YVhSRmRtVnVkQ2htY21GdFpTd2dlMXh1SUNBZ0lDQWdkSGx3WlRvZ1IzSmhjR2hGZUdWamRYUnBiMjVGZG1WdWRGUjVjR1V1VjA5U1MwWk1UMWRmVTFSQlVsUkZSQ3hjYmlBZ0lDQWdJSEoxYmtsa0xGeHVJQ0FnSUNBZ2NHRnlaVzUwVW5WdVNXUTZJRzl3ZEhNdWNHRnlaVzUwVW5WdVNXUXNYRzRnSUNBZ0lDQjNiM0pyWm14dmQwbGtPaUIzYjNKclpteHZkeTV1WVcxbExGeHVJQ0FnSUNBZ2NHRjBhQ3hjYmlBZ0lDQWdJSE4wWVhSMWN6b2dSM0poY0doRmVHVmpkWFJwYjI1VGRHRjBkWE11VWxWT1RrbE9SeXhjYmlBZ0lDQWdJSEJoZVd4dllXUTZJSHNnYVc1d2RYUnpJSDBzWEc0Z0lDQWdmU2s3WEc1Y2JpQWdJQ0JoZDJGcGRDQjBhR2x6TG1WdGFYUkZkbVZ1ZENobWNtRnRaU3dnZTF4dUlDQWdJQ0FnZEhsd1pUb2dSM0poY0doRmVHVmpkWFJwYjI1RmRtVnVkRlI1Y0dVdVYwOVNTMFpNVDFkZlVFeEJUazVGUkN4Y2JpQWdJQ0FnSUhKMWJrbGtMRnh1SUNBZ0lDQWdjR0Z5Wlc1MFVuVnVTV1E2SUc5d2RITXVjR0Z5Wlc1MFVuVnVTV1FzWEc0Z0lDQWdJQ0IzYjNKclpteHZkMGxrT2lCM2IzSnJabXh2ZHk1dVlXMWxMRnh1SUNBZ0lDQWdjR0YwYUN4Y2JpQWdJQ0FnSUhOMFlYUjFjem9nUjNKaGNHaEZlR1ZqZFhScGIyNVRkR0YwZFhNdVVFeEJUazVKVGtjc1hHNGdJQ0FnSUNCd1lYbHNiMkZrT2lCN0lHeGhlV1Z5Y3pvZ2NHeGhiaTVzWVhsbGNuTXViR1Z1WjNSb0xDQnViMlJsY3pvZ2NHeGhiaTV1YjJSbGN5NXNaVzVuZEdnZ2ZTeGNiaUFnSUNCOUtUdGNibHh1SUNBZ0lIUnllU0I3WEc0Z0lDQWdJQ0JtYjNJZ0tHTnZibk4wSUd4aGVXVnlJRzltSUhCc1lXNHViR0Y1WlhKektTQjdYRzRnSUNBZ0lDQWdJR0YzWVdsMElIUm9hWE11WlhobFkzVjBaVXhoZVdWeUtHWnlZVzFsTENCd2JHRnVMQ0JzWVhsbGNpNXViMlJsY3l3Z2IzQjBjeXdnWlcxcGRFWnVLVHRjYmlBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnWm5KaGJXVXVabWx1YVhOb0tDazdYRzVjYmlBZ0lDQWdJR0YzWVdsMElIUm9hWE11WlcxcGRFVjJaVzUwS0daeVlXMWxMQ0I3WEc0Z0lDQWdJQ0FnSUhSNWNHVTZJRWR5WVhCb1JYaGxZM1YwYVc5dVJYWmxiblJVZVhCbExsZFBVa3RHVEU5WFgwTlBUVkJNUlZSRlJDeGNiaUFnSUNBZ0lDQWdjblZ1U1dRc1hHNGdJQ0FnSUNBZ0lIQmhjbVZ1ZEZKMWJrbGtPaUJ2Y0hSekxuQmhjbVZ1ZEZKMWJrbGtMRnh1SUNBZ0lDQWdJQ0IzYjNKclpteHZkMGxrT2lCM2IzSnJabXh2ZHk1dVlXMWxMRnh1SUNBZ0lDQWdJQ0J3WVhSb0xGeHVJQ0FnSUNBZ0lDQnpkR0YwZFhNNklFZHlZWEJvUlhobFkzVjBhVzl1VTNSaGRIVnpMbE5WUTBORlJVUkZSQ3hjYmlBZ0lDQWdJQ0FnY0dGNWJHOWhaRG9nZXlCdmRYUndkWFJ6T2lCMllXeDFaVk4wYjNKbExtZGxkRmR2Y210bWJHOTNWbUZzZFdWektDa2dmU3hjYmlBZ0lDQWdJSDBwTzF4dVhHNGdJQ0FnSUNCeVpYUjFjbTRnWW5WcGJHUkhjbUZ3YUVWNFpXTjFkR2x2YmxKbGMzVnNkQ2hjYmlBZ0lDQWdJQ0FnWm5KaGJXVXNYRzRnSUNBZ0lDQWdJSGR2Y210bWJHOTNMRnh1SUNBZ0lDQWdJQ0JwYm5CMWRITXNYRzRnSUNBZ0lDQWdJRWR5WVhCb1JYaGxZM1YwYVc5dVUzUmhkSFZ6TGxOVlEwTkZSVVJGUkN4Y2JpQWdJQ0FnSUNBZ2IzQjBjeTV0WlhSaFpHRjBZVnh1SUNBZ0lDQWdLVHRjYmlBZ0lDQjlJR05oZEdOb0lDaGxjbkp2Y2lrZ2UxeHVJQ0FnSUNBZ1puSmhiV1V1Wm1sdWFYTm9LQ2s3WEc0Z0lDQWdJQ0JqYjI1emRDQmxjbkp2Y2xCaGVXeHZZV1FnUFNCMGFHbHpMblJ2UlhKeWIzSlFZWGxzYjJGa0tHVnljbTl5S1R0Y2JseHVJQ0FnSUNBZ1lYZGhhWFFnZEdocGN5NWxiV2wwUlhabGJuUW9abkpoYldVc0lIdGNiaUFnSUNBZ0lDQWdkSGx3WlRvZ1IzSmhjR2hGZUdWamRYUnBiMjVGZG1WdWRGUjVjR1V1VjA5U1MwWk1UMWRmUmtGSlRFVkVMRnh1SUNBZ0lDQWdJQ0J5ZFc1SlpDeGNiaUFnSUNBZ0lDQWdjR0Z5Wlc1MFVuVnVTV1E2SUc5d2RITXVjR0Z5Wlc1MFVuVnVTV1FzWEc0Z0lDQWdJQ0FnSUhkdmNtdG1iRzkzU1dRNklIZHZjbXRtYkc5M0xtNWhiV1VzWEc0Z0lDQWdJQ0FnSUhCaGRHZ3NYRzRnSUNBZ0lDQWdJSE4wWVhSMWN6b2dSM0poY0doRmVHVmpkWFJwYjI1VGRHRjBkWE11UmtGSlRFVkVMRnh1SUNBZ0lDQWdJQ0JsY25KdmNqb2daWEp5YjNKUVlYbHNiMkZrTEZ4dUlDQWdJQ0FnZlNrN1hHNWNiaUFnSUNBZ0lISmxkSFZ5YmlCaWRXbHNaRWR5WVhCb1JYaGxZM1YwYVc5dVVtVnpkV3gwS0Z4dUlDQWdJQ0FnSUNCbWNtRnRaU3hjYmlBZ0lDQWdJQ0FnZDI5eWEyWnNiM2NzWEc0Z0lDQWdJQ0FnSUdsdWNIVjBjeXhjYmlBZ0lDQWdJQ0FnUjNKaGNHaEZlR1ZqZFhScGIyNVRkR0YwZFhNdVJrRkpURVZFTEZ4dUlDQWdJQ0FnSUNCdmNIUnpMbTFsZEdGa1lYUmhYRzRnSUNBZ0lDQXBPMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJQzhxS2x4dUlDQWdLaUJRYVc1eklHRWdibTlrWlNCaGJtUWdhWFJ6SUhWd2MzUnlaV0Z0SUdSbGNHVnVaR1Z1WTJsbGN5QmhablJsY2lCaElHTnZiWEJzWlhSbFpDQnlkVzR1WEc0Z0lDQXFYRzRnSUNBcUlFUmxiR1ZuWVhSbGN5QjBieUI3UUd4cGJtc2dSM0poY0doUWFXNXVhVzVuVTJWeWRtbGpaWDB1SUZSb1pTQndiR0Z1SUdGdVpDQnlaWE4xYkhRZ2JYVnpkQ0JqYjIxbFhHNGdJQ0FxSUdaeWIyMGdZU0J3Y21sdmNpQnpkV05qWlhOelpuVnNJR1Y0WldOMWRHbHZiaUJ2WmlCMGFHVWdjMkZ0WlNCM2IzSnJabXh2ZHk1Y2JpQWdJQ292WEc0Z0lHRnplVzVqSUhCcGJrNXZaR1VvYjNCMGFXOXVjem9nUjNKaGNHaFFhVzVPYjJSbFQzQjBhVzl1Y3lrNklGQnliMjFwYzJVOGRtOXBaRDRnZTF4dUlDQWdJR052Ym5OMElITmxjblpwWTJVZ1BTQjBhR2x6TG1OeVpXRjBaVkJwYm01cGJtZFRaWEoyYVdObEtDazdYRzRnSUNBZ1lYZGhhWFFnYzJWeWRtbGpaUzV3YVc1T2IyUmxLRzl3ZEdsdmJuTXBPMXh1SUNBZ0lHRjNZV2wwSUhSb2FYTXVaVzFwZEZCcGJtNXBibWRGZG1WdWRDaHZjSFJwYjI1ekxtNXZaR1ZKWkN3Z1IzSmhjR2hGZUdWamRYUnBiMjVGZG1WdWRGUjVjR1V1VGs5RVJWOVFTVTVPUlVRcE8xeHVJQ0I5WEc1Y2JpQWdMeW9xWEc0Z0lDQXFJRlZ1Y0dsdWN5QmhJRzV2WkdVZ1lua2dhWFJ6SUdacGJtZGxjbkJ5YVc1MExseHVJQ0FnS2k5Y2JpQWdZWE41Ym1NZ2RXNXdhVzVPYjJSbEtHOXdkR2x2Ym5NNklFZHlZWEJvVlc1d2FXNU9iMlJsVDNCMGFXOXVjeWs2SUZCeWIyMXBjMlU4ZG05cFpENGdlMXh1SUNBZ0lHTnZibk4wSUhObGNuWnBZMlVnUFNCMGFHbHpMbU55WldGMFpWQnBibTVwYm1kVFpYSjJhV05sS0NrN1hHNGdJQ0FnWVhkaGFYUWdjMlZ5ZG1salpTNTFibkJwYms1dlpHVW9iM0IwYVc5dWN5azdYRzRnSUNBZ1lYZGhhWFFnZEdocGN5NWxiV2wwVUdsdWJtbHVaMFYyWlc1MEtHOXdkR2x2Ym5NdWJtOWtaVWxrTENCSGNtRndhRVY0WldOMWRHbHZia1YyWlc1MFZIbHdaUzVPVDBSRlgxVk9VRWxPVGtWRUtUdGNiaUFnZlZ4dVhHNGdJQzhxS2x4dUlDQWdLaUJEY21WaGRHVnpJR0VnZTBCc2FXNXJJRWR5WVhCb1VHbHVibWx1WjFObGNuWnBZMlY5SUdKaFkydGxaQ0JpZVNCMGFHbHpJR1Z1WjJsdVpTZHpJSFpoYkhWbElITjBiM0psWEc0Z0lDQXFJR0ZrWVhCMFpYSXVYRzRnSUNBcUwxeHVJQ0J3Y21sMllYUmxJR055WldGMFpWQnBibTVwYm1kVFpYSjJhV05sS0NrNklFZHlZWEJvVUdsdWJtbHVaMU5sY25acFkyVWdlMXh1SUNBZ0lHTnZibk4wSUhOMGIzSmxJRDBnYm1WM0lFZHlZWEJvVm1Gc2RXVlRkRzl5WlNoMGFHbHpMblpoYkhWbFUzUnZjbVZCWkdGd2RHVnlLVHRjYmlBZ0lDQnlaWFIxY200Z2JtVjNJRWR5WVhCb1VHbHVibWx1WjFObGNuWnBZMlVvWEc0Z0lDQWdJQ0J6ZEc5eVpTeGNiaUFnSUNBZ0lHNWxkeUJIY21Gd2FGQnBibTVwYm1kUWIyeHBZM2tvS1N4Y2JpQWdJQ0FnSUc1bGR5QkhjbUZ3YUZCcGJtNXBibWRFWlhCbGJtUmxibU41VW1WemIyeDJaWElvS1Z4dUlDQWdJQ2s3WEc0Z0lIMWNibHh1SUNBdktpcGNiaUFnSUNvZ1JXMXBkSE1nWVNCd2FXNXVhVzVuTFhKbGJHRjBaV1FnWlhabGJuUWdkRzhnWVd4c0lHOWljMlZ5ZG1WeWN5NWNiaUFnSUNvdlhHNGdJSEJ5YVhaaGRHVWdZWE41Ym1NZ1pXMXBkRkJwYm01cGJtZEZkbVZ1ZENoY2JpQWdJQ0J1YjJSbFNXUTZJSE4wY21sdVp5eGNiaUFnSUNCMGVYQmxPaUJIY21Gd2FFVjRaV04xZEdsdmJrVjJaVzUwVkhsd1pWeHVJQ0FwT2lCUWNtOXRhWE5sUEhadmFXUStJSHRjYmlBZ0lDQmpiMjV6ZENCbVlXTjBiM0o1SUQwZ2JtVjNJRWR5WVhCb1JYaGxZM1YwYVc5dVJYWmxiblJHWVdOMGIzSjVLQ2s3WEc0Z0lDQWdZMjl1YzNRZ1pYWmxiblFnUFNCbVlXTjBiM0o1TG1OeVpXRjBaU2g3WEc0Z0lDQWdJQ0JwWkRvZ1hDSmNJaXhjYmlBZ0lDQWdJSE5sY1hWbGJtTmxPaUF3TEZ4dUlDQWdJQ0FnZEdsdFpYTjBZVzF3T2lCdVpYY2dSR0YwWlNncExGeHVJQ0FnSUNBZ2NuVnVTV1E2SUZ3aWNHbHVibWx1WjF3aUxGeHVJQ0FnSUNBZ2QyOXlhMlpzYjNkSlpEb2dYQ0pjSWl4Y2JpQWdJQ0FnSUhSNWNHVXNYRzRnSUNBZ0lDQnViMlJsU1dRc1hHNGdJQ0FnSUNCd1lYUm9PaUJiWFN4Y2JpQWdJQ0I5SUdGeklFOXRhWFE4UjNKaGNHaEZlR1ZqZFhScGIyNUZkbVZ1ZEN3Z1hDSnBaRndpSUh3Z1hDSnpaWEYxWlc1alpWd2lJSHdnWENKMGFXMWxjM1JoYlhCY0lqNHBPMXh1SUNBZ0lHRjNZV2wwSUhSb2FYTXVaVzFwZEhSbGNpNTFjR1JoZEdWUFluTmxjblpsY25Nb1pYWmxiblFwTzF4dUlDQjlYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFVjRaV04xZEdWeklHRWdiR0Y1WlhJZ2IyWWdibTlrWlhNZ2QybDBhQ0IwYUdVZ1kyOXVabWxuZFhKbFpDQmpiMjVqZFhKeVpXNWplUzVjYmlBZ0lDb3ZYRzRnSUhCeWFYWmhkR1VnWVhONWJtTWdaWGhsWTNWMFpVeGhlV1Z5S0Z4dUlDQWdJR1p5WVcxbE9pQkhjbUZ3YUVWNFpXTjFkR2x2YmtaeVlXMWxMRnh1SUNBZ0lIQnNZVzQ2SUVkeVlYQm9SWGhsWTNWMGFXOXVVR3hoYml4Y2JpQWdJQ0J1YjJSbGN6b2dSM0poY0doRmVHVmpkWFJwYjI1UWJHRnVUbTlrWlZ0ZExGeHVJQ0FnSUc5d2RITTZJRWR5WVhCb1JYaGxZM1YwYVc5dVQzQjBhVzl1Y3l4Y2JpQWdJQ0JsYldsMFJtNDZJQ2hsZG1WdWREb2dVR0Z5ZEdsaGJEeEhjbUZ3YUVWNFpXTjFkR2x2YmtWMlpXNTBQaWtnUFQ0Z1VISnZiV2x6WlR4MmIybGtQbHh1SUNBcE9pQlFjbTl0YVhObFBIWnZhV1ErSUh0Y2JpQWdJQ0JqYjI1emRDQmpiMjVqZFhKeVpXNWplU0E5SUUxaGRHZ3ViV0Y0S0Z4dUlDQWdJQ0FnTVN4Y2JpQWdJQ0FnSUc5d2RITXVZMjl1WTNWeWNtVnVZM2tnUHo4Z1IxSkJVRWhmUkVWR1FWVk1WRjlEVDA1RFZWSlNSVTVEV1Z4dUlDQWdJQ2s3WEc0Z0lDQWdZMjl1YzNRZ2NYVmxkV1VnUFNCYkxpNHVibTlrWlhOZE8xeHVYRzRnSUNBZ2QyaHBiR1VnS0hGMVpYVmxMbXhsYm1kMGFDQStJREFwSUh0Y2JpQWdJQ0FnSUdOdmJuTjBJR0poZEdOb0lEMGdjWFZsZFdVdWMzQnNhV05sS0RBc0lHTnZibU4xY25KbGJtTjVLVHRjYmlBZ0lDQWdJR0YzWVdsMElGQnliMjFwYzJVdVlXeHNLRnh1SUNBZ0lDQWdJQ0JpWVhSamFDNXRZWEFvS0c1dlpHVXBJRDArSUhSb2FYTXVaWGhsWTNWMFpVNXZaR1VvWm5KaGJXVXNJSEJzWVc0c0lHNXZaR1VzSUc5d2RITXNJR1Z0YVhSR2Jpa3BYRzRnSUNBZ0lDQXBPMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJQzhxS2x4dUlDQWdLaUJGZUdWamRYUmxjeUJoSUhOcGJtZHNaU0J1YjJSbExseHVJQ0FnS2k5Y2JpQWdjSEpwZG1GMFpTQmhjM2x1WXlCbGVHVmpkWFJsVG05a1pTaGNiaUFnSUNCbWNtRnRaVG9nUjNKaGNHaEZlR1ZqZFhScGIyNUdjbUZ0WlN4Y2JpQWdJQ0J3YkdGdU9pQkhjbUZ3YUVWNFpXTjFkR2x2YmxCc1lXNHNYRzRnSUNBZ2NHeGhiazV2WkdVNklFZHlZWEJvUlhobFkzVjBhVzl1VUd4aGJrNXZaR1VzWEc0Z0lDQWdiM0IwY3pvZ1IzSmhjR2hGZUdWamRYUnBiMjVQY0hScGIyNXpMRnh1SUNBZ0lHVnRhWFJHYmpvZ0tHVjJaVzUwT2lCUVlYSjBhV0ZzUEVkeVlYQm9SWGhsWTNWMGFXOXVSWFpsYm5RK0tTQTlQaUJRY205dGFYTmxQSFp2YVdRK1hHNGdJQ2s2SUZCeWIyMXBjMlU4ZG05cFpENGdlMXh1SUNBZ0lHTnZibk4wSUhOMFlYSjBaV1JCZENBOUlHNWxkeUJFWVhSbEtDazdYRzRnSUNBZ1kyOXVjM1FnYm05a1pWQmhkR2dnUFNCYkxpNHVLRzl3ZEhNdWNHRjBhQ0EvUHlCYlhTa3NJSEJzWVc1T2IyUmxMbWxrWFR0Y2JseHVJQ0FnSUdGM1lXbDBJSFJvYVhNdVpXMXBkRVYyWlc1MEtHWnlZVzFsTENCN1hHNGdJQ0FnSUNCMGVYQmxPaUJIY21Gd2FFVjRaV04xZEdsdmJrVjJaVzUwVkhsd1pTNU9UMFJGWDFOVVFWSlVSVVFzWEc0Z0lDQWdJQ0J5ZFc1SlpEb2dabkpoYldVdWNuVnVTV1FzWEc0Z0lDQWdJQ0IzYjNKclpteHZkMGxrT2lCd2JHRnVMbmR2Y210bWJHOTNTV1FzWEc0Z0lDQWdJQ0J1YjJSbFNXUTZJSEJzWVc1T2IyUmxMbWxrTEZ4dUlDQWdJQ0FnY0dGMGFEb2dibTlrWlZCaGRHZ3NYRzRnSUNBZ0lDQnpkR0YwZFhNNklFZHlZWEJvUlhobFkzVjBhVzl1VTNSaGRIVnpMbEpWVGs1SlRrY3NYRzRnSUNBZ2ZTazdYRzVjYmlBZ0lDQmpiMjV6ZENCcGJuQjFkSE1nUFNCMGFHbHpMbkpsYzI5c2RtVk9iMlJsU1c1d2RYUnpLR1p5WVcxbExDQndiR0Z1TENCd2JHRnVUbTlrWlNrN1hHNWNiaUFnSUNBdkx5QkRZV05vWlMxb2FYUTZJR05vWldOcklHWnZjaUJoSUhCcGJtNWxaQ0IyWVd4MVpTQmlaV1p2Y21VZ1pYaGxZM1YwYVc1bklIUm9aU0J1YjJSbFhHNGdJQ0FnYVdZZ0tHOXdkSE11ZFhObFVHbHVibVZrVm1Gc2RXVnpLU0I3WEc0Z0lDQWdJQ0JqYjI1emRDQmpZV05vWldRZ1BTQmhkMkZwZENCMGFHbHpMblJ5ZVZCcGJtNWxaRlpoYkhWbEtHWnlZVzFsTENCd2JHRnVMQ0J3YkdGdVRtOWtaU3dnYVc1d2RYUnpLVHRjYmlBZ0lDQWdJR2xtSUNoallXTm9aV1FwSUh0Y2JpQWdJQ0FnSUNBZ1puSmhiV1V1ZG1Gc2RXVlRkRzl5WlM1elpYUk9iMlJsVDNWMGNIVjBjeWh3YkdGdVRtOWtaUzVwWkN3Z1kyRmphR1ZrTG05MWRIQjFkSE1wTzF4dUlDQWdJQ0FnSUNCMGFHbHpMbkp2ZFhSbFQzVjBaMjlwYm1kRlpHZGxjeWhtY21GdFpTd2djR3hoYml3Z2NHeGhiazV2WkdVc0lHTmhZMmhsWkM1dmRYUndkWFJ6S1R0Y2JseHVJQ0FnSUNBZ0lDQmpiMjV6ZENCbWFXNXBjMmhsWkVGMElEMGdibVYzSUVSaGRHVW9LVHRjYmlBZ0lDQWdJQ0FnWTI5dWMzUWdjbVZ6ZFd4ME9pQkhjbUZ3YUU1dlpHVkZlR1ZqZFhScGIyNVNaWE4xYkhRZ1BTQjdYRzRnSUNBZ0lDQWdJQ0FnYm05a1pVbGtPaUJ3YkdGdVRtOWtaUzVwWkN4Y2JpQWdJQ0FnSUNBZ0lDQnpkR0YwZFhNNklFZHlZWEJvUlhobFkzVjBhVzl1VTNSaGRIVnpMa05CUTBoRlJDeGNiaUFnSUNBZ0lDQWdJQ0JwYm5CMWRITXNYRzRnSUNBZ0lDQWdJQ0FnYjNWMGNIVjBjem9nWTJGamFHVmtMbTkxZEhCMWRITXNYRzRnSUNBZ0lDQWdJQ0FnYzNSaGNuUmxaRUYwTEZ4dUlDQWdJQ0FnSUNBZ0lHWnBibWx6YUdWa1FYUXNYRzRnSUNBZ0lDQWdJQ0FnWm5KdmJVTmhZMmhsT2lCMGNuVmxMRnh1SUNBZ0lDQWdJQ0FnSUhCcGJtNWxaRG9nZEhKMVpTeGNiaUFnSUNBZ0lDQWdJQ0JsZG1WdWRITTZJRnRkTEZ4dUlDQWdJQ0FnSUNCOU8xeHVJQ0FnSUNBZ0lDQm1jbUZ0WlM1eVpXTnZjbVJPYjJSbFVtVnpkV3gwS0hKbGMzVnNkQ2s3WEc1Y2JpQWdJQ0FnSUNBZ1lYZGhhWFFnZEdocGN5NWxiV2wwUlhabGJuUW9abkpoYldVc0lIdGNiaUFnSUNBZ0lDQWdJQ0IwZVhCbE9pQkhjbUZ3YUVWNFpXTjFkR2x2YmtWMlpXNTBWSGx3WlM1T1QwUkZYME5CUTBoRlgwaEpWQ3hjYmlBZ0lDQWdJQ0FnSUNCeWRXNUpaRG9nWm5KaGJXVXVjblZ1U1dRc1hHNGdJQ0FnSUNBZ0lDQWdkMjl5YTJac2IzZEpaRG9nY0d4aGJpNTNiM0pyWm14dmQwbGtMRnh1SUNBZ0lDQWdJQ0FnSUc1dlpHVkpaRG9nY0d4aGJrNXZaR1V1YVdRc1hHNGdJQ0FnSUNBZ0lDQWdjR0YwYURvZ2JtOWtaVkJoZEdnc1hHNGdJQ0FnSUNBZ0lDQWdjM1JoZEhWek9pQkhjbUZ3YUVWNFpXTjFkR2x2YmxOMFlYUjFjeTVEUVVOSVJVUXNYRzRnSUNBZ0lDQWdJQ0FnY0dGNWJHOWhaRG9nZXlCdmRYUndkWFJ6T2lCallXTm9aV1F1YjNWMGNIVjBjeUI5TEZ4dUlDQWdJQ0FnSUNCOUtUdGNibHh1SUNBZ0lDQWdJQ0JoZDJGcGRDQjBhR2x6TG1WdGFYUkZkbVZ1ZENobWNtRnRaU3dnZTF4dUlDQWdJQ0FnSUNBZ0lIUjVjR1U2SUVkeVlYQm9SWGhsWTNWMGFXOXVSWFpsYm5SVWVYQmxMazVQUkVWZlEwOU5VRXhGVkVWRUxGeHVJQ0FnSUNBZ0lDQWdJSEoxYmtsa09pQm1jbUZ0WlM1eWRXNUpaQ3hjYmlBZ0lDQWdJQ0FnSUNCM2IzSnJabXh2ZDBsa09pQndiR0Z1TG5kdmNtdG1iRzkzU1dRc1hHNGdJQ0FnSUNBZ0lDQWdibTlrWlVsa09pQndiR0Z1VG05a1pTNXBaQ3hjYmlBZ0lDQWdJQ0FnSUNCd1lYUm9PaUJ1YjJSbFVHRjBhQ3hjYmlBZ0lDQWdJQ0FnSUNCemRHRjBkWE02SUVkeVlYQm9SWGhsWTNWMGFXOXVVM1JoZEhWekxsTlZRME5GUlVSRlJDeGNiaUFnSUNBZ0lDQWdJQ0J3WVhsc2IyRmtPaUI3SUc5MWRIQjFkSE02SUdOaFkyaGxaQzV2ZFhSd2RYUnpMQ0JtY205dFEyRmphR1U2SUhSeWRXVWdmU3hjYmlBZ0lDQWdJQ0FnZlNrN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5Ymp0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc1Y2JpQWdJQ0IwY25rZ2UxeHVJQ0FnSUNBZ1kyOXVjM1FnWlhobFkzVjBiM0lnUFNCMGFHbHpMbU52Ym1acFp5NXlaV2RwYzNSeWVTNXlaWE52YkhabEtIQnNZVzVPYjJSbExtdHBibVFwTzF4dUlDQWdJQ0FnWTI5dWMzUWdZMjl1ZEdWNGRDQTlJRzVsZHlCSGNtRndhRVY0WldOMWRHbHZia052Ym5SbGVIUW9YRzRnSUNBZ0lDQWdJR1p5WVcxbExuSjFia2xrTEZ4dUlDQWdJQ0FnSUNCdmNIUnpMbkJoY21WdWRGSjFia2xrTEZ4dUlDQWdJQ0FnSUNCd2JHRnVMbmR2Y210bWJHOTNMRnh1SUNBZ0lDQWdJQ0J3YkdGdVRtOWtaUzVrWldacGJtbDBhVzl1TEZ4dUlDQWdJQ0FnSUNCdWIyUmxVR0YwYUN4Y2JpQWdJQ0FnSUNBZ1pXMXBkRVp1TEZ4dUlDQWdJQ0FnSUNCdmNIUnpMbTFsZEdGa1lYUmhYRzRnSUNBZ0lDQXBPMXh1WEc0Z0lDQWdJQ0JqYjI1emRDQnZkWFJ3ZFhSeklEMGdZWGRoYVhRZ1pYaGxZM1YwYjNJdVpYaGxZM1YwWlNocGJuQjFkSE1zSUdOdmJuUmxlSFFwTzF4dUlDQWdJQ0FnWTI5dWMzUWdjbVZ6YjJ4MlpXUlBkWFJ3ZFhSeklEMGdiM1YwY0hWMGN5QS9QeUI3ZlR0Y2JseHVJQ0FnSUNBZ1puSmhiV1V1ZG1Gc2RXVlRkRzl5WlM1elpYUk9iMlJsVDNWMGNIVjBjeWh3YkdGdVRtOWtaUzVwWkN3Z2NtVnpiMngyWldSUGRYUndkWFJ6S1R0Y2JpQWdJQ0FnSUhSb2FYTXVjbTkxZEdWUGRYUm5iMmx1WjBWa1oyVnpLR1p5WVcxbExDQndiR0Z1TENCd2JHRnVUbTlrWlN3Z2NtVnpiMngyWldSUGRYUndkWFJ6S1R0Y2JseHVJQ0FnSUNBZ1kyOXVjM1FnWm1sdWFYTm9aV1JCZENBOUlHNWxkeUJFWVhSbEtDazdYRzRnSUNBZ0lDQmpiMjV6ZENCeVpYTjFiSFE2SUVkeVlYQm9UbTlrWlVWNFpXTjFkR2x2YmxKbGMzVnNkQ0E5SUh0Y2JpQWdJQ0FnSUNBZ2JtOWtaVWxrT2lCd2JHRnVUbTlrWlM1cFpDeGNiaUFnSUNBZ0lDQWdjM1JoZEhWek9pQkhjbUZ3YUVWNFpXTjFkR2x2YmxOMFlYUjFjeTVUVlVORFJVVkVSVVFzWEc0Z0lDQWdJQ0FnSUdsdWNIVjBjeXhjYmlBZ0lDQWdJQ0FnYjNWMGNIVjBjem9nY21WemIyeDJaV1JQZFhSd2RYUnpMRnh1SUNBZ0lDQWdJQ0J6ZEdGeWRHVmtRWFFzWEc0Z0lDQWdJQ0FnSUdacGJtbHphR1ZrUVhRc1hHNGdJQ0FnSUNBZ0lHVjJaVzUwY3pvZ1cxMHNYRzRnSUNBZ0lDQjlPMXh1SUNBZ0lDQWdabkpoYldVdWNtVmpiM0prVG05a1pWSmxjM1ZzZENoeVpYTjFiSFFwTzF4dVhHNGdJQ0FnSUNCaGQyRnBkQ0IwYUdsekxtVnRhWFJGZG1WdWRDaG1jbUZ0WlN3Z2UxeHVJQ0FnSUNBZ0lDQjBlWEJsT2lCSGNtRndhRVY0WldOMWRHbHZia1YyWlc1MFZIbHdaUzVPVDBSRlgwTlBUVkJNUlZSRlJDeGNiaUFnSUNBZ0lDQWdjblZ1U1dRNklHWnlZVzFsTG5KMWJrbGtMRnh1SUNBZ0lDQWdJQ0IzYjNKclpteHZkMGxrT2lCd2JHRnVMbmR2Y210bWJHOTNTV1FzWEc0Z0lDQWdJQ0FnSUc1dlpHVkpaRG9nY0d4aGJrNXZaR1V1YVdRc1hHNGdJQ0FnSUNBZ0lIQmhkR2c2SUc1dlpHVlFZWFJvTEZ4dUlDQWdJQ0FnSUNCemRHRjBkWE02SUVkeVlYQm9SWGhsWTNWMGFXOXVVM1JoZEhWekxsTlZRME5GUlVSRlJDeGNiaUFnSUNBZ0lDQWdjR0Y1Ykc5aFpEb2dleUJ2ZFhSd2RYUnpPaUJ5WlhOdmJIWmxaRTkxZEhCMWRITWdmU3hjYmlBZ0lDQWdJSDBwTzF4dUlDQWdJSDBnWTJGMFkyZ2dLR1Z5Y205eUtTQjdYRzRnSUNBZ0lDQmpiMjV6ZENCbWFXNXBjMmhsWkVGMElEMGdibVYzSUVSaGRHVW9LVHRjYmlBZ0lDQWdJR052Ym5OMElHVnljbTl5VUdGNWJHOWhaQ0E5SUhSb2FYTXVkRzlGY25KdmNsQmhlV3h2WVdRb1pYSnliM0lwTzF4dUlDQWdJQ0FnWTI5dWMzUWdjbVZ6ZFd4ME9pQkhjbUZ3YUU1dlpHVkZlR1ZqZFhScGIyNVNaWE4xYkhRZ1BTQjdYRzRnSUNBZ0lDQWdJRzV2WkdWSlpEb2djR3hoYms1dlpHVXVhV1FzWEc0Z0lDQWdJQ0FnSUhOMFlYUjFjem9nUjNKaGNHaEZlR1ZqZFhScGIyNVRkR0YwZFhNdVJrRkpURVZFTEZ4dUlDQWdJQ0FnSUNCcGJuQjFkSE1zWEc0Z0lDQWdJQ0FnSUdWeWNtOXlPaUJsY25KdmNsQmhlV3h2WVdRc1hHNGdJQ0FnSUNBZ0lITjBZWEowWldSQmRDeGNiaUFnSUNBZ0lDQWdabWx1YVhOb1pXUkJkQ3hjYmlBZ0lDQWdJQ0FnWlhabGJuUnpPaUJiWFN4Y2JpQWdJQ0FnSUgwN1hHNGdJQ0FnSUNCbWNtRnRaUzV5WldOdmNtUk9iMlJsVW1WemRXeDBLSEpsYzNWc2RDazdYRzVjYmlBZ0lDQWdJR0YzWVdsMElIUm9hWE11WlcxcGRFVjJaVzUwS0daeVlXMWxMQ0I3WEc0Z0lDQWdJQ0FnSUhSNWNHVTZJRWR5WVhCb1JYaGxZM1YwYVc5dVJYWmxiblJVZVhCbExrNVBSRVZmUmtGSlRFVkVMRnh1SUNBZ0lDQWdJQ0J5ZFc1SlpEb2dabkpoYldVdWNuVnVTV1FzWEc0Z0lDQWdJQ0FnSUhkdmNtdG1iRzkzU1dRNklIQnNZVzR1ZDI5eWEyWnNiM2RKWkN4Y2JpQWdJQ0FnSUNBZ2JtOWtaVWxrT2lCd2JHRnVUbTlrWlM1cFpDeGNiaUFnSUNBZ0lDQWdjR0YwYURvZ2JtOWtaVkJoZEdnc1hHNGdJQ0FnSUNBZ0lITjBZWFIxY3pvZ1IzSmhjR2hGZUdWamRYUnBiMjVUZEdGMGRYTXVSa0ZKVEVWRUxGeHVJQ0FnSUNBZ0lDQmxjbkp2Y2pvZ1pYSnliM0pRWVhsc2IyRmtMRnh1SUNBZ0lDQWdmU2s3WEc1Y2JpQWdJQ0FnSUdsbUlDaHZjSFJ6TG1aaGFXeEdZWE4wSUQ4L0lIUnlkV1VwSUhSb2NtOTNJR1Z5Y205eU8xeHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lDOHFLbHh1SUNBZ0tpQlNaWE52YkhabGN5QmhJRzV2WkdVbmN5QnBibkIxZENCMllXeDFaWE1nWm5KdmJTQnBibU52YldsdVp5QmxaR2RsY3k1Y2JpQWdJQ292WEc0Z0lIQnlhWFpoZEdVZ2NtVnpiMngyWlU1dlpHVkpibkIxZEhNb1hHNGdJQ0FnWm5KaGJXVTZJRWR5WVhCb1JYaGxZM1YwYVc5dVJuSmhiV1VzWEc0Z0lDQWdjR3hoYmpvZ1IzSmhjR2hGZUdWamRYUnBiMjVRYkdGdUxGeHVJQ0FnSUhCc1lXNU9iMlJsT2lCSGNtRndhRVY0WldOMWRHbHZibEJzWVc1T2IyUmxYRzRnSUNrNklFZHlZWEJvUlhobFkzVjBhVzl1Vm1Gc2RXVnpJSHRjYmlBZ0lDQmpiMjV6ZENCcGJuQjFkSE02SUVkeVlYQm9SWGhsWTNWMGFXOXVWbUZzZFdWeklEMGdlMzA3WEc0Z0lDQWdZMjl1YzNRZ2FXNWpiMjFwYm1jZ1BTQndiR0Z1TG1sdVkyOXRhVzVuUW5sT2IyUmxMbWRsZENod2JHRnVUbTlrWlM1cFpDa2dQejhnVzEwN1hHNGdJQ0FnWm05eUlDaGpiMjV6ZENCbFpHZGxJRzltSUdsdVkyOXRhVzVuS1NCN1hHNGdJQ0FnSUNCcGJuQjFkSE5iWldSblpTNTBZWEpuWlhSUWIzSjBYU0E5SUdaeVlXMWxMblpoYkhWbFUzUnZjbVV1WjJWMFVHOXlkQ2hjYmlBZ0lDQWdJQ0FnWldSblpTNXpiM1Z5WTJWT2IyUmxTV1FzWEc0Z0lDQWdJQ0FnSUdWa1oyVXVjMjkxY21ObFVHOXlkRnh1SUNBZ0lDQWdLVHRjYmlBZ0lDQjlYRzRnSUNBZ2NtVjBkWEp1SUdsdWNIVjBjenRjYmlBZ2ZWeHVYRzRnSUM4cUtseHVJQ0FnS2lCQmRIUmxiWEIwY3lCMGJ5QnlaV0ZrSUdFZ2NHbHVibVZrSUhaaGJIVmxJR1p2Y2lCMGFHVWdibTlrWlM0Z1VtVjBkWEp1Y3lCMGFHVWdZMkZqYUdWa0lHOTFkSEIxZEhOY2JpQWdJQ29nZDJobGJpQmhJSFpoYkdsa0lIQnBibTVsWkNCMllXeDFaU0JsZUdsemRITXNJRzl5SUdCMWJtUmxabWx1WldSZ0lIUnZJSEJ5YjJObFpXUWdkMmwwYUNCdWIzSnRZV3hjYmlBZ0lDb2daWGhsWTNWMGFXOXVMbHh1SUNBZ0tpOWNiaUFnY0hKcGRtRjBaU0JoYzNsdVl5QjBjbmxRYVc1dVpXUldZV3gxWlNoY2JpQWdJQ0JtY21GdFpUb2dSM0poY0doRmVHVmpkWFJwYjI1R2NtRnRaU3hjYmlBZ0lDQndiR0Z1T2lCSGNtRndhRVY0WldOMWRHbHZibEJzWVc0c1hHNGdJQ0FnY0d4aGJrNXZaR1U2SUVkeVlYQm9SWGhsWTNWMGFXOXVVR3hoYms1dlpHVXNYRzRnSUNBZ2FXNXdkWFJ6T2lCSGNtRndhRVY0WldOMWRHbHZibFpoYkhWbGMxeHVJQ0FwT2lCUWNtOXRhWE5sUEVkeVlYQm9RMkZqYUdWa1ZtRnNkV1VnZkNCMWJtUmxabWx1WldRK0lIdGNiaUFnSUNCamIyNXpkQ0J3YjJ4cFkza2dQU0J1WlhjZ1IzSmhjR2hRYVc1dWFXNW5VRzlzYVdONUtDazdYRzRnSUNBZ2FXWWdLQ0Z3YjJ4cFkza3VjMmh2ZFd4a1ZYTmxVR2x1Ym1Wa1ZtRnNkV1VvY0d4aGJrNXZaR1VwS1NCeVpYUjFjbTRnZFc1a1pXWnBibVZrTzF4dVhHNGdJQ0FnWTI5dWMzUWdjMlZ5ZG1salpTQTlJSFJvYVhNdVkzSmxZWFJsVUdsdWJtbHVaMU5sY25acFkyVW9LVHRjYmlBZ0lDQmpiMjV6ZENCa1pYQkdhVzVuWlhKd2NtbHVkSE1nUFNCMGFHbHpMbU52YlhCMWRHVkVaWEJsYm1SbGJtTjVSbWx1WjJWeWNISnBiblJ6S0daeVlXMWxMQ0J3YkdGdUxDQndiR0Z1VG05a1pTNXBaQ2s3WEc0Z0lDQWdjbVYwZFhKdUlITmxjblpwWTJVdWNtVmhaRkJwYm01bFpGWmhiSFZsS0Z4dUlDQWdJQ0FnY0d4aGJpNTNiM0pyWm14dmR5eGNiaUFnSUNBZ0lIQnNZVzVPYjJSbExGeHVJQ0FnSUNBZ2FXNXdkWFJ6TEZ4dUlDQWdJQ0FnWkdWd1JtbHVaMlZ5Y0hKcGJuUnpYRzRnSUNBZ0tUdGNiaUFnZlZ4dVhHNGdJQzhxS2x4dUlDQWdLaUJTWldOMWNuTnBkbVZzZVNCamIyMXdkWFJsY3lCbWFXNW5aWEp3Y21sdWRITWdabTl5SUdGc2JDQjFjSE4wY21WaGJTQmtaWEJsYm1SbGJtTnBaWE1nYjJZZ1lTQnViMlJsWEc0Z0lDQXFJSFZ6YVc1bklIUm9aU0J5WlhOMWJIUnpJR0ZzY21WaFpIa2dZV05qZFcxMWJHRjBaV1FnYVc0Z2RHaGxJR1p5WVcxbExseHVJQ0FnS2k5Y2JpQWdjSEpwZG1GMFpTQmpiMjF3ZFhSbFJHVndaVzVrWlc1amVVWnBibWRsY25CeWFXNTBjeWhjYmlBZ0lDQm1jbUZ0WlRvZ1IzSmhjR2hGZUdWamRYUnBiMjVHY21GdFpTeGNiaUFnSUNCd2JHRnVPaUJIY21Gd2FFVjRaV04xZEdsdmJsQnNZVzRzWEc0Z0lDQWdibTlrWlVsa09pQnpkSEpwYm1kY2JpQWdLVG9nVW1WamIzSmtQSE4wY21sdVp5d2djM1J5YVc1blBpQjdYRzRnSUNBZ1kyOXVjM1FnYzJWeWRtbGpaU0E5SUhSb2FYTXVZM0psWVhSbFVHbHVibWx1WjFObGNuWnBZMlVvS1R0Y2JpQWdJQ0JqYjI1emRDQmtaWEJTWlhOdmJIWmxjaUE5SUc1bGR5QkhjbUZ3YUZCcGJtNXBibWRFWlhCbGJtUmxibU41VW1WemIyeDJaWElvS1R0Y2JpQWdJQ0JqYjI1emRDQmtaWEJ6SUQwZ1pHVndVbVZ6YjJ4MlpYSXVaMlYwUkdWd1pXNWtaVzVqYVdWektIQnNZVzRzSUc1dlpHVkpaQ2s3WEc0Z0lDQWdZMjl1YzNRZ1ptbHVaMlZ5Y0hKcGJuUnpPaUJTWldOdmNtUThjM1J5YVc1bkxDQnpkSEpwYm1jK0lEMGdlMzA3WEc0Z0lDQWdabTl5SUNoamIyNXpkQ0JrWlhBZ2IyWWdaR1Z3Y3lrZ2UxeHVJQ0FnSUNBZ1kyOXVjM1FnYm05a1pTQTlJSEJzWVc0dWJtOWtaWE11Wm1sdVpDZ29iaWtnUFQ0Z2JpNXBaQ0E5UFQwZ1pHVndLVHRjYmlBZ0lDQWdJR2xtSUNodWIyUmxLU0I3WEc0Z0lDQWdJQ0FnSUdOdmJuTjBJR1JsY0ZKbGMzVnNkQ0E5SUdaeVlXMWxMbTV2WkdWU1pYTjFiSFJ6TG1kbGRDaGtaWEFwTzF4dUlDQWdJQ0FnSUNCamIyNXpkQ0JwYm5CMWRITWdQU0JrWlhCU1pYTjFiSFEvTG1sdWNIVjBjeUEvUHlCN2ZUdGNiaUFnSUNBZ0lDQWdZMjl1YzNRZ2JtVnpkR1ZrUkdWd2N5QTlJSFJvYVhNdVkyOXRjSFYwWlVSbGNHVnVaR1Z1WTNsR2FXNW5aWEp3Y21sdWRITW9abkpoYldVc0lIQnNZVzRzSUdSbGNDazdYRzRnSUNBZ0lDQWdJR1pwYm1kbGNuQnlhVzUwYzF0a1pYQmRJRDBnYzJWeWRtbGpaUzVqYjIxd2RYUmxSbWx1WjJWeWNISnBiblFvWEc0Z0lDQWdJQ0FnSUNBZ2NHeGhiaTUzYjNKclpteHZkeXhjYmlBZ0lDQWdJQ0FnSUNCdWIyUmxMRnh1SUNBZ0lDQWdJQ0FnSUdsdWNIVjBjeXhjYmlBZ0lDQWdJQ0FnSUNCdVpYTjBaV1JFWlhCelhHNGdJQ0FnSUNBZ0lDazdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVJQ0FnSUhKbGRIVnliaUJtYVc1blpYSndjbWx1ZEhNN1hHNGdJSDFjYmx4dUlDQXZLaXBjYmlBZ0lDb2dVbTkxZEdWeklHRWdibTlrWlNkeklHOTFkSEIxZEhNZ2RHOGdaRzkzYm5OMGNtVmhiU0JwYm5CMWRITWdZVzVrSUhkdmNtdG1iRzkzSUc5MWRIQjFkSE11WEc0Z0lDQXFMMXh1SUNCd2NtbDJZWFJsSUhKdmRYUmxUM1YwWjI5cGJtZEZaR2RsY3loY2JpQWdJQ0JtY21GdFpUb2dSM0poY0doRmVHVmpkWFJwYjI1R2NtRnRaU3hjYmlBZ0lDQndiR0Z1T2lCSGNtRndhRVY0WldOMWRHbHZibEJzWVc0c1hHNGdJQ0FnY0d4aGJrNXZaR1U2SUVkeVlYQm9SWGhsWTNWMGFXOXVVR3hoYms1dlpHVXNYRzRnSUNBZ2IzVjBjSFYwY3pvZ1IzSmhjR2hGZUdWamRYUnBiMjVXWVd4MVpYTmNiaUFnS1RvZ2RtOXBaQ0I3WEc0Z0lDQWdZMjl1YzNRZ2IzVjBaMjlwYm1jZ1BTQndiR0Z1TG05MWRHZHZhVzVuUW5sT2IyUmxMbWRsZENod2JHRnVUbTlrWlM1cFpDa2dQejhnVzEwN1hHNGdJQ0FnWm05eUlDaGpiMjV6ZENCbFpHZGxJRzltSUc5MWRHZHZhVzVuS1NCN1hHNGdJQ0FnSUNCamIyNXpkQ0IyWVd4MVpTQTlJRzkxZEhCMWRITmJaV1JuWlM1emIzVnlZMlZRYjNKMFhUdGNiaUFnSUNBZ0lHbG1JQ2hsWkdkbExuUmhjbWRsZEU1dlpHVkpaQ0E5UFQwZ1IxSkJVRWhmVjA5U1MwWk1UMWRmUWs5VlRrUkJVbGtwSUh0Y2JpQWdJQ0FnSUNBZ1puSmhiV1V1ZG1Gc2RXVlRkRzl5WlM1elpYUlhiM0pyWm14dmQwOTFkSEIxZENobFpHZGxMblJoY21kbGRGQnZjblFzSUhaaGJIVmxLVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQWdJSFJvYVhNdVpXMXBkRVYyWlc1MEtHWnlZVzFsTENCN1hHNGdJQ0FnSUNBZ0lIUjVjR1U2SUVkeVlYQm9SWGhsWTNWMGFXOXVSWFpsYm5SVWVYQmxMa1ZFUjBWZlZrRk1WVVZmVWs5VlZFVkVMRnh1SUNBZ0lDQWdJQ0J5ZFc1SlpEb2dabkpoYldVdWNuVnVTV1FzWEc0Z0lDQWdJQ0FnSUhkdmNtdG1iRzkzU1dRNklIQnNZVzR1ZDI5eWEyWnNiM2RKWkN4Y2JpQWdJQ0FnSUNBZ1pXUm5aVWxrT2lCbFpHZGxMbWxrTEZ4dUlDQWdJQ0FnSUNCdWIyUmxTV1E2SUhCc1lXNU9iMlJsTG1sa0xGeHVJQ0FnSUNBZ0lDQndZWFJvT2lCYlhTeGNiaUFnSUNBZ0lDQWdjR0Y1Ykc5aFpEb2dleUJsWkdkbExDQjJZV3gxWlNCOUxGeHVJQ0FnSUNBZ2ZTa3VZMkYwWTJnb0tDa2dQVDRnZTF4dUlDQWdJQ0FnSUNBdkx5QnZZbk5sY25abGNpQm1ZV2xzZFhKbGN5QnRkWE4wSUc1dmRDQmpjbUZ6YUZ4dUlDQWdJQ0FnZlNrN1hHNGdJQ0FnZlZ4dUlDQjlYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFVnRhWFJ6SUdGdUlHVjJaVzUwTENCeVpXTnZjbVJ6SUdsMElHbHVJSFJvWlNCbWNtRnRaU3dnWVc1a0lHUnBjM0JoZEdOb1pYTWdkRzhnYjJKelpYSjJaWEp6TGx4dUlDQWdLaTljYmlBZ2NISnBkbUYwWlNCaGMzbHVZeUJsYldsMFJYWmxiblFvWEc0Z0lDQWdabkpoYldVNklFZHlZWEJvUlhobFkzVjBhVzl1Um5KaGJXVXNYRzRnSUNBZ2NHRnlkR2xoYkRvZ1VHRnlkR2xoYkR4SGNtRndhRVY0WldOMWRHbHZia1YyWlc1MFBpQW1JSHRjYmlBZ0lDQWdJSFI1Y0dVNklFZHlZWEJvUlhobFkzVjBhVzl1UlhabGJuUlVlWEJsTzF4dUlDQWdJQ0FnY25WdVNXUTZJRWR5WVhCb1VuVnVTV1E3WEc0Z0lDQWdJQ0IzYjNKclpteHZkMGxrT2lCemRISnBibWM3WEc0Z0lDQWdJQ0J3WVhSb09pQnpkSEpwYm1kYlhUdGNiaUFnSUNCOVhHNGdJQ2s2SUZCeWIyMXBjMlU4ZG05cFpENGdlMXh1SUNBZ0lHTnZibk4wSUdWMlpXNTBJRDBnWm5KaGJXVXVaWFpsYm5SR1lXTjBiM0o1TG1OeVpXRjBaU2g3WEc0Z0lDQWdJQ0JwWkRvZ1hDSmNJaXhjYmlBZ0lDQWdJSE5sY1hWbGJtTmxPaUF3TEZ4dUlDQWdJQ0FnZEdsdFpYTjBZVzF3T2lCdVpYY2dSR0YwWlNncExGeHVJQ0FnSUNBZ0xpNHVjR0Z5ZEdsaGJDeGNiaUFnSUNCOUlHRnpJRTl0YVhROFIzSmhjR2hGZUdWamRYUnBiMjVGZG1WdWRDd2dYQ0pwWkZ3aUlId2dYQ0p6WlhGMVpXNWpaVndpSUh3Z1hDSjBhVzFsYzNSaGJYQmNJajRwTzF4dUlDQWdJR1p5WVcxbExtRndjR1Z1WkVWMlpXNTBLR1YyWlc1MEtUdGNiaUFnSUNCaGQyRnBkQ0IwYUdsekxtVnRhWFIwWlhJdWRYQmtZWFJsVDJKelpYSjJaWEp6S0dWMlpXNTBLVHRjYmlBZ2ZWeHVYRzRnSUM4cUtseHVJQ0FnS2lCTlpYSm5aWE1nWkdWbVlYVnNkQ0J2Y0hScGIyNXpJSGRwZEdnZ2RHaGxJR2RwZG1WdUlHOXdkR2x2Ym5NdVhHNGdJQ0FxTDF4dUlDQndjbWwyWVhSbElHMWxjbWRsVDNCMGFXOXVjeWhjYmlBZ0lDQnZjSFJwYjI1ek9pQkhjbUZ3YUVWNFpXTjFkR2x2Yms5d2RHbHZibk5jYmlBZ0tUb2dSM0poY0doRmVHVmpkWFJwYjI1UGNIUnBiMjV6SUh0Y2JpQWdJQ0J5WlhSMWNtNGdlMXh1SUNBZ0lDQWdZMjl1WTNWeWNtVnVZM2s2SUVkU1FWQklYMFJGUmtGVlRGUmZRMDlPUTFWU1VrVk9RMWtzWEc0Z0lDQWdJQ0JtWVdsc1JtRnpkRG9nZEhKMVpTeGNiaUFnSUNBZ0lIWmhiR2xrWVhSbFNXNXdkWFJ6T2lCMGNuVmxMRnh1SUNBZ0lDQWdkbUZzYVdSaGRHVlBkWFJ3ZFhSek9pQjBjblZsTEZ4dUlDQWdJQ0FnZFhObFVHbHVibVZrVm1Gc2RXVnpPaUIwY25WbExGeHVJQ0FnSUNBZ2QzSnBkR1ZVYUhKdmRXZG9RMkZqYUdVNklHWmhiSE5sTEZ4dUlDQWdJQ0FnY0dGMGFEb2dXMTBzWEc0Z0lDQWdJQ0J0WlhSaFpHRjBZVG9nZTMwc1hHNGdJQ0FnSUNBdUxpNTBhR2x6TG1SbFptRjFiSFJQY0hScGIyNXpMRnh1SUNBZ0lDQWdMaTR1YjNCMGFXOXVjeXhjYmlBZ0lDQjlPMXh1SUNCOVhHNWNiaUFnTHlvcVhHNGdJQ0FxSUVkbGJtVnlZWFJsY3lCaElIVnVhWEYxWlNCeWRXNGdhV1F1WEc0Z0lDQXFMMXh1SUNCd2NtbDJZWFJsSUdkbGJtVnlZWFJsVW5WdVNXUW9LVG9nYzNSeWFXNW5JSHRjYmlBZ0lDQnlaWFIxY200Z0tGeHVJQ0FnSUNBZ1oyeHZZbUZzVkdocGN5NWpjbmx3ZEc4L0xuSmhibVJ2YlZWVlNVUS9MaWdwSUQ4L1hHNGdJQ0FnSUNCZ1ozSmhjR2d0Y25WdUxTUjdSR0YwWlM1dWIzY29LWDB0Skh0TllYUm9MbkpoYm1SdmJTZ3BMblJ2VTNSeWFXNW5LRE0yS1M1emJHbGpaU2d5S1gxZ1hHNGdJQ0FnS1R0Y2JpQWdmVnh1WEc0Z0lDOHFLbHh1SUNBZ0tpQkRiMjUyWlhKMGN5QmhiaUJsY25KdmNpQnBiblJ2SUdFZ2MyVnlhV0ZzYVhwbFpDQndZWGxzYjJGa0xseHVJQ0FnS2k5Y2JpQWdjSEpwZG1GMFpTQjBiMFZ5Y205eVVHRjViRzloWkNobGNuSnZjam9nZFc1cmJtOTNiaWs2SUVkeVlYQm9SWGhsWTNWMGFXOXVSWEp5YjNKUVlYbHNiMkZrSUh0Y2JpQWdJQ0JwWmlBb1pYSnliM0lnYVc1emRHRnVZMlZ2WmlCRmNuSnZjaWtnZTF4dUlDQWdJQ0FnY21WMGRYSnVJSHRjYmlBZ0lDQWdJQ0FnYm1GdFpUb2daWEp5YjNJdWJtRnRaU3hjYmlBZ0lDQWdJQ0FnYldWemMyRm5aVG9nWlhKeWIzSXViV1Z6YzJGblpTeGNiaUFnSUNBZ0lDQWdjM1JoWTJzNklHVnljbTl5TG5OMFlXTnJMRnh1SUNBZ0lDQWdJQ0JqYjJSbE9seHVJQ0FnSUNBZ0lDQWdJQ2hsY25KdmNpQmhjeUJoYm5rcExtZHlZWEJvUTI5a1pTQS9QMXh1SUNBZ0lDQWdJQ0FnSUNoMGVYQmxiMllnS0dWeWNtOXlJR0Z6SUdGdWVTa3VZMjlrWlNBOVBUMGdYQ0p1ZFcxaVpYSmNJbHh1SUNBZ0lDQWdJQ0FnSUNBZ1B5QlRkSEpwYm1jb0tHVnljbTl5SUdGeklHRnVlU2t1WTI5a1pTbGNiaUFnSUNBZ0lDQWdJQ0FnSURvZ0tHVnljbTl5SUdGeklHRnVlU2t1WTI5a1pTa3NYRzRnSUNBZ0lDQjlPMXh1SUNBZ0lIMWNiaUFnSUNCeVpYUjFjbTRnZXlCdVlXMWxPaUJjSWxWdWEyNXZkMjVGY25KdmNsd2lMQ0J0WlhOellXZGxPaUJUZEhKcGJtY29aWEp5YjNJcElIMDdYRzRnSUgxY2JuMWNiaUpkZlE9PSJdfQ==
|