@decaf-ts/integrations 0.3.8 → 0.3.9
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 +3 -3
- package/dist/integrations.js +3 -3
- package/lib/cjs/graph/engine/constants.cjs +58 -0
- package/lib/cjs/graph/engine/decorators.cjs +4 -0
- package/lib/cjs/graph/engine/errors/GraphCycleError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphExecutionError.cjs +27 -0
- package/lib/cjs/graph/engine/errors/GraphInputError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphLoopLimitError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphPinningError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphPortError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphStoreError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphTopologyError.cjs +20 -0
- package/lib/cjs/graph/{errors → engine/errors}/index.cjs +2 -2
- package/lib/cjs/graph/engine/events/GraphExecutionEvent.cjs +4 -0
- package/lib/cjs/graph/engine/events/GraphExecutionEventEmitter.cjs +40 -0
- package/lib/cjs/graph/engine/events/GraphExecutionEventFactory.cjs +37 -0
- package/lib/cjs/graph/engine/events/GraphExecutionObserver.cjs +4 -0
- package/lib/cjs/graph/{events → engine/events}/index.cjs +2 -2
- package/lib/cjs/graph/engine/execution/CodeSandboxEvaluator.cjs +4 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionContext.cjs +79 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionEngine.cjs +408 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionFrame.cjs +32 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionResult.cjs +30 -0
- package/lib/cjs/graph/engine/execution/GraphNodeExecutor.cjs +4 -0
- package/lib/cjs/graph/engine/execution/SwitchGraphNodeExecutor.cjs +103 -0
- package/lib/cjs/graph/{execution → engine/execution}/index.cjs +2 -2
- package/lib/cjs/graph/engine/index.cjs +84 -0
- package/lib/cjs/graph/engine/loops/ConditionExpressionEvaluator.cjs +87 -0
- package/lib/cjs/graph/engine/loops/ForeachGraphNodeExecutor.cjs +85 -0
- package/lib/cjs/graph/engine/loops/GraphConditionEvaluator.cjs +85 -0
- package/lib/cjs/graph/engine/loops/GraphLoopExecutionContext.cjs +16 -0
- package/lib/cjs/graph/engine/loops/UntilGraphNodeExecutor.cjs +77 -0
- package/lib/cjs/graph/engine/loops/WhileGraphNodeExecutor.cjs +78 -0
- package/lib/cjs/graph/{loops → engine/loops}/index.cjs +2 -2
- package/lib/cjs/graph/engine/pinning/GraphPinningDependencyResolver.cjs +28 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningMetadata.cjs +20 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningPolicy.cjs +34 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningService.cjs +191 -0
- package/lib/cjs/graph/{pinning → engine/pinning}/index.cjs +2 -2
- package/lib/cjs/graph/engine/planning/GraphExecutionPlan.cjs +4 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanEdge.cjs +4 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanLayer.cjs +4 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanNode.cjs +4 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanner.cjs +197 -0
- package/lib/cjs/graph/engine/planning/GraphRelationResolver.cjs +172 -0
- package/lib/cjs/graph/engine/planning/GraphTopology.cjs +57 -0
- package/lib/cjs/graph/{planning → engine/planning}/index.cjs +2 -2
- package/lib/cjs/graph/engine/registry/GraphNodeExecutorRegistry.cjs +44 -0
- package/lib/cjs/graph/engine/registry/GraphNodeExecutorResolver.cjs +27 -0
- package/lib/cjs/graph/{registry → engine/registry}/index.cjs +2 -2
- package/lib/cjs/graph/engine/snapshots/GraphExecutionSnapshotMapper.cjs +53 -0
- package/lib/cjs/graph/{snapshots → engine/snapshots}/index.cjs +2 -2
- package/lib/cjs/graph/engine/store/GraphCachedValue.cjs +4 -0
- package/lib/cjs/graph/engine/store/GraphValueKey.cjs +4 -0
- package/lib/cjs/graph/engine/store/GraphValueStore.cjs +76 -0
- package/lib/cjs/graph/engine/store/GraphValueStoreAdapter.cjs +4 -0
- package/lib/cjs/graph/engine/store/InMemoryGraphValueStoreAdapter.cjs +69 -0
- package/lib/cjs/graph/{store → engine/store}/index.cjs +2 -2
- package/lib/cjs/graph/engine/types.cjs +4 -0
- package/lib/cjs/graph/engine/validation/GraphDefinitionValidator.cjs +33 -0
- package/lib/cjs/graph/engine/validation/GraphPortSchemaResolver.cjs +58 -0
- package/lib/cjs/graph/engine/validation/GraphValueValidator.cjs +52 -0
- package/lib/cjs/graph/{validation → engine/validation}/index.cjs +2 -2
- package/lib/cjs/graph/index.cjs +10 -60
- package/lib/cjs/graph/shared/constants.cjs +44 -0
- package/lib/cjs/graph/shared/index.cjs +38 -0
- package/lib/cjs/graph/{nodes → shared/nodes}/agent.cjs +2 -2
- package/lib/cjs/graph/shared/nodes/base.cjs +35 -0
- package/lib/cjs/graph/shared/nodes/category-styles.cjs +38 -0
- package/lib/cjs/graph/shared/nodes/flow-control.cjs +464 -0
- package/lib/cjs/graph/{nodes → shared/nodes}/index.cjs +2 -2
- package/lib/cjs/graph/shared/nodes/triggers.cjs +250 -0
- package/lib/cjs/graph/shared/types.cjs +4 -0
- package/lib/cjs/index.cjs +3 -3
- package/lib/esm/graph/engine/constants.js +62 -0
- package/lib/esm/graph/engine/decorators.js +2 -0
- package/lib/esm/graph/engine/errors/GraphCycleError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphExecutionError.js +22 -0
- package/lib/esm/graph/engine/errors/GraphInputError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphLoopLimitError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphPinningError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphPortError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphStoreError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphTopologyError.js +15 -0
- package/lib/esm/graph/engine/errors/index.js +14 -0
- package/lib/esm/graph/engine/events/GraphExecutionEvent.js +2 -0
- package/lib/esm/graph/engine/events/GraphExecutionEventEmitter.js +35 -0
- package/lib/esm/graph/engine/events/GraphExecutionEventFactory.js +32 -0
- package/lib/esm/graph/engine/events/GraphExecutionObserver.js +2 -0
- package/lib/esm/graph/engine/events/index.js +10 -0
- package/lib/esm/graph/engine/execution/CodeSandboxEvaluator.js +18 -0
- package/lib/esm/graph/engine/execution/GraphExecutionContext.js +74 -0
- package/lib/esm/graph/engine/execution/GraphExecutionEngine.js +403 -0
- package/lib/esm/graph/engine/execution/GraphExecutionFrame.js +27 -0
- package/lib/esm/graph/engine/execution/GraphExecutionResult.js +26 -0
- package/lib/esm/graph/engine/execution/GraphNodeExecutor.js +2 -0
- package/lib/esm/graph/engine/execution/SwitchGraphNodeExecutor.js +98 -0
- package/lib/esm/graph/engine/execution/index.js +13 -0
- package/lib/esm/graph/engine/index.js +67 -0
- package/lib/esm/graph/engine/loops/ConditionExpressionEvaluator.js +82 -0
- package/lib/esm/graph/engine/loops/ForeachGraphNodeExecutor.js +80 -0
- package/lib/esm/graph/engine/loops/GraphConditionEvaluator.js +80 -0
- package/lib/esm/graph/engine/loops/GraphLoopExecutionContext.js +11 -0
- package/lib/esm/graph/engine/loops/UntilGraphNodeExecutor.js +72 -0
- package/lib/esm/graph/engine/loops/WhileGraphNodeExecutor.js +73 -0
- package/lib/esm/graph/engine/loops/index.js +12 -0
- package/lib/esm/graph/engine/pinning/GraphPinningDependencyResolver.js +23 -0
- package/lib/esm/graph/engine/pinning/GraphPinningMetadata.js +15 -0
- package/lib/esm/graph/engine/pinning/GraphPinningPolicy.js +29 -0
- package/lib/esm/graph/engine/pinning/GraphPinningService.js +186 -0
- package/lib/esm/graph/engine/pinning/index.js +10 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlan.js +2 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanEdge.js +7 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanLayer.js +2 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanNode.js +2 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanner.js +192 -0
- package/lib/esm/graph/engine/planning/GraphRelationResolver.js +167 -0
- package/lib/esm/graph/engine/planning/GraphTopology.js +52 -0
- package/lib/esm/graph/engine/planning/index.js +13 -0
- package/lib/esm/graph/engine/registry/GraphNodeExecutorRegistry.js +39 -0
- package/lib/esm/graph/engine/registry/GraphNodeExecutorResolver.js +22 -0
- package/lib/esm/graph/engine/registry/index.js +8 -0
- package/lib/esm/graph/engine/snapshots/GraphExecutionSnapshotMapper.js +48 -0
- package/lib/esm/graph/engine/snapshots/index.js +7 -0
- package/lib/esm/graph/engine/store/GraphCachedValue.js +2 -0
- package/lib/esm/graph/engine/store/GraphValueKey.js +7 -0
- package/lib/esm/graph/engine/store/GraphValueStore.js +71 -0
- package/lib/esm/graph/engine/store/GraphValueStoreAdapter.js +2 -0
- package/lib/esm/graph/engine/store/InMemoryGraphValueStoreAdapter.js +64 -0
- package/lib/esm/graph/engine/store/index.js +11 -0
- package/lib/esm/graph/engine/types.js +2 -0
- package/lib/esm/graph/engine/validation/GraphDefinitionValidator.js +28 -0
- package/lib/esm/graph/engine/validation/GraphPortSchemaResolver.js +53 -0
- package/lib/esm/graph/engine/validation/GraphValueValidator.js +47 -0
- package/lib/esm/graph/engine/validation/index.js +9 -0
- package/lib/esm/graph/index.js +9 -59
- package/lib/esm/graph/shared/constants.js +56 -0
- package/lib/esm/graph/shared/index.js +19 -0
- package/lib/esm/graph/shared/nodes/agent.js +101 -0
- package/lib/esm/graph/shared/nodes/base.js +30 -0
- package/lib/esm/graph/shared/nodes/category-styles.js +34 -0
- package/lib/esm/graph/shared/nodes/flow-control.js +455 -0
- package/lib/esm/graph/shared/nodes/index.js +18 -0
- package/lib/esm/graph/shared/nodes/triggers.js +241 -0
- package/lib/esm/graph/shared/types.js +2 -0
- package/lib/esm/index.js +3 -3
- 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} +8 -116
- package/lib/types/graph/{types.d.mts → engine/types.d.mts} +8 -116
- 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 +121 -0
- package/lib/types/graph/shared/types.d.mts +121 -0
- package/lib/types/index.d.cts +2 -2
- package/lib/types/index.d.mts +2 -2
- package/package.json +14 -3
- 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/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/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/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/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/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/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/registry/GraphNodeExecutorRegistry.cjs +0 -44
- package/lib/cjs/graph/registry/GraphNodeExecutorResolver.cjs +0 -27
- package/lib/cjs/graph/snapshots/GraphExecutionSnapshotMapper.cjs +0 -53
- 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/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/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
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GraphExecutionPlanner = void 0;
|
|
4
|
+
const graph_1 = require("@decaf-ts/ui-decorators/graph");
|
|
5
|
+
const constants_js_1 = require("./../constants.cjs");
|
|
6
|
+
const GraphCycleError_js_1 = require("./../errors/GraphCycleError.cjs");
|
|
7
|
+
const GraphTopologyError_js_1 = require("./../errors/GraphTopologyError.cjs");
|
|
8
|
+
const GraphRelationResolver_js_1 = require("./GraphRelationResolver.cjs");
|
|
9
|
+
/**
|
|
10
|
+
* Planner that turns a {@link GraphWorkflowDefinition} into a
|
|
11
|
+
* {@link GraphExecutionPlan} with topological layers.
|
|
12
|
+
*/
|
|
13
|
+
class GraphExecutionPlanner {
|
|
14
|
+
constructor(resolver) {
|
|
15
|
+
this.resolver = resolver ?? new GraphRelationResolver_js_1.GraphRelationResolver();
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Plans a workflow for execution.
|
|
19
|
+
*
|
|
20
|
+
* @param workflow - The workflow definition to plan.
|
|
21
|
+
* @returns The execution plan with nodes, edges, layers, and maps.
|
|
22
|
+
* @throws {GraphTopologyError} when node IDs are not unique.
|
|
23
|
+
* @throws {GraphCycleError} when the workflow contains an unsupported cycle.
|
|
24
|
+
*/
|
|
25
|
+
plan(workflow) {
|
|
26
|
+
this.validateUniqueNodeIds(workflow);
|
|
27
|
+
const nodes = this.resolveNodes(workflow);
|
|
28
|
+
const edges = this.resolver.resolve(workflow);
|
|
29
|
+
const incomingByNode = this.buildIncomingMap(edges);
|
|
30
|
+
const outgoingByNode = this.buildOutgoingMap(edges);
|
|
31
|
+
const layers = this.topologicalLayers(nodes, edges);
|
|
32
|
+
return {
|
|
33
|
+
workflow,
|
|
34
|
+
workflowId: workflow.name,
|
|
35
|
+
nodes,
|
|
36
|
+
edges,
|
|
37
|
+
layers,
|
|
38
|
+
incomingByNode,
|
|
39
|
+
outgoingByNode,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Validates that all workflow node IDs are unique.
|
|
44
|
+
*/
|
|
45
|
+
validateUniqueNodeIds(workflow) {
|
|
46
|
+
const seen = new Set();
|
|
47
|
+
for (const node of workflow.nodes ?? []) {
|
|
48
|
+
if (seen.has(node.id)) {
|
|
49
|
+
throw new GraphTopologyError_js_1.GraphTopologyError(`Duplicate node id '${node.id}' in workflow '${workflow.name}'`, { nodeId: node.id, workflowId: workflow.name });
|
|
50
|
+
}
|
|
51
|
+
seen.add(node.id);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Resolves workflow node metadata into plan nodes with full definitions.
|
|
56
|
+
*/
|
|
57
|
+
resolveNodes(workflow) {
|
|
58
|
+
const result = [];
|
|
59
|
+
for (const nodeMeta of workflow.nodes ?? []) {
|
|
60
|
+
const definition = this.resolveDefinition(nodeMeta);
|
|
61
|
+
const inputPorts = (definition.ports ?? [])
|
|
62
|
+
.filter((p) => p.direction === "input")
|
|
63
|
+
.map((p) => p.name);
|
|
64
|
+
const outputPorts = (definition.ports ?? [])
|
|
65
|
+
.filter((p) => p.direction === "output")
|
|
66
|
+
.map((p) => p.name);
|
|
67
|
+
result.push({
|
|
68
|
+
id: nodeMeta.id,
|
|
69
|
+
kind: nodeMeta.kind ?? definition.kind ?? nodeMeta.id,
|
|
70
|
+
label: nodeMeta.label,
|
|
71
|
+
source: nodeMeta,
|
|
72
|
+
definition,
|
|
73
|
+
inputPorts,
|
|
74
|
+
outputPorts,
|
|
75
|
+
metadata: nodeMeta.metadata,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return result;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Attempts to resolve the full graph node definition from metadata.
|
|
82
|
+
*
|
|
83
|
+
* Accepts either a decorated Model class/instance (resolved via
|
|
84
|
+
* `graphDefinitionOf`) or a plain `GraphNodeDefinition`-shaped object
|
|
85
|
+
* (useful for serialized workflows that inline node definitions).
|
|
86
|
+
*/
|
|
87
|
+
resolveDefinition(nodeMeta) {
|
|
88
|
+
if (nodeMeta.node) {
|
|
89
|
+
if (this.isRawDefinition(nodeMeta.node)) {
|
|
90
|
+
return nodeMeta.node;
|
|
91
|
+
}
|
|
92
|
+
try {
|
|
93
|
+
return (0, graph_1.graphDefinitionOf)(nodeMeta.node);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// fall through to stub
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Return a minimal stub definition so planning can proceed
|
|
100
|
+
return {
|
|
101
|
+
name: nodeMeta.id,
|
|
102
|
+
tag: nodeMeta.id,
|
|
103
|
+
kind: nodeMeta.kind ?? nodeMeta.id,
|
|
104
|
+
labels: [],
|
|
105
|
+
ports: [],
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Returns `true` when a value looks like a raw {@link GraphNodeDefinition}
|
|
110
|
+
* (a plain object with a `ports` array and a `name` string).
|
|
111
|
+
*/
|
|
112
|
+
isRawDefinition(value) {
|
|
113
|
+
return (typeof value === "object" &&
|
|
114
|
+
value !== null &&
|
|
115
|
+
!Array.isArray(value) &&
|
|
116
|
+
typeof value.name === "string" &&
|
|
117
|
+
Array.isArray(value.ports));
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Builds a map of node id -> incoming edges.
|
|
121
|
+
*/
|
|
122
|
+
buildIncomingMap(edges) {
|
|
123
|
+
const map = new Map();
|
|
124
|
+
for (const edge of edges) {
|
|
125
|
+
const list = map.get(edge.targetNodeId) ?? [];
|
|
126
|
+
list.push(edge);
|
|
127
|
+
map.set(edge.targetNodeId, list);
|
|
128
|
+
}
|
|
129
|
+
return map;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Builds a map of node id -> outgoing edges.
|
|
133
|
+
*/
|
|
134
|
+
buildOutgoingMap(edges) {
|
|
135
|
+
const map = new Map();
|
|
136
|
+
for (const edge of edges) {
|
|
137
|
+
const list = map.get(edge.sourceNodeId) ?? [];
|
|
138
|
+
list.push(edge);
|
|
139
|
+
map.set(edge.sourceNodeId, list);
|
|
140
|
+
}
|
|
141
|
+
return map;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Produces topological layers using Kahn's algorithm.
|
|
145
|
+
*
|
|
146
|
+
* Workflow boundary edges do not count as executable-node dependencies.
|
|
147
|
+
*/
|
|
148
|
+
topologicalLayers(nodes, edges) {
|
|
149
|
+
const executableNodes = nodes.filter((n) => n.id !== constants_js_1.GRAPH_WORKFLOW_BOUNDARY);
|
|
150
|
+
const nodeIds = new Set(executableNodes.map((n) => n.id));
|
|
151
|
+
// Only edges between two executable nodes count as dependencies
|
|
152
|
+
const execEdges = edges.filter((e) => nodeIds.has(e.sourceNodeId) && nodeIds.has(e.targetNodeId));
|
|
153
|
+
// Compute in-degree
|
|
154
|
+
const indegree = new Map();
|
|
155
|
+
for (const node of executableNodes)
|
|
156
|
+
indegree.set(node.id, 0);
|
|
157
|
+
for (const edge of execEdges) {
|
|
158
|
+
indegree.set(edge.targetNodeId, (indegree.get(edge.targetNodeId) ?? 0) + 1);
|
|
159
|
+
}
|
|
160
|
+
const layers = [];
|
|
161
|
+
const planned = new Set();
|
|
162
|
+
let ready = executableNodes.filter((n) => (indegree.get(n.id) ?? 0) === 0);
|
|
163
|
+
let layerIndex = 0;
|
|
164
|
+
while (ready.length > 0) {
|
|
165
|
+
const layer = { index: layerIndex++, nodes: ready };
|
|
166
|
+
layers.push(layer);
|
|
167
|
+
const nextReady = [];
|
|
168
|
+
for (const node of ready) {
|
|
169
|
+
planned.add(node.id);
|
|
170
|
+
const outgoing = execEdges.filter((e) => e.sourceNodeId === node.id);
|
|
171
|
+
for (const edge of outgoing) {
|
|
172
|
+
const deg = (indegree.get(edge.targetNodeId) ?? 1) - 1;
|
|
173
|
+
indegree.set(edge.targetNodeId, deg);
|
|
174
|
+
if (deg === 0 && !planned.has(edge.targetNodeId)) {
|
|
175
|
+
const next = executableNodes.find((n) => n.id === edge.targetNodeId);
|
|
176
|
+
if (next)
|
|
177
|
+
nextReady.push(next);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
ready = nextReady;
|
|
182
|
+
}
|
|
183
|
+
if (planned.size !== executableNodes.length) {
|
|
184
|
+
const unplanned = executableNodes
|
|
185
|
+
.filter((n) => !planned.has(n.id))
|
|
186
|
+
.map((n) => n.id);
|
|
187
|
+
throw new GraphCycleError_js_1.GraphCycleError({
|
|
188
|
+
unplannedNodes: unplanned,
|
|
189
|
+
workflowId: nodes[0]?.definition?.name,
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
return layers;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
exports.GraphExecutionPlanner = GraphExecutionPlanner;
|
|
196
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhFeGVjdXRpb25QbGFubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2dyYXBoL2VuZ2luZS9wbGFubmluZy9HcmFwaEV4ZWN1dGlvblBsYW5uZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBU0EsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFbEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLDBCQUFxQjtBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLHVDQUFrQztBQUM1RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsMENBQXFDO0FBS2xFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxtQ0FBZ0M7QUFFaEU7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLHFCQUFxQjtJQUdoQyxZQUFZLFFBQWdDO1FBQzFDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxJQUFJLElBQUkscUJBQXFCLEVBQUUsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQUksQ0FBQyxRQUFpQztRQUNwQyxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFckMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU5QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXBELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFcEQsT0FBTztZQUNMLFFBQVE7WUFDUixVQUFVLEVBQUUsUUFBUSxDQUFD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d0JBQ2pELE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO3dCQUNyRSxJQUFJLElBQUk7NEJBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDakMsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUNELEtBQUssR0FBRyxTQUFTLENBQUM7UUFDcEIsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDNUMsTUFBTSxTQUFTLEdBQUcsZUFBZTtpQkFDOUIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUNqQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwQixNQUFNLElBQUksZUFBZSxDQUFDO2dCQUN4QixjQUFjLEVBQUUsU0FBUztnQkFDekIsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSTthQUN2QyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbW9kdWxlIGludGVncmF0aW9ucy9ncmFwaC9wbGFubmluZy9HcmFwaEV4ZWN1dGlvblBsYW5uZXJcbiAqIEBzdW1tYXJ5IFRvcG9sb2dpY2FsIHBsYW5uZXIgZm9yIGdyYXBoIHdvcmtmbG93cy5cbiAqIEBkZXNjcmlwdGlvbiBSZXNvbHZlcyB3b3JrZmxvdyBub2RlcyBhbmQgcmVsYXRpb25zLCB2YWxpZGF0ZXMgdG9wb2xvZ3ksIGRldGVjdHMgY3ljbGVzLCBhbmQgcHJvZHVjZXMgdG9wb2xvZ2ljYWwgZXhlY3V0aW9uIGxheWVycyB1c2luZyBLYWhuJ3MgYWxnb3JpdGhtLlxuICovXG5pbXBvcnQgdHlwZSB7XG4gIEdyYXBoTm9kZURlZmluaXRpb24sXG4gIEdyYXBoV29ya2Zsb3dEZWZpbml0aW9uLFxufSBmcm9tIFwiQGRlY2FmLXRzL3VpLWRlY29yYXRvcnMvZ3JhcGhcIjtcbmltcG9ydCB7IGdyYXBoRGVmaW5pdGlvbk9mIH0gZnJvbSBcIkBkZWNhZi10cy91aS1kZWNvcmF0b3JzL2dyYXBoXCI7XG5cbmltcG9ydCB7IEdSQVBIX1dPUktGTE9XX0JPVU5EQVJZIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgR3JhcGhDeWNsZUVycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy9HcmFwaEN5Y2xlRXJyb3JcIjtcbmltcG9ydCB7IEdyYXBoVG9wb2xvZ3lFcnJvciB9IGZyb20gXCIuLi9lcnJvcnMvR3JhcGhUb3BvbG9neUVycm9yXCI7XG5pbXBvcnQgdHlwZSB7IEdyYXBoRXhlY3V0aW9uUGxhbiB9IGZyb20gXCIuL0dyYXBoRXhlY3V0aW9uUGxhblwiO1xuaW1wb3J0IHR5cGUgeyBHcmFwaEV4ZWN1dGlvblBsYW5Ob2RlIH0gZnJvbSBcIi4vR3JhcGhFeGVjdXRpb25QbGFuTm9kZVwiO1xuaW1wb3J0IHR5cGUgeyBHcmFwaEV4ZWN1dGlvblBsYW5FZGdlIH0gZnJvbSBcIi4vR3JhcGhFeGVjdXRpb25QbGFuRWRnZVwiO1xuaW1wb3J0IHR5cGUgeyBHcmFwaEV4ZWN1dGlvblBsYW5MYXllciB9IGZyb20gXCIuL0dyYXBoRXhlY3V0aW9uUGxhbkxheWVyXCI7XG5pbXBvcnQgeyBHcmFwaFJlbGF0aW9uUmVzb2x2ZXIgfSBmcm9tIFwiLi9HcmFwaFJlbGF0aW9uUmVzb2x2ZXJcIjtcblxuLyoqXG4gKiBQbGFubmVyIHRoYXQgdHVybnMgYSB7QGxpbmsgR3JhcGhXb3JrZmxvd0RlZmluaXRpb259IGludG8gYVxuICoge0BsaW5rIEdyYXBoRXhlY3V0aW9uUGxhbn0gd2l0aCB0b3BvbG9naWNhbCBsYXllcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBHcmFwaEV4ZWN1dGlvblBsYW5uZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc29sdmVyOiBHcmFwaFJlbGF0aW9uUmVzb2x2ZXI7XG5cbiAgY29uc3RydWN0b3IocmVzb2x2ZXI/OiBHcmFwaFJlbGF0aW9uUmVzb2x2ZXIpIHtcbiAgICB0aGlzLnJlc29sdmVyID0gcmVzb2x2ZXIgPz8gbmV3IEdyYXBoUmVsYXRpb25SZXNvbHZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYW5zIGEgd29ya2Zsb3cgZm9yIGV4ZWN1dGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHdvcmtmbG93IC0gVGhlIHdvcmtmbG93IGRlZmluaXRpb24gdG8gcGxhbi5cbiAgICogQHJldHVybnMgVGhlIGV4ZWN1dGlvbiBwbGFuIHdpdGggbm9kZXMsIGVkZ2VzLCBsYXllcnMsIGFuZCBtYXBzLlxuICAgKiBAdGhyb3dzIHtHcmFwaFRvcG9sb2d5RXJyb3J9IHdoZW4gbm9kZSBJRHMgYXJlIG5vdCB1bmlxdWUuXG4gICAqIEB0aHJvd3Mge0dyYXBoQ3ljbGVFcnJvcn0gd2hlbiB0aGUgd29ya2Zsb3cgY29udGFpbnMgYW4gdW5zdXBwb3J0ZWQgY3ljbGUuXG4gICAqL1xuICBwbGFuKHdvcmtmbG93OiBHcmFwaFdvcmtmbG93RGVmaW5pdGlvbik6IEdyYXBoRXhlY3V0aW9uUGxhbiB7XG4gICAgdGhpcy52YWxpZGF0ZVVuaXF1ZU5vZGVJZHMod29ya2Zsb3cpO1xuXG4gICAgY29uc3Qgbm9kZXMgPSB0aGlzLnJlc29sdmVOb2Rlcyh3b3JrZmxvdyk7XG4gICAgY29uc3QgZWRnZXMgPSB0aGlzLnJlc29sdmVyLnJlc29sdmUod29ya2Zsb3cpO1xuXG4gICAgY29uc3QgaW5jb21pbmdCeU5vZGUgPSB0aGlzLmJ1aWxkSW5jb21pbmdNYXAoZWRnZXMpO1xuICAgIGNvbnN0IG91dGdvaW5nQnlOb2RlID0gdGhpcy5idWlsZE91dGdvaW5nTWFwKGVkZ2VzKTtcblxuICAgIGNvbnN0IGxheWVycyA9IHRoaXMudG9wb2xvZ2ljYWxMYXllcnMobm9kZXMsIGVkZ2VzKTtcblxuICAgIHJldHVybiB7XG4gICAgICB3b3JrZmxvdyxcbiAgICAgIHdvcmtmbG93SWQ6IHdvcmtmbG93Lm5hbWUsXG4gICAgICBub2RlcyxcbiAgICAgIGVkZ2VzLFxuICAgICAgbGF5ZXJzLFxuICAgICAgaW5jb21pbmdCeU5vZGUsXG4gICAgICBvdXRnb2luZ0J5Tm9kZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IGFsbCB3b3JrZmxvdyBub2RlIElEcyBhcmUgdW5pcXVlLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVVuaXF1ZU5vZGVJZHMod29ya2Zsb3c6IEdyYXBoV29ya2Zsb3dEZWZpbml0aW9uKTogdm9pZCB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiB3b3JrZmxvdy5ub2RlcyA/PyBbXSkge1xuICAgICAgaWYgKHNlZW4uaGFzKG5vZGUuaWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBHcmFwaFRvcG9sb2d5RXJyb3IoXG4gICAgICAgICAgYER1cGxpY2F0ZSBub2RlIGlkICcke25vZGUuaWR9JyBpbiB3b3JrZmxvdyAnJHt3b3JrZmxvdy5uYW1lfSdgLFxuICAgICAgICAgIHsgbm9kZUlkOiBub2RlLmlkLCB3b3JrZmxvd0lkOiB3b3JrZmxvdy5uYW1lIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHNlZW4uYWRkKG5vZGUuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB3b3JrZmxvdyBub2RlIG1ldGFkYXRhIGludG8gcGxhbiBub2RlcyB3aXRoIGZ1bGwgZGVmaW5pdGlvbnMuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVOb2RlcyhcbiAgICB3b3JrZmxvdzogR3JhcGhXb3JrZmxvd0RlZmluaXRpb25cbiAgKTogR3JhcGhFeGVjdXRpb25QbGFuTm9kZVtdIHtcbiAgICBjb25zdCByZXN1bHQ6IEdyYXBoRXhlY3V0aW9uUGxhbk5vZGVbXSA9IFtdO1xuICAgIGZvciAoY29uc3Qgbm9kZU1ldGEgb2Ygd29ya2Zsb3cubm9kZXMgPz8gW10pIHtcbiAgICAgIGNvbnN0IGRlZmluaXRpb24gPSB0aGlzLnJlc29sdmVEZWZpbml0aW9uKG5vZGVNZXRhKTtcbiAgICAgIGNvbnN0IGlucHV0UG9ydHMgPSAoZGVmaW5pdGlvbi5wb3J0cyA/PyBbXSlcbiAgICAgICAgLmZpbHRlcigocCkgPT4gcC5kaXJlY3Rpb24gPT09IFwiaW5wdXRcIilcbiAgICAgICAgLm1hcCgocCkgPT4gcC5uYW1lKTtcbiAgICAgIGNvbnN0IG91dHB1dFBvcnRzID0gKGRlZmluaXRpb24ucG9ydHMgPz8gW10pXG4gICAgICAgIC5maWx0ZXIoKHApID0+IHAuZGlyZWN0aW9uID09PSBcIm91dHB1dFwiKVxuICAgICAgICAubWFwKChwKSA9PiBwLm5hbWUpO1xuICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICBpZDogbm9kZU1ldGEuaWQsXG4gICAgICAgIGtpbmQ6IG5vZGVNZXRhLmtpbmQgPz8gZGVmaW5pdGlvbi5raW5kID8/IG5vZGVNZXRhLmlkLFxuICAgICAgICBsYWJlbDogbm9kZU1ldGEubGFiZWwsXG4gICAgICAgIHNvdXJjZTogbm9kZU1ldGEsXG4gICAgICAgIGRlZmluaXRpb24sXG4gICAgICAgIGlucHV0UG9ydHMsXG4gICAgICAgIG91dHB1dFBvcnRzLFxuICAgICAgICBtZXRhZGF0YTogbm9kZU1ldGEubWV0YWRhdGEsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0cyB0byByZXNvbHZlIHRoZSBmdWxsIGdyYXBoIG5vZGUgZGVmaW5pdGlvbiBmcm9tIG1ldGFkYXRhLlxuICAgKlxuICAgKiBBY2NlcHRzIGVpdGhlciBhIGRlY29yYXRlZCBNb2RlbCBjbGFzcy9pbnN0YW5jZSAocmVzb2x2ZWQgdmlhXG4gICAqIGBncmFwaERlZmluaXRpb25PZmApIG9yIGEgcGxhaW4gYEdyYXBoTm9kZURlZmluaXRpb25gLXNoYXBlZCBvYmplY3RcbiAgICogKHVzZWZ1bCBmb3Igc2VyaWFsaXplZCB3b3JrZmxvd3MgdGhhdCBpbmxpbmUgbm9kZSBkZWZpbml0aW9ucykuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVEZWZpbml0aW9uKG5vZGVNZXRhOiB7XG4gICAgbm9kZT86IHVua25vd247XG4gICAga2luZD86IHN0cmluZztcbiAgICBpZDogc3RyaW5nO1xuICB9KTogR3JhcGhOb2RlRGVmaW5pdGlvbiB7XG4gICAgaWYgKG5vZGVNZXRhLm5vZGUpIHtcbiAgICAgIGlmICh0aGlzLmlzUmF3RGVmaW5pdGlvbihub2RlTWV0YS5ub2RlKSkge1xuICAgICAgICByZXR1cm4gbm9kZU1ldGEubm9kZSBhcyBHcmFwaE5vZGVEZWZpbml0aW9uO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGdyYXBoRGVmaW5pdGlvbk9mKG5vZGVNZXRhLm5vZGUgYXMgYW55KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBmYWxsIHRocm91Z2ggdG8gc3R1YlxuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZXR1cm4gYSBtaW5pbWFsIHN0dWIgZGVmaW5pdGlvbiBzbyBwbGFubmluZyBjYW4gcHJvY2VlZFxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBub2RlTWV0YS5pZCxcbiAgICAgIHRhZzogbm9kZU1ldGEuaWQsXG4gICAgICBraW5kOiBub2RlTWV0YS5raW5kID8/IG5vZGVNZXRhLmlkLFxuICAgICAgbGFiZWxzOiBbXSxcbiAgICAgIHBvcnRzOiBbXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIHdoZW4gYSB2YWx1ZSBsb29rcyBsaWtlIGEgcmF3IHtAbGluayBHcmFwaE5vZGVEZWZpbml0aW9ufVxuICAgKiAoYSBwbGFpbiBvYmplY3Qgd2l0aCBhIGBwb3J0c2AgYXJyYXkgYW5kIGEgYG5hbWVgIHN0cmluZykuXG4gICAqL1xuICBwcml2YXRlIGlzUmF3RGVmaW5pdGlvbih2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcbiAgICAgIHR5cGVvZiAodmFsdWUgYXMgeyBuYW1lPzogdW5rbm93biB9KS5uYW1lID09PSBcInN0cmluZ1wiICYmXG4gICAgICBBcnJheS5pc0FycmF5KCh2YWx1ZSBhcyB7IHBvcnRzPzogdW5rbm93biB9KS5wb3J0cylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIG1hcCBvZiBub2RlIGlkIC0+IGluY29taW5nIGVkZ2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEluY29taW5nTWFwKFxuICAgIGVkZ2VzOiBHcmFwaEV4ZWN1dGlvblBsYW5FZGdlW11cbiAgKTogTWFwPHN0cmluZywgR3JhcGhFeGVjdXRpb25QbGFuRWRnZVtdPiB7XG4gICAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIEdyYXBoRXhlY3V0aW9uUGxhbkVkZ2VbXT4oKTtcbiAgICBmb3IgKGNvbnN0IGVkZ2Ugb2YgZWRnZXMpIHtcbiAgICAgIGNvbnN0IGxpc3QgPSBtYXAuZ2V0KGVkZ2UudGFyZ2V0Tm9kZUlkKSA/PyBbXTtcbiAgICAgIGxpc3QucHVzaChlZGdlKTtcbiAgICAgIG1hcC5zZXQoZWRnZS50YXJnZXROb2RlSWQsIGxpc3QpO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIG1hcCBvZiBub2RlIGlkIC0+IG91dGdvaW5nIGVkZ2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZE91dGdvaW5nTWFwKFxuICAgIGVkZ2VzOiBHcmFwaEV4ZWN1dGlvblBsYW5FZGdlW11cbiAgKTogTWFwPHN0cmluZywgR3JhcGhFeGVjdXRpb25QbGFuRWRnZVtdPiB7XG4gICAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIEdyYXBoRXhlY3V0aW9uUGxhbkVkZ2VbXT4oKTtcbiAgICBmb3IgKGNvbnN0IGVkZ2Ugb2YgZWRnZXMpIHtcbiAgICAgIGNvbnN0IGxpc3QgPSBtYXAuZ2V0KGVkZ2Uuc291cmNlTm9kZUlkKSA/PyBbXTtcbiAgICAgIGxpc3QucHVzaChlZGdlKTtcbiAgICAgIG1hcC5zZXQoZWRnZS5zb3VyY2VOb2RlSWQsIGxpc3QpO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2R1Y2VzIHRvcG9sb2dpY2FsIGxheWVycyB1c2luZyBLYWhuJ3MgYWxnb3JpdGhtLlxuICAgKlxuICAgKiBXb3JrZmxvdyBib3VuZGFyeSBlZGdlcyBkbyBub3QgY291bnQgYXMgZXhlY3V0YWJsZS1ub2RlIGRlcGVuZGVuY2llcy5cbiAgICovXG4gIHByaXZhdGUgdG9wb2xvZ2ljYWxMYXllcnMoXG4gICAgbm9kZXM6IEdyYXBoRXhlY3V0aW9uUGxhbk5vZGVbXSxcbiAgICBlZGdlczogR3JhcGhFeGVjdXRpb25QbGFuRWRnZVtdXG4gICk6IEdyYXBoRXhlY3V0aW9uUGxhbkxheWVyW10ge1xuICAgIGNvbnN0IGV4ZWN1dGFibGVOb2RlcyA9IG5vZGVzLmZpbHRlcihcbiAgICAgIChuKSA9PiBuLmlkICE9PSBHUkFQSF9XT1JLRkxPV19CT1VOREFSWVxuICAgICk7XG4gICAgY29uc3Qgbm9kZUlkcyA9IG5ldyBTZXQoZXhlY3V0YWJsZU5vZGVzLm1hcCgobikgPT4gbi5pZCkpO1xuXG4gICAgLy8gT25seSBlZGdlcyBiZXR3ZWVuIHR3byBleGVjdXRhYmxlIG5vZGVzIGNvdW50IGFzIGRlcGVuZGVuY2llc1xuICAgIGNvbnN0IGV4ZWNFZGdlcyA9IGVkZ2VzLmZpbHRlcihcbiAgICAgIChlKSA9PiBub2RlSWRzLmhhcyhlLnNvdXJjZU5vZGVJZCkgJiYgbm9kZUlkcy5oYXMoZS50YXJnZXROb2RlSWQpXG4gICAgKTtcblxuICAgIC8vIENvbXB1dGUgaW4tZGVncmVlXG4gICAgY29uc3QgaW5kZWdyZWUgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBleGVjdXRhYmxlTm9kZXMpIGluZGVncmVlLnNldChub2RlLmlkLCAwKTtcbiAgICBmb3IgKGNvbnN0IGVkZ2Ugb2YgZXhlY0VkZ2VzKSB7XG4gICAgICBpbmRlZ3JlZS5zZXQoZWRnZS50YXJnZXROb2RlSWQsIChpbmRlZ3JlZS5nZXQoZWRnZS50YXJnZXROb2RlSWQpID8/IDApICsgMSk7XG4gICAgfVxuXG4gICAgY29uc3QgbGF5ZXJzOiBHcmFwaEV4ZWN1dGlvblBsYW5MYXllcltdID0gW107XG4gICAgY29uc3QgcGxhbm5lZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGxldCByZWFkeSA9IGV4ZWN1dGFibGVOb2Rlcy5maWx0ZXIoKG4pID0+IChpbmRlZ3JlZS5nZXQobi5pZCkgPz8gMCkgPT09IDApO1xuICAgIGxldCBsYXllckluZGV4ID0gMDtcblxuICAgIHdoaWxlIChyZWFkeS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsYXllcjogR3JhcGhFeGVjdXRpb25QbGFuTGF5ZXIgPSB7IGluZGV4OiBsYXllckluZGV4KyssIG5vZGVzOiByZWFkeSB9O1xuICAgICAgbGF5ZXJzLnB1c2gobGF5ZXIpO1xuICAgICAgY29uc3QgbmV4dFJlYWR5OiBHcmFwaEV4ZWN1dGlvblBsYW5Ob2RlW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiByZWFkeSkge1xuICAgICAgICBwbGFubmVkLmFkZChub2RlLmlkKTtcbiAgICAgICAgY29uc3Qgb3V0Z29pbmcgPSBleGVjRWRnZXMuZmlsdGVyKChlKSA9PiBlLnNvdXJjZU5vZGVJZCA9PT0gbm9kZS5pZCk7XG4gICAgICAgIGZvciAoY29uc3QgZWRnZSBvZiBvdXRnb2luZykge1xuICAgICAgICAgIGNvbnN0IGRlZyA9IChpbmRlZ3JlZS5nZXQoZWRnZS50YXJnZXROb2RlSWQpID8/IDEpIC0gMTtcbiAgICAgICAgICBpbmRlZ3JlZS5zZXQoZWRnZS50YXJnZXROb2RlSWQsIGRlZyk7XG4gICAgICAgICAgaWYgKGRlZyA9PT0gMCAmJiAhcGxhbm5lZC5oYXMoZWRnZS50YXJnZXROb2RlSWQpKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gZXhlY3V0YWJsZU5vZGVzLmZpbmQoKG4pID0+IG4uaWQgPT09IGVkZ2UudGFyZ2V0Tm9kZUlkKTtcbiAgICAgICAgICAgIGlmIChuZXh0KSBuZXh0UmVhZHkucHVzaChuZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlYWR5ID0gbmV4dFJlYWR5O1xuICAgIH1cblxuICAgIGlmIChwbGFubmVkLnNpemUgIT09IGV4ZWN1dGFibGVOb2Rlcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHVucGxhbm5lZCA9IGV4ZWN1dGFibGVOb2Rlc1xuICAgICAgICAuZmlsdGVyKChuKSA9PiAhcGxhbm5lZC5oYXMobi5pZCkpXG4gICAgICAgIC5tYXAoKG4pID0+IG4uaWQpO1xuICAgICAgdGhyb3cgbmV3IEdyYXBoQ3ljbGVFcnJvcih7XG4gICAgICAgIHVucGxhbm5lZE5vZGVzOiB1bnBsYW5uZWQsXG4gICAgICAgIHdvcmtmbG93SWQ6IG5vZGVzWzBdPy5kZWZpbml0aW9uPy5uYW1lLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxheWVycztcbiAgfVxufVxuIl19
|
|
197
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhFeGVjdXRpb25QbGFubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR3JhcGhFeGVjdXRpb25QbGFubmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlEQUFrRTtBQUNsRSxvREFBNEQ7QUFDNUQsdUVBQWlFO0FBQ2pFLDZFQUF1RTtBQUN2RSx5RUFBbUU7QUFDbkU7OztHQUdHO0FBQ0gsTUFBYSxxQkFBcUI7SUFDOUIsWUFBWSxRQUFRO1FBQ2hCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxJQUFJLElBQUksZ0RBQXFCLEVBQUUsQ0FBQztJQUM1RCxDQUFDO0lBQ0Q7Ozs7Ozs7T0FPRztJQUNILElBQUksQ0FBQyxRQUFRO1FBQ1QsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BELE9BQU87WUFDSCxRQUFRO1lBQ1IsVUFBVSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1lBQ3pCLEtBQUs7WUFDTCxLQUFLO1lBQ0wsTUFBTTtZQUNOLGNBQWM7WUFDZCxjQUFjO1NBQ2pCLENBQUM7SUFDTixDQUFDO0lBQ0Q7O09BRUc7SUFDSCxxQkFBcUIsQ0FBQyxRQUFRO1FBQzFCLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDdkIsS0FBSyxN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Z0JBQ0wsQ0FBQztZQUNMLENBQUM7WUFDRCxLQUFLLEdBQUcsU0FBUyxDQUFDO1FBQ3RCLENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzFDLE1BQU0sU0FBUyxHQUFHLGVBQWU7aUJBQzVCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDakMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdEIsTUFBTSxJQUFJLG9DQUFlLENBQUM7Z0JBQ3RCLGNBQWMsRUFBRSxTQUFTO2dCQUN6QixVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJO2FBQ3pDLENBQUMsQ0FBQztRQUNQLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0NBQ0o7QUFyTEQsc0RBcUxDO0FBQ0Qsc2lsQkFBc2lsQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdyYXBoRGVmaW5pdGlvbk9mIH0gZnJvbSBcIkBkZWNhZi10cy91aS1kZWNvcmF0b3JzL2dyYXBoXCI7XG5pbXBvcnQgeyBHUkFQSF9XT1JLRkxPV19CT1VOREFSWSB9IGZyb20gXCIuLy4uL2NvbnN0YW50cy5qc1wiO1xuaW1wb3J0IHsgR3JhcGhDeWNsZUVycm9yIH0gZnJvbSBcIi4vLi4vZXJyb3JzL0dyYXBoQ3ljbGVFcnJvci5qc1wiO1xuaW1wb3J0IHsgR3JhcGhUb3BvbG9neUVycm9yIH0gZnJvbSBcIi4vLi4vZXJyb3JzL0dyYXBoVG9wb2xvZ3lFcnJvci5qc1wiO1xuaW1wb3J0IHsgR3JhcGhSZWxhdGlvblJlc29sdmVyIH0gZnJvbSBcIi4vR3JhcGhSZWxhdGlvblJlc29sdmVyLmpzXCI7XG4vKipcbiAqIFBsYW5uZXIgdGhhdCB0dXJucyBhIHtAbGluayBHcmFwaFdvcmtmbG93RGVmaW5pdGlvbn0gaW50byBhXG4gKiB7QGxpbmsgR3JhcGhFeGVjdXRpb25QbGFufSB3aXRoIHRvcG9sb2dpY2FsIGxheWVycy5cbiAqL1xuZXhwb3J0IGNsYXNzIEdyYXBoRXhlY3V0aW9uUGxhbm5lciB7XG4gICAgY29uc3RydWN0b3IocmVzb2x2ZXIpIHtcbiAgICAgICAgdGhpcy5yZXNvbHZlciA9IHJlc29sdmVyID8/IG5ldyBHcmFwaFJlbGF0aW9uUmVzb2x2ZXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGxhbnMgYSB3b3JrZmxvdyBmb3IgZXhlY3V0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHdvcmtmbG93IC0gVGhlIHdvcmtmbG93IGRlZmluaXRpb24gdG8gcGxhbi5cbiAgICAgKiBAcmV0dXJucyBUaGUgZXhlY3V0aW9uIHBsYW4gd2l0aCBub2RlcywgZWRnZXMsIGxheWVycywgYW5kIG1hcHMuXG4gICAgICogQHRocm93cyB7R3JhcGhUb3BvbG9neUVycm9yfSB3aGVuIG5vZGUgSURzIGFyZSBub3QgdW5pcXVlLlxuICAgICAqIEB0aHJvd3Mge0dyYXBoQ3ljbGVFcnJvcn0gd2hlbiB0aGUgd29ya2Zsb3cgY29udGFpbnMgYW4gdW5zdXBwb3J0ZWQgY3ljbGUuXG4gICAgICovXG4gICAgcGxhbih3b3JrZmxvdykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlVW5pcXVlTm9kZUlkcyh3b3JrZmxvdyk7XG4gICAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5yZXNvbHZlTm9kZXMod29ya2Zsb3cpO1xuICAgICAgICBjb25zdCBlZGdlcyA9IHRoaXMucmVzb2x2ZXIucmVzb2x2ZSh3b3JrZmxvdyk7XG4gICAgICAgIGNvbnN0IGluY29taW5nQnlOb2RlID0gdGhpcy5idWlsZEluY29taW5nTWFwKGVkZ2VzKTtcbiAgICAgICAgY29uc3Qgb3V0Z29pbmdCeU5vZGUgPSB0aGlzLmJ1aWxkT3V0Z29pbmdNYXAoZWRnZXMpO1xuICAgICAgICBjb25zdCBsYXllcnMgPSB0aGlzLnRvcG9sb2dpY2FsTGF5ZXJzKG5vZGVzLCBlZGdlcyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3b3JrZmxvdyxcbiAgICAgICAgICAgIHdvcmtmbG93SWQ6IHdvcmtmbG93Lm5hbWUsXG4gICAgICAgICAgICBub2RlcyxcbiAgICAgICAgICAgIGVkZ2VzLFxuICAgICAgICAgICAgbGF5ZXJzLFxuICAgICAgICAgICAgaW5jb21pbmdCeU5vZGUsXG4gICAgICAgICAgICBvdXRnb2luZ0J5Tm9kZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVmFsaWRhdGVzIHRoYXQgYWxsIHdvcmtmbG93IG5vZGUgSURzIGFyZSB1bmlxdWUuXG4gICAgICovXG4gICAgdmFsaWRhdGVVbmlxdWVOb2RlSWRzKHdvcmtmbG93KSB7XG4gICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0KCk7XG4gICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiB3b3JrZmxvdy5ub2RlcyA/PyBbXSkge1xuICAgICAgICAgICAgaWYgKHNlZW4uaGFzKG5vZGUuaWQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyYXBoVG9wb2xvZ3lFcnJvcihgRHVwbGljYXRlIG5vZGUgaWQgJyR7bm9kZS5pZH0nIGluIHdvcmtmbG93ICcke3dvcmtmbG93Lm5hbWV9J2AsIHsgbm9kZUlkOiBub2RlLmlkLCB3b3JrZmxvd0lkOiB3b3JrZmxvdy5uYW1lIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2Vlbi5hZGQobm9kZS5pZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzb2x2ZXMgd29ya2Zsb3cgbm9kZSBtZXRhZGF0YSBpbnRvIHBsYW4gbm9kZXMgd2l0aCBmdWxsIGRlZmluaXRpb25zLlxuICAgICAqL1xuICAgIHJlc29sdmVOb2Rlcyh3b3JrZmxvdykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBub2RlTWV0YSBvZiB3b3JrZmxvdy5ub2RlcyA/PyBbXSkge1xuICAgICAgICAgICAgY29uc3QgZGVmaW5pdGlvbiA9IHRoaXMucmVzb2x2ZURlZmluaXRpb24obm9kZU1ldGEpO1xuICAgICAgICAgICAgY29uc3QgaW5wdXRQb3J0cyA9IChkZWZpbml0aW9uLnBvcnRzID8/IFtdKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHApID0+IHAuZGlyZWN0aW9uID09PSBcImlucHV0XCIpXG4gICAgICAgICAgICAgICAgLm1hcCgocCkgPT4gcC5uYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dFBvcnRzID0gKGRlZmluaXRpb24ucG9ydHMgPz8gW10pXG4gICAgICAgICAgICAgICAgLmZpbHRlcigocCkgPT4gcC5kaXJlY3Rpb24gPT09IFwib3V0cHV0XCIpXG4gICAgICAgICAgICAgICAgLm1hcCgocCkgPT4gcC5uYW1lKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgICAgICBpZDogbm9kZU1ldGEuaWQsXG4gICAgICAgICAgICAgICAga2luZDogbm9kZU1ldGEua2luZCA/PyBkZWZpbml0aW9uLmtpbmQgPz8gbm9kZU1ldGEuaWQsXG4gICAgICAgICAgICAgICAgbGFiZWw6IG5vZGVNZXRhLmxhYmVsLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogbm9kZU1ldGEsXG4gICAgICAgICAgICAgICAgZGVmaW5pdGlvbixcbiAgICAgICAgICAgICAgICBpbnB1dFBvcnRzLFxuICAgICAgICAgICAgICAgIG91dHB1dFBvcnRzLFxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBub2RlTWV0YS5tZXRhZGF0YSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEF0dGVtcHRzIHRvIHJlc29sdmUgdGhlIGZ1bGwgZ3JhcGggbm9kZSBkZWZpbml0aW9uIGZyb20gbWV0YWRhdGEuXG4gICAgICpcbiAgICAgKiBBY2NlcHRzIGVpdGhlciBhIGRlY29yYXRlZCBNb2RlbCBjbGFzcy9pbnN0YW5jZSAocmVzb2x2ZWQgdmlhXG4gICAgICogYGdyYXBoRGVmaW5pdGlvbk9mYCkgb3IgYSBwbGFpbiBgR3JhcGhOb2RlRGVmaW5pdGlvbmAtc2hhcGVkIG9iamVjdFxuICAgICAqICh1c2VmdWwgZm9yIHNlcmlhbGl6ZWQgd29ya2Zsb3dzIHRoYXQgaW5saW5lIG5vZGUgZGVmaW5pdGlvbnMpLlxuICAgICAqL1xuICAgIHJlc29sdmVEZWZpbml0aW9uKG5vZGVNZXRhKSB7XG4gICAgICAgIGlmIChub2RlTWV0YS5ub2RlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1Jhd0RlZmluaXRpb24obm9kZU1ldGEubm9kZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZU1ldGEubm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdyYXBoRGVmaW5pdGlvbk9mKG5vZGVNZXRhLm5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byBzdHViXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmV0dXJuIGEgbWluaW1hbCBzdHViIGRlZmluaXRpb24gc28gcGxhbm5pbmcgY2FuIHByb2NlZWRcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IG5vZGVNZXRhLmlkLFxuICAgICAgICAgICAgdGFnOiBub2RlTWV0YS5pZCxcbiAgICAgICAgICAgIGtpbmQ6IG5vZGVNZXRhLmtpbmQgPz8gbm9kZU1ldGEuaWQsXG4gICAgICAgICAgICBsYWJlbHM6IFtdLFxuICAgICAgICAgICAgcG9ydHM6IFtdLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCB3aGVuIGEgdmFsdWUgbG9va3MgbGlrZSBhIHJhdyB7QGxpbmsgR3JhcGhOb2RlRGVmaW5pdGlvbn1cbiAgICAgKiAoYSBwbGFpbiBvYmplY3Qgd2l0aCBhIGBwb3J0c2AgYXJyYXkgYW5kIGEgYG5hbWVgIHN0cmluZykuXG4gICAgICovXG4gICAgaXNSYXdEZWZpbml0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUubmFtZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZS5wb3J0cykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgYSBtYXAgb2Ygbm9kZSBpZCAtPiBpbmNvbWluZyBlZGdlcy5cbiAgICAgKi9cbiAgICBidWlsZEluY29taW5nTWFwKGVkZ2VzKSB7XG4gICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgZm9yIChjb25zdCBlZGdlIG9mIGVkZ2VzKSB7XG4gICAgICAgICAgICBjb25zdCBsaXN0ID0gbWFwLmdldChlZGdlLnRhcmdldE5vZGVJZCkgPz8gW107XG4gICAgICAgICAgICBsaXN0LnB1c2goZWRnZSk7XG4gICAgICAgICAgICBtYXAuc2V0KGVkZ2UudGFyZ2V0Tm9kZUlkLCBsaXN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgYSBtYXAgb2Ygbm9kZSBpZCAtPiBvdXRnb2luZyBlZGdlcy5cbiAgICAgKi9cbiAgICBidWlsZE91dGdvaW5nTWFwKGVkZ2VzKSB7XG4gICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgZm9yIChjb25zdCBlZGdlIG9mIGVkZ2VzKSB7XG4gICAgICAgICAgICBjb25zdCBsaXN0ID0gbWFwLmdldChlZGdlLnNvdXJjZU5vZGVJZCkgPz8gW107XG4gICAgICAgICAgICBsaXN0LnB1c2goZWRnZSk7XG4gICAgICAgICAgICBtYXAuc2V0KGVkZ2Uuc291cmNlTm9kZUlkLCBsaXN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9kdWNlcyB0b3BvbG9naWNhbCBsYXllcnMgdXNpbmcgS2FobidzIGFsZ29yaXRobS5cbiAgICAgKlxuICAgICAqIFdvcmtmbG93IGJvdW5kYXJ5IGVkZ2VzIGRvIG5vdCBjb3VudCBhcyBleGVjdXRhYmxlLW5vZGUgZGVwZW5kZW5jaWVzLlxuICAgICAqL1xuICAgIHRvcG9sb2dpY2FsTGF5ZXJzKG5vZGVzLCBlZGdlcykge1xuICAgICAgICBjb25zdCBleGVjdXRhYmxlTm9kZXMgPSBub2Rlcy5maWx0ZXIoKG4pID0+IG4uaWQgIT09IEdSQVBIX1dPUktGTE9XX0JPVU5EQVJZKTtcbiAgICAgICAgY29uc3Qgbm9kZUlkcyA9IG5ldyBTZXQoZXhlY3V0YWJsZU5vZGVzLm1hcCgobikgPT4gbi5pZCkpO1xuICAgICAgICAvLyBPbmx5IGVkZ2VzIGJldHdlZW4gdHdvIGV4ZWN1dGFibGUgbm9kZXMgY291bnQgYXMgZGVwZW5kZW5jaWVzXG4gICAgICAgIGNvbnN0IGV4ZWNFZGdlcyA9IGVkZ2VzLmZpbHRlcigoZSkgPT4gbm9kZUlkcy5oYXMoZS5zb3VyY2VOb2RlSWQpICYmIG5vZGVJZHMuaGFzKGUudGFyZ2V0Tm9kZUlkKSk7XG4gICAgICAgIC8vIENvbXB1dGUgaW4tZGVncmVlXG4gICAgICAgIGNvbnN0IGluZGVncmVlID0gbmV3IE1hcCgpO1xuICAgICAgICBmb3IgKGNvbnN0IG5vZGUgb2YgZXhlY3V0YWJsZU5vZGVzKVxuICAgICAgICAgICAgaW5kZWdyZWUuc2V0KG5vZGUuaWQsIDApO1xuICAgICAgICBmb3IgKGNvbnN0IGVkZ2Ugb2YgZXhlY0VkZ2VzKSB7XG4gICAgICAgICAgICBpbmRlZ3JlZS5zZXQoZWRnZS50YXJnZXROb2RlSWQsIChpbmRlZ3JlZS5nZXQoZWRnZS50YXJnZXROb2RlSWQpID8/IDApICsgMSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGF5ZXJzID0gW107XG4gICAgICAgIGNvbnN0IHBsYW5uZWQgPSBuZXcgU2V0KCk7XG4gICAgICAgIGxldCByZWFkeSA9IGV4ZWN1dGFibGVOb2Rlcy5maWx0ZXIoKG4pID0+IChpbmRlZ3JlZS5nZXQobi5pZCkgPz8gMCkgPT09IDApO1xuICAgICAgICBsZXQgbGF5ZXJJbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChyZWFkeS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllciA9IHsgaW5kZXg6IGxheWVySW5kZXgrKywgbm9kZXM6IHJlYWR5IH07XG4gICAgICAgICAgICBsYXllcnMucHVzaChsYXllcik7XG4gICAgICAgICAgICBjb25zdCBuZXh0UmVhZHkgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiByZWFkeSkge1xuICAgICAgICAgICAgICAgIHBsYW5uZWQuYWRkKG5vZGUuaWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG91dGdvaW5nID0gZXhlY0VkZ2VzLmZpbHRlcigoZSkgPT4gZS5zb3VyY2VOb2RlSWQgPT09IG5vZGUuaWQpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZWRnZSBvZiBvdXRnb2luZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWcgPSAoaW5kZWdyZWUuZ2V0KGVkZ2UudGFyZ2V0Tm9kZUlkKSA/PyAxKSAtIDE7XG4gICAgICAgICAgICAgICAgICAgIGluZGVncmVlLnNldChlZGdlLnRhcmdldE5vZGVJZCwgZGVnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlZyA9PT0gMCAmJiAhcGxhbm5lZC5oYXMoZWRnZS50YXJnZXROb2RlSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gZXhlY3V0YWJsZU5vZGVzLmZpbmQoKG4pID0+IG4uaWQgPT09IGVkZ2UudGFyZ2V0Tm9kZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRSZWFkeS5wdXNoKG5leHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVhZHkgPSBuZXh0UmVhZHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBsYW5uZWQuc2l6ZSAhPT0gZXhlY3V0YWJsZU5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgdW5wbGFubmVkID0gZXhlY3V0YWJsZU5vZGVzXG4gICAgICAgICAgICAgICAgLmZpbHRlcigobikgPT4gIXBsYW5uZWQuaGFzKG4uaWQpKVxuICAgICAgICAgICAgICAgIC5tYXAoKG4pID0+IG4uaWQpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEdyYXBoQ3ljbGVFcnJvcih7XG4gICAgICAgICAgICAgICAgdW5wbGFubmVkTm9kZXM6IHVucGxhbm5lZCxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd0lkOiBub2Rlc1swXT8uZGVmaW5pdGlvbj8ubmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYXllcnM7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pUjNKaGNHaEZlR1ZqZFhScGIyNVFiR0Z1Ym1WeUxtcHpJaXdpYzI5MWNtTmxVbTl2ZENJNklpSXNJbk52ZFhKalpYTWlPbHNpTGk0dkxpNHZMaTR2TGk0dkxpNHZjM0pqTDJkeVlYQm9MMlZ1WjJsdVpTOXdiR0Z1Ym1sdVp5OUhjbUZ3YUVWNFpXTjFkR2x2YmxCc1lXNXVaWEl1ZEhNaVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWtGQlUwRXNUMEZCVHl4RlFVRkZMR2xDUVVGcFFpeEZRVUZGTEUxQlFVMHNLMEpCUVN0Q0xFTkJRVU03UVVGRmJFVXNUMEZCVHl4RlFVRkZMSFZDUVVGMVFpeEZRVUZGTERCQ1FVRnhRanRCUVVOMlJDeFBRVUZQTEVWQlFVVXNaVUZCWlN4RlFVRkZMSFZEUVVGclF6dEJRVU0xUkN4UFFVRlBMRVZCUVVVc2EwSkJRV3RDTEVWQlFVVXNNRU5CUVhGRE8wRkJTMnhGTEU5QlFVOHNSVUZCUlN4eFFrRkJjVUlzUlVGQlJTeHRRMEZCWjBNN1FVRkZhRVU3T3p0SFFVZEhPMEZCUTBnc1RVRkJUU3hQUVVGUExIRkNRVUZ4UWp0SlFVZG9ReXhaUVVGWkxGRkJRV2RETzFGQlF6RkRMRWxCUVVrc1EwRkJReXhSUVVGUkxFZEJRVWNzVVVGQlVTeEpRVUZKTEVsQlFVa3NjVUpCUVhGQ0xFVkJRVVVzUTBGQlF6dEpRVU14UkN4RFFVRkRPMGxCUlVRN096czdPenM3VDBGUFJ6dEpRVU5JTEVsQlFVa3NRMEZCUXl4UlFVRnBRenRSUVVOd1F5eEpRVUZKTEVOQlFVTXNjVUpCUVhGQ0xFTkJRVU1zVVVGQlVTeERRVUZETEVOQlFVTTdVVUZGY2tNc1RVRkJUU3hMUVVGTExFZEJRVWNzU1VGQlNTeERRVUZETEZsQlFWa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJRenRSUVVNeFF5eE5RVUZOTEV0QlFVc3NSMEZCUnl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFOUJRVThzUTBGQlF5eFJRVUZSTEVOQlFVTXNRMEZCUXp0UlFVVTVReXhOUVVGTkxHTkJRV01zUjBGQlJ5eEpRVUZKTEVOQlFVTXNaMEpCUVdkQ0xFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTTdVVUZEY0VRc1RVRkJUU3hqUVVGakxFZEJRVWNzU1VGQlNTeERRVUZETEdkQ1FVRm5RaXhEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzFGQlJYQkVMRTFCUVUwc1RVRkJUU3hIUVVGSExFbEJRVWtzUTBGQlF5eHBRa0ZCYVVJc1EwRkJReXhMUVVGTExFVkJRVVVzUzBGQlN5eERRVUZETEVOQlFVTTdVVUZGY0VRc1QwRkJUenRaUVVOTUxGRkJRVkU3V1VGRFVpeFZRVUZWTEVWQlFVVXNVVUZCVVN4RFFVRkRMRWxCUVVrN1dVRkRla0lzUzBGQlN6dFpRVU5NTEV0QlFVczdXVUZEVEN4TlFVRk5PMWxCUTA0c1kwRkJZenRaUVVOa0xHTkJRV003VTBGRFppeERRVUZETzBsQlEwb3NRMEZCUXp0SlFVVkVPenRQUVVWSE8wbEJRMHNzY1VKQlFYRkNMRU5CUVVNc1VVRkJhVU03VVVGRE4wUXNUVUZCVFN4SlFVRkpMRWRCUVVjc1NVRkJTU3hIUVVGSExFVkJRVlVzUTBGQlF6dFJRVU12UWl4TFFVRkxMRTFCUVUwc1NVRkJTU3hKUVVGSkxGRkJRVkVzUTBGQlF5eExRVUZMTEVsQlFVa3NSVUZCUlN4RlFVRkZMRU5CUVVNN1dVRkRlRU1zU1VGQlNTeEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWxCUVVrc1EwRkJReXhGUVVGRkxFTkJRVU1zUlVGQlJTeERRVUZETzJkQ1FVTjBRaXhOUVVGTkxFbEJRVWtzYTBKQlFXdENMRU5CUXpGQ0xITkNRVUZ6UWl4SlFVRkpMRU5CUVVNc1JVRkJSU3hyUWtGQmEwSXNVVUZCVVN4RFFVRkRMRWxCUVVrc1IwRkJSeXhGUVVNdlJDeEZRVUZGTEUxQlFVMHNSVUZCUlN4SlFVRkpMRU5CUVVNc1JVRkJSU3hGUVVGRkxGVkJRVlVzUlVGQlJTeFJRVUZSTEVOQlFVTXNTVUZCU1N4RlFVRkZMRU5CUXk5RExFTkJRVU03V1VGRFNpeERRVUZETzFsQlEwUXNTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhKUVVGSkxFTkJRVU1zUlVGQlJTeERRVUZETEVOQlFVTTdVVUZEY0VJc1EwRkJRenRKUVVOSUxFTkJRVU03U1VGRlJEczdUMEZGUnp0SlFVTkxMRmxCUVZrc1EwRkRiRUlzVVVGQmFVTTdVVUZGYWtNc1RVRkJUU3hOUVVGTkxFZEJRVFpDTEVWQlFVVXNRMEZCUXp0UlFVTTFReXhMUVVGTExFMUJRVTBzVVVGQlVTeEpRVUZKTEZGQlFWRXNRMEZCUXl4TFFVRkxMRWxCUVVrc1JVRkJSU3hGUVVGRkxFTkJRVU03V1VGRE5VTXNUVUZCVFN4VlFVRlZMRWRCUVVjc1NVRkJTU3hEUVVGRExHbENRVUZwUWl4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRE8xbEJRM0JFTEUxQlFVMHNWVUZCVlN4SFFVRkhMRU5CUVVNc1ZVRkJWU3hEUVVGRExFdEJRVXNzU1VGQlNTeEZRVUZGTEVOQlFVTTdhVUpCUTNoRExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNSVUZCUlN4RlFVRkZMRU5CUVVNc1EwRkJReXhEUVVGRExGTkJRVk1zUzBGQlN5eFBRVUZQTEVOQlFVTTdhVUpCUTNSRExFZEJRVWNzUTBGQlF5eERRVUZETEVOQlFVTXNSVUZCUlN4RlFVRkZMRU5CUVVNc1EwRkJReXhEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETzFsQlEzUkNMRTFCUVUwc1YwRkJWeXhIUVVGSExFTkJRVU1zVlVGQlZTeERRVUZETEV0QlFVc3NTVUZCU1N4RlFVRkZMRU5CUVVNN2FVSkJRM3BETEUxQlFVMHNRMEZCUXl4RFFVRkRMRU5CUVVNc1JVRkJSU3hGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETEZOQlFWTXNTMEZCU3l4UlFVRlJMRU5CUVVNN2FVSkJRM1pETEVkQlFVY3NRMEZCUXl4RFFVRkRMRU5CUVVNc1JVRkJSU3hGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRPMWxCUTNSQ0xFMUJRVTBzUTBGQlF5eEpRVUZKTEVOQlFVTTdaMEpCUTFZc1JVRkJSU3hGUVVGRkxGRkJRVkVzUTBGQlF5eEZRVUZGTzJkQ1FVTm1MRWxCUVVrc1JVRkJSU3hSUVVGUkxFTkJRVU1zU1VGQlNTeEpRVUZKTEZWQlFWVXNRMEZCUXl4SlFVRkpMRWxCUVVrc1VVRkJVU3hEUVVGRExFVkJRVVU3WjBKQlEzSkVMRXRCUVVzc1JVRkJSU3hSUVVGUkxFTkJRVU1zUzBGQlN6dG5Ra0ZEY2tJc1RVRkJUU3hGUVVGRkxGRkJRVkU3WjBKQlEyaENMRlZCUVZVN1owSkJRMVlzVlVGQlZUdG5Ra0ZEVml4WFFVRlhPMmRDUVVOWUxGRkJRVkVzUlVGQlJTeFJRVUZSTEVOQlFVTXNVVUZCVVR0aFFVTTFRaXhEUVVGRExFTkJRVU03VVVGRFRDeERRVUZETzFGQlEwUXNUMEZCVHl4TlFVRk5MRU5CUVVNN1NVRkRhRUlzUTBGQlF6dEpRVVZFT3pzN096czdUMEZOUnp0SlFVTkxMR2xDUVVGcFFpeERRVUZETEZGQlNYcENPMUZCUTBNc1NVRkJTU3hSUVVGUkxFTkJRVU1zU1VGQlNTeEZRVUZGTEVOQlFVTTdXVUZEYkVJc1NVRkJTU3hKUVVGSkxFTkJRVU1zWlVGQlpTeERRVUZETEZGQlFWRXNRMEZCUXl4SlFVRkpMRU5CUVVNc1JVRkJSU3hEUVVGRE8yZENRVU40UXl4UFFVRlBMRkZCUVZFc1EwRkJReXhKUVVFeVFpeERRVUZETzFsQlF6bERMRU5CUVVNN1dVRkRSQ3hKUVVGSkxFTkJRVU03WjBKQlEwZ3NUMEZCVHl4cFFrRkJhVUlzUTBGQlF5eFJRVUZSTEVOQlFVTXNTVUZCVnl4RFFVRkRMRU5CUVVNN1dVRkRha1FzUTBGQlF6dFpRVUZETEUxQlFVMHNRMEZCUXp0blFrRkRVQ3gxUWtGQmRVSTdXVUZEZWtJc1EwRkJRenRSUVVOSUxFTkJRVU03VVVGRFJDd3lSRUZCTWtRN1VVRkRNMFFzVDBGQlR6dFpRVU5NTEVsQlFVa3NSVUZCUlN4UlFVRlJMRU5CUVVNc1JVRkJSVHRaUVVOcVFpeEhRVUZITEVWQlFVVXNVVUZCVVN4RFFVRkRMRVZCUVVVN1dVRkRhRUlzU1VGQlNTeEZRVUZGTEZGQlFWRXNRMEZCUXl4SlFVRkpMRWxCUVVrc1VVRkJVU3hEUVVGRExFVkJRVVU3V1VGRGJFTXNUVUZCVFN4RlFVRkZMRVZCUVVVN1dVRkRWaXhMUVVGTExFVkJRVVVzUlVGQlJUdFRRVU5XTEVOQlFVTTdTVUZEU2l4RFFVRkRPMGxCUlVRN096dFBRVWRITzBsQlEwc3NaVUZCWlN4RFFVRkRMRXRCUVdNN1VVRkRjRU1zVDBGQlR5eERRVU5NTEU5QlFVOHNTMEZCU3l4TFFVRkxMRkZCUVZFN1dVRkRla0lzUzBGQlN5eExRVUZMTEVsQlFVazdXVUZEWkN4RFFVRkRMRXRCUVVzc1EwRkJReXhQUVVGUExFTkJRVU1zUzBGQlN5eERRVUZETzFsQlEzSkNMRTlCUVZFc1MwRkJORUlzUTBGQlF5eEpRVUZKTEV0QlFVc3NVVUZCVVR0WlFVTjBSQ3hMUVVGTExFTkJRVU1zVDBGQlR5eERRVUZGTEV0QlFUWkNMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRM0JFTEVOQlFVTTdTVUZEU2l4RFFVRkRPMGxCUlVRN08wOUJSVWM3U1VGRFN5eG5Ra0ZCWjBJc1EwRkRkRUlzUzBGQkswSTdVVUZGTDBJc1RVRkJUU3hIUVVGSExFZEJRVWNzU1VGQlNTeEhRVUZITEVWQlFXOURMRU5CUVVNN1VVRkRlRVFzUzBGQlN5eE5RVUZOTEVsQlFVa3NTVUZCU1N4TFFVRkxMRVZCUVVVc1EwRkJRenRaUVVONlFpeE5RVUZOTEVsQlFVa3NSMEZCUnl4SFFVRkhMRU5CUVVNc1IwRkJSeXhEUVVGRExFbEJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTXNTVUZCU1N4RlFVRkZMRU5CUVVNN1dVRkRPVU1zU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJRenRaUVVOb1FpeEhRVUZITEVOQlFVTXNSMEZCUnl4RFFVRkRMRWxCUVVrc1EwRkJReXhaUVVGWkxFVkJRVVVzU1VGQlNTeERRVUZETEVOQlFVTTdVVUZEYmtNc1EwRkJRenRSUVVORUxFOUJRVThzUjBGQlJ5eERRVUZETzBsQlEySXNRMEZCUXp0SlFVVkVPenRQUVVWSE8wbEJRMHNzWjBKQlFXZENMRU5CUTNSQ0xFdEJRU3RDTzFGQlJTOUNMRTFCUVUwc1IwRkJSeXhIUVVGSExFbEJRVWtzUjBGQlJ5eEZRVUZ2UXl4RFFVRkRPMUZCUTNoRUxFdEJRVXNzVFVGQlRTeEpRVUZKTEVsQlFVa3NTMEZCU3l4RlFVRkZMRU5CUVVNN1dVRkRla0lzVFVGQlRTeEpRVUZKTEVkQlFVY3NSMEZCUnl4RFFVRkRMRWRCUVVjc1EwRkJReXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEVsQlFVa3NSVUZCUlN4RFFVRkRPMWxCUXpsRExFbEJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNN1dVRkRhRUlzUjBGQlJ5eERRVUZETEVkQlFVY3NRMEZCUXl4SlFVRkpMRU5CUVVNc1dVRkJXU3hGUVVGRkxFbEJRVWtzUTBGQlF5eERRVUZETzFGQlEyNURMRU5CUVVNN1VVRkRSQ3hQUVVGUExFZEJRVWNzUTBGQlF6dEpRVU5pTEVOQlFVTTdTVUZGUkRzN096dFBRVWxITzBsQlEwc3NhVUpCUVdsQ0xFTkJRM1pDTEV0QlFTdENMRVZCUXk5Q0xFdEJRU3RDTzFGQlJTOUNMRTFCUVUwc1pVRkJaU3hIUVVGSExFdEJRVXNzUTBGQlF5eE5RVUZOTEVOQlEyeERMRU5CUVVNc1EwRkJReXhGUVVGRkxFVkJRVVVzUTBGQlF5eERRVUZETEVOQlFVTXNSVUZCUlN4TFFVRkxMSFZDUVVGMVFpeERRVU40UXl4RFFVRkRPMUZCUTBZc1RVRkJUU3hQUVVGUExFZEJRVWNzU1VGQlNTeEhRVUZITEVOQlFVTXNaVUZCWlN4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRExFTkJRVU1zUlVGQlJTeEZRVUZGTEVOQlFVTXNRMEZCUXl4RFFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU03VVVGRk1VUXNaMFZCUVdkRk8xRkJRMmhGTEUxQlFVMHNVMEZCVXl4SFFVRkhMRXRCUVVzc1EwRkJReXhOUVVGTkxFTkJRelZDTEVOQlFVTXNRMEZCUXl4RlFVRkZMRVZCUVVVc1EwRkJReXhQUVVGUExFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXl4WlFVRlpMRU5CUVVNc1NVRkJTU3hQUVVGUExFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXl4WlFVRlpMRU5CUVVNc1EwRkRiRVVzUTBGQlF6dFJRVVZHTEc5Q1FVRnZRanRSUVVOd1FpeE5RVUZOTEZGQlFWRXNSMEZCUnl4SlFVRkpMRWRCUVVjc1JVRkJhMElzUTBGQlF6dFJRVU16UXl4TFFVRkxMRTFCUVUwc1NVRkJTU3hKUVVGSkxHVkJRV1U3V1VGQlJTeFJRVUZSTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWxCUVVrc1EwRkJReXhGUVVGRkxFVkJRVVVzUTBGQlF5eERRVUZETEVOQlFVTTdVVUZETjBRc1MwRkJTeXhOUVVGTkxFbEJRVWtzU1VGQlNTeFRRVUZUTEVWQlFVVXNRMEZCUXp0WlFVTTNRaXhSUVVGUkxFTkJRVU1zUjBGQlJ5eERRVUZETEVsQlFVa3NRMEZCUXl4WlFVRlpMRVZCUVVVc1EwRkJReXhSUVVGUkxFTkJRVU1zUjBGQlJ5eERRVUZETEVsQlFVa3NRMEZCUXl4WlFVRlpMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXp0UlFVTTVSU3hEUVVGRE8xRkJSVVFzVFVGQlRTeE5RVUZOTEVkQlFUaENMRVZCUVVVc1EwRkJRenRSUVVNM1F5eE5RVUZOTEU5QlFVOHNSMEZCUnl4SlFVRkpMRWRCUVVjc1JVRkJWU3hEUVVGRE8xRkJRMnhETEVsQlFVa3NTMEZCU3l4SFFVRkhMR1ZCUVdVc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVVXNSVUZCUlN4RFFVRkRMRU5CUVVNc1VVRkJVU3hEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEVOQlFVTXNSVUZCUlN4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETEVOQlFVTTdVVUZETTBVc1NVRkJTU3hWUVVGVkxFZEJRVWNzUTBGQlF5eERRVUZETzFGQlJXNUNMRTlCUVU4c1MwRkJTeXhEUVVGRExFMUJRVTBzUjBGQlJ5eERRVUZETEVWQlFVVXNRMEZCUXp0WlFVTjRRaXhOUVVGTkxFdEJRVXNzUjBGQk5FSXNSVUZCUlN4TFFVRkxMRVZCUVVVc1ZVRkJWU3hGUVVGRkxFVkJRVVVzUzBGQlN5eEZRVUZGTEV0QlFVc3NSVUZCUlN4RFFVRkRPMWxCUXpkRkxFMUJRVTBzUTBGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNN1dVRkRia0lzVFVGQlRTeFRRVUZUTEVkQlFUWkNMRVZCUVVVc1EwRkJRenRaUVVNdlF5eExRVUZMTEUxQlFVMHNTVUZCU1N4SlFVRkpMRXRCUVVzc1JVRkJSU3hEUVVGRE8yZENRVU42UWl4UFFVRlBMRU5CUVVNc1IwRkJSeXhEUVVGRExFbEJRVWtzUTBGQlF5eEZRVUZGTEVOQlFVTXNRMEZCUXp0blFrRkRja0lzVFVGQlRTeFJRVUZSTEVkQlFVY3NVMEZCVXl4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUlVGQlJTeEZRVUZGTEVOQlFVTXNRMEZCUXl4RFFVRkRMRmxCUVZrc1MwRkJTeXhKUVVGSkxFTkJRVU1zUlVGQlJTeERRVUZETEVOQlFVTTdaMEpCUTNKRkxFdEJRVXNzVFVGQlRTeEpRVUZKTEVsQlFVa3NVVUZCVVN4RlFVRkZMRU5CUVVNN2IwSkJRelZDTEUxQlFVMHNSMEZCUnl4SFFVRkhMRU5CUVVNc1VVRkJVU3hEUVVGRExFZEJRVWNzUTBGQlF5eEpRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETzI5Q1FVTjJSQ3hSUVVGUkxFTkJRVU1zUjBGQlJ5eERRVUZETEVsQlFVa3NRMEZCUXl4WlFVRlpMRVZCUVVVc1IwRkJSeXhEUVVGRExFTkJRVU03YjBKQlEzSkRMRWxCUVVrc1IwRkJSeXhMUVVGTExFTkJRVU1zU1VGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4SFFVRkhMRU5CUVVNc1NVRkJTU3hEUVVGRExGbEJRVmtzUTBGQlF5eEZRVUZGTEVOQlFVTTdkMEpCUTJwRUxFMUJRVTBzU1VGQlNTeEhRVUZITEdWQlFXVXNRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRExFVkJRVVVzUlVGQlJTeERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRXRCUVVzc1NVRkJTU3hEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETzNkQ1FVTnlSU3hKUVVGSkxFbEJRVWs3TkVKQlFVVXNVMEZCVXl4RFFVRkRMRWxCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF6dHZRa0ZEYWtNc1EwRkJRenRuUWtGRFNDeERRVUZETzFsQlEwZ3NRMEZCUXp0WlFVTkVMRXRCUVVzc1IwRkJSeXhUUVVGVExFTkJRVU03VVVGRGNFSXNRMEZCUXp0UlFVVkVMRWxCUVVrc1QwRkJUeXhEUVVGRExFbEJRVWtzUzBGQlN5eGxRVUZsTEVOQlFVTXNUVUZCVFN4RlFVRkZMRU5CUVVNN1dVRkROVU1zVFVGQlRTeFRRVUZUTEVkQlFVY3NaVUZCWlR0cFFrRkRPVUlzVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRVZCUVVVc1EwRkJReXhEUVVGRExFOUJRVThzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXl4RFFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRE8ybENRVU5xUXl4SFFVRkhMRU5CUVVNc1EwRkJReXhEUVVGRExFVkJRVVVzUlVGQlJTeERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRU5CUVVNc1EwRkJRenRaUVVOd1FpeE5RVUZOTEVsQlFVa3NaVUZCWlN4RFFVRkRPMmRDUVVONFFpeGpRVUZqTEVWQlFVVXNVMEZCVXp0blFrRkRla0lzVlVGQlZTeEZRVUZGTEV0QlFVc3NRMEZCUXl4RFFVRkRMRU5CUVVNc1JVRkJSU3hWUVVGVkxFVkJRVVVzU1VGQlNUdGhRVU4yUXl4RFFVRkRMRU5CUVVNN1VVRkRUQ3hEUVVGRE8xRkJSVVFzVDBGQlR5eE5RVUZOTEVOQlFVTTdTVUZEYUVJc1EwRkJRenREUVVOR0lpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lMeW9xWEc0Z0tpQkFiVzlrZFd4bElHbHVkR1ZuY21GMGFXOXVjeTluY21Gd2FDOXdiR0Z1Ym1sdVp5OUhjbUZ3YUVWNFpXTjFkR2x2YmxCc1lXNXVaWEpjYmlBcUlFQnpkVzF0WVhKNUlGUnZjRzlzYjJkcFkyRnNJSEJzWVc1dVpYSWdabTl5SUdkeVlYQm9JSGR2Y210bWJHOTNjeTVjYmlBcUlFQmtaWE5qY21sd2RHbHZiaUJTWlhOdmJIWmxjeUIzYjNKclpteHZkeUJ1YjJSbGN5QmhibVFnY21Wc1lYUnBiMjV6TENCMllXeHBaR0YwWlhNZ2RHOXdiMnh2WjNrc0lHUmxkR1ZqZEhNZ1kzbGpiR1Z6TENCaGJtUWdjSEp2WkhWalpYTWdkRzl3YjJ4dloybGpZV3dnWlhobFkzVjBhVzl1SUd4aGVXVnljeUIxYzJsdVp5QkxZV2h1SjNNZ1lXeG5iM0pwZEdodExseHVJQ292WEc1cGJYQnZjblFnZEhsd1pTQjdYRzRnSUVkeVlYQm9UbTlrWlVSbFptbHVhWFJwYjI0c1hHNGdJRWR5WVhCb1YyOXlhMlpzYjNkRVpXWnBibWwwYVc5dUxGeHVmU0JtY205dElGd2lRR1JsWTJGbUxYUnpMM1ZwTFdSbFkyOXlZWFJ2Y25NdlozSmhjR2hjSWp0Y2JtbHRjRzl5ZENCN0lHZHlZWEJvUkdWbWFXNXBkR2x2Yms5bUlIMGdabkp2YlNCY0lrQmtaV05oWmkxMGN5OTFhUzFrWldOdmNtRjBiM0p6TDJkeVlYQm9YQ0k3WEc1Y2JtbHRjRzl5ZENCN0lFZFNRVkJJWDFkUFVrdEdURTlYWDBKUFZVNUVRVkpaSUgwZ1puSnZiU0JjSWk0dUwyTnZibk4wWVc1MGMxd2lPMXh1YVcxd2IzSjBJSHNnUjNKaGNHaERlV05zWlVWeWNtOXlJSDBnWm5KdmJTQmNJaTR1TDJWeWNtOXljeTlIY21Gd2FFTjVZMnhsUlhKeWIzSmNJanRjYm1sdGNHOXlkQ0I3SUVkeVlYQm9WRzl3YjJ4dlozbEZjbkp2Y2lCOUlHWnliMjBnWENJdUxpOWxjbkp2Y25NdlIzSmhjR2hVYjNCdmJHOW5lVVZ5Y205eVhDSTdYRzVwYlhCdmNuUWdkSGx3WlNCN0lFZHlZWEJvUlhobFkzVjBhVzl1VUd4aGJpQjlJR1p5YjIwZ1hDSXVMMGR5WVhCb1JYaGxZM1YwYVc5dVVHeGhibHdpTzF4dWFXMXdiM0owSUhSNWNHVWdleUJIY21Gd2FFVjRaV04xZEdsdmJsQnNZVzVPYjJSbElIMGdabkp2YlNCY0lpNHZSM0poY0doRmVHVmpkWFJwYjI1UWJHRnVUbTlrWlZ3aU8xeHVhVzF3YjNKMElIUjVjR1VnZXlCSGNtRndhRVY0WldOMWRHbHZibEJzWVc1RlpHZGxJSDBnWm5KdmJTQmNJaTR2UjNKaGNHaEZlR1ZqZFhScGIyNVFiR0Z1UldSblpWd2lPMXh1YVcxd2IzSjBJSFI1Y0dVZ2V5QkhjbUZ3YUVWNFpXTjFkR2x2YmxCc1lXNU1ZWGxsY2lCOUlHWnliMjBnWENJdUwwZHlZWEJvUlhobFkzVjBhVzl1VUd4aGJreGhlV1Z5WENJN1hHNXBiWEJ2Y25RZ2V5QkhjbUZ3YUZKbGJHRjBhVzl1VW1WemIyeDJaWElnZlNCbWNtOXRJRndpTGk5SGNtRndhRkpsYkdGMGFXOXVVbVZ6YjJ4MlpYSmNJanRjYmx4dUx5b3FYRzRnS2lCUWJHRnVibVZ5SUhSb1lYUWdkSFZ5Ym5NZ1lTQjdRR3hwYm1zZ1IzSmhjR2hYYjNKclpteHZkMFJsWm1sdWFYUnBiMjU5SUdsdWRHOGdZVnh1SUNvZ2UwQnNhVzVySUVkeVlYQm9SWGhsWTNWMGFXOXVVR3hoYm4wZ2QybDBhQ0IwYjNCdmJHOW5hV05oYkNCc1lYbGxjbk11WEc0Z0tpOWNibVY0Y0c5eWRDQmpiR0Z6Y3lCSGNtRndhRVY0WldOMWRHbHZibEJzWVc1dVpYSWdlMXh1SUNCd2NtbDJZWFJsSUhKbFlXUnZibXg1SUhKbGMyOXNkbVZ5T2lCSGNtRndhRkpsYkdGMGFXOXVVbVZ6YjJ4MlpYSTdYRzVjYmlBZ1kyOXVjM1J5ZFdOMGIzSW9jbVZ6YjJ4MlpYSS9PaUJIY21Gd2FGSmxiR0YwYVc5dVVtVnpiMngyWlhJcElIdGNiaUFnSUNCMGFHbHpMbkpsYzI5c2RtVnlJRDBnY21WemIyeDJaWElnUHo4Z2JtVjNJRWR5WVhCb1VtVnNZWFJwYjI1U1pYTnZiSFpsY2lncE8xeHVJQ0I5WEc1Y2JpQWdMeW9xWEc0Z0lDQXFJRkJzWVc1eklHRWdkMjl5YTJac2IzY2dabTl5SUdWNFpXTjFkR2x2Ymk1Y2JpQWdJQ3BjYmlBZ0lDb2dRSEJoY21GdElIZHZjbXRtYkc5M0lDMGdWR2hsSUhkdmNtdG1iRzkzSUdSbFptbHVhWFJwYjI0Z2RHOGdjR3hoYmk1Y2JpQWdJQ29nUUhKbGRIVnlibk1nVkdobElHVjRaV04xZEdsdmJpQndiR0Z1SUhkcGRHZ2dibTlrWlhNc0lHVmtaMlZ6TENCc1lYbGxjbk1zSUdGdVpDQnRZWEJ6TGx4dUlDQWdLaUJBZEdoeWIzZHpJSHRIY21Gd2FGUnZjRzlzYjJkNVJYSnliM0o5SUhkb1pXNGdibTlrWlNCSlJITWdZWEpsSUc1dmRDQjFibWx4ZFdVdVhHNGdJQ0FxSUVCMGFISnZkM01nZTBkeVlYQm9RM2xqYkdWRmNuSnZjbjBnZDJobGJpQjBhR1VnZDI5eWEyWnNiM2NnWTI5dWRHRnBibk1nWVc0Z2RXNXpkWEJ3YjNKMFpXUWdZM2xqYkdVdVhHNGdJQ0FxTDF4dUlDQndiR0Z1S0hkdmNtdG1iRzkzT2lCSGNtRndhRmR2Y210bWJHOTNSR1ZtYVc1cGRHbHZiaWs2SUVkeVlYQm9SWGhsWTNWMGFXOXVVR3hoYmlCN1hHNGdJQ0FnZEdocGN5NTJZV3hwWkdGMFpWVnVhWEYxWlU1dlpHVkpaSE1vZDI5eWEyWnNiM2NwTzF4dVhHNGdJQ0FnWTI5dWMzUWdibTlrWlhNZ1BTQjBhR2x6TG5KbGMyOXNkbVZPYjJSbGN5aDNiM0pyWm14dmR5azdYRzRnSUNBZ1kyOXVjM1FnWldSblpYTWdQU0IwYUdsekxuSmxjMjlzZG1WeUxuSmxjMjlzZG1Vb2QyOXlhMlpzYjNjcE8xeHVYRzRnSUNBZ1kyOXVjM1FnYVc1amIyMXBibWRDZVU1dlpHVWdQU0IwYUdsekxtSjFhV3hrU1c1amIyMXBibWROWVhBb1pXUm5aWE1wTzF4dUlDQWdJR052Ym5OMElHOTFkR2R2YVc1blFubE9iMlJsSUQwZ2RHaHBjeTVpZFdsc1pFOTFkR2R2YVc1blRXRndLR1ZrWjJWektUdGNibHh1SUNBZ0lHTnZibk4wSUd4aGVXVnljeUE5SUhSb2FYTXVkRzl3YjJ4dloybGpZV3hNWVhsbGNuTW9ibTlrWlhNc0lHVmtaMlZ6S1R0Y2JseHVJQ0FnSUhKbGRIVnliaUI3WEc0Z0lDQWdJQ0IzYjNKclpteHZkeXhjYmlBZ0lDQWdJSGR2Y210bWJHOTNTV1E2SUhkdmNtdG1iRzkzTG01aGJXVXNYRzRnSUNBZ0lDQnViMlJsY3l4Y2JpQWdJQ0FnSUdWa1oyVnpMRnh1SUNBZ0lDQWdiR0Y1WlhKekxGeHVJQ0FnSUNBZ2FXNWpiMjFwYm1kQ2VVNXZaR1VzWEc0Z0lDQWdJQ0J2ZFhSbmIybHVaMEo1VG05a1pTeGNiaUFnSUNCOU8xeHVJQ0I5WEc1Y2JpQWdMeW9xWEc0Z0lDQXFJRlpoYkdsa1lYUmxjeUIwYUdGMElHRnNiQ0IzYjNKclpteHZkeUJ1YjJSbElFbEVjeUJoY21VZ2RXNXBjWFZsTGx4dUlDQWdLaTljYmlBZ2NISnBkbUYwWlNCMllXeHBaR0YwWlZWdWFYRjFaVTV2WkdWSlpITW9kMjl5YTJac2IzYzZJRWR5WVhCb1YyOXlhMlpzYjNkRVpXWnBibWwwYVc5dUtUb2dkbTlwWkNCN1hHNGdJQ0FnWTI5dWMzUWdjMlZsYmlBOUlHNWxkeUJUWlhROGMzUnlhVzVuUGlncE8xeHVJQ0FnSUdadmNpQW9ZMjl1YzNRZ2JtOWtaU0J2WmlCM2IzSnJabXh2ZHk1dWIyUmxjeUEvUHlCYlhTa2dlMXh1SUNBZ0lDQWdhV1lnS0hObFpXNHVhR0Z6S0c1dlpHVXVhV1FwS1NCN1hHNGdJQ0FnSUNBZ0lIUm9jbTkzSUc1bGR5QkhjbUZ3YUZSdmNHOXNiMmQ1UlhKeWIzSW9YRzRnSUNBZ0lDQWdJQ0FnWUVSMWNHeHBZMkYwWlNCdWIyUmxJR2xrSUNja2UyNXZaR1V1YVdSOUp5QnBiaUIzYjNKclpteHZkeUFuSkh0M2IzSnJabXh2ZHk1dVlXMWxmU2RnTEZ4dUlDQWdJQ0FnSUNBZ0lIc2dibTlrWlVsa09pQnViMlJsTG1sa0xDQjNiM0pyWm14dmQwbGtPaUIzYjNKclpteHZkeTV1WVcxbElIMWNiaUFnSUNBZ0lDQWdLVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQWdJSE5sWlc0dVlXUmtLRzV2WkdVdWFXUXBPMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJQzhxS2x4dUlDQWdLaUJTWlhOdmJIWmxjeUIzYjNKclpteHZkeUJ1YjJSbElHMWxkR0ZrWVhSaElHbHVkRzhnY0d4aGJpQnViMlJsY3lCM2FYUm9JR1oxYkd3Z1pHVm1hVzVwZEdsdmJuTXVYRzRnSUNBcUwxeHVJQ0J3Y21sMllYUmxJSEpsYzI5c2RtVk9iMlJsY3loY2JpQWdJQ0IzYjNKclpteHZkem9nUjNKaGNHaFhiM0pyWm14dmQwUmxabWx1YVhScGIyNWNiaUFnS1RvZ1IzSmhjR2hGZUdWamRYUnBiMjVRYkdGdVRtOWtaVnRkSUh0Y2JpQWdJQ0JqYjI1emRDQnlaWE4xYkhRNklFZHlZWEJvUlhobFkzVjBhVzl1VUd4aGJrNXZaR1ZiWFNBOUlGdGRPMXh1SUNBZ0lHWnZjaUFvWTI5dWMzUWdibTlrWlUxbGRHRWdiMllnZDI5eWEyWnNiM2N1Ym05a1pYTWdQejhnVzEwcElIdGNiaUFnSUNBZ0lHTnZibk4wSUdSbFptbHVhWFJwYjI0Z1BTQjBhR2x6TG5KbGMyOXNkbVZFWldacGJtbDBhVzl1S0c1dlpHVk5aWFJoS1R0Y2JpQWdJQ0FnSUdOdmJuTjBJR2x1Y0hWMFVHOXlkSE1nUFNBb1pHVm1hVzVwZEdsdmJpNXdiM0owY3lBL1B5QmJYU2xjYmlBZ0lDQWdJQ0FnTG1acGJIUmxjaWdvY0NrZ1BUNGdjQzVrYVhKbFkzUnBiMjRnUFQwOUlGd2lhVzV3ZFhSY0lpbGNiaUFnSUNBZ0lDQWdMbTFoY0Nnb2NDa2dQVDRnY0M1dVlXMWxLVHRjYmlBZ0lDQWdJR052Ym5OMElHOTFkSEIxZEZCdmNuUnpJRDBnS0dSbFptbHVhWFJwYjI0dWNHOXlkSE1nUHo4Z1cxMHBYRzRnSUNBZ0lDQWdJQzVtYVd4MFpYSW9LSEFwSUQwK0lIQXVaR2x5WldOMGFXOXVJRDA5UFNCY0ltOTFkSEIxZEZ3aUtWeHVJQ0FnSUNBZ0lDQXViV0Z3S0Nod0tTQTlQaUJ3TG01aGJXVXBPMXh1SUNBZ0lDQWdjbVZ6ZFd4MExuQjFjMmdvZTF4dUlDQWdJQ0FnSUNCcFpEb2dibTlrWlUxbGRHRXVhV1FzWEc0Z0lDQWdJQ0FnSUd0cGJtUTZJRzV2WkdWTlpYUmhMbXRwYm1RZ1B6OGdaR1ZtYVc1cGRHbHZiaTVyYVc1a0lEOC9JRzV2WkdWTlpYUmhMbWxrTEZ4dUlDQWdJQ0FnSUNCc1lXSmxiRG9nYm05a1pVMWxkR0V1YkdGaVpXd3NYRzRnSUNBZ0lDQWdJSE52ZFhKalpUb2dibTlrWlUxbGRHRXNYRzRnSUNBZ0lDQWdJR1JsWm1sdWFYUnBiMjRzWEc0Z0lDQWdJQ0FnSUdsdWNIVjBVRzl5ZEhNc1hHNGdJQ0FnSUNBZ0lHOTFkSEIxZEZCdmNuUnpMRnh1SUNBZ0lDQWdJQ0J0WlhSaFpHRjBZVG9nYm05a1pVMWxkR0V1YldWMFlXUmhkR0VzWEc0Z0lDQWdJQ0I5S1R0Y2JpQWdJQ0I5WEc0Z0lDQWdjbVYwZFhKdUlISmxjM1ZzZER0Y2JpQWdmVnh1WEc0Z0lDOHFLbHh1SUNBZ0tpQkJkSFJsYlhCMGN5QjBieUJ5WlhOdmJIWmxJSFJvWlNCbWRXeHNJR2R5WVhCb0lHNXZaR1VnWkdWbWFXNXBkR2x2YmlCbWNtOXRJRzFsZEdGa1lYUmhMbHh1SUNBZ0tseHVJQ0FnS2lCQlkyTmxjSFJ6SUdWcGRHaGxjaUJoSUdSbFkyOXlZWFJsWkNCTmIyUmxiQ0JqYkdGemN5OXBibk4wWVc1alpTQW9jbVZ6YjJ4MlpXUWdkbWxoWEc0Z0lDQXFJR0JuY21Gd2FFUmxabWx1YVhScGIyNVBabUFwSUc5eUlHRWdjR3hoYVc0Z1lFZHlZWEJvVG05a1pVUmxabWx1YVhScGIyNWdMWE5vWVhCbFpDQnZZbXBsWTNSY2JpQWdJQ29nS0hWelpXWjFiQ0JtYjNJZ2MyVnlhV0ZzYVhwbFpDQjNiM0pyWm14dmQzTWdkR2hoZENCcGJteHBibVVnYm05a1pTQmtaV1pwYm1sMGFXOXVjeWt1WEc0Z0lDQXFMMXh1SUNCd2NtbDJZWFJsSUhKbGMyOXNkbVZFWldacGJtbDBhVzl1S0c1dlpHVk5aWFJoT2lCN1hHNGdJQ0FnYm05a1pUODZJSFZ1YTI1dmQyNDdYRzRnSUNBZ2EybHVaRDg2SUhOMGNtbHVaenRjYmlBZ0lDQnBaRG9nYzNSeWFXNW5PMXh1SUNCOUtUb2dSM0poY0doT2IyUmxSR1ZtYVc1cGRHbHZiaUI3WEc0Z0lDQWdhV1lnS0c1dlpHVk5aWFJoTG01dlpHVXBJSHRjYmlBZ0lDQWdJR2xtSUNoMGFHbHpMbWx6VW1GM1JHVm1hVzVwZEdsdmJpaHViMlJsVFdWMFlTNXViMlJsS1NrZ2UxeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2JtOWtaVTFsZEdFdWJtOWtaU0JoY3lCSGNtRndhRTV2WkdWRVpXWnBibWwwYVc5dU8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2RISjVJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJR2R5WVhCb1JHVm1hVzVwZEdsdmJrOW1LRzV2WkdWTlpYUmhMbTV2WkdVZ1lYTWdZVzU1S1R0Y2JpQWdJQ0FnSUgwZ1kyRjBZMmdnZTF4dUlDQWdJQ0FnSUNBdkx5Qm1ZV3hzSUhSb2NtOTFaMmdnZEc4Z2MzUjFZbHh1SUNBZ0lDQWdmVnh1SUNBZ0lIMWNiaUFnSUNBdkx5QlNaWFIxY200Z1lTQnRhVzVwYldGc0lITjBkV0lnWkdWbWFXNXBkR2x2YmlCemJ5QndiR0Z1Ym1sdVp5QmpZVzRnY0hKdlkyVmxaRnh1SUNBZ0lISmxkSFZ5YmlCN1hHNGdJQ0FnSUNCdVlXMWxPaUJ1YjJSbFRXVjBZUzVwWkN4Y2JpQWdJQ0FnSUhSaFp6b2dibTlrWlUxbGRHRXVhV1FzWEc0Z0lDQWdJQ0JyYVc1a09pQnViMlJsVFdWMFlTNXJhVzVrSUQ4L0lHNXZaR1ZOWlhSaExtbGtMRnh1SUNBZ0lDQWdiR0ZpWld4ek9pQmJYU3hjYmlBZ0lDQWdJSEJ2Y25Sek9pQmJYU3hjYmlBZ0lDQjlPMXh1SUNCOVhHNWNiaUFnTHlvcVhHNGdJQ0FxSUZKbGRIVnlibk1nWUhSeWRXVmdJSGRvWlc0Z1lTQjJZV3gxWlNCc2IyOXJjeUJzYVd0bElHRWdjbUYzSUh0QWJHbHVheUJIY21Gd2FFNXZaR1ZFWldacGJtbDBhVzl1ZlZ4dUlDQWdLaUFvWVNCd2JHRnBiaUJ2WW1wbFkzUWdkMmwwYUNCaElHQndiM0owYzJBZ1lYSnlZWGtnWVc1a0lHRWdZRzVoYldWZ0lITjBjbWx1WnlrdVhHNGdJQ0FxTDF4dUlDQndjbWwyWVhSbElHbHpVbUYzUkdWbWFXNXBkR2x2YmloMllXeDFaVG9nZFc1cmJtOTNiaWs2SUdKdmIyeGxZVzRnZTF4dUlDQWdJSEpsZEhWeWJpQW9YRzRnSUNBZ0lDQjBlWEJsYjJZZ2RtRnNkV1VnUFQwOUlGd2liMkpxWldOMFhDSWdKaVpjYmlBZ0lDQWdJSFpoYkhWbElDRTlQU0J1ZFd4c0lDWW1YRzRnSUNBZ0lDQWhRWEp5WVhrdWFYTkJjbkpoZVNoMllXeDFaU2tnSmlaY2JpQWdJQ0FnSUhSNWNHVnZaaUFvZG1Gc2RXVWdZWE1nZXlCdVlXMWxQem9nZFc1cmJtOTNiaUI5S1M1dVlXMWxJRDA5UFNCY0luTjBjbWx1WjF3aUlDWW1YRzRnSUNBZ0lDQkJjbkpoZVM1cGMwRnljbUY1S0NoMllXeDFaU0JoY3lCN0lIQnZjblJ6UHpvZ2RXNXJibTkzYmlCOUtTNXdiM0owY3lsY2JpQWdJQ0FwTzF4dUlDQjlYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFSjFhV3hrY3lCaElHMWhjQ0J2WmlCdWIyUmxJR2xrSUMwK0lHbHVZMjl0YVc1bklHVmtaMlZ6TGx4dUlDQWdLaTljYmlBZ2NISnBkbUYwWlNCaWRXbHNaRWx1WTI5dGFXNW5UV0Z3S0Z4dUlDQWdJR1ZrWjJWek9pQkhjbUZ3YUVWNFpXTjFkR2x2YmxCc1lXNUZaR2RsVzExY2JpQWdLVG9nVFdGd1BITjBjbWx1Wnl3Z1IzSmhjR2hGZUdWamRYUnBiMjVRYkdGdVJXUm5aVnRkUGlCN1hHNGdJQ0FnWTI5dWMzUWdiV0Z3SUQwZ2JtVjNJRTFoY0R4emRISnBibWNzSUVkeVlYQm9SWGhsWTNWMGFXOXVVR3hoYmtWa1oyVmJYVDRvS1R0Y2JpQWdJQ0JtYjNJZ0tHTnZibk4wSUdWa1oyVWdiMllnWldSblpYTXBJSHRjYmlBZ0lDQWdJR052Ym5OMElHeHBjM1FnUFNCdFlYQXVaMlYwS0dWa1oyVXVkR0Z5WjJWMFRtOWtaVWxrS1NBL1B5QmJYVHRjYmlBZ0lDQWdJR3hwYzNRdWNIVnphQ2hsWkdkbEtUdGNiaUFnSUNBZ0lHMWhjQzV6WlhRb1pXUm5aUzUwWVhKblpYUk9iMlJsU1dRc0lHeHBjM1FwTzF4dUlDQWdJSDFjYmlBZ0lDQnlaWFIxY200Z2JXRndPMXh1SUNCOVhHNWNiaUFnTHlvcVhHNGdJQ0FxSUVKMWFXeGtjeUJoSUcxaGNDQnZaaUJ1YjJSbElHbGtJQzArSUc5MWRHZHZhVzVuSUdWa1oyVnpMbHh1SUNBZ0tpOWNiaUFnY0hKcGRtRjBaU0JpZFdsc1pFOTFkR2R2YVc1blRXRndLRnh1SUNBZ0lHVmtaMlZ6T2lCSGNtRndhRVY0WldOMWRHbHZibEJzWVc1RlpHZGxXMTFjYmlBZ0tUb2dUV0Z3UEhOMGNtbHVaeXdnUjNKaGNHaEZlR1ZqZFhScGIyNVFiR0Z1UldSblpWdGRQaUI3WEc0Z0lDQWdZMjl1YzNRZ2JXRndJRDBnYm1WM0lFMWhjRHh6ZEhKcGJtY3NJRWR5WVhCb1JYaGxZM1YwYVc5dVVHeGhia1ZrWjJWYlhUNG9LVHRjYmlBZ0lDQm1iM0lnS0dOdmJuTjBJR1ZrWjJVZ2IyWWdaV1JuWlhNcElIdGNiaUFnSUNBZ0lHTnZibk4wSUd4cGMzUWdQU0J0WVhBdVoyVjBLR1ZrWjJVdWMyOTFjbU5sVG05a1pVbGtLU0EvUHlCYlhUdGNiaUFnSUNBZ0lHeHBjM1F1Y0hWemFDaGxaR2RsS1R0Y2JpQWdJQ0FnSUcxaGNDNXpaWFFvWldSblpTNXpiM1Z5WTJWT2IyUmxTV1FzSUd4cGMzUXBPMXh1SUNBZ0lIMWNiaUFnSUNCeVpYUjFjbTRnYldGd08xeHVJQ0I5WEc1Y2JpQWdMeW9xWEc0Z0lDQXFJRkJ5YjJSMVkyVnpJSFJ2Y0c5c2IyZHBZMkZzSUd4aGVXVnljeUIxYzJsdVp5QkxZV2h1SjNNZ1lXeG5iM0pwZEdodExseHVJQ0FnS2x4dUlDQWdLaUJYYjNKclpteHZkeUJpYjNWdVpHRnllU0JsWkdkbGN5QmtieUJ1YjNRZ1kyOTFiblFnWVhNZ1pYaGxZM1YwWVdKc1pTMXViMlJsSUdSbGNHVnVaR1Z1WTJsbGN5NWNiaUFnSUNvdlhHNGdJSEJ5YVhaaGRHVWdkRzl3YjJ4dloybGpZV3hNWVhsbGNuTW9YRzRnSUNBZ2JtOWtaWE02SUVkeVlYQm9SWGhsWTNWMGFXOXVVR3hoYms1dlpHVmJYU3hjYmlBZ0lDQmxaR2RsY3pvZ1IzSmhjR2hGZUdWamRYUnBiMjVRYkdGdVJXUm5aVnRkWEc0Z0lDazZJRWR5WVhCb1JYaGxZM1YwYVc5dVVHeGhia3hoZVdWeVcxMGdlMXh1SUNBZ0lHTnZibk4wSUdWNFpXTjFkR0ZpYkdWT2IyUmxjeUE5SUc1dlpHVnpMbVpwYkhSbGNpaGNiaUFnSUNBZ0lDaHVLU0E5UGlCdUxtbGtJQ0U5UFNCSFVrRlFTRjlYVDFKTFJreFBWMTlDVDFWT1JFRlNXVnh1SUNBZ0lDazdYRzRnSUNBZ1kyOXVjM1FnYm05a1pVbGtjeUE5SUc1bGR5QlRaWFFvWlhobFkzVjBZV0pzWlU1dlpHVnpMbTFoY0Nnb2Jpa2dQVDRnYmk1cFpDa3BPMXh1WEc0Z0lDQWdMeThnVDI1c2VTQmxaR2RsY3lCaVpYUjNaV1Z1SUhSM2J5QmxlR1ZqZFhSaFlteGxJRzV2WkdWeklHTnZkVzUwSUdGeklHUmxjR1Z1WkdWdVkybGxjMXh1SUNBZ0lHTnZibk4wSUdWNFpXTkZaR2RsY3lBOUlHVmtaMlZ6TG1acGJIUmxjaWhjYmlBZ0lDQWdJQ2hsS1NBOVBpQnViMlJsU1dSekxtaGhjeWhsTG5OdmRYSmpaVTV2WkdWSlpDa2dKaVlnYm05a1pVbGtjeTVvWVhNb1pTNTBZWEpuWlhST2IyUmxTV1FwWEc0Z0lDQWdLVHRjYmx4dUlDQWdJQzh2SUVOdmJYQjFkR1VnYVc0dFpHVm5jbVZsWEc0Z0lDQWdZMjl1YzNRZ2FXNWtaV2R5WldVZ1BTQnVaWGNnVFdGd1BITjBjbWx1Wnl3Z2JuVnRZbVZ5UGlncE8xeHVJQ0FnSUdadmNpQW9ZMjl1YzNRZ2JtOWtaU0J2WmlCbGVHVmpkWFJoWW14bFRtOWtaWE1wSUdsdVpHVm5jbVZsTG5ObGRDaHViMlJsTG1sa0xDQXdLVHRjYmlBZ0lDQm1iM0lnS0dOdmJuTjBJR1ZrWjJVZ2IyWWdaWGhsWTBWa1oyVnpLU0I3WEc0Z0lDQWdJQ0JwYm1SbFozSmxaUzV6WlhRb1pXUm5aUzUwWVhKblpYUk9iMlJsU1dRc0lDaHBibVJsWjNKbFpTNW5aWFFvWldSblpTNTBZWEpuWlhST2IyUmxTV1FwSUQ4L0lEQXBJQ3NnTVNrN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnWTI5dWMzUWdiR0Y1WlhKek9pQkhjbUZ3YUVWNFpXTjFkR2x2YmxCc1lXNU1ZWGxsY2x0ZElEMGdXMTA3WEc0Z0lDQWdZMjl1YzNRZ2NHeGhibTVsWkNBOUlHNWxkeUJUWlhROGMzUnlhVzVuUGlncE8xeHVJQ0FnSUd4bGRDQnlaV0ZrZVNBOUlHVjRaV04xZEdGaWJHVk9iMlJsY3k1bWFXeDBaWElvS0c0cElEMCtJQ2hwYm1SbFozSmxaUzVuWlhRb2JpNXBaQ2tnUHo4Z01Da2dQVDA5SURBcE8xeHVJQ0FnSUd4bGRDQnNZWGxsY2tsdVpHVjRJRDBnTUR0Y2JseHVJQ0FnSUhkb2FXeGxJQ2h5WldGa2VTNXNaVzVuZEdnZ1BpQXdLU0I3WEc0Z0lDQWdJQ0JqYjI1emRDQnNZWGxsY2pvZ1IzSmhjR2hGZUdWamRYUnBiMjVRYkdGdVRHRjVaWElnUFNCN0lHbHVaR1Y0T2lCc1lYbGxja2x1WkdWNEt5c3NJRzV2WkdWek9pQnlaV0ZrZVNCOU8xeHVJQ0FnSUNBZ2JHRjVaWEp6TG5CMWMyZ29iR0Y1WlhJcE8xeHVJQ0FnSUNBZ1kyOXVjM1FnYm1WNGRGSmxZV1I1T2lCSGNtRndhRVY0WldOMWRHbHZibEJzWVc1T2IyUmxXMTBnUFNCYlhUdGNiaUFnSUNBZ0lHWnZjaUFvWTI5dWMzUWdibTlrWlNCdlppQnlaV0ZrZVNrZ2UxeHVJQ0FnSUNBZ0lDQndiR0Z1Ym1Wa0xtRmtaQ2h1YjJSbExtbGtLVHRjYmlBZ0lDQWdJQ0FnWTI5dWMzUWdiM1YwWjI5cGJtY2dQU0JsZUdWalJXUm5aWE11Wm1sc2RHVnlLQ2hsS1NBOVBpQmxMbk52ZFhKalpVNXZaR1ZKWkNBOVBUMGdibTlrWlM1cFpDazdYRzRnSUNBZ0lDQWdJR1p2Y2lBb1kyOXVjM1FnWldSblpTQnZaaUJ2ZFhSbmIybHVaeWtnZTF4dUlDQWdJQ0FnSUNBZ0lHTnZibk4wSUdSbFp5QTlJQ2hwYm1SbFozSmxaUzVuWlhRb1pXUm5aUzUwWVhKblpYUk9iMlJsU1dRcElEOC9JREVwSUMwZ01UdGNiaUFnSUNBZ0lDQWdJQ0JwYm1SbFozSmxaUzV6WlhRb1pXUm5aUzUwWVhKblpYUk9iMlJsU1dRc0lHUmxaeWs3WEc0Z0lDQWdJQ0FnSUNBZ2FXWWdLR1JsWnlBOVBUMGdNQ0FtSmlBaGNHeGhibTVsWkM1b1lYTW9aV1JuWlM1MFlYSm5aWFJPYjJSbFNXUXBLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQmpiMjV6ZENCdVpYaDBJRDBnWlhobFkzVjBZV0pzWlU1dlpHVnpMbVpwYm1Rb0tHNHBJRDArSUc0dWFXUWdQVDA5SUdWa1oyVXVkR0Z5WjJWMFRtOWtaVWxrS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNodVpYaDBLU0J1WlhoMFVtVmhaSGt1Y0hWemFDaHVaWGgwS1R0Y2JpQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJSDFjYmlBZ0lDQWdJSEpsWVdSNUlEMGdibVY0ZEZKbFlXUjVPMXh1SUNBZ0lIMWNibHh1SUNBZ0lHbG1JQ2h3YkdGdWJtVmtMbk5wZW1VZ0lUMDlJR1Y0WldOMWRHRmliR1ZPYjJSbGN5NXNaVzVuZEdncElIdGNiaUFnSUNBZ0lHTnZibk4wSUhWdWNHeGhibTVsWkNBOUlHVjRaV04xZEdGaWJHVk9iMlJsYzF4dUlDQWdJQ0FnSUNBdVptbHNkR1Z5S0NodUtTQTlQaUFoY0d4aGJtNWxaQzVvWVhNb2JpNXBaQ2twWEc0Z0lDQWdJQ0FnSUM1dFlYQW9LRzRwSUQwK0lHNHVhV1FwTzF4dUlDQWdJQ0FnZEdoeWIzY2dibVYzSUVkeVlYQm9RM2xqYkdWRmNuSnZjaWg3WEc0Z0lDQWdJQ0FnSUhWdWNHeGhibTVsWkU1dlpHVnpPaUIxYm5Cc1lXNXVaV1FzWEc0Z0lDQWdJQ0FnSUhkdmNtdG1iRzkzU1dRNklHNXZaR1Z6V3pCZFB5NWtaV1pwYm1sMGFXOXVQeTV1WVcxbExGeHVJQ0FnSUNBZ2ZTazdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2NtVjBkWEp1SUd4aGVXVnljenRjYmlBZ2ZWeHVmVnh1SWwxOSJdfQ==
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GraphRelationResolver = void 0;
|
|
4
|
+
const graph_1 = require("@decaf-ts/ui-decorators/graph");
|
|
5
|
+
const constants_js_1 = require("./../constants.cjs");
|
|
6
|
+
const GraphPortError_js_1 = require("./../errors/GraphPortError.cjs");
|
|
7
|
+
const GraphTopologyError_js_1 = require("./../errors/GraphTopologyError.cjs");
|
|
8
|
+
/**
|
|
9
|
+
* Resolves raw workflow relation metadata into normalized execution edges.
|
|
10
|
+
*/
|
|
11
|
+
class GraphRelationResolver {
|
|
12
|
+
/**
|
|
13
|
+
* Resolves all relations of a workflow into execution edges.
|
|
14
|
+
*
|
|
15
|
+
* @param workflow - The workflow definition.
|
|
16
|
+
* @returns Array of normalized edges.
|
|
17
|
+
* @throws {GraphTopologyError} when an endpoint is unknown or ambiguous.
|
|
18
|
+
* @throws {GraphPortError} when a referenced port is missing or unknown.
|
|
19
|
+
*/
|
|
20
|
+
resolve(workflow) {
|
|
21
|
+
const nodeIds = new Set(workflow.nodes.map((n) => n.id));
|
|
22
|
+
const boundaryAliases = this.boundaryAliases(workflow);
|
|
23
|
+
const inputPorts = this.portNames(workflow.inputs);
|
|
24
|
+
const outputPorts = this.portNames(workflow.outputs);
|
|
25
|
+
const nodePortMap = this.buildNodePortMap(workflow);
|
|
26
|
+
const edges = [];
|
|
27
|
+
for (const relation of workflow.relations ?? []) {
|
|
28
|
+
const edge = this.resolveRelation(relation, nodeIds, boundaryAliases, inputPorts, outputPorts, nodePortMap);
|
|
29
|
+
edges.push(edge);
|
|
30
|
+
}
|
|
31
|
+
return edges;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Resolves a single relation into an edge.
|
|
35
|
+
*/
|
|
36
|
+
resolveRelation(relation, nodeIds, boundaryAliases, inputPorts, outputPorts, nodePortMap) {
|
|
37
|
+
const sourceNodeId = this.resolveEndpoint(relation.source, nodeIds, boundaryAliases);
|
|
38
|
+
const targetNodeId = this.resolveEndpoint(relation.target, nodeIds, boundaryAliases);
|
|
39
|
+
const sourcePort = relation.sourcePort;
|
|
40
|
+
const targetPort = relation.targetPort;
|
|
41
|
+
if (!sourcePort) {
|
|
42
|
+
throw new GraphPortError_js_1.GraphPortError(`Relation is missing sourcePort (source: ${String(relation.source)}, target: ${String(relation.target)})`, { relation });
|
|
43
|
+
}
|
|
44
|
+
if (!targetPort) {
|
|
45
|
+
throw new GraphPortError_js_1.GraphPortError(`Relation is missing targetPort (source: ${String(relation.source)}, target: ${String(relation.target)})`, { relation });
|
|
46
|
+
}
|
|
47
|
+
this.validatePort(sourceNodeId, sourcePort, true, boundaryAliases, inputPorts, outputPorts, nodePortMap);
|
|
48
|
+
this.validatePort(targetNodeId, targetPort, false, boundaryAliases, inputPorts, outputPorts, nodePortMap);
|
|
49
|
+
return {
|
|
50
|
+
id: this.createEdgeId(sourceNodeId, sourcePort, targetNodeId, targetPort),
|
|
51
|
+
sourceNodeId,
|
|
52
|
+
sourcePort,
|
|
53
|
+
targetNodeId,
|
|
54
|
+
targetPort,
|
|
55
|
+
label: relation.label,
|
|
56
|
+
metadata: relation.metadata,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Resolves an endpoint (source or target) to a node id or the workflow boundary.
|
|
61
|
+
*/
|
|
62
|
+
resolveEndpoint(endpoint, nodeIds, boundaryAliases) {
|
|
63
|
+
const name = String(endpoint);
|
|
64
|
+
if (boundaryAliases.has(name))
|
|
65
|
+
return constants_js_1.GRAPH_WORKFLOW_BOUNDARY;
|
|
66
|
+
if (nodeIds.has(name))
|
|
67
|
+
return name;
|
|
68
|
+
throw new GraphTopologyError_js_1.GraphTopologyError(`Unknown endpoint '${name}'`, { endpoint: name, knownNodes: Array.from(nodeIds) });
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Validates that a port exists on the given node or boundary.
|
|
72
|
+
*/
|
|
73
|
+
validatePort(nodeId, port, isSource, boundaryAliases, inputPorts, outputPorts, nodePortMap) {
|
|
74
|
+
if (nodeId === constants_js_1.GRAPH_WORKFLOW_BOUNDARY) {
|
|
75
|
+
const ports = isSource ? inputPorts : outputPorts;
|
|
76
|
+
if (!ports.has(port)) {
|
|
77
|
+
throw new GraphPortError_js_1.GraphPortError(`Unknown ${isSource ? "input" : "output"} port '${port}' on workflow boundary`, { nodeId, port, isSource, available: Array.from(ports) });
|
|
78
|
+
}
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const nodePorts = nodePortMap.get(nodeId);
|
|
82
|
+
if (!nodePorts) {
|
|
83
|
+
throw new GraphTopologyError_js_1.GraphTopologyError(`No port map for node '${nodeId}'`, {
|
|
84
|
+
nodeId,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
const ports = isSource ? nodePorts.output : nodePorts.input;
|
|
88
|
+
if (!ports.has(port)) {
|
|
89
|
+
throw new GraphPortError_js_1.GraphPortError(`Unknown ${isSource ? "output" : "input"} port '${port}' on node '${nodeId}'`, { nodeId, port, isSource, available: Array.from(ports) });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Builds the set of boundary aliases for a workflow.
|
|
94
|
+
*/
|
|
95
|
+
boundaryAliases(workflow) {
|
|
96
|
+
return new Set([
|
|
97
|
+
constants_js_1.GRAPH_WORKFLOW_BOUNDARY,
|
|
98
|
+
"workflow",
|
|
99
|
+
"graph",
|
|
100
|
+
workflow.name,
|
|
101
|
+
]);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Extracts port names from a list of port definitions.
|
|
105
|
+
*/
|
|
106
|
+
portNames(ports) {
|
|
107
|
+
return new Set((ports ?? []).map((p) => p.name));
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Builds a map of node id -> { input ports, output ports }.
|
|
111
|
+
*/
|
|
112
|
+
buildNodePortMap(workflow) {
|
|
113
|
+
const map = new Map();
|
|
114
|
+
for (const nodeMeta of workflow.nodes ?? []) {
|
|
115
|
+
const input = new Set();
|
|
116
|
+
const output = new Set();
|
|
117
|
+
const def = this.resolveNodeDefinition(nodeMeta);
|
|
118
|
+
if (def) {
|
|
119
|
+
for (const port of def.ports ?? []) {
|
|
120
|
+
if (port.direction === "input")
|
|
121
|
+
input.add(port.name);
|
|
122
|
+
else
|
|
123
|
+
output.add(port.name);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
map.set(nodeMeta.id, { input, output });
|
|
127
|
+
}
|
|
128
|
+
return map;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Attempts to resolve a node's full definition from its metadata.
|
|
132
|
+
*
|
|
133
|
+
* Accepts either a decorated Model class/instance (resolved via
|
|
134
|
+
* `graphDefinitionOf`) or a plain `GraphNodeDefinition`-shaped object
|
|
135
|
+
* (useful for serialized workflows that inline node definitions).
|
|
136
|
+
*/
|
|
137
|
+
resolveNodeDefinition(nodeMeta) {
|
|
138
|
+
if (nodeMeta.node) {
|
|
139
|
+
if (this.isRawDefinition(nodeMeta.node)) {
|
|
140
|
+
return nodeMeta.node;
|
|
141
|
+
}
|
|
142
|
+
try {
|
|
143
|
+
const def = (0, graph_1.graphDefinitionOf)(nodeMeta.node);
|
|
144
|
+
return def;
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
return undefined;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return undefined;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Returns `true` when a value looks like a raw {@link GraphNodeDefinition}
|
|
154
|
+
* (a plain object with a `ports` array and a `name` string).
|
|
155
|
+
*/
|
|
156
|
+
isRawDefinition(value) {
|
|
157
|
+
return (typeof value === "object" &&
|
|
158
|
+
value !== null &&
|
|
159
|
+
!Array.isArray(value) &&
|
|
160
|
+
typeof value.name === "string" &&
|
|
161
|
+
Array.isArray(value.ports));
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Creates a stable edge id from its endpoints and ports.
|
|
165
|
+
*/
|
|
166
|
+
createEdgeId(sourceNodeId, sourcePort, targetNodeId, targetPort) {
|
|
167
|
+
return `${sourceNodeId}:${sourcePort}->${targetNodeId}:${targetPort}`;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
exports.GraphRelationResolver = GraphRelationResolver;
|
|
171
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhSZWxhdGlvblJlc29sdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2dyYXBoL2VuZ2luZS9wbGFubmluZy9HcmFwaFJlbGF0aW9uUmVzb2x2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBVUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFbEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLDBCQUFxQjtBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLHNDQUFpQztBQUMxRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsMENBQXFDO0FBR2xFOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHFCQUFxQjtJQUNoQzs7Ozs7OztPQU9HO0lBQ0gsT0FBTyxDQUFDLFFBQWlDO1FBQ3ZDLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVwRCxNQUFNLEtBQUssR0FBNkIsRUFBRSxDQUFDO1FBRTNDLEtBQUssTUFBTSxRQUFRLElBQUksUUFBUSxDQUFDLFNBQVMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNoRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUMvQixRQUFRLEVBQ1IsT0FB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SUFDSyxxQkFBcUIsQ0FDM0IsUUFBMkM7UUFFM0MsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEIsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN4QyxPQUFPLFFBQVEsQ0FBQyxJQUVmLENBQUM7WUFDSixDQUFDO1lBQ0QsSUFBSSxDQUFDO2dCQUNILE1BQU0sR0FBRyxHQUFHLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxJQUFXLENBQUMsQ0FBQztnQkFDcEQsT0FBTyxHQUFVLENBQUM7WUFDcEIsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7O09BR0c7SUFDSyxlQUFlLENBQUMsS0FBYztRQUNwQyxPQUFPLENBQ0wsT0FBTyxLQUFLLEtBQUssUUFBUTtZQUN6QixLQUFLLEtBQUssSUFBSTtZQUNkLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDckIsT0FBUSxLQUE0QixDQUFDLElBQUksS0FBSyxRQUFRO1lBQ3RELEtBQUssQ0FBQyxPQUFPLENBQUUsS0FBNkIsQ0FBQyxLQUFLLENBQUMsQ0FDcEQsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNLLFlBQVksQ0FDbEIsWUFBb0IsRUFDcEIsVUFBa0IsRUFDbEIsWUFBb0IsRUFDcEIsVUFBa0I7UUFFbEIsT0FBTyxHQUFHLFlBQVksSUFBSSxVQUFVLEtBQUssWUFBWSxJQUFJLFVBQVUsRUFBRSxDQUFDO0lBQ3hFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSBpbnRlZ3JhdGlvbnMvZ3JhcGgvcGxhbm5pbmcvR3JhcGhSZWxhdGlvblJlc29sdmVyXG4gKiBAc3VtbWFyeSBOb3JtYWxpemVzIHdvcmtmbG93IHJlbGF0aW9ucyBpbnRvIGV4ZWN1dGlvbiBlZGdlcy5cbiAqIEBkZXNjcmlwdGlvbiBSZXNvbHZlcyB3b3JrZmxvdyBib3VuZGFyeSBhbGlhc2VzLCB2YWxpZGF0ZXMgZW5kcG9pbnRzIGFuZCBwb3J0cywgYW5kIHByb2R1Y2VzIHN0YWJsZSBlZGdlIElEcy5cbiAqL1xuaW1wb3J0IHR5cGUge1xuICBHcmFwaFBvcnREZWZpbml0aW9uLFxuICBHcmFwaFdvcmtmbG93RGVmaW5pdGlvbixcbiAgR3JhcGhXb3JrZmxvd1JlbGF0aW9uTWV0YWRhdGEsXG59IGZyb20gXCJAZGVjYWYtdHMvdWktZGVjb3JhdG9ycy9ncmFwaFwiO1xuaW1wb3J0IHsgZ3JhcGhEZWZpbml0aW9uT2YgfSBmcm9tIFwiQGRlY2FmLXRzL3VpLWRlY29yYXRvcnMvZ3JhcGhcIjtcblxuaW1wb3J0IHsgR1JBUEhfV09SS0ZMT1dfQk9VTkRBUlkgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBHcmFwaFBvcnRFcnJvciB9IGZyb20gXCIuLi9lcnJvcnMvR3JhcGhQb3J0RXJyb3JcIjtcbmltcG9ydCB7IEdyYXBoVG9wb2xvZ3lFcnJvciB9IGZyb20gXCIuLi9lcnJvcnMvR3JhcGhUb3BvbG9neUVycm9yXCI7XG5pbXBvcnQgdHlwZSB7IEdyYXBoRXhlY3V0aW9uUGxhbkVkZ2UgfSBmcm9tIFwiLi9HcmFwaEV4ZWN1dGlvblBsYW5FZGdlXCI7XG5cbi8qKlxuICogUmVzb2x2ZXMgcmF3IHdvcmtmbG93IHJlbGF0aW9uIG1ldGFkYXRhIGludG8gbm9ybWFsaXplZCBleGVjdXRpb24gZWRnZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBHcmFwaFJlbGF0aW9uUmVzb2x2ZXIge1xuICAvKipcbiAgICogUmVzb2x2ZXMgYWxsIHJlbGF0aW9ucyBvZiBhIHdvcmtmbG93IGludG8gZXhlY3V0aW9uIGVkZ2VzLlxuICAgKlxuICAgKiBAcGFyYW0gd29ya2Zsb3cgLSBUaGUgd29ya2Zsb3cgZGVmaW5pdGlvbi5cbiAgICogQHJldHVybnMgQXJyYXkgb2Ygbm9ybWFsaXplZCBlZGdlcy5cbiAgICogQHRocm93cyB7R3JhcGhUb3BvbG9neUVycm9yfSB3aGVuIGFuIGVuZHBvaW50IGlzIHVua25vd24gb3IgYW1iaWd1b3VzLlxuICAgKiBAdGhyb3dzIHtHcmFwaFBvcnRFcnJvcn0gd2hlbiBhIHJlZmVyZW5jZWQgcG9ydCBpcyBtaXNzaW5nIG9yIHVua25vd24uXG4gICAqL1xuICByZXNvbHZlKHdvcmtmbG93OiBHcmFwaFdvcmtmbG93RGVmaW5pdGlvbik6IEdyYXBoRXhlY3V0aW9uUGxhbkVkZ2VbXSB7XG4gICAgY29uc3Qgbm9kZUlkcyA9IG5ldyBTZXQod29ya2Zsb3cubm9kZXMubWFwKChuKSA9PiBuLmlkKSk7XG4gICAgY29uc3QgYm91bmRhcnlBbGlhc2VzID0gdGhpcy5ib3VuZGFyeUFsaWFzZXMod29ya2Zsb3cpO1xuICAgIGNvbnN0IGlucHV0UG9ydHMgPSB0aGlzLnBvcnROYW1lcyh3b3JrZmxvdy5pbnB1dHMpO1xuICAgIGNvbnN0IG91dHB1dFBvcnRzID0gdGhpcy5wb3J0TmFtZXMod29ya2Zsb3cub3V0cHV0cyk7XG4gICAgY29uc3Qgbm9kZVBvcnRNYXAgPSB0aGlzLmJ1aWxkTm9kZVBvcnRNYXAod29ya2Zsb3cpO1xuXG4gICAgY29uc3QgZWRnZXM6IEdyYXBoRXhlY3V0aW9uUGxhbkVkZ2VbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCByZWxhdGlvbiBvZiB3b3JrZmxvdy5yZWxhdGlvbnMgPz8gW10pIHtcbiAgICAgIGNvbnN0IGVkZ2UgPSB0aGlzLnJlc29sdmVSZWxhdGlvbihcbiAgICAgICAgcmVsYXRpb24sXG4gICAgICAgIG5vZGVJZHMsXG4gICAgICAgIGJvdW5kYXJ5QWxpYXNlcyxcbiAgICAgICAgaW5wdXRQb3J0cyxcbiAgICAgICAgb3V0cHV0UG9ydHMsXG4gICAgICAgIG5vZGVQb3J0TWFwXG4gICAgICApO1xuICAgICAgZWRnZXMucHVzaChlZGdlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWRnZXM7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSBzaW5nbGUgcmVsYXRpb24gaW50byBhbiBlZGdlLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlUmVsYXRpb24oXG4gICAgcmVsYXRpb246IEdyYXBoV29ya2Zsb3dSZWxhdGlvbk1ldGFkYXRhLFxuICAgIG5vZGVJZHM6IFNldDxzdHJpbmc+LFxuICAgIGJvdW5kYXJ5QWxpYXNlczogU2V0PHN0cmluZz4sXG4gICAgaW5wdXRQb3J0czogU2V0PHN0cmluZz4sXG4gICAgb3V0cHV0UG9ydHM6IFNldDxzdHJpbmc+LFxuICAgIG5vZGVQb3J0TWFwOiBNYXA8c3RyaW5nLCB7IGlucHV0OiBTZXQ8c3RyaW5nPjsgb3V0cHV0OiBTZXQ8c3RyaW5nPiB9PlxuICApOiBHcmFwaEV4ZWN1dGlvblBsYW5FZGdlIHtcbiAgICBjb25zdCBzb3VyY2VOb2RlSWQgPSB0aGlzLnJlc29sdmVFbmRwb2ludChcbiAgICAgIHJlbGF0aW9uLnNvdXJjZSxcbiAgICAgIG5vZGVJZHMsXG4gICAgICBib3VuZGFyeUFsaWFzZXNcbiAgICApO1xuICAgIGNvbnN0IHRhcmdldE5vZGVJZCA9IHRoaXMucmVzb2x2ZUVuZHBvaW50KFxuICAgICAgcmVsYXRpb24udGFyZ2V0LFxuICAgICAgbm9kZUlkcyxcbiAgICAgIGJvdW5kYXJ5QWxpYXNlc1xuICAgICk7XG5cbiAgICBjb25zdCBzb3VyY2VQb3J0ID0gcmVsYXRpb24uc291cmNlUG9ydDtcbiAgICBjb25zdCB0YXJnZXRQb3J0ID0gcmVsYXRpb24udGFyZ2V0UG9ydDtcblxuICAgIGlmICghc291cmNlUG9ydCkge1xuICAgICAgdGhyb3cgbmV3IEdyYXBoUG9ydEVycm9yKFxuICAgICAgICBgUmVsYXRpb24gaXMgbWlzc2luZyBzb3VyY2VQb3J0IChzb3VyY2U6ICR7U3RyaW5nKHJlbGF0aW9uLnNvdXJjZSl9LCB0YXJnZXQ6ICR7U3RyaW5nKHJlbGF0aW9uLnRhcmdldCl9KWAsXG4gICAgICAgIHsgcmVsYXRpb24gfVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCF0YXJnZXRQb3J0KSB7XG4gICAgICB0aHJvdyBuZXcgR3JhcGhQb3J0RXJyb3IoXG4gICAgICAgIGBSZWxhdGlvbiBpcyBtaXNzaW5nIHRhcmdldFBvcnQgKHNvdXJjZTogJHtTdHJpbmcocmVsYXRpb24uc291cmNlKX0sIHRhcmdldDogJHtTdHJpbmcocmVsYXRpb24udGFyZ2V0KX0pYCxcbiAgICAgICAgeyByZWxhdGlvbiB9XG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMudmFsaWRhdGVQb3J0KFxuICAgICAgc291cmNlTm9kZUlkLFxuICAgICAgc291cmNlUG9ydCxcbiAgICAgIHRydWUsXG4gICAgICBib3VuZGFyeUFsaWFzZXMsXG4gICAgICBpbnB1dFBvcnRzLFxuICAgICAgb3V0cHV0UG9ydHMsXG4gICAgICBub2RlUG9ydE1hcFxuICAgICk7XG4gICAgdGhpcy52YWxpZGF0ZVBvcnQoXG4gICAgICB0YXJnZXROb2RlSWQsXG4gICAgICB0YXJnZXRQb3J0LFxuICAgICAgZmFsc2UsXG4gICAgICBib3VuZGFyeUFsaWFzZXMsXG4gICAgICBpbnB1dFBvcnRzLFxuICAgICAgb3V0cHV0UG9ydHMsXG4gICAgICBub2RlUG9ydE1hcFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuY3JlYXRlRWRnZUlkKHNvdXJjZU5vZGVJZCwgc291cmNlUG9ydCwgdGFyZ2V0Tm9kZUlkLCB0YXJnZXRQb3J0KSxcbiAgICAgIHNvdXJjZU5vZGVJZCxcbiAgICAgIHNvdXJjZVBvcnQsXG4gICAgICB0YXJnZXROb2RlSWQsXG4gICAgICB0YXJnZXRQb3J0LFxuICAgICAgbGFiZWw6IHJlbGF0aW9uLmxhYmVsLFxuICAgICAgbWV0YWRhdGE6IHJlbGF0aW9uLm1ldGFkYXRhLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYW4gZW5kcG9pbnQgKHNvdXJjZSBvciB0YXJnZXQpIHRvIGEgbm9kZSBpZCBvciB0aGUgd29ya2Zsb3cgYm91bmRhcnkuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVFbmRwb2ludChcbiAgICBlbmRwb2ludDogc3RyaW5nIHwgdW5rbm93bixcbiAgICBub2RlSWRzOiBTZXQ8c3RyaW5nPixcbiAgICBib3VuZGFyeUFsaWFzZXM6IFNldDxzdHJpbmc+XG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IFN0cmluZyhlbmRwb2ludCk7XG4gICAgaWYgKGJvdW5kYXJ5QWxpYXNlcy5oYXMobmFtZSkpIHJldHVybiBHUkFQSF9XT1JLRkxPV19CT1VOREFSWTtcbiAgICBpZiAobm9kZUlkcy5oYXMobmFtZSkpIHJldHVybiBuYW1lO1xuICAgIHRocm93IG5ldyBHcmFwaFRvcG9sb2d5RXJyb3IoXG4gICAgICBgVW5rbm93biBlbmRwb2ludCAnJHtuYW1lfSdgLFxuICAgICAgeyBlbmRwb2ludDogbmFtZSwga25vd25Ob2RlczogQXJyYXkuZnJvbShub2RlSWRzKSB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCBhIHBvcnQgZXhpc3RzIG9uIHRoZSBnaXZlbiBub2RlIG9yIGJvdW5kYXJ5LlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVBvcnQoXG4gICAgbm9kZUlkOiBzdHJpbmcsXG4gICAgcG9ydDogc3RyaW5nLFxuICAgIGlzU291cmNlOiBib29sZWFuLFxuICAgIGJvdW5kYXJ5QWxpYXNlczogU2V0PHN0cmluZz4sXG4gICAgaW5wdXRQb3J0czogU2V0PHN0cmluZz4sXG4gICAgb3V0cHV0UG9ydHM6IFNldDxzdHJpbmc+LFxuICAgIG5vZGVQb3J0TWFwOiBNYXA8c3RyaW5nLCB7IGlucHV0OiBTZXQ8c3RyaW5nPjsgb3V0cHV0OiBTZXQ8c3RyaW5nPiB9PlxuICApOiB2b2lkIHtcbiAgICBpZiAobm9kZUlkID09PSBHUkFQSF9XT1JLRkxPV19CT1VOREFSWSkge1xuICAgICAgY29uc3QgcG9ydHMgPSBpc1NvdXJjZSA/IGlucHV0UG9ydHMgOiBvdXRwdXRQb3J0cztcbiAgICAgIGlmICghcG9ydHMuaGFzKHBvcnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBHcmFwaFBvcnRFcnJvcihcbiAgICAgICAgICBgVW5rbm93biAke2lzU291cmNlID8gXCJpbnB1dFwiIDogXCJvdXRwdXRcIn0gcG9ydCAnJHtwb3J0fScgb24gd29ya2Zsb3cgYm91bmRhcnlgLFxuICAgICAgICAgIHsgbm9kZUlkLCBwb3J0LCBpc1NvdXJjZSwgYXZhaWxhYmxlOiBBcnJheS5mcm9tKHBvcnRzKSB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZVBvcnRzID0gbm9kZVBvcnRNYXAuZ2V0KG5vZGVJZCk7XG4gICAgaWYgKCFub2RlUG9ydHMpIHtcbiAgICAgIHRocm93IG5ldyBHcmFwaFRvcG9sb2d5RXJyb3IoYE5vIHBvcnQgbWFwIGZvciBub2RlICcke25vZGVJZH0nYCwge1xuICAgICAgICBub2RlSWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBwb3J0cyA9IGlzU291cmNlID8gbm9kZVBvcnRzLm91dHB1dCA6IG5vZGVQb3J0cy5pbnB1dDtcbiAgICBpZiAoIXBvcnRzLmhhcyhwb3J0KSkge1xuICAgICAgdGhyb3cgbmV3IEdyYXBoUG9ydEVycm9yKFxuICAgICAgICBgVW5rbm93biAke2lzU291cmNlID8gXCJvdXRwdXRcIiA6IFwiaW5wdXRcIn0gcG9ydCAnJHtwb3J0fScgb24gbm9kZSAnJHtub2RlSWR9J2AsXG4gICAgICAgIHsgbm9kZUlkLCBwb3J0LCBpc1NvdXJjZSwgYXZhaWxhYmxlOiBBcnJheS5mcm9tKHBvcnRzKSB9XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIHNldCBvZiBib3VuZGFyeSBhbGlhc2VzIGZvciBhIHdvcmtmbG93LlxuICAgKi9cbiAgcHJpdmF0ZSBib3VuZGFyeUFsaWFzZXMod29ya2Zsb3c6IEdyYXBoV29ya2Zsb3dEZWZpbml0aW9uKTogU2V0PHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgU2V0KFtcbiAgICAgIEdSQVBIX1dPUktGTE9XX0JPVU5EQVJZLFxuICAgICAgXCJ3b3JrZmxvd1wiLFxuICAgICAgXCJncmFwaFwiLFxuICAgICAgd29ya2Zsb3cubmFtZSxcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyBwb3J0IG5hbWVzIGZyb20gYSBsaXN0IG9mIHBvcnQgZGVmaW5pdGlvbnMuXG4gICAqL1xuICBwcml2YXRlIHBvcnROYW1lcyhwb3J0czogR3JhcGhQb3J0RGVmaW5pdGlvbltdIHwgdW5kZWZpbmVkKTogU2V0PHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgU2V0KChwb3J0cyA/PyBbXSkubWFwKChwKSA9PiBwLm5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBtYXAgb2Ygbm9kZSBpZCAtPiB7IGlucHV0IHBvcnRzLCBvdXRwdXQgcG9ydHMgfS5cbiAgICovXG4gIHByaXZhdGUgYnVpbGROb2RlUG9ydE1hcChcbiAgICB3b3JrZmxvdzogR3JhcGhXb3JrZmxvd0RlZmluaXRpb25cbiAgKTogTWFwPHN0cmluZywgeyBpbnB1dDogU2V0PHN0cmluZz47IG91dHB1dDogU2V0PHN0cmluZz4gfT4ge1xuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCB7IGlucHV0OiBTZXQ8c3RyaW5nPjsgb3V0cHV0OiBTZXQ8c3RyaW5nPiB9PigpO1xuICAgIGZvciAoY29uc3Qgbm9kZU1ldGEgb2Ygd29ya2Zsb3cubm9kZXMgPz8gW10pIHtcbiAgICAgIGNvbnN0IGlucHV0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBjb25zdCBvdXRwdXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGNvbnN0IGRlZiA9IHRoaXMucmVzb2x2ZU5vZGVEZWZpbml0aW9uKG5vZGVNZXRhKTtcbiAgICAgIGlmIChkZWYpIHtcbiAgICAgICAgZm9yIChjb25zdCBwb3J0IG9mIGRlZi5wb3J0cyA/PyBbXSkge1xuICAgICAgICAgIGlmIChwb3J0LmRpcmVjdGlvbiA9PT0gXCJpbnB1dFwiKSBpbnB1dC5hZGQocG9ydC5uYW1lKTtcbiAgICAgICAgICBlbHNlIG91dHB1dC5hZGQocG9ydC5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbWFwLnNldChub2RlTWV0YS5pZCwgeyBpbnB1dCwgb3V0cHV0IH0pO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHRzIHRvIHJlc29sdmUgYSBub2RlJ3MgZnVsbCBkZWZpbml0aW9uIGZyb20gaXRzIG1ldGFkYXRhLlxuICAgKlxuICAgKiBBY2NlcHRzIGVpdGhlciBhIGRlY29yYXRlZCBNb2RlbCBjbGFzcy9pbnN0YW5jZSAocmVzb2x2ZWQgdmlhXG4gICAqIGBncmFwaERlZmluaXRpb25PZmApIG9yIGEgcGxhaW4gYEdyYXBoTm9kZURlZmluaXRpb25gLXNoYXBlZCBvYmplY3RcbiAgICogKHVzZWZ1bCBmb3Igc2VyaWFsaXplZCB3b3JrZmxvd3MgdGhhdCBpbmxpbmUgbm9kZSBkZWZpbml0aW9ucykuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVOb2RlRGVmaW5pdGlvbihcbiAgICBub2RlTWV0YTogeyBub2RlPzogdW5rbm93bjsga2luZD86IHN0cmluZyB9XG4gICk6IHsgcG9ydHM6IHsgZGlyZWN0aW9uOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W10gfSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKG5vZGVNZXRhLm5vZGUpIHtcbiAgICAgIGlmICh0aGlzLmlzUmF3RGVmaW5pdGlvbihub2RlTWV0YS5ub2RlKSkge1xuICAgICAgICByZXR1cm4gbm9kZU1ldGEubm9kZSBhcyB7XG4gICAgICAgICAgcG9ydHM6IHsgZGlyZWN0aW9uOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W107XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkZWYgPSBncmFwaERlZmluaXRpb25PZihub2RlTWV0YS5ub2RlIGFzIGFueSk7XG4gICAgICAgIHJldHVybiBkZWYgYXMgYW55O1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgd2hlbiBhIHZhbHVlIGxvb2tzIGxpa2UgYSByYXcge0BsaW5rIEdyYXBoTm9kZURlZmluaXRpb259XG4gICAqIChhIHBsYWluIG9iamVjdCB3aXRoIGEgYHBvcnRzYCBhcnJheSBhbmQgYSBgbmFtZWAgc3RyaW5nKS5cbiAgICovXG4gIHByaXZhdGUgaXNSYXdEZWZpbml0aW9uKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuICAgICAgdHlwZW9mICh2YWx1ZSBhcyB7IG5hbWU/OiB1bmtub3duIH0pLm5hbWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkoKHZhbHVlIGFzIHsgcG9ydHM/OiB1bmtub3duIH0pLnBvcnRzKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHN0YWJsZSBlZGdlIGlkIGZyb20gaXRzIGVuZHBvaW50cyBhbmQgcG9ydHMuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUVkZ2VJZChcbiAgICBzb3VyY2VOb2RlSWQ6IHN0cmluZyxcbiAgICBzb3VyY2VQb3J0OiBzdHJpbmcsXG4gICAgdGFyZ2V0Tm9kZUlkOiBzdHJpbmcsXG4gICAgdGFyZ2V0UG9ydDogc3RyaW5nXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3NvdXJjZU5vZGVJZH06JHtzb3VyY2VQb3J0fS0+JHt0YXJnZXROb2RlSWR9OiR7dGFyZ2V0UG9ydH1gO1xuICB9XG59XG4iXX0=
|
|
172
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhSZWxhdGlvblJlc29sdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiR3JhcGhSZWxhdGlvblJlc29sdmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlEQUFrRTtBQUNsRSxvREFBNEQ7QUFDNUQscUVBQStEO0FBQy9ELDZFQUF1RTtBQUN2RTs7R0FFRztBQUNILE1BQWEscUJBQXFCO0lBQzlCOzs7Ozs7O09BT0c7SUFDSCxPQUFPLENBQUMsUUFBUTtRQUNaLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwRCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDakIsS0FBSyxNQUFNLFFBQVEsSUFBSSxRQUFRLENBQUMsU0FBUyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQzlDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUM1RyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBQ0Q7O09B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Z0JBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBQSx5QkFBaUIsRUFBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzdDLE9BQU8sR0FBRyxDQUFDO1lBQ2YsQ0FBQztZQUNELE1BQU0sQ0FBQztnQkFDSCxPQUFPLFNBQVMsQ0FBQztZQUNyQixDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFDRDs7O09BR0c7SUFDSCxlQUFlLENBQUMsS0FBSztRQUNqQixPQUFPLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUTtZQUM3QixLQUFLLEtBQUssSUFBSTtZQUNkLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDckIsT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVE7WUFDOUIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQ0Q7O09BRUc7SUFDSCxZQUFZLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsVUFBVTtRQUMzRCxPQUFPLEdBQUcsWUFBWSxJQUFJLFVBQVUsS0FBSyxZQUFZLElBQUksVUFBVSxFQUFFLENBQUM7SUFDMUUsQ0FBQztDQUNKO0FBOUpELHNEQThKQztBQUNELDBtakJBQTBtakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBncmFwaERlZmluaXRpb25PZiB9IGZyb20gXCJAZGVjYWYtdHMvdWktZGVjb3JhdG9ycy9ncmFwaFwiO1xuaW1wb3J0IHsgR1JBUEhfV09SS0ZMT1dfQk9VTkRBUlkgfSBmcm9tIFwiLi8uLi9jb25zdGFudHMuanNcIjtcbmltcG9ydCB7IEdyYXBoUG9ydEVycm9yIH0gZnJvbSBcIi4vLi4vZXJyb3JzL0dyYXBoUG9ydEVycm9yLmpzXCI7XG5pbXBvcnQgeyBHcmFwaFRvcG9sb2d5RXJyb3IgfSBmcm9tIFwiLi8uLi9lcnJvcnMvR3JhcGhUb3BvbG9neUVycm9yLmpzXCI7XG4vKipcbiAqIFJlc29sdmVzIHJhdyB3b3JrZmxvdyByZWxhdGlvbiBtZXRhZGF0YSBpbnRvIG5vcm1hbGl6ZWQgZXhlY3V0aW9uIGVkZ2VzLlxuICovXG5leHBvcnQgY2xhc3MgR3JhcGhSZWxhdGlvblJlc29sdmVyIHtcbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyBhbGwgcmVsYXRpb25zIG9mIGEgd29ya2Zsb3cgaW50byBleGVjdXRpb24gZWRnZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gd29ya2Zsb3cgLSBUaGUgd29ya2Zsb3cgZGVmaW5pdGlvbi5cbiAgICAgKiBAcmV0dXJucyBBcnJheSBvZiBub3JtYWxpemVkIGVkZ2VzLlxuICAgICAqIEB0aHJvd3Mge0dyYXBoVG9wb2xvZ3lFcnJvcn0gd2hlbiBhbiBlbmRwb2ludCBpcyB1bmtub3duIG9yIGFtYmlndW91cy5cbiAgICAgKiBAdGhyb3dzIHtHcmFwaFBvcnRFcnJvcn0gd2hlbiBhIHJlZmVyZW5jZWQgcG9ydCBpcyBtaXNzaW5nIG9yIHVua25vd24uXG4gICAgICovXG4gICAgcmVzb2x2ZSh3b3JrZmxvdykge1xuICAgICAgICBjb25zdCBub2RlSWRzID0gbmV3IFNldCh3b3JrZmxvdy5ub2Rlcy5tYXAoKG4pID0+IG4uaWQpKTtcbiAgICAgICAgY29uc3QgYm91bmRhcnlBbGlhc2VzID0gdGhpcy5ib3VuZGFyeUFsaWFzZXMod29ya2Zsb3cpO1xuICAgICAgICBjb25zdCBpbnB1dFBvcnRzID0gdGhpcy5wb3J0TmFtZXMod29ya2Zsb3cuaW5wdXRzKTtcbiAgICAgICAgY29uc3Qgb3V0cHV0UG9ydHMgPSB0aGlzLnBvcnROYW1lcyh3b3JrZmxvdy5vdXRwdXRzKTtcbiAgICAgICAgY29uc3Qgbm9kZVBvcnRNYXAgPSB0aGlzLmJ1aWxkTm9kZVBvcnRNYXAod29ya2Zsb3cpO1xuICAgICAgICBjb25zdCBlZGdlcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJlbGF0aW9uIG9mIHdvcmtmbG93LnJlbGF0aW9ucyA/PyBbXSkge1xuICAgICAgICAgICAgY29uc3QgZWRnZSA9IHRoaXMucmVzb2x2ZVJlbGF0aW9uKHJlbGF0aW9uLCBub2RlSWRzLCBib3VuZGFyeUFsaWFzZXMsIGlucHV0UG9ydHMsIG91dHB1dFBvcnRzLCBub2RlUG9ydE1hcCk7XG4gICAgICAgICAgICBlZGdlcy5wdXNoKGVkZ2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlZGdlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzb2x2ZXMgYSBzaW5nbGUgcmVsYXRpb24gaW50byBhbiBlZGdlLlxuICAgICAqL1xuICAgIHJlc29sdmVSZWxhdGlvbihyZWxhdGlvbiwgbm9kZUlkcywgYm91bmRhcnlBbGlhc2VzLCBpbnB1dFBvcnRzLCBvdXRwdXRQb3J0cywgbm9kZVBvcnRNYXApIHtcbiAgICAgICAgY29uc3Qgc291cmNlTm9kZUlkID0gdGhpcy5yZXNvbHZlRW5kcG9pbnQocmVsYXRpb24uc291cmNlLCBub2RlSWRzLCBib3VuZGFyeUFsaWFzZXMpO1xuICAgICAgICBjb25zdCB0YXJnZXROb2RlSWQgPSB0aGlzLnJlc29sdmVFbmRwb2ludChyZWxhdGlvbi50YXJnZXQsIG5vZGVJZHMsIGJvdW5kYXJ5QWxpYXNlcyk7XG4gICAgICAgIGNvbnN0IHNvdXJjZVBvcnQgPSByZWxhdGlvbi5zb3VyY2VQb3J0O1xuICAgICAgICBjb25zdCB0YXJnZXRQb3J0ID0gcmVsYXRpb24udGFyZ2V0UG9ydDtcbiAgICAgICAgaWYgKCFzb3VyY2VQb3J0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgR3JhcGhQb3J0RXJyb3IoYFJlbGF0aW9uIGlzIG1pc3Npbmcgc291cmNlUG9ydCAoc291cmNlOiAke1N0cmluZyhyZWxhdGlvbi5zb3VyY2UpfSwgdGFyZ2V0OiAke1N0cmluZyhyZWxhdGlvbi50YXJnZXQpfSlgLCB7IHJlbGF0aW9uIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGFyZ2V0UG9ydCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEdyYXBoUG9ydEVycm9yKGBSZWxhdGlvbiBpcyBtaXNzaW5nIHRhcmdldFBvcnQgKHNvdXJjZTogJHtTdHJpbmcocmVsYXRpb24uc291cmNlKX0sIHRhcmdldDogJHtTdHJpbmcocmVsYXRpb24udGFyZ2V0KX0pYCwgeyByZWxhdGlvbiB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbGlkYXRlUG9ydChzb3VyY2VOb2RlSWQsIHNvdXJjZVBvcnQsIHRydWUsIGJvdW5kYXJ5QWxpYXNlcywgaW5wdXRQb3J0cywgb3V0cHV0UG9ydHMsIG5vZGVQb3J0TWFwKTtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVBvcnQodGFyZ2V0Tm9kZUlkLCB0YXJnZXRQb3J0LCBmYWxzZSwgYm91bmRhcnlBbGlhc2VzLCBpbnB1dFBvcnRzLCBvdXRwdXRQb3J0cywgbm9kZVBvcnRNYXApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IHRoaXMuY3JlYXRlRWRnZUlkKHNvdXJjZU5vZGVJZCwgc291cmNlUG9ydCwgdGFyZ2V0Tm9kZUlkLCB0YXJnZXRQb3J0KSxcbiAgICAgICAgICAgIHNvdXJjZU5vZGVJZCxcbiAgICAgICAgICAgIHNvdXJjZVBvcnQsXG4gICAgICAgICAgICB0YXJnZXROb2RlSWQsXG4gICAgICAgICAgICB0YXJnZXRQb3J0LFxuICAgICAgICAgICAgbGFiZWw6IHJlbGF0aW9uLmxhYmVsLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHJlbGF0aW9uLm1ldGFkYXRhLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyBhbiBlbmRwb2ludCAoc291cmNlIG9yIHRhcmdldCkgdG8gYSBub2RlIGlkIG9yIHRoZSB3b3JrZmxvdyBib3VuZGFyeS5cbiAgICAgKi9cbiAgICByZXNvbHZlRW5kcG9pbnQoZW5kcG9pbnQsIG5vZGVJZHMsIGJvdW5kYXJ5QWxpYXNlcykge1xuICAgICAgICBjb25zdCBuYW1lID0gU3RyaW5nKGVuZHBvaW50KTtcbiAgICAgICAgaWYgKGJvdW5kYXJ5QWxpYXNlcy5oYXMobmFtZSkpXG4gICAgICAgICAgICByZXR1cm4gR1JBUEhfV09SS0ZMT1dfQk9VTkRBUlk7XG4gICAgICAgIGlmIChub2RlSWRzLmhhcyhuYW1lKSlcbiAgICAgICAgICAgIHJldHVybiBuYW1lO1xuICAgICAgICB0aHJvdyBuZXcgR3JhcGhUb3BvbG9neUVycm9yKGBVbmtub3duIGVuZHBvaW50ICcke25hbWV9J2AsIHsgZW5kcG9pbnQ6IG5hbWUsIGtub3duTm9kZXM6IEFycmF5LmZyb20obm9kZUlkcykgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlcyB0aGF0IGEgcG9ydCBleGlzdHMgb24gdGhlIGdpdmVuIG5vZGUgb3IgYm91bmRhcnkuXG4gICAgICovXG4gICAgdmFsaWRhdGVQb3J0KG5vZGVJZCwgcG9ydCwgaXNTb3VyY2UsIGJvdW5kYXJ5QWxpYXNlcywgaW5wdXRQb3J0cywgb3V0cHV0UG9ydHMsIG5vZGVQb3J0TWFwKSB7XG4gICAgICAgIGlmIChub2RlSWQgPT09IEdSQVBIX1dPUktGTE9XX0JPVU5EQVJZKSB7XG4gICAgICAgICAgICBjb25zdCBwb3J0cyA9IGlzU291cmNlID8gaW5wdXRQb3J0cyA6IG91dHB1dFBvcnRzO1xuICAgICAgICAgICAgaWYgKCFwb3J0cy5oYXMocG9ydCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR3JhcGhQb3J0RXJyb3IoYFVua25vd24gJHtpc1NvdXJjZSA/IFwiaW5wdXRcIiA6IFwib3V0cHV0XCJ9IHBvcnQgJyR7cG9ydH0nIG9uIHdvcmtmbG93IGJvdW5kYXJ5YCwgeyBub2RlSWQsIHBvcnQsIGlzU291cmNlLCBhdmFpbGFibGU6IEFycmF5LmZyb20ocG9ydHMpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5vZGVQb3J0cyA9IG5vZGVQb3J0TWFwLmdldChub2RlSWQpO1xuICAgICAgICBpZiAoIW5vZGVQb3J0cykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEdyYXBoVG9wb2xvZ3lFcnJvcihgTm8gcG9ydCBtYXAgZm9yIG5vZGUgJyR7bm9kZUlkfSdgLCB7XG4gICAgICAgICAgICAgICAgbm9kZUlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcG9ydHMgPSBpc1NvdXJjZSA/IG5vZGVQb3J0cy5vdXRwdXQgOiBub2RlUG9ydHMuaW5wdXQ7XG4gICAgICAgIGlmICghcG9ydHMuaGFzKHBvcnQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgR3JhcGhQb3J0RXJyb3IoYFVua25vd24gJHtpc1NvdXJjZSA/IFwib3V0cHV0XCIgOiBcImlucHV0XCJ9IHBvcnQgJyR7cG9ydH0nIG9uIG5vZGUgJyR7bm9kZUlkfSdgLCB7IG5vZGVJZCwgcG9ydCwgaXNTb3VyY2UsIGF2YWlsYWJsZTogQXJyYXkuZnJvbShwb3J0cykgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQnVpbGRzIHRoZSBzZXQgb2YgYm91bmRhcnkgYWxpYXNlcyBmb3IgYSB3b3JrZmxvdy5cbiAgICAgKi9cbiAgICBib3VuZGFyeUFsaWFzZXMod29ya2Zsb3cpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXQoW1xuICAgICAgICAgICAgR1JBUEhfV09SS0ZMT1dfQk9VTkRBUlksXG4gICAgICAgICAgICBcIndvcmtmbG93XCIsXG4gICAgICAgICAgICBcImdyYXBoXCIsXG4gICAgICAgICAgICB3b3JrZmxvdy5uYW1lLFxuICAgICAgICBdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXh0cmFjdHMgcG9ydCBuYW1lcyBmcm9tIGEgbGlzdCBvZiBwb3J0IGRlZmluaXRpb25zLlxuICAgICAqL1xuICAgIHBvcnROYW1lcyhwb3J0cykge1xuICAgICAgICByZXR1cm4gbmV3IFNldCgocG9ydHMgPz8gW10pLm1hcCgocCkgPT4gcC5uYW1lKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBhIG1hcCBvZiBub2RlIGlkIC0+IHsgaW5wdXQgcG9ydHMsIG91dHB1dCBwb3J0cyB9LlxuICAgICAqL1xuICAgIGJ1aWxkTm9kZVBvcnRNYXAod29ya2Zsb3cpIHtcbiAgICAgICAgY29uc3QgbWFwID0gbmV3IE1hcCgpO1xuICAgICAgICBmb3IgKGNvbnN0IG5vZGVNZXRhIG9mIHdvcmtmbG93Lm5vZGVzID8/IFtdKSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIGNvbnN0IGRlZiA9IHRoaXMucmVzb2x2ZU5vZGVEZWZpbml0aW9uKG5vZGVNZXRhKTtcbiAgICAgICAgICAgIGlmIChkZWYpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBvcnQgb2YgZGVmLnBvcnRzID8/IFtdKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3J0LmRpcmVjdGlvbiA9PT0gXCJpbnB1dFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuYWRkKHBvcnQubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5hZGQocG9ydC5uYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtYXAuc2V0KG5vZGVNZXRhLmlkLCB7IGlucHV0LCBvdXRwdXQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXR0ZW1wdHMgdG8gcmVzb2x2ZSBhIG5vZGUncyBmdWxsIGRlZmluaXRpb24gZnJvbSBpdHMgbWV0YWRhdGEuXG4gICAgICpcbiAgICAgKiBBY2NlcHRzIGVpdGhlciBhIGRlY29yYXRlZCBNb2RlbCBjbGFzcy9pbnN0YW5jZSAocmVzb2x2ZWQgdmlhXG4gICAgICogYGdyYXBoRGVmaW5pdGlvbk9mYCkgb3IgYSBwbGFpbiBgR3JhcGhOb2RlRGVmaW5pdGlvbmAtc2hhcGVkIG9iamVjdFxuICAgICAqICh1c2VmdWwgZm9yIHNlcmlhbGl6ZWQgd29ya2Zsb3dzIHRoYXQgaW5saW5lIG5vZGUgZGVmaW5pdGlvbnMpLlxuICAgICAqL1xuICAgIHJlc29sdmVOb2RlRGVmaW5pdGlvbihub2RlTWV0YSkge1xuICAgICAgICBpZiAobm9kZU1ldGEubm9kZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNSYXdEZWZpbml0aW9uKG5vZGVNZXRhLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGVNZXRhLm5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlZiA9IGdyYXBoRGVmaW5pdGlvbk9mKG5vZGVNZXRhLm5vZGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCB3aGVuIGEgdmFsdWUgbG9va3MgbGlrZSBhIHJhdyB7QGxpbmsgR3JhcGhOb2RlRGVmaW5pdGlvbn1cbiAgICAgKiAoYSBwbGFpbiBvYmplY3Qgd2l0aCBhIGBwb3J0c2AgYXJyYXkgYW5kIGEgYG5hbWVgIHN0cmluZykuXG4gICAgICovXG4gICAgaXNSYXdEZWZpbml0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUubmFtZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZS5wb3J0cykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc3RhYmxlIGVkZ2UgaWQgZnJvbSBpdHMgZW5kcG9pbnRzIGFuZCBwb3J0cy5cbiAgICAgKi9cbiAgICBjcmVhdGVFZGdlSWQoc291cmNlTm9kZUlkLCBzb3VyY2VQb3J0LCB0YXJnZXROb2RlSWQsIHRhcmdldFBvcnQpIHtcbiAgICAgICAgcmV0dXJuIGAke3NvdXJjZU5vZGVJZH06JHtzb3VyY2VQb3J0fS0+JHt0YXJnZXROb2RlSWR9OiR7dGFyZ2V0UG9ydH1gO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSm1hV3hsSWpvaVIzSmhjR2hTWld4aGRHbHZibEpsYzI5c2RtVnlMbXB6SWl3aWMyOTFjbU5sVW05dmRDSTZJaUlzSW5OdmRYSmpaWE1pT2xzaUxpNHZMaTR2TGk0dkxpNHZMaTR2YzNKakwyZHlZWEJvTDJWdVoybHVaUzl3YkdGdWJtbHVaeTlIY21Gd2FGSmxiR0YwYVc5dVVtVnpiMngyWlhJdWRITWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklrRkJWVUVzVDBGQlR5eEZRVUZGTEdsQ1FVRnBRaXhGUVVGRkxFMUJRVTBzSzBKQlFTdENMRU5CUVVNN1FVRkZiRVVzVDBGQlR5eEZRVUZGTEhWQ1FVRjFRaXhGUVVGRkxEQkNRVUZ4UWp0QlFVTjJSQ3hQUVVGUExFVkJRVVVzWTBGQll5eEZRVUZGTEhORFFVRnBRenRCUVVNeFJDeFBRVUZQTEVWQlFVVXNhMEpCUVd0Q0xFVkJRVVVzTUVOQlFYRkRPMEZCUjJ4Rk96dEhRVVZITzBGQlEwZ3NUVUZCVFN4UFFVRlBMSEZDUVVGeFFqdEpRVU5vUXpzN096czdPenRQUVU5SE8wbEJRMGdzVDBGQlR5eERRVUZETEZGQlFXbERPMUZCUTNaRExFMUJRVTBzVDBGQlR5eEhRVUZITEVsQlFVa3NSMEZCUnl4RFFVRkRMRkZCUVZFc1EwRkJReXhMUVVGTExFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU1zUlVGQlJTeERRVUZETEVOQlFVTXNRMEZCUXp0UlFVTjZSQ3hOUVVGTkxHVkJRV1VzUjBGQlJ5eEpRVUZKTEVOQlFVTXNaVUZCWlN4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRE8xRkJRM1pFTEUxQlFVMHNWVUZCVlN4SFFVRkhMRWxCUVVrc1EwRkJReXhUUVVGVExFTkJRVU1zVVVGQlVTeERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRPMUZCUTI1RUxFMUJRVTBzVjBGQlZ5eEhRVUZITEVsQlFVa3NRMEZCUXl4VFFVRlRMRU5CUVVNc1VVRkJVU3hEUVVGRExFOUJRVThzUTBGQlF5eERRVUZETzFGQlEzSkVMRTFCUVUwc1YwRkJWeXhIUVVGSExFbEJRVWtzUTBGQlF5eG5Ra0ZCWjBJc1EwRkJReXhSUVVGUkxFTkJRVU1zUTBGQlF6dFJRVVZ3UkN4TlFVRk5MRXRCUVVzc1IwRkJOa0lzUlVGQlJTeERRVUZETzFGQlJUTkRMRXRCUVVzc1RVRkJUU3hSUVVGUkxFbEJRVWtzVVVGQlVTeERRVUZETEZOQlFWTXNTVUZCU1N4RlFVRkZMRVZCUVVVc1EwRkJRenRaUVVOb1JDeE5RVUZOTEVsQlFVa3NSMEZCUnl4SlFVRkpMRU5CUVVNc1pVRkJaU3hEUVVNdlFpeFJRVUZSTEVWQlExSXNUMEZCVHl4RlFVTlFMR1ZCUVdVc1JVRkRaaXhWUVVGVkxFVkJRMVlzVjBGQlZ5eEZRVU5ZTEZkQlFWY3NRMEZEV2l4RFFVRkRPMWxCUTBZc1MwRkJTeXhEUVVGRExFbEJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXp0UlFVTnVRaXhEUVVGRE8xRkJSVVFzVDBGQlR5eExRVUZMTEVOQlFVTTdTVUZEWml4RFFVRkRPMGxCUlVRN08wOUJSVWM3U1VGRFN5eGxRVUZsTEVOQlEzSkNMRkZCUVhWRExFVkJRM1pETEU5QlFXOUNMRVZCUTNCQ0xHVkJRVFJDTEVWQlF6VkNMRlZCUVhWQ0xFVkJRM1pDTEZkQlFYZENMRVZCUTNoQ0xGZEJRWEZGTzFGQlJYSkZMRTFCUVUwc1dVRkJXU3hIUVVGSExFbEJRVWtzUTBGQlF5eGxRVUZsTEVOQlEzWkRMRkZCUVZFc1EwRkJReXhOUVVGTkxFVkJRMllzVDBGQlR5eEZRVU5RTEdWQlFXVXNRMEZEYUVJc1EwRkJRenRSUVVOR0xFMUJRVTBzV1VGQldTeEhRVUZITEVsQlFVa3NRMEZCUXl4bFFVRmxMRU5CUTNaRExGRkJRVkVzUTBGQlF5eE5RVUZOTEVWQlEyWXNUMEZCVHl4RlFVTlFMR1ZCUVdVc1EwRkRhRUlzUTBGQlF6dFJRVVZHTEUxQlFVMHNWVUZCVlN4SFFVRkhMRkZCUVZFc1EwRkJReXhWUVVGVkxFTkJRVU03VVVGRGRrTXNUVUZCVFN4VlFVRlZMRWRCUVVjc1VVRkJVU3hEUVVGRExGVkJRVlVzUTBGQlF6dFJRVVYyUXl4SlFVRkpMRU5CUVVNc1ZVRkJWU3hGUVVGRkxFTkJRVU03V1VGRGFFSXNUVUZCVFN4SlFVRkpMR05CUVdNc1EwRkRkRUlzTWtOQlFUSkRMRTFCUVUwc1EwRkJReXhSUVVGUkxFTkJRVU1zVFVGQlRTeERRVUZETEdGQlFXRXNUVUZCVFN4RFFVRkRMRkZCUVZFc1EwRkJReXhOUVVGTkxFTkJRVU1zUjBGQlJ5eEZRVU42Unl4RlFVRkZMRkZCUVZFc1JVRkJSU3hEUVVOaUxFTkJRVU03VVVGRFNpeERRVUZETzFGQlEwUXNTVUZCU1N4RFFVRkRMRlZCUVZVc1JVRkJSU3hEUVVGRE8xbEJRMmhDTEUxQlFVMHNTVUZCU1N4alFVRmpMRU5CUTNSQ0xESkRRVUV5UXl4TlFVRk5MRU5CUVVNc1VVRkJVU3hEUVVGRExFMUJRVTBzUTBGQlF5eGhRVUZoTEUxQlFVMHNRMEZCUXl4UlFVRlJMRU5CUVVNc1RVRkJUU3hEUVVGRExFZEJRVWNzUlVGRGVrY3NSVUZCUlN4UlFVRlJMRVZCUVVVc1EwRkRZaXhEUVVGRE8xRkJRMG9zUTBGQlF6dFJRVVZFTEVsQlFVa3NRMEZCUXl4WlFVRlpMRU5CUTJZc1dVRkJXU3hGUVVOYUxGVkJRVlVzUlVGRFZpeEpRVUZKTEVWQlEwb3NaVUZCWlN4RlFVTm1MRlZCUVZVc1JVRkRWaXhYUVVGWExFVkJRMWdzVjBGQlZ5eERRVU5hTEVOQlFVTTdVVUZEUml4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVObUxGbEJRVmtzUlVGRFdpeFZRVUZWTEVWQlExWXNTMEZCU3l4RlFVTk1MR1ZCUVdVc1JVRkRaaXhWUVVGVkxFVkJRMVlzVjBGQlZ5eEZRVU5ZTEZkQlFWY3NRMEZEV2l4RFFVRkRPMUZCUlVZc1QwRkJUenRaUVVOTUxFVkJRVVVzUlVGQlJTeEpRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMRmxCUVZrc1JVRkJSU3hWUVVGVkxFVkJRVVVzV1VGQldTeEZRVUZGTEZWQlFWVXNRMEZCUXp0WlFVTjZSU3haUVVGWk8xbEJRMW9zVlVGQlZUdFpRVU5XTEZsQlFWazdXVUZEV2l4VlFVRlZPMWxCUTFZc1MwRkJTeXhGUVVGRkxGRkJRVkVzUTBGQlF5eExRVUZMTzFsQlEzSkNMRkZCUVZFc1JVRkJSU3hSUVVGUkxFTkJRVU1zVVVGQlVUdFRRVU0xUWl4RFFVRkRPMGxCUTBvc1EwRkJRenRKUVVWRU96dFBRVVZITzBsQlEwc3NaVUZCWlN4RFFVTnlRaXhSUVVFd1FpeEZRVU14UWl4UFFVRnZRaXhGUVVOd1FpeGxRVUUwUWp0UlFVVTFRaXhOUVVGTkxFbEJRVWtzUjBGQlJ5eE5RVUZOTEVOQlFVTXNVVUZCVVN4RFFVRkRMRU5CUVVNN1VVRkRPVUlzU1VGQlNTeGxRVUZsTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWxCUVVrc1EwRkJRenRaUVVGRkxFOUJRVThzZFVKQlFYVkNMRU5CUVVNN1VVRkRPVVFzU1VGQlNTeFBRVUZQTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWxCUVVrc1EwRkJRenRaUVVGRkxFOUJRVThzU1VGQlNTeERRVUZETzFGQlEyNURMRTFCUVUwc1NVRkJTU3hyUWtGQmEwSXNRMEZETVVJc2NVSkJRWEZDTEVsQlFVa3NSMEZCUnl4RlFVTTFRaXhGUVVGRkxGRkJRVkVzUlVGQlJTeEpRVUZKTEVWQlFVVXNWVUZCVlN4RlFVRkZMRXRCUVVzc1EwRkJReXhKUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEVWQlFVVXNRMEZEY0VRc1EwRkJRenRKUVVOS0xFTkJRVU03U1VGRlJEczdUMEZGUnp0SlFVTkxMRmxCUVZrc1EwRkRiRUlzVFVGQll5eEZRVU5rTEVsQlFWa3NSVUZEV2l4UlFVRnBRaXhGUVVOcVFpeGxRVUUwUWl4RlFVTTFRaXhWUVVGMVFpeEZRVU4yUWl4WFFVRjNRaXhGUVVONFFpeFhRVUZ4UlR0UlFVVnlSU3hKUVVGSkxFMUJRVTBzUzBGQlN5eDFRa0ZCZFVJc1JVRkJSU3hEUVVGRE8xbEJRM1pETEUxQlFVMHNTMEZCU3l4SFFVRkhMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU1zVlVGQlZTeERRVUZETEVOQlFVTXNRMEZCUXl4WFFVRlhMRU5CUVVNN1dVRkRiRVFzU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4SFFVRkhMRU5CUVVNc1NVRkJTU3hEUVVGRExFVkJRVVVzUTBGQlF6dG5Ra0ZEY2tJc1RVRkJUU3hKUVVGSkxHTkJRV01zUTBGRGRFSXNWMEZCVnl4UlFVRlJMRU5CUVVNc1EwRkJReXhEUVVGRExFOUJRVThzUTBGQlF5eERRVUZETEVOQlFVTXNVVUZCVVN4VlFVRlZMRWxCUVVrc2QwSkJRWGRDTEVWQlF6bEZMRVZCUVVVc1RVRkJUU3hGUVVGRkxFbEJRVWtzUlVGQlJTeFJRVUZSTEVWQlFVVXNVMEZCVXl4RlFVRkZMRXRCUVVzc1EwRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEVWQlFVVXNRMEZEZWtRc1EwRkJRenRaUVVOS0xFTkJRVU03V1VGRFJDeFBRVUZQTzFGQlExUXNRMEZCUXp0UlFVVkVMRTFCUVUwc1UwRkJVeXhIUVVGSExGZEJRVmNzUTBGQlF5eEhRVUZITEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNN1VVRkRNVU1zU1VGQlNTeERRVUZETEZOQlFWTXNSVUZCUlN4RFFVRkRPMWxCUTJZc1RVRkJUU3hKUVVGSkxHdENRVUZyUWl4RFFVRkRMSGxDUVVGNVFpeE5RVUZOTEVkQlFVY3NSVUZCUlR0blFrRkRMMFFzVFVGQlRUdGhRVU5RTEVOQlFVTXNRMEZCUXp0UlFVTk1MRU5CUVVNN1VVRkZSQ3hOUVVGTkxFdEJRVXNzUjBGQlJ5eFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRk5CUVZNc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEZOQlFWTXNRMEZCUXl4TFFVRkxMRU5CUVVNN1VVRkROVVFzU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4SFFVRkhMRU5CUVVNc1NVRkJTU3hEUVVGRExFVkJRVVVzUTBGQlF6dFpRVU55UWl4TlFVRk5MRWxCUVVrc1kwRkJZeXhEUVVOMFFpeFhRVUZYTEZGQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVVNc1VVRkJVU3hEUVVGRExFTkJRVU1zUTBGQlF5eFBRVUZQTEZWQlFWVXNTVUZCU1N4alFVRmpMRTFCUVUwc1IwRkJSeXhGUVVNM1JTeEZRVUZGTEUxQlFVMHNSVUZCUlN4SlFVRkpMRVZCUVVVc1VVRkJVU3hGUVVGRkxGTkJRVk1zUlVGQlJTeExRVUZMTEVOQlFVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhGUVVGRkxFTkJRM3BFTEVOQlFVTTdVVUZEU2l4RFFVRkRPMGxCUTBnc1EwRkJRenRKUVVWRU96dFBRVVZITzBsQlEwc3NaVUZCWlN4RFFVRkRMRkZCUVdsRE8xRkJRM1pFTEU5QlFVOHNTVUZCU1N4SFFVRkhMRU5CUVVNN1dVRkRZaXgxUWtGQmRVSTdXVUZEZGtJc1ZVRkJWVHRaUVVOV0xFOUJRVTg3V1VGRFVDeFJRVUZSTEVOQlFVTXNTVUZCU1R0VFFVTmtMRU5CUVVNc1EwRkJRenRKUVVOTUxFTkJRVU03U1VGRlJEczdUMEZGUnp0SlFVTkxMRk5CUVZNc1EwRkJReXhMUVVGM1F6dFJRVU40UkN4UFFVRlBMRWxCUVVrc1IwRkJSeXhEUVVGRExFTkJRVU1zUzBGQlN5eEpRVUZKTEVWQlFVVXNRMEZCUXl4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRExFTkJRVU1zUlVGQlJTeEZRVUZGTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRExFTkJRVU03U1VGRGJrUXNRMEZCUXp0SlFVVkVPenRQUVVWSE8wbEJRMHNzWjBKQlFXZENMRU5CUTNSQ0xGRkJRV2xETzFGQlJXcERMRTFCUVUwc1IwRkJSeXhIUVVGSExFbEJRVWtzUjBGQlJ5eEZRVUYxUkN4RFFVRkRPMUZCUXpORkxFdEJRVXNzVFVGQlRTeFJRVUZSTEVsQlFVa3NVVUZCVVN4RFFVRkRMRXRCUVVzc1NVRkJTU3hGUVVGRkxFVkJRVVVzUTBGQlF6dFpRVU0xUXl4TlFVRk5MRXRCUVVzc1IwRkJSeXhKUVVGSkxFZEJRVWNzUlVGQlZTeERRVUZETzFsQlEyaERMRTFCUVUwc1RVRkJUU3hIUVVGSExFbEJRVWtzUjBGQlJ5eEZRVUZWTEVOQlFVTTdXVUZEYWtNc1RVRkJUU3hIUVVGSExFZEJRVWNzU1VGQlNTeERRVUZETEhGQ1FVRnhRaXhEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETzFsQlEycEVMRWxCUVVrc1IwRkJSeXhGUVVGRkxFTkJRVU03WjBKQlExSXNTMEZCU3l4TlFVRk5MRWxCUVVrc1NVRkJTU3hIUVVGSExFTkJRVU1zUzBGQlN5eEpRVUZKTEVWQlFVVXNSVUZCUlN4RFFVRkRPMjlDUVVOdVF5eEpRVUZKTEVsQlFVa3NRMEZCUXl4VFFVRlRMRXRCUVVzc1QwRkJUenQzUWtGQlJTeExRVUZMTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWxCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF6czdkMEpCUTJoRUxFMUJRVTBzUTBGQlF5eEhRVUZITEVOQlFVTXNTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRE8yZENRVU0zUWl4RFFVRkRPMWxCUTBnc1EwRkJRenRaUVVORUxFZEJRVWNzUTBGQlF5eEhRVUZITEVOQlFVTXNVVUZCVVN4RFFVRkRMRVZCUVVVc1JVRkJSU3hGUVVGRkxFdEJRVXNzUlVGQlJTeE5RVUZOTEVWQlFVVXNRMEZCUXl4RFFVRkRPMUZCUXpGRExFTkJRVU03VVVGRFJDeFBRVUZQTEVkQlFVY3NRMEZCUXp0SlFVTmlMRU5CUVVNN1NVRkZSRHM3T3pzN08wOUJUVWM3U1VGRFN5eHhRa0ZCY1VJc1EwRkRNMElzVVVGQk1rTTdVVUZGTTBNc1NVRkJTU3hSUVVGUkxFTkJRVU1zU1VGQlNTeEZRVUZGTEVOQlFVTTdXVUZEYkVJc1NVRkJTU3hKUVVGSkxFTkJRVU1zWlVGQlpTeERRVUZETEZGQlFWRXNRMEZCUXl4SlFVRkpMRU5CUVVNc1JVRkJSU3hEUVVGRE8yZENRVU40UXl4UFFVRlBMRkZCUVZFc1EwRkJReXhKUVVWbUxFTkJRVU03V1VGRFNpeERRVUZETzFsQlEwUXNTVUZCU1N4RFFVRkRPMmRDUVVOSUxFMUJRVTBzUjBGQlJ5eEhRVUZITEdsQ1FVRnBRaXhEUVVGRExGRkJRVkVzUTBGQlF5eEpRVUZYTEVOQlFVTXNRMEZCUXp0blFrRkRjRVFzVDBGQlR5eEhRVUZWTEVOQlFVTTdXVUZEY0VJc1EwRkJRenRaUVVGRExFMUJRVTBzUTBGQlF6dG5Ra0ZEVUN4UFFVRlBMRk5CUVZNc1EwRkJRenRaUVVOdVFpeERRVUZETzFGQlEwZ3NRMEZCUXp0UlFVTkVMRTlCUVU4c1UwRkJVeXhEUVVGRE8wbEJRMjVDTEVOQlFVTTdTVUZGUkRzN08wOUJSMGM3U1VGRFN5eGxRVUZsTEVOQlFVTXNTMEZCWXp0UlFVTndReXhQUVVGUExFTkJRMHdzVDBGQlR5eExRVUZMTEV0QlFVc3NVVUZCVVR0WlFVTjZRaXhMUVVGTExFdEJRVXNzU1VGQlNUdFpRVU5rTEVOQlFVTXNTMEZCU3l4RFFVRkRMRTlCUVU4c1EwRkJReXhMUVVGTExFTkJRVU03V1VGRGNrSXNUMEZCVVN4TFFVRTBRaXhEUVVGRExFbEJRVWtzUzBGQlN5eFJRVUZSTzFsQlEzUkVMRXRCUVVzc1EwRkJReXhQUVVGUExFTkJRVVVzUzBGQk5rSXNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkRjRVFzUTBGQlF6dEpRVU5LTEVOQlFVTTdTVUZGUkRzN1QwRkZSenRKUVVOTExGbEJRVmtzUTBGRGJFSXNXVUZCYjBJc1JVRkRjRUlzVlVGQmEwSXNSVUZEYkVJc1dVRkJiMElzUlVGRGNFSXNWVUZCYTBJN1VVRkZiRUlzVDBGQlR5eEhRVUZITEZsQlFWa3NTVUZCU1N4VlFVRlZMRXRCUVVzc1dVRkJXU3hKUVVGSkxGVkJRVlVzUlVGQlJTeERRVUZETzBsQlEzaEZMRU5CUVVNN1EwRkRSaUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSWk4cUtseHVJQ29nUUcxdlpIVnNaU0JwYm5SbFozSmhkR2x2Ym5NdlozSmhjR2d2Y0d4aGJtNXBibWN2UjNKaGNHaFNaV3hoZEdsdmJsSmxjMjlzZG1WeVhHNGdLaUJBYzNWdGJXRnllU0JPYjNKdFlXeHBlbVZ6SUhkdmNtdG1iRzkzSUhKbGJHRjBhVzl1Y3lCcGJuUnZJR1Y0WldOMWRHbHZiaUJsWkdkbGN5NWNiaUFxSUVCa1pYTmpjbWx3ZEdsdmJpQlNaWE52YkhabGN5QjNiM0pyWm14dmR5QmliM1Z1WkdGeWVTQmhiR2xoYzJWekxDQjJZV3hwWkdGMFpYTWdaVzVrY0c5cGJuUnpJR0Z1WkNCd2IzSjBjeXdnWVc1a0lIQnliMlIxWTJWeklITjBZV0pzWlNCbFpHZGxJRWxFY3k1Y2JpQXFMMXh1YVcxd2IzSjBJSFI1Y0dVZ2UxeHVJQ0JIY21Gd2FGQnZjblJFWldacGJtbDBhVzl1TEZ4dUlDQkhjbUZ3YUZkdmNtdG1iRzkzUkdWbWFXNXBkR2x2Yml4Y2JpQWdSM0poY0doWGIzSnJabXh2ZDFKbGJHRjBhVzl1VFdWMFlXUmhkR0VzWEc1OUlHWnliMjBnWENKQVpHVmpZV1l0ZEhNdmRXa3RaR1ZqYjNKaGRHOXljeTluY21Gd2FGd2lPMXh1YVcxd2IzSjBJSHNnWjNKaGNHaEVaV1pwYm1sMGFXOXVUMllnZlNCbWNtOXRJRndpUUdSbFkyRm1MWFJ6TDNWcExXUmxZMjl5WVhSdmNuTXZaM0poY0doY0lqdGNibHh1YVcxd2IzSjBJSHNnUjFKQlVFaGZWMDlTUzBaTVQxZGZRazlWVGtSQlVsa2dmU0JtY205dElGd2lMaTR2WTI5dWMzUmhiblJ6WENJN1hHNXBiWEJ2Y25RZ2V5QkhjbUZ3YUZCdmNuUkZjbkp2Y2lCOUlHWnliMjBnWENJdUxpOWxjbkp2Y25NdlIzSmhjR2hRYjNKMFJYSnliM0pjSWp0Y2JtbHRjRzl5ZENCN0lFZHlZWEJvVkc5d2IyeHZaM2xGY25KdmNpQjlJR1p5YjIwZ1hDSXVMaTlsY25KdmNuTXZSM0poY0doVWIzQnZiRzluZVVWeWNtOXlYQ0k3WEc1cGJYQnZjblFnZEhsd1pTQjdJRWR5WVhCb1JYaGxZM1YwYVc5dVVHeGhia1ZrWjJVZ2ZTQm1jbTl0SUZ3aUxpOUhjbUZ3YUVWNFpXTjFkR2x2YmxCc1lXNUZaR2RsWENJN1hHNWNiaThxS2x4dUlDb2dVbVZ6YjJ4MlpYTWdjbUYzSUhkdmNtdG1iRzkzSUhKbGJHRjBhVzl1SUcxbGRHRmtZWFJoSUdsdWRHOGdibTl5YldGc2FYcGxaQ0JsZUdWamRYUnBiMjRnWldSblpYTXVYRzRnS2k5Y2JtVjRjRzl5ZENCamJHRnpjeUJIY21Gd2FGSmxiR0YwYVc5dVVtVnpiMngyWlhJZ2UxeHVJQ0F2S2lwY2JpQWdJQ29nVW1WemIyeDJaWE1nWVd4c0lISmxiR0YwYVc5dWN5QnZaaUJoSUhkdmNtdG1iRzkzSUdsdWRHOGdaWGhsWTNWMGFXOXVJR1ZrWjJWekxseHVJQ0FnS2x4dUlDQWdLaUJBY0dGeVlXMGdkMjl5YTJac2IzY2dMU0JVYUdVZ2QyOXlhMlpzYjNjZ1pHVm1hVzVwZEdsdmJpNWNiaUFnSUNvZ1FISmxkSFZ5Ym5NZ1FYSnlZWGtnYjJZZ2JtOXliV0ZzYVhwbFpDQmxaR2RsY3k1Y2JpQWdJQ29nUUhSb2NtOTNjeUI3UjNKaGNHaFViM0J2Ykc5bmVVVnljbTl5ZlNCM2FHVnVJR0Z1SUdWdVpIQnZhVzUwSUdseklIVnVhMjV2ZDI0Z2IzSWdZVzFpYVdkMWIzVnpMbHh1SUNBZ0tpQkFkR2h5YjNkeklIdEhjbUZ3YUZCdmNuUkZjbkp2Y24wZ2QyaGxiaUJoSUhKbFptVnlaVzVqWldRZ2NHOXlkQ0JwY3lCdGFYTnphVzVuSUc5eUlIVnVhMjV2ZDI0dVhHNGdJQ0FxTDF4dUlDQnlaWE52YkhabEtIZHZjbXRtYkc5M09pQkhjbUZ3YUZkdmNtdG1iRzkzUkdWbWFXNXBkR2x2YmlrNklFZHlZWEJvUlhobFkzVjBhVzl1VUd4aGJrVmtaMlZiWFNCN1hHNGdJQ0FnWTI5dWMzUWdibTlrWlVsa2N5QTlJRzVsZHlCVFpYUW9kMjl5YTJac2IzY3VibTlrWlhNdWJXRndLQ2h1S1NBOVBpQnVMbWxrS1NrN1hHNGdJQ0FnWTI5dWMzUWdZbTkxYm1SaGNubEJiR2xoYzJWeklEMGdkR2hwY3k1aWIzVnVaR0Z5ZVVGc2FXRnpaWE1vZDI5eWEyWnNiM2NwTzF4dUlDQWdJR052Ym5OMElHbHVjSFYwVUc5eWRITWdQU0IwYUdsekxuQnZjblJPWVcxbGN5aDNiM0pyWm14dmR5NXBibkIxZEhNcE8xeHVJQ0FnSUdOdmJuTjBJRzkxZEhCMWRGQnZjblJ6SUQwZ2RHaHBjeTV3YjNKMFRtRnRaWE1vZDI5eWEyWnNiM2N1YjNWMGNIVjBjeWs3WEc0Z0lDQWdZMjl1YzNRZ2JtOWtaVkJ2Y25STllYQWdQU0IwYUdsekxtSjFhV3hrVG05a1pWQnZjblJOWVhBb2QyOXlhMlpzYjNjcE8xeHVYRzRnSUNBZ1kyOXVjM1FnWldSblpYTTZJRWR5WVhCb1JYaGxZM1YwYVc5dVVHeGhia1ZrWjJWYlhTQTlJRnRkTzF4dVhHNGdJQ0FnWm05eUlDaGpiMjV6ZENCeVpXeGhkR2x2YmlCdlppQjNiM0pyWm14dmR5NXlaV3hoZEdsdmJuTWdQejhnVzEwcElIdGNiaUFnSUNBZ0lHTnZibk4wSUdWa1oyVWdQU0IwYUdsekxuSmxjMjlzZG1WU1pXeGhkR2x2YmloY2JpQWdJQ0FnSUNBZ2NtVnNZWFJwYjI0c1hHNGdJQ0FnSUNBZ0lHNXZaR1ZKWkhNc1hHNGdJQ0FnSUNBZ0lHSnZkVzVrWVhKNVFXeHBZWE5sY3l4Y2JpQWdJQ0FnSUNBZ2FXNXdkWFJRYjNKMGN5eGNiaUFnSUNBZ0lDQWdiM1YwY0hWMFVHOXlkSE1zWEc0Z0lDQWdJQ0FnSUc1dlpHVlFiM0owVFdGd1hHNGdJQ0FnSUNBcE8xeHVJQ0FnSUNBZ1pXUm5aWE11Y0hWemFDaGxaR2RsS1R0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0J5WlhSMWNtNGdaV1JuWlhNN1hHNGdJSDFjYmx4dUlDQXZLaXBjYmlBZ0lDb2dVbVZ6YjJ4MlpYTWdZU0J6YVc1bmJHVWdjbVZzWVhScGIyNGdhVzUwYnlCaGJpQmxaR2RsTGx4dUlDQWdLaTljYmlBZ2NISnBkbUYwWlNCeVpYTnZiSFpsVW1Wc1lYUnBiMjRvWEc0Z0lDQWdjbVZzWVhScGIyNDZJRWR5WVhCb1YyOXlhMlpzYjNkU1pXeGhkR2x2YmsxbGRHRmtZWFJoTEZ4dUlDQWdJRzV2WkdWSlpITTZJRk5sZER4emRISnBibWMrTEZ4dUlDQWdJR0p2ZFc1a1lYSjVRV3hwWVhObGN6b2dVMlYwUEhOMGNtbHVaejRzWEc0Z0lDQWdhVzV3ZFhSUWIzSjBjem9nVTJWMFBITjBjbWx1Wno0c1hHNGdJQ0FnYjNWMGNIVjBVRzl5ZEhNNklGTmxkRHh6ZEhKcGJtYytMRnh1SUNBZ0lHNXZaR1ZRYjNKMFRXRndPaUJOWVhBOGMzUnlhVzVuTENCN0lHbHVjSFYwT2lCVFpYUThjM1J5YVc1blBqc2diM1YwY0hWME9pQlRaWFE4YzNSeWFXNW5QaUI5UGx4dUlDQXBPaUJIY21Gd2FFVjRaV04xZEdsdmJsQnNZVzVGWkdkbElIdGNiaUFnSUNCamIyNXpkQ0J6YjNWeVkyVk9iMlJsU1dRZ1BTQjBhR2x6TG5KbGMyOXNkbVZGYm1Sd2IybHVkQ2hjYmlBZ0lDQWdJSEpsYkdGMGFXOXVMbk52ZFhKalpTeGNiaUFnSUNBZ0lHNXZaR1ZKWkhNc1hHNGdJQ0FnSUNCaWIzVnVaR0Z5ZVVGc2FXRnpaWE5jYmlBZ0lDQXBPMXh1SUNBZ0lHTnZibk4wSUhSaGNtZGxkRTV2WkdWSlpDQTlJSFJvYVhNdWNtVnpiMngyWlVWdVpIQnZhVzUwS0Z4dUlDQWdJQ0FnY21Wc1lYUnBiMjR1ZEdGeVoyVjBMRnh1SUNBZ0lDQWdibTlrWlVsa2N5eGNiaUFnSUNBZ0lHSnZkVzVrWVhKNVFXeHBZWE5sYzF4dUlDQWdJQ2s3WEc1Y2JpQWdJQ0JqYjI1emRDQnpiM1Z5WTJWUWIzSjBJRDBnY21Wc1lYUnBiMjR1YzI5MWNtTmxVRzl5ZER0Y2JpQWdJQ0JqYjI1emRDQjBZWEpuWlhSUWIzSjBJRDBnY21Wc1lYUnBiMjR1ZEdGeVoyVjBVRzl5ZER0Y2JseHVJQ0FnSUdsbUlDZ2hjMjkxY21ObFVHOXlkQ2tnZTF4dUlDQWdJQ0FnZEdoeWIzY2dibVYzSUVkeVlYQm9VRzl5ZEVWeWNtOXlLRnh1SUNBZ0lDQWdJQ0JnVW1Wc1lYUnBiMjRnYVhNZ2JXbHpjMmx1WnlCemIzVnlZMlZRYjNKMElDaHpiM1Z5WTJVNklDUjdVM1J5YVc1bktISmxiR0YwYVc5dUxuTnZkWEpqWlNsOUxDQjBZWEpuWlhRNklDUjdVM1J5YVc1bktISmxiR0YwYVc5dUxuUmhjbWRsZENsOUtXQXNYRzRnSUNBZ0lDQWdJSHNnY21Wc1lYUnBiMjRnZlZ4dUlDQWdJQ0FnS1R0Y2JpQWdJQ0I5WEc0Z0lDQWdhV1lnS0NGMFlYSm5aWFJRYjNKMEtTQjdYRzRnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dSM0poY0doUWIzSjBSWEp5YjNJb1hHNGdJQ0FnSUNBZ0lHQlNaV3hoZEdsdmJpQnBjeUJ0YVhOemFXNW5JSFJoY21kbGRGQnZjblFnS0hOdmRYSmpaVG9nSkh0VGRISnBibWNvY21Wc1lYUnBiMjR1YzI5MWNtTmxLWDBzSUhSaGNtZGxkRG9nSkh0VGRISnBibWNvY21Wc1lYUnBiMjR1ZEdGeVoyVjBLWDBwWUN4Y2JpQWdJQ0FnSUNBZ2V5QnlaV3hoZEdsdmJpQjlYRzRnSUNBZ0lDQXBPMXh1SUNBZ0lIMWNibHh1SUNBZ0lIUm9hWE11ZG1Gc2FXUmhkR1ZRYjNKMEtGeHVJQ0FnSUNBZ2MyOTFjbU5sVG05a1pVbGtMRnh1SUNBZ0lDQWdjMjkxY21ObFVHOXlkQ3hjYmlBZ0lDQWdJSFJ5ZFdVc1hHNGdJQ0FnSUNCaWIzVnVaR0Z5ZVVGc2FXRnpaWE1zWEc0Z0lDQWdJQ0JwYm5CMWRGQnZjblJ6TEZ4dUlDQWdJQ0FnYjNWMGNIVjBVRzl5ZEhNc1hHNGdJQ0FnSUNCdWIyUmxVRzl5ZEUxaGNGeHVJQ0FnSUNrN1hHNGdJQ0FnZEdocGN5NTJZV3hwWkdGMFpWQnZjblFvWEc0Z0lDQWdJQ0IwWVhKblpYUk9iMlJsU1dRc1hHNGdJQ0FnSUNCMFlYSm5aWFJRYjNKMExGeHVJQ0FnSUNBZ1ptRnNjMlVzWEc0Z0lDQWdJQ0JpYjNWdVpHRnllVUZzYVdGelpYTXNYRzRnSUNBZ0lDQnBibkIxZEZCdmNuUnpMRnh1SUNBZ0lDQWdiM1YwY0hWMFVHOXlkSE1zWEc0Z0lDQWdJQ0J1YjJSbFVHOXlkRTFoY0Z4dUlDQWdJQ2s3WEc1Y2JpQWdJQ0J5WlhSMWNtNGdlMXh1SUNBZ0lDQWdhV1E2SUhSb2FYTXVZM0psWVhSbFJXUm5aVWxrS0hOdmRYSmpaVTV2WkdWSlpDd2djMjkxY21ObFVHOXlkQ3dnZEdGeVoyVjBUbTlrWlVsa0xDQjBZWEpuWlhSUWIzSjBLU3hjYmlBZ0lDQWdJSE52ZFhKalpVNXZaR1ZKWkN4Y2JpQWdJQ0FnSUhOdmRYSmpaVkJ2Y25Rc1hHNGdJQ0FnSUNCMFlYSm5aWFJPYjJSbFNXUXNYRzRnSUNBZ0lDQjBZWEpuWlhSUWIzSjBMRnh1SUNBZ0lDQWdiR0ZpWld3NklISmxiR0YwYVc5dUxteGhZbVZzTEZ4dUlDQWdJQ0FnYldWMFlXUmhkR0U2SUhKbGJHRjBhVzl1TG0xbGRHRmtZWFJoTEZ4dUlDQWdJSDA3WEc0Z0lIMWNibHh1SUNBdktpcGNiaUFnSUNvZ1VtVnpiMngyWlhNZ1lXNGdaVzVrY0c5cGJuUWdLSE52ZFhKalpTQnZjaUIwWVhKblpYUXBJSFJ2SUdFZ2JtOWtaU0JwWkNCdmNpQjBhR1VnZDI5eWEyWnNiM2NnWW05MWJtUmhjbmt1WEc0Z0lDQXFMMXh1SUNCd2NtbDJZWFJsSUhKbGMyOXNkbVZGYm1Sd2IybHVkQ2hjYmlBZ0lDQmxibVJ3YjJsdWREb2djM1J5YVc1bklId2dkVzVyYm05M2JpeGNiaUFnSUNCdWIyUmxTV1J6T2lCVFpYUThjM1J5YVc1blBpeGNiaUFnSUNCaWIzVnVaR0Z5ZVVGc2FXRnpaWE02SUZObGREeHpkSEpwYm1jK1hHNGdJQ2s2SUhOMGNtbHVaeUI3WEc0Z0lDQWdZMjl1YzNRZ2JtRnRaU0E5SUZOMGNtbHVaeWhsYm1Sd2IybHVkQ2s3WEc0Z0lDQWdhV1lnS0dKdmRXNWtZWEo1UVd4cFlYTmxjeTVvWVhNb2JtRnRaU2twSUhKbGRIVnliaUJIVWtGUVNGOVhUMUpMUmt4UFYxOUNUMVZPUkVGU1dUdGNiaUFnSUNCcFppQW9ibTlrWlVsa2N5NW9ZWE1vYm1GdFpTa3BJSEpsZEhWeWJpQnVZVzFsTzF4dUlDQWdJSFJvY205M0lHNWxkeUJIY21Gd2FGUnZjRzlzYjJkNVJYSnliM0lvWEc0Z0lDQWdJQ0JnVlc1cmJtOTNiaUJsYm1Sd2IybHVkQ0FuSkh0dVlXMWxmU2RnTEZ4dUlDQWdJQ0FnZXlCbGJtUndiMmx1ZERvZ2JtRnRaU3dnYTI1dmQyNU9iMlJsY3pvZ1FYSnlZWGt1Wm5KdmJTaHViMlJsU1dSektTQjlYRzRnSUNBZ0tUdGNiaUFnZlZ4dVhHNGdJQzhxS2x4dUlDQWdLaUJXWVd4cFpHRjBaWE1nZEdoaGRDQmhJSEJ2Y25RZ1pYaHBjM1J6SUc5dUlIUm9aU0JuYVhabGJpQnViMlJsSUc5eUlHSnZkVzVrWVhKNUxseHVJQ0FnS2k5Y2JpQWdjSEpwZG1GMFpTQjJZV3hwWkdGMFpWQnZjblFvWEc0Z0lDQWdibTlrWlVsa09pQnpkSEpwYm1jc1hHNGdJQ0FnY0c5eWREb2djM1J5YVc1bkxGeHVJQ0FnSUdselUyOTFjbU5sT2lCaWIyOXNaV0Z1TEZ4dUlDQWdJR0p2ZFc1a1lYSjVRV3hwWVhObGN6b2dVMlYwUEhOMGNtbHVaejRzWEc0Z0lDQWdhVzV3ZFhSUWIzSjBjem9nVTJWMFBITjBjbWx1Wno0c1hHNGdJQ0FnYjNWMGNIVjBVRzl5ZEhNNklGTmxkRHh6ZEhKcGJtYytMRnh1SUNBZ0lHNXZaR1ZRYjNKMFRXRndPaUJOWVhBOGMzUnlhVzVuTENCN0lHbHVjSFYwT2lCVFpYUThjM1J5YVc1blBqc2diM1YwY0hWME9pQlRaWFE4YzNSeWFXNW5QaUI5UGx4dUlDQXBPaUIyYjJsa0lIdGNiaUFnSUNCcFppQW9ibTlrWlVsa0lEMDlQU0JIVWtGUVNGOVhUMUpMUmt4UFYxOUNUMVZPUkVGU1dTa2dlMXh1SUNBZ0lDQWdZMjl1YzNRZ2NHOXlkSE1nUFNCcGMxTnZkWEpqWlNBL0lHbHVjSFYwVUc5eWRITWdPaUJ2ZFhSd2RYUlFiM0owY3p0Y2JpQWdJQ0FnSUdsbUlDZ2hjRzl5ZEhNdWFHRnpLSEJ2Y25RcEtTQjdYRzRnSUNBZ0lDQWdJSFJvY205M0lHNWxkeUJIY21Gd2FGQnZjblJGY25KdmNpaGNiaUFnSUNBZ0lDQWdJQ0JnVlc1cmJtOTNiaUFrZTJselUyOTFjbU5sSUQ4Z1hDSnBibkIxZEZ3aUlEb2dYQ0p2ZFhSd2RYUmNJbjBnY0c5eWRDQW5KSHR3YjNKMGZTY2diMjRnZDI5eWEyWnNiM2NnWW05MWJtUmhjbmxnTEZ4dUlDQWdJQ0FnSUNBZ0lIc2dibTlrWlVsa0xDQndiM0owTENCcGMxTnZkWEpqWlN3Z1lYWmhhV3hoWW14bE9pQkJjbkpoZVM1bWNtOXRLSEJ2Y25SektTQjlYRzRnSUNBZ0lDQWdJQ2s3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0J5WlhSMWNtNDdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ1kyOXVjM1FnYm05a1pWQnZjblJ6SUQwZ2JtOWtaVkJ2Y25STllYQXVaMlYwS0c1dlpHVkpaQ2s3WEc0Z0lDQWdhV1lnS0NGdWIyUmxVRzl5ZEhNcElIdGNiaUFnSUNBZ0lIUm9jbTkzSUc1bGR5QkhjbUZ3YUZSdmNHOXNiMmQ1UlhKeWIzSW9ZRTV2SUhCdmNuUWdiV0Z3SUdadmNpQnViMlJsSUNja2UyNXZaR1ZKWkgwbllDd2dlMXh1SUNBZ0lDQWdJQ0J1YjJSbFNXUXNYRzRnSUNBZ0lDQjlLVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQmpiMjV6ZENCd2IzSjBjeUE5SUdselUyOTFjbU5sSUQ4Z2JtOWtaVkJ2Y25SekxtOTFkSEIxZENBNklHNXZaR1ZRYjNKMGN5NXBibkIxZER0Y2JpQWdJQ0JwWmlBb0lYQnZjblJ6TG1oaGN5aHdiM0owS1NrZ2UxeHVJQ0FnSUNBZ2RHaHliM2NnYm1WM0lFZHlZWEJvVUc5eWRFVnljbTl5S0Z4dUlDQWdJQ0FnSUNCZ1ZXNXJibTkzYmlBa2UybHpVMjkxY21ObElEOGdYQ0p2ZFhSd2RYUmNJaUE2SUZ3aWFXNXdkWFJjSW4wZ2NHOXlkQ0FuSkh0d2IzSjBmU2NnYjI0Z2JtOWtaU0FuSkh0dWIyUmxTV1I5SjJBc1hHNGdJQ0FnSUNBZ0lIc2dibTlrWlVsa0xDQndiM0owTENCcGMxTnZkWEpqWlN3Z1lYWmhhV3hoWW14bE9pQkJjbkpoZVM1bWNtOXRLSEJ2Y25SektTQjlYRzRnSUNBZ0lDQXBPMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJQzhxS2x4dUlDQWdLaUJDZFdsc1pITWdkR2hsSUhObGRDQnZaaUJpYjNWdVpHRnllU0JoYkdsaGMyVnpJR1p2Y2lCaElIZHZjbXRtYkc5M0xseHVJQ0FnS2k5Y2JpQWdjSEpwZG1GMFpTQmliM1Z1WkdGeWVVRnNhV0Z6WlhNb2QyOXlhMlpzYjNjNklFZHlZWEJvVjI5eWEyWnNiM2RFWldacGJtbDBhVzl1S1RvZ1UyVjBQSE4wY21sdVp6NGdlMXh1SUNBZ0lISmxkSFZ5YmlCdVpYY2dVMlYwS0Z0Y2JpQWdJQ0FnSUVkU1FWQklYMWRQVWt0R1RFOVhYMEpQVlU1RVFWSlpMRnh1SUNBZ0lDQWdYQ0ozYjNKclpteHZkMXdpTEZ4dUlDQWdJQ0FnWENKbmNtRndhRndpTEZ4dUlDQWdJQ0FnZDI5eWEyWnNiM2N1Ym1GdFpTeGNiaUFnSUNCZEtUdGNiaUFnZlZ4dVhHNGdJQzhxS2x4dUlDQWdLaUJGZUhSeVlXTjBjeUJ3YjNKMElHNWhiV1Z6SUdaeWIyMGdZU0JzYVhOMElHOW1JSEJ2Y25RZ1pHVm1hVzVwZEdsdmJuTXVYRzRnSUNBcUwxeHVJQ0J3Y21sMllYUmxJSEJ2Y25ST1lXMWxjeWh3YjNKMGN6b2dSM0poY0doUWIzSjBSR1ZtYVc1cGRHbHZibHRkSUh3Z2RXNWtaV1pwYm1Wa0tUb2dVMlYwUEhOMGNtbHVaejRnZTF4dUlDQWdJSEpsZEhWeWJpQnVaWGNnVTJWMEtDaHdiM0owY3lBL1B5QmJYU2t1YldGd0tDaHdLU0E5UGlCd0xtNWhiV1VwS1R0Y2JpQWdmVnh1WEc0Z0lDOHFLbHh1SUNBZ0tpQkNkV2xzWkhNZ1lTQnRZWEFnYjJZZ2JtOWtaU0JwWkNBdFBpQjdJR2x1Y0hWMElIQnZjblJ6TENCdmRYUndkWFFnY0c5eWRITWdmUzVjYmlBZ0lDb3ZYRzRnSUhCeWFYWmhkR1VnWW5WcGJHUk9iMlJsVUc5eWRFMWhjQ2hjYmlBZ0lDQjNiM0pyWm14dmR6b2dSM0poY0doWGIzSnJabXh2ZDBSbFptbHVhWFJwYjI1Y2JpQWdLVG9nVFdGd1BITjBjbWx1Wnl3Z2V5QnBibkIxZERvZ1UyVjBQSE4wY21sdVp6NDdJRzkxZEhCMWREb2dVMlYwUEhOMGNtbHVaejRnZlQ0Z2UxeHVJQ0FnSUdOdmJuTjBJRzFoY0NBOUlHNWxkeUJOWVhBOGMzUnlhVzVuTENCN0lHbHVjSFYwT2lCVFpYUThjM1J5YVc1blBqc2diM1YwY0hWME9pQlRaWFE4YzNSeWFXNW5QaUI5UGlncE8xeHVJQ0FnSUdadmNpQW9ZMjl1YzNRZ2JtOWtaVTFsZEdFZ2IyWWdkMjl5YTJac2IzY3VibTlrWlhNZ1B6OGdXMTBwSUh0Y2JpQWdJQ0FnSUdOdmJuTjBJR2x1Y0hWMElEMGdibVYzSUZObGREeHpkSEpwYm1jK0tDazdYRzRnSUNBZ0lDQmpiMjV6ZENCdmRYUndkWFFnUFNCdVpYY2dVMlYwUEhOMGNtbHVaejRvS1R0Y2JpQWdJQ0FnSUdOdmJuTjBJR1JsWmlBOUlIUm9hWE11Y21WemIyeDJaVTV2WkdWRVpXWnBibWwwYVc5dUtHNXZaR1ZOWlhSaEtUdGNiaUFnSUNBZ0lHbG1JQ2hrWldZcElIdGNiaUFnSUNBZ0lDQWdabTl5SUNoamIyNXpkQ0J3YjNKMElHOW1JR1JsWmk1d2IzSjBjeUEvUHlCYlhTa2dlMXh1SUNBZ0lDQWdJQ0FnSUdsbUlDaHdiM0owTG1ScGNtVmpkR2x2YmlBOVBUMGdYQ0pwYm5CMWRGd2lLU0JwYm5CMWRDNWhaR1FvY0c5eWRDNXVZVzFsS1R0Y2JpQWdJQ0FnSUNBZ0lDQmxiSE5sSUc5MWRIQjFkQzVoWkdRb2NHOXlkQzV1WVcxbEtUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdiV0Z3TG5ObGRDaHViMlJsVFdWMFlTNXBaQ3dnZXlCcGJuQjFkQ3dnYjNWMGNIVjBJSDBwTzF4dUlDQWdJSDFjYmlBZ0lDQnlaWFIxY200Z2JXRndPMXh1SUNCOVhHNWNiaUFnTHlvcVhHNGdJQ0FxSUVGMGRHVnRjSFJ6SUhSdklISmxjMjlzZG1VZ1lTQnViMlJsSjNNZ1puVnNiQ0JrWldacGJtbDBhVzl1SUdaeWIyMGdhWFJ6SUcxbGRHRmtZWFJoTGx4dUlDQWdLbHh1SUNBZ0tpQkJZMk5sY0hSeklHVnBkR2hsY2lCaElHUmxZMjl5WVhSbFpDQk5iMlJsYkNCamJHRnpjeTlwYm5OMFlXNWpaU0FvY21WemIyeDJaV1FnZG1saFhHNGdJQ0FxSUdCbmNtRndhRVJsWm1sdWFYUnBiMjVQWm1BcElHOXlJR0VnY0d4aGFXNGdZRWR5WVhCb1RtOWtaVVJsWm1sdWFYUnBiMjVnTFhOb1lYQmxaQ0J2WW1wbFkzUmNiaUFnSUNvZ0tIVnpaV1oxYkNCbWIzSWdjMlZ5YVdGc2FYcGxaQ0IzYjNKclpteHZkM01nZEdoaGRDQnBibXhwYm1VZ2JtOWtaU0JrWldacGJtbDBhVzl1Y3lrdVhHNGdJQ0FxTDF4dUlDQndjbWwyWVhSbElISmxjMjlzZG1WT2IyUmxSR1ZtYVc1cGRHbHZiaWhjYmlBZ0lDQnViMlJsVFdWMFlUb2dleUJ1YjJSbFB6b2dkVzVyYm05M2Jqc2dhMmx1WkQ4NklITjBjbWx1WnlCOVhHNGdJQ2s2SUhzZ2NHOXlkSE02SUhzZ1pHbHlaV04wYVc5dU9pQnpkSEpwYm1jN0lHNWhiV1U2SUhOMGNtbHVaeUI5VzEwZ2ZTQjhJSFZ1WkdWbWFXNWxaQ0I3WEc0Z0lDQWdhV1lnS0c1dlpHVk5aWFJoTG01dlpHVXBJSHRjYmlBZ0lDQWdJR2xtSUNoMGFHbHpMbWx6VW1GM1JHVm1hVzVwZEdsdmJpaHViMlJsVFdWMFlTNXViMlJsS1NrZ2UxeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2JtOWtaVTFsZEdFdWJtOWtaU0JoY3lCN1hHNGdJQ0FnSUNBZ0lDQWdjRzl5ZEhNNklIc2daR2x5WldOMGFXOXVPaUJ6ZEhKcGJtYzdJRzVoYldVNklITjBjbWx1WnlCOVcxMDdYRzRnSUNBZ0lDQWdJSDA3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0IwY25rZ2UxeHVJQ0FnSUNBZ0lDQmpiMjV6ZENCa1pXWWdQU0JuY21Gd2FFUmxabWx1YVhScGIyNVBaaWh1YjJSbFRXVjBZUzV1YjJSbElHRnpJR0Z1ZVNrN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCa1pXWWdZWE1nWVc1NU8xeHVJQ0FnSUNBZ2ZTQmpZWFJqYUNCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCMWJtUmxabWx1WldRN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQjFibVJsWm1sdVpXUTdYRzRnSUgxY2JseHVJQ0F2S2lwY2JpQWdJQ29nVW1WMGRYSnVjeUJnZEhKMVpXQWdkMmhsYmlCaElIWmhiSFZsSUd4dmIydHpJR3hwYTJVZ1lTQnlZWGNnZTBCc2FXNXJJRWR5WVhCb1RtOWtaVVJsWm1sdWFYUnBiMjU5WEc0Z0lDQXFJQ2hoSUhCc1lXbHVJRzlpYW1WamRDQjNhWFJvSUdFZ1lIQnZjblJ6WUNCaGNuSmhlU0JoYm1RZ1lTQmdibUZ0WldBZ2MzUnlhVzVuS1M1Y2JpQWdJQ292WEc0Z0lIQnlhWFpoZEdVZ2FYTlNZWGRFWldacGJtbDBhVzl1S0haaGJIVmxPaUIxYm10dWIzZHVLVG9nWW05dmJHVmhiaUI3WEc0Z0lDQWdjbVYwZFhKdUlDaGNiaUFnSUNBZ0lIUjVjR1Z2WmlCMllXeDFaU0E5UFQwZ1hDSnZZbXBsWTNSY0lpQW1KbHh1SUNBZ0lDQWdkbUZzZFdVZ0lUMDlJRzUxYkd3Z0ppWmNiaUFnSUNBZ0lDRkJjbkpoZVM1cGMwRnljbUY1S0haaGJIVmxLU0FtSmx4dUlDQWdJQ0FnZEhsd1pXOW1JQ2gyWVd4MVpTQmhjeUI3SUc1aGJXVS9PaUIxYm10dWIzZHVJSDBwTG01aGJXVWdQVDA5SUZ3aWMzUnlhVzVuWENJZ0ppWmNiaUFnSUNBZ0lFRnljbUY1TG1selFYSnlZWGtvS0haaGJIVmxJR0Z6SUhzZ2NHOXlkSE0vT2lCMWJtdHViM2R1SUgwcExuQnZjblJ6S1Z4dUlDQWdJQ2s3WEc0Z0lIMWNibHh1SUNBdktpcGNiaUFnSUNvZ1EzSmxZWFJsY3lCaElITjBZV0pzWlNCbFpHZGxJR2xrSUdaeWIyMGdhWFJ6SUdWdVpIQnZhVzUwY3lCaGJtUWdjRzl5ZEhNdVhHNGdJQ0FxTDF4dUlDQndjbWwyWVhSbElHTnlaV0YwWlVWa1oyVkpaQ2hjYmlBZ0lDQnpiM1Z5WTJWT2IyUmxTV1E2SUhOMGNtbHVaeXhjYmlBZ0lDQnpiM1Z5WTJWUWIzSjBPaUJ6ZEhKcGJtY3NYRzRnSUNBZ2RHRnlaMlYwVG05a1pVbGtPaUJ6ZEhKcGJtY3NYRzRnSUNBZ2RHRnlaMlYwVUc5eWREb2djM1J5YVc1blhHNGdJQ2s2SUhOMGNtbHVaeUI3WEc0Z0lDQWdjbVYwZFhKdUlHQWtlM052ZFhKalpVNXZaR1ZKWkgwNkpIdHpiM1Z5WTJWUWIzSjBmUzArSkh0MFlYSm5aWFJPYjJSbFNXUjlPaVI3ZEdGeVoyVjBVRzl5ZEgxZ08xeHVJQ0I5WEc1OVhHNGlYWDA9Il19
|