xstate 5.0.0-alpha.6 → 5.0.0-beta.7

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.
@@ -1 +1 @@
1
- {"version":3,"file":"xstate-actions.umd.min.js","sources":["../../src/types.ts","../../src/actionTypes.ts","../../src/utils.ts","../../src/constants.ts","../dynamicAction.ts","../../src/actions/send.ts","../../src/Mailbox.ts","../../src/symbolObservable.ts","../../src/actors/index.ts","../../src/dev/index.ts","../../src/interpreter.ts","../../src/system.ts","../../src/actions/log.ts","../../src/memo.ts","../../src/guards.ts","../../src/stateUtils.ts","../../src/State.ts","../../src/actions/invoke.ts","../../src/spawn.ts","../../src/actions.ts","../../src/actions/assign.ts","../../src/actions/cancel.ts","../../src/actions/choose.ts","../../src/actions/raise.ts","../../src/actions/stop.ts"],"sourcesContent":["import type { StateNode } from './StateNode.ts';\nimport type { State } from './State.ts';\nimport type { ActorStatus, Clock, Interpreter } from './interpreter.ts';\nimport type { StateMachine } from './StateMachine.ts';\nimport type { LifecycleSignal } from './actors/index.ts';\nimport {\n TypegenDisabled,\n ResolveTypegenMeta,\n TypegenConstraint,\n MarkAllImplementationsAsProvided,\n AreAllImplementationsAssumedToBeProvided\n} from './typegenTypes.ts';\n\nexport type AnyFunction = (...args: any[]) => any;\n\ntype ReturnTypeOrValue<T> = T extends AnyFunction ? ReturnType<T> : T;\n\n// https://github.com/microsoft/TypeScript/issues/23182#issuecomment-379091887\nexport type IsNever<T> = [T] extends [never] ? true : false;\n\nexport type Compute<A extends any> = { [K in keyof A]: A[K] } & unknown;\nexport type Prop<T, K> = K extends keyof T ? T[K] : never;\nexport type Values<T> = T[keyof T];\nexport type Merge<M, N> = Omit<M, keyof N> & N;\n// TODO: replace in v5 with:\n// export type IndexByType<T extends { type: string }> = { [E in T as E['type']]: E; };\nexport type IndexByType<T extends { type: string }> = {\n [K in T['type']]: T extends any ? (K extends T['type'] ? T : never) : never;\n};\n\nexport type Equals<A1 extends any, A2 extends any> = (<A>() => A extends A2\n ? true\n : false) extends <A>() => A extends A1 ? true : false\n ? true\n : false;\nexport type IsAny<T> = Equals<T, any>;\nexport type Cast<A, B> = A extends B ? A : B;\nexport type NoInfer<T> = [T][T extends any ? 0 : any];\nexport type LowInfer<T> = T & {};\n\nexport type EventType = string;\nexport type ActionType = string;\nexport type MetaObject = Record<string, any>;\n\nexport type Lazy<T> = () => T;\nexport type MaybeLazy<T> = T | Lazy<T>;\n\n/**\n * The full definition of an event, with a string `type`.\n */\nexport interface EventObject {\n /**\n * The type of event that is sent.\n */\n type: string;\n}\n\nexport interface AnyEventObject extends EventObject {\n [key: string]: any;\n}\n\nexport interface ParameterizedObject {\n type: string;\n params?: Record<string, any>;\n}\n\nexport interface BaseActionObject extends ParameterizedObject {\n execute?: (actorCtx: AnyActorContext) => void;\n}\n\nexport interface BuiltInActionObject extends ParameterizedObject {\n type: `xstate.${string}`;\n params: Record<string, any>;\n}\n\nexport interface UnifiedArg<\n TContext extends MachineContext,\n TEvent extends EventObject\n> {\n context: TContext;\n event: TEvent;\n}\n\nexport interface BaseDynamicActionObject<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject,\n TResolvedAction extends BaseActionObject,\n TDynamicParams extends Record<string, any>\n> {\n type: `xstate.${string}`;\n params: TDynamicParams;\n resolve: (\n _event: SCXML.Event<TExpressionEvent>,\n extra: {\n state: State<TContext, TEvent>;\n /**\n * The original action object\n */\n action: ParameterizedObject;\n actorContext: AnyActorContext | undefined;\n }\n ) => [AnyState, TResolvedAction];\n\n /** @deprecated an internal signature that doesn't exist at runtime. Its existence helps TS to choose a better code path in the inference algorithm */\n (\n args: {\n context: TContext;\n event: TExpressionEvent;\n } & ActionMeta<TEvent, ParameterizedObject>\n ): void;\n}\n\nexport type MachineContext = Record<string, any>;\n\nexport interface ActionMeta<\n TEvent extends EventObject,\n TAction extends ParameterizedObject = ParameterizedObject\n> extends StateMeta<TEvent> {\n action: TAction;\n _event: SCXML.Event<TEvent>;\n}\n\n// TODO: do not accept machines without all implementations\n// we should also accept a raw machine as a behavior here\n// or just make machine a behavior\nexport type Spawner = <T extends ActorBehavior<any, any> | string>( // TODO: read string from machine behavior keys\n behavior: T,\n options?: Partial<{\n id: string;\n input: any;\n }>\n) => T extends ActorBehavior<infer TActorEvent, infer TActorEmitted>\n ? ActorRef<TActorEvent, TActorEmitted>\n : ActorRef<any, any>; // TODO: narrow this to behaviors from machine\n\nexport interface AssignMeta<\n TExpressionEvent extends EventObject,\n _TEvent extends EventObject\n> extends StateMeta<TExpressionEvent> {\n action: BaseActionObject;\n _event: SCXML.Event<TExpressionEvent>;\n spawn: Spawner;\n}\n\nexport type ActionFunction<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TAction extends ParameterizedObject = ParameterizedObject,\n TEvent extends EventObject = TExpressionEvent\n> = (\n args: {\n context: TContext;\n event: TExpressionEvent;\n } & ActionMeta<TEvent, TAction>\n) => void;\n\nexport interface ChooseCondition<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject = TExpressionEvent\n> {\n guard?: GuardConfig<TContext, TEvent>;\n actions: Actions<TContext, TExpressionEvent, TEvent>;\n}\n\nexport type Action<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject = TExpressionEvent\n> =\n | ActionType\n | ParameterizedObject\n | ActionFunction<TContext, TExpressionEvent, ParameterizedObject, TEvent>\n | BaseDynamicActionObject<TContext, TExpressionEvent, TEvent, any, any>; // TODO: fix last param\n\n/**\n * Extracts action objects that have no extra properties.\n */\ntype SimpleActionsFrom<T extends ParameterizedObject> =\n ParameterizedObject extends T\n ? T // If actions are unspecified, all action types are allowed (unsafe)\n : ExtractWithSimpleSupport<T>;\n\nexport type BaseAction<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TAction extends ParameterizedObject,\n TEvent extends EventObject\n> =\n | BaseDynamicActionObject<\n TContext,\n TExpressionEvent,\n TEvent,\n any, // TODO: at the very least this should include TAction, but probably at a covariant position or something, we really need to rethink how action objects are typed\n any\n >\n | TAction\n | SimpleActionsFrom<TAction>['type']\n | ActionFunction<TContext, TExpressionEvent, TAction, TEvent>;\n\nexport type BaseActions<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject,\n TAction extends ParameterizedObject\n> = SingleOrArray<BaseAction<TContext, TExpressionEvent, TAction, TEvent>>;\n\nexport type Actions<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject = TExpressionEvent\n> = SingleOrArray<Action<TContext, TEvent>>;\n\nexport type StateKey = string | AnyState;\n\nexport interface StateValueMap {\n [key: string]: StateValue;\n}\n\n/**\n * The string or object representing the state value relative to the parent state node.\n *\n * - For a child atomic state node, this is a string, e.g., `\"pending\"`.\n * - For complex state nodes, this is an object, e.g., `{ success: \"someChildState\" }`.\n */\nexport type StateValue = string | StateValueMap;\n\nexport type GuardPredicate<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = (\n args: {\n context: TContext;\n event: TEvent;\n } & GuardMeta<TContext, TEvent>\n) => boolean;\n\nexport interface DefaultGuardObject<\n TContext extends MachineContext,\n TEvent extends EventObject\n> extends ParameterizedObject {\n /**\n * Nested guards\n */\n children?: Array<GuardObject<TContext, TEvent>>;\n predicate?: GuardPredicate<TContext, TEvent>;\n}\n\nexport type GuardEvaluator<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = (\n guard: GuardDefinition<TContext, TEvent>,\n context: TContext,\n _event: SCXML.Event<TEvent>,\n state: State<TContext, TEvent>\n) => boolean;\n\nexport interface GuardMeta<\n TContext extends MachineContext,\n TEvent extends EventObject\n> {\n state: State<TContext, TEvent, any>;\n _event: SCXML.Event<TEvent>;\n guard: GuardDefinition<TContext, TEvent>;\n evaluate: GuardEvaluator<TContext, TEvent>;\n}\n\nexport type GuardConfig<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = string | GuardPredicate<TContext, TEvent> | GuardObject<TContext, TEvent>;\n\nexport type GuardObject<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = BooleanGuardObject<TContext, TEvent> | DefaultGuardObject<TContext, TEvent>;\n\nexport interface GuardDefinition<\n TContext extends MachineContext,\n TEvent extends EventObject\n> {\n type: string;\n children?: Array<GuardDefinition<TContext, TEvent>>;\n predicate?: GuardPredicate<TContext, TEvent>;\n params: { [key: string]: any };\n}\n\nexport interface BooleanGuardObject<\n TContext extends MachineContext,\n TEvent extends EventObject\n> extends ParameterizedObject {\n type: 'xstate.boolean';\n children: Array<GuardConfig<TContext, TEvent>>;\n params: {\n op: 'and' | 'or' | 'not';\n };\n predicate: undefined;\n}\n\nexport interface BooleanGuardDefinition<\n TContext extends MachineContext,\n TEvent extends EventObject\n> extends GuardDefinition<TContext, TEvent> {\n type: 'xstate.boolean';\n params: {\n op: 'and' | 'or' | 'not';\n };\n}\n\nexport type TransitionTarget = SingleOrArray<string>;\n\nexport interface TransitionConfig<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject = TExpressionEvent,\n TAction extends ParameterizedObject = ParameterizedObject\n> {\n guard?: GuardConfig<TContext, TExpressionEvent>;\n actions?: BaseActions<TContext, TExpressionEvent, TEvent, TAction>;\n external?: boolean;\n target?: TransitionTarget | undefined;\n meta?: Record<string, any>;\n description?: string;\n}\n\nexport interface TargetTransitionConfig<\n TContext extends MachineContext,\n TEvent extends EventObject\n> extends TransitionConfig<TContext, TEvent> {\n target: TransitionTarget; // TODO: just make this non-optional\n}\n\nexport type ConditionalTransitionConfig<\n TContext extends MachineContext,\n TEvent extends EventObject = EventObject\n> = Array<TransitionConfig<TContext, TEvent>>;\n\nexport interface InitialTransitionConfig<\n TContext extends MachineContext,\n TEvent extends EventObject\n> extends TransitionConfig<TContext, TEvent> {\n guard?: never;\n target: TransitionTarget;\n}\n\nexport type Transition<\n TContext extends MachineContext,\n TEvent extends EventObject = EventObject\n> =\n | string\n | TransitionConfig<TContext, TEvent>\n | ConditionalTransitionConfig<TContext, TEvent>;\n\ntype ExtractWithSimpleSupport<T extends { type: string }> = T extends any\n ? { type: T['type'] } extends T\n ? T\n : never\n : never;\n\nexport type Receiver<TEvent extends EventObject> = (\n listener: {\n bivarianceHack(event: TEvent): void;\n }['bivarianceHack']\n) => void;\n\nexport type InvokeCallback<\n TEvent extends EventObject = AnyEventObject,\n TSentEvent extends EventObject = AnyEventObject\n> = (\n sendBack: (event: TSentEvent) => void,\n onReceive: Receiver<TEvent>,\n { input }: { input: any }\n) => (() => void) | Promise<any> | void;\n\nexport type ActorBehaviorCreator<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TActorBehavior extends AnyActorBehavior = AnyActorBehavior\n> = (\n context: TContext,\n event: TEvent,\n meta: {\n id: string;\n data?: any;\n src: string;\n _event: SCXML.Event<TEvent>;\n meta: MetaObject | undefined;\n input: any;\n }\n) => TActorBehavior;\n\nexport interface InvokeMeta {\n src: string;\n meta: MetaObject | undefined;\n}\n\nexport interface InvokeDefinition<\n TContext extends MachineContext,\n TEvent extends EventObject\n> {\n id: string;\n\n systemId: string | undefined;\n /**\n * The source of the actor's behavior to be invoked\n */\n src: string;\n\n input?: Mapper<TContext, TEvent, any> | any;\n /**\n * The transition to take upon the invoked child machine reaching its final top-level state.\n */\n onDone?:\n | string\n | SingleOrArray<TransitionConfig<TContext, DoneInvokeEvent<any>>>;\n /**\n * The transition to take upon the invoked child machine sending an error event.\n */\n onError?: string | SingleOrArray<TransitionConfig<TContext, ErrorEvent<any>>>;\n\n onSnapshot?:\n | string\n | SingleOrArray<TransitionConfig<TContext, SnapshotEvent<any>>>;\n\n toJSON: () => Omit<\n InvokeDefinition<TContext, TEvent>,\n 'onDone' | 'onError' | 'toJSON'\n >;\n meta: MetaObject | undefined;\n}\n\nexport interface Delay {\n id: string;\n /**\n * The time to delay the event, in milliseconds.\n */\n delay: number;\n}\n\nexport type DelayedTransitions<\n TContext extends MachineContext,\n TEvent extends EventObject\n> =\n | Record<\n string | number,\n string | SingleOrArray<TransitionConfig<TContext, TEvent>>\n >\n | Array<\n TransitionConfig<TContext, TEvent> & {\n delay: number | string | Expr<TContext, TEvent, number>;\n }\n >;\n\nexport type StateTypes =\n | 'atomic'\n | 'compound'\n | 'parallel'\n | 'final'\n | 'history'\n | string; // TODO: remove once TS fixes this type-widening issue\n\nexport type SingleOrArray<T> = T[] | T;\n\nexport type StateNodesConfig<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = {\n [K in string]: StateNode<TContext, TEvent>;\n};\n\nexport type StatesConfig<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TAction extends ParameterizedObject = ParameterizedObject\n> = {\n [K in string]: StateNodeConfig<TContext, TEvent, TAction>;\n};\n\nexport type StatesDefinition<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = {\n [K in string]: StateNodeDefinition<TContext, TEvent>;\n};\n\nexport type TransitionConfigTarget = string | undefined;\n\nexport type TransitionConfigOrTarget<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject = TExpressionEvent\n> = SingleOrArray<\n TransitionConfigTarget | TransitionConfig<TContext, TExpressionEvent, TEvent>\n>;\n\nexport type TransitionsConfigMap<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = {\n [K in TEvent['type'] | '' | '*']?: K extends '' | '*'\n ? TransitionConfigOrTarget<TContext, TEvent>\n : TransitionConfigOrTarget<TContext, ExtractEvent<TEvent, K>, TEvent>;\n};\n\ntype TransitionsConfigArray<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = Array<\n // distribute the union\n | (TEvent extends EventObject\n ? TransitionConfig<TContext, TEvent> & { event: TEvent['type'] }\n : never)\n | (TransitionConfig<TContext, TEvent> & { event: '*' })\n>;\n\nexport type TransitionsConfig<\n TContext extends MachineContext,\n TEvent extends EventObject\n> =\n | TransitionsConfigMap<TContext, TEvent>\n | TransitionsConfigArray<TContext, TEvent>;\n\nexport interface InvokeConfig<\n TContext extends MachineContext,\n TEvent extends EventObject\n> {\n /**\n * The unique identifier for the invoked machine. If not specified, this\n * will be the machine's own `id`, or the URL (from `src`).\n */\n id?: string;\n\n systemId?: string;\n /**\n * The source of the machine to be invoked, or the machine itself.\n */\n src: string | ActorBehavior<any, any>; // TODO: fix types\n\n input?: Mapper<TContext, TEvent, any> | any;\n /**\n * The transition to take upon the invoked child machine reaching its final top-level state.\n */\n onDone?:\n | string\n | SingleOrArray<\n TransitionConfigOrTarget<TContext, DoneInvokeEvent<any>, TEvent>\n >;\n /**\n * The transition to take upon the invoked child machine sending an error event.\n */\n onError?:\n | string\n | SingleOrArray<\n TransitionConfigOrTarget<TContext, ErrorEvent<any>, TEvent>\n >;\n\n onSnapshot?:\n | string\n | SingleOrArray<\n TransitionConfigOrTarget<TContext, SnapshotEvent<any>, TEvent>\n >;\n /**\n * Meta data related to this invocation\n */\n meta?: MetaObject;\n}\n\nexport interface StateNodeConfig<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TAction extends ParameterizedObject = ParameterizedObject\n> {\n /**\n * The initial state transition.\n */\n initial?:\n | InitialTransitionConfig<TContext, TEvent>\n | SingleOrArray<string>\n | undefined;\n /**\n * The type of this state node:\n *\n * - `'atomic'` - no child state nodes\n * - `'compound'` - nested child state nodes (XOR)\n * - `'parallel'` - orthogonal nested child state nodes (AND)\n * - `'history'` - history state node\n * - `'final'` - final state node\n */\n type?: 'atomic' | 'compound' | 'parallel' | 'final' | 'history';\n /**\n * Indicates whether the state node is a history state node, and what\n * type of history:\n * shallow, deep, true (shallow), false (none), undefined (none)\n */\n history?: 'shallow' | 'deep' | boolean | undefined;\n /**\n * The mapping of state node keys to their state node configurations (recursive).\n */\n states?: StatesConfig<TContext, TEvent, TAction> | undefined;\n /**\n * The services to invoke upon entering this state node. These services will be stopped upon exiting this state node.\n */\n invoke?: SingleOrArray<string | InvokeConfig<TContext, TEvent>>;\n /**\n * The mapping of event types to their potential transition(s).\n */\n on?: TransitionsConfig<TContext, TEvent>;\n /**\n * The action(s) to be executed upon entering the state node.\n */\n entry?: BaseActions<TContext, TEvent, TEvent, TAction>;\n /**\n * The action(s) to be executed upon exiting the state node.\n */\n exit?: BaseActions<TContext, TEvent, TEvent, TAction>;\n /**\n * The potential transition(s) to be taken upon reaching a final child state node.\n *\n * This is equivalent to defining a `[done(id)]` transition on this state node's `on` property.\n */\n onDone?:\n | string\n | SingleOrArray<TransitionConfig<TContext, DoneEventObject>>\n | undefined;\n /**\n * The mapping (or array) of delays (in milliseconds) to their potential transition(s).\n * The delayed transitions are taken after the specified delay in an interpreter.\n */\n after?: DelayedTransitions<TContext, TEvent>;\n\n /**\n * An eventless transition that is always taken when this state node is active.\n */\n always?: TransitionConfigOrTarget<TContext, TEvent>;\n /**\n * @private\n */\n parent?: StateNode<TContext, TEvent>;\n /**\n * The meta data associated with this state node, which will be returned in State instances.\n */\n meta?: any;\n /**\n * The output data sent with the \"done.state._id_\" event if this is a final state node.\n *\n * The output data will be evaluated with the current `context` and placed on the `.data` property\n * of the event.\n */\n output?:\n | Mapper<TContext, TEvent, any>\n | PropertyMapper<TContext, TEvent, any>;\n /**\n * The unique ID of the state node, which can be referenced as a transition target via the\n * `#id` syntax.\n */\n id?: string | undefined;\n /**\n * The string delimiter for serializing the path to a string. The default is \".\"\n */\n delimiter?: string;\n /**\n * The order this state node appears. Corresponds to the implicit SCXML document order.\n */\n order?: number;\n\n /**\n * The tags for this state node, which are accumulated into the `state.tags` property.\n */\n tags?: SingleOrArray<string>;\n /**\n * A text description of the state node\n */\n description?: string;\n\n /**\n * A default target for a history state\n */\n target?: string;\n}\n\nexport interface StateNodeDefinition<\n TContext extends MachineContext,\n TEvent extends EventObject\n> {\n id: string;\n version?: string | undefined;\n key: string;\n type: 'atomic' | 'compound' | 'parallel' | 'final' | 'history';\n initial: InitialTransitionDefinition<TContext, TEvent> | undefined;\n history: boolean | 'shallow' | 'deep' | undefined;\n states: StatesDefinition<TContext, TEvent>;\n on: TransitionDefinitionMap<TContext, TEvent>;\n transitions: Array<TransitionDefinition<TContext, TEvent>>;\n entry: BaseActionObject[];\n exit: BaseActionObject[];\n meta: any;\n order: number;\n output?: FinalStateNodeConfig<TContext, TEvent>['output'];\n invoke: Array<InvokeDefinition<TContext, TEvent>>;\n description?: string;\n tags: string[];\n}\n\nexport interface StateMachineDefinition<\n TContext extends MachineContext,\n TEvent extends EventObject\n> extends StateNodeDefinition<TContext, TEvent> {\n context: TContext;\n}\n\nexport type AnyStateNode = StateNode<any, any>;\n\nexport type AnyStateNodeDefinition = StateNodeDefinition<any, any>;\n\nexport type AnyState = State<any, any, any>;\n\nexport type AnyStateMachine = StateMachine<any, any, any, any, any>;\n\nexport type AnyStateConfig = StateConfig<any, AnyEventObject>;\n\nexport interface AtomicStateNodeConfig<\n TContext extends MachineContext,\n TEvent extends EventObject\n> extends StateNodeConfig<TContext, TEvent> {\n initial?: undefined;\n parallel?: false | undefined;\n states?: undefined;\n onDone?: undefined;\n}\n\nexport interface HistoryStateNodeConfig<\n TContext extends MachineContext,\n TEvent extends EventObject\n> extends AtomicStateNodeConfig<TContext, TEvent> {\n history: 'shallow' | 'deep' | true;\n target: string | undefined;\n}\n\nexport interface FinalStateNodeConfig<\n TContext extends MachineContext,\n TEvent extends EventObject\n> extends AtomicStateNodeConfig<TContext, TEvent> {\n type: 'final';\n /**\n * The data to be sent with the \"done.state.<id>\" event. The data can be\n * static or dynamic (based on assigners).\n */\n output?:\n | Mapper<TContext, TEvent, any>\n | PropertyMapper<TContext, TEvent, any>;\n}\n\nexport type SimpleOrStateNodeConfig<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = AtomicStateNodeConfig<TContext, TEvent> | StateNodeConfig<TContext, TEvent>;\n\nexport type ActionFunctionMap<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TAction extends ParameterizedObject = ParameterizedObject\n> = {\n [K in TAction['type']]?:\n | BaseDynamicActionObject<TContext, TEvent, TEvent, TAction, any>\n | ActionFunction<\n TContext,\n TEvent,\n TAction extends { type: K } ? TAction : never\n >;\n};\n\nexport type DelayFunctionMap<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = Record<string, DelayConfig<TContext, TEvent>>;\n\nexport type DelayConfig<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = number | DelayExpr<TContext, TEvent>;\n\n// TODO: possibly refactor this somehow, use even a simpler type, and maybe even make `machine.options` private or something\nexport interface MachineImplementationsSimplified<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TAction extends ParameterizedObject = ParameterizedObject\n> {\n guards: Record<string, GuardPredicate<TContext, TEvent>>;\n actions: ActionFunctionMap<TContext, TEvent, TAction>;\n actors: Record<\n string,\n | AnyActorBehavior\n | { src: AnyActorBehavior; input: Mapper<TContext, TEvent, any> | any }\n >;\n delays: DelayFunctionMap<TContext, TEvent>;\n}\n\ntype MachineImplementationsActions<\n TContext extends MachineContext,\n TResolvedTypesMeta,\n TEventsCausingActions = Prop<\n Prop<TResolvedTypesMeta, 'resolved'>,\n 'eventsCausingActions'\n >,\n TIndexedEvents = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedEvents'>\n> = {\n [K in keyof TEventsCausingActions]?:\n | BaseDynamicActionObject<\n TContext,\n Cast<Prop<TIndexedEvents, TEventsCausingActions[K]>, EventObject>,\n Cast<Prop<TIndexedEvents, keyof TIndexedEvents>, EventObject>,\n any, // TODO: this should receive something like `Cast<Prop<TIndexedActions, K>, ParameterizedObject>`, but at the moment builtin actions expect Resolved*Action here and this should be simplified somehow\n any\n >\n | ActionFunction<\n TContext,\n Cast<Prop<TIndexedEvents, TEventsCausingActions[K]>, EventObject>,\n ParameterizedObject, // TODO: when bringing back parametrized actions this should accept something like `Cast<Prop<TIndexedActions, K>, ParameterizedObject>`. At the moment we need to keep this type argument consistent with what is provided to the fake callable signature within `BaseDynamicActionObject`\n Cast<Prop<TIndexedEvents, keyof TIndexedEvents>, EventObject>\n >;\n};\n\ntype MachineImplementationsDelays<\n TContext extends MachineContext,\n TResolvedTypesMeta,\n TEventsCausingDelays = Prop<\n Prop<TResolvedTypesMeta, 'resolved'>,\n 'eventsCausingDelays'\n >,\n TIndexedEvents = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedEvents'>\n> = {\n [K in keyof TEventsCausingDelays]?: DelayConfig<\n TContext,\n Cast<Prop<TIndexedEvents, TEventsCausingDelays[K]>, EventObject>\n >;\n};\n\ntype MachineImplementationsGuards<\n TContext extends MachineContext,\n TResolvedTypesMeta,\n TEventsCausingGuards = Prop<\n Prop<TResolvedTypesMeta, 'resolved'>,\n 'eventsCausingGuards'\n >,\n TIndexedEvents = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedEvents'>\n> = {\n [K in keyof TEventsCausingGuards]?: GuardPredicate<\n TContext,\n Cast<Prop<TIndexedEvents, TEventsCausingGuards[K]>, EventObject>\n >;\n};\n\ntype MachineImplementationsActors<\n TContext extends MachineContext,\n TResolvedTypesMeta,\n TEventsCausingActors = Prop<\n Prop<TResolvedTypesMeta, 'resolved'>,\n 'eventsCausingActors'\n >,\n TIndexedEvents = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedEvents'>,\n _TInvokeSrcNameMap = Prop<\n Prop<TResolvedTypesMeta, 'resolved'>,\n 'invokeSrcNameMap'\n >\n> = {\n // TODO: this should require `{ src, input }` for required inputs\n [K in keyof TEventsCausingActors]?:\n | AnyActorBehavior\n | {\n src: AnyActorBehavior;\n input:\n | Mapper<\n TContext,\n Cast<Prop<TIndexedEvents, TEventsCausingActors[K]>, EventObject>,\n any\n >\n | any;\n };\n};\n\ntype MakeKeysRequired<T extends string> = { [K in T]: unknown };\n\ntype MaybeMakeMissingImplementationsRequired<\n TImplementationType,\n TMissingImplementationsForType,\n TRequireMissingImplementations\n> = TRequireMissingImplementations extends true\n ? IsNever<TMissingImplementationsForType> extends true\n ? {}\n : {\n [K in Cast<TImplementationType, string>]: MakeKeysRequired<\n Cast<TMissingImplementationsForType, string>\n >;\n }\n : {};\n\ntype GenerateActionsImplementationsPart<\n TContext extends MachineContext,\n TResolvedTypesMeta,\n TRequireMissingImplementations,\n TMissingImplementations\n> = MaybeMakeMissingImplementationsRequired<\n 'actions',\n Prop<TMissingImplementations, 'actions'>,\n TRequireMissingImplementations\n> & {\n actions?: MachineImplementationsActions<TContext, TResolvedTypesMeta>;\n};\n\ntype GenerateDelaysImplementationsPart<\n TContext extends MachineContext,\n TResolvedTypesMeta,\n TRequireMissingImplementations,\n TMissingImplementations\n> = MaybeMakeMissingImplementationsRequired<\n 'delays',\n Prop<TMissingImplementations, 'delays'>,\n TRequireMissingImplementations\n> & {\n delays?: MachineImplementationsDelays<TContext, TResolvedTypesMeta>;\n};\n\ntype GenerateGuardsImplementationsPart<\n TContext extends MachineContext,\n TResolvedTypesMeta,\n TRequireMissingImplementations,\n TMissingImplementations\n> = MaybeMakeMissingImplementationsRequired<\n 'guards',\n Prop<TMissingImplementations, 'guards'>,\n TRequireMissingImplementations\n> & {\n guards?: MachineImplementationsGuards<TContext, TResolvedTypesMeta>;\n};\n\ntype GenerateActorsImplementationsPart<\n TContext extends MachineContext,\n TResolvedTypesMeta,\n TRequireMissingImplementations,\n TMissingImplementations\n> = MaybeMakeMissingImplementationsRequired<\n 'actors',\n Prop<TMissingImplementations, 'actors'>,\n TRequireMissingImplementations\n> & {\n actors?: MachineImplementationsActors<TContext, TResolvedTypesMeta>;\n};\n\nexport type InternalMachineImplementations<\n TContext extends MachineContext,\n _TEvent extends EventObject,\n TResolvedTypesMeta,\n TRequireMissingImplementations extends boolean = false,\n TMissingImplementations = Prop<\n Prop<TResolvedTypesMeta, 'resolved'>,\n 'missingImplementations'\n >\n> = GenerateActionsImplementationsPart<\n TContext,\n TResolvedTypesMeta,\n TRequireMissingImplementations,\n TMissingImplementations\n> &\n GenerateDelaysImplementationsPart<\n TContext,\n TResolvedTypesMeta,\n TRequireMissingImplementations,\n TMissingImplementations\n > &\n GenerateGuardsImplementationsPart<\n TContext,\n TResolvedTypesMeta,\n TRequireMissingImplementations,\n TMissingImplementations\n > &\n GenerateActorsImplementationsPart<\n TContext,\n TResolvedTypesMeta,\n TRequireMissingImplementations,\n TMissingImplementations\n >;\n\nexport type MachineImplementations<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TAction extends ParameterizedObject = ParameterizedObject,\n TActorMap extends ActorMap = ActorMap,\n TTypesMeta extends TypegenConstraint = TypegenDisabled\n> = InternalMachineImplementations<\n TContext,\n TEvent,\n ResolveTypegenMeta<TTypesMeta, TEvent, TAction, TActorMap>\n>;\n\ntype InitialContext<TContext extends MachineContext> =\n | TContext\n | ContextFactory<TContext>;\n\nexport type ContextFactory<TContext extends MachineContext> = ({\n spawn,\n input\n}: {\n spawn: Spawner;\n input: any; // TODO: fix\n}) => TContext;\n\nexport interface MachineConfig<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TAction extends ParameterizedObject = ParameterizedObject,\n TActorMap extends ActorMap = ActorMap,\n TTypesMeta = TypegenDisabled\n> extends StateNodeConfig<NoInfer<TContext>, NoInfer<TEvent>, TAction> {\n /**\n * The initial context (extended state)\n */\n context?: InitialContext<LowInfer<TContext>>;\n /**\n * The machine's own version.\n */\n version?: string;\n /**\n * If `true`, will use SCXML semantics, such as event token matching.\n */\n scxml?: boolean;\n schema?: MachineSchema<TContext, TEvent, TActorMap>;\n tsTypes?: TTypesMeta;\n}\n\nexport type ActorMap = Record<string, { output: any }>;\nexport interface MachineSchema<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TActorMap extends ActorMap = ActorMap\n> {\n context?: TContext;\n actions?: { type: string; [key: string]: any };\n actors?: TActorMap;\n events?: TEvent;\n guards?: { type: string; [key: string]: any };\n}\n\nexport interface HistoryStateNode<TContext extends MachineContext>\n extends StateNode<TContext> {\n history: 'shallow' | 'deep';\n target: string | undefined;\n}\n\nexport type HistoryValue<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = Record<string, Array<StateNode<TContext, TEvent>>>;\n\nexport type AnyHistoryValue = HistoryValue<any, any>;\n\nexport type StateFrom<\n T extends AnyStateMachine | ((...args: any[]) => AnyStateMachine)\n> = T extends AnyStateMachine\n ? ReturnType<T['transition']>\n : T extends (...args: any[]) => AnyStateMachine\n ? ReturnType<ReturnType<T>['transition']>\n : never;\n\nexport type Transitions<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = Array<TransitionDefinition<TContext, TEvent>>;\n\nexport enum ActionTypes {\n Stop = 'xstate.stop',\n Raise = 'xstate.raise',\n Send = 'xstate.send',\n Cancel = 'xstate.cancel',\n Assign = 'xstate.assign',\n After = 'xstate.after',\n DoneState = 'done.state',\n DoneInvoke = 'done.invoke',\n Log = 'xstate.log',\n Init = 'xstate.init',\n Invoke = 'xstate.invoke',\n ErrorExecution = 'error.execution',\n ErrorCommunication = 'error.communication',\n ErrorPlatform = 'error.platform',\n ErrorCustom = 'xstate.error',\n Pure = 'xstate.pure',\n Choose = 'xstate.choose'\n}\n\nexport interface RaiseActionObject<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject = TExpressionEvent\n> extends BaseActionObject {\n type: ActionTypes.Raise;\n params: {\n event: TEvent;\n _event: SCXML.Event<TEvent>;\n delay: RaiseActionOptions<TContext, TExpressionEvent>['delay'];\n id: string | number;\n };\n}\n\nexport interface DoneInvokeEvent<TData> extends EventObject {\n type: `done.invoke.${string}`;\n output: TData;\n}\n\nexport interface ErrorEvent<TErrorData> {\n type: `error.${string}`;\n data: TErrorData;\n}\n\nexport interface SnapshotEvent<TData> {\n type: `xstate.snapshot.${string}`;\n data: TData;\n}\n\nexport interface ErrorExecutionEvent extends EventObject {\n src: string;\n type: ActionTypes.ErrorExecution;\n data: any;\n}\n\nexport interface ErrorPlatformEvent extends EventObject {\n data: any;\n}\n\nexport interface SCXMLErrorEvent extends SCXML.Event<any> {\n name:\n | ActionTypes.ErrorExecution\n | ActionTypes.ErrorPlatform\n | ActionTypes.ErrorCommunication;\n data: any;\n}\n\nexport interface DoneEventObject extends EventObject {\n output?: any;\n toString(): string;\n}\n\nexport type DoneEvent = DoneEventObject & string;\n\nexport interface InvokeAction {\n type: ActionTypes.Invoke;\n src: string | ActorRef<any>;\n id: string;\n exec?: undefined;\n meta: MetaObject | undefined;\n}\n\nexport interface DynamicInvokeActionObject<\n TContext extends MachineContext,\n TEvent extends EventObject\n> {\n type: ActionTypes.Invoke;\n params: InvokeDefinition<TContext, TEvent>;\n}\n\nexport interface InvokeActionObject extends BaseActionObject {\n type: ActionTypes.Invoke;\n params: {\n src: string | ActorRef<any>;\n id: string;\n exec?: undefined;\n ref?: ActorRef<any>;\n meta: MetaObject | undefined;\n };\n}\n\nexport interface DynamicStopActionObject<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject\n> {\n type: ActionTypes.Stop;\n params: {\n actor:\n | string\n | ActorRef<any>\n | Expr<TContext, TExpressionEvent, ActorRef<any> | string>;\n };\n}\n\nexport interface StopActionObject {\n type: ActionTypes.Stop;\n params: {\n actor: ActorRef<any>;\n };\n}\n\nexport type DelayExpr<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = ExprWithMeta<TContext, TEvent, number>;\n\nexport type LogExpr<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = ExprWithMeta<TContext, TEvent, any>;\n\nexport interface DynamicLogAction<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject\n> extends BaseDynamicActionObject<\n TContext,\n TExpressionEvent,\n TEvent,\n LogActionObject,\n {\n label: string | undefined;\n expr: string | LogExpr<TContext, TExpressionEvent>;\n }\n > {\n type: ActionTypes.Log;\n}\n\nexport interface LogActionObject extends BuiltInActionObject {\n type: ActionTypes.Log;\n params: {\n label: string | undefined;\n value: any;\n };\n}\n\nexport interface SendActionObject<\n TSentEvent extends EventObject = AnyEventObject\n> extends BaseActionObject {\n type: 'xstate.send';\n params: {\n to: ActorRef<TSentEvent> | undefined;\n _event: SCXML.Event<TSentEvent>;\n event: TSentEvent;\n delay?: number;\n id: string | number;\n internal: boolean;\n };\n}\n\nexport type Expr<\n TContext extends MachineContext,\n TEvent extends EventObject,\n T\n> = (arg: UnifiedArg<TContext, TEvent>) => T;\n\nexport type ExprWithMeta<\n TContext extends MachineContext,\n TEvent extends EventObject,\n T\n> = (args: UnifiedArg<TContext, TEvent> & StateMeta<TEvent>) => T;\n\nexport type SendExpr<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TSentEvent extends EventObject = AnyEventObject\n> = ExprWithMeta<TContext, TEvent, TSentEvent>;\n\nexport enum SpecialTargets {\n Parent = '#_parent',\n Internal = '#_internal'\n}\n\nexport interface SendActionOptions<\n TContext extends MachineContext,\n TEvent extends EventObject\n> extends RaiseActionOptions<TContext, TEvent> {\n to?:\n | string\n | ActorRef<any, any>\n | ExprWithMeta<TContext, TEvent, string | ActorRef<any, any>>;\n}\n\nexport interface RaiseActionOptions<\n TContext extends MachineContext,\n TEvent extends EventObject\n> {\n id?: string | number;\n delay?: number | string | DelayExpr<TContext, TEvent>;\n}\n\nexport interface RaiseActionParams<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject\n> extends RaiseActionOptions<TContext, TExpressionEvent> {\n event: TEvent | SendExpr<TContext, TExpressionEvent, TEvent>;\n}\n\nexport interface SendActionParams<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TSentEvent extends EventObject = EventObject\n> extends SendActionOptions<TContext, TEvent> {\n event: TSentEvent | SendExpr<TContext, TEvent, TSentEvent>;\n}\n\nexport interface DynamicCancelActionObject<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject\n> {\n type: ActionTypes.Cancel;\n params: {\n sendId: string | ExprWithMeta<TContext, TExpressionEvent, string>;\n };\n}\n\nexport interface CancelActionObject extends BaseActionObject {\n type: ActionTypes.Cancel;\n params: {\n sendId: string;\n };\n}\n\nexport type Assigner<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject = TExpressionEvent\n> = (\n args: {\n context: TContext;\n event: TExpressionEvent;\n } & AssignMeta<TExpressionEvent, TEvent>\n) => Partial<TContext>;\n\nexport type PartialAssigner<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject,\n TKey extends keyof TContext\n> = (\n args: {\n context: TContext;\n event: TExpressionEvent;\n } & AssignMeta<TExpressionEvent, TEvent>\n) => TContext[TKey];\n\nexport type PropertyAssigner<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject = TExpressionEvent\n> = {\n [K in keyof TContext]?:\n | PartialAssigner<TContext, TExpressionEvent, TEvent, K>\n | TContext[K];\n};\n\nexport type Mapper<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TParams extends {}\n> = (args: { context: TContext; event: TEvent }) => TParams;\n\nexport type PropertyMapper<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TParams extends {}\n> = {\n [K in keyof TParams]?:\n | ((args: { context: TContext; event: TEvent }) => TParams[K])\n | TParams[K];\n};\n\nexport interface AnyAssignAction extends BaseActionObject {\n type: ActionTypes.Assign;\n assignment: any;\n}\n\nexport type DynamicAssignAction<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject = TExpressionEvent\n> = BaseDynamicActionObject<\n TContext,\n TExpressionEvent,\n TEvent,\n AssignActionObject<TContext> | RaiseActionObject<TContext, TExpressionEvent>,\n {\n assignment:\n | Assigner<TContext, TExpressionEvent, TEvent>\n | PropertyAssigner<TContext, TExpressionEvent, TEvent>;\n }\n>;\n\nexport interface AssignActionObject<TContext extends MachineContext>\n extends BaseActionObject {\n type: ActionTypes.Assign;\n params: {\n context: TContext;\n actions: BaseActionObject[];\n };\n}\n\nexport interface DynamicPureActionObject<\n TContext extends MachineContext,\n TEvent extends EventObject\n> {\n type: ActionTypes.Pure;\n params: {\n get: (args: {\n context: TContext;\n event: TEvent;\n }) =>\n | SingleOrArray<BaseActionObject | BaseActionObject['type']>\n | undefined;\n };\n}\n\nexport interface PureActionObject extends BaseActionObject {\n type: ActionTypes.Pure;\n params: {\n actions: BaseActionObject[];\n };\n}\n\nexport interface ChooseAction<\n TContext extends MachineContext,\n TEvent extends EventObject\n> extends BaseActionObject {\n type: ActionTypes.Choose;\n params: {\n guards: Array<ChooseCondition<TContext, TEvent>>;\n };\n}\n\nexport interface ResolvedChooseAction extends BaseActionObject {\n type: ActionTypes.Choose;\n params: {\n actions: BaseActionObject[];\n };\n}\n\nexport interface TransitionDefinition<\n TContext extends MachineContext,\n TEvent extends EventObject\n> extends Omit<TransitionConfig<TContext, TEvent>, 'target'> {\n target: Array<StateNode<TContext, TEvent>> | undefined;\n source: StateNode<TContext, TEvent>;\n actions: BaseActionObject[];\n external: boolean;\n guard?: GuardDefinition<TContext, TEvent>;\n eventType: TEvent['type'] | '*';\n toJSON: () => {\n target: string[] | undefined;\n source: string;\n actions: BaseActionObject[];\n guard?: GuardDefinition<TContext, TEvent>;\n eventType: TEvent['type'] | '*';\n meta?: Record<string, any>;\n };\n}\n\nexport type AnyTransitionDefinition = TransitionDefinition<any, any>;\n\nexport interface InitialTransitionDefinition<\n TContext extends MachineContext,\n TEvent extends EventObject\n> extends TransitionDefinition<TContext, TEvent> {\n target: Array<StateNode<TContext, TEvent>>;\n guard?: never;\n}\n\nexport type TransitionDefinitionMap<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = {\n [K in TEvent['type'] | '*']: Array<\n TransitionDefinition<\n TContext,\n K extends TEvent['type'] ? Extract<TEvent, { type: K }> : EventObject\n >\n >;\n};\n\nexport interface DelayedTransitionDefinition<\n TContext extends MachineContext,\n TEvent extends EventObject\n> extends TransitionDefinition<TContext, TEvent> {\n delay: number | string | DelayExpr<TContext, TEvent>;\n}\n\nexport interface Edge<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TEventType extends TEvent['type'] = string\n> {\n event: TEventType;\n source: StateNode<TContext, TEvent>;\n target: StateNode<TContext, TEvent>;\n cond?: GuardConfig<TContext, TEvent & { type: TEventType }>;\n actions: Array<Action<TContext, TEvent>>;\n meta?: MetaObject;\n transition: TransitionDefinition<TContext, TEvent>;\n}\nexport interface NodesAndEdges<\n TContext extends MachineContext,\n TEvent extends EventObject\n> {\n nodes: StateNode[];\n edges: Array<Edge<TContext, TEvent, TEvent['type']>>;\n}\n\nexport interface Segment<\n TContext extends MachineContext,\n TEvent extends EventObject\n> {\n /**\n * From state.\n */\n state: State<TContext, TEvent>;\n /**\n * Event from state.\n */\n event: TEvent;\n}\n\nexport interface StateMeta<TEvent extends EventObject> {\n _event: SCXML.Event<TEvent>;\n self: ActorRef<TEvent>;\n system: ActorSystem<any>;\n}\n\nexport interface StateLike<TContext extends MachineContext> {\n value: StateValue;\n context: TContext;\n event: EventObject;\n _event: SCXML.Event<EventObject>;\n}\n\nexport interface StateConfig<\n TContext extends MachineContext,\n TEvent extends EventObject\n> {\n value: StateValue;\n context: TContext;\n _event: SCXML.Event<TEvent>;\n historyValue?: HistoryValue<TContext, TEvent>;\n actions?: BaseActionObject[];\n meta?: any;\n configuration?: Array<StateNode<TContext, TEvent>>;\n transitions?: Array<TransitionDefinition<TContext, TEvent>>;\n children: Record<string, ActorRef<any>>;\n done?: boolean;\n output?: any;\n tags?: Set<string>;\n machine?: StateMachine<TContext, TEvent, any, any, any>;\n _internalQueue?: Array<SCXML.Event<TEvent>>;\n}\n\nexport interface InterpreterOptions<_TActorBehavior extends AnyActorBehavior> {\n /**\n * Whether state actions should be executed immediately upon transition. Defaults to `true`.\n */\n execute?: boolean;\n clock?: Clock;\n logger?: (...args: any[]) => void;\n parent?: ActorRef<any>;\n /**\n * If `true`, defers processing of sent events until the service\n * is initialized (`.start()`). Otherwise, an error will be thrown\n * for events sent to an uninitialized service.\n *\n * Default: `true`\n */\n deferEvents?: boolean;\n /**\n * The custom `id` for referencing this service.\n */\n id?: string;\n /**\n * If `true`, states and events will be logged to Redux DevTools.\n *\n * Default: `false`\n */\n devTools?: boolean | DevToolsAdapter; // TODO: add enhancer options\n\n sync?: boolean;\n\n /**\n * The system ID to register this actor under\n */\n systemId?: string;\n /**\n * The input data to pass to the actor.\n */\n input?: any;\n\n // state?:\n // | PersistedStateFrom<TActorBehavior>\n // | InternalStateFrom<TActorBehavior>;\n state?: any;\n\n /**\n * The source definition.\n */\n src?: string;\n}\n\nexport type AnyInterpreter = Interpreter<any>;\n\nexport declare namespace SCXML {\n // tslint:disable-next-line:no-shadowed-variable\n export interface Event<TEvent extends EventObject> {\n /**\n * This is a character string giving the name of the event.\n * The SCXML Processor must set the name field to the name of this event.\n * It is what is matched against the 'event' attribute of <transition>.\n * Note that transitions can do additional tests by using the value of this field\n * inside boolean expressions in the 'cond' attribute.\n */\n name: string;\n /**\n * This field describes the event type.\n * The SCXML Processor must set it to: \"platform\" (for events raised by the platform itself, such as error events),\n * \"internal\" (for events raised by <raise> and <send> with target '_internal')\n * or \"external\" (for all other events).\n */\n type: 'platform' | 'internal' | 'external';\n /**\n * If the sending entity has specified a value for this, the Processor must set this field to that value\n * (see C Event I/O Processors for details).\n * Otherwise, in the case of error events triggered by a failed attempt to send an event,\n * the Processor must set this field to the send id of the triggering <send> element.\n * Otherwise it must leave it blank.\n */\n sendid?: string;\n /**\n * This is a URI, equivalent to the 'target' attribute on the <send> element.\n * For external events, the SCXML Processor should set this field to a value which,\n * when used as the value of 'target', will allow the receiver of the event to <send>\n * a response back to the originating entity via the Event I/O Processor specified in 'origintype'.\n * For internal and platform events, the Processor must leave this field blank.\n */\n origin?: ActorRef<any>;\n /**\n * This is equivalent to the 'type' field on the <send> element.\n * For external events, the SCXML Processor should set this field to a value which,\n * when used as the value of 'type', will allow the receiver of the event to <send>\n * a response back to the originating entity at the URI specified by 'origin'.\n * For internal and platform events, the Processor must leave this field blank.\n */\n origintype?: string;\n /**\n * If this event is generated from an invoked child process, the SCXML Processor\n * must set this field to the invoke id of the invocation that triggered the child process.\n * Otherwise it must leave it blank.\n */\n invokeid?: string;\n /**\n * This field contains whatever data the sending entity chose to include in this event.\n * The receiving SCXML Processor should reformat this data to match its data model,\n * but must not otherwise modify it.\n *\n * If the conversion is not possible, the Processor must leave the field blank\n * and must place an error 'error.execution' in the internal event queue.\n */\n data: TEvent;\n /**\n * @private\n */\n $$type: 'scxml';\n }\n}\n\n// Based on RxJS types\nexport type Observer<T> = {\n next?: (value: T) => void;\n error?: (err: any) => void;\n complete?: () => void;\n};\n\nexport interface Subscription {\n unsubscribe(): void;\n}\n\nexport interface InteropObservable<T> {\n [Symbol.observable]: () => InteropSubscribable<T>;\n}\n\nexport interface InteropSubscribable<T> {\n subscribe(observer: Observer<T>): Subscription;\n}\n\nexport interface Subscribable<T> extends InteropSubscribable<T> {\n subscribe(observer: Observer<T>): Subscription;\n subscribe(\n next: (value: T) => void,\n error?: (error: any) => void,\n complete?: () => void\n ): Subscription;\n}\n\n// TODO: should only take in behaviors\nexport type Spawnable =\n | AnyStateMachine\n | PromiseLike<any>\n | InvokeCallback\n | InteropObservable<any>\n | Subscribable<any>\n | ActorBehavior<any, any>;\n\nexport type ExtractEvent<\n TEvent extends EventObject,\n TEventType extends TEvent['type']\n> = TEvent extends any\n ? TEventType extends TEvent['type']\n ? TEvent\n : never\n : never;\n\nexport interface BaseActorRef<TEvent extends EventObject> {\n send: (event: TEvent) => void;\n}\n\nexport interface ActorLike<TCurrent, TEvent extends EventObject>\n extends Subscribable<TCurrent> {\n send: (event: TEvent) => void;\n}\n\nexport interface ActorRef<TEvent extends EventObject, TSnapshot = any>\n extends Subscribable<TSnapshot>,\n InteropObservable<TSnapshot> {\n /**\n * The unique identifier for this actor relative to its parent.\n */\n id: string;\n sessionId: string;\n send: (event: TEvent) => void;\n // TODO: should this be optional?\n start?: () => void;\n getSnapshot: () => TSnapshot | undefined;\n // TODO: this should return some sort of TPersistedState, not any\n getPersistedState?: () => any;\n stop: () => void;\n toJSON?: () => any;\n // TODO: figure out how to hide this externally as `sendTo(ctx => ctx.actorRef._parent._parent._parent._parent)` shouldn't be allowed\n _parent?: ActorRef<any, any>;\n system?: ActorSystem<any>;\n status: ActorStatus;\n src?: string;\n}\n\nexport type AnyActorRef = ActorRef<any, any>;\n\nexport type ActorRefFrom<T> = ReturnTypeOrValue<T> extends infer R\n ? R extends StateMachine<\n infer TContext,\n infer TEvent,\n any,\n any,\n infer TResolvedTypesMeta\n >\n ? ActorRef<\n TEvent,\n State<\n TContext,\n TEvent,\n AreAllImplementationsAssumedToBeProvided<TResolvedTypesMeta> extends false\n ? MarkAllImplementationsAsProvided<TResolvedTypesMeta>\n : TResolvedTypesMeta\n >\n >\n : R extends Promise<infer U>\n ? ActorRef<{ type: string }, U | undefined>\n : R extends ActorBehavior<infer TEvent, infer TSnapshot>\n ? ActorRef<TEvent, TSnapshot>\n : never\n : never;\n\nexport type DevToolsAdapter = (service: AnyInterpreter) => void;\n\nexport type InterpreterFrom<\n T extends AnyStateMachine | ((...args: any[]) => AnyStateMachine)\n> = ReturnTypeOrValue<T> extends StateMachine<\n infer TContext,\n infer TEvent,\n any,\n any,\n infer TResolvedTypesMeta\n>\n ? Interpreter<\n ActorBehavior<\n TEvent,\n State<TContext, TEvent, TResolvedTypesMeta>,\n State<TContext, TEvent, TResolvedTypesMeta>,\n PersistedMachineState<State<TContext, TEvent, TResolvedTypesMeta>>\n >\n >\n : never;\n\nexport type MachineImplementationsFrom<\n T extends AnyStateMachine | ((...args: any[]) => AnyStateMachine),\n TRequireMissingImplementations extends boolean = false\n> = ReturnTypeOrValue<T> extends StateMachine<\n infer TContext,\n infer TEvent,\n any,\n any,\n infer TResolvedTypesMeta\n>\n ? InternalMachineImplementations<\n TContext,\n TEvent,\n TResolvedTypesMeta,\n TRequireMissingImplementations\n >\n : never;\n\n// only meant to be used internally for debugging purposes\nexport type __ResolvedTypesMetaFrom<T> = T extends StateMachine<\n any,\n any,\n any,\n infer TResolvedTypesMeta\n>\n ? TResolvedTypesMeta\n : never;\n\nexport type EventOfMachine<TMachine extends AnyStateMachine> =\n TMachine extends StateMachine<any, infer E, any, any, any> ? E : never;\n\nexport interface ActorContext<\n TEvent extends EventObject,\n TSnapshot,\n TSystem extends ActorSystem<any> = ActorSystem<any>\n> {\n self: ActorRef<TEvent, TSnapshot>;\n id: string;\n sessionId: string;\n logger: (...args: any[]) => void;\n defer: (fn: () => void) => void;\n system: TSystem;\n stopChild: (child: AnyActorRef) => void;\n}\n\nexport type AnyActorContext = ActorContext<any, any, any>;\n\nexport interface ActorBehavior<\n TEvent extends EventObject,\n TSnapshot = any,\n TInternalState = any,\n /**\n * Serialized internal state used for persistence & restoration\n */\n TPersisted = TInternalState,\n TSystem extends ActorSystem<any> = ActorSystem<any>\n> {\n transition: (\n state: TInternalState,\n message: TEvent | LifecycleSignal,\n ctx: ActorContext<TEvent, TSnapshot, TSystem>\n ) => TInternalState;\n getInitialState: (\n actorCtx: ActorContext<TEvent, TSnapshot, any>,\n input: any\n ) => TInternalState;\n restoreState?: (\n persistedState: TPersisted,\n actorCtx: ActorContext<TEvent, TSnapshot>\n ) => TInternalState;\n getSnapshot?: (state: TInternalState) => TSnapshot;\n getStatus?: (state: TInternalState) => { status: string; data?: any };\n start?: (\n state: TInternalState,\n actorCtx: ActorContext<TEvent, TSnapshot>\n ) => void;\n /**\n * @returns Persisted state\n */\n getPersistedState?: (state: TInternalState) => TPersisted;\n}\n\nexport type AnyActorBehavior = ActorBehavior<any, any, any, any>;\n\nexport type SnapshotFrom<T> = ReturnTypeOrValue<T> extends infer R\n ? R extends ActorRef<infer _, infer TSnapshot>\n ? TSnapshot\n : R extends Interpreter<infer TBehavior>\n ? SnapshotFrom<TBehavior>\n : R extends ActorBehavior<infer _, infer TSnapshot>\n ? TSnapshot\n : R extends ActorContext<infer _, infer TSnapshot, infer __>\n ? TSnapshot\n : never\n : never;\n\nexport type EventFromBehavior<TBehavior extends ActorBehavior<any, any>> =\n TBehavior extends ActorBehavior<infer TEvent, infer _> ? TEvent : never;\n\nexport type PersistedStateFrom<TBehavior extends ActorBehavior<any, any>> =\n TBehavior extends ActorBehavior<\n infer _TEvent,\n infer _TSnapshot,\n infer _TInternalState,\n infer TPersisted\n >\n ? TPersisted\n : never;\n\nexport type InternalStateFrom<TBehavior extends ActorBehavior<any, any>> =\n TBehavior extends ActorBehavior<\n infer _TEvent,\n infer _TSnapshot,\n infer TInternalState,\n infer _TPersisted\n >\n ? TInternalState\n : never;\n\ntype ResolveEventType<T> = ReturnTypeOrValue<T> extends infer R\n ? R extends StateMachine<\n infer _,\n infer TEvent,\n infer __,\n infer ___,\n infer ____\n >\n ? TEvent\n : R extends State<infer _, infer TEvent, infer __>\n ? TEvent\n : // TODO: the special case for Interpreter shouldn't be needed here as it implements ActorRef\n // however to drop it we'd have to remove ` | SCXML.Event<TEvent>` from its `send`'s accepted parameter\n R extends Interpreter<infer _, infer TEvent>\n ? TEvent\n : R extends ActorRef<infer TEvent, infer _>\n ? TEvent\n : never\n : never;\n\nexport type EventFrom<\n T,\n K extends Prop<TEvent, 'type'> = never,\n TEvent extends EventObject = ResolveEventType<T>\n> = IsNever<K> extends true ? TEvent : ExtractEvent<TEvent, K>;\n\nexport type ContextFrom<T> = ReturnTypeOrValue<T> extends infer R\n ? R extends StateMachine<\n infer TContext,\n infer _,\n infer __,\n infer ___,\n infer ____\n >\n ? TContext\n : R extends State<infer TContext, infer _, infer __>\n ? TContext\n : R extends Interpreter<infer TBehavior>\n ? TBehavior extends StateMachine<infer TContext, infer _>\n ? TContext\n : never\n : never\n : never;\n\nexport type InferEvent<E extends EventObject> = {\n [T in E['type']]: { type: T } & Extract<E, { type: T }>;\n}[E['type']];\n\nexport type TODO = any;\n\nexport type StateValueFrom<TMachine extends AnyStateMachine> = Parameters<\n StateFrom<TMachine>['matches']\n>[0];\n\nexport type StateFromMachine<TMachine extends AnyStateMachine> =\n TMachine['initialState'];\n\nexport interface ActorSystemInfo {\n actors: Record<string, AnyActorRef>;\n}\n\nexport interface ActorSystem<T extends ActorSystemInfo> {\n _bookId: () => string;\n _register: (sessionId: string, actorRef: AnyActorRef) => string;\n _unregister: (actorRef: AnyActorRef) => void;\n _set: <K extends keyof T['actors']>(key: K, actorRef: T['actors'][K]) => void;\n get: <K extends keyof T['actors']>(key: K) => T['actors'][K] | undefined;\n}\nexport type PersistedMachineState<TState extends AnyState> = Pick<\n TState,\n 'value' | 'output' | 'context' | '_event' | 'done' | 'historyValue'\n> & {\n children: {\n [K in keyof TState['children']]: {\n state: any; // TODO: fix (should be state from actorref)\n src?: string;\n };\n };\n};\n","import { ActionTypes } from './types.ts';\n\n// xstate-specific action types\nexport const stop = ActionTypes.Stop;\nexport const raise = ActionTypes.Raise;\nexport const send = ActionTypes.Send;\nexport const cancel = ActionTypes.Cancel;\nexport const assign = ActionTypes.Assign;\nexport const after = ActionTypes.After;\nexport const doneState = ActionTypes.DoneState;\nexport const log = ActionTypes.Log;\nexport const init = ActionTypes.Init;\nexport const invoke = ActionTypes.Invoke;\nexport const errorExecution = ActionTypes.ErrorExecution;\nexport const errorPlatform = ActionTypes.ErrorPlatform;\nexport const error = ActionTypes.ErrorCustom;\nexport const choose = ActionTypes.Choose;\nexport const pure = ActionTypes.Pure;\n","import { AnyActorBehavior, AnyState } from './index.ts';\nimport { errorExecution, errorPlatform } from './actionTypes.ts';\nimport { NULL_EVENT, STATE_DELIMITER, TARGETLESS_KEY } from './constants.ts';\nimport { IS_PRODUCTION } from './environment.ts';\nimport type { StateNode } from './StateNode.ts';\nimport type {\n ActorBehavior,\n EventObject,\n EventType,\n InvokeConfig,\n MachineContext,\n Mapper,\n Observer,\n PropertyMapper,\n SCXML,\n SCXMLErrorEvent,\n SingleOrArray,\n StateLike,\n StateValue,\n Subscribable,\n TransitionConfig,\n TransitionConfigTarget\n} from './types.ts';\n\nexport function keys<T extends object>(value: T): Array<keyof T & string> {\n return Object.keys(value) as Array<keyof T & string>;\n}\n\nexport function matchesState(\n parentStateId: StateValue,\n childStateId: StateValue,\n delimiter: string = STATE_DELIMITER\n): boolean {\n const parentStateValue = toStateValue(parentStateId, delimiter);\n const childStateValue = toStateValue(childStateId, delimiter);\n\n if (isString(childStateValue)) {\n if (isString(parentStateValue)) {\n return childStateValue === parentStateValue;\n }\n\n // Parent more specific than child\n return false;\n }\n\n if (isString(parentStateValue)) {\n return parentStateValue in childStateValue;\n }\n\n return Object.keys(parentStateValue).every((key) => {\n if (!(key in childStateValue)) {\n return false;\n }\n\n return matchesState(parentStateValue[key], childStateValue[key]);\n });\n}\n\nexport function toStatePath(\n stateId: string | string[],\n delimiter: string\n): string[] {\n try {\n if (isArray(stateId)) {\n return stateId;\n }\n\n return stateId.toString().split(delimiter);\n } catch (e) {\n throw new Error(`'${stateId}' is not a valid state path.`);\n }\n}\n\nexport function isStateLike(state: any): state is AnyState {\n return (\n typeof state === 'object' &&\n 'value' in state &&\n 'context' in state &&\n 'event' in state &&\n '_event' in state\n );\n}\n\nexport function toStateValue(\n stateValue: StateLike<any> | StateValue | string[],\n delimiter: string\n): StateValue {\n if (isStateLike(stateValue)) {\n return stateValue.value;\n }\n\n if (isArray(stateValue)) {\n return pathToStateValue(stateValue);\n }\n\n if (typeof stateValue !== 'string') {\n return stateValue as StateValue;\n }\n\n const statePath = toStatePath(stateValue as string, delimiter);\n\n return pathToStateValue(statePath);\n}\n\nexport function pathToStateValue(statePath: string[]): StateValue {\n if (statePath.length === 1) {\n return statePath[0];\n }\n\n const value = {};\n let marker = value;\n\n for (let i = 0; i < statePath.length - 1; i++) {\n if (i === statePath.length - 2) {\n marker[statePath[i]] = statePath[i + 1];\n } else {\n marker[statePath[i]] = {};\n marker = marker[statePath[i]];\n }\n }\n\n return value;\n}\n\nexport function mapValues<P, O extends Record<string, unknown>>(\n collection: O,\n iteratee: (item: O[keyof O], key: keyof O, collection: O, i: number) => P\n): { [key in keyof O]: P };\nexport function mapValues(\n collection: Record<string, unknown>,\n iteratee: (\n item: unknown,\n key: string,\n collection: Record<string, unknown>,\n i: number\n ) => unknown\n) {\n const result: Record<string, unknown> = {};\n\n const collectionKeys = Object.keys(collection);\n for (let i = 0; i < collectionKeys.length; i++) {\n const key = collectionKeys[i];\n result[key] = iteratee(collection[key], key, collection, i);\n }\n\n return result;\n}\n\nexport function mapFilterValues<T, P>(\n collection: { [key: string]: T },\n iteratee: (item: T, key: string, collection: { [key: string]: T }) => P,\n predicate: (item: T) => boolean\n): { [key: string]: P } {\n const result: { [key: string]: P } = {};\n\n for (const key of Object.keys(collection)) {\n const item = collection[key];\n\n if (!predicate(item)) {\n continue;\n }\n\n result[key] = iteratee(item, key, collection);\n }\n\n return result;\n}\n\n/**\n * Retrieves a value at the given path.\n * @param props The deep path to the prop of the desired value\n */\nexport function path<T extends Record<string, any>>(props: string[]): any {\n return (object: T): any => {\n let result: T = object;\n\n for (const prop of props) {\n result = result[prop as keyof typeof result];\n }\n\n return result;\n };\n}\n\nexport function toStatePaths(stateValue: StateValue | undefined): string[][] {\n if (!stateValue) {\n return [[]];\n }\n\n if (isString(stateValue)) {\n return [[stateValue]];\n }\n\n const result = flatten(\n Object.keys(stateValue).map((key) => {\n const subStateValue = stateValue[key];\n\n if (\n typeof subStateValue !== 'string' &&\n (!subStateValue || !Object.keys(subStateValue).length)\n ) {\n return [[key]];\n }\n\n return toStatePaths(stateValue[key]).map((subPath) => {\n return [key].concat(subPath);\n });\n })\n );\n\n return result;\n}\n\nexport function flatten<T>(array: Array<T | T[]>): T[] {\n return ([] as T[]).concat(...array);\n}\n\nexport function toArrayStrict<T>(value: T[] | T): T[] {\n if (isArray(value)) {\n return value;\n }\n return [value];\n}\n\nexport function toArray<T>(value: T[] | T | undefined): T[] {\n if (value === undefined) {\n return [];\n }\n return toArrayStrict(value);\n}\n\nexport function mapContext<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n mapper: Mapper<TContext, TEvent, any> | PropertyMapper<TContext, TEvent, any>,\n context: TContext,\n _event: SCXML.Event<TEvent>\n): any {\n if (isFunction(mapper)) {\n return mapper({ context, event: _event.data });\n }\n\n const result = {} as any;\n const args = { context, event: _event.data };\n\n for (const key of Object.keys(mapper)) {\n const subMapper = mapper[key];\n\n if (isFunction(subMapper)) {\n result[key] = subMapper(args);\n } else {\n result[key] = subMapper;\n }\n }\n\n return result;\n}\n\nexport function isBuiltInEvent(eventType: EventType): boolean {\n return /^(done|error)\\./.test(eventType);\n}\n\nexport function isPromiseLike(value: any): value is PromiseLike<any> {\n if (value instanceof Promise) {\n return true;\n }\n // Check if shape matches the Promise/A+ specification for a \"thenable\".\n if (\n value !== null &&\n (isFunction(value) || typeof value === 'object') &&\n isFunction(value.then)\n ) {\n return true;\n }\n return false;\n}\n\nexport function isBehavior(value: any): value is ActorBehavior<any, any> {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'transition' in value &&\n typeof value.transition === 'function'\n );\n}\n\nexport function partition<T, A extends T, B extends T>(\n items: T[],\n predicate: (item: T) => item is A\n): [A[], B[]] {\n const [truthy, falsy] = [[], []] as [A[], B[]];\n\n for (const item of items) {\n if (predicate(item)) {\n truthy.push(item);\n } else {\n falsy.push(item as B);\n }\n }\n\n return [truthy, falsy];\n}\n\n// tslint:disable-next-line:no-empty\nexport let warn: (\n condition: boolean | Error,\n message: string\n) => void = () => {};\n\nif (!IS_PRODUCTION) {\n warn = (condition: boolean | Error, message: string) => {\n const error = condition instanceof Error ? condition : undefined;\n if (!error && condition) {\n return;\n }\n\n if (console !== undefined) {\n const args: [string, ...any[]] = [`Warning: ${message}`];\n if (error) {\n args.push(error);\n }\n // tslint:disable-next-line:no-console\n console.warn.apply(console, args);\n }\n };\n}\n\nexport function isArray(value: any): value is any[] {\n return Array.isArray(value);\n}\n\n// tslint:disable-next-line:ban-types\nexport function isFunction(value: any): value is Function {\n return typeof value === 'function';\n}\n\nexport function isString(value: any): value is string {\n return typeof value === 'string';\n}\n\nexport function isObservable<T>(value: any): value is Subscribable<T> {\n try {\n return 'subscribe' in value && isFunction(value.subscribe);\n } catch (e) {\n return false;\n }\n}\n\nexport const uniqueId = (() => {\n let currentId = 0;\n\n return () => {\n currentId++;\n return currentId.toString(16);\n };\n})();\n\nexport function isSCXMLEvent<TEvent extends EventObject>(\n event: TEvent | SCXML.Event<TEvent>\n): event is SCXML.Event<TEvent> {\n return '$$type' in event && event.$$type === 'scxml';\n}\n\nexport function isSCXMLErrorEvent(\n event: SCXML.Event<any>\n): event is SCXMLErrorEvent {\n return (\n typeof event.name === 'string' &&\n (event.name === errorExecution || event.name.startsWith(errorPlatform))\n );\n}\n\nexport function toSCXMLEvent<TEvent extends EventObject>(\n event: TEvent | SCXML.Event<TEvent>,\n scxmlEvent?: Partial<SCXML.Event<TEvent>>\n): SCXML.Event<TEvent> {\n if (isSCXMLEvent(event)) {\n return event as SCXML.Event<TEvent>;\n }\n\n return {\n name: event.type,\n data: event,\n $$type: 'scxml',\n type: 'external',\n ...scxmlEvent\n };\n}\n\nexport function toTransitionConfigArray<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n event: TEvent['type'] | typeof NULL_EVENT | '*',\n configLike: SingleOrArray<\n TransitionConfig<TContext, TEvent> | TransitionConfigTarget\n >\n): Array<\n TransitionConfig<TContext, TEvent> & {\n event: TEvent['type'] | typeof NULL_EVENT | '*';\n }\n> {\n const transitions = toArrayStrict(configLike).map((transitionLike) => {\n if (\n typeof transitionLike === 'undefined' ||\n typeof transitionLike === 'string'\n ) {\n return { target: transitionLike, event };\n }\n\n return { ...transitionLike, event };\n }) as Array<\n TransitionConfig<TContext, TEvent> & {\n event: TEvent['type'] | typeof NULL_EVENT | '*';\n } // TODO: fix 'as' (remove)\n >;\n\n return transitions;\n}\n\nexport function normalizeTarget<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n target: SingleOrArray<string | StateNode<TContext, TEvent>> | undefined\n): Array<string | StateNode<TContext, TEvent>> | undefined {\n if (target === undefined || target === TARGETLESS_KEY) {\n return undefined;\n }\n return toArray(target);\n}\n\nexport function reportUnhandledExceptionOnInvocation(\n originalError: any,\n currentError: any,\n id: string\n) {\n if (!IS_PRODUCTION) {\n const originalStackTrace = originalError.stack\n ? ` Stacktrace was '${originalError.stack}'`\n : '';\n if (originalError === currentError) {\n // tslint:disable-next-line:no-console\n console.error(\n `Missing onError handler for invocation '${id}', error was '${originalError}'.${originalStackTrace}`\n );\n } else {\n const stackTrace = currentError.stack\n ? ` Stacktrace was '${currentError.stack}'`\n : '';\n // tslint:disable-next-line:no-console\n console.error(\n `Missing onError handler and/or unhandled exception/promise rejection for invocation '${id}'. ` +\n `Original error: '${originalError}'. ${originalStackTrace} Current error is '${currentError}'.${stackTrace}`\n );\n }\n }\n}\n\nexport function toInvokeConfig<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n invocable: InvokeConfig<TContext, TEvent> | string | ActorBehavior<any, any>,\n id: string\n): InvokeConfig<TContext, TEvent> {\n if (typeof invocable === 'object') {\n if ('src' in invocable) {\n return invocable;\n }\n\n if ('transition' in invocable) {\n return {\n id,\n src: invocable\n };\n }\n }\n\n return {\n id,\n src: invocable\n };\n}\n\nexport function toObserver<T>(\n nextHandler?: Observer<T> | ((value: T) => void),\n errorHandler?: (error: any) => void,\n completionHandler?: () => void\n): Observer<T> {\n const noop = () => {};\n const isObserver = typeof nextHandler === 'object';\n const self = isObserver ? nextHandler : null;\n\n return {\n next: ((isObserver ? nextHandler.next : nextHandler) || noop).bind(self),\n error: ((isObserver ? nextHandler.error : errorHandler) || noop).bind(self),\n complete: (\n (isObserver ? nextHandler.complete : completionHandler) || noop\n ).bind(self)\n };\n}\n\nexport function createInvokeId(stateNodeId: string, index: number): string {\n return `${stateNodeId}:invocation[${index}]`;\n}\n\nexport function resolveReferencedActor(\n referenced:\n | AnyActorBehavior\n | { src: AnyActorBehavior; input: Mapper<any, any, any> | any }\n | undefined\n) {\n return referenced\n ? 'transition' in referenced\n ? { src: referenced, input: undefined }\n : referenced\n : undefined;\n}\n","export const STATE_DELIMITER = '.';\nexport const TARGETLESS_KEY = '';\nexport const NULL_EVENT = '';\nexport const STATE_IDENTIFIER = '#';\nexport const WILDCARD = '*';\n","import type {\n BaseActionObject,\n BaseDynamicActionObject,\n BuiltInActionObject,\n EventObject,\n MachineContext\n} from '../src/types';\n\nexport function createDynamicAction<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject,\n TAction extends BaseActionObject,\n TDynamicParams extends Record<string, any>\n>(\n action: BuiltInActionObject & { params: TDynamicParams },\n resolve: BaseDynamicActionObject<\n TContext,\n TExpressionEvent,\n TEvent,\n TAction,\n TDynamicParams\n >['resolve']\n): BaseDynamicActionObject<\n TContext,\n TExpressionEvent,\n TEvent,\n TAction,\n TDynamicParams\n> {\n return {\n type: action.type,\n params: action.params,\n resolve\n } as any;\n}\n\nexport function isDynamicAction(\n action: any\n): action is BaseDynamicActionObject<any, any, any, any, any> {\n return typeof action === 'object' && action !== null && 'resolve' in action;\n}\n","import {\n EventObject,\n SendActionParams,\n SpecialTargets,\n SendExpr,\n AnyEventObject,\n MachineContext\n} from '../types.ts';\nimport { send as sendActionType } from '../actionTypes.ts';\nimport { isFunction, isString, toSCXMLEvent } from '../utils.ts';\nimport { createDynamicAction } from '../../actions/dynamicAction.ts';\nimport {\n AnyActorRef,\n AnyInterpreter,\n BaseDynamicActionObject,\n Cast,\n EventFrom,\n ExprWithMeta,\n InferEvent,\n SendActionObject,\n SendActionOptions,\n StateMeta,\n UnifiedArg\n} from '../index.ts';\nimport { actionTypes, error } from '../actions.ts';\n\n/**\n * Sends an event. This returns an action that will be read by an interpreter to\n * send the event in the next step, after the current step is finished executing.\n *\n * @deprecated Use the `sendTo(...)` action creator instead.\n *\n * @param eventOrExpr The event to send.\n * @param options Options to pass into the send event:\n * - `id` - The unique send event identifier (used with `cancel()`).\n * - `delay` - The number of milliseconds to delay the sending of the event.\n * - `to` - The target of this event (by default, the machine the event was sent from).\n */\nexport function send<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TSentEvent extends EventObject = AnyEventObject\n>(\n eventOrExpr: TSentEvent | SendExpr<TContext, TEvent, AnyEventObject>,\n options?: SendActionOptions<TContext, TEvent>\n): BaseDynamicActionObject<\n TContext,\n TEvent,\n TEvent,\n SendActionObject<AnyEventObject>,\n SendActionParams<TContext, TEvent>\n> {\n return createDynamicAction<\n TContext,\n TEvent,\n AnyEventObject,\n SendActionObject<AnyEventObject>,\n SendActionParams<TContext, TEvent>\n >(\n {\n type: sendActionType,\n params: {\n to: options ? options.to : undefined,\n delay: options ? options.delay : undefined,\n event: eventOrExpr,\n id:\n options && options.id !== undefined\n ? options.id\n : isFunction(eventOrExpr)\n ? eventOrExpr.name\n : eventOrExpr.type\n }\n },\n (_event, { actorContext, state }) => {\n const params = {\n to: options ? options.to : undefined,\n delay: options ? options.delay : undefined,\n event: eventOrExpr,\n // TODO: don't auto-generate IDs here like that\n // there is too big chance of the ID collision\n id:\n options && options.id !== undefined\n ? options.id\n : isFunction(eventOrExpr)\n ? eventOrExpr.name\n : eventOrExpr.type\n };\n const args: UnifiedArg<TContext, TEvent> & StateMeta<TEvent> = {\n context: state.context,\n event: _event.data,\n _event,\n self: actorContext?.self ?? (null as any),\n system: actorContext?.system\n };\n const delaysMap = state.machine.options.delays;\n\n // TODO: helper function for resolving Expr\n const resolvedEvent = toSCXMLEvent(\n isFunction(eventOrExpr) ? eventOrExpr(args) : eventOrExpr\n );\n\n let resolvedDelay: number | undefined;\n if (isString(params.delay)) {\n const configDelay = delaysMap && delaysMap[params.delay];\n resolvedDelay = isFunction(configDelay)\n ? configDelay(args)\n : configDelay;\n } else {\n resolvedDelay = isFunction(params.delay)\n ? params.delay(args)\n : params.delay;\n }\n\n const resolvedTarget = isFunction(params.to)\n ? params.to(args)\n : params.to;\n let targetActorRef: AnyActorRef | undefined;\n\n if (typeof resolvedTarget === 'string') {\n if (resolvedTarget === SpecialTargets.Parent) {\n targetActorRef = actorContext?.self._parent;\n } else if (resolvedTarget === SpecialTargets.Internal) {\n targetActorRef = actorContext?.self;\n } else if (resolvedTarget.startsWith('#_')) {\n // SCXML compatibility: https://www.w3.org/TR/scxml/#SCXMLEventProcessor\n // #_invokeid. If the target is the special term '#_invokeid', where invokeid is the invokeid of an SCXML session that the sending session has created by <invoke>, the Processor must add the event to the external queue of that session.\n targetActorRef = state.children[resolvedTarget.slice(2)];\n } else {\n targetActorRef = state.children[resolvedTarget];\n }\n if (!targetActorRef) {\n throw new Error(\n `Unable to send event to actor '${resolvedTarget}' from machine '${state.machine.id}'.`\n );\n }\n } else {\n targetActorRef = resolvedTarget || actorContext?.self;\n }\n\n const resolvedAction: SendActionObject = {\n type: actionTypes.send,\n params: {\n ...params,\n to: targetActorRef,\n _event: resolvedEvent,\n event: resolvedEvent.data,\n delay: resolvedDelay,\n internal: resolvedTarget === SpecialTargets.Internal\n },\n execute: (actorCtx) => {\n const sendAction = resolvedAction as SendActionObject;\n\n if (typeof sendAction.params.delay === 'number') {\n (actorCtx.self as AnyInterpreter).delaySend(sendAction);\n return;\n } else {\n const target = sendAction.params.to!;\n const { _event } = sendAction.params;\n actorCtx.defer(() => {\n const origin = actorCtx.self;\n const resolvedEvent: typeof _event = {\n ..._event,\n name:\n _event.name === actionTypes.error\n ? `${error(origin.id)}`\n : _event.name,\n origin: origin\n };\n target.send(resolvedEvent);\n });\n }\n }\n };\n\n return [state, resolvedAction];\n }\n );\n}\n\n/**\n * Sends an event to this machine's parent.\n *\n * @param event The event to send to the parent machine.\n * @param options Options to pass into the send event.\n */\nexport function sendParent<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TSentEvent extends EventObject = AnyEventObject\n>(\n event: TSentEvent | SendExpr<TContext, TEvent, TSentEvent>,\n options?: SendActionOptions<TContext, TEvent>\n) {\n return send<TContext, TEvent, TSentEvent>(event, {\n ...options,\n to: SpecialTargets.Parent\n });\n}\n\n/**\n * Sends an event back to the sender of the original event.\n *\n * @param event The event to send back to the sender\n * @param options Options to pass into the send event\n */\nexport function respond<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TSentEvent extends EventObject = AnyEventObject\n>(\n event: TEvent | SendExpr<TContext, TEvent, TSentEvent>,\n options?: SendActionOptions<TContext, TEvent>\n) {\n return send<TContext, TEvent>(event, {\n ...options,\n to: ({ _event }) => {\n return _event.origin!; // TODO: handle when _event.origin is undefined\n }\n });\n}\n\n/**\n * Forwards (sends) an event to a specified service.\n *\n * @param target The target service to forward the event to.\n * @param options Options to pass into the send action creator.\n */\nexport function forwardTo<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n target: Required<SendActionParams<TContext, TEvent>>['to'],\n options?: SendActionOptions<TContext, TEvent>\n) {\n if (\n process.env.NODE_END !== 'production' &&\n (!target || typeof target === 'function')\n ) {\n const originalTarget = target;\n target = (...args) => {\n const resolvedTarget =\n typeof originalTarget === 'function'\n ? originalTarget(...args)\n : originalTarget;\n if (!resolvedTarget) {\n throw new Error(\n `Attempted to forward event to undefined actor. This risks an infinite loop in the sender.`\n );\n }\n return resolvedTarget;\n };\n }\n return send<TContext, TEvent>(({ event }) => event, {\n ...options,\n to: target\n });\n}\n\n/**\n * Escalates an error by sending it as an event to this machine's parent.\n *\n * @param errorData The error data to send, or the expression function that\n * takes in the `context`, `event`, and `meta`, and returns the error data to send.\n * @param options Options to pass into the send action creator.\n */\nexport function escalate<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TErrorData = any\n>(\n errorData: TErrorData | ExprWithMeta<TContext, TEvent, TErrorData>,\n options?: SendActionParams<TContext, TEvent>\n) {\n return sendParent<TContext, TEvent>(\n (arg) => {\n return {\n type: actionTypes.error,\n data: isFunction(errorData) ? errorData(arg) : errorData\n };\n },\n {\n ...options,\n to: SpecialTargets.Parent\n }\n );\n}\n\n/**\n * Sends an event to an actor.\n *\n * @param actor The `ActorRef` to send the event to.\n * @param event The event to send, or an expression that evaluates to the event to send\n * @param options Send action options\n * @returns An XState send action object\n */\nexport function sendTo<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TActor extends AnyActorRef\n>(\n actor: TActor | string | ExprWithMeta<TContext, TEvent, TActor | string>,\n event:\n | EventFrom<TActor>\n | SendExpr<\n TContext,\n TEvent,\n InferEvent<Cast<EventFrom<TActor>, EventObject>>\n >,\n options?: SendActionOptions<TContext, TEvent>\n) {\n return send<TContext, TEvent, any>(event, {\n ...options,\n to: actor\n });\n}\n","interface MailboxItem<T> {\n value: T;\n next: MailboxItem<T> | null;\n}\n\nexport class Mailbox<T> {\n private _active: boolean = false;\n private _current: MailboxItem<T> | null = null;\n private _last: MailboxItem<T> | null = null;\n\n constructor(private _process: (ev: T) => void) {}\n\n public start() {\n this._active = true;\n this.flush();\n }\n\n public clear(): void {\n // we can't set _current to null because we might be currently processing\n // and enqueue following clear shouldnt start processing the enqueued item immediately\n if (this._current) {\n this._current.next = null;\n this._last = this._current;\n }\n }\n\n // TODO: rethink this design\n public prepend(event: T): void {\n if (!this._current) {\n this.enqueue(event);\n return;\n }\n\n // we know that something is already queued up\n // so the mailbox is already flushing or it's inactive\n // therefore the only thing that we need to do is to reassign `this._current`\n this._current = {\n value: event,\n next: this._current\n };\n }\n\n public enqueue(event: T): void {\n const enqueued = {\n value: event,\n next: null\n };\n\n if (this._current) {\n this._last!.next = enqueued;\n this._last = enqueued;\n return;\n }\n\n this._current = enqueued;\n this._last = enqueued;\n\n if (this._active) {\n this.flush();\n }\n }\n\n private flush() {\n while (this._current) {\n // atm the given _process is responsible for implementing proper try/catch handling\n // we assume here that this won't throw in a way that can affect this mailbox\n const consumed = this._current;\n this._process(consumed.value);\n // something could have been prepended in the meantime\n // so we need to be defensive here to avoid skipping over a prepended item\n if (consumed === this._current) {\n this._current = this._current.next;\n }\n }\n this._last = null;\n }\n}\n","export const symbolObservable: typeof Symbol.observable = (() =>\n (typeof Symbol === 'function' && Symbol.observable) ||\n '@@observable')() as any;\n","import type { EventObject, ActorRef, BaseActorRef } from '../types.ts';\nimport { symbolObservable } from '../symbolObservable.ts';\nimport { ActorStatus } from '../interpreter.ts';\nexport { fromTransition } from './transition.ts';\nexport { fromPromise } from './promise.ts';\nexport { fromObservable, fromEventObservable } from './observable.ts';\nexport { fromCallback } from './callback.ts';\n\nexport const startSignalType = 'xstate.init';\nexport const stopSignalType = 'xstate.stop';\nexport const startSignal: StartSignal = { type: 'xstate.init' };\nexport const stopSignal: StopSignal = { type: 'xstate.stop' };\n\nexport interface StartSignal {\n type: 'xstate.init';\n}\n\nexport interface StopSignal {\n type: 'xstate.stop';\n}\n\nexport type LifecycleSignal = StartSignal | StopSignal;\nexport type LifecycleSignalType =\n | typeof startSignalType\n | typeof stopSignalType;\n\n/**\n * An object that expresses the behavior of an actor in reaction to received events,\n * as well as an optionally emitted stream of values.\n *\n * @template TReceived The received event\n * @template TSnapshot The emitted value\n */\n\nexport function isSignal(eventType: string): eventType is LifecycleSignalType {\n return eventType === startSignalType || eventType === stopSignalType;\n}\n\nexport function isActorRef(item: any): item is ActorRef<any> {\n return !!item && typeof item === 'object' && typeof item.send === 'function';\n}\n\n// TODO: refactor the return type, this could be written in a better way\n// but it's best to avoid unneccessary breaking changes now\n// @deprecated use `interpret(behavior)` instead\nexport function toActorRef<\n TEvent extends EventObject,\n TSnapshot = any,\n TActorRefLike extends BaseActorRef<TEvent> = BaseActorRef<TEvent>\n>(\n actorRefLike: TActorRefLike\n): ActorRef<TEvent, TSnapshot> & Omit<TActorRefLike, keyof ActorRef<any, any>> {\n return {\n subscribe: () => ({ unsubscribe: () => void 0 }),\n id: 'anonymous',\n sessionId: '',\n getSnapshot: () => undefined,\n [symbolObservable]: function () {\n return this;\n },\n status: ActorStatus.Running,\n stop: () => void 0,\n ...actorRefLike\n };\n}\n","import { IS_PRODUCTION } from '../environment.ts';\nimport { AnyInterpreter, DevToolsAdapter } from '../types.ts';\n\ninterface DevInterface {\n services: Set<AnyInterpreter>;\n register(service: AnyInterpreter): void;\n onRegister(listener: ServiceListener): void;\n}\ntype ServiceListener = (service: AnyInterpreter) => void;\n\nexport interface XStateDevInterface {\n register: (service: AnyInterpreter) => void;\n unregister: (service: AnyInterpreter) => void;\n onRegister: (listener: ServiceListener) => {\n unsubscribe: () => void;\n };\n services: Set<AnyInterpreter>;\n}\n\n// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/globalThis\nexport function getGlobal(): typeof globalThis | undefined {\n if (typeof globalThis !== 'undefined') {\n return globalThis;\n }\n if (typeof self !== 'undefined') {\n return self;\n }\n if (typeof window !== 'undefined') {\n return window;\n }\n if (typeof global !== 'undefined') {\n return global;\n }\n if (!IS_PRODUCTION) {\n console.warn(\n 'XState could not find a global object in this environment. Please let the maintainers know and raise an issue here: https://github.com/statelyai/xstate/issues'\n );\n }\n}\n\nfunction getDevTools(): DevInterface | undefined {\n const w = getGlobal();\n if (!!(w as any).__xstate__) {\n return (w as any).__xstate__;\n }\n\n return undefined;\n}\n\nexport function registerService(service: AnyInterpreter) {\n if (typeof window === 'undefined') {\n return;\n }\n\n const devTools = getDevTools();\n\n if (devTools) {\n devTools.register(service);\n }\n}\n\nexport const devToolsAdapter: DevToolsAdapter = (service) => {\n if (typeof window === 'undefined') {\n return;\n }\n\n const devTools = getDevTools();\n\n if (devTools) {\n devTools.register(service);\n }\n};\n","import { Mailbox } from './Mailbox.ts';\nimport { doneInvoke, error } from './actions.ts';\nimport { stopSignalType } from './actors/index.ts';\nimport { devToolsAdapter } from './dev/index.ts';\nimport { IS_PRODUCTION } from './environment.ts';\nimport { symbolObservable } from './symbolObservable.ts';\nimport { createSystem } from './system.ts';\nimport { AreAllImplementationsAssumedToBeProvided } from './typegenTypes.ts';\nimport type {\n ActorBehavior,\n ActorContext,\n ActorSystem,\n AnyActorBehavior,\n AnyStateMachine,\n EventFromBehavior,\n InterpreterFrom,\n PersistedStateFrom,\n RaiseActionObject,\n SnapshotFrom\n} from './types.ts';\nimport {\n ActorRef,\n DoneEvent,\n EventObject,\n InteropSubscribable,\n InterpreterOptions,\n Observer,\n SCXML,\n SendActionObject,\n Subscription\n} from './types.ts';\nimport { toObserver, toSCXMLEvent, warn } from './utils.ts';\n\nexport type SnapshotListener<TBehavior extends AnyActorBehavior> = (\n state: SnapshotFrom<TBehavior>\n) => void;\n\nexport type EventListener<TEvent extends EventObject = EventObject> = (\n event: TEvent\n) => void;\n\nexport type Listener = () => void;\nexport type ErrorListener = (error: any) => void;\n\nexport interface Clock {\n setTimeout(fn: (...args: any[]) => void, timeout: number): any;\n clearTimeout(id: any): void;\n}\n\nexport enum ActorStatus {\n NotStarted,\n Running,\n Stopped\n}\n\nconst defaultOptions = {\n deferEvents: true,\n clock: {\n setTimeout: (fn, ms) => {\n return setTimeout(fn, ms);\n },\n clearTimeout: (id) => {\n return clearTimeout(id);\n }\n } as Clock,\n logger: console.log.bind(console),\n devTools: false\n};\n\ntype InternalStateFrom<TBehavior extends ActorBehavior<any, any, any>> =\n TBehavior extends ActorBehavior<infer _, infer __, infer TInternalState>\n ? TInternalState\n : never;\n\nexport class Interpreter<\n TBehavior extends AnyActorBehavior,\n TEvent extends EventObject = EventFromBehavior<TBehavior>\n> implements ActorRef<TEvent, SnapshotFrom<TBehavior>>\n{\n /**\n * The current state of the interpreted behavior.\n */\n private _state!: InternalStateFrom<TBehavior>;\n /**\n * The clock that is responsible for setting and clearing timeouts, such as delayed events and transitions.\n */\n public clock: Clock;\n public options: Readonly<InterpreterOptions<TBehavior>>;\n\n /**\n * The unique identifier for this actor relative to its parent.\n */\n public id: string;\n\n private mailbox: Mailbox<SCXML.Event<TEvent>> = new Mailbox(\n this._process.bind(this)\n );\n\n private delayedEventsMap: Record<string, unknown> = {};\n\n private observers: Set<Observer<SnapshotFrom<TBehavior>>> = new Set();\n private logger: (...args: any[]) => void;\n /**\n * Whether the service is started.\n */\n public status: ActorStatus = ActorStatus.NotStarted;\n\n // Actor Ref\n public _parent?: ActorRef<any>;\n public ref: ActorRef<TEvent>;\n // TODO: add typings for system\n private _actorContext: ActorContext<TEvent, SnapshotFrom<TBehavior>, any>;\n\n private _systemId: string | undefined;\n\n /**\n * The globally unique process ID for this invocation.\n */\n public sessionId: string;\n\n public system: ActorSystem<any>;\n private _doneEvent?: DoneEvent;\n\n public src?: string;\n\n /**\n * Creates a new Interpreter instance (i.e., service) for the given behavior with the provided options, if any.\n *\n * @param behavior The behavior to be interpreted\n * @param options Interpreter options\n */\n constructor(\n public behavior: TBehavior,\n options?: InterpreterOptions<TBehavior>\n ) {\n const resolvedOptions = {\n ...defaultOptions,\n ...options\n };\n\n const { clock, logger, parent, id, systemId } = resolvedOptions;\n const self = this;\n\n this.system = parent?.system ?? createSystem();\n\n if (systemId) {\n this._systemId = systemId;\n this.system._set(systemId, this);\n }\n\n this.sessionId = this.system._bookId();\n this.id = id ?? this.sessionId;\n this.logger = logger;\n this.clock = clock;\n this._parent = parent;\n this.options = resolvedOptions;\n this.src = resolvedOptions.src;\n this.ref = this;\n this._actorContext = {\n self,\n id: this.id,\n sessionId: this.sessionId,\n logger: this.logger,\n defer: (fn) => {\n this._deferred.push(fn);\n },\n system: this.system,\n stopChild: (child) => {\n if (child._parent !== this) {\n throw new Error(\n `Cannot stop child actor ${child.id} of ${this.id} because it is not a child`\n );\n }\n (child as any)._stop();\n }\n };\n\n // Ensure that the send method is bound to this interpreter instance\n // if destructured\n this.send = this.send.bind(this);\n this._initState();\n }\n\n private _initState() {\n this._state = this.options.state\n ? this.behavior.restoreState\n ? this.behavior.restoreState(this.options.state, this._actorContext)\n : this.options.state\n : this.behavior.getInitialState(this._actorContext, this.options?.input);\n }\n\n // array of functions to defer\n private _deferred: Array<(state: any) => void> = [];\n\n private update(state: InternalStateFrom<TBehavior>): void {\n // Update state\n this._state = state;\n const snapshot = this.getSnapshot();\n\n // Execute deferred effects\n let deferredFn: (typeof this._deferred)[number] | undefined;\n\n while ((deferredFn = this._deferred.shift())) {\n deferredFn(state);\n }\n\n for (const observer of this.observers) {\n observer.next?.(snapshot);\n }\n\n const status = this.behavior.getStatus?.(state);\n\n switch (status?.status) {\n case 'done':\n this._doneEvent = doneInvoke(this.id, status.data);\n this._parent?.send(\n toSCXMLEvent(this._doneEvent as any, {\n origin: this,\n invokeid: this.id\n })\n );\n\n this._stopProcedure();\n break;\n case 'error':\n this._parent?.send(\n toSCXMLEvent(error(this.id, status.data), {\n origin: this\n })\n );\n for (const observer of this.observers) {\n observer.error?.(status.data);\n }\n break;\n }\n }\n\n public subscribe(observer: Observer<SnapshotFrom<TBehavior>>): Subscription;\n public subscribe(\n nextListener?: (state: SnapshotFrom<TBehavior>) => void,\n errorListener?: (error: any) => void,\n completeListener?: () => void\n ): Subscription;\n public subscribe(\n nextListenerOrObserver?:\n | ((state: SnapshotFrom<TBehavior>) => void)\n | Observer<SnapshotFrom<TBehavior>>,\n errorListener?: (error: any) => void,\n completeListener?: () => void\n ): Subscription {\n const observer = toObserver(\n nextListenerOrObserver,\n errorListener,\n completeListener\n );\n\n this.observers.add(observer);\n\n if (this.status === ActorStatus.Stopped) {\n observer.complete?.();\n this.observers.delete(observer);\n }\n\n return {\n unsubscribe: () => {\n this.observers.delete(observer);\n }\n };\n }\n\n /**\n * Adds a state listener that is notified when the statechart has reached its final state.\n * @param listener The state listener\n */\n public onDone(listener: EventListener<DoneEvent>): this {\n if (this.status === ActorStatus.Stopped && this._doneEvent) {\n listener(this._doneEvent);\n } else {\n this.observers.add({\n complete: () => {\n if (this._doneEvent) {\n listener(this._doneEvent);\n }\n }\n });\n }\n\n return this;\n }\n\n /**\n * Starts the interpreter from the initial state\n */\n public start(): this {\n if (this.status === ActorStatus.Running) {\n // Do not restart the service if it is already started\n return this;\n }\n\n this.system._register(this.sessionId, this);\n if (this._systemId) {\n this.system._set(this._systemId, this);\n }\n this.status = ActorStatus.Running;\n\n if (this.behavior.start) {\n this.behavior.start(this._state, this._actorContext);\n }\n\n // TODO: this notifies all subscribers but usually this is redundant\n // there is no real change happening here\n // we need to rethink if this needs to be refactored\n this.update(this._state);\n\n if (this.options.devTools) {\n this.attachDevTools();\n }\n\n this.mailbox.start();\n\n return this;\n }\n\n private _process(event: SCXML.Event<TEvent>) {\n try {\n const nextState = this.behavior.transition(\n this._state,\n event,\n this._actorContext\n );\n\n this.update(nextState);\n\n if (event.name === stopSignalType) {\n this._stopProcedure();\n }\n } catch (err) {\n // TODO: properly handle errors\n if (this.observers.size > 0) {\n this.observers.forEach((observer) => {\n observer.error?.(err);\n });\n this.stop();\n } else {\n throw err;\n }\n }\n }\n\n private _stop(): this {\n if (this.status === ActorStatus.Stopped) {\n return this;\n }\n this.mailbox.clear();\n if (this.status === ActorStatus.NotStarted) {\n this.status = ActorStatus.Stopped;\n return this;\n }\n this.mailbox.enqueue(toSCXMLEvent({ type: stopSignalType }) as any);\n\n return this;\n }\n\n /**\n * Stops the interpreter and unsubscribe all listeners.\n */\n public stop(): this {\n if (this._parent) {\n throw new Error('A non-root actor cannot be stopped directly.');\n }\n return this._stop();\n }\n private _complete(): void {\n for (const observer of this.observers) {\n observer.complete?.();\n }\n this.observers.clear();\n }\n private _stopProcedure(): this {\n this._complete();\n\n if (this.status !== ActorStatus.Running) {\n // Interpreter already stopped; do nothing\n return this;\n }\n\n // Cancel all delayed events\n for (const key of Object.keys(this.delayedEventsMap)) {\n this.clock.clearTimeout(this.delayedEventsMap[key]);\n }\n\n // TODO: mailbox.reset\n this.mailbox.clear();\n // TODO: after `stop` we must prepare ourselves for receiving events again\n // events sent *after* stop signal must be queued\n // it seems like this should be the common behavior for all of our consumers\n // so perhaps this should be unified somehow for all of them\n this.mailbox = new Mailbox(this._process.bind(this));\n\n this.status = ActorStatus.Stopped;\n this.system._unregister(this);\n\n return this;\n }\n\n /**\n * Sends an event to the running interpreter to trigger a transition.\n *\n * @param event The event to send\n */\n public send(event: TEvent | SCXML.Event<TEvent>) {\n const _event = toSCXMLEvent(event);\n\n if (this.status === ActorStatus.Stopped) {\n // do nothing\n if (!IS_PRODUCTION) {\n const eventString = JSON.stringify(_event.data);\n\n warn(\n false,\n `Event \"${_event.name.toString()}\" was sent to stopped actor \"${\n this.id\n } (${\n this.sessionId\n })\". This actor has already reached its final state, and will not transition.\\nEvent: ${eventString}`\n );\n }\n return;\n }\n\n if (this.status !== ActorStatus.Running && !this.options.deferEvents) {\n throw new Error(\n `Event \"${_event.name}\" was sent to uninitialized actor \"${\n this.id\n // tslint:disable-next-line:max-line-length\n }\". Make sure .start() is called for this actor, or set { deferEvents: true } in the actor options.\\nEvent: ${JSON.stringify(\n _event.data\n )}`\n );\n }\n\n this.mailbox.enqueue(_event);\n }\n\n // TODO: make private (and figure out a way to do this within the machine)\n public delaySend(\n sendAction: SendActionObject | RaiseActionObject<any, any, any>\n ): void {\n this.delayedEventsMap[sendAction.params.id] = this.clock.setTimeout(() => {\n if ('to' in sendAction.params && sendAction.params.to) {\n sendAction.params.to.send(sendAction.params._event);\n } else {\n this.send(sendAction.params._event as SCXML.Event<TEvent>);\n }\n }, sendAction.params.delay as number);\n }\n\n // TODO: make private (and figure out a way to do this within the machine)\n public cancel(sendId: string | number): void {\n this.clock.clearTimeout(this.delayedEventsMap[sendId]);\n delete this.delayedEventsMap[sendId];\n }\n\n private attachDevTools(): void {\n const { devTools } = this.options;\n if (devTools) {\n const resolvedDevToolsAdapter =\n typeof devTools === 'function' ? devTools : devToolsAdapter;\n\n resolvedDevToolsAdapter(this);\n }\n }\n public toJSON() {\n return {\n id: this.id\n };\n }\n\n public getPersistedState(): PersistedStateFrom<TBehavior> | undefined {\n return this.behavior.getPersistedState?.(this._state);\n }\n\n public [symbolObservable](): InteropSubscribable<SnapshotFrom<TBehavior>> {\n return this;\n }\n\n public getSnapshot(): SnapshotFrom<TBehavior> {\n return this.behavior.getSnapshot\n ? this.behavior.getSnapshot(this._state)\n : this._state;\n }\n}\n\n/**\n * Creates a new Interpreter instance for the given machine with the provided options, if any.\n *\n * @param machine The machine to interpret\n * @param options Interpreter options\n */\nexport function interpret<TMachine extends AnyStateMachine>(\n machine: AreAllImplementationsAssumedToBeProvided<\n TMachine['__TResolvedTypesMeta']\n > extends true\n ? TMachine\n : 'Some implementations missing',\n options?: InterpreterOptions<TMachine>\n): InterpreterFrom<TMachine>;\nexport function interpret<TBehavior extends AnyActorBehavior>(\n behavior: TBehavior,\n options?: InterpreterOptions<TBehavior>\n): Interpreter<TBehavior>;\nexport function interpret(\n behavior: any,\n options?: InterpreterOptions<any>\n): any {\n const interpreter = new Interpreter(behavior, options);\n\n return interpreter;\n}\n","import { ActorSystem, ActorSystemInfo, AnyActorRef } from './types.js';\n\nexport function createSystem<T extends ActorSystemInfo>(): ActorSystem<T> {\n let sessionIdCounter = 0;\n const children = new Map<string, AnyActorRef>();\n const keyedActors = new Map<keyof T['actors'], AnyActorRef | undefined>();\n const reverseKeyedActors = new WeakMap<AnyActorRef, keyof T['actors']>();\n\n const system: ActorSystem<T> = {\n _bookId: () => `x:${sessionIdCounter++}`,\n _register: (sessionId, actorRef) => {\n children.set(sessionId, actorRef);\n return sessionId;\n },\n _unregister: (actorRef) => {\n children.delete(actorRef.sessionId);\n const systemId = reverseKeyedActors.get(actorRef);\n\n if (systemId !== undefined) {\n keyedActors.delete(systemId);\n reverseKeyedActors.delete(actorRef);\n }\n },\n get: (systemId) => {\n return keyedActors.get(systemId) as T['actors'][any];\n },\n _set: (systemId, actorRef) => {\n const existing = keyedActors.get(systemId);\n if (existing && existing !== actorRef) {\n throw new Error(\n `Actor with system ID '${systemId as string}' already exists.`\n );\n }\n\n keyedActors.set(systemId, actorRef);\n reverseKeyedActors.set(actorRef, systemId);\n }\n };\n\n return system;\n}\n","import {\n EventObject,\n LogExpr,\n MachineContext,\n LogActionObject\n} from '../types.ts';\nimport { log as logActionType } from '../actionTypes.ts';\nimport { createDynamicAction } from '../../actions/dynamicAction.ts';\nimport { BaseDynamicActionObject, DynamicLogAction } from '../index.ts';\n\nconst defaultLogExpr = <TContext, TEvent extends EventObject>({\n context,\n event\n}: {\n context: TContext;\n event: TEvent;\n}) => ({\n context,\n event\n});\n\n/**\n *\n * @param expr The expression function to evaluate which will be logged.\n * Takes in 2 arguments:\n * - `ctx` - the current state context\n * - `event` - the event that caused this action to be executed.\n * @param label The label to give to the logged expression.\n */\n\nexport function log<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject = TExpressionEvent\n>(\n expr: string | LogExpr<TContext, TExpressionEvent> = defaultLogExpr,\n label?: string\n): BaseDynamicActionObject<\n TContext,\n TExpressionEvent,\n TEvent,\n LogActionObject,\n DynamicLogAction<TContext, TExpressionEvent, TEvent>['params']\n> {\n return createDynamicAction(\n { type: logActionType, params: { label, expr } },\n (_event, { state, actorContext }) => {\n const resolvedValue =\n typeof expr === 'function'\n ? expr({\n context: state.context,\n event: _event.data,\n _event,\n self: actorContext?.self ?? ({} as any),\n system: actorContext?.system\n })\n : expr;\n return [\n state,\n {\n type: 'xstate.log',\n params: {\n label,\n value: resolvedValue\n },\n execute: (actorCtx) => {\n if (label) {\n actorCtx.logger?.(label, resolvedValue);\n } else {\n actorCtx.logger?.(resolvedValue);\n }\n }\n } as LogActionObject\n ];\n }\n );\n}\n","const cache = new WeakMap<any, any>();\n\nexport function memo<T>(object: any, key: string, fn: () => T): T {\n let memoizedData = cache.get(object);\n\n if (!memoizedData) {\n memoizedData = { [key]: fn() };\n cache.set(object, memoizedData);\n } else if (!(key in memoizedData)) {\n memoizedData[key] = fn();\n }\n\n return memoizedData[key];\n}\n\nexport function evict(object: any, key?: string): void {\n if (!key) {\n return void cache.delete(object);\n }\n\n const memoizedData = cache.get(object);\n\n if (memoizedData) {\n delete memoizedData[key];\n }\n}\n","import type {\n EventObject,\n StateValue,\n BooleanGuardDefinition,\n GuardConfig,\n GuardDefinition,\n SCXML,\n GuardPredicate,\n MachineContext\n} from './types.ts';\nimport { isStateId } from './stateUtils.ts';\nimport { isFunction, isString } from './utils.ts';\nimport type { State } from './State.ts';\n\nexport function stateIn<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(stateValue: StateValue): GuardDefinition<TContext, TEvent> {\n return {\n type: 'xstate.guard:in',\n params: { stateValue },\n predicate: ({ state }) => {\n if (isString(stateValue) && isStateId(stateValue)) {\n return state.configuration.some((sn) => sn.id === stateValue.slice(1));\n }\n\n return state.matches(stateValue);\n }\n };\n}\n\nexport function not<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n guard: GuardConfig<TContext, TEvent>\n): BooleanGuardDefinition<TContext, TEvent> {\n return {\n type: 'xstate.boolean',\n params: { op: 'not' },\n children: [toGuardDefinition(guard)],\n predicate: ({ evaluate, guard, context, _event, state }) => {\n return !evaluate(guard.children![0], context, _event, state);\n }\n };\n}\n\nexport function and<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n guards: Array<GuardConfig<TContext, TEvent>>\n): BooleanGuardDefinition<TContext, TEvent> {\n return {\n type: 'xstate.boolean',\n params: { op: 'and' },\n children: guards.map((guard) => toGuardDefinition(guard)),\n predicate: ({ evaluate, guard, context, _event, state }) => {\n return guard.children!.every((childGuard) => {\n return evaluate(childGuard, context, _event, state);\n });\n }\n };\n}\n\nexport function or<TContext extends MachineContext, TEvent extends EventObject>(\n guards: Array<GuardConfig<TContext, TEvent>>\n): BooleanGuardDefinition<TContext, TEvent> {\n return {\n type: 'xstate.boolean',\n params: { op: 'or' },\n children: guards.map((guard) => toGuardDefinition(guard)),\n predicate: ({ evaluate, guard, context, _event, state }) => {\n return guard.children!.some((childGuard) => {\n return evaluate(childGuard, context, _event, state);\n });\n }\n };\n}\n\nexport function evaluateGuard<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n guard: GuardDefinition<TContext, TEvent>,\n context: TContext,\n _event: SCXML.Event<TEvent>,\n state: State<TContext, TEvent>\n): boolean {\n const { machine } = state;\n\n const predicate = machine?.options?.guards?.[guard.type] ?? guard.predicate;\n\n if (!predicate) {\n throw new Error(`Guard '${guard.type}' is not implemented.'.`);\n }\n\n return predicate({\n context,\n event: _event.data,\n state,\n guard,\n _event,\n evaluate: evaluateGuard\n });\n}\n\nexport function toGuardDefinition<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n guardConfig: GuardConfig<TContext, TEvent>,\n getPredicate?: (guardType: string) => GuardPredicate<TContext, TEvent>\n): GuardDefinition<TContext, TEvent> {\n if (isString(guardConfig)) {\n return {\n type: guardConfig,\n predicate: getPredicate?.(guardConfig) || undefined,\n params: { type: guardConfig }\n };\n }\n\n if (isFunction(guardConfig)) {\n return {\n type: guardConfig.name,\n predicate: guardConfig,\n params: {\n type: guardConfig.name,\n name: guardConfig.name\n }\n };\n }\n\n return {\n type: guardConfig.type,\n params: guardConfig.params || guardConfig,\n children: (\n guardConfig.children as Array<GuardConfig<TContext, TEvent>>\n )?.map((childGuard) => toGuardDefinition(childGuard, getPredicate)),\n predicate:\n getPredicate?.(guardConfig.type) || (guardConfig as any).predicate\n };\n}\n","import {\n toStatePath,\n toArray,\n warn,\n isArray,\n isFunction,\n isString,\n toTransitionConfigArray,\n normalizeTarget,\n toStateValue,\n mapContext,\n toSCXMLEvent\n} from './utils.ts';\nimport {\n BaseActionObject,\n EventObject,\n InvokeActionObject,\n StopActionObject,\n StateValue,\n TransitionConfig,\n TransitionDefinition,\n SingleOrArray,\n DelayExpr,\n SCXML,\n StateValueMap,\n RaiseActionObject,\n InitialTransitionConfig,\n MachineContext\n} from './types.ts';\nimport { cloneState, State } from './State.ts';\nimport {\n after,\n done,\n toActionObjects,\n actionTypes,\n resolveActionObject\n} from './actions.ts';\nimport { send } from './actions/send.ts';\nimport { cancel } from './actions/cancel.ts';\nimport { invoke } from './actions/invoke.ts';\nimport { stop } from './actions/stop.ts';\nimport { IS_PRODUCTION } from './environment.ts';\nimport { STATE_IDENTIFIER, NULL_EVENT, WILDCARD } from './constants.ts';\nimport { evaluateGuard, toGuardDefinition } from './guards.ts';\nimport type { StateNode } from './StateNode.ts';\nimport { isDynamicAction } from '../actions/dynamicAction.ts';\nimport {\n AnyActorContext,\n AnyEventObject,\n AnyHistoryValue,\n AnyState,\n AnyStateMachine,\n AnyStateNode,\n AnyTransitionDefinition,\n DelayedTransitionDefinition,\n HistoryValue,\n InitialTransitionDefinition,\n SendActionObject,\n StateFromMachine\n} from '.';\nimport { stopSignalType } from './actors/index.ts';\nimport { ActorStatus } from './interpreter.ts';\n\ntype Configuration<\n TContext extends MachineContext,\n TE extends EventObject\n> = Iterable<StateNode<TContext, TE>>;\ntype AnyConfiguration = Configuration<any, any>;\n\ntype AdjList = Map<AnyStateNode, Array<AnyStateNode>>;\n\nfunction getOutput<TContext extends MachineContext, TEvent extends EventObject>(\n configuration: StateNode<TContext, TEvent>[],\n context: TContext,\n _event: SCXML.Event<TEvent>\n) {\n const machine = configuration[0].machine;\n const finalChildStateNode = configuration.find(\n (stateNode) =>\n stateNode.type === 'final' && stateNode.parent === machine.root\n );\n\n return finalChildStateNode && finalChildStateNode.output\n ? mapContext(finalChildStateNode.output, context, _event)\n : undefined;\n}\n\nconst isAtomicStateNode = (stateNode: StateNode<any, any>) =>\n stateNode.type === 'atomic' || stateNode.type === 'final';\n\nfunction getChildren<TContext extends MachineContext, TE extends EventObject>(\n stateNode: StateNode<TContext, TE>\n): Array<StateNode<TContext, TE>> {\n return Object.values(stateNode.states).filter((sn) => sn.type !== 'history');\n}\n\nfunction getProperAncestors(\n stateNode: AnyStateNode,\n toStateNode: AnyStateNode | null\n): Array<typeof stateNode> {\n const ancestors: Array<typeof stateNode> = [];\n\n // add all ancestors\n let m = stateNode.parent;\n while (m && m !== toStateNode) {\n ancestors.push(m);\n m = m.parent;\n }\n\n return ancestors;\n}\n\nexport function getConfiguration(\n stateNodes: Iterable<AnyStateNode>\n): Set<AnyStateNode> {\n const configuration = new Set(stateNodes);\n const configurationSet = new Set(stateNodes);\n\n const adjList = getAdjList(configurationSet);\n\n // add descendants\n for (const s of configuration) {\n // if previously active, add existing child nodes\n if (s.type === 'compound' && (!adjList.get(s) || !adjList.get(s)!.length)) {\n getInitialStateNodes(s).forEach((sn) => configurationSet.add(sn));\n } else {\n if (s.type === 'parallel') {\n for (const child of getChildren(s)) {\n if (child.type === 'history') {\n continue;\n }\n\n if (!configurationSet.has(child)) {\n for (const initialStateNode of getInitialStateNodes(child)) {\n configurationSet.add(initialStateNode);\n }\n }\n }\n }\n }\n }\n\n // add all ancestors\n for (const s of configurationSet) {\n let m = s.parent;\n\n while (m) {\n configurationSet.add(m);\n m = m.parent;\n }\n }\n\n return configurationSet;\n}\n\nfunction getValueFromAdj(baseNode: AnyStateNode, adjList: AdjList): StateValue {\n const childStateNodes = adjList.get(baseNode);\n\n if (!childStateNodes) {\n return {}; // todo: fix?\n }\n\n if (baseNode.type === 'compound') {\n const childStateNode = childStateNodes[0];\n if (childStateNode) {\n if (isAtomicStateNode(childStateNode)) {\n return childStateNode.key;\n }\n } else {\n return {};\n }\n }\n\n const stateValue = {};\n for (const childStateNode of childStateNodes) {\n stateValue[childStateNode.key] = getValueFromAdj(childStateNode, adjList);\n }\n\n return stateValue;\n}\n\nexport function getAdjList<\n TContext extends MachineContext,\n TE extends EventObject\n>(configuration: Configuration<TContext, TE>): AdjList {\n const adjList: AdjList = new Map();\n\n for (const s of configuration) {\n if (!adjList.has(s)) {\n adjList.set(s, []);\n }\n\n if (s.parent) {\n if (!adjList.has(s.parent)) {\n adjList.set(s.parent, []);\n }\n\n adjList.get(s.parent)!.push(s);\n }\n }\n\n return adjList;\n}\n\nexport function getStateValue(\n rootNode: AnyStateNode,\n configuration: AnyConfiguration\n): StateValue {\n const config = getConfiguration(configuration);\n return getValueFromAdj(rootNode, getAdjList(config));\n}\n\nexport function isInFinalState(\n configuration: Array<AnyStateNode>,\n stateNode: AnyStateNode = configuration[0].machine.root\n): boolean {\n if (stateNode.type === 'compound') {\n return getChildren(stateNode).some(\n (s) => s.type === 'final' && configuration.includes(s)\n );\n }\n if (stateNode.type === 'parallel') {\n return getChildren(stateNode).every((sn) =>\n isInFinalState(configuration, sn)\n );\n }\n\n return false;\n}\n\nexport const isStateId = (str: string) => str[0] === STATE_IDENTIFIER;\n\nexport function getCandidates<TEvent extends EventObject>(\n stateNode: StateNode<any, TEvent>,\n receivedEventType: TEvent['type'],\n /**\n * If `true`, will use SCXML event partial token matching semantics\n * without the need for the \".*\" suffix\n */\n partialMatch: boolean = false\n): Array<TransitionDefinition<any, TEvent>> {\n const candidates = stateNode.transitions.filter((transition) => {\n const { eventType } = transition;\n // First, check the trivial case: event names are exactly equal\n if (eventType === receivedEventType) {\n return true;\n }\n\n // Then, check if transition is a wildcard transition,\n // which matches any non-transient events\n if (eventType === WILDCARD) {\n return true;\n }\n\n if (!partialMatch && !eventType.endsWith('.*')) {\n return false;\n }\n\n if (!IS_PRODUCTION) {\n warn(\n !/.*\\*.+/.test(eventType),\n `Wildcards can only be the last token of an event descriptor (e.g., \"event.*\") or the entire event descriptor (\"*\"). Check the \"${eventType}\" event.`\n );\n }\n\n const partialEventTokens = eventType.split('.');\n const eventTokens = receivedEventType.split('.');\n\n for (\n let tokenIndex = 0;\n tokenIndex < partialEventTokens.length;\n tokenIndex++\n ) {\n const partialEventToken = partialEventTokens[tokenIndex];\n const eventToken = eventTokens[tokenIndex];\n\n if (partialEventToken === '*') {\n const isLastToken = tokenIndex === partialEventTokens.length - 1;\n\n if (!IS_PRODUCTION) {\n warn(\n isLastToken,\n `Infix wildcards in transition events are not allowed. Check the \"${eventType}\" event.`\n );\n }\n\n return isLastToken;\n }\n\n if (partialEventToken !== eventToken) {\n return false;\n }\n }\n\n return true;\n });\n\n return candidates;\n}\n\n/**\n * All delayed transitions from the config.\n */\nexport function getDelayedTransitions<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n stateNode: AnyStateNode\n): Array<DelayedTransitionDefinition<TContext, TEvent>> {\n const afterConfig = stateNode.config.after;\n if (!afterConfig) {\n return [];\n }\n\n const mutateEntryExit = (\n delay: string | number | DelayExpr<TContext, TEvent>,\n i: number\n ) => {\n const delayRef = isFunction(delay) ? `${stateNode.id}:delay[${i}]` : delay;\n const eventType = after(delayRef, stateNode.id);\n stateNode.entry.push(send({ type: eventType }, { delay }));\n stateNode.exit.push(cancel(eventType));\n return eventType;\n };\n\n const delayedTransitions = isArray(afterConfig)\n ? afterConfig.map((transition, i) => {\n const eventType = mutateEntryExit(transition.delay, i);\n return { ...transition, event: eventType };\n })\n : Object.keys(afterConfig).flatMap((delay, i) => {\n const configTransition = afterConfig[delay];\n const resolvedTransition = isString(configTransition)\n ? { target: configTransition }\n : configTransition;\n const resolvedDelay = !isNaN(+delay) ? +delay : delay;\n const eventType = mutateEntryExit(resolvedDelay, i);\n return toArray(resolvedTransition).map((transition) => ({\n ...transition,\n event: eventType,\n delay: resolvedDelay\n }));\n });\n return delayedTransitions.map((delayedTransition) => {\n const { delay } = delayedTransition;\n return {\n ...formatTransition(stateNode, delayedTransition),\n delay\n };\n });\n}\n\nexport function formatTransition<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n stateNode: AnyStateNode,\n transitionConfig: TransitionConfig<TContext, TEvent> & {\n event: TEvent['type'] | typeof NULL_EVENT | '*';\n }\n): AnyTransitionDefinition {\n const normalizedTarget = normalizeTarget(transitionConfig.target);\n const external = transitionConfig.external ?? false;\n const { guards } = stateNode.machine.options;\n const target = resolveTarget(stateNode, normalizedTarget);\n\n // TODO: should this be part of a lint rule instead?\n if (!IS_PRODUCTION && (transitionConfig as any).cond) {\n throw new Error(\n `State \"${stateNode.id}\" has declared \\`cond\\` for one of its transitions. This property has been renamed to \\`guard\\`. Please update your code.`\n );\n }\n const transition = {\n ...transitionConfig,\n actions: toActionObjects(toArray(transitionConfig.actions)),\n guard: transitionConfig.guard\n ? toGuardDefinition(\n transitionConfig.guard,\n (guardType) => guards[guardType]\n )\n : undefined,\n target,\n source: stateNode,\n external,\n eventType: transitionConfig.event,\n toJSON: () => ({\n ...transition,\n source: `#${stateNode.id}`,\n target: target ? target.map((t) => `#${t.id}`) : undefined\n })\n };\n\n return transition;\n}\n\nexport function formatTransitions<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(stateNode: AnyStateNode): Array<AnyTransitionDefinition> {\n const transitionConfigs: Array<\n TransitionConfig<TContext, TEvent> & {\n event: string;\n }\n > = [];\n if (Array.isArray(stateNode.config.on)) {\n transitionConfigs.push(...stateNode.config.on);\n } else if (stateNode.config.on) {\n const { [WILDCARD]: wildcardConfigs = [], ...namedTransitionConfigs } =\n stateNode.config.on;\n for (const eventType of Object.keys(namedTransitionConfigs)) {\n if (eventType === NULL_EVENT) {\n throw new Error(\n 'Null events (\"\") cannot be specified as a transition key. Use `always: { ... }` instead.'\n );\n }\n const eventTransitionConfigs = toTransitionConfigArray<TContext, TEvent>(\n eventType,\n namedTransitionConfigs![eventType as string]\n );\n\n transitionConfigs.push(...eventTransitionConfigs);\n // TODO: add dev-mode validation for unreachable transitions\n }\n transitionConfigs.push(\n ...toTransitionConfigArray(\n WILDCARD,\n wildcardConfigs as SingleOrArray<\n TransitionConfig<TContext, TEvent> & {\n event: '*';\n }\n >\n )\n );\n }\n const doneConfig = stateNode.config.onDone\n ? toTransitionConfigArray(\n String(done(stateNode.id)),\n stateNode.config.onDone\n )\n : [];\n const invokeConfig = stateNode.invoke.flatMap((invokeDef) => {\n const settleTransitions: any[] = [];\n if (invokeDef.onDone) {\n settleTransitions.push(\n ...toTransitionConfigArray(\n `done.invoke.${invokeDef.id}`,\n invokeDef.onDone\n )\n );\n }\n if (invokeDef.onError) {\n settleTransitions.push(\n ...toTransitionConfigArray(\n `error.platform.${invokeDef.id}`,\n invokeDef.onError\n )\n );\n }\n if (invokeDef.onSnapshot) {\n settleTransitions.push(\n ...toTransitionConfigArray(\n `xstate.snapshot.${invokeDef.id}`,\n invokeDef.onSnapshot\n )\n );\n }\n return settleTransitions;\n });\n const delayedTransitions = stateNode.after;\n const formattedTransitions = [\n ...doneConfig,\n ...invokeConfig,\n ...transitionConfigs\n ].flatMap(\n (\n transitionConfig: TransitionConfig<TContext, TEvent> & {\n event: TEvent['type'] | '*';\n }\n ) =>\n toArray(transitionConfig).map((transition) =>\n formatTransition(stateNode, transition)\n )\n );\n for (const delayedTransition of delayedTransitions) {\n formattedTransitions.push(delayedTransition as any);\n }\n return formattedTransitions;\n}\n\nexport function formatInitialTransition<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n stateNode: AnyStateNode,\n _target: SingleOrArray<string> | InitialTransitionConfig<TContext, TEvent>\n): InitialTransitionDefinition<TContext, TEvent> {\n if (isString(_target) || isArray(_target)) {\n const targets = toArray(_target).map((t) => {\n // Resolve state string keys (which represent children)\n // to their state node\n const descStateNode = isString(t)\n ? isStateId(t)\n ? stateNode.machine.getStateNodeById(t)\n : stateNode.states[t]\n : t;\n\n if (!descStateNode) {\n throw new Error(\n `Initial state node \"${t}\" not found on parent state node #${stateNode.id}`\n );\n }\n\n if (!isDescendant(descStateNode, stateNode)) {\n throw new Error(\n `Invalid initial target: state node #${descStateNode.id} is not a descendant of #${stateNode.id}`\n );\n }\n\n return descStateNode;\n });\n const resolvedTarget = resolveTarget(stateNode, targets);\n\n const transition = {\n source: stateNode,\n actions: [],\n eventType: null as any,\n external: false,\n target: resolvedTarget!,\n toJSON: () => ({\n ...transition,\n source: `#${stateNode.id}`,\n target: resolvedTarget\n ? resolvedTarget.map((t) => `#${t.id}`)\n : undefined\n })\n };\n\n return transition;\n }\n\n return formatTransition(stateNode, {\n target: toArray(_target.target).map((t) => {\n if (isString(t)) {\n return isStateId(t) ? t : `${stateNode.machine.delimiter}${t}`;\n }\n\n return t;\n }),\n actions: _target.actions,\n event: null as any\n }) as InitialTransitionDefinition<TContext, TEvent>;\n}\n\nexport function resolveTarget(\n stateNode: AnyStateNode,\n targets: Array<string | AnyStateNode> | undefined\n): Array<AnyStateNode> | undefined {\n if (targets === undefined) {\n // an undefined target signals that the state node should not transition from that state when receiving that event\n return undefined;\n }\n return targets.map((target) => {\n if (!isString(target)) {\n return target;\n }\n if (isStateId(target)) {\n return stateNode.machine.getStateNodeById(target);\n }\n\n const isInternalTarget = target[0] === stateNode.machine.delimiter;\n // If internal target is defined on machine,\n // do not include machine key on target\n if (isInternalTarget && !stateNode.parent) {\n return getStateNodeByPath(stateNode, target.slice(1));\n }\n const resolvedTarget = isInternalTarget ? stateNode.key + target : target;\n if (stateNode.parent) {\n try {\n const targetStateNode = getStateNodeByPath(\n stateNode.parent,\n resolvedTarget\n );\n return targetStateNode;\n } catch (err) {\n throw new Error(\n `Invalid transition definition for state node '${stateNode.id}':\\n${err.message}`\n );\n }\n } else {\n throw new Error(\n `Invalid target: \"${target}\" is not a valid target from the root node. Did you mean \".${target}\"?`\n );\n }\n });\n}\n\nfunction resolveHistoryTarget<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(stateNode: AnyStateNode & { type: 'history' }): Array<AnyStateNode> {\n const normalizedTarget = normalizeTarget<TContext, TEvent>(stateNode.target);\n if (!normalizedTarget) {\n return stateNode.parent!.initial.target;\n }\n return normalizedTarget.map((t) =>\n typeof t === 'string' ? getStateNodeByPath(stateNode.parent!, t) : t\n );\n}\n\nfunction isHistoryNode(\n stateNode: AnyStateNode\n): stateNode is AnyStateNode & { type: 'history' } {\n return stateNode.type === 'history';\n}\n\nexport function getInitialStateNodes(\n stateNode: AnyStateNode\n): Array<AnyStateNode> {\n const set = new Set<AnyStateNode>();\n\n function iter(descStateNode: AnyStateNode): void {\n if (set.has(descStateNode)) {\n return;\n }\n set.add(descStateNode);\n if (descStateNode.type === 'compound') {\n for (const targetStateNode of descStateNode.initial.target) {\n for (const a of getProperAncestors(targetStateNode, stateNode)) {\n set.add(a);\n }\n\n iter(targetStateNode);\n }\n } else if (descStateNode.type === 'parallel') {\n for (const child of getChildren(descStateNode)) {\n iter(child);\n }\n }\n }\n\n iter(stateNode);\n\n return [...set];\n}\n/**\n * Returns the child state node from its relative `stateKey`, or throws.\n */\nexport function getStateNode(\n stateNode: AnyStateNode,\n stateKey: string\n): AnyStateNode {\n if (isStateId(stateKey)) {\n return stateNode.machine.getStateNodeById(stateKey);\n }\n if (!stateNode.states) {\n throw new Error(\n `Unable to retrieve child state '${stateKey}' from '${stateNode.id}'; no child states exist.`\n );\n }\n const result = stateNode.states[stateKey];\n if (!result) {\n throw new Error(\n `Child state '${stateKey}' does not exist on '${stateNode.id}'`\n );\n }\n return result;\n}\n\n/**\n * Returns the relative state node from the given `statePath`, or throws.\n *\n * @param statePath The string or string array relative path to the state node.\n */\nexport function getStateNodeByPath(\n stateNode: AnyStateNode,\n statePath: string | string[]\n): AnyStateNode {\n if (typeof statePath === 'string' && isStateId(statePath)) {\n try {\n return stateNode.machine.getStateNodeById(statePath);\n } catch (e) {\n // try individual paths\n // throw e;\n }\n }\n const arrayStatePath = toStatePath(\n statePath,\n stateNode.machine.delimiter\n ).slice();\n let currentStateNode: AnyStateNode = stateNode;\n while (arrayStatePath.length) {\n const key = arrayStatePath.shift()!;\n if (!key.length) {\n break;\n }\n currentStateNode = getStateNode(currentStateNode, key);\n }\n return currentStateNode;\n}\n\n/**\n * Returns the state nodes represented by the current state value.\n *\n * @param state The state value or State instance\n */\nexport function getStateNodes<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n stateNode: AnyStateNode,\n state: StateValue | State<TContext, TEvent>\n): Array<AnyStateNode> {\n const stateValue =\n state instanceof State\n ? state.value\n : toStateValue(state, stateNode.machine.delimiter);\n\n if (isString(stateValue)) {\n return [stateNode, stateNode.states[stateValue]];\n }\n\n const childStateKeys = Object.keys(stateValue);\n const childStateNodes: Array<AnyStateNode> = childStateKeys\n .map((subStateKey) => getStateNode(stateNode, subStateKey))\n .filter(Boolean);\n\n return [stateNode.machine.root, stateNode].concat(\n childStateNodes,\n childStateKeys.reduce((allSubStateNodes, subStateKey) => {\n const subStateNode = getStateNode(stateNode, subStateKey);\n if (!subStateNode) {\n return allSubStateNodes;\n }\n const subStateNodes = getStateNodes(\n subStateNode,\n stateValue[subStateKey]\n );\n\n return allSubStateNodes.concat(subStateNodes);\n }, [] as Array<AnyStateNode>)\n );\n}\n\nexport function transitionAtomicNode<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n stateNode: AnyStateNode,\n stateValue: string,\n state: State<TContext, TEvent>,\n _event: SCXML.Event<TEvent>\n): Array<TransitionDefinition<TContext, TEvent>> | undefined {\n const childStateNode = getStateNode(stateNode, stateValue);\n const next = childStateNode.next(state, _event);\n\n if (!next || !next.length) {\n return stateNode.next(state, _event);\n }\n\n return next;\n}\n\nexport function transitionCompoundNode<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n stateNode: AnyStateNode,\n stateValue: StateValueMap,\n state: State<TContext, TEvent>,\n _event: SCXML.Event<TEvent>\n): Array<TransitionDefinition<TContext, TEvent>> | undefined {\n const subStateKeys = Object.keys(stateValue);\n\n const childStateNode = getStateNode(stateNode, subStateKeys[0]);\n const next = transitionNode(\n childStateNode,\n stateValue[subStateKeys[0]],\n state,\n _event\n );\n\n if (!next || !next.length) {\n return stateNode.next(state, _event);\n }\n\n return next;\n}\n\nexport function transitionParallelNode<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n stateNode: AnyStateNode,\n stateValue: StateValueMap,\n state: State<TContext, TEvent>,\n _event: SCXML.Event<TEvent>\n): Array<TransitionDefinition<TContext, TEvent>> | undefined {\n const allInnerTransitions: Array<TransitionDefinition<TContext, TEvent>> = [];\n\n for (const subStateKey of Object.keys(stateValue)) {\n const subStateValue = stateValue[subStateKey];\n\n if (!subStateValue) {\n continue;\n }\n\n const subStateNode = getStateNode(stateNode, subStateKey);\n const innerTransitions = transitionNode(\n subStateNode,\n subStateValue,\n state,\n _event\n );\n if (innerTransitions) {\n allInnerTransitions.push(...innerTransitions);\n }\n }\n if (!allInnerTransitions.length) {\n return stateNode.next(state, _event);\n }\n\n return allInnerTransitions;\n}\n\nexport function transitionNode<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n stateNode: AnyStateNode,\n stateValue: StateValue,\n state: State<TContext, TEvent, any>,\n _event: SCXML.Event<TEvent>\n): Array<TransitionDefinition<TContext, TEvent>> | undefined {\n // leaf node\n if (isString(stateValue)) {\n return transitionAtomicNode(stateNode, stateValue, state, _event);\n }\n\n // compound node\n if (Object.keys(stateValue).length === 1) {\n return transitionCompoundNode(stateNode, stateValue, state, _event);\n }\n\n // parallel node\n return transitionParallelNode(stateNode, stateValue, state, _event);\n}\n\nfunction getHistoryNodes(stateNode: AnyStateNode): Array<AnyStateNode> {\n return Object.keys(stateNode.states)\n .map((key) => stateNode.states[key])\n .filter((sn) => sn.type === 'history');\n}\n\nfunction isDescendant(\n childStateNode: AnyStateNode,\n parentStateNode: AnyStateNode\n): boolean {\n let marker = childStateNode;\n while (marker.parent && marker.parent !== parentStateNode) {\n marker = marker.parent;\n }\n\n return marker.parent === parentStateNode;\n}\n\nfunction getPathFromRootToNode(stateNode: AnyStateNode): Array<AnyStateNode> {\n const path: Array<AnyStateNode> = [];\n let marker = stateNode.parent;\n\n while (marker) {\n path.unshift(marker);\n marker = marker.parent;\n }\n\n return path;\n}\n\nfunction hasIntersection<T>(s1: Iterable<T>, s2: Iterable<T>): boolean {\n const set1 = new Set(s1);\n const set2 = new Set(s2);\n\n for (const item of set1) {\n if (set2.has(item)) {\n return true;\n }\n }\n for (const item of set2) {\n if (set1.has(item)) {\n return true;\n }\n }\n return false;\n}\n\nexport function removeConflictingTransitions(\n enabledTransitions: Array<AnyTransitionDefinition>,\n configuration: Set<AnyStateNode>,\n historyValue: AnyHistoryValue\n): Array<AnyTransitionDefinition> {\n const filteredTransitions = new Set<AnyTransitionDefinition>();\n\n for (const t1 of enabledTransitions) {\n let t1Preempted = false;\n const transitionsToRemove = new Set<AnyTransitionDefinition>();\n for (const t2 of filteredTransitions) {\n if (\n hasIntersection(\n computeExitSet([t1], configuration, historyValue),\n computeExitSet([t2], configuration, historyValue)\n )\n ) {\n if (isDescendant(t1.source, t2.source)) {\n transitionsToRemove.add(t2);\n } else {\n t1Preempted = true;\n break;\n }\n }\n }\n if (!t1Preempted) {\n for (const t3 of transitionsToRemove) {\n filteredTransitions.delete(t3);\n }\n filteredTransitions.add(t1);\n }\n }\n\n return Array.from(filteredTransitions);\n}\n\nfunction findLCCA(stateNodes: Array<AnyStateNode>): AnyStateNode {\n const [head] = stateNodes;\n\n let current = getPathFromRootToNode(head);\n let candidates: Array<AnyStateNode> = [];\n\n for (const stateNode of stateNodes) {\n const path = getPathFromRootToNode(stateNode);\n\n candidates = current.filter((sn) => path.includes(sn));\n current = candidates;\n candidates = [];\n }\n\n return current[current.length - 1];\n}\n\nfunction getEffectiveTargetStates(\n transition: AnyTransitionDefinition,\n historyValue: AnyHistoryValue\n): Array<AnyStateNode> {\n if (!transition.target) {\n return [];\n }\n\n const targets = new Set<AnyStateNode>();\n\n for (const targetNode of transition.target) {\n if (isHistoryNode(targetNode)) {\n if (historyValue[targetNode.id]) {\n for (const node of historyValue[targetNode.id]) {\n targets.add(node);\n }\n } else {\n for (const node of getEffectiveTargetStates(\n {\n target: resolveHistoryTarget(targetNode)\n } as AnyTransitionDefinition,\n historyValue\n )) {\n targets.add(node);\n }\n }\n } else {\n targets.add(targetNode);\n }\n }\n\n return [...targets];\n}\n\nfunction getTransitionDomain(\n transition: AnyTransitionDefinition,\n historyValue: AnyHistoryValue\n): AnyStateNode | null {\n const targetStates = getEffectiveTargetStates(transition, historyValue);\n\n if (!targetStates) {\n return null;\n }\n\n if (\n !transition.external &&\n transition.source.type === 'compound' &&\n targetStates.every((targetStateNode) =>\n isDescendant(targetStateNode, transition.source)\n )\n ) {\n return transition.source;\n }\n\n const lcca = findLCCA(targetStates.concat(transition.source));\n\n return lcca;\n}\n\nfunction computeExitSet(\n transitions: AnyTransitionDefinition[],\n configuration: Set<AnyStateNode>,\n historyValue: AnyHistoryValue\n): Array<AnyStateNode> {\n const statesToExit = new Set<AnyStateNode>();\n\n for (const t of transitions) {\n if (t.target?.length) {\n const domain = getTransitionDomain(t, historyValue);\n\n for (const stateNode of configuration) {\n if (isDescendant(stateNode, domain!)) {\n statesToExit.add(stateNode);\n }\n }\n }\n }\n\n return [...statesToExit];\n}\n\n/**\n * https://www.w3.org/TR/scxml/#microstepProcedure\n *\n * @private\n * @param transitions\n * @param currentState\n * @param mutConfiguration\n */\n\nexport function microstep<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n transitions: Array<TransitionDefinition<TContext, TEvent>>,\n currentState: State<TContext, TEvent, any>,\n actorCtx: AnyActorContext | undefined,\n scxmlEvent: SCXML.Event<TEvent>\n): State<TContext, TEvent, any> {\n const { machine } = currentState;\n // Transition will \"apply\" if:\n // - the state node is the initial state (there is no current state)\n // - OR there are transitions\n const willTransition = currentState._initial || transitions.length > 0;\n\n const mutConfiguration = new Set(currentState.configuration);\n\n if (!currentState._initial && !willTransition) {\n const inertState = cloneState(currentState, {\n _event: scxmlEvent,\n actions: [],\n transitions: []\n });\n\n inertState.changed = false;\n return inertState;\n }\n\n const microstate = microstepProcedure(\n currentState._initial\n ? [\n {\n target: [...currentState.configuration].filter(isAtomicStateNode),\n source: machine.root,\n external: true,\n actions: [],\n eventType: null as any,\n toJSON: null as any // TODO: fix\n }\n ]\n : transitions,\n currentState,\n mutConfiguration,\n scxmlEvent,\n actorCtx\n );\n\n const { context, actions: nonRaisedActions } = microstate;\n\n const children = setChildren(currentState, nonRaisedActions);\n\n const nextState = cloneState(microstate, {\n value: {}, // TODO: make optional\n transitions,\n children\n });\n\n nextState.changed = currentState._initial\n ? undefined\n : !stateValuesEqual(nextState.value, currentState.value) ||\n nextState.actions.length > 0 ||\n context !== currentState.context;\n\n return nextState;\n}\n\nfunction setChildren(\n currentState: AnyState,\n nonRaisedActions: BaseActionObject[]\n) {\n const children = { ...currentState.children };\n for (const action of nonRaisedActions) {\n if (\n action.type === actionTypes.invoke &&\n (action as InvokeActionObject).params.ref\n ) {\n const ref = (action as InvokeActionObject).params.ref;\n if (ref) {\n children[ref.id] = ref;\n }\n } else if (action.type === actionTypes.stop) {\n const ref = (action as StopActionObject).params.actor;\n if (ref) {\n delete children[ref.id];\n }\n }\n }\n return children;\n}\n\nfunction microstepProcedure(\n transitions: Array<AnyTransitionDefinition>,\n currentState: AnyState,\n mutConfiguration: Set<AnyStateNode>,\n scxmlEvent: SCXML.Event<AnyEventObject>,\n actorCtx: AnyActorContext | undefined\n): typeof currentState {\n const { machine } = currentState;\n const actions: BaseActionObject[] = [];\n const historyValue = {\n ...currentState.historyValue\n };\n\n const filteredTransitions = removeConflictingTransitions(\n transitions,\n mutConfiguration,\n historyValue\n );\n\n const internalQueue = [...currentState._internalQueue];\n\n // Exit states\n if (!currentState._initial) {\n exitStates(filteredTransitions, mutConfiguration, historyValue, actions);\n }\n\n // Execute transition content\n actions.push(...filteredTransitions.flatMap((t) => t.actions));\n\n // Enter states\n enterStates(\n filteredTransitions,\n mutConfiguration,\n actions,\n internalQueue,\n currentState,\n historyValue\n );\n\n const nextConfiguration = [...mutConfiguration];\n\n const done = isInFinalState(nextConfiguration);\n\n if (done) {\n const finalActions = nextConfiguration\n .sort((a, b) => b.order - a.order)\n .flatMap((state) => state.exit);\n actions.push(...finalActions);\n }\n\n try {\n const { nextState } = resolveActionsAndContext(\n actions,\n scxmlEvent,\n currentState,\n actorCtx\n );\n\n const output = done\n ? getOutput(nextConfiguration, nextState.context, scxmlEvent)\n : undefined;\n\n internalQueue.push(...nextState._internalQueue);\n\n return cloneState(currentState, {\n actions: nextState.actions,\n configuration: nextConfiguration,\n historyValue,\n _internalQueue: internalQueue,\n context: nextState.context,\n _event: scxmlEvent,\n done,\n output,\n children: nextState.children\n });\n } catch (e) {\n // TODO: Refactor this once proper error handling is implemented.\n // See https://github.com/statelyai/rfcs/pull/4\n if (machine.config.scxml) {\n return cloneState(currentState, {\n actions: [],\n configuration: Array.from(mutConfiguration),\n historyValue,\n _internalQueue: [toSCXMLEvent({ type: 'error.execution' })],\n context: currentState.context\n });\n } else {\n throw e;\n }\n }\n}\n\nfunction enterStates(\n filteredTransitions: AnyTransitionDefinition[],\n mutConfiguration: Set<AnyStateNode>,\n actions: BaseActionObject[],\n internalQueue: SCXML.Event<AnyEventObject>[],\n currentState: AnyState,\n historyValue: HistoryValue<any, any>\n): void {\n const statesToEnter = new Set<AnyStateNode>();\n const statesForDefaultEntry = new Set<AnyStateNode>();\n\n computeEntrySet(\n filteredTransitions,\n historyValue,\n statesForDefaultEntry,\n statesToEnter\n );\n\n // In the initial state, the root state node is \"entered\".\n if (currentState._initial) {\n statesForDefaultEntry.add(currentState.machine.root);\n }\n\n for (const stateNodeToEnter of [...statesToEnter].sort(\n (a, b) => a.order - b.order\n )) {\n mutConfiguration.add(stateNodeToEnter);\n\n for (const invokeDef of stateNodeToEnter.invoke) {\n actions.push(invoke(invokeDef));\n }\n\n // Add entry actions\n actions.push(...stateNodeToEnter.entry);\n\n if (statesForDefaultEntry.has(stateNodeToEnter)) {\n for (const stateNode of statesForDefaultEntry) {\n const initialActions = stateNode.initial!.actions;\n actions.push(...initialActions);\n }\n }\n if (stateNodeToEnter.type === 'final') {\n const parent = stateNodeToEnter.parent!;\n\n if (!parent.parent) {\n continue;\n }\n\n internalQueue.push(\n toSCXMLEvent(\n done(\n parent!.id,\n stateNodeToEnter.output\n ? mapContext(\n stateNodeToEnter.output,\n currentState.context,\n currentState._event\n )\n : undefined\n )\n )\n );\n\n if (parent.parent) {\n const grandparent = parent.parent;\n\n if (grandparent.type === 'parallel') {\n if (\n getChildren(grandparent).every((parentNode) =>\n isInFinalState([...mutConfiguration], parentNode)\n )\n ) {\n internalQueue.push(toSCXMLEvent(done(grandparent.id)));\n }\n }\n }\n }\n }\n}\n\nfunction computeEntrySet(\n transitions: Array<AnyTransitionDefinition>,\n historyValue: HistoryValue<any, any>,\n statesForDefaultEntry: Set<AnyStateNode>,\n statesToEnter: Set<AnyStateNode>\n) {\n for (const t of transitions) {\n for (const s of t.target || []) {\n addDescendantStatesToEnter(\n s,\n historyValue,\n statesForDefaultEntry,\n statesToEnter\n );\n }\n const ancestor = getTransitionDomain(t, historyValue);\n const targetStates = getEffectiveTargetStates(t, historyValue);\n for (const s of targetStates) {\n addAncestorStatesToEnter(\n s,\n ancestor,\n statesToEnter,\n historyValue,\n statesForDefaultEntry\n );\n }\n }\n}\n\nfunction addDescendantStatesToEnter<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n stateNode: AnyStateNode,\n historyValue: HistoryValue<any, any>,\n statesForDefaultEntry: Set<AnyStateNode>,\n statesToEnter: Set<AnyStateNode>\n) {\n if (isHistoryNode(stateNode)) {\n if (historyValue[stateNode.id]) {\n const historyStateNodes = historyValue[stateNode.id];\n for (const s of historyStateNodes) {\n addDescendantStatesToEnter(\n s,\n historyValue,\n statesForDefaultEntry,\n statesToEnter\n );\n }\n for (const s of historyStateNodes) {\n addAncestorStatesToEnter(\n s,\n stateNode.parent!,\n statesToEnter,\n historyValue,\n statesForDefaultEntry\n );\n for (const stateForDefaultEntry of statesForDefaultEntry) {\n statesForDefaultEntry.add(stateForDefaultEntry);\n }\n }\n } else {\n const targets = resolveHistoryTarget<TContext, TEvent>(stateNode);\n for (const s of targets) {\n addDescendantStatesToEnter(\n s,\n historyValue,\n statesForDefaultEntry,\n statesToEnter\n );\n }\n for (const s of targets) {\n addAncestorStatesToEnter(\n s,\n stateNode,\n statesToEnter,\n historyValue,\n statesForDefaultEntry\n );\n for (const stateForDefaultEntry of statesForDefaultEntry) {\n statesForDefaultEntry.add(stateForDefaultEntry);\n }\n }\n }\n } else {\n statesToEnter.add(stateNode);\n if (stateNode.type === 'compound') {\n statesForDefaultEntry.add(stateNode);\n const initialStates = stateNode.initial.target;\n\n for (const initialState of initialStates) {\n addDescendantStatesToEnter(\n initialState,\n historyValue,\n statesForDefaultEntry,\n statesToEnter\n );\n }\n\n for (const initialState of initialStates) {\n addAncestorStatesToEnter(\n initialState,\n stateNode,\n statesToEnter,\n historyValue,\n statesForDefaultEntry\n );\n }\n } else {\n if (stateNode.type === 'parallel') {\n for (const child of getChildren(stateNode).filter(\n (sn) => !isHistoryNode(sn)\n )) {\n if (![...statesToEnter].some((s) => isDescendant(s, child))) {\n addDescendantStatesToEnter(\n child,\n historyValue,\n statesForDefaultEntry,\n statesToEnter\n );\n }\n }\n }\n }\n }\n}\n\nfunction addAncestorStatesToEnter(\n stateNode: AnyStateNode,\n toStateNode: AnyStateNode | null,\n statesToEnter: Set<AnyStateNode>,\n historyValue: HistoryValue<any, any>,\n statesForDefaultEntry: Set<AnyStateNode>\n) {\n const properAncestors = getProperAncestors(stateNode, toStateNode);\n for (const anc of properAncestors) {\n statesToEnter.add(anc);\n if (anc.type === 'parallel') {\n for (const child of getChildren(anc).filter((sn) => !isHistoryNode(sn))) {\n if (![...statesToEnter].some((s) => isDescendant(s, child))) {\n addDescendantStatesToEnter(\n child,\n historyValue,\n statesForDefaultEntry,\n statesToEnter\n );\n }\n }\n }\n }\n}\n\nfunction exitStates(\n transitions: AnyTransitionDefinition[],\n mutConfiguration: Set<AnyStateNode>,\n historyValue: HistoryValue<any, any>,\n actions: BaseActionObject[]\n) {\n const statesToExit = computeExitSet(\n transitions,\n mutConfiguration,\n historyValue\n );\n\n statesToExit.sort((a, b) => b.order - a.order);\n\n // From SCXML algorithm: https://www.w3.org/TR/scxml/#exitStates\n for (const exitStateNode of statesToExit) {\n for (const historyNode of getHistoryNodes(exitStateNode)) {\n let predicate: (sn: AnyStateNode) => boolean;\n if (historyNode.history === 'deep') {\n predicate = (sn) =>\n isAtomicStateNode(sn) && isDescendant(sn, exitStateNode);\n } else {\n predicate = (sn) => {\n return sn.parent === exitStateNode;\n };\n }\n historyValue[historyNode.id] =\n Array.from(mutConfiguration).filter(predicate);\n }\n }\n\n for (const s of statesToExit) {\n actions.push(...s.exit.flat(), ...s.invoke.map((def) => stop(def.id)));\n mutConfiguration.delete(s);\n }\n}\n\nexport function resolveActionsAndContext<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n actions: BaseActionObject[],\n scxmlEvent: SCXML.Event<TEvent>,\n currentState: State<TContext, TEvent, any>,\n actorCtx: AnyActorContext | undefined\n): {\n nextState: AnyState;\n} {\n const { machine } = currentState;\n const resolvedActions: BaseActionObject[] = [];\n const raiseActions: Array<RaiseActionObject<TContext, TEvent>> = [];\n let intermediateState = currentState;\n\n function handleAction(action: BaseActionObject): void {\n resolvedActions.push(action);\n if (actorCtx?.self.status === ActorStatus.Running) {\n action.execute?.(actorCtx!);\n // TODO: this is hacky; re-evaluate\n delete action.execute;\n }\n }\n\n function resolveAction(actionObject: BaseActionObject) {\n const executableActionObject = resolveActionObject(\n actionObject,\n machine.options.actions\n );\n\n if (isDynamicAction(executableActionObject)) {\n const [nextState, resolvedAction] = executableActionObject.resolve(\n scxmlEvent,\n {\n state: intermediateState,\n action: actionObject,\n actorContext: actorCtx\n }\n );\n const matchedActions = resolvedAction.params?.actions;\n\n intermediateState = nextState;\n\n if (\n (resolvedAction.type === actionTypes.raise ||\n (resolvedAction.type === actionTypes.send &&\n (resolvedAction as SendActionObject).params.internal)) &&\n typeof (resolvedAction as any).params.delay !== 'number'\n ) {\n raiseActions.push(resolvedAction);\n }\n\n // TODO: remove the check; just handleAction\n if (resolvedAction.type !== actionTypes.pure) {\n handleAction(resolvedAction);\n }\n\n toActionObjects(matchedActions).forEach(resolveAction);\n\n return;\n }\n\n handleAction(executableActionObject);\n }\n\n for (const actionObject of actions) {\n resolveAction(actionObject);\n }\n\n return {\n nextState: cloneState(intermediateState, {\n actions: resolvedActions,\n _internalQueue: raiseActions.map((a) => a.params._event)\n })\n };\n}\n\nexport function macrostep<TMachine extends AnyStateMachine>(\n state: StateFromMachine<TMachine>,\n scxmlEvent: SCXML.Event<TMachine['__TEvent']>,\n actorCtx: AnyActorContext | undefined\n): {\n state: typeof state;\n microstates: Array<typeof state>;\n} {\n if (!IS_PRODUCTION && scxmlEvent.name === WILDCARD) {\n throw new Error(`An event cannot have the wildcard type ('${WILDCARD}')`);\n }\n\n let nextState = state;\n const states: StateFromMachine<TMachine>[] = [];\n\n // Handle stop event\n if (scxmlEvent?.name === stopSignalType) {\n nextState = stopStep(scxmlEvent, nextState, actorCtx);\n states.push(nextState);\n\n return {\n state: nextState,\n microstates: states\n };\n }\n\n // Assume the state is at rest (no raised events)\n // Determine the next state based on the next microstep\n if (scxmlEvent.name !== actionTypes.init) {\n const transitions = selectTransitions(scxmlEvent, nextState);\n nextState = microstep(transitions, state, actorCtx, scxmlEvent);\n states.push(nextState);\n }\n\n while (!nextState.done) {\n let enabledTransitions = selectEventlessTransitions(nextState);\n\n if (enabledTransitions.length === 0) {\n // TODO: this is a bit of a hack, we need to review this\n // this matches the behavior from v4 for eventless transitions\n // where for `hasAlwaysTransitions` we were always trying to resolve with a NULL event\n // and if a transition was not selected the `state.transitions` stayed empty\n // without this we get into an infinite loop in the dieHard test in `@xstate/test` for the `simplePathsTo`\n if (nextState.configuration.some((state) => state.always)) {\n nextState.transitions = [];\n }\n\n if (!nextState._internalQueue.length) {\n break;\n } else {\n const currentActions = nextState.actions;\n const nextEvent = nextState._internalQueue[0];\n const transitions = selectTransitions(nextEvent, nextState);\n nextState = microstep(transitions, nextState, actorCtx, nextEvent);\n nextState._internalQueue.shift();\n nextState.actions.unshift(...currentActions);\n\n states.push(nextState);\n }\n }\n\n if (enabledTransitions.length) {\n const currentActions = nextState.actions;\n nextState = microstep(\n enabledTransitions,\n nextState,\n actorCtx,\n nextState._event\n );\n nextState.actions.unshift(...currentActions);\n\n states.push(nextState);\n }\n }\n\n if (nextState.done) {\n // Perform the stop step to ensure that child actors are stopped\n stopStep(nextState._event, nextState, actorCtx);\n }\n\n return {\n state: nextState,\n microstates: states\n };\n}\n\nfunction stopStep(\n scxmlEvent: SCXML.Event<any>,\n nextState: AnyState,\n actorCtx: AnyActorContext | undefined\n): AnyState {\n const actions: BaseActionObject[] = [];\n\n for (const stateNode of nextState.configuration.sort(\n (a, b) => b.order - a.order\n )) {\n actions.push(...stateNode.exit);\n }\n\n for (const child of Object.values(nextState.children)) {\n actions.push(stop(child));\n }\n\n const { nextState: stoppedState } = resolveActionsAndContext(\n actions,\n scxmlEvent,\n nextState,\n actorCtx\n );\n\n return stoppedState;\n}\n\nfunction selectTransitions(\n scxmlEvent: SCXML.Event<any>,\n nextState: AnyState\n): AnyTransitionDefinition[] {\n return nextState.machine.getTransitionData(nextState, scxmlEvent);\n}\n\nfunction selectEventlessTransitions(\n nextState: AnyState\n): AnyTransitionDefinition[] {\n const enabledTransitionSet: Set<AnyTransitionDefinition> = new Set();\n const atomicStates = nextState.configuration.filter(isAtomicStateNode);\n\n for (const stateNode of atomicStates) {\n loop: for (const s of [stateNode].concat(\n getProperAncestors(stateNode, null)\n )) {\n if (!s.always) {\n continue;\n }\n for (const transition of s.always) {\n if (\n transition.guard === undefined ||\n evaluateGuard(\n transition.guard,\n nextState.context,\n nextState._event,\n nextState\n )\n ) {\n enabledTransitionSet.add(transition);\n break loop;\n }\n }\n }\n }\n\n return removeConflictingTransitions(\n Array.from(enabledTransitionSet),\n new Set(nextState.configuration),\n nextState.historyValue\n );\n}\n\n/**\n * Resolves a partial state value with its full representation in the state node's machine.\n *\n * @param stateValue The partial state value to resolve.\n */\nexport function resolveStateValue(\n rootNode: AnyStateNode,\n stateValue: StateValue\n): StateValue {\n const configuration = getConfiguration(getStateNodes(rootNode, stateValue));\n return getStateValue(rootNode, [...configuration]);\n}\n\nexport function stateValuesEqual(\n a: StateValue | undefined,\n b: StateValue | undefined\n): boolean {\n if (a === b) {\n return true;\n }\n\n if (a === undefined || b === undefined) {\n return false;\n }\n\n if (isString(a) || isString(b)) {\n return a === b;\n }\n\n const aKeys = Object.keys(a as StateValueMap);\n const bKeys = Object.keys(b as StateValueMap);\n\n return (\n aKeys.length === bKeys.length &&\n aKeys.every((key) => stateValuesEqual(a[key], b[key]))\n );\n}\n\nexport function getInitialConfiguration(\n rootNode: AnyStateNode\n): AnyStateNode[] {\n const configuration: AnyStateNode[] = [];\n const initialTransition = rootNode.initial;\n\n const statesToEnter = new Set<AnyStateNode>();\n const statesForDefaultEntry = new Set<AnyStateNode>([rootNode]);\n\n computeEntrySet(\n [initialTransition],\n {},\n statesForDefaultEntry,\n statesToEnter\n );\n\n for (const stateNodeToEnter of [...statesToEnter].sort(\n (a, b) => a.order - b.order\n )) {\n configuration.push(stateNodeToEnter);\n }\n\n return configuration;\n}\n","import { createInitEvent } from './actions.ts';\nimport { IS_PRODUCTION } from './environment.ts';\nimport { memo } from './memo.ts';\nimport type { StateNode } from './StateNode.ts';\nimport {\n getConfiguration,\n getStateNodes,\n getStateValue\n} from './stateUtils.ts';\nimport { TypegenDisabled, TypegenEnabled } from './typegenTypes.ts';\nimport type {\n ActorRef,\n AnyState,\n AnyStateMachine,\n BaseActionObject,\n EventObject,\n HistoryValue,\n MachineContext,\n PersistedMachineState,\n Prop,\n SCXML,\n StateConfig,\n StateValue,\n TransitionDefinition\n} from './types.ts';\nimport {\n flatten,\n isString,\n matchesState,\n toSCXMLEvent,\n warn\n} from './utils.ts';\n\nexport function isStateConfig<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(state: any): state is StateConfig<TContext, TEvent> {\n if (typeof state !== 'object' || state === null) {\n return false;\n }\n\n return 'value' in state && '_event' in state;\n}\n\n/**\n * @deprecated Use `isStateConfig(object)` or `state instanceof State` instead.\n */\nexport const isState = isStateConfig;\nexport class State<\n TContext extends MachineContext,\n TEvent extends EventObject = EventObject,\n TResolvedTypesMeta = TypegenDisabled\n> {\n public tags: Set<string>;\n\n public value: StateValue;\n /**\n * Indicates whether the state is a final state.\n */\n public done: boolean;\n /**\n * The done data of the top-level finite state.\n */\n public output: any; // TODO: add an explicit type for `output`\n public context: TContext;\n public historyValue: Readonly<HistoryValue<TContext, TEvent>> = {};\n public actions: BaseActionObject[] = [];\n public event: TEvent;\n public _internalQueue: Array<SCXML.Event<TEvent>>;\n public _event: SCXML.Event<TEvent>;\n public _initial: boolean = false;\n /**\n * Indicates whether the state has changed from the previous state. A state is considered \"changed\" if:\n *\n * - Its value is not equal to its previous value, or:\n * - It has any new actions (side-effects) to execute.\n *\n * An initial state (with no history) will return `undefined`.\n */\n public changed: boolean | undefined;\n /**\n * The enabled state nodes representative of the state value.\n */\n public configuration: Array<StateNode<TContext, TEvent>>;\n /**\n * The transition definitions that resulted in this state.\n */\n public transitions: Array<TransitionDefinition<TContext, TEvent>>;\n /**\n * An object mapping actor names to spawned/invoked actors.\n */\n public children: Record<string, ActorRef<any>>;\n /**\n * Creates a new State instance for the given `stateValue` and `context`.\n * @param stateValue\n * @param context\n */\n public static from<\n TContext extends MachineContext,\n TEvent extends EventObject = EventObject\n >(\n stateValue: State<TContext, TEvent, any> | StateValue,\n context: TContext = {} as TContext,\n machine: AnyStateMachine\n ): State<TContext, TEvent, any> {\n if (stateValue instanceof State) {\n if (stateValue.context !== context) {\n return new State<TContext, TEvent>(\n {\n value: stateValue.value,\n context,\n _event: stateValue._event,\n actions: [],\n meta: {},\n configuration: [], // TODO: fix,\n transitions: [],\n children: {}\n },\n machine\n );\n }\n\n return stateValue;\n }\n\n const _event = createInitEvent({}) as unknown as SCXML.Event<TEvent>; // TODO: fix\n\n const configuration = getConfiguration(\n getStateNodes(machine.root, stateValue)\n );\n\n return new State<TContext, TEvent>(\n {\n value: stateValue,\n context,\n _event,\n actions: [],\n meta: undefined,\n configuration: Array.from(configuration),\n transitions: [],\n children: {}\n },\n machine\n );\n }\n\n /**\n * Creates a new `State` instance that represents the current state of a running machine.\n *\n * @param config\n */\n constructor(\n config: StateConfig<TContext, TEvent>,\n public machine: AnyStateMachine\n ) {\n this.context = config.context;\n this._event = config._event;\n this._internalQueue = config._internalQueue ?? [];\n this.event = this._event.data;\n this.historyValue = config.historyValue || {};\n this.actions = config.actions ?? [];\n this.matches = this.matches.bind(this);\n this.toStrings = this.toStrings.bind(this);\n this.configuration =\n config.configuration ??\n Array.from(getConfiguration(getStateNodes(machine.root, config.value)));\n this.transitions = config.transitions as any;\n this.children = config.children;\n\n this.value = getStateValue(machine.root, this.configuration);\n this.tags = new Set(flatten(this.configuration.map((sn) => sn.tags)));\n this.done = config.done ?? false;\n this.output = config.output;\n }\n\n /**\n * Returns an array of all the string leaf state node paths.\n * @param stateValue\n * @param delimiter The character(s) that separate each subpath in the string state node path.\n */\n public toStrings(\n stateValue: StateValue = this.value,\n delimiter: string = '.'\n ): string[] {\n if (isString(stateValue)) {\n return [stateValue];\n }\n const valueKeys = Object.keys(stateValue);\n\n return valueKeys.concat(\n ...valueKeys.map((key) =>\n this.toStrings(stateValue[key], delimiter).map(\n (s) => key + delimiter + s\n )\n )\n );\n }\n\n public toJSON() {\n const { configuration, transitions, tags, machine, ...jsonValues } = this;\n\n return { ...jsonValues, tags: Array.from(tags), meta: this.meta };\n }\n\n /**\n * Whether the current state value is a subset of the given parent state value.\n * @param parentStateValue\n */\n public matches<\n TSV extends TResolvedTypesMeta extends TypegenEnabled\n ? Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'matchesStates'>\n : StateValue\n >(parentStateValue: TSV): boolean {\n return matchesState(parentStateValue as any, this.value);\n }\n\n /**\n * Whether the current state configuration has a state node with the specified `tag`.\n * @param tag\n */\n public hasTag(\n tag: TResolvedTypesMeta extends TypegenEnabled\n ? Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'tags'>\n : string\n ): boolean {\n return this.tags.has(tag as string);\n }\n\n /**\n * Determines whether sending the `event` will cause a non-forbidden transition\n * to be selected, even if the transitions have no actions nor\n * change the state value.\n *\n * @param event The event to test\n * @returns Whether the event will cause a transition\n */\n public can(event: TEvent): boolean {\n if (IS_PRODUCTION) {\n warn(\n !!this.machine,\n `state.can(...) used outside of a machine-created State object; this will always return false.`\n );\n }\n\n const transitionData = this.machine.getTransitionData(\n this,\n toSCXMLEvent(event)\n );\n\n return (\n !!transitionData?.length &&\n // Check that at least one transition is not forbidden\n transitionData.some((t) => t.target !== undefined || t.actions.length)\n );\n }\n\n /**\n * The next events that will cause a transition from the current state.\n */\n public get nextEvents(): Array<TEvent['type']> {\n return memo(this, 'nextEvents', () => {\n return [\n ...new Set(flatten([...this.configuration.map((sn) => sn.ownEvents)]))\n ];\n });\n }\n\n public get meta() {\n return this.configuration.reduce((acc, stateNode) => {\n if (stateNode.meta !== undefined) {\n acc[stateNode.id] = stateNode.meta;\n }\n return acc;\n }, {} as Record<string, any>);\n }\n}\n\nexport function cloneState<TState extends AnyState>(\n state: TState,\n config: Partial<StateConfig<any, any>> = {}\n): TState {\n return new State(\n { ...state, ...config } as StateConfig<any, any>,\n state.machine\n ) as TState;\n}\n\nexport function getPersistedState<TState extends AnyState>(\n state: TState\n): PersistedMachineState<TState> {\n const { configuration, transitions, tags, machine, children, ...jsonValues } =\n state;\n\n const childrenJson: Partial<PersistedMachineState<any>['children']> = {};\n\n for (const id in children) {\n childrenJson[id] = {\n state: children[id].getPersistedState?.(),\n src: children[id].src\n };\n }\n\n return {\n ...jsonValues,\n children: childrenJson\n } as PersistedMachineState<TState>;\n}\n","import { EventObject, InvokeDefinition, MachineContext } from '../types.ts';\nimport { invoke as invokeActionType } from '../actionTypes.ts';\nimport { isActorRef } from '../actors/index.ts';\nimport { createDynamicAction } from '../../actions/dynamicAction.ts';\nimport {\n AnyInterpreter,\n BaseDynamicActionObject,\n DynamicInvokeActionObject,\n InvokeActionObject\n} from '../index.ts';\nimport { actionTypes, error } from '../actions.ts';\nimport { resolveReferencedActor, warn } from '../utils.ts';\nimport { ActorStatus, interpret } from '../interpreter.ts';\nimport { cloneState } from '../State.ts';\nimport { IS_PRODUCTION } from '../environment.ts';\n\nexport function invoke<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject\n>(\n invokeDef: InvokeDefinition<TContext, TEvent>\n): BaseDynamicActionObject<\n TContext,\n TExpressionEvent,\n TEvent,\n InvokeActionObject,\n DynamicInvokeActionObject<TContext, TEvent>['params']\n> {\n return createDynamicAction(\n { type: invokeActionType, params: invokeDef },\n (_event, { state, actorContext }) => {\n const type = actionTypes.invoke;\n const { id, src } = invokeDef;\n\n let resolvedInvokeAction: InvokeActionObject;\n if (isActorRef(src)) {\n resolvedInvokeAction = {\n type,\n params: {\n ...invokeDef,\n ref: src\n }\n } as InvokeActionObject;\n } else {\n const referenced = resolveReferencedActor(\n state.machine.options.actors[src]\n );\n\n if (!referenced) {\n resolvedInvokeAction = {\n type,\n params: invokeDef\n } as InvokeActionObject;\n } else {\n const input =\n 'input' in invokeDef ? invokeDef.input : referenced.input;\n const ref = interpret(referenced.src, {\n id,\n src,\n parent: actorContext?.self,\n systemId: invokeDef.systemId,\n input:\n typeof input === 'function'\n ? input({\n context: state.context,\n event: _event.data as any,\n self: actorContext?.self\n })\n : input\n });\n\n resolvedInvokeAction = {\n type,\n params: {\n ...invokeDef,\n ref\n }\n } as InvokeActionObject;\n }\n }\n\n const actorRef = resolvedInvokeAction.params.ref!;\n const invokedState = cloneState(state, {\n children: {\n ...state.children,\n [id]: actorRef\n }\n });\n\n resolvedInvokeAction.execute = (actorCtx) => {\n const parent = actorCtx.self as AnyInterpreter;\n const { id, ref } = resolvedInvokeAction.params;\n if (!ref) {\n if (!IS_PRODUCTION) {\n warn(\n false,\n `Actor type '${resolvedInvokeAction.params.src}' not found in machine '${actorCtx.id}'.`\n );\n }\n return;\n }\n actorCtx.defer(() => {\n if (actorRef.status === ActorStatus.Stopped) {\n return;\n }\n try {\n actorRef.start?.();\n } catch (err) {\n parent.send(error(id, err));\n return;\n }\n });\n };\n\n return [invokedState, resolvedInvokeAction];\n }\n );\n}\n","import {\n InvokeActionObject,\n AnyStateMachine,\n Spawner,\n ActorRef,\n MachineContext,\n EventObject,\n SCXML\n} from './index.ts';\nimport { invoke } from './actions/invoke.ts';\nimport { interpret } from './interpreter.ts';\nimport { isString, resolveReferencedActor } from './utils.ts';\n\nexport function createSpawner<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n self: ActorRef<any, any> | undefined,\n machine: AnyStateMachine,\n context: TContext,\n _event: SCXML.Event<TEvent>,\n mutCapturedActions: InvokeActionObject[]\n): Spawner {\n return (src, options = {}) => {\n if (isString(src)) {\n const referenced = resolveReferencedActor(machine.options.actors[src]);\n\n if (referenced) {\n const resolvedName = options.id ?? 'anon'; // TODO: better name\n const input = 'input' in options ? options.input : referenced.input;\n\n // TODO: this should also receive `src`\n const actorRef = interpret(referenced.src, {\n id: resolvedName,\n parent: self,\n input:\n typeof input === 'function'\n ? input({\n context,\n event: _event.data,\n self\n })\n : input\n });\n\n mutCapturedActions.push(\n invoke({\n id: actorRef.id,\n // @ts-ignore TODO: fix types\n src: actorRef, // TODO\n ref: actorRef,\n meta: undefined,\n input\n }) as any as InvokeActionObject\n );\n\n return actorRef as any; // TODO: fix types\n }\n\n throw new Error(\n `Behavior '${src}' not implemented in machine '${machine.id}'`\n );\n } else {\n // TODO: this should also receive `src`\n // TODO: instead of anonymous, it should be a unique stable ID\n const actorRef = interpret(src, {\n id: options.id || 'anonymous',\n parent: self,\n input: options.input\n });\n\n mutCapturedActions.push(\n invoke({\n // @ts-ignore TODO: fix types\n src: actorRef,\n ref: actorRef,\n id: actorRef.id,\n meta: undefined,\n input: options.input\n }) as any as InvokeActionObject\n );\n\n return actorRef as any; // TODO: fix types\n }\n };\n}\n","import {\n Action,\n EventObject,\n SingleOrArray,\n ActionFunction,\n ActionFunctionMap,\n ActionTypes,\n DoneEvent,\n ErrorPlatformEvent,\n DoneEventObject,\n MachineContext,\n BaseActionObject,\n SCXML\n} from './types.ts';\nimport * as actionTypes from './actionTypes.ts';\nimport { toSCXMLEvent, isArray } from './utils.ts';\nimport {\n createDynamicAction,\n isDynamicAction\n} from '../actions/dynamicAction.ts';\nexport {\n send,\n sendTo,\n sendParent,\n respond,\n forwardTo,\n escalate\n} from './actions/send.ts';\n\nexport { stop } from './actions/stop.ts';\nexport { log } from './actions/log.ts';\nexport { cancel } from './actions/cancel.ts';\nexport { assign } from './actions/assign.ts';\nexport { raise } from './actions/raise.ts';\nexport { choose } from './actions/choose.ts';\nexport { actionTypes };\n\nexport const initEvent = toSCXMLEvent({ type: actionTypes.init });\n\nexport function resolveActionObject(\n actionObject: BaseActionObject,\n actionFunctionMap: ActionFunctionMap<any, any>\n): BaseActionObject {\n if (isDynamicAction(actionObject)) {\n return actionObject;\n }\n const dereferencedAction = actionFunctionMap[actionObject.type];\n\n if (typeof dereferencedAction === 'function') {\n return createDynamicAction(\n { type: 'xstate.function', params: actionObject.params ?? {} },\n (_event, { state }) => {\n const a: BaseActionObject = {\n type: actionObject.type,\n params: actionObject.params,\n execute: (actorCtx) => {\n return dereferencedAction({\n context: state.context,\n event: state.event,\n action: a,\n _event: state._event,\n system: actorCtx.system,\n self: actorCtx.self\n });\n }\n };\n\n return [state, a];\n }\n );\n } else if (dereferencedAction) {\n return dereferencedAction;\n } else {\n return actionObject;\n }\n}\n\nexport function toActionObject<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n action: BaseActionObject | ActionFunction<TContext, TEvent> | string\n): BaseActionObject {\n if (isDynamicAction(action)) {\n return action;\n }\n\n if (typeof action === 'string') {\n return { type: action, params: {} };\n }\n\n if (typeof action === 'function') {\n const type = 'xstate.function';\n return createDynamicAction({ type, params: {} }, (_event, { state }) => {\n const actionObject: BaseActionObject = {\n type,\n params: {\n function: action\n },\n execute: (actorCtx) => {\n return action({\n context: state.context as TContext,\n event: _event.data as TEvent,\n action: actionObject,\n _event: _event as SCXML.Event<TEvent>,\n self: actorCtx.self,\n system: actorCtx.system\n });\n }\n };\n\n return [state, actionObject];\n });\n }\n\n // action is already a BaseActionObject\n return action;\n}\n\nexport const toActionObjects = <\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n action?: SingleOrArray<Action<TContext, TEvent>>\n): BaseActionObject[] => {\n if (!action) {\n return [];\n }\n const actions = isArray(action) ? action : [action];\n return actions.map(toActionObject);\n};\n\n/**\n * Returns an event type that represents an implicit event that\n * is sent after the specified `delay`.\n *\n * @param delayRef The delay in milliseconds\n * @param id The state node ID where this event is handled\n */\nexport function after(delayRef: number | string, id?: string) {\n const idSuffix = id ? `#${id}` : '';\n return `${ActionTypes.After}(${delayRef})${idSuffix}`;\n}\n\n/**\n * Returns an event that represents that a final state node\n * has been reached in the parent state node.\n *\n * @param id The final state node's parent state node `id`\n * @param output The data to pass into the event\n */\nexport function done(id: string, output?: any): DoneEventObject {\n const type = `${ActionTypes.DoneState}.${id}`;\n const eventObject = {\n type,\n output\n };\n\n eventObject.toString = () => type;\n\n return eventObject as DoneEvent;\n}\n\n/**\n * Returns an event that represents that an invoked service has terminated.\n *\n * An invoked service is terminated when it has reached a top-level final state node,\n * but not when it is canceled.\n *\n * @param invokeId The invoked service ID\n * @param output The data to pass into the event\n */\nexport function doneInvoke(invokeId: string, output?: any): DoneEvent {\n const type = `${ActionTypes.DoneInvoke}.${invokeId}`;\n const eventObject = {\n type,\n output\n };\n\n eventObject.toString = () => type;\n\n return eventObject as DoneEvent;\n}\n\nexport function error(id: string, data?: any): ErrorPlatformEvent & string {\n const type = `${ActionTypes.ErrorPlatform}.${id}`;\n const eventObject = { type, data };\n\n eventObject.toString = () => type;\n\n return eventObject as ErrorPlatformEvent & string;\n}\n\nexport function createInitEvent(\n input: any\n): SCXML.Event<{ type: ActionTypes.Init; input: any }> {\n return toSCXMLEvent({ type: actionTypes.init, input });\n}\n","import type {\n EventObject,\n Assigner,\n PropertyAssigner,\n MachineContext,\n AssignActionObject,\n DynamicAssignAction,\n AssignMeta,\n InvokeActionObject,\n LowInfer\n} from '../types.ts';\nimport * as actionTypes from '../actionTypes.ts';\nimport { createDynamicAction } from '../../actions/dynamicAction.ts';\nimport { isFunction } from '../utils.ts';\nimport { createSpawner } from '../spawn.ts';\nimport { cloneState } from '../State.ts';\n\n/**\n * Updates the current context of the machine.\n *\n * @param assignment An object that represents the partial context to update.\n */\nexport function assign<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject = EventObject,\n TEvent extends EventObject = TExpressionEvent\n>(\n assignment:\n | Assigner<LowInfer<TContext>, TExpressionEvent, TEvent>\n | PropertyAssigner<LowInfer<TContext>, TExpressionEvent, TEvent>\n): DynamicAssignAction<TContext, TExpressionEvent, TEvent> {\n return createDynamicAction<\n TContext,\n TExpressionEvent,\n TEvent,\n AssignActionObject<TContext>,\n {\n assignment: typeof assignment;\n }\n >(\n {\n type: actionTypes.assign,\n params: {\n assignment\n }\n },\n (_event, { state, action, actorContext }) => {\n const capturedActions: InvokeActionObject[] = [];\n\n if (!state.context) {\n throw new Error(\n 'Cannot assign to undefined `context`. Ensure that `context` is defined in the machine config.'\n );\n }\n\n const args: AssignMeta<TExpressionEvent, TEvent> & {\n context: TContext;\n event: TExpressionEvent;\n } = {\n context: state.context,\n event: _event.data,\n action,\n _event,\n spawn: createSpawner(\n actorContext?.self,\n state.machine,\n state.context,\n _event,\n capturedActions\n ),\n self: actorContext?.self ?? ({} as any),\n system: actorContext?.system\n };\n\n let partialUpdate: Partial<TContext> = {};\n if (isFunction(assignment)) {\n partialUpdate = assignment(args);\n } else {\n for (const key of Object.keys(assignment)) {\n const propAssignment = assignment[key];\n partialUpdate[key as keyof TContext] = isFunction(propAssignment)\n ? propAssignment(args)\n : propAssignment;\n }\n }\n\n const updatedContext = Object.assign({}, state.context, partialUpdate);\n\n return [\n cloneState(state, {\n context: updatedContext\n }),\n {\n type: actionTypes.assign,\n params: {\n context: updatedContext,\n actions: capturedActions\n }\n } as AssignActionObject<TContext>\n ];\n }\n );\n}\n","import { EventObject, ExprWithMeta, MachineContext } from '../types.ts';\nimport { cancel as cancelActionType } from '../actionTypes.ts';\nimport { isFunction } from '../utils.ts';\nimport {\n AnyInterpreter,\n BaseDynamicActionObject,\n CancelActionObject,\n DynamicCancelActionObject\n} from '../index.ts';\nimport { createDynamicAction } from '../../actions/dynamicAction.ts';\n\n/**\n * Cancels an in-flight `send(...)` action. A canceled sent action will not\n * be executed, nor will its event be sent, unless it has already been sent\n * (e.g., if `cancel(...)` is called after the `send(...)` action's `delay`).\n *\n * @param sendId The `id` of the `send(...)` action to cancel.\n */\n\nexport function cancel<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject\n>(\n sendId: string | ExprWithMeta<TContext, TExpressionEvent, string>\n): BaseDynamicActionObject<\n TContext,\n TExpressionEvent,\n TEvent,\n CancelActionObject,\n DynamicCancelActionObject<TContext, TExpressionEvent>['params']\n> {\n return createDynamicAction(\n {\n type: cancelActionType,\n params: {\n sendId\n }\n },\n (_event, { state, actorContext }) => {\n const resolvedSendId = isFunction(sendId)\n ? sendId({\n context: state.context,\n event: _event.data,\n _event,\n self: actorContext?.self ?? ({} as any),\n system: actorContext?.system\n })\n : sendId;\n\n return [\n state,\n {\n type: 'xstate.cancel',\n params: {\n sendId: resolvedSendId\n },\n execute: (actorCtx) => {\n const interpreter = actorCtx.self as AnyInterpreter;\n\n interpreter.cancel(resolvedSendId);\n }\n } as CancelActionObject\n ];\n }\n );\n}\n","import { EventObject, ChooseCondition, MachineContext } from '../types.ts';\nimport * as actionTypes from '../actionTypes.ts';\nimport { createDynamicAction } from '../../actions/dynamicAction.ts';\nimport { evaluateGuard, toGuardDefinition } from '../guards.ts';\nimport {\n BaseDynamicActionObject,\n ChooseAction,\n ResolvedChooseAction\n} from '../index.ts';\nimport { toActionObjects } from '../actions.ts';\n\nexport function choose<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject\n>(\n guards: Array<ChooseCondition<TContext, TExpressionEvent>>\n): BaseDynamicActionObject<\n TContext,\n TExpressionEvent,\n TEvent,\n ResolvedChooseAction,\n ChooseAction<TContext, TExpressionEvent>['params']\n> {\n return createDynamicAction(\n { type: actionTypes.choose, params: { guards } },\n (_event, { state }) => {\n const matchedActions = guards.find((condition) => {\n const guard =\n condition.guard &&\n toGuardDefinition(\n condition.guard,\n (guardType) => state.machine.options.guards[guardType]\n );\n return !guard || evaluateGuard(guard, state.context, _event, state);\n })?.actions;\n\n return [\n state,\n {\n type: actionTypes.choose,\n params: {\n actions: toActionObjects(matchedActions)\n }\n }\n ];\n }\n );\n}\n","import { createDynamicAction } from '../../actions/dynamicAction.ts';\nimport * as actionTypes from '../actionTypes.ts';\nimport {\n EventObject,\n MachineContext,\n RaiseActionObject,\n BaseDynamicActionObject,\n RaiseActionOptions,\n SendExpr,\n AnyInterpreter,\n RaiseActionParams,\n NoInfer,\n UnifiedArg,\n StateMeta\n} from '../types.ts';\nimport { toSCXMLEvent } from '../utils.ts';\n\n/**\n * Raises an event. This places the event in the internal event queue, so that\n * the event is immediately consumed by the machine in the current step.\n *\n * @param eventType The event to raise.\n */\n\nexport function raise<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject = TExpressionEvent\n>(\n eventOrExpr:\n | NoInfer<TEvent>\n | SendExpr<TContext, TExpressionEvent, NoInfer<TEvent>>,\n options?: RaiseActionOptions<TContext, TExpressionEvent>\n): BaseDynamicActionObject<\n TContext,\n TExpressionEvent,\n TEvent,\n RaiseActionObject<TContext, TExpressionEvent, TEvent>,\n RaiseActionParams<TContext, TExpressionEvent, TEvent>\n> {\n return createDynamicAction(\n {\n type: actionTypes.raise,\n params: {\n delay: options ? options.delay : undefined,\n event: eventOrExpr,\n id:\n options && options.id !== undefined\n ? options.id\n : typeof eventOrExpr === 'function'\n ? eventOrExpr.name\n : eventOrExpr.type\n }\n },\n (_event, { state, actorContext }) => {\n const params = {\n delay: options ? options.delay : undefined,\n event: eventOrExpr,\n id:\n options && options.id !== undefined\n ? options.id\n : typeof eventOrExpr === 'function'\n ? eventOrExpr.name\n : eventOrExpr.type\n };\n const args: UnifiedArg<TContext, TExpressionEvent> &\n StateMeta<TExpressionEvent> = {\n context: state.context,\n event: _event.data,\n _event,\n self: actorContext?.self ?? ({} as any),\n system: actorContext?.system\n };\n const delaysMap = state.machine.options.delays;\n\n // TODO: helper function for resolving Expr\n const resolvedEvent = toSCXMLEvent(\n typeof eventOrExpr === 'function' ? eventOrExpr(args) : eventOrExpr\n );\n\n let resolvedDelay: number | undefined;\n if (typeof params.delay === 'string') {\n const configDelay = delaysMap && delaysMap[params.delay];\n resolvedDelay =\n typeof configDelay === 'function' ? configDelay(args) : configDelay;\n } else {\n resolvedDelay =\n typeof params.delay === 'function'\n ? params.delay(args)\n : params.delay;\n }\n\n const resolvedAction: RaiseActionObject<\n TContext,\n TExpressionEvent,\n TEvent\n > = {\n type: actionTypes.raise,\n params: {\n ...params,\n _event: resolvedEvent,\n event: resolvedEvent.data,\n delay: resolvedDelay\n },\n execute: (actorCtx) => {\n if (typeof resolvedAction.params.delay === 'number') {\n (actorCtx.self as AnyInterpreter).delaySend(resolvedAction);\n return;\n }\n }\n };\n\n return [state, resolvedAction];\n }\n );\n}\n","import { createDynamicAction } from '../../actions/dynamicAction.ts';\nimport { stop as stopActionType } from '../actionTypes.ts';\nimport { ActorStatus } from '../interpreter.ts';\nimport {\n ActorRef,\n AnyActorContext,\n BaseDynamicActionObject,\n DynamicStopActionObject,\n EventObject,\n Expr,\n MachineContext,\n StopActionObject\n} from '../types.ts';\nimport { isFunction } from '../utils.ts';\n\n/**\n * Stops an actor.\n *\n * @param actorRef The actor to stop.\n */\n\nexport function stop<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject\n>(\n actorRef:\n | string\n | ActorRef<any>\n | Expr<TContext, TExpressionEvent, ActorRef<any> | string>\n): BaseDynamicActionObject<\n TContext,\n TExpressionEvent,\n TEvent,\n StopActionObject,\n DynamicStopActionObject<TContext, TExpressionEvent>['params']\n> {\n const actor = actorRef;\n\n return createDynamicAction(\n {\n type: stopActionType,\n params: {\n actor\n }\n },\n (_event, { state }) => {\n const actorRefOrString = isFunction(actor)\n ? actor({ context: state.context, event: _event.data })\n : actor;\n const actorRef =\n typeof actorRefOrString === 'string'\n ? state.children[actorRefOrString]\n : actorRefOrString;\n\n return [\n state,\n {\n type: 'xstate.stop',\n params: { actor: actorRef },\n execute: (actorCtx: AnyActorContext) => {\n if (!actorRef) {\n return;\n }\n if (actorRef.status !== ActorStatus.Running) {\n actorCtx.stopChild(actorRef);\n return;\n }\n actorCtx.defer(() => {\n actorCtx.stopChild(actorRef);\n });\n }\n } as StopActionObject\n ];\n }\n );\n}\n"],"names":["ActionTypes","SpecialTargets","stop","Stop","raise","Raise","send","Send","cancel","Cancel","assign","Assign","after","After","doneState","DoneState","log","Log","init","Init","invoke","Invoke","errorExecution","ErrorExecution","errorPlatform","ErrorPlatform","error","ErrorCustom","choose","Choose","pure","Pure","matchesState","parentStateId","childStateId","delimiter","parentStateValue","toStateValue","childStateValue","isString","Object","keys","every","key","stateValue","_typeof","state","value","isArray","pathToStateValue","stateId","toString","split","e","Error","toStatePath","statePath","length","marker","i","flatten","array","concat","Array","isFunction","toSCXMLEvent","event","scxmlEvent","$$type","isSCXMLEvent","name","type","data","resolveReferencedActor","referenced","src","input","undefined","createDynamicAction","action","resolve","params","isDynamicAction","eventOrExpr","options","sendActionType","to","delay","id","_event","resolvedDelay","actorContext","args","context","self","system","delaysMap","machine","delays","resolvedEvent","configDelay","targetActorRef","resolvedTarget","Parent","_parent","Internal","startsWith","children","slice","resolvedAction","actionTypes","internal","execute","actorCtx","sendAction","target","defer","origin","delaySend","sendParent","Mailbox","_process","_classCallCheck","this","_defineProperty","_createClass","_active","flush","_current","next","_last","enqueue","enqueued","consumed","symbolObservable","Symbol","observable","stopSignalType","getDevTools","w","globalThis","window","__xstate__","ActorStatus","devToolsAdapter","service","devTools","register","defaultOptions","deferEvents","clock","setTimeout","fn","ms","clearTimeout","logger","console","bind","Interpreter","behavior","_this","Set","NotStarted","sessionIdCounter","keyedActors","reverseKeyedActors","resolvedOptions","parent","systemId","Map","WeakMap","_bookId","_register","sessionId","actorRef","set","_unregister","get","_set","existing","_systemId","ref","_actorContext","_deferred","push","stopChild","child","_stop","_initState","_state","restoreState","getInitialState","_this$options","deferredFn","snapshot","getSnapshot","shift","_step","observers","observer","_observer2$next","_iterator","status","getStatus","_this$behavior$getSta","_doneEvent","doneInvoke","_this$_parent","invokeid","_stopProcedure","_this$_parent2","_step2","_observer$error","_iterator2","nextListenerOrObserver","errorListener","completeListener","nextHandler","errorHandler","completionHandler","noop","isObserver","complete","toObserver","add","Stopped","_observer$complete","unsubscribe","_this2","listener","_this3","Running","start","update","attachDevTools","mailbox","nextState","transition","err","size","forEach","_observer$error2","clear","_step3","_observer3$complete","_iterator3","_complete","delayedEventsMap","JSON","stringify","_this4","sendId","getPersistedState","_this$behavior$getPer","interpret","defaultLogExpr","cache","evaluateGuard","guard","predicate","_machine$options","guards","_machine$options$guar2","evaluate","toGuardDefinition","guardConfig","getPredicate","_guardConfig$children","map","childGuard","getChildren","stateNode","values","states","filter","sn","getProperAncestors","toStateNode","ancestors","m","getConfiguration","stateNodes","configuration","configurationSet","adjList","getAdjList","s","has","getInitialStateNodes","initialStateNode","getValueFromAdj","baseNode","childStateNodes","childStateNode","_step4","_iterator4","_step5","_iterator5","getStateValue","rootNode","iter","descStateNode","_step7","initial","_step8","targetStateNode","a","_iterator8","_iterator7","_step9","_iterator9","getStateNode","stateKey","getStateNodeById","result","getStateNodes","State","childStateKeys","subStateKey","Boolean","root","reduce","allSubStateNodes","subStateNode","subStateNodes","config","_internalQueue","historyValue","actions","matches","toStrings","from","transitions","tags","done","output","valueKeys","meta","tag","transitionData","getTransitionData","some","t","object","memoizedData","ownEvents","acc","createInitEvent","cloneState","invokeDef","invokeActionType","resolvedInvokeAction","item","actors","invokedState","_actorRef$start","createSpawner","mutCapturedActions","resolvedName","initEvent","toActionObject","actionObject","function","toActionObjects","invokeId","DoneInvoke","eventObject","delayRef","idSuffix","assignment","capturedActions","spawn","partialUpdate","propAssignment","updatedContext","cancelActionType","resolvedSendId","matchedActions","find","condition","guardType","_guards$find","errorData","arg","process","env","NODE_END","originalTarget","expr","label","logActionType","resolvedValue","_actorCtx$logger","_actorCtx$logger2","actionFunctionMap","dereferencedAction","actor","stopActionType","actorRefOrString"],"mappings":"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"}
1
+ {"version":3,"file":"xstate-actions.umd.min.js","sources":["../../src/types.ts","../../src/actionTypes.ts","../../src/utils.ts","../../src/constants.ts","../dynamicAction.ts","../../src/actions/send.ts","../../src/Mailbox.ts","../../src/symbolObservable.ts","../../src/actors/index.ts","../../src/dev/index.ts","../../src/interpreter.ts","../../src/system.ts","../../src/actions/log.ts","../../src/memo.ts","../../src/guards.ts","../../src/stateUtils.ts","../../src/State.ts","../../src/actions/invoke.ts","../../src/spawn.ts","../../src/actions.ts","../../src/actions/assign.ts","../../src/actions/cancel.ts","../../src/actions/choose.ts","../../src/actions/raise.ts","../../src/actions/stop.ts"],"sourcesContent":["import type { StateNode } from './StateNode.ts';\nimport type { State } from './State.ts';\nimport type { ActorStatus, Clock, Interpreter } from './interpreter.ts';\nimport type { StateMachine } from './StateMachine.ts';\nimport type { LifecycleSignal } from './actors/index.ts';\nimport {\n TypegenDisabled,\n ResolveTypegenMeta,\n TypegenConstraint,\n MarkAllImplementationsAsProvided,\n AreAllImplementationsAssumedToBeProvided\n} from './typegenTypes.ts';\n\nexport type AnyFunction = (...args: any[]) => any;\n\ntype ReturnTypeOrValue<T> = T extends AnyFunction ? ReturnType<T> : T;\n\n// https://github.com/microsoft/TypeScript/issues/23182#issuecomment-379091887\nexport type IsNever<T> = [T] extends [never] ? true : false;\n\nexport type Compute<A extends any> = { [K in keyof A]: A[K] } & unknown;\nexport type Prop<T, K> = K extends keyof T ? T[K] : never;\nexport type Values<T> = T[keyof T];\nexport type Merge<M, N> = Omit<M, keyof N> & N;\n// TODO: replace in v5 with:\n// export type IndexByType<T extends { type: string }> = { [E in T as E['type']]: E; };\nexport type IndexByType<T extends { type: string }> = {\n [K in T['type']]: T extends any ? (K extends T['type'] ? T : never) : never;\n};\n\nexport type Equals<A1 extends any, A2 extends any> = (<A>() => A extends A2\n ? true\n : false) extends <A>() => A extends A1 ? true : false\n ? true\n : false;\nexport type IsAny<T> = Equals<T, any>;\nexport type Cast<A, B> = A extends B ? A : B;\nexport type NoInfer<T> = [T][T extends any ? 0 : any];\nexport type LowInfer<T> = T & {};\n\nexport type EventType = string;\nexport type ActionType = string;\nexport type MetaObject = Record<string, any>;\n\nexport type Lazy<T> = () => T;\nexport type MaybeLazy<T> = T | Lazy<T>;\n\n/**\n * The full definition of an event, with a string `type`.\n */\nexport interface EventObject {\n /**\n * The type of event that is sent.\n */\n type: string;\n}\n\nexport interface AnyEventObject extends EventObject {\n [key: string]: any;\n}\n\nexport interface ParameterizedObject {\n type: string;\n params?: Record<string, any>;\n}\n\nexport interface BaseActionObject extends ParameterizedObject {\n execute?: (actorCtx: AnyActorContext) => void;\n}\n\nexport interface BuiltInActionObject extends ParameterizedObject {\n type: `xstate.${string}`;\n params: Record<string, any>;\n}\n\nexport interface UnifiedArg<\n TContext extends MachineContext,\n TEvent extends EventObject\n> {\n context: TContext;\n event: TEvent;\n}\n\nexport interface BaseDynamicActionObject<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject,\n TResolvedAction extends BaseActionObject,\n TDynamicParams extends Record<string, any>\n> {\n type: `xstate.${string}`;\n params: TDynamicParams;\n resolve: (\n _event: SCXML.Event<TExpressionEvent>,\n extra: {\n state: State<TContext, TEvent>;\n /**\n * The original action object\n */\n action: ParameterizedObject;\n actorContext: AnyActorContext | undefined;\n }\n ) => [AnyState, TResolvedAction];\n\n /** @deprecated an internal signature that doesn't exist at runtime. Its existence helps TS to choose a better code path in the inference algorithm */\n (\n args: {\n context: TContext;\n event: TExpressionEvent;\n } & ActionMeta<TEvent, ParameterizedObject>\n ): void;\n}\n\nexport type MachineContext = Record<string, any>;\n\nexport interface ActionMeta<\n TEvent extends EventObject,\n TAction extends ParameterizedObject = ParameterizedObject\n> extends StateMeta<TEvent> {\n action: TAction;\n _event: SCXML.Event<TEvent>;\n}\n\n// TODO: do not accept machines without all implementations\n// we should also accept a raw machine as a behavior here\n// or just make machine a behavior\nexport type Spawner = <T extends ActorBehavior<any, any> | string>( // TODO: read string from machine behavior keys\n behavior: T,\n options?: Partial<{\n id: string;\n input: any;\n }>\n) => T extends ActorBehavior<infer TActorEvent, infer TActorEmitted>\n ? ActorRef<TActorEvent, TActorEmitted>\n : ActorRef<any, any>; // TODO: narrow this to behaviors from machine\n\nexport interface AssignMeta<\n TExpressionEvent extends EventObject,\n _TEvent extends EventObject\n> extends StateMeta<TExpressionEvent> {\n action: BaseActionObject;\n _event: SCXML.Event<TExpressionEvent>;\n spawn: Spawner;\n}\n\nexport type ActionFunction<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TAction extends ParameterizedObject = ParameterizedObject,\n TEvent extends EventObject = TExpressionEvent\n> = (\n args: {\n context: TContext;\n event: TExpressionEvent;\n } & ActionMeta<TEvent, TAction>\n) => void;\n\nexport interface ChooseCondition<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject = TExpressionEvent\n> {\n guard?: GuardConfig<TContext, TEvent>;\n actions: Actions<TContext, TExpressionEvent, TEvent>;\n}\n\nexport type Action<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject = TExpressionEvent\n> =\n | ActionType\n | ParameterizedObject\n | ActionFunction<TContext, TExpressionEvent, ParameterizedObject, TEvent>\n | BaseDynamicActionObject<TContext, TExpressionEvent, TEvent, any, any>; // TODO: fix last param\n\n/**\n * Extracts action objects that have no extra properties.\n */\ntype SimpleActionsFrom<T extends ParameterizedObject> =\n ParameterizedObject extends T\n ? T // If actions are unspecified, all action types are allowed (unsafe)\n : ExtractWithSimpleSupport<T>;\n\nexport type BaseAction<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TAction extends ParameterizedObject,\n TEvent extends EventObject\n> =\n | BaseDynamicActionObject<\n TContext,\n TExpressionEvent,\n TEvent,\n any, // TODO: at the very least this should include TAction, but probably at a covariant position or something, we really need to rethink how action objects are typed\n any\n >\n | TAction\n | SimpleActionsFrom<TAction>['type']\n | ActionFunction<TContext, TExpressionEvent, TAction, TEvent>;\n\nexport type BaseActions<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject,\n TAction extends ParameterizedObject\n> = SingleOrArray<BaseAction<TContext, TExpressionEvent, TAction, TEvent>>;\n\nexport type Actions<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject = TExpressionEvent\n> = SingleOrArray<Action<TContext, TEvent>>;\n\nexport type StateKey = string | AnyState;\n\nexport interface StateValueMap {\n [key: string]: StateValue;\n}\n\n/**\n * The string or object representing the state value relative to the parent state node.\n *\n * - For a child atomic state node, this is a string, e.g., `\"pending\"`.\n * - For complex state nodes, this is an object, e.g., `{ success: \"someChildState\" }`.\n */\nexport type StateValue = string | StateValueMap;\n\nexport type GuardPredicate<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = (\n args: {\n context: TContext;\n event: TEvent;\n } & GuardMeta<TContext, TEvent>\n) => boolean;\n\nexport interface DefaultGuardObject<\n TContext extends MachineContext,\n TEvent extends EventObject\n> extends ParameterizedObject {\n /**\n * Nested guards\n */\n children?: Array<GuardObject<TContext, TEvent>>;\n predicate?: GuardPredicate<TContext, TEvent>;\n}\n\nexport type GuardEvaluator<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = (\n guard: GuardDefinition<TContext, TEvent>,\n context: TContext,\n _event: SCXML.Event<TEvent>,\n state: State<TContext, TEvent>\n) => boolean;\n\nexport interface GuardMeta<\n TContext extends MachineContext,\n TEvent extends EventObject\n> {\n state: State<TContext, TEvent, any>;\n _event: SCXML.Event<TEvent>;\n guard: GuardDefinition<TContext, TEvent>;\n evaluate: GuardEvaluator<TContext, TEvent>;\n}\n\nexport type GuardConfig<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = string | GuardPredicate<TContext, TEvent> | GuardObject<TContext, TEvent>;\n\nexport type GuardObject<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = BooleanGuardObject<TContext, TEvent> | DefaultGuardObject<TContext, TEvent>;\n\nexport interface GuardDefinition<\n TContext extends MachineContext,\n TEvent extends EventObject\n> {\n type: string;\n children?: Array<GuardDefinition<TContext, TEvent>>;\n predicate?: GuardPredicate<TContext, TEvent>;\n params: { [key: string]: any };\n}\n\nexport interface BooleanGuardObject<\n TContext extends MachineContext,\n TEvent extends EventObject\n> extends ParameterizedObject {\n type: 'xstate.boolean';\n children: Array<GuardConfig<TContext, TEvent>>;\n params: {\n op: 'and' | 'or' | 'not';\n };\n predicate: undefined;\n}\n\nexport interface BooleanGuardDefinition<\n TContext extends MachineContext,\n TEvent extends EventObject\n> extends GuardDefinition<TContext, TEvent> {\n type: 'xstate.boolean';\n params: {\n op: 'and' | 'or' | 'not';\n };\n}\n\nexport type TransitionTarget = SingleOrArray<string>;\n\nexport interface TransitionConfig<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject = TExpressionEvent,\n TAction extends ParameterizedObject = ParameterizedObject\n> {\n guard?: GuardConfig<TContext, TExpressionEvent>;\n actions?: BaseActions<TContext, TExpressionEvent, TEvent, TAction>;\n reenter?: boolean;\n target?: TransitionTarget | undefined;\n meta?: Record<string, any>;\n description?: string;\n}\n\nexport interface TargetTransitionConfig<\n TContext extends MachineContext,\n TEvent extends EventObject\n> extends TransitionConfig<TContext, TEvent> {\n target: TransitionTarget; // TODO: just make this non-optional\n}\n\nexport type ConditionalTransitionConfig<\n TContext extends MachineContext,\n TEvent extends EventObject = EventObject\n> = Array<TransitionConfig<TContext, TEvent>>;\n\nexport interface InitialTransitionConfig<\n TContext extends MachineContext,\n TEvent extends EventObject\n> extends TransitionConfig<TContext, TEvent> {\n guard?: never;\n target: TransitionTarget;\n}\n\nexport type Transition<\n TContext extends MachineContext,\n TEvent extends EventObject = EventObject\n> =\n | string\n | TransitionConfig<TContext, TEvent>\n | ConditionalTransitionConfig<TContext, TEvent>;\n\ntype ExtractWithSimpleSupport<T extends { type: string }> = T extends any\n ? { type: T['type'] } extends T\n ? T\n : never\n : never;\n\nexport type Receiver<TEvent extends EventObject> = (\n listener: {\n bivarianceHack(event: TEvent): void;\n }['bivarianceHack']\n) => void;\n\nexport type InvokeCallback<\n TEvent extends EventObject = AnyEventObject,\n TSentEvent extends EventObject = AnyEventObject\n> = (\n sendBack: (event: TSentEvent) => void,\n onReceive: Receiver<TEvent>,\n { input }: { input: any }\n) => (() => void) | Promise<any> | void;\n\nexport type ActorBehaviorCreator<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TActorBehavior extends AnyActorBehavior = AnyActorBehavior\n> = (\n context: TContext,\n event: TEvent,\n meta: {\n id: string;\n data?: any;\n src: string;\n _event: SCXML.Event<TEvent>;\n meta: MetaObject | undefined;\n input: any;\n }\n) => TActorBehavior;\n\nexport interface InvokeMeta {\n src: string;\n meta: MetaObject | undefined;\n}\n\nexport interface InvokeDefinition<\n TContext extends MachineContext,\n TEvent extends EventObject\n> {\n id: string;\n\n systemId: string | undefined;\n /**\n * The source of the actor's behavior to be invoked\n */\n src: string;\n\n input?: Mapper<TContext, TEvent, any> | any;\n /**\n * The transition to take upon the invoked child machine reaching its final top-level state.\n */\n onDone?:\n | string\n | SingleOrArray<TransitionConfig<TContext, DoneInvokeEvent<any>>>;\n /**\n * The transition to take upon the invoked child machine sending an error event.\n */\n onError?: string | SingleOrArray<TransitionConfig<TContext, ErrorEvent<any>>>;\n\n onSnapshot?:\n | string\n | SingleOrArray<TransitionConfig<TContext, SnapshotEvent<any>>>;\n\n toJSON: () => Omit<\n InvokeDefinition<TContext, TEvent>,\n 'onDone' | 'onError' | 'toJSON'\n >;\n meta: MetaObject | undefined;\n}\n\nexport interface Delay {\n id: string;\n /**\n * The time to delay the event, in milliseconds.\n */\n delay: number;\n}\n\nexport type DelayedTransitions<\n TContext extends MachineContext,\n TEvent extends EventObject\n> =\n | Record<\n string | number,\n string | SingleOrArray<TransitionConfig<TContext, TEvent>>\n >\n | Array<\n TransitionConfig<TContext, TEvent> & {\n delay: number | string | Expr<TContext, TEvent, number>;\n }\n >;\n\nexport type StateTypes =\n | 'atomic'\n | 'compound'\n | 'parallel'\n | 'final'\n | 'history'\n | string; // TODO: remove once TS fixes this type-widening issue\n\nexport type SingleOrArray<T> = T[] | T;\n\nexport type StateNodesConfig<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = {\n [K in string]: StateNode<TContext, TEvent>;\n};\n\nexport type StatesConfig<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TAction extends ParameterizedObject = ParameterizedObject\n> = {\n [K in string]: StateNodeConfig<TContext, TEvent, TAction>;\n};\n\nexport type StatesDefinition<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = {\n [K in string]: StateNodeDefinition<TContext, TEvent>;\n};\n\nexport type TransitionConfigTarget = string | undefined;\n\nexport type TransitionConfigOrTarget<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject = TExpressionEvent\n> = SingleOrArray<\n TransitionConfigTarget | TransitionConfig<TContext, TExpressionEvent, TEvent>\n>;\n\nexport type TransitionsConfigMap<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = {\n [K in TEvent['type'] | '' | '*']?: K extends '' | '*'\n ? TransitionConfigOrTarget<TContext, TEvent>\n : TransitionConfigOrTarget<TContext, ExtractEvent<TEvent, K>, TEvent>;\n};\n\ntype TransitionsConfigArray<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = Array<\n // distribute the union\n | (TEvent extends EventObject\n ? TransitionConfig<TContext, TEvent> & { event: TEvent['type'] }\n : never)\n | (TransitionConfig<TContext, TEvent> & { event: '*' })\n>;\n\nexport type TransitionsConfig<\n TContext extends MachineContext,\n TEvent extends EventObject\n> =\n | TransitionsConfigMap<TContext, TEvent>\n | TransitionsConfigArray<TContext, TEvent>;\n\nexport interface InvokeConfig<\n TContext extends MachineContext,\n TEvent extends EventObject\n> {\n /**\n * The unique identifier for the invoked machine. If not specified, this\n * will be the machine's own `id`, or the URL (from `src`).\n */\n id?: string;\n\n systemId?: string;\n /**\n * The source of the machine to be invoked, or the machine itself.\n */\n src: string | ActorBehavior<any, any>; // TODO: fix types\n\n input?: Mapper<TContext, TEvent, any> | any;\n /**\n * The transition to take upon the invoked child machine reaching its final top-level state.\n */\n onDone?:\n | string\n | SingleOrArray<\n TransitionConfigOrTarget<TContext, DoneInvokeEvent<any>, TEvent>\n >;\n /**\n * The transition to take upon the invoked child machine sending an error event.\n */\n onError?:\n | string\n | SingleOrArray<\n TransitionConfigOrTarget<TContext, ErrorEvent<any>, TEvent>\n >;\n\n onSnapshot?:\n | string\n | SingleOrArray<\n TransitionConfigOrTarget<TContext, SnapshotEvent<any>, TEvent>\n >;\n /**\n * Meta data related to this invocation\n */\n meta?: MetaObject;\n}\n\nexport interface StateNodeConfig<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TAction extends ParameterizedObject = ParameterizedObject\n> {\n /**\n * The initial state transition.\n */\n initial?:\n | InitialTransitionConfig<TContext, TEvent>\n | SingleOrArray<string>\n | undefined;\n /**\n * The type of this state node:\n *\n * - `'atomic'` - no child state nodes\n * - `'compound'` - nested child state nodes (XOR)\n * - `'parallel'` - orthogonal nested child state nodes (AND)\n * - `'history'` - history state node\n * - `'final'` - final state node\n */\n type?: 'atomic' | 'compound' | 'parallel' | 'final' | 'history';\n /**\n * Indicates whether the state node is a history state node, and what\n * type of history:\n * shallow, deep, true (shallow), false (none), undefined (none)\n */\n history?: 'shallow' | 'deep' | boolean | undefined;\n /**\n * The mapping of state node keys to their state node configurations (recursive).\n */\n states?: StatesConfig<TContext, TEvent, TAction> | undefined;\n /**\n * The services to invoke upon entering this state node. These services will be stopped upon exiting this state node.\n */\n invoke?: SingleOrArray<string | InvokeConfig<TContext, TEvent>>;\n /**\n * The mapping of event types to their potential transition(s).\n */\n on?: TransitionsConfig<TContext, TEvent>;\n /**\n * The action(s) to be executed upon entering the state node.\n */\n entry?: BaseActions<TContext, TEvent, TEvent, TAction>;\n /**\n * The action(s) to be executed upon exiting the state node.\n */\n exit?: BaseActions<TContext, TEvent, TEvent, TAction>;\n /**\n * The potential transition(s) to be taken upon reaching a final child state node.\n *\n * This is equivalent to defining a `[done(id)]` transition on this state node's `on` property.\n */\n onDone?:\n | string\n | SingleOrArray<TransitionConfig<TContext, DoneEventObject>>\n | undefined;\n /**\n * The mapping (or array) of delays (in milliseconds) to their potential transition(s).\n * The delayed transitions are taken after the specified delay in an interpreter.\n */\n after?: DelayedTransitions<TContext, TEvent>;\n\n /**\n * An eventless transition that is always taken when this state node is active.\n */\n always?: TransitionConfigOrTarget<TContext, TEvent>;\n /**\n * @private\n */\n parent?: StateNode<TContext, TEvent>;\n /**\n * The meta data associated with this state node, which will be returned in State instances.\n */\n meta?: any;\n /**\n * The output data sent with the \"done.state._id_\" event if this is a final state node.\n *\n * The output data will be evaluated with the current `context` and placed on the `.data` property\n * of the event.\n */\n output?:\n | Mapper<TContext, TEvent, any>\n | PropertyMapper<TContext, TEvent, any>;\n /**\n * The unique ID of the state node, which can be referenced as a transition target via the\n * `#id` syntax.\n */\n id?: string | undefined;\n /**\n * The string delimiter for serializing the path to a string. The default is \".\"\n */\n delimiter?: string;\n /**\n * The order this state node appears. Corresponds to the implicit SCXML document order.\n */\n order?: number;\n\n /**\n * The tags for this state node, which are accumulated into the `state.tags` property.\n */\n tags?: SingleOrArray<string>;\n /**\n * A text description of the state node\n */\n description?: string;\n\n /**\n * A default target for a history state\n */\n target?: string;\n}\n\nexport interface StateNodeDefinition<\n TContext extends MachineContext,\n TEvent extends EventObject\n> {\n id: string;\n version?: string | undefined;\n key: string;\n type: 'atomic' | 'compound' | 'parallel' | 'final' | 'history';\n initial: InitialTransitionDefinition<TContext, TEvent> | undefined;\n history: boolean | 'shallow' | 'deep' | undefined;\n states: StatesDefinition<TContext, TEvent>;\n on: TransitionDefinitionMap<TContext, TEvent>;\n transitions: Array<TransitionDefinition<TContext, TEvent>>;\n entry: BaseActionObject[];\n exit: BaseActionObject[];\n meta: any;\n order: number;\n output?: FinalStateNodeConfig<TContext, TEvent>['output'];\n invoke: Array<InvokeDefinition<TContext, TEvent>>;\n description?: string;\n tags: string[];\n}\n\nexport interface StateMachineDefinition<\n TContext extends MachineContext,\n TEvent extends EventObject\n> extends StateNodeDefinition<TContext, TEvent> {\n context: TContext;\n}\n\nexport type AnyStateNode = StateNode<any, any>;\n\nexport type AnyStateNodeDefinition = StateNodeDefinition<any, any>;\n\nexport type AnyState = State<any, any, any>;\n\nexport type AnyStateMachine = StateMachine<any, any, any, any, any>;\n\nexport type AnyStateConfig = StateConfig<any, AnyEventObject>;\n\nexport interface AtomicStateNodeConfig<\n TContext extends MachineContext,\n TEvent extends EventObject\n> extends StateNodeConfig<TContext, TEvent> {\n initial?: undefined;\n parallel?: false | undefined;\n states?: undefined;\n onDone?: undefined;\n}\n\nexport interface HistoryStateNodeConfig<\n TContext extends MachineContext,\n TEvent extends EventObject\n> extends AtomicStateNodeConfig<TContext, TEvent> {\n history: 'shallow' | 'deep' | true;\n target: string | undefined;\n}\n\nexport interface FinalStateNodeConfig<\n TContext extends MachineContext,\n TEvent extends EventObject\n> extends AtomicStateNodeConfig<TContext, TEvent> {\n type: 'final';\n /**\n * The data to be sent with the \"done.state.<id>\" event. The data can be\n * static or dynamic (based on assigners).\n */\n output?:\n | Mapper<TContext, TEvent, any>\n | PropertyMapper<TContext, TEvent, any>;\n}\n\nexport type SimpleOrStateNodeConfig<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = AtomicStateNodeConfig<TContext, TEvent> | StateNodeConfig<TContext, TEvent>;\n\nexport type ActionFunctionMap<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TAction extends ParameterizedObject = ParameterizedObject\n> = {\n [K in TAction['type']]?:\n | BaseDynamicActionObject<TContext, TEvent, TEvent, TAction, any>\n | ActionFunction<\n TContext,\n TEvent,\n TAction extends { type: K } ? TAction : never\n >;\n};\n\nexport type DelayFunctionMap<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = Record<string, DelayConfig<TContext, TEvent>>;\n\nexport type DelayConfig<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = number | DelayExpr<TContext, TEvent>;\n\n// TODO: possibly refactor this somehow, use even a simpler type, and maybe even make `machine.options` private or something\nexport interface MachineImplementationsSimplified<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TAction extends ParameterizedObject = ParameterizedObject\n> {\n guards: Record<string, GuardPredicate<TContext, TEvent>>;\n actions: ActionFunctionMap<TContext, TEvent, TAction>;\n actors: Record<\n string,\n | AnyActorBehavior\n | { src: AnyActorBehavior; input: Mapper<TContext, TEvent, any> | any }\n >;\n delays: DelayFunctionMap<TContext, TEvent>;\n}\n\ntype MachineImplementationsActions<\n TContext extends MachineContext,\n TResolvedTypesMeta,\n TEventsCausingActions = Prop<\n Prop<TResolvedTypesMeta, 'resolved'>,\n 'eventsCausingActions'\n >,\n TIndexedEvents = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedEvents'>\n> = {\n [K in keyof TEventsCausingActions]?:\n | BaseDynamicActionObject<\n TContext,\n Cast<Prop<TIndexedEvents, TEventsCausingActions[K]>, EventObject>,\n Cast<Prop<TIndexedEvents, keyof TIndexedEvents>, EventObject>,\n any, // TODO: this should receive something like `Cast<Prop<TIndexedActions, K>, ParameterizedObject>`, but at the moment builtin actions expect Resolved*Action here and this should be simplified somehow\n any\n >\n | ActionFunction<\n TContext,\n Cast<Prop<TIndexedEvents, TEventsCausingActions[K]>, EventObject>,\n ParameterizedObject, // TODO: when bringing back parametrized actions this should accept something like `Cast<Prop<TIndexedActions, K>, ParameterizedObject>`. At the moment we need to keep this type argument consistent with what is provided to the fake callable signature within `BaseDynamicActionObject`\n Cast<Prop<TIndexedEvents, keyof TIndexedEvents>, EventObject>\n >;\n};\n\ntype MachineImplementationsDelays<\n TContext extends MachineContext,\n TResolvedTypesMeta,\n TEventsCausingDelays = Prop<\n Prop<TResolvedTypesMeta, 'resolved'>,\n 'eventsCausingDelays'\n >,\n TIndexedEvents = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedEvents'>\n> = {\n [K in keyof TEventsCausingDelays]?: DelayConfig<\n TContext,\n Cast<Prop<TIndexedEvents, TEventsCausingDelays[K]>, EventObject>\n >;\n};\n\ntype MachineImplementationsGuards<\n TContext extends MachineContext,\n TResolvedTypesMeta,\n TEventsCausingGuards = Prop<\n Prop<TResolvedTypesMeta, 'resolved'>,\n 'eventsCausingGuards'\n >,\n TIndexedEvents = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedEvents'>\n> = {\n [K in keyof TEventsCausingGuards]?: GuardPredicate<\n TContext,\n Cast<Prop<TIndexedEvents, TEventsCausingGuards[K]>, EventObject>\n >;\n};\n\ntype MachineImplementationsActors<\n TContext extends MachineContext,\n TResolvedTypesMeta,\n TEventsCausingActors = Prop<\n Prop<TResolvedTypesMeta, 'resolved'>,\n 'eventsCausingActors'\n >,\n TIndexedEvents = Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'indexedEvents'>,\n _TInvokeSrcNameMap = Prop<\n Prop<TResolvedTypesMeta, 'resolved'>,\n 'invokeSrcNameMap'\n >\n> = {\n // TODO: this should require `{ src, input }` for required inputs\n [K in keyof TEventsCausingActors]?:\n | AnyActorBehavior\n | {\n src: AnyActorBehavior;\n input:\n | Mapper<\n TContext,\n Cast<Prop<TIndexedEvents, TEventsCausingActors[K]>, EventObject>,\n any\n >\n | any;\n };\n};\n\ntype MakeKeysRequired<T extends string> = { [K in T]: unknown };\n\ntype MaybeMakeMissingImplementationsRequired<\n TImplementationType,\n TMissingImplementationsForType,\n TRequireMissingImplementations\n> = TRequireMissingImplementations extends true\n ? IsNever<TMissingImplementationsForType> extends true\n ? {}\n : {\n [K in Cast<TImplementationType, string>]: MakeKeysRequired<\n Cast<TMissingImplementationsForType, string>\n >;\n }\n : {};\n\ntype GenerateActionsImplementationsPart<\n TContext extends MachineContext,\n TResolvedTypesMeta,\n TRequireMissingImplementations,\n TMissingImplementations\n> = MaybeMakeMissingImplementationsRequired<\n 'actions',\n Prop<TMissingImplementations, 'actions'>,\n TRequireMissingImplementations\n> & {\n actions?: MachineImplementationsActions<TContext, TResolvedTypesMeta>;\n};\n\ntype GenerateDelaysImplementationsPart<\n TContext extends MachineContext,\n TResolvedTypesMeta,\n TRequireMissingImplementations,\n TMissingImplementations\n> = MaybeMakeMissingImplementationsRequired<\n 'delays',\n Prop<TMissingImplementations, 'delays'>,\n TRequireMissingImplementations\n> & {\n delays?: MachineImplementationsDelays<TContext, TResolvedTypesMeta>;\n};\n\ntype GenerateGuardsImplementationsPart<\n TContext extends MachineContext,\n TResolvedTypesMeta,\n TRequireMissingImplementations,\n TMissingImplementations\n> = MaybeMakeMissingImplementationsRequired<\n 'guards',\n Prop<TMissingImplementations, 'guards'>,\n TRequireMissingImplementations\n> & {\n guards?: MachineImplementationsGuards<TContext, TResolvedTypesMeta>;\n};\n\ntype GenerateActorsImplementationsPart<\n TContext extends MachineContext,\n TResolvedTypesMeta,\n TRequireMissingImplementations,\n TMissingImplementations\n> = MaybeMakeMissingImplementationsRequired<\n 'actors',\n Prop<TMissingImplementations, 'actors'>,\n TRequireMissingImplementations\n> & {\n actors?: MachineImplementationsActors<TContext, TResolvedTypesMeta>;\n};\n\nexport type InternalMachineImplementations<\n TContext extends MachineContext,\n _TEvent extends EventObject,\n TResolvedTypesMeta,\n TRequireMissingImplementations extends boolean = false,\n TMissingImplementations = Prop<\n Prop<TResolvedTypesMeta, 'resolved'>,\n 'missingImplementations'\n >\n> = GenerateActionsImplementationsPart<\n TContext,\n TResolvedTypesMeta,\n TRequireMissingImplementations,\n TMissingImplementations\n> &\n GenerateDelaysImplementationsPart<\n TContext,\n TResolvedTypesMeta,\n TRequireMissingImplementations,\n TMissingImplementations\n > &\n GenerateGuardsImplementationsPart<\n TContext,\n TResolvedTypesMeta,\n TRequireMissingImplementations,\n TMissingImplementations\n > &\n GenerateActorsImplementationsPart<\n TContext,\n TResolvedTypesMeta,\n TRequireMissingImplementations,\n TMissingImplementations\n >;\n\nexport type MachineImplementations<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TAction extends ParameterizedObject = ParameterizedObject,\n TActorMap extends ActorMap = ActorMap,\n TTypesMeta extends TypegenConstraint = TypegenDisabled\n> = InternalMachineImplementations<\n TContext,\n TEvent,\n ResolveTypegenMeta<TTypesMeta, TEvent, TAction, TActorMap>\n>;\n\ntype InitialContext<TContext extends MachineContext> =\n | TContext\n | ContextFactory<TContext>;\n\nexport type ContextFactory<TContext extends MachineContext> = ({\n spawn,\n input\n}: {\n spawn: Spawner;\n input: any; // TODO: fix\n}) => TContext;\n\nexport interface MachineConfig<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TAction extends ParameterizedObject = ParameterizedObject,\n TActorMap extends ActorMap = ActorMap,\n TTypesMeta = TypegenDisabled\n> extends StateNodeConfig<NoInfer<TContext>, NoInfer<TEvent>, TAction> {\n /**\n * The initial context (extended state)\n */\n context?: InitialContext<LowInfer<TContext>>;\n /**\n * The machine's own version.\n */\n version?: string;\n /**\n * If `true`, will use SCXML semantics, such as event token matching.\n */\n scxml?: boolean;\n schema?: MachineSchema<TContext, TEvent, TActorMap>;\n tsTypes?: TTypesMeta;\n}\n\nexport type ActorMap = Record<string, { output: any }>;\nexport interface MachineSchema<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TActorMap extends ActorMap = ActorMap\n> {\n context?: TContext;\n actions?: { type: string; [key: string]: any };\n actors?: TActorMap;\n events?: TEvent;\n guards?: { type: string; [key: string]: any };\n}\n\nexport interface HistoryStateNode<TContext extends MachineContext>\n extends StateNode<TContext> {\n history: 'shallow' | 'deep';\n target: string | undefined;\n}\n\nexport type HistoryValue<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = Record<string, Array<StateNode<TContext, TEvent>>>;\n\nexport type AnyHistoryValue = HistoryValue<any, any>;\n\nexport type StateFrom<\n T extends AnyStateMachine | ((...args: any[]) => AnyStateMachine)\n> = T extends AnyStateMachine\n ? ReturnType<T['transition']>\n : T extends (...args: any[]) => AnyStateMachine\n ? ReturnType<ReturnType<T>['transition']>\n : never;\n\nexport type Transitions<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = Array<TransitionDefinition<TContext, TEvent>>;\n\nexport enum ActionTypes {\n Stop = 'xstate.stop',\n Raise = 'xstate.raise',\n Send = 'xstate.send',\n Cancel = 'xstate.cancel',\n Assign = 'xstate.assign',\n After = 'xstate.after',\n DoneState = 'done.state',\n DoneInvoke = 'done.invoke',\n Log = 'xstate.log',\n Init = 'xstate.init',\n Invoke = 'xstate.invoke',\n ErrorExecution = 'error.execution',\n ErrorCommunication = 'error.communication',\n ErrorPlatform = 'error.platform',\n ErrorCustom = 'xstate.error',\n Pure = 'xstate.pure',\n Choose = 'xstate.choose'\n}\n\nexport interface RaiseActionObject<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject = TExpressionEvent\n> extends BaseActionObject {\n type: ActionTypes.Raise;\n params: {\n event: TEvent;\n _event: SCXML.Event<TEvent>;\n delay: RaiseActionOptions<TContext, TExpressionEvent>['delay'];\n id: string | number;\n };\n}\n\nexport interface DoneInvokeEvent<TData> extends EventObject {\n type: `done.invoke.${string}`;\n output: TData;\n}\n\nexport interface ErrorEvent<TErrorData> {\n type: `error.${string}`;\n data: TErrorData;\n}\n\nexport interface SnapshotEvent<TData> {\n type: `xstate.snapshot.${string}`;\n data: TData;\n}\n\nexport interface ErrorExecutionEvent extends EventObject {\n src: string;\n type: ActionTypes.ErrorExecution;\n data: any;\n}\n\nexport interface ErrorPlatformEvent extends EventObject {\n data: any;\n}\n\nexport interface SCXMLErrorEvent extends SCXML.Event<any> {\n name:\n | ActionTypes.ErrorExecution\n | ActionTypes.ErrorPlatform\n | ActionTypes.ErrorCommunication;\n data: any;\n}\n\nexport interface DoneEventObject extends EventObject {\n output?: any;\n toString(): string;\n}\n\nexport type DoneEvent = DoneEventObject & string;\n\nexport interface InvokeAction {\n type: ActionTypes.Invoke;\n src: string | ActorRef<any>;\n id: string;\n exec?: undefined;\n meta: MetaObject | undefined;\n}\n\nexport interface DynamicInvokeActionObject<\n TContext extends MachineContext,\n TEvent extends EventObject\n> {\n type: ActionTypes.Invoke;\n params: InvokeDefinition<TContext, TEvent>;\n}\n\nexport interface InvokeActionObject extends BaseActionObject {\n type: ActionTypes.Invoke;\n params: {\n src: string | ActorRef<any>;\n id: string;\n exec?: undefined;\n ref?: ActorRef<any>;\n meta: MetaObject | undefined;\n };\n}\n\nexport interface DynamicStopActionObject<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject\n> {\n type: ActionTypes.Stop;\n params: {\n actor:\n | string\n | ActorRef<any>\n | Expr<TContext, TExpressionEvent, ActorRef<any> | string>;\n };\n}\n\nexport interface StopActionObject {\n type: ActionTypes.Stop;\n params: {\n actor: ActorRef<any>;\n };\n}\n\nexport type DelayExpr<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = ExprWithMeta<TContext, TEvent, number>;\n\nexport type LogExpr<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = ExprWithMeta<TContext, TEvent, any>;\n\nexport interface DynamicLogAction<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject\n> extends BaseDynamicActionObject<\n TContext,\n TExpressionEvent,\n TEvent,\n LogActionObject,\n {\n label: string | undefined;\n expr: string | LogExpr<TContext, TExpressionEvent>;\n }\n > {\n type: ActionTypes.Log;\n}\n\nexport interface LogActionObject extends BuiltInActionObject {\n type: ActionTypes.Log;\n params: {\n label: string | undefined;\n value: any;\n };\n}\n\nexport interface SendActionObject<\n TSentEvent extends EventObject = AnyEventObject\n> extends BaseActionObject {\n type: 'xstate.send';\n params: {\n to: ActorRef<TSentEvent> | undefined;\n _event: SCXML.Event<TSentEvent>;\n event: TSentEvent;\n delay?: number;\n id: string | number;\n internal: boolean;\n };\n}\n\nexport type Expr<\n TContext extends MachineContext,\n TEvent extends EventObject,\n T\n> = (arg: UnifiedArg<TContext, TEvent>) => T;\n\nexport type ExprWithMeta<\n TContext extends MachineContext,\n TEvent extends EventObject,\n T\n> = (args: UnifiedArg<TContext, TEvent> & StateMeta<TEvent>) => T;\n\nexport type SendExpr<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TSentEvent extends EventObject = AnyEventObject\n> = ExprWithMeta<TContext, TEvent, TSentEvent>;\n\nexport enum SpecialTargets {\n Parent = '#_parent',\n Internal = '#_internal'\n}\n\nexport interface SendActionOptions<\n TContext extends MachineContext,\n TEvent extends EventObject\n> extends RaiseActionOptions<TContext, TEvent> {\n to?:\n | string\n | ActorRef<any, any>\n | ExprWithMeta<TContext, TEvent, string | ActorRef<any, any>>;\n}\n\nexport interface RaiseActionOptions<\n TContext extends MachineContext,\n TEvent extends EventObject\n> {\n id?: string | number;\n delay?: number | string | DelayExpr<TContext, TEvent>;\n}\n\nexport interface RaiseActionParams<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject\n> extends RaiseActionOptions<TContext, TExpressionEvent> {\n event: TEvent | SendExpr<TContext, TExpressionEvent, TEvent>;\n}\n\nexport interface SendActionParams<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TSentEvent extends EventObject = EventObject\n> extends SendActionOptions<TContext, TEvent> {\n event: TSentEvent | SendExpr<TContext, TEvent, TSentEvent>;\n}\n\nexport interface DynamicCancelActionObject<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject\n> {\n type: ActionTypes.Cancel;\n params: {\n sendId: string | ExprWithMeta<TContext, TExpressionEvent, string>;\n };\n}\n\nexport interface CancelActionObject extends BaseActionObject {\n type: ActionTypes.Cancel;\n params: {\n sendId: string;\n };\n}\n\nexport type Assigner<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject = TExpressionEvent\n> = (\n args: {\n context: TContext;\n event: TExpressionEvent;\n } & AssignMeta<TExpressionEvent, TEvent>\n) => Partial<TContext>;\n\nexport type PartialAssigner<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject,\n TKey extends keyof TContext\n> = (\n args: {\n context: TContext;\n event: TExpressionEvent;\n } & AssignMeta<TExpressionEvent, TEvent>\n) => TContext[TKey];\n\nexport type PropertyAssigner<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject = TExpressionEvent\n> = {\n [K in keyof TContext]?:\n | PartialAssigner<TContext, TExpressionEvent, TEvent, K>\n | TContext[K];\n};\n\nexport type Mapper<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TParams extends {}\n> = (args: { context: TContext; event: TEvent }) => TParams;\n\nexport type PropertyMapper<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TParams extends {}\n> = {\n [K in keyof TParams]?:\n | ((args: { context: TContext; event: TEvent }) => TParams[K])\n | TParams[K];\n};\n\nexport interface AnyAssignAction extends BaseActionObject {\n type: ActionTypes.Assign;\n assignment: any;\n}\n\nexport type DynamicAssignAction<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject = TExpressionEvent\n> = BaseDynamicActionObject<\n TContext,\n TExpressionEvent,\n TEvent,\n AssignActionObject<TContext> | RaiseActionObject<TContext, TExpressionEvent>,\n {\n assignment:\n | Assigner<TContext, TExpressionEvent, TEvent>\n | PropertyAssigner<TContext, TExpressionEvent, TEvent>;\n }\n>;\n\nexport interface AssignActionObject<TContext extends MachineContext>\n extends BaseActionObject {\n type: ActionTypes.Assign;\n params: {\n context: TContext;\n actions: BaseActionObject[];\n };\n}\n\nexport interface DynamicPureActionObject<\n TContext extends MachineContext,\n TEvent extends EventObject\n> {\n type: ActionTypes.Pure;\n params: {\n get: (args: {\n context: TContext;\n event: TEvent;\n }) =>\n | SingleOrArray<BaseActionObject | BaseActionObject['type']>\n | undefined;\n };\n}\n\nexport interface PureActionObject extends BaseActionObject {\n type: ActionTypes.Pure;\n params: {\n actions: BaseActionObject[];\n };\n}\n\nexport interface ChooseAction<\n TContext extends MachineContext,\n TEvent extends EventObject\n> extends BaseActionObject {\n type: ActionTypes.Choose;\n params: {\n guards: Array<ChooseCondition<TContext, TEvent>>;\n };\n}\n\nexport interface ResolvedChooseAction extends BaseActionObject {\n type: ActionTypes.Choose;\n params: {\n actions: BaseActionObject[];\n };\n}\n\nexport interface TransitionDefinition<\n TContext extends MachineContext,\n TEvent extends EventObject\n> extends Omit<TransitionConfig<TContext, TEvent>, 'target'> {\n target: Array<StateNode<TContext, TEvent>> | undefined;\n source: StateNode<TContext, TEvent>;\n actions: BaseActionObject[];\n reenter: boolean;\n guard?: GuardDefinition<TContext, TEvent>;\n eventType: TEvent['type'] | '*';\n toJSON: () => {\n target: string[] | undefined;\n source: string;\n actions: BaseActionObject[];\n guard?: GuardDefinition<TContext, TEvent>;\n eventType: TEvent['type'] | '*';\n meta?: Record<string, any>;\n };\n}\n\nexport type AnyTransitionDefinition = TransitionDefinition<any, any>;\n\nexport interface InitialTransitionDefinition<\n TContext extends MachineContext,\n TEvent extends EventObject\n> extends TransitionDefinition<TContext, TEvent> {\n target: Array<StateNode<TContext, TEvent>>;\n guard?: never;\n}\n\nexport type TransitionDefinitionMap<\n TContext extends MachineContext,\n TEvent extends EventObject\n> = {\n [K in TEvent['type'] | '*']: Array<\n TransitionDefinition<\n TContext,\n K extends TEvent['type'] ? Extract<TEvent, { type: K }> : EventObject\n >\n >;\n};\n\nexport interface DelayedTransitionDefinition<\n TContext extends MachineContext,\n TEvent extends EventObject\n> extends TransitionDefinition<TContext, TEvent> {\n delay: number | string | DelayExpr<TContext, TEvent>;\n}\n\nexport interface Edge<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TEventType extends TEvent['type'] = string\n> {\n event: TEventType;\n source: StateNode<TContext, TEvent>;\n target: StateNode<TContext, TEvent>;\n cond?: GuardConfig<TContext, TEvent & { type: TEventType }>;\n actions: Array<Action<TContext, TEvent>>;\n meta?: MetaObject;\n transition: TransitionDefinition<TContext, TEvent>;\n}\nexport interface NodesAndEdges<\n TContext extends MachineContext,\n TEvent extends EventObject\n> {\n nodes: StateNode[];\n edges: Array<Edge<TContext, TEvent, TEvent['type']>>;\n}\n\nexport interface Segment<\n TContext extends MachineContext,\n TEvent extends EventObject\n> {\n /**\n * From state.\n */\n state: State<TContext, TEvent>;\n /**\n * Event from state.\n */\n event: TEvent;\n}\n\nexport interface StateMeta<TEvent extends EventObject> {\n _event: SCXML.Event<TEvent>;\n self: ActorRef<TEvent>;\n system: ActorSystem<any>;\n}\n\nexport interface StateLike<TContext extends MachineContext> {\n value: StateValue;\n context: TContext;\n event: EventObject;\n _event: SCXML.Event<EventObject>;\n}\n\nexport interface StateConfig<\n TContext extends MachineContext,\n TEvent extends EventObject\n> {\n value: StateValue;\n context: TContext;\n _event: SCXML.Event<TEvent>;\n historyValue?: HistoryValue<TContext, TEvent>;\n actions?: BaseActionObject[];\n meta?: any;\n configuration?: Array<StateNode<TContext, TEvent>>;\n transitions?: Array<TransitionDefinition<TContext, TEvent>>;\n children: Record<string, ActorRef<any>>;\n done?: boolean;\n output?: any;\n tags?: Set<string>;\n machine?: StateMachine<TContext, TEvent, any, any, any>;\n _internalQueue?: Array<SCXML.Event<TEvent>>;\n}\n\nexport interface InterpreterOptions<_TActorBehavior extends AnyActorBehavior> {\n /**\n * Whether state actions should be executed immediately upon transition. Defaults to `true`.\n */\n execute?: boolean;\n clock?: Clock;\n logger?: (...args: any[]) => void;\n parent?: ActorRef<any>;\n /**\n * If `true`, defers processing of sent events until the service\n * is initialized (`.start()`). Otherwise, an error will be thrown\n * for events sent to an uninitialized service.\n *\n * Default: `true`\n */\n deferEvents?: boolean;\n /**\n * The custom `id` for referencing this service.\n */\n id?: string;\n /**\n * If `true`, states and events will be logged to Redux DevTools.\n *\n * Default: `false`\n */\n devTools?: boolean | DevToolsAdapter; // TODO: add enhancer options\n\n sync?: boolean;\n\n /**\n * The system ID to register this actor under\n */\n systemId?: string;\n /**\n * The input data to pass to the actor.\n */\n input?: any;\n\n // state?:\n // | PersistedStateFrom<TActorBehavior>\n // | InternalStateFrom<TActorBehavior>;\n state?: any;\n\n /**\n * The source definition.\n */\n src?: string;\n}\n\nexport type AnyInterpreter = Interpreter<any>;\n\nexport declare namespace SCXML {\n // tslint:disable-next-line:no-shadowed-variable\n export interface Event<TEvent extends EventObject> {\n /**\n * This is a character string giving the name of the event.\n * The SCXML Processor must set the name field to the name of this event.\n * It is what is matched against the 'event' attribute of <transition>.\n * Note that transitions can do additional tests by using the value of this field\n * inside boolean expressions in the 'cond' attribute.\n */\n name: string;\n /**\n * This field describes the event type.\n * The SCXML Processor must set it to: \"platform\" (for events raised by the platform itself, such as error events),\n * \"internal\" (for events raised by <raise> and <send> with target '_internal')\n * or \"external\" (for all other events).\n */\n type: 'platform' | 'internal' | 'external';\n /**\n * If the sending entity has specified a value for this, the Processor must set this field to that value\n * (see C Event I/O Processors for details).\n * Otherwise, in the case of error events triggered by a failed attempt to send an event,\n * the Processor must set this field to the send id of the triggering <send> element.\n * Otherwise it must leave it blank.\n */\n sendid?: string;\n /**\n * This is a URI, equivalent to the 'target' attribute on the <send> element.\n * For external events, the SCXML Processor should set this field to a value which,\n * when used as the value of 'target', will allow the receiver of the event to <send>\n * a response back to the originating entity via the Event I/O Processor specified in 'origintype'.\n * For internal and platform events, the Processor must leave this field blank.\n */\n origin?: ActorRef<any>;\n /**\n * This is equivalent to the 'type' field on the <send> element.\n * For external events, the SCXML Processor should set this field to a value which,\n * when used as the value of 'type', will allow the receiver of the event to <send>\n * a response back to the originating entity at the URI specified by 'origin'.\n * For internal and platform events, the Processor must leave this field blank.\n */\n origintype?: string;\n /**\n * If this event is generated from an invoked child process, the SCXML Processor\n * must set this field to the invoke id of the invocation that triggered the child process.\n * Otherwise it must leave it blank.\n */\n invokeid?: string;\n /**\n * This field contains whatever data the sending entity chose to include in this event.\n * The receiving SCXML Processor should reformat this data to match its data model,\n * but must not otherwise modify it.\n *\n * If the conversion is not possible, the Processor must leave the field blank\n * and must place an error 'error.execution' in the internal event queue.\n */\n data: TEvent;\n /**\n * @private\n */\n $$type: 'scxml';\n }\n}\n\n// Based on RxJS types\nexport type Observer<T> = {\n next?: (value: T) => void;\n error?: (err: any) => void;\n complete?: () => void;\n};\n\nexport interface Subscription {\n unsubscribe(): void;\n}\n\nexport interface InteropObservable<T> {\n [Symbol.observable]: () => InteropSubscribable<T>;\n}\n\nexport interface InteropSubscribable<T> {\n subscribe(observer: Observer<T>): Subscription;\n}\n\nexport interface Subscribable<T> extends InteropSubscribable<T> {\n subscribe(observer: Observer<T>): Subscription;\n subscribe(\n next: (value: T) => void,\n error?: (error: any) => void,\n complete?: () => void\n ): Subscription;\n}\n\n// TODO: should only take in behaviors\nexport type Spawnable =\n | AnyStateMachine\n | PromiseLike<any>\n | InvokeCallback\n | InteropObservable<any>\n | Subscribable<any>\n | ActorBehavior<any, any>;\n\nexport type ExtractEvent<\n TEvent extends EventObject,\n TEventType extends TEvent['type']\n> = TEvent extends any\n ? TEventType extends TEvent['type']\n ? TEvent\n : never\n : never;\n\nexport interface BaseActorRef<TEvent extends EventObject> {\n send: (event: TEvent) => void;\n}\n\nexport interface ActorLike<TCurrent, TEvent extends EventObject>\n extends Subscribable<TCurrent> {\n send: (event: TEvent) => void;\n}\n\nexport interface ActorRef<TEvent extends EventObject, TSnapshot = any>\n extends Subscribable<TSnapshot>,\n InteropObservable<TSnapshot> {\n /**\n * The unique identifier for this actor relative to its parent.\n */\n id: string;\n sessionId: string;\n send: (event: TEvent) => void;\n // TODO: should this be optional?\n start?: () => void;\n getSnapshot: () => TSnapshot | undefined;\n // TODO: this should return some sort of TPersistedState, not any\n getPersistedState?: () => any;\n stop: () => void;\n toJSON?: () => any;\n // TODO: figure out how to hide this externally as `sendTo(ctx => ctx.actorRef._parent._parent._parent._parent)` shouldn't be allowed\n _parent?: ActorRef<any, any>;\n system?: ActorSystem<any>;\n status: ActorStatus;\n src?: string;\n}\n\nexport type AnyActorRef = ActorRef<any, any>;\n\nexport type ActorRefFrom<T> = ReturnTypeOrValue<T> extends infer R\n ? R extends StateMachine<\n infer TContext,\n infer TEvent,\n any,\n any,\n infer TResolvedTypesMeta\n >\n ? ActorRef<\n TEvent,\n State<\n TContext,\n TEvent,\n AreAllImplementationsAssumedToBeProvided<TResolvedTypesMeta> extends false\n ? MarkAllImplementationsAsProvided<TResolvedTypesMeta>\n : TResolvedTypesMeta\n >\n >\n : R extends Promise<infer U>\n ? ActorRef<{ type: string }, U | undefined>\n : R extends ActorBehavior<infer TEvent, infer TSnapshot>\n ? ActorRef<TEvent, TSnapshot>\n : never\n : never;\n\nexport type DevToolsAdapter = (service: AnyInterpreter) => void;\n\nexport type InterpreterFrom<\n T extends AnyStateMachine | ((...args: any[]) => AnyStateMachine)\n> = ReturnTypeOrValue<T> extends StateMachine<\n infer TContext,\n infer TEvent,\n any,\n any,\n infer TResolvedTypesMeta\n>\n ? Interpreter<\n ActorBehavior<\n TEvent,\n State<TContext, TEvent, TResolvedTypesMeta>,\n State<TContext, TEvent, TResolvedTypesMeta>,\n PersistedMachineState<State<TContext, TEvent, TResolvedTypesMeta>>\n >\n >\n : never;\n\nexport type MachineImplementationsFrom<\n T extends AnyStateMachine | ((...args: any[]) => AnyStateMachine),\n TRequireMissingImplementations extends boolean = false\n> = ReturnTypeOrValue<T> extends StateMachine<\n infer TContext,\n infer TEvent,\n any,\n any,\n infer TResolvedTypesMeta\n>\n ? InternalMachineImplementations<\n TContext,\n TEvent,\n TResolvedTypesMeta,\n TRequireMissingImplementations\n >\n : never;\n\n// only meant to be used internally for debugging purposes\nexport type __ResolvedTypesMetaFrom<T> = T extends StateMachine<\n any,\n any,\n any,\n infer TResolvedTypesMeta\n>\n ? TResolvedTypesMeta\n : never;\n\nexport type EventOfMachine<TMachine extends AnyStateMachine> =\n TMachine extends StateMachine<any, infer E, any, any, any> ? E : never;\n\nexport interface ActorContext<\n TEvent extends EventObject,\n TSnapshot,\n TSystem extends ActorSystem<any> = ActorSystem<any>\n> {\n self: ActorRef<TEvent, TSnapshot>;\n id: string;\n sessionId: string;\n logger: (...args: any[]) => void;\n defer: (fn: () => void) => void;\n system: TSystem;\n stopChild: (child: AnyActorRef) => void;\n}\n\nexport type AnyActorContext = ActorContext<any, any, any>;\n\nexport interface ActorBehavior<\n TEvent extends EventObject,\n TSnapshot = any,\n TInternalState = any,\n /**\n * Serialized internal state used for persistence & restoration\n */\n TPersisted = TInternalState,\n TSystem extends ActorSystem<any> = ActorSystem<any>\n> {\n transition: (\n state: TInternalState,\n message: TEvent | LifecycleSignal,\n ctx: ActorContext<TEvent, TSnapshot, TSystem>\n ) => TInternalState;\n getInitialState: (\n actorCtx: ActorContext<TEvent, TSnapshot, any>,\n input: any\n ) => TInternalState;\n restoreState?: (\n persistedState: TPersisted,\n actorCtx: ActorContext<TEvent, TSnapshot>\n ) => TInternalState;\n getSnapshot?: (state: TInternalState) => TSnapshot;\n getStatus?: (state: TInternalState) => { status: string; data?: any };\n start?: (\n state: TInternalState,\n actorCtx: ActorContext<TEvent, TSnapshot>\n ) => void;\n /**\n * @returns Persisted state\n */\n getPersistedState?: (state: TInternalState) => TPersisted;\n}\n\nexport type AnyActorBehavior = ActorBehavior<any, any, any, any>;\n\nexport type SnapshotFrom<T> = ReturnTypeOrValue<T> extends infer R\n ? R extends ActorRef<infer _, infer TSnapshot>\n ? TSnapshot\n : R extends Interpreter<infer TBehavior>\n ? SnapshotFrom<TBehavior>\n : R extends ActorBehavior<infer _, infer TSnapshot>\n ? TSnapshot\n : R extends ActorContext<infer _, infer TSnapshot, infer __>\n ? TSnapshot\n : never\n : never;\n\nexport type EventFromBehavior<TBehavior extends ActorBehavior<any, any>> =\n TBehavior extends ActorBehavior<infer TEvent, infer _> ? TEvent : never;\n\nexport type PersistedStateFrom<TBehavior extends ActorBehavior<any, any>> =\n TBehavior extends ActorBehavior<\n infer _TEvent,\n infer _TSnapshot,\n infer _TInternalState,\n infer TPersisted\n >\n ? TPersisted\n : never;\n\nexport type InternalStateFrom<TBehavior extends ActorBehavior<any, any>> =\n TBehavior extends ActorBehavior<\n infer _TEvent,\n infer _TSnapshot,\n infer TInternalState,\n infer _TPersisted\n >\n ? TInternalState\n : never;\n\ntype ResolveEventType<T> = ReturnTypeOrValue<T> extends infer R\n ? R extends StateMachine<\n infer _,\n infer TEvent,\n infer __,\n infer ___,\n infer ____\n >\n ? TEvent\n : R extends State<infer _, infer TEvent, infer __>\n ? TEvent\n : // TODO: the special case for Interpreter shouldn't be needed here as it implements ActorRef\n // however to drop it we'd have to remove ` | SCXML.Event<TEvent>` from its `send`'s accepted parameter\n R extends Interpreter<infer _, infer TEvent>\n ? TEvent\n : R extends ActorRef<infer TEvent, infer _>\n ? TEvent\n : never\n : never;\n\nexport type EventFrom<\n T,\n K extends Prop<TEvent, 'type'> = never,\n TEvent extends EventObject = ResolveEventType<T>\n> = IsNever<K> extends true ? TEvent : ExtractEvent<TEvent, K>;\n\nexport type ContextFrom<T> = ReturnTypeOrValue<T> extends infer R\n ? R extends StateMachine<\n infer TContext,\n infer _,\n infer __,\n infer ___,\n infer ____\n >\n ? TContext\n : R extends State<infer TContext, infer _, infer __>\n ? TContext\n : R extends Interpreter<infer TBehavior>\n ? TBehavior extends StateMachine<infer TContext, infer _>\n ? TContext\n : never\n : never\n : never;\n\nexport type InferEvent<E extends EventObject> = {\n [T in E['type']]: { type: T } & Extract<E, { type: T }>;\n}[E['type']];\n\nexport type TODO = any;\n\nexport type StateValueFrom<TMachine extends AnyStateMachine> = Parameters<\n StateFrom<TMachine>['matches']\n>[0];\n\nexport type StateFromMachine<TMachine extends AnyStateMachine> =\n TMachine['initialState'];\n\nexport interface ActorSystemInfo {\n actors: Record<string, AnyActorRef>;\n}\n\nexport interface ActorSystem<T extends ActorSystemInfo> {\n _bookId: () => string;\n _register: (sessionId: string, actorRef: AnyActorRef) => string;\n _unregister: (actorRef: AnyActorRef) => void;\n _set: <K extends keyof T['actors']>(key: K, actorRef: T['actors'][K]) => void;\n get: <K extends keyof T['actors']>(key: K) => T['actors'][K] | undefined;\n}\nexport type PersistedMachineState<TState extends AnyState> = Pick<\n TState,\n 'value' | 'output' | 'context' | '_event' | 'done' | 'historyValue'\n> & {\n children: {\n [K in keyof TState['children']]: {\n state: any; // TODO: fix (should be state from actorref)\n src?: string;\n };\n };\n};\n","import { ActionTypes } from './types.ts';\n\n// xstate-specific action types\nexport const stop = ActionTypes.Stop;\nexport const raise = ActionTypes.Raise;\nexport const send = ActionTypes.Send;\nexport const cancel = ActionTypes.Cancel;\nexport const assign = ActionTypes.Assign;\nexport const after = ActionTypes.After;\nexport const doneState = ActionTypes.DoneState;\nexport const log = ActionTypes.Log;\nexport const init = ActionTypes.Init;\nexport const invoke = ActionTypes.Invoke;\nexport const errorExecution = ActionTypes.ErrorExecution;\nexport const errorPlatform = ActionTypes.ErrorPlatform;\nexport const error = ActionTypes.ErrorCustom;\nexport const choose = ActionTypes.Choose;\nexport const pure = ActionTypes.Pure;\n","import { AnyActorBehavior, AnyState } from './index.ts';\nimport { errorExecution, errorPlatform } from './actionTypes.ts';\nimport { NULL_EVENT, STATE_DELIMITER, TARGETLESS_KEY } from './constants.ts';\nimport { IS_PRODUCTION } from './environment.ts';\nimport type { StateNode } from './StateNode.ts';\nimport type {\n ActorBehavior,\n EventObject,\n EventType,\n InvokeConfig,\n MachineContext,\n Mapper,\n Observer,\n PropertyMapper,\n SCXML,\n SCXMLErrorEvent,\n SingleOrArray,\n StateLike,\n StateValue,\n Subscribable,\n TransitionConfig,\n TransitionConfigTarget\n} from './types.ts';\n\nexport function keys<T extends object>(value: T): Array<keyof T & string> {\n return Object.keys(value) as Array<keyof T & string>;\n}\n\nexport function matchesState(\n parentStateId: StateValue,\n childStateId: StateValue,\n delimiter: string = STATE_DELIMITER\n): boolean {\n const parentStateValue = toStateValue(parentStateId, delimiter);\n const childStateValue = toStateValue(childStateId, delimiter);\n\n if (isString(childStateValue)) {\n if (isString(parentStateValue)) {\n return childStateValue === parentStateValue;\n }\n\n // Parent more specific than child\n return false;\n }\n\n if (isString(parentStateValue)) {\n return parentStateValue in childStateValue;\n }\n\n return Object.keys(parentStateValue).every((key) => {\n if (!(key in childStateValue)) {\n return false;\n }\n\n return matchesState(parentStateValue[key], childStateValue[key]);\n });\n}\n\nexport function toStatePath(\n stateId: string | string[],\n delimiter: string\n): string[] {\n try {\n if (isArray(stateId)) {\n return stateId;\n }\n\n return stateId.toString().split(delimiter);\n } catch (e) {\n throw new Error(`'${stateId}' is not a valid state path.`);\n }\n}\n\nexport function isStateLike(state: any): state is AnyState {\n return (\n typeof state === 'object' &&\n 'value' in state &&\n 'context' in state &&\n 'event' in state &&\n '_event' in state\n );\n}\n\nexport function toStateValue(\n stateValue: StateLike<any> | StateValue | string[],\n delimiter: string\n): StateValue {\n if (isStateLike(stateValue)) {\n return stateValue.value;\n }\n\n if (isArray(stateValue)) {\n return pathToStateValue(stateValue);\n }\n\n if (typeof stateValue !== 'string') {\n return stateValue as StateValue;\n }\n\n const statePath = toStatePath(stateValue as string, delimiter);\n\n return pathToStateValue(statePath);\n}\n\nexport function pathToStateValue(statePath: string[]): StateValue {\n if (statePath.length === 1) {\n return statePath[0];\n }\n\n const value = {};\n let marker = value;\n\n for (let i = 0; i < statePath.length - 1; i++) {\n if (i === statePath.length - 2) {\n marker[statePath[i]] = statePath[i + 1];\n } else {\n marker[statePath[i]] = {};\n marker = marker[statePath[i]];\n }\n }\n\n return value;\n}\n\nexport function mapValues<P, O extends Record<string, unknown>>(\n collection: O,\n iteratee: (item: O[keyof O], key: keyof O, collection: O, i: number) => P\n): { [key in keyof O]: P };\nexport function mapValues(\n collection: Record<string, unknown>,\n iteratee: (\n item: unknown,\n key: string,\n collection: Record<string, unknown>,\n i: number\n ) => unknown\n) {\n const result: Record<string, unknown> = {};\n\n const collectionKeys = Object.keys(collection);\n for (let i = 0; i < collectionKeys.length; i++) {\n const key = collectionKeys[i];\n result[key] = iteratee(collection[key], key, collection, i);\n }\n\n return result;\n}\n\nexport function mapFilterValues<T, P>(\n collection: { [key: string]: T },\n iteratee: (item: T, key: string, collection: { [key: string]: T }) => P,\n predicate: (item: T) => boolean\n): { [key: string]: P } {\n const result: { [key: string]: P } = {};\n\n for (const key of Object.keys(collection)) {\n const item = collection[key];\n\n if (!predicate(item)) {\n continue;\n }\n\n result[key] = iteratee(item, key, collection);\n }\n\n return result;\n}\n\n/**\n * Retrieves a value at the given path.\n * @param props The deep path to the prop of the desired value\n */\nexport function path<T extends Record<string, any>>(props: string[]): any {\n return (object: T): any => {\n let result: T = object;\n\n for (const prop of props) {\n result = result[prop as keyof typeof result];\n }\n\n return result;\n };\n}\n\nexport function toStatePaths(stateValue: StateValue | undefined): string[][] {\n if (!stateValue) {\n return [[]];\n }\n\n if (isString(stateValue)) {\n return [[stateValue]];\n }\n\n const result = flatten(\n Object.keys(stateValue).map((key) => {\n const subStateValue = stateValue[key];\n\n if (\n typeof subStateValue !== 'string' &&\n (!subStateValue || !Object.keys(subStateValue).length)\n ) {\n return [[key]];\n }\n\n return toStatePaths(stateValue[key]).map((subPath) => {\n return [key].concat(subPath);\n });\n })\n );\n\n return result;\n}\n\nexport function flatten<T>(array: Array<T | T[]>): T[] {\n return ([] as T[]).concat(...array);\n}\n\nexport function toArrayStrict<T>(value: T[] | T): T[] {\n if (isArray(value)) {\n return value;\n }\n return [value];\n}\n\nexport function toArray<T>(value: T[] | T | undefined): T[] {\n if (value === undefined) {\n return [];\n }\n return toArrayStrict(value);\n}\n\nexport function mapContext<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n mapper: Mapper<TContext, TEvent, any> | PropertyMapper<TContext, TEvent, any>,\n context: TContext,\n _event: SCXML.Event<TEvent>\n): any {\n if (isFunction(mapper)) {\n return mapper({ context, event: _event.data });\n }\n\n const result = {} as any;\n const args = { context, event: _event.data };\n\n for (const key of Object.keys(mapper)) {\n const subMapper = mapper[key];\n\n if (isFunction(subMapper)) {\n result[key] = subMapper(args);\n } else {\n result[key] = subMapper;\n }\n }\n\n return result;\n}\n\nexport function isBuiltInEvent(eventType: EventType): boolean {\n return /^(done|error)\\./.test(eventType);\n}\n\nexport function isPromiseLike(value: any): value is PromiseLike<any> {\n if (value instanceof Promise) {\n return true;\n }\n // Check if shape matches the Promise/A+ specification for a \"thenable\".\n if (\n value !== null &&\n (isFunction(value) || typeof value === 'object') &&\n isFunction(value.then)\n ) {\n return true;\n }\n return false;\n}\n\nexport function isBehavior(value: any): value is ActorBehavior<any, any> {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'transition' in value &&\n typeof value.transition === 'function'\n );\n}\n\nexport function partition<T, A extends T, B extends T>(\n items: T[],\n predicate: (item: T) => item is A\n): [A[], B[]] {\n const [truthy, falsy] = [[], []] as [A[], B[]];\n\n for (const item of items) {\n if (predicate(item)) {\n truthy.push(item);\n } else {\n falsy.push(item as B);\n }\n }\n\n return [truthy, falsy];\n}\n\n// tslint:disable-next-line:no-empty\nexport let warn: (\n condition: boolean | Error,\n message: string\n) => void = () => {};\n\nif (!IS_PRODUCTION) {\n warn = (condition: boolean | Error, message: string) => {\n const error = condition instanceof Error ? condition : undefined;\n if (!error && condition) {\n return;\n }\n\n if (console !== undefined) {\n const args: [string, ...any[]] = [`Warning: ${message}`];\n if (error) {\n args.push(error);\n }\n // tslint:disable-next-line:no-console\n console.warn.apply(console, args);\n }\n };\n}\n\nexport function isArray(value: any): value is any[] {\n return Array.isArray(value);\n}\n\n// tslint:disable-next-line:ban-types\nexport function isFunction(value: any): value is Function {\n return typeof value === 'function';\n}\n\nexport function isString(value: any): value is string {\n return typeof value === 'string';\n}\n\nexport function isObservable<T>(value: any): value is Subscribable<T> {\n try {\n return 'subscribe' in value && isFunction(value.subscribe);\n } catch (e) {\n return false;\n }\n}\n\nexport const uniqueId = (() => {\n let currentId = 0;\n\n return () => {\n currentId++;\n return currentId.toString(16);\n };\n})();\n\nexport function isSCXMLEvent<TEvent extends EventObject>(\n event: TEvent | SCXML.Event<TEvent>\n): event is SCXML.Event<TEvent> {\n return '$$type' in event && event.$$type === 'scxml';\n}\n\nexport function isSCXMLErrorEvent(\n event: SCXML.Event<any>\n): event is SCXMLErrorEvent {\n return (\n typeof event.name === 'string' &&\n (event.name === errorExecution || event.name.startsWith(errorPlatform))\n );\n}\n\nexport function toSCXMLEvent<TEvent extends EventObject>(\n event: TEvent | SCXML.Event<TEvent>,\n scxmlEvent?: Partial<SCXML.Event<TEvent>>\n): SCXML.Event<TEvent> {\n if (isSCXMLEvent(event)) {\n return event as SCXML.Event<TEvent>;\n }\n\n return {\n name: event.type,\n data: event,\n $$type: 'scxml',\n type: 'external',\n ...scxmlEvent\n };\n}\n\nexport function toTransitionConfigArray<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n event: TEvent['type'] | typeof NULL_EVENT | '*',\n configLike: SingleOrArray<\n TransitionConfig<TContext, TEvent> | TransitionConfigTarget\n >\n): Array<\n TransitionConfig<TContext, TEvent> & {\n event: TEvent['type'] | typeof NULL_EVENT | '*';\n }\n> {\n const transitions = toArrayStrict(configLike).map((transitionLike) => {\n if (\n typeof transitionLike === 'undefined' ||\n typeof transitionLike === 'string'\n ) {\n return { target: transitionLike, event };\n }\n\n return { ...transitionLike, event };\n }) as Array<\n TransitionConfig<TContext, TEvent> & {\n event: TEvent['type'] | typeof NULL_EVENT | '*';\n } // TODO: fix 'as' (remove)\n >;\n\n return transitions;\n}\n\nexport function normalizeTarget<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n target: SingleOrArray<string | StateNode<TContext, TEvent>> | undefined\n): Array<string | StateNode<TContext, TEvent>> | undefined {\n if (target === undefined || target === TARGETLESS_KEY) {\n return undefined;\n }\n return toArray(target);\n}\n\nexport function reportUnhandledExceptionOnInvocation(\n originalError: any,\n currentError: any,\n id: string\n) {\n if (!IS_PRODUCTION) {\n const originalStackTrace = originalError.stack\n ? ` Stacktrace was '${originalError.stack}'`\n : '';\n if (originalError === currentError) {\n // tslint:disable-next-line:no-console\n console.error(\n `Missing onError handler for invocation '${id}', error was '${originalError}'.${originalStackTrace}`\n );\n } else {\n const stackTrace = currentError.stack\n ? ` Stacktrace was '${currentError.stack}'`\n : '';\n // tslint:disable-next-line:no-console\n console.error(\n `Missing onError handler and/or unhandled exception/promise rejection for invocation '${id}'. ` +\n `Original error: '${originalError}'. ${originalStackTrace} Current error is '${currentError}'.${stackTrace}`\n );\n }\n }\n}\n\nexport function toInvokeConfig<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n invocable: InvokeConfig<TContext, TEvent> | string | ActorBehavior<any, any>,\n id: string\n): InvokeConfig<TContext, TEvent> {\n if (typeof invocable === 'object') {\n if ('src' in invocable) {\n return invocable;\n }\n\n if ('transition' in invocable) {\n return {\n id,\n src: invocable\n };\n }\n }\n\n return {\n id,\n src: invocable\n };\n}\n\nexport function toObserver<T>(\n nextHandler?: Observer<T> | ((value: T) => void),\n errorHandler?: (error: any) => void,\n completionHandler?: () => void\n): Observer<T> {\n const noop = () => {};\n const isObserver = typeof nextHandler === 'object';\n const self = isObserver ? nextHandler : null;\n\n return {\n next: ((isObserver ? nextHandler.next : nextHandler) || noop).bind(self),\n error: ((isObserver ? nextHandler.error : errorHandler) || noop).bind(self),\n complete: (\n (isObserver ? nextHandler.complete : completionHandler) || noop\n ).bind(self)\n };\n}\n\nexport function createInvokeId(stateNodeId: string, index: number): string {\n return `${stateNodeId}:invocation[${index}]`;\n}\n\nexport function resolveReferencedActor(\n referenced:\n | AnyActorBehavior\n | { src: AnyActorBehavior; input: Mapper<any, any, any> | any }\n | undefined\n) {\n return referenced\n ? 'transition' in referenced\n ? { src: referenced, input: undefined }\n : referenced\n : undefined;\n}\n","export const STATE_DELIMITER = '.';\nexport const TARGETLESS_KEY = '';\nexport const NULL_EVENT = '';\nexport const STATE_IDENTIFIER = '#';\nexport const WILDCARD = '*';\n","import type {\n BaseActionObject,\n BaseDynamicActionObject,\n BuiltInActionObject,\n EventObject,\n MachineContext\n} from '../src/types';\n\nexport function createDynamicAction<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject,\n TAction extends BaseActionObject,\n TDynamicParams extends Record<string, any>\n>(\n action: BuiltInActionObject & { params: TDynamicParams },\n resolve: BaseDynamicActionObject<\n TContext,\n TExpressionEvent,\n TEvent,\n TAction,\n TDynamicParams\n >['resolve']\n): BaseDynamicActionObject<\n TContext,\n TExpressionEvent,\n TEvent,\n TAction,\n TDynamicParams\n> {\n return {\n type: action.type,\n params: action.params,\n resolve\n } as any;\n}\n\nexport function isDynamicAction(\n action: any\n): action is BaseDynamicActionObject<any, any, any, any, any> {\n return typeof action === 'object' && action !== null && 'resolve' in action;\n}\n","import {\n EventObject,\n SendActionParams,\n SpecialTargets,\n SendExpr,\n AnyEventObject,\n MachineContext\n} from '../types.ts';\nimport { send as sendActionType } from '../actionTypes.ts';\nimport { isFunction, isString, toSCXMLEvent } from '../utils.ts';\nimport { createDynamicAction } from '../../actions/dynamicAction.ts';\nimport {\n AnyActorRef,\n AnyInterpreter,\n BaseDynamicActionObject,\n Cast,\n EventFrom,\n ExprWithMeta,\n InferEvent,\n SendActionObject,\n SendActionOptions,\n StateMeta,\n UnifiedArg\n} from '../index.ts';\nimport { actionTypes, error } from '../actions.ts';\n\n/**\n * Sends an event. This returns an action that will be read by an interpreter to\n * send the event in the next step, after the current step is finished executing.\n *\n * @deprecated Use the `sendTo(...)` action creator instead.\n *\n * @param eventOrExpr The event to send.\n * @param options Options to pass into the send event:\n * - `id` - The unique send event identifier (used with `cancel()`).\n * - `delay` - The number of milliseconds to delay the sending of the event.\n * - `to` - The target of this event (by default, the machine the event was sent from).\n */\nexport function send<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TSentEvent extends EventObject = AnyEventObject\n>(\n eventOrExpr: TSentEvent | SendExpr<TContext, TEvent, AnyEventObject>,\n options?: SendActionOptions<TContext, TEvent>\n): BaseDynamicActionObject<\n TContext,\n TEvent,\n TEvent,\n SendActionObject<AnyEventObject>,\n SendActionParams<TContext, TEvent>\n> {\n return createDynamicAction<\n TContext,\n TEvent,\n AnyEventObject,\n SendActionObject<AnyEventObject>,\n SendActionParams<TContext, TEvent>\n >(\n {\n type: sendActionType,\n params: {\n to: options ? options.to : undefined,\n delay: options ? options.delay : undefined,\n event: eventOrExpr,\n id:\n options && options.id !== undefined\n ? options.id\n : isFunction(eventOrExpr)\n ? eventOrExpr.name\n : eventOrExpr.type\n }\n },\n (_event, { actorContext, state }) => {\n const params = {\n to: options ? options.to : undefined,\n delay: options ? options.delay : undefined,\n event: eventOrExpr,\n // TODO: don't auto-generate IDs here like that\n // there is too big chance of the ID collision\n id:\n options && options.id !== undefined\n ? options.id\n : isFunction(eventOrExpr)\n ? eventOrExpr.name\n : eventOrExpr.type\n };\n const args: UnifiedArg<TContext, TEvent> & StateMeta<TEvent> = {\n context: state.context,\n event: _event.data,\n _event,\n self: actorContext?.self ?? (null as any),\n system: actorContext?.system\n };\n const delaysMap = state.machine.options.delays;\n\n // TODO: helper function for resolving Expr\n const resolvedEvent = toSCXMLEvent(\n isFunction(eventOrExpr) ? eventOrExpr(args) : eventOrExpr\n );\n\n let resolvedDelay: number | undefined;\n if (isString(params.delay)) {\n const configDelay = delaysMap && delaysMap[params.delay];\n resolvedDelay = isFunction(configDelay)\n ? configDelay(args)\n : configDelay;\n } else {\n resolvedDelay = isFunction(params.delay)\n ? params.delay(args)\n : params.delay;\n }\n\n const resolvedTarget = isFunction(params.to)\n ? params.to(args)\n : params.to;\n let targetActorRef: AnyActorRef | undefined;\n\n if (typeof resolvedTarget === 'string') {\n if (resolvedTarget === SpecialTargets.Parent) {\n targetActorRef = actorContext?.self._parent;\n } else if (resolvedTarget === SpecialTargets.Internal) {\n targetActorRef = actorContext?.self;\n } else if (resolvedTarget.startsWith('#_')) {\n // SCXML compatibility: https://www.w3.org/TR/scxml/#SCXMLEventProcessor\n // #_invokeid. If the target is the special term '#_invokeid', where invokeid is the invokeid of an SCXML session that the sending session has created by <invoke>, the Processor must add the event to the external queue of that session.\n targetActorRef = state.children[resolvedTarget.slice(2)];\n } else {\n targetActorRef = state.children[resolvedTarget];\n }\n if (!targetActorRef) {\n throw new Error(\n `Unable to send event to actor '${resolvedTarget}' from machine '${state.machine.id}'.`\n );\n }\n } else {\n targetActorRef = resolvedTarget || actorContext?.self;\n }\n\n const resolvedAction: SendActionObject = {\n type: actionTypes.send,\n params: {\n ...params,\n to: targetActorRef,\n _event: resolvedEvent,\n event: resolvedEvent.data,\n delay: resolvedDelay,\n internal: resolvedTarget === SpecialTargets.Internal\n },\n execute: (actorCtx) => {\n const sendAction = resolvedAction as SendActionObject;\n\n if (typeof sendAction.params.delay === 'number') {\n (actorCtx.self as AnyInterpreter).delaySend(sendAction);\n return;\n } else {\n const target = sendAction.params.to!;\n const { _event } = sendAction.params;\n actorCtx.defer(() => {\n const origin = actorCtx.self;\n const resolvedEvent: typeof _event = {\n ..._event,\n name:\n _event.name === actionTypes.error\n ? `${error(origin.id)}`\n : _event.name,\n origin: origin\n };\n target.send(resolvedEvent);\n });\n }\n }\n };\n\n return [state, resolvedAction];\n }\n );\n}\n\n/**\n * Sends an event to this machine's parent.\n *\n * @param event The event to send to the parent machine.\n * @param options Options to pass into the send event.\n */\nexport function sendParent<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TSentEvent extends EventObject = AnyEventObject\n>(\n event: TSentEvent | SendExpr<TContext, TEvent, TSentEvent>,\n options?: SendActionOptions<TContext, TEvent>\n) {\n return send<TContext, TEvent, TSentEvent>(event, {\n ...options,\n to: SpecialTargets.Parent\n });\n}\n\n/**\n * Sends an event back to the sender of the original event.\n *\n * @param event The event to send back to the sender\n * @param options Options to pass into the send event\n */\nexport function respond<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TSentEvent extends EventObject = AnyEventObject\n>(\n event: TEvent | SendExpr<TContext, TEvent, TSentEvent>,\n options?: SendActionOptions<TContext, TEvent>\n) {\n return send<TContext, TEvent>(event, {\n ...options,\n to: ({ _event }) => {\n return _event.origin!; // TODO: handle when _event.origin is undefined\n }\n });\n}\n\n/**\n * Forwards (sends) an event to a specified service.\n *\n * @param target The target service to forward the event to.\n * @param options Options to pass into the send action creator.\n */\nexport function forwardTo<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n target: Required<SendActionParams<TContext, TEvent>>['to'],\n options?: SendActionOptions<TContext, TEvent>\n) {\n if (\n process.env.NODE_END !== 'production' &&\n (!target || typeof target === 'function')\n ) {\n const originalTarget = target;\n target = (...args) => {\n const resolvedTarget =\n typeof originalTarget === 'function'\n ? originalTarget(...args)\n : originalTarget;\n if (!resolvedTarget) {\n throw new Error(\n `Attempted to forward event to undefined actor. This risks an infinite loop in the sender.`\n );\n }\n return resolvedTarget;\n };\n }\n return send<TContext, TEvent>(({ event }) => event, {\n ...options,\n to: target\n });\n}\n\n/**\n * Escalates an error by sending it as an event to this machine's parent.\n *\n * @param errorData The error data to send, or the expression function that\n * takes in the `context`, `event`, and `meta`, and returns the error data to send.\n * @param options Options to pass into the send action creator.\n */\nexport function escalate<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TErrorData = any\n>(\n errorData: TErrorData | ExprWithMeta<TContext, TEvent, TErrorData>,\n options?: SendActionParams<TContext, TEvent>\n) {\n return sendParent<TContext, TEvent>(\n (arg) => {\n return {\n type: actionTypes.error,\n data: isFunction(errorData) ? errorData(arg) : errorData\n };\n },\n {\n ...options,\n to: SpecialTargets.Parent\n }\n );\n}\n\n/**\n * Sends an event to an actor.\n *\n * @param actor The `ActorRef` to send the event to.\n * @param event The event to send, or an expression that evaluates to the event to send\n * @param options Send action options\n * @returns An XState send action object\n */\nexport function sendTo<\n TContext extends MachineContext,\n TEvent extends EventObject,\n TActor extends AnyActorRef\n>(\n actor: TActor | string | ExprWithMeta<TContext, TEvent, TActor | string>,\n event:\n | EventFrom<TActor>\n | SendExpr<\n TContext,\n TEvent,\n InferEvent<Cast<EventFrom<TActor>, EventObject>>\n >,\n options?: SendActionOptions<TContext, TEvent>\n) {\n return send<TContext, TEvent, any>(event, {\n ...options,\n to: actor\n });\n}\n","interface MailboxItem<T> {\n value: T;\n next: MailboxItem<T> | null;\n}\n\nexport class Mailbox<T> {\n private _active: boolean = false;\n private _current: MailboxItem<T> | null = null;\n private _last: MailboxItem<T> | null = null;\n\n constructor(private _process: (ev: T) => void) {}\n\n public start() {\n this._active = true;\n this.flush();\n }\n\n public clear(): void {\n // we can't set _current to null because we might be currently processing\n // and enqueue following clear shouldnt start processing the enqueued item immediately\n if (this._current) {\n this._current.next = null;\n this._last = this._current;\n }\n }\n\n // TODO: rethink this design\n public prepend(event: T): void {\n if (!this._current) {\n this.enqueue(event);\n return;\n }\n\n // we know that something is already queued up\n // so the mailbox is already flushing or it's inactive\n // therefore the only thing that we need to do is to reassign `this._current`\n this._current = {\n value: event,\n next: this._current\n };\n }\n\n public enqueue(event: T): void {\n const enqueued = {\n value: event,\n next: null\n };\n\n if (this._current) {\n this._last!.next = enqueued;\n this._last = enqueued;\n return;\n }\n\n this._current = enqueued;\n this._last = enqueued;\n\n if (this._active) {\n this.flush();\n }\n }\n\n private flush() {\n while (this._current) {\n // atm the given _process is responsible for implementing proper try/catch handling\n // we assume here that this won't throw in a way that can affect this mailbox\n const consumed = this._current;\n this._process(consumed.value);\n // something could have been prepended in the meantime\n // so we need to be defensive here to avoid skipping over a prepended item\n if (consumed === this._current) {\n this._current = this._current.next;\n }\n }\n this._last = null;\n }\n}\n","export const symbolObservable: typeof Symbol.observable = (() =>\n (typeof Symbol === 'function' && Symbol.observable) ||\n '@@observable')() as any;\n","import type { EventObject, ActorRef, BaseActorRef } from '../types.ts';\nimport { symbolObservable } from '../symbolObservable.ts';\nimport { ActorStatus } from '../interpreter.ts';\nexport { fromTransition } from './transition.ts';\nexport { fromPromise } from './promise.ts';\nexport { fromObservable, fromEventObservable } from './observable.ts';\nexport { fromCallback } from './callback.ts';\n\nexport const startSignalType = 'xstate.init';\nexport const stopSignalType = 'xstate.stop';\nexport const startSignal: StartSignal = { type: 'xstate.init' };\nexport const stopSignal: StopSignal = { type: 'xstate.stop' };\n\nexport interface StartSignal {\n type: 'xstate.init';\n}\n\nexport interface StopSignal {\n type: 'xstate.stop';\n}\n\nexport type LifecycleSignal = StartSignal | StopSignal;\nexport type LifecycleSignalType =\n | typeof startSignalType\n | typeof stopSignalType;\n\n/**\n * An object that expresses the behavior of an actor in reaction to received events,\n * as well as an optionally emitted stream of values.\n *\n * @template TReceived The received event\n * @template TSnapshot The emitted value\n */\n\nexport function isSignal(eventType: string): eventType is LifecycleSignalType {\n return eventType === startSignalType || eventType === stopSignalType;\n}\n\nexport function isActorRef(item: any): item is ActorRef<any> {\n return !!item && typeof item === 'object' && typeof item.send === 'function';\n}\n\n// TODO: refactor the return type, this could be written in a better way\n// but it's best to avoid unneccessary breaking changes now\n// @deprecated use `interpret(behavior)` instead\nexport function toActorRef<\n TEvent extends EventObject,\n TSnapshot = any,\n TActorRefLike extends BaseActorRef<TEvent> = BaseActorRef<TEvent>\n>(\n actorRefLike: TActorRefLike\n): ActorRef<TEvent, TSnapshot> & Omit<TActorRefLike, keyof ActorRef<any, any>> {\n return {\n subscribe: () => ({ unsubscribe: () => void 0 }),\n id: 'anonymous',\n sessionId: '',\n getSnapshot: () => undefined,\n [symbolObservable]: function () {\n return this;\n },\n status: ActorStatus.Running,\n stop: () => void 0,\n ...actorRefLike\n };\n}\n","import { IS_PRODUCTION } from '../environment.ts';\nimport { AnyInterpreter, DevToolsAdapter } from '../types.ts';\n\ninterface DevInterface {\n services: Set<AnyInterpreter>;\n register(service: AnyInterpreter): void;\n onRegister(listener: ServiceListener): void;\n}\ntype ServiceListener = (service: AnyInterpreter) => void;\n\nexport interface XStateDevInterface {\n register: (service: AnyInterpreter) => void;\n unregister: (service: AnyInterpreter) => void;\n onRegister: (listener: ServiceListener) => {\n unsubscribe: () => void;\n };\n services: Set<AnyInterpreter>;\n}\n\n// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/globalThis\nexport function getGlobal(): typeof globalThis | undefined {\n if (typeof globalThis !== 'undefined') {\n return globalThis;\n }\n if (typeof self !== 'undefined') {\n return self;\n }\n if (typeof window !== 'undefined') {\n return window;\n }\n if (typeof global !== 'undefined') {\n return global;\n }\n if (!IS_PRODUCTION) {\n console.warn(\n 'XState could not find a global object in this environment. Please let the maintainers know and raise an issue here: https://github.com/statelyai/xstate/issues'\n );\n }\n}\n\nfunction getDevTools(): DevInterface | undefined {\n const w = getGlobal();\n if (!!(w as any).__xstate__) {\n return (w as any).__xstate__;\n }\n\n return undefined;\n}\n\nexport function registerService(service: AnyInterpreter) {\n if (typeof window === 'undefined') {\n return;\n }\n\n const devTools = getDevTools();\n\n if (devTools) {\n devTools.register(service);\n }\n}\n\nexport const devToolsAdapter: DevToolsAdapter = (service) => {\n if (typeof window === 'undefined') {\n return;\n }\n\n const devTools = getDevTools();\n\n if (devTools) {\n devTools.register(service);\n }\n};\n","import { Mailbox } from './Mailbox.ts';\nimport { doneInvoke, error } from './actions.ts';\nimport { stopSignalType } from './actors/index.ts';\nimport { devToolsAdapter } from './dev/index.ts';\nimport { IS_PRODUCTION } from './environment.ts';\nimport { symbolObservable } from './symbolObservable.ts';\nimport { createSystem } from './system.ts';\nimport { AreAllImplementationsAssumedToBeProvided } from './typegenTypes.ts';\nimport type {\n ActorBehavior,\n ActorContext,\n ActorSystem,\n AnyActorBehavior,\n AnyStateMachine,\n EventFromBehavior,\n InterpreterFrom,\n PersistedStateFrom,\n RaiseActionObject,\n SnapshotFrom\n} from './types.ts';\nimport {\n ActorRef,\n DoneEvent,\n EventObject,\n InteropSubscribable,\n InterpreterOptions,\n Observer,\n SCXML,\n SendActionObject,\n Subscription\n} from './types.ts';\nimport { toObserver, toSCXMLEvent, warn } from './utils.ts';\n\nexport type SnapshotListener<TBehavior extends AnyActorBehavior> = (\n state: SnapshotFrom<TBehavior>\n) => void;\n\nexport type EventListener<TEvent extends EventObject = EventObject> = (\n event: TEvent\n) => void;\n\nexport type Listener = () => void;\nexport type ErrorListener = (error: any) => void;\n\nexport interface Clock {\n setTimeout(fn: (...args: any[]) => void, timeout: number): any;\n clearTimeout(id: any): void;\n}\n\nexport enum ActorStatus {\n NotStarted,\n Running,\n Stopped\n}\n\nconst defaultOptions = {\n deferEvents: true,\n clock: {\n setTimeout: (fn, ms) => {\n return setTimeout(fn, ms);\n },\n clearTimeout: (id) => {\n return clearTimeout(id);\n }\n } as Clock,\n logger: console.log.bind(console),\n devTools: false\n};\n\ntype InternalStateFrom<TBehavior extends ActorBehavior<any, any, any>> =\n TBehavior extends ActorBehavior<infer _, infer __, infer TInternalState>\n ? TInternalState\n : never;\n\nexport class Interpreter<\n TBehavior extends AnyActorBehavior,\n TEvent extends EventObject = EventFromBehavior<TBehavior>\n> implements ActorRef<TEvent, SnapshotFrom<TBehavior>>\n{\n /**\n * The current state of the interpreted behavior.\n */\n private _state!: InternalStateFrom<TBehavior>;\n /**\n * The clock that is responsible for setting and clearing timeouts, such as delayed events and transitions.\n */\n public clock: Clock;\n public options: Readonly<InterpreterOptions<TBehavior>>;\n\n /**\n * The unique identifier for this actor relative to its parent.\n */\n public id: string;\n\n private mailbox: Mailbox<SCXML.Event<TEvent>> = new Mailbox(\n this._process.bind(this)\n );\n\n private delayedEventsMap: Record<string, unknown> = {};\n\n private observers: Set<Observer<SnapshotFrom<TBehavior>>> = new Set();\n private logger: (...args: any[]) => void;\n /**\n * Whether the service is started.\n */\n public status: ActorStatus = ActorStatus.NotStarted;\n\n // Actor Ref\n public _parent?: ActorRef<any>;\n public ref: ActorRef<TEvent>;\n // TODO: add typings for system\n private _actorContext: ActorContext<TEvent, SnapshotFrom<TBehavior>, any>;\n\n private _systemId: string | undefined;\n\n /**\n * The globally unique process ID for this invocation.\n */\n public sessionId: string;\n\n public system: ActorSystem<any>;\n private _doneEvent?: DoneEvent;\n\n public src?: string;\n\n /**\n * Creates a new Interpreter instance (i.e., service) for the given behavior with the provided options, if any.\n *\n * @param behavior The behavior to be interpreted\n * @param options Interpreter options\n */\n constructor(\n public behavior: TBehavior,\n options?: InterpreterOptions<TBehavior>\n ) {\n const resolvedOptions = {\n ...defaultOptions,\n ...options\n };\n\n const { clock, logger, parent, id, systemId } = resolvedOptions;\n const self = this;\n\n this.system = parent?.system ?? createSystem();\n\n if (systemId) {\n this._systemId = systemId;\n this.system._set(systemId, this);\n }\n\n this.sessionId = this.system._bookId();\n this.id = id ?? this.sessionId;\n this.logger = logger;\n this.clock = clock;\n this._parent = parent;\n this.options = resolvedOptions;\n this.src = resolvedOptions.src;\n this.ref = this;\n this._actorContext = {\n self,\n id: this.id,\n sessionId: this.sessionId,\n logger: this.logger,\n defer: (fn) => {\n this._deferred.push(fn);\n },\n system: this.system,\n stopChild: (child) => {\n if (child._parent !== this) {\n throw new Error(\n `Cannot stop child actor ${child.id} of ${this.id} because it is not a child`\n );\n }\n (child as any)._stop();\n }\n };\n\n // Ensure that the send method is bound to this interpreter instance\n // if destructured\n this.send = this.send.bind(this);\n this._initState();\n }\n\n private _initState() {\n this._state = this.options.state\n ? this.behavior.restoreState\n ? this.behavior.restoreState(this.options.state, this._actorContext)\n : this.options.state\n : this.behavior.getInitialState(this._actorContext, this.options?.input);\n }\n\n // array of functions to defer\n private _deferred: Array<(state: any) => void> = [];\n\n private update(state: InternalStateFrom<TBehavior>): void {\n // Update state\n this._state = state;\n const snapshot = this.getSnapshot();\n\n // Execute deferred effects\n let deferredFn: (typeof this._deferred)[number] | undefined;\n\n while ((deferredFn = this._deferred.shift())) {\n deferredFn(state);\n }\n\n for (const observer of this.observers) {\n observer.next?.(snapshot);\n }\n\n const status = this.behavior.getStatus?.(state);\n\n switch (status?.status) {\n case 'done':\n this._doneEvent = doneInvoke(this.id, status.data);\n this._parent?.send(\n toSCXMLEvent(this._doneEvent as any, {\n origin: this,\n invokeid: this.id\n })\n );\n\n this._stopProcedure();\n break;\n case 'error':\n this._parent?.send(\n toSCXMLEvent(error(this.id, status.data), {\n origin: this\n })\n );\n for (const observer of this.observers) {\n observer.error?.(status.data);\n }\n break;\n }\n }\n\n public subscribe(observer: Observer<SnapshotFrom<TBehavior>>): Subscription;\n public subscribe(\n nextListener?: (state: SnapshotFrom<TBehavior>) => void,\n errorListener?: (error: any) => void,\n completeListener?: () => void\n ): Subscription;\n public subscribe(\n nextListenerOrObserver?:\n | ((state: SnapshotFrom<TBehavior>) => void)\n | Observer<SnapshotFrom<TBehavior>>,\n errorListener?: (error: any) => void,\n completeListener?: () => void\n ): Subscription {\n const observer = toObserver(\n nextListenerOrObserver,\n errorListener,\n completeListener\n );\n\n this.observers.add(observer);\n\n if (this.status === ActorStatus.Stopped) {\n observer.complete?.();\n this.observers.delete(observer);\n }\n\n return {\n unsubscribe: () => {\n this.observers.delete(observer);\n }\n };\n }\n\n /**\n * Adds a state listener that is notified when the statechart has reached its final state.\n * @param listener The state listener\n */\n public onDone(listener: EventListener<DoneEvent>): this {\n if (this.status === ActorStatus.Stopped && this._doneEvent) {\n listener(this._doneEvent);\n } else {\n this.observers.add({\n complete: () => {\n if (this._doneEvent) {\n listener(this._doneEvent);\n }\n }\n });\n }\n\n return this;\n }\n\n /**\n * Starts the interpreter from the initial state\n */\n public start(): this {\n if (this.status === ActorStatus.Running) {\n // Do not restart the service if it is already started\n return this;\n }\n\n this.system._register(this.sessionId, this);\n if (this._systemId) {\n this.system._set(this._systemId, this);\n }\n this.status = ActorStatus.Running;\n\n if (this.behavior.start) {\n this.behavior.start(this._state, this._actorContext);\n }\n\n // TODO: this notifies all subscribers but usually this is redundant\n // there is no real change happening here\n // we need to rethink if this needs to be refactored\n this.update(this._state);\n\n if (this.options.devTools) {\n this.attachDevTools();\n }\n\n this.mailbox.start();\n\n return this;\n }\n\n private _process(event: SCXML.Event<TEvent>) {\n try {\n const nextState = this.behavior.transition(\n this._state,\n event,\n this._actorContext\n );\n\n this.update(nextState);\n\n if (event.name === stopSignalType) {\n this._stopProcedure();\n }\n } catch (err) {\n // TODO: properly handle errors\n if (this.observers.size > 0) {\n this.observers.forEach((observer) => {\n observer.error?.(err);\n });\n this.stop();\n } else {\n throw err;\n }\n }\n }\n\n private _stop(): this {\n if (this.status === ActorStatus.Stopped) {\n return this;\n }\n this.mailbox.clear();\n if (this.status === ActorStatus.NotStarted) {\n this.status = ActorStatus.Stopped;\n return this;\n }\n this.mailbox.enqueue(toSCXMLEvent({ type: stopSignalType }) as any);\n\n return this;\n }\n\n /**\n * Stops the interpreter and unsubscribe all listeners.\n */\n public stop(): this {\n if (this._parent) {\n throw new Error('A non-root actor cannot be stopped directly.');\n }\n return this._stop();\n }\n private _complete(): void {\n for (const observer of this.observers) {\n observer.complete?.();\n }\n this.observers.clear();\n }\n private _stopProcedure(): this {\n this._complete();\n\n if (this.status !== ActorStatus.Running) {\n // Interpreter already stopped; do nothing\n return this;\n }\n\n // Cancel all delayed events\n for (const key of Object.keys(this.delayedEventsMap)) {\n this.clock.clearTimeout(this.delayedEventsMap[key]);\n }\n\n // TODO: mailbox.reset\n this.mailbox.clear();\n // TODO: after `stop` we must prepare ourselves for receiving events again\n // events sent *after* stop signal must be queued\n // it seems like this should be the common behavior for all of our consumers\n // so perhaps this should be unified somehow for all of them\n this.mailbox = new Mailbox(this._process.bind(this));\n\n this.status = ActorStatus.Stopped;\n this.system._unregister(this);\n\n return this;\n }\n\n /**\n * Sends an event to the running interpreter to trigger a transition.\n *\n * @param event The event to send\n */\n public send(event: TEvent | SCXML.Event<TEvent>) {\n const _event = toSCXMLEvent(event);\n\n if (this.status === ActorStatus.Stopped) {\n // do nothing\n if (!IS_PRODUCTION) {\n const eventString = JSON.stringify(_event.data);\n\n warn(\n false,\n `Event \"${_event.name.toString()}\" was sent to stopped actor \"${\n this.id\n } (${\n this.sessionId\n })\". This actor has already reached its final state, and will not transition.\\nEvent: ${eventString}`\n );\n }\n return;\n }\n\n if (this.status !== ActorStatus.Running && !this.options.deferEvents) {\n throw new Error(\n `Event \"${_event.name}\" was sent to uninitialized actor \"${\n this.id\n // tslint:disable-next-line:max-line-length\n }\". Make sure .start() is called for this actor, or set { deferEvents: true } in the actor options.\\nEvent: ${JSON.stringify(\n _event.data\n )}`\n );\n }\n\n this.mailbox.enqueue(_event);\n }\n\n // TODO: make private (and figure out a way to do this within the machine)\n public delaySend(\n sendAction: SendActionObject | RaiseActionObject<any, any, any>\n ): void {\n this.delayedEventsMap[sendAction.params.id] = this.clock.setTimeout(() => {\n if ('to' in sendAction.params && sendAction.params.to) {\n sendAction.params.to.send(sendAction.params._event);\n } else {\n this.send(sendAction.params._event as SCXML.Event<TEvent>);\n }\n }, sendAction.params.delay as number);\n }\n\n // TODO: make private (and figure out a way to do this within the machine)\n public cancel(sendId: string | number): void {\n this.clock.clearTimeout(this.delayedEventsMap[sendId]);\n delete this.delayedEventsMap[sendId];\n }\n\n private attachDevTools(): void {\n const { devTools } = this.options;\n if (devTools) {\n const resolvedDevToolsAdapter =\n typeof devTools === 'function' ? devTools : devToolsAdapter;\n\n resolvedDevToolsAdapter(this);\n }\n }\n public toJSON() {\n return {\n id: this.id\n };\n }\n\n public getPersistedState(): PersistedStateFrom<TBehavior> | undefined {\n return this.behavior.getPersistedState?.(this._state);\n }\n\n public [symbolObservable](): InteropSubscribable<SnapshotFrom<TBehavior>> {\n return this;\n }\n\n public getSnapshot(): SnapshotFrom<TBehavior> {\n return this.behavior.getSnapshot\n ? this.behavior.getSnapshot(this._state)\n : this._state;\n }\n}\n\n/**\n * Creates a new Interpreter instance for the given machine with the provided options, if any.\n *\n * @param machine The machine to interpret\n * @param options Interpreter options\n */\nexport function interpret<TMachine extends AnyStateMachine>(\n machine: AreAllImplementationsAssumedToBeProvided<\n TMachine['__TResolvedTypesMeta']\n > extends true\n ? TMachine\n : 'Some implementations missing',\n options?: InterpreterOptions<TMachine>\n): InterpreterFrom<TMachine>;\nexport function interpret<TBehavior extends AnyActorBehavior>(\n behavior: TBehavior,\n options?: InterpreterOptions<TBehavior>\n): Interpreter<TBehavior>;\nexport function interpret(\n behavior: any,\n options?: InterpreterOptions<any>\n): any {\n const interpreter = new Interpreter(behavior, options);\n\n return interpreter;\n}\n","import { ActorSystem, ActorSystemInfo, AnyActorRef } from './types.js';\n\nexport function createSystem<T extends ActorSystemInfo>(): ActorSystem<T> {\n let sessionIdCounter = 0;\n const children = new Map<string, AnyActorRef>();\n const keyedActors = new Map<keyof T['actors'], AnyActorRef | undefined>();\n const reverseKeyedActors = new WeakMap<AnyActorRef, keyof T['actors']>();\n\n const system: ActorSystem<T> = {\n _bookId: () => `x:${sessionIdCounter++}`,\n _register: (sessionId, actorRef) => {\n children.set(sessionId, actorRef);\n return sessionId;\n },\n _unregister: (actorRef) => {\n children.delete(actorRef.sessionId);\n const systemId = reverseKeyedActors.get(actorRef);\n\n if (systemId !== undefined) {\n keyedActors.delete(systemId);\n reverseKeyedActors.delete(actorRef);\n }\n },\n get: (systemId) => {\n return keyedActors.get(systemId) as T['actors'][any];\n },\n _set: (systemId, actorRef) => {\n const existing = keyedActors.get(systemId);\n if (existing && existing !== actorRef) {\n throw new Error(\n `Actor with system ID '${systemId as string}' already exists.`\n );\n }\n\n keyedActors.set(systemId, actorRef);\n reverseKeyedActors.set(actorRef, systemId);\n }\n };\n\n return system;\n}\n","import {\n EventObject,\n LogExpr,\n MachineContext,\n LogActionObject\n} from '../types.ts';\nimport { log as logActionType } from '../actionTypes.ts';\nimport { createDynamicAction } from '../../actions/dynamicAction.ts';\nimport { BaseDynamicActionObject, DynamicLogAction } from '../index.ts';\n\nconst defaultLogExpr = <TContext, TEvent extends EventObject>({\n context,\n event\n}: {\n context: TContext;\n event: TEvent;\n}) => ({\n context,\n event\n});\n\n/**\n *\n * @param expr The expression function to evaluate which will be logged.\n * Takes in 2 arguments:\n * - `ctx` - the current state context\n * - `event` - the event that caused this action to be executed.\n * @param label The label to give to the logged expression.\n */\n\nexport function log<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject = TExpressionEvent\n>(\n expr: string | LogExpr<TContext, TExpressionEvent> = defaultLogExpr,\n label?: string\n): BaseDynamicActionObject<\n TContext,\n TExpressionEvent,\n TEvent,\n LogActionObject,\n DynamicLogAction<TContext, TExpressionEvent, TEvent>['params']\n> {\n return createDynamicAction(\n { type: logActionType, params: { label, expr } },\n (_event, { state, actorContext }) => {\n const resolvedValue =\n typeof expr === 'function'\n ? expr({\n context: state.context,\n event: _event.data,\n _event,\n self: actorContext?.self ?? ({} as any),\n system: actorContext?.system\n })\n : expr;\n return [\n state,\n {\n type: 'xstate.log',\n params: {\n label,\n value: resolvedValue\n },\n execute: (actorCtx) => {\n if (label) {\n actorCtx.logger?.(label, resolvedValue);\n } else {\n actorCtx.logger?.(resolvedValue);\n }\n }\n } as LogActionObject\n ];\n }\n );\n}\n","const cache = new WeakMap<any, any>();\n\nexport function memo<T>(object: any, key: string, fn: () => T): T {\n let memoizedData = cache.get(object);\n\n if (!memoizedData) {\n memoizedData = { [key]: fn() };\n cache.set(object, memoizedData);\n } else if (!(key in memoizedData)) {\n memoizedData[key] = fn();\n }\n\n return memoizedData[key];\n}\n\nexport function evict(object: any, key?: string): void {\n if (!key) {\n return void cache.delete(object);\n }\n\n const memoizedData = cache.get(object);\n\n if (memoizedData) {\n delete memoizedData[key];\n }\n}\n","import type {\n EventObject,\n StateValue,\n BooleanGuardDefinition,\n GuardConfig,\n GuardDefinition,\n SCXML,\n GuardPredicate,\n MachineContext\n} from './types.ts';\nimport { isStateId } from './stateUtils.ts';\nimport { isFunction, isString } from './utils.ts';\nimport type { State } from './State.ts';\n\nexport function stateIn<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(stateValue: StateValue): GuardDefinition<TContext, TEvent> {\n return {\n type: 'xstate.guard:in',\n params: { stateValue },\n predicate: ({ state }) => {\n if (isString(stateValue) && isStateId(stateValue)) {\n return state.configuration.some((sn) => sn.id === stateValue.slice(1));\n }\n\n return state.matches(stateValue);\n }\n };\n}\n\nexport function not<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n guard: GuardConfig<TContext, TEvent>\n): BooleanGuardDefinition<TContext, TEvent> {\n return {\n type: 'xstate.boolean',\n params: { op: 'not' },\n children: [toGuardDefinition(guard)],\n predicate: ({ evaluate, guard, context, _event, state }) => {\n return !evaluate(guard.children![0], context, _event, state);\n }\n };\n}\n\nexport function and<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n guards: Array<GuardConfig<TContext, TEvent>>\n): BooleanGuardDefinition<TContext, TEvent> {\n return {\n type: 'xstate.boolean',\n params: { op: 'and' },\n children: guards.map((guard) => toGuardDefinition(guard)),\n predicate: ({ evaluate, guard, context, _event, state }) => {\n return guard.children!.every((childGuard) => {\n return evaluate(childGuard, context, _event, state);\n });\n }\n };\n}\n\nexport function or<TContext extends MachineContext, TEvent extends EventObject>(\n guards: Array<GuardConfig<TContext, TEvent>>\n): BooleanGuardDefinition<TContext, TEvent> {\n return {\n type: 'xstate.boolean',\n params: { op: 'or' },\n children: guards.map((guard) => toGuardDefinition(guard)),\n predicate: ({ evaluate, guard, context, _event, state }) => {\n return guard.children!.some((childGuard) => {\n return evaluate(childGuard, context, _event, state);\n });\n }\n };\n}\n\nexport function evaluateGuard<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n guard: GuardDefinition<TContext, TEvent>,\n context: TContext,\n _event: SCXML.Event<TEvent>,\n state: State<TContext, TEvent>\n): boolean {\n const { machine } = state;\n\n const predicate = machine?.options?.guards?.[guard.type] ?? guard.predicate;\n\n if (!predicate) {\n throw new Error(`Guard '${guard.type}' is not implemented.'.`);\n }\n\n return predicate({\n context,\n event: _event.data,\n state,\n guard,\n _event,\n evaluate: evaluateGuard\n });\n}\n\nexport function toGuardDefinition<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n guardConfig: GuardConfig<TContext, TEvent>,\n getPredicate?: (guardType: string) => GuardPredicate<TContext, TEvent>\n): GuardDefinition<TContext, TEvent> {\n if (isString(guardConfig)) {\n return {\n type: guardConfig,\n predicate: getPredicate?.(guardConfig) || undefined,\n params: { type: guardConfig }\n };\n }\n\n if (isFunction(guardConfig)) {\n return {\n type: guardConfig.name,\n predicate: guardConfig,\n params: {\n type: guardConfig.name,\n name: guardConfig.name\n }\n };\n }\n\n return {\n type: guardConfig.type,\n params: guardConfig.params || guardConfig,\n children: (\n guardConfig.children as Array<GuardConfig<TContext, TEvent>>\n )?.map((childGuard) => toGuardDefinition(childGuard, getPredicate)),\n predicate:\n getPredicate?.(guardConfig.type) || (guardConfig as any).predicate\n };\n}\n","import {\n toStatePath,\n toArray,\n warn,\n isArray,\n isFunction,\n isString,\n toTransitionConfigArray,\n normalizeTarget,\n toStateValue,\n mapContext,\n toSCXMLEvent\n} from './utils.ts';\nimport {\n BaseActionObject,\n EventObject,\n InvokeActionObject,\n StopActionObject,\n StateValue,\n TransitionConfig,\n TransitionDefinition,\n SingleOrArray,\n DelayExpr,\n SCXML,\n StateValueMap,\n RaiseActionObject,\n InitialTransitionConfig,\n MachineContext\n} from './types.ts';\nimport { cloneState, State } from './State.ts';\nimport {\n after,\n done,\n toActionObjects,\n actionTypes,\n resolveActionObject\n} from './actions.ts';\nimport { send } from './actions/send.ts';\nimport { cancel } from './actions/cancel.ts';\nimport { invoke } from './actions/invoke.ts';\nimport { stop } from './actions/stop.ts';\nimport { IS_PRODUCTION } from './environment.ts';\nimport { STATE_IDENTIFIER, NULL_EVENT, WILDCARD } from './constants.ts';\nimport { evaluateGuard, toGuardDefinition } from './guards.ts';\nimport type { StateNode } from './StateNode.ts';\nimport { isDynamicAction } from '../actions/dynamicAction.ts';\nimport {\n AnyActorContext,\n AnyEventObject,\n AnyHistoryValue,\n AnyState,\n AnyStateMachine,\n AnyStateNode,\n AnyTransitionDefinition,\n DelayedTransitionDefinition,\n HistoryValue,\n InitialTransitionDefinition,\n SendActionObject,\n StateFromMachine\n} from '.';\nimport { stopSignalType } from './actors/index.ts';\nimport { ActorStatus } from './interpreter.ts';\n\ntype Configuration<\n TContext extends MachineContext,\n TE extends EventObject\n> = Iterable<StateNode<TContext, TE>>;\ntype AnyConfiguration = Configuration<any, any>;\n\ntype AdjList = Map<AnyStateNode, Array<AnyStateNode>>;\n\nfunction getOutput<TContext extends MachineContext, TEvent extends EventObject>(\n configuration: StateNode<TContext, TEvent>[],\n context: TContext,\n _event: SCXML.Event<TEvent>\n) {\n const machine = configuration[0].machine;\n const finalChildStateNode = configuration.find(\n (stateNode) =>\n stateNode.type === 'final' && stateNode.parent === machine.root\n );\n\n return finalChildStateNode && finalChildStateNode.output\n ? mapContext(finalChildStateNode.output, context, _event)\n : undefined;\n}\n\nconst isAtomicStateNode = (stateNode: StateNode<any, any>) =>\n stateNode.type === 'atomic' || stateNode.type === 'final';\n\nfunction getChildren<TContext extends MachineContext, TE extends EventObject>(\n stateNode: StateNode<TContext, TE>\n): Array<StateNode<TContext, TE>> {\n return Object.values(stateNode.states).filter((sn) => sn.type !== 'history');\n}\n\nfunction getProperAncestors(\n stateNode: AnyStateNode,\n toStateNode: AnyStateNode | null\n): Array<typeof stateNode> {\n const ancestors: Array<typeof stateNode> = [];\n\n // add all ancestors\n let m = stateNode.parent;\n while (m && m !== toStateNode) {\n ancestors.push(m);\n m = m.parent;\n }\n\n return ancestors;\n}\n\nexport function getConfiguration(\n stateNodes: Iterable<AnyStateNode>\n): Set<AnyStateNode> {\n const configuration = new Set(stateNodes);\n const configurationSet = new Set(stateNodes);\n\n const adjList = getAdjList(configurationSet);\n\n // add descendants\n for (const s of configuration) {\n // if previously active, add existing child nodes\n if (s.type === 'compound' && (!adjList.get(s) || !adjList.get(s)!.length)) {\n getInitialStateNodes(s).forEach((sn) => configurationSet.add(sn));\n } else {\n if (s.type === 'parallel') {\n for (const child of getChildren(s)) {\n if (child.type === 'history') {\n continue;\n }\n\n if (!configurationSet.has(child)) {\n for (const initialStateNode of getInitialStateNodes(child)) {\n configurationSet.add(initialStateNode);\n }\n }\n }\n }\n }\n }\n\n // add all ancestors\n for (const s of configurationSet) {\n let m = s.parent;\n\n while (m) {\n configurationSet.add(m);\n m = m.parent;\n }\n }\n\n return configurationSet;\n}\n\nfunction getValueFromAdj(baseNode: AnyStateNode, adjList: AdjList): StateValue {\n const childStateNodes = adjList.get(baseNode);\n\n if (!childStateNodes) {\n return {}; // todo: fix?\n }\n\n if (baseNode.type === 'compound') {\n const childStateNode = childStateNodes[0];\n if (childStateNode) {\n if (isAtomicStateNode(childStateNode)) {\n return childStateNode.key;\n }\n } else {\n return {};\n }\n }\n\n const stateValue = {};\n for (const childStateNode of childStateNodes) {\n stateValue[childStateNode.key] = getValueFromAdj(childStateNode, adjList);\n }\n\n return stateValue;\n}\n\nexport function getAdjList<\n TContext extends MachineContext,\n TE extends EventObject\n>(configuration: Configuration<TContext, TE>): AdjList {\n const adjList: AdjList = new Map();\n\n for (const s of configuration) {\n if (!adjList.has(s)) {\n adjList.set(s, []);\n }\n\n if (s.parent) {\n if (!adjList.has(s.parent)) {\n adjList.set(s.parent, []);\n }\n\n adjList.get(s.parent)!.push(s);\n }\n }\n\n return adjList;\n}\n\nexport function getStateValue(\n rootNode: AnyStateNode,\n configuration: AnyConfiguration\n): StateValue {\n const config = getConfiguration(configuration);\n return getValueFromAdj(rootNode, getAdjList(config));\n}\n\nexport function isInFinalState(\n configuration: Array<AnyStateNode>,\n stateNode: AnyStateNode = configuration[0].machine.root\n): boolean {\n if (stateNode.type === 'compound') {\n return getChildren(stateNode).some(\n (s) => s.type === 'final' && configuration.includes(s)\n );\n }\n if (stateNode.type === 'parallel') {\n return getChildren(stateNode).every((sn) =>\n isInFinalState(configuration, sn)\n );\n }\n\n return false;\n}\n\nexport const isStateId = (str: string) => str[0] === STATE_IDENTIFIER;\n\nexport function getCandidates<TEvent extends EventObject>(\n stateNode: StateNode<any, TEvent>,\n receivedEventType: TEvent['type'],\n /**\n * If `true`, will use SCXML event partial token matching semantics\n * without the need for the \".*\" suffix\n */\n partialMatch: boolean = false\n): Array<TransitionDefinition<any, TEvent>> {\n const candidates = stateNode.transitions.filter((transition) => {\n const { eventType } = transition;\n // First, check the trivial case: event names are exactly equal\n if (eventType === receivedEventType) {\n return true;\n }\n\n // Then, check if transition is a wildcard transition,\n // which matches any non-transient events\n if (eventType === WILDCARD) {\n return true;\n }\n\n if (!partialMatch && !eventType.endsWith('.*')) {\n return false;\n }\n\n if (!IS_PRODUCTION) {\n warn(\n !/.*\\*.+/.test(eventType),\n `Wildcards can only be the last token of an event descriptor (e.g., \"event.*\") or the entire event descriptor (\"*\"). Check the \"${eventType}\" event.`\n );\n }\n\n const partialEventTokens = eventType.split('.');\n const eventTokens = receivedEventType.split('.');\n\n for (\n let tokenIndex = 0;\n tokenIndex < partialEventTokens.length;\n tokenIndex++\n ) {\n const partialEventToken = partialEventTokens[tokenIndex];\n const eventToken = eventTokens[tokenIndex];\n\n if (partialEventToken === '*') {\n const isLastToken = tokenIndex === partialEventTokens.length - 1;\n\n if (!IS_PRODUCTION) {\n warn(\n isLastToken,\n `Infix wildcards in transition events are not allowed. Check the \"${eventType}\" event.`\n );\n }\n\n return isLastToken;\n }\n\n if (partialEventToken !== eventToken) {\n return false;\n }\n }\n\n return true;\n });\n\n return candidates;\n}\n\n/**\n * All delayed transitions from the config.\n */\nexport function getDelayedTransitions<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n stateNode: AnyStateNode\n): Array<DelayedTransitionDefinition<TContext, TEvent>> {\n const afterConfig = stateNode.config.after;\n if (!afterConfig) {\n return [];\n }\n\n const mutateEntryExit = (\n delay: string | number | DelayExpr<TContext, TEvent>,\n i: number\n ) => {\n const delayRef = isFunction(delay) ? `${stateNode.id}:delay[${i}]` : delay;\n const eventType = after(delayRef, stateNode.id);\n stateNode.entry.push(send({ type: eventType }, { delay }));\n stateNode.exit.push(cancel(eventType));\n return eventType;\n };\n\n const delayedTransitions = isArray(afterConfig)\n ? afterConfig.map((transition, i) => {\n const eventType = mutateEntryExit(transition.delay, i);\n return { ...transition, event: eventType };\n })\n : Object.keys(afterConfig).flatMap((delay, i) => {\n const configTransition = afterConfig[delay];\n const resolvedTransition = isString(configTransition)\n ? { target: configTransition }\n : configTransition;\n const resolvedDelay = !isNaN(+delay) ? +delay : delay;\n const eventType = mutateEntryExit(resolvedDelay, i);\n return toArray(resolvedTransition).map((transition) => ({\n ...transition,\n event: eventType,\n delay: resolvedDelay\n }));\n });\n return delayedTransitions.map((delayedTransition) => {\n const { delay } = delayedTransition;\n return {\n ...formatTransition(stateNode, delayedTransition),\n delay\n };\n });\n}\n\nexport function formatTransition<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n stateNode: AnyStateNode,\n transitionConfig: TransitionConfig<TContext, TEvent> & {\n event: TEvent['type'] | typeof NULL_EVENT | '*';\n }\n): AnyTransitionDefinition {\n const normalizedTarget = normalizeTarget(transitionConfig.target);\n const reenter = transitionConfig.reenter ?? false;\n const { guards } = stateNode.machine.options;\n const target = resolveTarget(stateNode, normalizedTarget);\n\n // TODO: should this be part of a lint rule instead?\n if (!IS_PRODUCTION && (transitionConfig as any).cond) {\n throw new Error(\n `State \"${stateNode.id}\" has declared \\`cond\\` for one of its transitions. This property has been renamed to \\`guard\\`. Please update your code.`\n );\n }\n const transition = {\n ...transitionConfig,\n actions: toActionObjects(toArray(transitionConfig.actions)),\n guard: transitionConfig.guard\n ? toGuardDefinition(\n transitionConfig.guard,\n (guardType) => guards[guardType]\n )\n : undefined,\n target,\n source: stateNode,\n reenter,\n eventType: transitionConfig.event,\n toJSON: () => ({\n ...transition,\n source: `#${stateNode.id}`,\n target: target ? target.map((t) => `#${t.id}`) : undefined\n })\n };\n\n return transition;\n}\n\nexport function formatTransitions<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(stateNode: AnyStateNode): Array<AnyTransitionDefinition> {\n const transitionConfigs: Array<\n TransitionConfig<TContext, TEvent> & {\n event: string;\n }\n > = [];\n if (Array.isArray(stateNode.config.on)) {\n transitionConfigs.push(...stateNode.config.on);\n } else if (stateNode.config.on) {\n const { [WILDCARD]: wildcardConfigs = [], ...namedTransitionConfigs } =\n stateNode.config.on;\n for (const eventType of Object.keys(namedTransitionConfigs)) {\n if (eventType === NULL_EVENT) {\n throw new Error(\n 'Null events (\"\") cannot be specified as a transition key. Use `always: { ... }` instead.'\n );\n }\n const eventTransitionConfigs = toTransitionConfigArray<TContext, TEvent>(\n eventType,\n namedTransitionConfigs![eventType as string]\n );\n\n transitionConfigs.push(...eventTransitionConfigs);\n // TODO: add dev-mode validation for unreachable transitions\n }\n transitionConfigs.push(\n ...toTransitionConfigArray(\n WILDCARD,\n wildcardConfigs as SingleOrArray<\n TransitionConfig<TContext, TEvent> & {\n event: '*';\n }\n >\n )\n );\n }\n const doneConfig = stateNode.config.onDone\n ? toTransitionConfigArray(\n String(done(stateNode.id)),\n stateNode.config.onDone\n )\n : [];\n const invokeConfig = stateNode.invoke.flatMap((invokeDef) => {\n const settleTransitions: any[] = [];\n if (invokeDef.onDone) {\n settleTransitions.push(\n ...toTransitionConfigArray(\n `done.invoke.${invokeDef.id}`,\n invokeDef.onDone\n )\n );\n }\n if (invokeDef.onError) {\n settleTransitions.push(\n ...toTransitionConfigArray(\n `error.platform.${invokeDef.id}`,\n invokeDef.onError\n )\n );\n }\n if (invokeDef.onSnapshot) {\n settleTransitions.push(\n ...toTransitionConfigArray(\n `xstate.snapshot.${invokeDef.id}`,\n invokeDef.onSnapshot\n )\n );\n }\n return settleTransitions;\n });\n const delayedTransitions = stateNode.after;\n const formattedTransitions = [\n ...doneConfig,\n ...invokeConfig,\n ...transitionConfigs\n ].flatMap(\n (\n transitionConfig: TransitionConfig<TContext, TEvent> & {\n event: TEvent['type'] | '*';\n }\n ) =>\n toArray(transitionConfig).map((transition) =>\n formatTransition(stateNode, transition)\n )\n );\n for (const delayedTransition of delayedTransitions) {\n formattedTransitions.push(delayedTransition as any);\n }\n return formattedTransitions;\n}\n\nexport function formatInitialTransition<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n stateNode: AnyStateNode,\n _target: SingleOrArray<string> | InitialTransitionConfig<TContext, TEvent>\n): InitialTransitionDefinition<TContext, TEvent> {\n if (isString(_target) || isArray(_target)) {\n const targets = toArray(_target).map((t) => {\n // Resolve state string keys (which represent children)\n // to their state node\n const descStateNode = isString(t)\n ? isStateId(t)\n ? stateNode.machine.getStateNodeById(t)\n : stateNode.states[t]\n : t;\n\n if (!descStateNode) {\n throw new Error(\n `Initial state node \"${t}\" not found on parent state node #${stateNode.id}`\n );\n }\n\n if (!isDescendant(descStateNode, stateNode)) {\n throw new Error(\n `Invalid initial target: state node #${descStateNode.id} is not a descendant of #${stateNode.id}`\n );\n }\n\n return descStateNode;\n });\n const resolvedTarget = resolveTarget(stateNode, targets);\n\n const transition = {\n source: stateNode,\n actions: [],\n eventType: null as any,\n reenter: false,\n target: resolvedTarget!,\n toJSON: () => ({\n ...transition,\n source: `#${stateNode.id}`,\n target: resolvedTarget\n ? resolvedTarget.map((t) => `#${t.id}`)\n : undefined\n })\n };\n\n return transition;\n }\n\n return formatTransition(stateNode, {\n target: toArray(_target.target).map((t) => {\n if (isString(t)) {\n return isStateId(t) ? t : `${stateNode.machine.delimiter}${t}`;\n }\n\n return t;\n }),\n actions: _target.actions,\n event: null as any\n }) as InitialTransitionDefinition<TContext, TEvent>;\n}\n\nexport function resolveTarget(\n stateNode: AnyStateNode,\n targets: Array<string | AnyStateNode> | undefined\n): Array<AnyStateNode> | undefined {\n if (targets === undefined) {\n // an undefined target signals that the state node should not transition from that state when receiving that event\n return undefined;\n }\n return targets.map((target) => {\n if (!isString(target)) {\n return target;\n }\n if (isStateId(target)) {\n return stateNode.machine.getStateNodeById(target);\n }\n\n const isInternalTarget = target[0] === stateNode.machine.delimiter;\n // If internal target is defined on machine,\n // do not include machine key on target\n if (isInternalTarget && !stateNode.parent) {\n return getStateNodeByPath(stateNode, target.slice(1));\n }\n const resolvedTarget = isInternalTarget ? stateNode.key + target : target;\n if (stateNode.parent) {\n try {\n const targetStateNode = getStateNodeByPath(\n stateNode.parent,\n resolvedTarget\n );\n return targetStateNode;\n } catch (err) {\n throw new Error(\n `Invalid transition definition for state node '${stateNode.id}':\\n${err.message}`\n );\n }\n } else {\n throw new Error(\n `Invalid target: \"${target}\" is not a valid target from the root node. Did you mean \".${target}\"?`\n );\n }\n });\n}\n\nfunction resolveHistoryTarget<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(stateNode: AnyStateNode & { type: 'history' }): Array<AnyStateNode> {\n const normalizedTarget = normalizeTarget<TContext, TEvent>(stateNode.target);\n if (!normalizedTarget) {\n return stateNode.parent!.initial.target;\n }\n return normalizedTarget.map((t) =>\n typeof t === 'string' ? getStateNodeByPath(stateNode.parent!, t) : t\n );\n}\n\nfunction isHistoryNode(\n stateNode: AnyStateNode\n): stateNode is AnyStateNode & { type: 'history' } {\n return stateNode.type === 'history';\n}\n\nexport function getInitialStateNodes(\n stateNode: AnyStateNode\n): Array<AnyStateNode> {\n const set = new Set<AnyStateNode>();\n\n function iter(descStateNode: AnyStateNode): void {\n if (set.has(descStateNode)) {\n return;\n }\n set.add(descStateNode);\n if (descStateNode.type === 'compound') {\n for (const targetStateNode of descStateNode.initial.target) {\n for (const a of getProperAncestors(targetStateNode, stateNode)) {\n set.add(a);\n }\n\n iter(targetStateNode);\n }\n } else if (descStateNode.type === 'parallel') {\n for (const child of getChildren(descStateNode)) {\n iter(child);\n }\n }\n }\n\n iter(stateNode);\n\n return [...set];\n}\n/**\n * Returns the child state node from its relative `stateKey`, or throws.\n */\nexport function getStateNode(\n stateNode: AnyStateNode,\n stateKey: string\n): AnyStateNode {\n if (isStateId(stateKey)) {\n return stateNode.machine.getStateNodeById(stateKey);\n }\n if (!stateNode.states) {\n throw new Error(\n `Unable to retrieve child state '${stateKey}' from '${stateNode.id}'; no child states exist.`\n );\n }\n const result = stateNode.states[stateKey];\n if (!result) {\n throw new Error(\n `Child state '${stateKey}' does not exist on '${stateNode.id}'`\n );\n }\n return result;\n}\n\n/**\n * Returns the relative state node from the given `statePath`, or throws.\n *\n * @param statePath The string or string array relative path to the state node.\n */\nexport function getStateNodeByPath(\n stateNode: AnyStateNode,\n statePath: string | string[]\n): AnyStateNode {\n if (typeof statePath === 'string' && isStateId(statePath)) {\n try {\n return stateNode.machine.getStateNodeById(statePath);\n } catch (e) {\n // try individual paths\n // throw e;\n }\n }\n const arrayStatePath = toStatePath(\n statePath,\n stateNode.machine.delimiter\n ).slice();\n let currentStateNode: AnyStateNode = stateNode;\n while (arrayStatePath.length) {\n const key = arrayStatePath.shift()!;\n if (!key.length) {\n break;\n }\n currentStateNode = getStateNode(currentStateNode, key);\n }\n return currentStateNode;\n}\n\n/**\n * Returns the state nodes represented by the current state value.\n *\n * @param state The state value or State instance\n */\nexport function getStateNodes<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n stateNode: AnyStateNode,\n state: StateValue | State<TContext, TEvent>\n): Array<AnyStateNode> {\n const stateValue =\n state instanceof State\n ? state.value\n : toStateValue(state, stateNode.machine.delimiter);\n\n if (isString(stateValue)) {\n return [stateNode, stateNode.states[stateValue]];\n }\n\n const childStateKeys = Object.keys(stateValue);\n const childStateNodes: Array<AnyStateNode> = childStateKeys\n .map((subStateKey) => getStateNode(stateNode, subStateKey))\n .filter(Boolean);\n\n return [stateNode.machine.root, stateNode].concat(\n childStateNodes,\n childStateKeys.reduce((allSubStateNodes, subStateKey) => {\n const subStateNode = getStateNode(stateNode, subStateKey);\n if (!subStateNode) {\n return allSubStateNodes;\n }\n const subStateNodes = getStateNodes(\n subStateNode,\n stateValue[subStateKey]\n );\n\n return allSubStateNodes.concat(subStateNodes);\n }, [] as Array<AnyStateNode>)\n );\n}\n\nexport function transitionAtomicNode<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n stateNode: AnyStateNode,\n stateValue: string,\n state: State<TContext, TEvent>,\n _event: SCXML.Event<TEvent>\n): Array<TransitionDefinition<TContext, TEvent>> | undefined {\n const childStateNode = getStateNode(stateNode, stateValue);\n const next = childStateNode.next(state, _event);\n\n if (!next || !next.length) {\n return stateNode.next(state, _event);\n }\n\n return next;\n}\n\nexport function transitionCompoundNode<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n stateNode: AnyStateNode,\n stateValue: StateValueMap,\n state: State<TContext, TEvent>,\n _event: SCXML.Event<TEvent>\n): Array<TransitionDefinition<TContext, TEvent>> | undefined {\n const subStateKeys = Object.keys(stateValue);\n\n const childStateNode = getStateNode(stateNode, subStateKeys[0]);\n const next = transitionNode(\n childStateNode,\n stateValue[subStateKeys[0]],\n state,\n _event\n );\n\n if (!next || !next.length) {\n return stateNode.next(state, _event);\n }\n\n return next;\n}\n\nexport function transitionParallelNode<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n stateNode: AnyStateNode,\n stateValue: StateValueMap,\n state: State<TContext, TEvent>,\n _event: SCXML.Event<TEvent>\n): Array<TransitionDefinition<TContext, TEvent>> | undefined {\n const allInnerTransitions: Array<TransitionDefinition<TContext, TEvent>> = [];\n\n for (const subStateKey of Object.keys(stateValue)) {\n const subStateValue = stateValue[subStateKey];\n\n if (!subStateValue) {\n continue;\n }\n\n const subStateNode = getStateNode(stateNode, subStateKey);\n const innerTransitions = transitionNode(\n subStateNode,\n subStateValue,\n state,\n _event\n );\n if (innerTransitions) {\n allInnerTransitions.push(...innerTransitions);\n }\n }\n if (!allInnerTransitions.length) {\n return stateNode.next(state, _event);\n }\n\n return allInnerTransitions;\n}\n\nexport function transitionNode<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n stateNode: AnyStateNode,\n stateValue: StateValue,\n state: State<TContext, TEvent, any>,\n _event: SCXML.Event<TEvent>\n): Array<TransitionDefinition<TContext, TEvent>> | undefined {\n // leaf node\n if (isString(stateValue)) {\n return transitionAtomicNode(stateNode, stateValue, state, _event);\n }\n\n // compound node\n if (Object.keys(stateValue).length === 1) {\n return transitionCompoundNode(stateNode, stateValue, state, _event);\n }\n\n // parallel node\n return transitionParallelNode(stateNode, stateValue, state, _event);\n}\n\nfunction getHistoryNodes(stateNode: AnyStateNode): Array<AnyStateNode> {\n return Object.keys(stateNode.states)\n .map((key) => stateNode.states[key])\n .filter((sn) => sn.type === 'history');\n}\n\nfunction isDescendant(\n childStateNode: AnyStateNode,\n parentStateNode: AnyStateNode\n): boolean {\n let marker = childStateNode;\n while (marker.parent && marker.parent !== parentStateNode) {\n marker = marker.parent;\n }\n\n return marker.parent === parentStateNode;\n}\n\nfunction getPathFromRootToNode(stateNode: AnyStateNode): Array<AnyStateNode> {\n const path: Array<AnyStateNode> = [];\n let marker = stateNode.parent;\n\n while (marker) {\n path.unshift(marker);\n marker = marker.parent;\n }\n\n return path;\n}\n\nfunction hasIntersection<T>(s1: Iterable<T>, s2: Iterable<T>): boolean {\n const set1 = new Set(s1);\n const set2 = new Set(s2);\n\n for (const item of set1) {\n if (set2.has(item)) {\n return true;\n }\n }\n for (const item of set2) {\n if (set1.has(item)) {\n return true;\n }\n }\n return false;\n}\n\nexport function removeConflictingTransitions(\n enabledTransitions: Array<AnyTransitionDefinition>,\n configuration: Set<AnyStateNode>,\n historyValue: AnyHistoryValue\n): Array<AnyTransitionDefinition> {\n const filteredTransitions = new Set<AnyTransitionDefinition>();\n\n for (const t1 of enabledTransitions) {\n let t1Preempted = false;\n const transitionsToRemove = new Set<AnyTransitionDefinition>();\n for (const t2 of filteredTransitions) {\n if (\n hasIntersection(\n computeExitSet([t1], configuration, historyValue),\n computeExitSet([t2], configuration, historyValue)\n )\n ) {\n if (isDescendant(t1.source, t2.source)) {\n transitionsToRemove.add(t2);\n } else {\n t1Preempted = true;\n break;\n }\n }\n }\n if (!t1Preempted) {\n for (const t3 of transitionsToRemove) {\n filteredTransitions.delete(t3);\n }\n filteredTransitions.add(t1);\n }\n }\n\n return Array.from(filteredTransitions);\n}\n\nfunction findLCCA(stateNodes: Array<AnyStateNode>): AnyStateNode {\n const [head] = stateNodes;\n\n let current = getPathFromRootToNode(head);\n let candidates: Array<AnyStateNode> = [];\n\n for (const stateNode of stateNodes) {\n const path = getPathFromRootToNode(stateNode);\n\n candidates = current.filter((sn) => path.includes(sn));\n current = candidates;\n candidates = [];\n }\n\n return current[current.length - 1];\n}\n\nfunction getEffectiveTargetStates(\n transition: AnyTransitionDefinition,\n historyValue: AnyHistoryValue\n): Array<AnyStateNode> {\n if (!transition.target) {\n return [];\n }\n\n const targets = new Set<AnyStateNode>();\n\n for (const targetNode of transition.target) {\n if (isHistoryNode(targetNode)) {\n if (historyValue[targetNode.id]) {\n for (const node of historyValue[targetNode.id]) {\n targets.add(node);\n }\n } else {\n for (const node of getEffectiveTargetStates(\n {\n target: resolveHistoryTarget(targetNode)\n } as AnyTransitionDefinition,\n historyValue\n )) {\n targets.add(node);\n }\n }\n } else {\n targets.add(targetNode);\n }\n }\n\n return [...targets];\n}\n\nfunction getTransitionDomain(\n transition: AnyTransitionDefinition,\n historyValue: AnyHistoryValue\n): AnyStateNode | null {\n const targetStates = getEffectiveTargetStates(transition, historyValue);\n\n if (!targetStates) {\n return null;\n }\n\n if (\n !transition.reenter &&\n transition.source.type !== 'parallel' &&\n targetStates.every((targetStateNode) =>\n isDescendant(targetStateNode, transition.source)\n )\n ) {\n return transition.source;\n }\n\n const lcca = findLCCA(targetStates.concat(transition.source));\n\n return lcca;\n}\n\nfunction computeExitSet(\n transitions: AnyTransitionDefinition[],\n configuration: Set<AnyStateNode>,\n historyValue: AnyHistoryValue\n): Array<AnyStateNode> {\n const statesToExit = new Set<AnyStateNode>();\n\n for (const t of transitions) {\n if (t.target?.length) {\n const domain = getTransitionDomain(t, historyValue);\n\n for (const stateNode of configuration) {\n if (isDescendant(stateNode, domain!)) {\n statesToExit.add(stateNode);\n }\n }\n }\n }\n\n return [...statesToExit];\n}\n\n/**\n * https://www.w3.org/TR/scxml/#microstepProcedure\n *\n * @private\n * @param transitions\n * @param currentState\n * @param mutConfiguration\n */\n\nexport function microstep<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n transitions: Array<TransitionDefinition<TContext, TEvent>>,\n currentState: State<TContext, TEvent, any>,\n actorCtx: AnyActorContext | undefined,\n scxmlEvent: SCXML.Event<TEvent>\n): State<TContext, TEvent, any> {\n const { machine } = currentState;\n // Transition will \"apply\" if:\n // - the state node is the initial state (there is no current state)\n // - OR there are transitions\n const willTransition = currentState._initial || transitions.length > 0;\n\n const mutConfiguration = new Set(currentState.configuration);\n\n if (!currentState._initial && !willTransition) {\n const inertState = cloneState(currentState, {\n _event: scxmlEvent,\n actions: [],\n transitions: []\n });\n\n inertState.changed = false;\n return inertState;\n }\n\n const microstate = microstepProcedure(\n currentState._initial\n ? [\n {\n target: [...currentState.configuration].filter(isAtomicStateNode),\n source: machine.root,\n reenter: true,\n actions: [],\n eventType: null as any,\n toJSON: null as any // TODO: fix\n }\n ]\n : transitions,\n currentState,\n mutConfiguration,\n scxmlEvent,\n actorCtx\n );\n\n const { context, actions: nonRaisedActions } = microstate;\n\n const children = setChildren(currentState, nonRaisedActions);\n\n const nextState = cloneState(microstate, {\n value: {}, // TODO: make optional\n transitions,\n children\n });\n\n nextState.changed = currentState._initial\n ? undefined\n : !stateValuesEqual(nextState.value, currentState.value) ||\n nextState.actions.length > 0 ||\n context !== currentState.context;\n\n return nextState;\n}\n\nfunction setChildren(\n currentState: AnyState,\n nonRaisedActions: BaseActionObject[]\n) {\n const children = { ...currentState.children };\n for (const action of nonRaisedActions) {\n if (\n action.type === actionTypes.invoke &&\n (action as InvokeActionObject).params.ref\n ) {\n const ref = (action as InvokeActionObject).params.ref;\n if (ref) {\n children[ref.id] = ref;\n }\n } else if (action.type === actionTypes.stop) {\n const ref = (action as StopActionObject).params.actor;\n if (ref) {\n delete children[ref.id];\n }\n }\n }\n return children;\n}\n\nfunction microstepProcedure(\n transitions: Array<AnyTransitionDefinition>,\n currentState: AnyState,\n mutConfiguration: Set<AnyStateNode>,\n scxmlEvent: SCXML.Event<AnyEventObject>,\n actorCtx: AnyActorContext | undefined\n): typeof currentState {\n const { machine } = currentState;\n const actions: BaseActionObject[] = [];\n const historyValue = {\n ...currentState.historyValue\n };\n\n const filteredTransitions = removeConflictingTransitions(\n transitions,\n mutConfiguration,\n historyValue\n );\n\n const internalQueue = [...currentState._internalQueue];\n\n // Exit states\n if (!currentState._initial) {\n exitStates(filteredTransitions, mutConfiguration, historyValue, actions);\n }\n\n // Execute transition content\n actions.push(...filteredTransitions.flatMap((t) => t.actions));\n\n // Enter states\n enterStates(\n filteredTransitions,\n mutConfiguration,\n actions,\n internalQueue,\n currentState,\n historyValue\n );\n\n const nextConfiguration = [...mutConfiguration];\n\n const done = isInFinalState(nextConfiguration);\n\n if (done) {\n const finalActions = nextConfiguration\n .sort((a, b) => b.order - a.order)\n .flatMap((state) => state.exit);\n actions.push(...finalActions);\n }\n\n try {\n const { nextState } = resolveActionsAndContext(\n actions,\n scxmlEvent,\n currentState,\n actorCtx\n );\n\n const output = done\n ? getOutput(nextConfiguration, nextState.context, scxmlEvent)\n : undefined;\n\n internalQueue.push(...nextState._internalQueue);\n\n return cloneState(currentState, {\n actions: nextState.actions,\n configuration: nextConfiguration,\n historyValue,\n _internalQueue: internalQueue,\n context: nextState.context,\n _event: scxmlEvent,\n done,\n output,\n children: nextState.children\n });\n } catch (e) {\n // TODO: Refactor this once proper error handling is implemented.\n // See https://github.com/statelyai/rfcs/pull/4\n if (machine.config.scxml) {\n return cloneState(currentState, {\n actions: [],\n configuration: Array.from(mutConfiguration),\n historyValue,\n _internalQueue: [toSCXMLEvent({ type: 'error.execution' })],\n context: currentState.context\n });\n } else {\n throw e;\n }\n }\n}\n\nfunction enterStates(\n filteredTransitions: AnyTransitionDefinition[],\n mutConfiguration: Set<AnyStateNode>,\n actions: BaseActionObject[],\n internalQueue: SCXML.Event<AnyEventObject>[],\n currentState: AnyState,\n historyValue: HistoryValue<any, any>\n): void {\n const statesToEnter = new Set<AnyStateNode>();\n const statesForDefaultEntry = new Set<AnyStateNode>();\n\n computeEntrySet(\n filteredTransitions,\n historyValue,\n statesForDefaultEntry,\n statesToEnter\n );\n\n // In the initial state, the root state node is \"entered\".\n if (currentState._initial) {\n statesForDefaultEntry.add(currentState.machine.root);\n }\n\n for (const stateNodeToEnter of [...statesToEnter].sort(\n (a, b) => a.order - b.order\n )) {\n mutConfiguration.add(stateNodeToEnter);\n\n for (const invokeDef of stateNodeToEnter.invoke) {\n actions.push(invoke(invokeDef));\n }\n\n // Add entry actions\n actions.push(...stateNodeToEnter.entry);\n\n if (statesForDefaultEntry.has(stateNodeToEnter)) {\n for (const stateNode of statesForDefaultEntry) {\n const initialActions = stateNode.initial!.actions;\n actions.push(...initialActions);\n }\n }\n if (stateNodeToEnter.type === 'final') {\n const parent = stateNodeToEnter.parent!;\n\n if (!parent.parent) {\n continue;\n }\n\n internalQueue.push(\n toSCXMLEvent(\n done(\n parent!.id,\n stateNodeToEnter.output\n ? mapContext(\n stateNodeToEnter.output,\n currentState.context,\n currentState._event\n )\n : undefined\n )\n )\n );\n\n if (parent.parent) {\n const grandparent = parent.parent;\n\n if (grandparent.type === 'parallel') {\n if (\n getChildren(grandparent).every((parentNode) =>\n isInFinalState([...mutConfiguration], parentNode)\n )\n ) {\n internalQueue.push(toSCXMLEvent(done(grandparent.id)));\n }\n }\n }\n }\n }\n}\n\nfunction computeEntrySet(\n transitions: Array<AnyTransitionDefinition>,\n historyValue: HistoryValue<any, any>,\n statesForDefaultEntry: Set<AnyStateNode>,\n statesToEnter: Set<AnyStateNode>\n) {\n for (const t of transitions) {\n for (const s of t.target || []) {\n addDescendantStatesToEnter(\n s,\n historyValue,\n statesForDefaultEntry,\n statesToEnter\n );\n }\n const ancestor = getTransitionDomain(t, historyValue);\n const targetStates = getEffectiveTargetStates(t, historyValue);\n for (const s of targetStates) {\n addAncestorStatesToEnter(\n s,\n ancestor,\n statesToEnter,\n historyValue,\n statesForDefaultEntry\n );\n }\n }\n}\n\nfunction addDescendantStatesToEnter<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n stateNode: AnyStateNode,\n historyValue: HistoryValue<any, any>,\n statesForDefaultEntry: Set<AnyStateNode>,\n statesToEnter: Set<AnyStateNode>\n) {\n if (isHistoryNode(stateNode)) {\n if (historyValue[stateNode.id]) {\n const historyStateNodes = historyValue[stateNode.id];\n for (const s of historyStateNodes) {\n addDescendantStatesToEnter(\n s,\n historyValue,\n statesForDefaultEntry,\n statesToEnter\n );\n }\n for (const s of historyStateNodes) {\n addAncestorStatesToEnter(\n s,\n stateNode.parent!,\n statesToEnter,\n historyValue,\n statesForDefaultEntry\n );\n for (const stateForDefaultEntry of statesForDefaultEntry) {\n statesForDefaultEntry.add(stateForDefaultEntry);\n }\n }\n } else {\n const targets = resolveHistoryTarget<TContext, TEvent>(stateNode);\n for (const s of targets) {\n addDescendantStatesToEnter(\n s,\n historyValue,\n statesForDefaultEntry,\n statesToEnter\n );\n }\n for (const s of targets) {\n addAncestorStatesToEnter(\n s,\n stateNode,\n statesToEnter,\n historyValue,\n statesForDefaultEntry\n );\n for (const stateForDefaultEntry of statesForDefaultEntry) {\n statesForDefaultEntry.add(stateForDefaultEntry);\n }\n }\n }\n } else {\n statesToEnter.add(stateNode);\n if (stateNode.type === 'compound') {\n statesForDefaultEntry.add(stateNode);\n const initialStates = stateNode.initial.target;\n\n for (const initialState of initialStates) {\n addDescendantStatesToEnter(\n initialState,\n historyValue,\n statesForDefaultEntry,\n statesToEnter\n );\n }\n\n for (const initialState of initialStates) {\n addAncestorStatesToEnter(\n initialState,\n stateNode,\n statesToEnter,\n historyValue,\n statesForDefaultEntry\n );\n }\n } else {\n if (stateNode.type === 'parallel') {\n for (const child of getChildren(stateNode).filter(\n (sn) => !isHistoryNode(sn)\n )) {\n if (![...statesToEnter].some((s) => isDescendant(s, child))) {\n addDescendantStatesToEnter(\n child,\n historyValue,\n statesForDefaultEntry,\n statesToEnter\n );\n }\n }\n }\n }\n }\n}\n\nfunction addAncestorStatesToEnter(\n stateNode: AnyStateNode,\n toStateNode: AnyStateNode | null,\n statesToEnter: Set<AnyStateNode>,\n historyValue: HistoryValue<any, any>,\n statesForDefaultEntry: Set<AnyStateNode>\n) {\n const properAncestors = getProperAncestors(stateNode, toStateNode);\n for (const anc of properAncestors) {\n statesToEnter.add(anc);\n if (anc.type === 'parallel') {\n for (const child of getChildren(anc).filter((sn) => !isHistoryNode(sn))) {\n if (![...statesToEnter].some((s) => isDescendant(s, child))) {\n addDescendantStatesToEnter(\n child,\n historyValue,\n statesForDefaultEntry,\n statesToEnter\n );\n }\n }\n }\n }\n}\n\nfunction exitStates(\n transitions: AnyTransitionDefinition[],\n mutConfiguration: Set<AnyStateNode>,\n historyValue: HistoryValue<any, any>,\n actions: BaseActionObject[]\n) {\n const statesToExit = computeExitSet(\n transitions,\n mutConfiguration,\n historyValue\n );\n\n statesToExit.sort((a, b) => b.order - a.order);\n\n // From SCXML algorithm: https://www.w3.org/TR/scxml/#exitStates\n for (const exitStateNode of statesToExit) {\n for (const historyNode of getHistoryNodes(exitStateNode)) {\n let predicate: (sn: AnyStateNode) => boolean;\n if (historyNode.history === 'deep') {\n predicate = (sn) =>\n isAtomicStateNode(sn) && isDescendant(sn, exitStateNode);\n } else {\n predicate = (sn) => {\n return sn.parent === exitStateNode;\n };\n }\n historyValue[historyNode.id] =\n Array.from(mutConfiguration).filter(predicate);\n }\n }\n\n for (const s of statesToExit) {\n actions.push(...s.exit.flat(), ...s.invoke.map((def) => stop(def.id)));\n mutConfiguration.delete(s);\n }\n}\n\nexport function resolveActionsAndContext<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n actions: BaseActionObject[],\n scxmlEvent: SCXML.Event<TEvent>,\n currentState: State<TContext, TEvent, any>,\n actorCtx: AnyActorContext | undefined\n): {\n nextState: AnyState;\n} {\n const { machine } = currentState;\n const resolvedActions: BaseActionObject[] = [];\n const raiseActions: Array<RaiseActionObject<TContext, TEvent>> = [];\n let intermediateState = currentState;\n\n function handleAction(action: BaseActionObject): void {\n resolvedActions.push(action);\n if (actorCtx?.self.status === ActorStatus.Running) {\n action.execute?.(actorCtx!);\n // TODO: this is hacky; re-evaluate\n delete action.execute;\n }\n }\n\n function resolveAction(actionObject: BaseActionObject) {\n const executableActionObject = resolveActionObject(\n actionObject,\n machine.options.actions\n );\n\n if (isDynamicAction(executableActionObject)) {\n const [nextState, resolvedAction] = executableActionObject.resolve(\n scxmlEvent,\n {\n state: intermediateState,\n action: actionObject,\n actorContext: actorCtx\n }\n );\n const matchedActions = resolvedAction.params?.actions;\n\n intermediateState = nextState;\n\n if (\n (resolvedAction.type === actionTypes.raise ||\n (resolvedAction.type === actionTypes.send &&\n (resolvedAction as SendActionObject).params.internal)) &&\n typeof (resolvedAction as any).params.delay !== 'number'\n ) {\n raiseActions.push(resolvedAction);\n }\n\n // TODO: remove the check; just handleAction\n if (resolvedAction.type !== actionTypes.pure) {\n handleAction(resolvedAction);\n }\n\n toActionObjects(matchedActions).forEach(resolveAction);\n\n return;\n }\n\n handleAction(executableActionObject);\n }\n\n for (const actionObject of actions) {\n resolveAction(actionObject);\n }\n\n return {\n nextState: cloneState(intermediateState, {\n actions: resolvedActions,\n _internalQueue: raiseActions.map((a) => a.params._event)\n })\n };\n}\n\nexport function macrostep<TMachine extends AnyStateMachine>(\n state: StateFromMachine<TMachine>,\n scxmlEvent: SCXML.Event<TMachine['__TEvent']>,\n actorCtx: AnyActorContext | undefined\n): {\n state: typeof state;\n microstates: Array<typeof state>;\n} {\n if (!IS_PRODUCTION && scxmlEvent.name === WILDCARD) {\n throw new Error(`An event cannot have the wildcard type ('${WILDCARD}')`);\n }\n\n let nextState = state;\n const states: StateFromMachine<TMachine>[] = [];\n\n // Handle stop event\n if (scxmlEvent?.name === stopSignalType) {\n nextState = stopStep(scxmlEvent, nextState, actorCtx);\n states.push(nextState);\n\n return {\n state: nextState,\n microstates: states\n };\n }\n\n // Assume the state is at rest (no raised events)\n // Determine the next state based on the next microstep\n if (scxmlEvent.name !== actionTypes.init) {\n const transitions = selectTransitions(scxmlEvent, nextState);\n nextState = microstep(transitions, state, actorCtx, scxmlEvent);\n states.push(nextState);\n }\n\n while (!nextState.done) {\n let enabledTransitions = selectEventlessTransitions(nextState);\n\n if (enabledTransitions.length === 0) {\n // TODO: this is a bit of a hack, we need to review this\n // this matches the behavior from v4 for eventless transitions\n // where for `hasAlwaysTransitions` we were always trying to resolve with a NULL event\n // and if a transition was not selected the `state.transitions` stayed empty\n // without this we get into an infinite loop in the dieHard test in `@xstate/test` for the `simplePathsTo`\n if (nextState.configuration.some((state) => state.always)) {\n nextState.transitions = [];\n }\n\n if (!nextState._internalQueue.length) {\n break;\n } else {\n const currentActions = nextState.actions;\n const nextEvent = nextState._internalQueue[0];\n const transitions = selectTransitions(nextEvent, nextState);\n nextState = microstep(transitions, nextState, actorCtx, nextEvent);\n nextState._internalQueue.shift();\n nextState.actions.unshift(...currentActions);\n\n states.push(nextState);\n }\n }\n\n if (enabledTransitions.length) {\n const currentActions = nextState.actions;\n nextState = microstep(\n enabledTransitions,\n nextState,\n actorCtx,\n nextState._event\n );\n nextState.actions.unshift(...currentActions);\n\n states.push(nextState);\n }\n }\n\n if (nextState.done) {\n // Perform the stop step to ensure that child actors are stopped\n stopStep(nextState._event, nextState, actorCtx);\n }\n\n return {\n state: nextState,\n microstates: states\n };\n}\n\nfunction stopStep(\n scxmlEvent: SCXML.Event<any>,\n nextState: AnyState,\n actorCtx: AnyActorContext | undefined\n): AnyState {\n const actions: BaseActionObject[] = [];\n\n for (const stateNode of nextState.configuration.sort(\n (a, b) => b.order - a.order\n )) {\n actions.push(...stateNode.exit);\n }\n\n for (const child of Object.values(nextState.children)) {\n actions.push(stop(child));\n }\n\n const { nextState: stoppedState } = resolveActionsAndContext(\n actions,\n scxmlEvent,\n nextState,\n actorCtx\n );\n\n return stoppedState;\n}\n\nfunction selectTransitions(\n scxmlEvent: SCXML.Event<any>,\n nextState: AnyState\n): AnyTransitionDefinition[] {\n return nextState.machine.getTransitionData(nextState, scxmlEvent);\n}\n\nfunction selectEventlessTransitions(\n nextState: AnyState\n): AnyTransitionDefinition[] {\n const enabledTransitionSet: Set<AnyTransitionDefinition> = new Set();\n const atomicStates = nextState.configuration.filter(isAtomicStateNode);\n\n for (const stateNode of atomicStates) {\n loop: for (const s of [stateNode].concat(\n getProperAncestors(stateNode, null)\n )) {\n if (!s.always) {\n continue;\n }\n for (const transition of s.always) {\n if (\n transition.guard === undefined ||\n evaluateGuard(\n transition.guard,\n nextState.context,\n nextState._event,\n nextState\n )\n ) {\n enabledTransitionSet.add(transition);\n break loop;\n }\n }\n }\n }\n\n return removeConflictingTransitions(\n Array.from(enabledTransitionSet),\n new Set(nextState.configuration),\n nextState.historyValue\n );\n}\n\n/**\n * Resolves a partial state value with its full representation in the state node's machine.\n *\n * @param stateValue The partial state value to resolve.\n */\nexport function resolveStateValue(\n rootNode: AnyStateNode,\n stateValue: StateValue\n): StateValue {\n const configuration = getConfiguration(getStateNodes(rootNode, stateValue));\n return getStateValue(rootNode, [...configuration]);\n}\n\nexport function stateValuesEqual(\n a: StateValue | undefined,\n b: StateValue | undefined\n): boolean {\n if (a === b) {\n return true;\n }\n\n if (a === undefined || b === undefined) {\n return false;\n }\n\n if (isString(a) || isString(b)) {\n return a === b;\n }\n\n const aKeys = Object.keys(a as StateValueMap);\n const bKeys = Object.keys(b as StateValueMap);\n\n return (\n aKeys.length === bKeys.length &&\n aKeys.every((key) => stateValuesEqual(a[key], b[key]))\n );\n}\n\nexport function getInitialConfiguration(\n rootNode: AnyStateNode\n): AnyStateNode[] {\n const configuration: AnyStateNode[] = [];\n const initialTransition = rootNode.initial;\n\n const statesToEnter = new Set<AnyStateNode>();\n const statesForDefaultEntry = new Set<AnyStateNode>([rootNode]);\n\n computeEntrySet(\n [initialTransition],\n {},\n statesForDefaultEntry,\n statesToEnter\n );\n\n for (const stateNodeToEnter of [...statesToEnter].sort(\n (a, b) => a.order - b.order\n )) {\n configuration.push(stateNodeToEnter);\n }\n\n return configuration;\n}\n","import { createInitEvent } from './actions.ts';\nimport { IS_PRODUCTION } from './environment.ts';\nimport { memo } from './memo.ts';\nimport type { StateNode } from './StateNode.ts';\nimport {\n getConfiguration,\n getStateNodes,\n getStateValue\n} from './stateUtils.ts';\nimport { TypegenDisabled, TypegenEnabled } from './typegenTypes.ts';\nimport type {\n ActorRef,\n AnyState,\n AnyStateMachine,\n BaseActionObject,\n EventObject,\n HistoryValue,\n MachineContext,\n PersistedMachineState,\n Prop,\n SCXML,\n StateConfig,\n StateValue,\n TransitionDefinition\n} from './types.ts';\nimport {\n flatten,\n isString,\n matchesState,\n toSCXMLEvent,\n warn\n} from './utils.ts';\n\nexport function isStateConfig<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(state: any): state is StateConfig<TContext, TEvent> {\n if (typeof state !== 'object' || state === null) {\n return false;\n }\n\n return 'value' in state && '_event' in state;\n}\n\n/**\n * @deprecated Use `isStateConfig(object)` or `state instanceof State` instead.\n */\nexport const isState = isStateConfig;\nexport class State<\n TContext extends MachineContext,\n TEvent extends EventObject = EventObject,\n TResolvedTypesMeta = TypegenDisabled\n> {\n public tags: Set<string>;\n\n public value: StateValue;\n /**\n * Indicates whether the state is a final state.\n */\n public done: boolean;\n /**\n * The done data of the top-level finite state.\n */\n public output: any; // TODO: add an explicit type for `output`\n public context: TContext;\n public historyValue: Readonly<HistoryValue<TContext, TEvent>> = {};\n public actions: BaseActionObject[] = [];\n public event: TEvent;\n public _internalQueue: Array<SCXML.Event<TEvent>>;\n public _event: SCXML.Event<TEvent>;\n public _initial: boolean = false;\n /**\n * Indicates whether the state has changed from the previous state. A state is considered \"changed\" if:\n *\n * - Its value is not equal to its previous value, or:\n * - It has any new actions (side-effects) to execute.\n *\n * An initial state (with no history) will return `undefined`.\n */\n public changed: boolean | undefined;\n /**\n * The enabled state nodes representative of the state value.\n */\n public configuration: Array<StateNode<TContext, TEvent>>;\n /**\n * The transition definitions that resulted in this state.\n */\n public transitions: Array<TransitionDefinition<TContext, TEvent>>;\n /**\n * An object mapping actor names to spawned/invoked actors.\n */\n public children: Record<string, ActorRef<any>>;\n /**\n * Creates a new State instance for the given `stateValue` and `context`.\n * @param stateValue\n * @param context\n */\n public static from<\n TContext extends MachineContext,\n TEvent extends EventObject = EventObject\n >(\n stateValue: State<TContext, TEvent, any> | StateValue,\n context: TContext = {} as TContext,\n machine: AnyStateMachine\n ): State<TContext, TEvent, any> {\n if (stateValue instanceof State) {\n if (stateValue.context !== context) {\n return new State<TContext, TEvent>(\n {\n value: stateValue.value,\n context,\n _event: stateValue._event,\n actions: [],\n meta: {},\n configuration: [], // TODO: fix,\n transitions: [],\n children: {}\n },\n machine\n );\n }\n\n return stateValue;\n }\n\n const _event = createInitEvent({}) as unknown as SCXML.Event<TEvent>; // TODO: fix\n\n const configuration = getConfiguration(\n getStateNodes(machine.root, stateValue)\n );\n\n return new State<TContext, TEvent>(\n {\n value: stateValue,\n context,\n _event,\n actions: [],\n meta: undefined,\n configuration: Array.from(configuration),\n transitions: [],\n children: {}\n },\n machine\n );\n }\n\n /**\n * Creates a new `State` instance that represents the current state of a running machine.\n *\n * @param config\n */\n constructor(\n config: StateConfig<TContext, TEvent>,\n public machine: AnyStateMachine\n ) {\n this.context = config.context;\n this._event = config._event;\n this._internalQueue = config._internalQueue ?? [];\n this.event = this._event.data;\n this.historyValue = config.historyValue || {};\n this.actions = config.actions ?? [];\n this.matches = this.matches.bind(this);\n this.toStrings = this.toStrings.bind(this);\n this.configuration =\n config.configuration ??\n Array.from(getConfiguration(getStateNodes(machine.root, config.value)));\n this.transitions = config.transitions as any;\n this.children = config.children;\n\n this.value = getStateValue(machine.root, this.configuration);\n this.tags = new Set(flatten(this.configuration.map((sn) => sn.tags)));\n this.done = config.done ?? false;\n this.output = config.output;\n }\n\n /**\n * Returns an array of all the string leaf state node paths.\n * @param stateValue\n * @param delimiter The character(s) that separate each subpath in the string state node path.\n */\n public toStrings(\n stateValue: StateValue = this.value,\n delimiter: string = '.'\n ): string[] {\n if (isString(stateValue)) {\n return [stateValue];\n }\n const valueKeys = Object.keys(stateValue);\n\n return valueKeys.concat(\n ...valueKeys.map((key) =>\n this.toStrings(stateValue[key], delimiter).map(\n (s) => key + delimiter + s\n )\n )\n );\n }\n\n public toJSON() {\n const { configuration, transitions, tags, machine, ...jsonValues } = this;\n\n return { ...jsonValues, tags: Array.from(tags), meta: this.meta };\n }\n\n /**\n * Whether the current state value is a subset of the given parent state value.\n * @param parentStateValue\n */\n public matches<\n TSV extends TResolvedTypesMeta extends TypegenEnabled\n ? Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'matchesStates'>\n : StateValue\n >(parentStateValue: TSV): boolean {\n return matchesState(parentStateValue as any, this.value);\n }\n\n /**\n * Whether the current state configuration has a state node with the specified `tag`.\n * @param tag\n */\n public hasTag(\n tag: TResolvedTypesMeta extends TypegenEnabled\n ? Prop<Prop<TResolvedTypesMeta, 'resolved'>, 'tags'>\n : string\n ): boolean {\n return this.tags.has(tag as string);\n }\n\n /**\n * Determines whether sending the `event` will cause a non-forbidden transition\n * to be selected, even if the transitions have no actions nor\n * change the state value.\n *\n * @param event The event to test\n * @returns Whether the event will cause a transition\n */\n public can(event: TEvent): boolean {\n if (IS_PRODUCTION) {\n warn(\n !!this.machine,\n `state.can(...) used outside of a machine-created State object; this will always return false.`\n );\n }\n\n const transitionData = this.machine.getTransitionData(\n this,\n toSCXMLEvent(event)\n );\n\n return (\n !!transitionData?.length &&\n // Check that at least one transition is not forbidden\n transitionData.some((t) => t.target !== undefined || t.actions.length)\n );\n }\n\n /**\n * The next events that will cause a transition from the current state.\n */\n public get nextEvents(): Array<TEvent['type']> {\n return memo(this, 'nextEvents', () => {\n return [\n ...new Set(flatten([...this.configuration.map((sn) => sn.ownEvents)]))\n ];\n });\n }\n\n public get meta() {\n return this.configuration.reduce((acc, stateNode) => {\n if (stateNode.meta !== undefined) {\n acc[stateNode.id] = stateNode.meta;\n }\n return acc;\n }, {} as Record<string, any>);\n }\n}\n\nexport function cloneState<TState extends AnyState>(\n state: TState,\n config: Partial<StateConfig<any, any>> = {}\n): TState {\n return new State(\n { ...state, ...config } as StateConfig<any, any>,\n state.machine\n ) as TState;\n}\n\nexport function getPersistedState<TState extends AnyState>(\n state: TState\n): PersistedMachineState<TState> {\n const { configuration, transitions, tags, machine, children, ...jsonValues } =\n state;\n\n const childrenJson: Partial<PersistedMachineState<any>['children']> = {};\n\n for (const id in children) {\n childrenJson[id] = {\n state: children[id].getPersistedState?.(),\n src: children[id].src\n };\n }\n\n return {\n ...jsonValues,\n children: childrenJson\n } as PersistedMachineState<TState>;\n}\n","import { EventObject, InvokeDefinition, MachineContext } from '../types.ts';\nimport { invoke as invokeActionType } from '../actionTypes.ts';\nimport { isActorRef } from '../actors/index.ts';\nimport { createDynamicAction } from '../../actions/dynamicAction.ts';\nimport {\n AnyInterpreter,\n BaseDynamicActionObject,\n DynamicInvokeActionObject,\n InvokeActionObject\n} from '../index.ts';\nimport { actionTypes, error } from '../actions.ts';\nimport { resolveReferencedActor, warn } from '../utils.ts';\nimport { ActorStatus, interpret } from '../interpreter.ts';\nimport { cloneState } from '../State.ts';\nimport { IS_PRODUCTION } from '../environment.ts';\n\nexport function invoke<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject\n>(\n invokeDef: InvokeDefinition<TContext, TEvent>\n): BaseDynamicActionObject<\n TContext,\n TExpressionEvent,\n TEvent,\n InvokeActionObject,\n DynamicInvokeActionObject<TContext, TEvent>['params']\n> {\n return createDynamicAction(\n { type: invokeActionType, params: invokeDef },\n (_event, { state, actorContext }) => {\n const type = actionTypes.invoke;\n const { id, src } = invokeDef;\n\n let resolvedInvokeAction: InvokeActionObject;\n if (isActorRef(src)) {\n resolvedInvokeAction = {\n type,\n params: {\n ...invokeDef,\n ref: src\n }\n } as InvokeActionObject;\n } else {\n const referenced = resolveReferencedActor(\n state.machine.options.actors[src]\n );\n\n if (!referenced) {\n resolvedInvokeAction = {\n type,\n params: invokeDef\n } as InvokeActionObject;\n } else {\n const input =\n 'input' in invokeDef ? invokeDef.input : referenced.input;\n const ref = interpret(referenced.src, {\n id,\n src,\n parent: actorContext?.self,\n systemId: invokeDef.systemId,\n input:\n typeof input === 'function'\n ? input({\n context: state.context,\n event: _event.data as any,\n self: actorContext?.self\n })\n : input\n });\n\n resolvedInvokeAction = {\n type,\n params: {\n ...invokeDef,\n ref\n }\n } as InvokeActionObject;\n }\n }\n\n const actorRef = resolvedInvokeAction.params.ref!;\n const invokedState = cloneState(state, {\n children: {\n ...state.children,\n [id]: actorRef\n }\n });\n\n resolvedInvokeAction.execute = (actorCtx) => {\n const parent = actorCtx.self as AnyInterpreter;\n const { id, ref } = resolvedInvokeAction.params;\n if (!ref) {\n if (!IS_PRODUCTION) {\n warn(\n false,\n `Actor type '${resolvedInvokeAction.params.src}' not found in machine '${actorCtx.id}'.`\n );\n }\n return;\n }\n actorCtx.defer(() => {\n if (actorRef.status === ActorStatus.Stopped) {\n return;\n }\n try {\n actorRef.start?.();\n } catch (err) {\n parent.send(error(id, err));\n return;\n }\n });\n };\n\n return [invokedState, resolvedInvokeAction];\n }\n );\n}\n","import {\n InvokeActionObject,\n AnyStateMachine,\n Spawner,\n ActorRef,\n MachineContext,\n EventObject,\n SCXML\n} from './index.ts';\nimport { invoke } from './actions/invoke.ts';\nimport { interpret } from './interpreter.ts';\nimport { isString, resolveReferencedActor } from './utils.ts';\n\nexport function createSpawner<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n self: ActorRef<any, any> | undefined,\n machine: AnyStateMachine,\n context: TContext,\n _event: SCXML.Event<TEvent>,\n mutCapturedActions: InvokeActionObject[]\n): Spawner {\n return (src, options = {}) => {\n if (isString(src)) {\n const referenced = resolveReferencedActor(machine.options.actors[src]);\n\n if (referenced) {\n const resolvedName = options.id ?? 'anon'; // TODO: better name\n const input = 'input' in options ? options.input : referenced.input;\n\n // TODO: this should also receive `src`\n const actorRef = interpret(referenced.src, {\n id: resolvedName,\n parent: self,\n input:\n typeof input === 'function'\n ? input({\n context,\n event: _event.data,\n self\n })\n : input\n });\n\n mutCapturedActions.push(\n invoke({\n id: actorRef.id,\n // @ts-ignore TODO: fix types\n src: actorRef, // TODO\n ref: actorRef,\n meta: undefined,\n input\n }) as any as InvokeActionObject\n );\n\n return actorRef as any; // TODO: fix types\n }\n\n throw new Error(\n `Behavior '${src}' not implemented in machine '${machine.id}'`\n );\n } else {\n // TODO: this should also receive `src`\n // TODO: instead of anonymous, it should be a unique stable ID\n const actorRef = interpret(src, {\n id: options.id || 'anonymous',\n parent: self,\n input: options.input\n });\n\n mutCapturedActions.push(\n invoke({\n // @ts-ignore TODO: fix types\n src: actorRef,\n ref: actorRef,\n id: actorRef.id,\n meta: undefined,\n input: options.input\n }) as any as InvokeActionObject\n );\n\n return actorRef as any; // TODO: fix types\n }\n };\n}\n","import {\n Action,\n EventObject,\n SingleOrArray,\n ActionFunction,\n ActionFunctionMap,\n ActionTypes,\n DoneEvent,\n ErrorPlatformEvent,\n DoneEventObject,\n MachineContext,\n BaseActionObject,\n SCXML\n} from './types.ts';\nimport * as actionTypes from './actionTypes.ts';\nimport { toSCXMLEvent, isArray } from './utils.ts';\nimport {\n createDynamicAction,\n isDynamicAction\n} from '../actions/dynamicAction.ts';\nexport {\n send,\n sendTo,\n sendParent,\n respond,\n forwardTo,\n escalate\n} from './actions/send.ts';\n\nexport { stop } from './actions/stop.ts';\nexport { log } from './actions/log.ts';\nexport { cancel } from './actions/cancel.ts';\nexport { assign } from './actions/assign.ts';\nexport { raise } from './actions/raise.ts';\nexport { choose } from './actions/choose.ts';\nexport { actionTypes };\n\nexport const initEvent = toSCXMLEvent({ type: actionTypes.init });\n\nexport function resolveActionObject(\n actionObject: BaseActionObject,\n actionFunctionMap: ActionFunctionMap<any, any>\n): BaseActionObject {\n if (isDynamicAction(actionObject)) {\n return actionObject;\n }\n const dereferencedAction = actionFunctionMap[actionObject.type];\n\n if (typeof dereferencedAction === 'function') {\n return createDynamicAction(\n { type: 'xstate.function', params: actionObject.params ?? {} },\n (_event, { state }) => {\n const a: BaseActionObject = {\n type: actionObject.type,\n params: actionObject.params,\n execute: (actorCtx) => {\n return dereferencedAction({\n context: state.context,\n event: state.event,\n action: a,\n _event: state._event,\n system: actorCtx.system,\n self: actorCtx.self\n });\n }\n };\n\n return [state, a];\n }\n );\n } else if (dereferencedAction) {\n return dereferencedAction;\n } else {\n return actionObject;\n }\n}\n\nexport function toActionObject<\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n action: BaseActionObject | ActionFunction<TContext, TEvent> | string\n): BaseActionObject {\n if (isDynamicAction(action)) {\n return action;\n }\n\n if (typeof action === 'string') {\n return { type: action, params: {} };\n }\n\n if (typeof action === 'function') {\n const type = 'xstate.function';\n return createDynamicAction({ type, params: {} }, (_event, { state }) => {\n const actionObject: BaseActionObject = {\n type,\n params: {\n function: action\n },\n execute: (actorCtx) => {\n return action({\n context: state.context as TContext,\n event: _event.data as TEvent,\n action: actionObject,\n _event: _event as SCXML.Event<TEvent>,\n self: actorCtx.self,\n system: actorCtx.system\n });\n }\n };\n\n return [state, actionObject];\n });\n }\n\n // action is already a BaseActionObject\n return action;\n}\n\nexport const toActionObjects = <\n TContext extends MachineContext,\n TEvent extends EventObject\n>(\n action?: SingleOrArray<Action<TContext, TEvent>>\n): BaseActionObject[] => {\n if (!action) {\n return [];\n }\n const actions = isArray(action) ? action : [action];\n return actions.map(toActionObject);\n};\n\n/**\n * Returns an event type that represents an implicit event that\n * is sent after the specified `delay`.\n *\n * @param delayRef The delay in milliseconds\n * @param id The state node ID where this event is handled\n */\nexport function after(delayRef: number | string, id?: string) {\n const idSuffix = id ? `#${id}` : '';\n return `${ActionTypes.After}(${delayRef})${idSuffix}`;\n}\n\n/**\n * Returns an event that represents that a final state node\n * has been reached in the parent state node.\n *\n * @param id The final state node's parent state node `id`\n * @param output The data to pass into the event\n */\nexport function done(id: string, output?: any): DoneEventObject {\n const type = `${ActionTypes.DoneState}.${id}`;\n const eventObject = {\n type,\n output\n };\n\n eventObject.toString = () => type;\n\n return eventObject as DoneEvent;\n}\n\n/**\n * Returns an event that represents that an invoked service has terminated.\n *\n * An invoked service is terminated when it has reached a top-level final state node,\n * but not when it is canceled.\n *\n * @param invokeId The invoked service ID\n * @param output The data to pass into the event\n */\nexport function doneInvoke(invokeId: string, output?: any): DoneEvent {\n const type = `${ActionTypes.DoneInvoke}.${invokeId}`;\n const eventObject = {\n type,\n output\n };\n\n eventObject.toString = () => type;\n\n return eventObject as DoneEvent;\n}\n\nexport function error(id: string, data?: any): ErrorPlatformEvent & string {\n const type = `${ActionTypes.ErrorPlatform}.${id}`;\n const eventObject = { type, data };\n\n eventObject.toString = () => type;\n\n return eventObject as ErrorPlatformEvent & string;\n}\n\nexport function createInitEvent(\n input: any\n): SCXML.Event<{ type: ActionTypes.Init; input: any }> {\n return toSCXMLEvent({ type: actionTypes.init, input });\n}\n","import type {\n EventObject,\n Assigner,\n PropertyAssigner,\n MachineContext,\n AssignActionObject,\n DynamicAssignAction,\n AssignMeta,\n InvokeActionObject,\n LowInfer\n} from '../types.ts';\nimport * as actionTypes from '../actionTypes.ts';\nimport { createDynamicAction } from '../../actions/dynamicAction.ts';\nimport { isFunction } from '../utils.ts';\nimport { createSpawner } from '../spawn.ts';\nimport { cloneState } from '../State.ts';\n\n/**\n * Updates the current context of the machine.\n *\n * @param assignment An object that represents the partial context to update.\n */\nexport function assign<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject = EventObject,\n TEvent extends EventObject = TExpressionEvent\n>(\n assignment:\n | Assigner<LowInfer<TContext>, TExpressionEvent, TEvent>\n | PropertyAssigner<LowInfer<TContext>, TExpressionEvent, TEvent>\n): DynamicAssignAction<TContext, TExpressionEvent, TEvent> {\n return createDynamicAction<\n TContext,\n TExpressionEvent,\n TEvent,\n AssignActionObject<TContext>,\n {\n assignment: typeof assignment;\n }\n >(\n {\n type: actionTypes.assign,\n params: {\n assignment\n }\n },\n (_event, { state, action, actorContext }) => {\n const capturedActions: InvokeActionObject[] = [];\n\n if (!state.context) {\n throw new Error(\n 'Cannot assign to undefined `context`. Ensure that `context` is defined in the machine config.'\n );\n }\n\n const args: AssignMeta<TExpressionEvent, TEvent> & {\n context: TContext;\n event: TExpressionEvent;\n } = {\n context: state.context,\n event: _event.data,\n action,\n _event,\n spawn: createSpawner(\n actorContext?.self,\n state.machine,\n state.context,\n _event,\n capturedActions\n ),\n self: actorContext?.self ?? ({} as any),\n system: actorContext?.system\n };\n\n let partialUpdate: Partial<TContext> = {};\n if (isFunction(assignment)) {\n partialUpdate = assignment(args);\n } else {\n for (const key of Object.keys(assignment)) {\n const propAssignment = assignment[key];\n partialUpdate[key as keyof TContext] = isFunction(propAssignment)\n ? propAssignment(args)\n : propAssignment;\n }\n }\n\n const updatedContext = Object.assign({}, state.context, partialUpdate);\n\n return [\n cloneState(state, {\n context: updatedContext\n }),\n {\n type: actionTypes.assign,\n params: {\n context: updatedContext,\n actions: capturedActions\n }\n } as AssignActionObject<TContext>\n ];\n }\n );\n}\n","import { EventObject, ExprWithMeta, MachineContext } from '../types.ts';\nimport { cancel as cancelActionType } from '../actionTypes.ts';\nimport { isFunction } from '../utils.ts';\nimport {\n AnyInterpreter,\n BaseDynamicActionObject,\n CancelActionObject,\n DynamicCancelActionObject\n} from '../index.ts';\nimport { createDynamicAction } from '../../actions/dynamicAction.ts';\n\n/**\n * Cancels an in-flight `send(...)` action. A canceled sent action will not\n * be executed, nor will its event be sent, unless it has already been sent\n * (e.g., if `cancel(...)` is called after the `send(...)` action's `delay`).\n *\n * @param sendId The `id` of the `send(...)` action to cancel.\n */\n\nexport function cancel<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject\n>(\n sendId: string | ExprWithMeta<TContext, TExpressionEvent, string>\n): BaseDynamicActionObject<\n TContext,\n TExpressionEvent,\n TEvent,\n CancelActionObject,\n DynamicCancelActionObject<TContext, TExpressionEvent>['params']\n> {\n return createDynamicAction(\n {\n type: cancelActionType,\n params: {\n sendId\n }\n },\n (_event, { state, actorContext }) => {\n const resolvedSendId = isFunction(sendId)\n ? sendId({\n context: state.context,\n event: _event.data,\n _event,\n self: actorContext?.self ?? ({} as any),\n system: actorContext?.system\n })\n : sendId;\n\n return [\n state,\n {\n type: 'xstate.cancel',\n params: {\n sendId: resolvedSendId\n },\n execute: (actorCtx) => {\n const interpreter = actorCtx.self as AnyInterpreter;\n\n interpreter.cancel(resolvedSendId);\n }\n } as CancelActionObject\n ];\n }\n );\n}\n","import { EventObject, ChooseCondition, MachineContext } from '../types.ts';\nimport * as actionTypes from '../actionTypes.ts';\nimport { createDynamicAction } from '../../actions/dynamicAction.ts';\nimport { evaluateGuard, toGuardDefinition } from '../guards.ts';\nimport {\n BaseDynamicActionObject,\n ChooseAction,\n ResolvedChooseAction\n} from '../index.ts';\nimport { toActionObjects } from '../actions.ts';\n\nexport function choose<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject\n>(\n guards: Array<ChooseCondition<TContext, TExpressionEvent>>\n): BaseDynamicActionObject<\n TContext,\n TExpressionEvent,\n TEvent,\n ResolvedChooseAction,\n ChooseAction<TContext, TExpressionEvent>['params']\n> {\n return createDynamicAction(\n { type: actionTypes.choose, params: { guards } },\n (_event, { state }) => {\n const matchedActions = guards.find((condition) => {\n const guard =\n condition.guard &&\n toGuardDefinition(\n condition.guard,\n (guardType) => state.machine.options.guards[guardType]\n );\n return !guard || evaluateGuard(guard, state.context, _event, state);\n })?.actions;\n\n return [\n state,\n {\n type: actionTypes.choose,\n params: {\n actions: toActionObjects(matchedActions)\n }\n }\n ];\n }\n );\n}\n","import { createDynamicAction } from '../../actions/dynamicAction.ts';\nimport * as actionTypes from '../actionTypes.ts';\nimport {\n EventObject,\n MachineContext,\n RaiseActionObject,\n BaseDynamicActionObject,\n RaiseActionOptions,\n SendExpr,\n AnyInterpreter,\n RaiseActionParams,\n NoInfer,\n UnifiedArg,\n StateMeta\n} from '../types.ts';\nimport { toSCXMLEvent } from '../utils.ts';\n\n/**\n * Raises an event. This places the event in the internal event queue, so that\n * the event is immediately consumed by the machine in the current step.\n *\n * @param eventType The event to raise.\n */\n\nexport function raise<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject = TExpressionEvent\n>(\n eventOrExpr:\n | NoInfer<TEvent>\n | SendExpr<TContext, TExpressionEvent, NoInfer<TEvent>>,\n options?: RaiseActionOptions<TContext, TExpressionEvent>\n): BaseDynamicActionObject<\n TContext,\n TExpressionEvent,\n TEvent,\n RaiseActionObject<TContext, TExpressionEvent, TEvent>,\n RaiseActionParams<TContext, TExpressionEvent, TEvent>\n> {\n return createDynamicAction(\n {\n type: actionTypes.raise,\n params: {\n delay: options ? options.delay : undefined,\n event: eventOrExpr,\n id:\n options && options.id !== undefined\n ? options.id\n : typeof eventOrExpr === 'function'\n ? eventOrExpr.name\n : eventOrExpr.type\n }\n },\n (_event, { state, actorContext }) => {\n const params = {\n delay: options ? options.delay : undefined,\n event: eventOrExpr,\n id:\n options && options.id !== undefined\n ? options.id\n : typeof eventOrExpr === 'function'\n ? eventOrExpr.name\n : eventOrExpr.type\n };\n const args: UnifiedArg<TContext, TExpressionEvent> &\n StateMeta<TExpressionEvent> = {\n context: state.context,\n event: _event.data,\n _event,\n self: actorContext?.self ?? ({} as any),\n system: actorContext?.system\n };\n const delaysMap = state.machine.options.delays;\n\n // TODO: helper function for resolving Expr\n const resolvedEvent = toSCXMLEvent(\n typeof eventOrExpr === 'function' ? eventOrExpr(args) : eventOrExpr\n );\n\n let resolvedDelay: number | undefined;\n if (typeof params.delay === 'string') {\n const configDelay = delaysMap && delaysMap[params.delay];\n resolvedDelay =\n typeof configDelay === 'function' ? configDelay(args) : configDelay;\n } else {\n resolvedDelay =\n typeof params.delay === 'function'\n ? params.delay(args)\n : params.delay;\n }\n\n const resolvedAction: RaiseActionObject<\n TContext,\n TExpressionEvent,\n TEvent\n > = {\n type: actionTypes.raise,\n params: {\n ...params,\n _event: resolvedEvent,\n event: resolvedEvent.data,\n delay: resolvedDelay\n },\n execute: (actorCtx) => {\n if (typeof resolvedAction.params.delay === 'number') {\n (actorCtx.self as AnyInterpreter).delaySend(resolvedAction);\n return;\n }\n }\n };\n\n return [state, resolvedAction];\n }\n );\n}\n","import { createDynamicAction } from '../../actions/dynamicAction.ts';\nimport { stop as stopActionType } from '../actionTypes.ts';\nimport { ActorStatus } from '../interpreter.ts';\nimport {\n ActorRef,\n AnyActorContext,\n BaseDynamicActionObject,\n DynamicStopActionObject,\n EventObject,\n Expr,\n MachineContext,\n StopActionObject\n} from '../types.ts';\nimport { isFunction } from '../utils.ts';\n\n/**\n * Stops an actor.\n *\n * @param actorRef The actor to stop.\n */\n\nexport function stop<\n TContext extends MachineContext,\n TExpressionEvent extends EventObject,\n TEvent extends EventObject\n>(\n actorRef:\n | string\n | ActorRef<any>\n | Expr<TContext, TExpressionEvent, ActorRef<any> | string>\n): BaseDynamicActionObject<\n TContext,\n TExpressionEvent,\n TEvent,\n StopActionObject,\n DynamicStopActionObject<TContext, TExpressionEvent>['params']\n> {\n const actor = actorRef;\n\n return createDynamicAction(\n {\n type: stopActionType,\n params: {\n actor\n }\n },\n (_event, { state }) => {\n const actorRefOrString = isFunction(actor)\n ? actor({ context: state.context, event: _event.data })\n : actor;\n const actorRef =\n typeof actorRefOrString === 'string'\n ? state.children[actorRefOrString]\n : actorRefOrString;\n\n return [\n state,\n {\n type: 'xstate.stop',\n params: { actor: actorRef },\n execute: (actorCtx: AnyActorContext) => {\n if (!actorRef) {\n return;\n }\n if (actorRef.status !== ActorStatus.Running) {\n actorCtx.stopChild(actorRef);\n return;\n }\n actorCtx.defer(() => {\n actorCtx.stopChild(actorRef);\n });\n }\n } as StopActionObject\n ];\n }\n );\n}\n"],"names":["ActionTypes","SpecialTargets","stop","Stop","raise","Raise","send","Send","cancel","Cancel","assign","Assign","after","After","doneState","DoneState","log","Log","init","Init","invoke","Invoke","errorExecution","ErrorExecution","errorPlatform","ErrorPlatform","error","ErrorCustom","choose","Choose","pure","Pure","matchesState","parentStateId","childStateId","delimiter","parentStateValue","toStateValue","childStateValue","isString","Object","keys","every","key","stateValue","_typeof","state","value","isArray","pathToStateValue","stateId","toString","split","e","Error","toStatePath","statePath","length","marker","i","flatten","array","concat","Array","isFunction","toSCXMLEvent","event","scxmlEvent","$$type","isSCXMLEvent","name","type","data","resolveReferencedActor","referenced","src","input","undefined","createDynamicAction","action","resolve","params","isDynamicAction","eventOrExpr","options","sendActionType","to","delay","id","_event","resolvedDelay","actorContext","args","context","self","system","delaysMap","machine","delays","resolvedEvent","configDelay","targetActorRef","resolvedTarget","Parent","_parent","Internal","startsWith","children","slice","resolvedAction","actionTypes","internal","execute","actorCtx","sendAction","target","defer","origin","delaySend","sendParent","Mailbox","_process","_classCallCheck","this","_defineProperty","_createClass","_active","flush","_current","next","_last","enqueue","enqueued","consumed","symbolObservable","Symbol","observable","stopSignalType","getDevTools","w","globalThis","window","__xstate__","ActorStatus","devToolsAdapter","service","devTools","register","defaultOptions","deferEvents","clock","setTimeout","fn","ms","clearTimeout","logger","console","bind","Interpreter","behavior","_this","Set","NotStarted","sessionIdCounter","keyedActors","reverseKeyedActors","resolvedOptions","parent","systemId","Map","WeakMap","_bookId","_register","sessionId","actorRef","set","_unregister","get","_set","existing","_systemId","ref","_actorContext","_deferred","push","stopChild","child","_stop","_initState","_state","restoreState","getInitialState","_this$options","deferredFn","snapshot","getSnapshot","shift","_step","observers","observer","_observer2$next","_iterator","status","getStatus","_this$behavior$getSta","_doneEvent","doneInvoke","_this$_parent","invokeid","_stopProcedure","_this$_parent2","_step2","_observer$error","_iterator2","nextListenerOrObserver","errorListener","completeListener","nextHandler","errorHandler","completionHandler","noop","isObserver","complete","toObserver","add","Stopped","_observer$complete","unsubscribe","_this2","listener","_this3","Running","start","update","attachDevTools","mailbox","nextState","transition","err","size","forEach","_observer$error2","clear","_step3","_observer3$complete","_iterator3","_complete","delayedEventsMap","JSON","stringify","_this4","sendId","getPersistedState","_this$behavior$getPer","interpret","defaultLogExpr","cache","evaluateGuard","guard","predicate","_machine$options","guards","_machine$options$guar2","evaluate","toGuardDefinition","guardConfig","getPredicate","_guardConfig$children","map","childGuard","getChildren","stateNode","values","states","filter","sn","getProperAncestors","toStateNode","ancestors","m","getConfiguration","stateNodes","configuration","configurationSet","adjList","getAdjList","s","has","getInitialStateNodes","initialStateNode","getValueFromAdj","baseNode","childStateNodes","childStateNode","_step4","_iterator4","_step5","_iterator5","getStateValue","rootNode","iter","descStateNode","_step7","initial","_step8","targetStateNode","a","_iterator8","_iterator7","_step9","_iterator9","getStateNode","stateKey","getStateNodeById","result","getStateNodes","State","childStateKeys","subStateKey","Boolean","root","reduce","allSubStateNodes","subStateNode","subStateNodes","config","_internalQueue","historyValue","actions","matches","toStrings","from","transitions","tags","done","output","valueKeys","meta","tag","transitionData","getTransitionData","some","t","object","memoizedData","ownEvents","acc","createInitEvent","cloneState","invokeDef","invokeActionType","resolvedInvokeAction","item","actors","invokedState","_actorRef$start","createSpawner","mutCapturedActions","resolvedName","initEvent","toActionObject","actionObject","function","toActionObjects","invokeId","DoneInvoke","eventObject","delayRef","idSuffix","assignment","capturedActions","spawn","partialUpdate","propAssignment","updatedContext","cancelActionType","resolvedSendId","matchedActions","find","condition","guardType","_guards$find","errorData","arg","process","env","NODE_END","originalTarget","expr","label","logActionType","resolvedValue","_actorCtx$logger","_actorCtx$logger2","actionFunctionMap","dereferencedAction","actor","stopActionType","actorRefOrString"],"mappings":"yPA8iCYA,EA4LAC,GA1KX,SAlBWD,GAAAA,qBAAAA,uBAAAA,qBAAAA,yBAAAA,yBAAAA,uBAAAA,yBAAAA,2BAAAA,mBAAAA,qBAAAA,yBAAAA,mCAAAA,2CAAAA,iCAAAA,6BAAAA,qBAAAA,yBAkBX,CAlBWA,IAAAA,OA+LX,SAHWC,GAAAA,oBAAAA,wBAGX,CAHWA,IAAAA,OCvuCL,IAAMC,EAAOF,EAAYG,KACnBC,EAAQJ,EAAYK,MACpBC,EAAON,EAAYO,KACnBC,EAASR,EAAYS,OACrBC,EAASV,EAAYW,OACrBC,EAAQZ,EAAYa,MACpBC,EAAYd,EAAYe,UACxBC,EAAMhB,EAAYiB,IAClBC,EAAOlB,EAAYmB,KACnBC,EAASpB,EAAYqB,OACrBC,EAAiBtB,EAAYuB,eAC7BC,EAAgBxB,EAAYyB,cAC5BC,EAAQ1B,EAAY2B,YACpBC,EAAS5B,EAAY6B,OACrBC,EAAO9B,EAAY+B,sxFCWzB,SAASC,EACdC,EACAC,GAES,IADTC,yDC/B6B,IDiCvBC,EAAmBC,EAAaJ,EAAeE,GAC/CG,EAAkBD,EAAaH,EAAcC,GAEnD,OAAII,EAASD,KACPC,EAASH,IACJE,IAAoBF,EAO3BG,EAASH,GACJA,KAAoBE,EAGtBE,OAAOC,KAAKL,GAAkBM,OAAM,SAACC,GAC1C,OAAMA,KAAOL,GAINN,EAAaI,EAAiBO,GAAML,EAAgBK,OA6BxD,SAASN,EACdO,EACAT,GAEA,MAZmB,WAAjBU,EAFwBC,EAcVF,IAXd,UAAWE,GACX,YAAaA,GACb,UAAWA,GACX,WAAYA,EASLF,EAAWG,MAGhBC,EAAQJ,GACHK,EAAiBL,GAGA,iBAAfA,EACFA,EAKFK,EA3CF,SACLC,EACAf,GAEA,IACE,OAAIa,EAAQE,GACHA,EAGFA,EAAQC,WAAWC,MAAMjB,GAChC,MAAOkB,GACP,MAAM,IAAIC,iBAAUJ,oCA8BJK,CAAYX,EAAsBT,IA1B/C,IAAqBW,EA+BrB,SAASG,EAAiBO,GAC/B,GAAyB,IAArBA,EAAUC,OACZ,OAAOD,EAAU,GAMnB,IAHA,IAAMT,EAAQ,GACVW,EAASX,EAEJY,EAAI,EAAGA,EAAIH,EAAUC,OAAS,EAAGE,IACpCA,IAAMH,EAAUC,OAAS,EAC3BC,EAAOF,EAAUG,IAAMH,EAAUG,EAAI,IAErCD,EAAOF,EAAUG,IAAM,GACvBD,EAASA,EAAOF,EAAUG,KAI9B,OAAOZ,EA4FF,SAASa,EAAWC,GAA4B,MACrD,SAAQ,IAAWC,iBAAUD,IAkHxB,SAASb,EAAQD,GACtB,OAAOgB,MAAMf,QAAQD,GAIhB,SAASiB,EAAWjB,GACzB,MAAwB,mBAAVA,EAGT,SAASR,EAASQ,GACvB,MAAwB,iBAAVA,EAmCT,SAASkB,EACdC,EACAC,GAEA,OAnBK,SACLD,GAEA,MAAO,WAAYA,GAA0B,UAAjBA,EAAME,OAgB9BC,CAAaH,GACRA,KAIPI,KAAMJ,EAAMK,KACZC,KAAMN,EACNE,OAAQ,QACRG,KAAM,YACHJ,GA0HA,SAASM,EACdC,GAKA,OAAOA,EACH,eAAgBA,EACd,CAAEC,IAAKD,EAAYE,WAAOC,GAC1BH,OACFG,EE9fC,SAASC,EAOdC,EACAC,GAcA,MAAO,CACLT,KAAMQ,EAAOR,KACbU,OAAQF,EAAOE,OACfD,QAAAA,GAIG,SAASE,EACdH,GAEA,MAAyB,WAAlBlC,EAAOkC,IAAkC,OAAXA,GAAmB,YAAaA,ECFhE,SAASzE,EAKd6E,EACAC,GAQA,OAAON,EAOL,CACEP,KAAMc,EACNJ,OAAQ,CACNK,GAAIF,EAAUA,EAAQE,QAAKT,EAC3BU,MAAOH,EAAUA,EAAQG,WAAQV,EACjCX,MAAOiB,EACPK,GACEJ,QAA0BP,IAAfO,EAAQI,GACfJ,EAAQI,GACRxB,EAAWmB,GACXA,EAAYb,KACZa,EAAYZ,QAGtB,SAACkB,KAAoC,MA4B/BC,EA5BKC,IAAAA,aAAc7C,IAAAA,MACjBmC,EAAS,CACbK,GAAIF,EAAUA,EAAQE,QAAKT,EAC3BU,MAAOH,EAAUA,EAAQG,WAAQV,EACjCX,MAAOiB,EAGPK,GACEJ,QAA0BP,IAAfO,EAAQI,GACfJ,EAAQI,GACRxB,EAAWmB,GACXA,EAAYb,KACZa,EAAYZ,MAEdqB,EAAyD,CAC7DC,QAAS/C,EAAM+C,QACf3B,MAAOuB,EAAOjB,KACdiB,OAAAA,EACAK,eAAMH,MAAAA,SAAAA,EAAcG,oBAAS,KAC7BC,OAAQJ,MAAAA,SAAAA,EAAcI,QAElBC,EAAYlD,EAAMmD,QAAQb,QAAQc,OAGlCC,EAAgBlC,EACpBD,EAAWmB,GAAeA,EAAYS,GAAQT,GAIhD,GAAI5C,EAAS0C,EAAOM,OAAQ,CAC1B,IAAMa,EAAcJ,GAAaA,EAAUf,EAAOM,OAClDG,EAAgB1B,EAAWoC,GACvBA,EAAYR,GACZQ,OAEJV,EAAgB1B,EAAWiB,EAAOM,OAC9BN,EAAOM,MAAMK,GACbX,EAAOM,MAGb,IAGIc,EAHEC,EAAiBtC,EAAWiB,EAAOK,IACrCL,EAAOK,GAAGM,GACVX,EAAOK,GAGX,GAA8B,iBAAnBgB,GAYT,KAVED,EADEC,IAAmBrG,EAAesG,OACnBZ,MAAAA,SAAAA,EAAcG,KAAKU,QAC3BF,IAAmBrG,EAAewG,SAC1Bd,MAAAA,SAAAA,EAAcG,KACtBQ,EAAeI,WAAW,MAGlB5D,EAAM6D,SAASL,EAAeM,MAAM,IAEpC9D,EAAM6D,SAASL,IAGhC,MAAM,IAAIhD,+CAC0BgD,6BAAiCxD,EAAMmD,QAAQT,eAIrFa,EAAiBC,IAAkBX,MAAAA,SAAAA,EAAcG,MAGnD,IAAMe,EAAmC,CACvCtC,KAAMuC,EACN7B,cACKA,OACHK,GAAIe,EACJZ,OAAQU,EACRjC,MAAOiC,EAAc3B,KACrBe,MAAOG,EACPqB,SAAUT,IAAmBrG,EAAewG,WAE9CO,QAAS,SAACC,GACR,IAAMC,EAAaL,EAEnB,GAAuC,iBAA5BK,EAAWjC,OAAOM,MAA7B,CAIE,IAAM4B,EAASD,EAAWjC,OAAOK,GACzBG,EAAWyB,EAAWjC,OAAtBQ,OACRwB,EAASG,OAAM,WACb,IAAMC,EAASJ,EAASnB,KAClBK,SACDV,OACHnB,KACEmB,EAAOnB,OAASwC,YACTpF,GAAM2F,EAAO7B,KAChBC,EAAOnB,KACb+C,OAAQA,IAEVF,EAAO7G,KAAK6F,WAfbc,EAASnB,KAAwBwB,UAAUJ,KAqBlD,MAAO,CAACpE,EAAO+D,MAWd,SAASU,EAKdrD,EACAkB,GAEA,OAAO9E,EAAmC4D,SACrCkB,OACHE,GAAIrF,EAAesG,iYC9LViB,aAKX,WAAoBC,GAA2BC,UAAAC,KAA3BF,SAAAA,EAAyBG,kBAJlB,GAAKA,kBACU,MAAIA,eACP,MAmEtC,OAjEgDC,MAAAlF,YAAAI,MAEjD,WACE4E,KAAKG,SAAU,EACfH,KAAKI,WACNpF,YAAAI,MAED,WAGM4E,KAAKK,WACPL,KAAKK,SAASC,KAAO,KACrBN,KAAKO,MAAQP,KAAKK,aAItBrF,cAAAI,MACA,SAAemB,GACRyD,KAAKK,SAQVL,KAAKK,SAAW,CACdjF,MAAOmB,EACP+D,KAAMN,KAAKK,UATXL,KAAKQ,QAAQjE,MAWhBvB,cAAAI,MAED,SAAemB,GACb,IAAMkE,EAAW,CACfrF,MAAOmB,EACP+D,KAAM,MAGR,GAAIN,KAAKK,SAGP,OAFAL,KAAKO,MAAOD,KAAOG,OACnBT,KAAKO,MAAQE,GAIfT,KAAKK,SAAWI,EAChBT,KAAKO,MAAQE,EAETT,KAAKG,SACPH,KAAKI,WAERpF,YAAAI,MAED,WACE,KAAO4E,KAAKK,UAAU,CAGpB,IAAMK,EAAWV,KAAKK,SACtBL,KAAKF,SAASY,EAAStF,OAGnBsF,IAAaV,KAAKK,WACpBL,KAAKK,SAAWL,KAAKK,SAASC,MAGlCN,KAAKO,MAAQ,cC1EJI,EACQ,mBAAXC,QAAyBA,OAAOC,YACxC,eCOWC,EAAiB,cC+B9B,SAASC,IACP,IAAMC,EApBoB,oBAAfC,WACFA,WAEW,oBAAT9C,KACFA,KAGA+C,OAcT,GAAOF,EAAUG,WACf,OAAQH,EAAUG,WAkBf,ICZKC,EDYCC,EAAmC,SAACC,GAK/C,IAAMC,EAAWR,IAEbQ,GACFA,EAASC,SAASF,KChBrB,SAJWF,GAAAA,EAAAA,6BAAAA,EAAAA,uBAAAA,EAAAA,uBAIX,CAJWA,IAAAA,OAMZ,IAAMK,EAAiB,CACrBC,aAAa,EACbC,MAAO,CACLC,uBAAU,gBAAA,+BAAA,OAAAA,sBAAA,yBAAE,SAACC,EAAIC,GACf,OAAOF,WAAWC,EAAIC,MAExBC,yBAAY,cAAA,+BAAA,OAAAA,sBAAA,yBAAE,SAAClE,GACb,OAAOkE,aAAalE,OAGxBmE,OAAQC,QAAQ5I,IAAI6I,KAAKD,SACzBV,UAAU,GAQCY,aAyDX,WACSC,EACP3E,GACA,MAAA4E,OAAAtC,UAAAC,KAFOoC,SAAAA,EAAmBnC,wBAAAA,uBAAAA,yBAAAA,oBAAAA,iBAtCoB,IAAIJ,EAClDG,KAAKF,SAASoC,KAAKlC,QACpBC,0BAEmD,IAAEA,mBAEM,IAAIqC,KAAKrC,wBAAAA,gBAKxCmB,EAAYmB,YAAUtC,yBAAAA,qBAAAA,+BAAAA,2BAAAA,2BAAAA,wBAAAA,4BAAAA,qBAAAA,mBAuFF,IAzD/C,ICpIEuC,EACExD,EACAyD,EACAC,EDiIEC,SACDlB,GACAhE,GAGGkE,EAAwCgB,EAAxChB,MAAOK,EAAiCW,EAAjCX,OAAQY,EAAyBD,EAAzBC,OAAQ/E,EAAiB8E,EAAjB9E,GAAIgF,EAAaF,EAAbE,SAGnC7C,KAAK5B,iBAASwE,MAAAA,SAAAA,EAAQxE,uBC5IpBoE,EAAmB,EACjBxD,EAAW,IAAI8D,IACfL,EAAc,IAAIK,IAClBJ,EAAqB,IAAIK,QAEA,CAC7BC,QAAS,WAAA,kBAAWR,MACpBS,UAAW,SAACC,EAAWC,GAErB,OADAnE,EAASoE,IAAIF,EAAWC,GACjBD,GAETG,YAAa,SAACF,GACZnE,SAAgBmE,EAASD,WACzB,IAAML,EAAWH,EAAmBY,IAAIH,QAEvBjG,IAAb2F,IACFJ,SAAmBI,GACnBH,SAA0BS,KAG9BG,IAAK,SAACT,GACJ,OAAOJ,EAAYa,IAAIT,IAEzBU,KAAM,SAACV,EAAUM,GACf,IAAMK,EAAWf,EAAYa,IAAIT,GACjC,GAAIW,GAAYA,IAAaL,EAC3B,MAAM,IAAIxH,sCACiBkH,wBAI7BJ,EAAYW,IAAIP,EAAUM,GAC1BT,EAAmBU,IAAID,EAAUN,MD8G/BA,IACF7C,KAAKyD,UAAYZ,EACjB7C,KAAK5B,OAAOmF,KAAKV,EAAU7C,OAG7BA,KAAKkD,UAAYlD,KAAK5B,OAAO4E,UAC7BhD,KAAKnC,GAAKA,MAAAA,EAAAA,EAAMmC,KAAKkD,UACrBlD,KAAKgC,OAASA,EACdhC,KAAK2B,MAAQA,EACb3B,KAAKnB,QAAU+D,EACf5C,KAAKvC,QAAUkF,EACf3C,KAAKhD,IAAM2F,EAAgB3F,IAC3BgD,KAAK0D,IAAM1D,KACXA,KAAK2D,cAAgB,CACnBxF,KAlBW6B,KAmBXnC,GAAImC,KAAKnC,GACTqF,UAAWlD,KAAKkD,UAChBlB,OAAQhC,KAAKgC,OACbvC,MAAO,SAACoC,GACNQ,EAAKuB,UAAUC,KAAKhC,IAEtBzD,OAAQ4B,KAAK5B,OACb0F,UAAW,SAACC,GACV,GAAIA,EAAMlF,UAAYwD,EACpB,MAAM,IAAI1G,wCACmBoI,EAAMlG,kBAASwE,EAAKxE,kCAGlDkG,EAAcC,UAMnBhE,KAAKrH,KAAOqH,KAAKrH,KAAKuJ,KAAKlC,MAC3BA,KAAKiE,aAsTN,OArTA/D,MAAAlF,iBAAAI,MAED,WAAqB,MACnB4E,KAAKkE,OAASlE,KAAKvC,QAAQtC,MACvB6E,KAAKoC,SAAS+B,aACZnE,KAAKoC,SAAS+B,aAAanE,KAAKvC,QAAQtC,MAAO6E,KAAK2D,eACpD3D,KAAKvC,QAAQtC,MACf6E,KAAKoC,SAASgC,gBAAgBpE,KAAK2D,wBAAe3D,KAAKvC,4BAAL4G,EAAcpH,UAGtEjC,aAAAI,MAGA,SAAeD,GAA2C,YAExD6E,KAAKkE,OAAS/I,EAMd,IALA,IAGImJ,EAHEC,EAAWvE,KAAKwE,cAKdF,EAAatE,KAAK4D,UAAUa,SAClCH,EAAWnJ,GACZ,IAEoCuJ,MAAd1E,KAAK2E,WAAS,IAArC,2BAAuC,CAAA,MAA5BC,oBACTA,EAAStE,mBAATuE,OAAAD,EAAgBL,aACjBO,eAAAA,MAED,IAAMC,oBAAc3C,UAAS4C,8BAAdC,SAA0B9J,GAEzC,OAAQ4J,MAAAA,SAAAA,EAAQA,QACd,IAAK,OACH/E,KAAKkF,WAAaC,GAAWnF,KAAKnC,GAAIkH,EAAOlI,qBACxCgC,sBAALuG,EAAczM,KACZ2D,EAAa0D,KAAKkF,WAAmB,CACnCxF,OAAQM,KACRqF,SAAUrF,KAAKnC,MAInBmC,KAAKsF,iBACL,MACF,IAAK,uBACEzG,sBAAL0G,EAAc5M,KACZ2D,EAAavC,GAAMiG,KAAKnC,GAAIkH,EAAOlI,MAAO,CACxC6C,OAAQM,QAEV,IACmCwF,MAAdxF,KAAK2E,WAAS,IAArC,2BAAuC,CAAA,MAA5BC,oBACTA,EAAS7K,oBAAT0L,OAAAb,EAAiBG,EAAOlI,gBACzB6I,eAAAA,WAGN1K,gBAAAI,MAQD,SACEuK,EAGAC,EACAC,GACc,aACRjB,ER4OH,SACLkB,EACAC,EACAC,GAEA,IAAMC,EAAO,aACPC,EAAoC,WAAvBhL,EAAO4K,GACpB3H,EAAO+H,EAAaJ,EAAc,KAExC,MAAO,CACLxF,OAAQ4F,EAAaJ,EAAYxF,KAAOwF,IAAgBG,GAAM/D,KAAK/D,GACnEpE,QAASmM,EAAaJ,EAAY/L,MAAQgM,IAAiBE,GAAM/D,KAAK/D,GACtEgI,WACGD,EAAaJ,EAAYK,SAAWH,IAAsBC,GAC3D/D,KAAK/D,IQ1PUiI,CACfT,EACAC,EACAC,IAGF7F,KAAK2E,UAAU0B,IAAIzB,GAEf5E,KAAK+E,SAAW3D,EAAYkF,qBAC9B1B,EAASuB,uBAATI,OAAA3B,GACA5E,KAAK2E,iBAAiBC,IAGxB,MAAO,CACL4B,YAAa,WACXC,EAAK9B,iBAAiBC,QAK5B5J,aAAAI,MAIA,SAAcsL,GAA0C,WAatD,OAZI1G,KAAK+E,SAAW3D,EAAYkF,SAAWtG,KAAKkF,WAC9CwB,EAAS1G,KAAKkF,YAEdlF,KAAK2E,UAAU0B,IAAI,CACjBF,SAAU,WACJQ,EAAKzB,YACPwB,EAASC,EAAKzB,eAMflF,QAGThF,YAAAI,MAGA,WACE,OAAI4E,KAAK+E,SAAW3D,EAAYwF,UAKhC5G,KAAK5B,OAAO6E,UAAUjD,KAAKkD,UAAWlD,MAClCA,KAAKyD,WACPzD,KAAK5B,OAAOmF,KAAKvD,KAAKyD,UAAWzD,MAEnCA,KAAK+E,OAAS3D,EAAYwF,QAEtB5G,KAAKoC,SAASyE,OAChB7G,KAAKoC,SAASyE,MAAM7G,KAAKkE,OAAQlE,KAAK2D,eAMxC3D,KAAK8G,OAAO9G,KAAKkE,QAEblE,KAAKvC,QAAQ8D,UACfvB,KAAK+G,iBAGP/G,KAAKgH,QAAQH,SAtBJ7G,QAyBVhF,eAAAI,MAED,SAAiBmB,GACf,IACE,IAAM0K,EAAYjH,KAAKoC,SAAS8E,WAC9BlH,KAAKkE,OACL3H,EACAyD,KAAK2D,eAGP3D,KAAK8G,OAAOG,GAER1K,EAAMI,OAASmE,GACjBd,KAAKsF,iBAEP,MAAO6B,GAEP,KAAInH,KAAK2E,UAAUyC,KAAO,GAMxB,MAAMD,EALNnH,KAAK2E,UAAU0C,SAAQ,SAACzC,GAAa,gBACnCA,EAAS7K,oBAATuN,OAAA1C,EAAiBuC,MAEnBnH,KAAKzH,WAKVyC,YAAAI,MAED,WACE,OAAI4E,KAAK+E,SAAW3D,EAAYkF,QACvBtG,MAETA,KAAKgH,QAAQO,QACTvH,KAAK+E,SAAW3D,EAAYmB,YAC9BvC,KAAK+E,OAAS3D,EAAYkF,QACnBtG,OAETA,KAAKgH,QAAQxG,QAAQlE,EAAa,CAAEM,KAAMkE,KAEnCd,UAGThF,WAAAI,MAGA,WACE,GAAI4E,KAAKnB,QACP,MAAM,IAAIlD,MAAM,gDAElB,OAAOqE,KAAKgE,WACbhJ,gBAAAI,MACD,WAA0B,IACaoM,MAAdxH,KAAK2E,WAAS,IAArC,2BAAuC,CAAA,MAA5BC,oBACTA,EAASuB,uBAATsB,OAAA7C,aACD8C,eAAAA,MACD1H,KAAK2E,UAAU4C,WAChBvM,qBAAAI,MACD,WAGE,GAFA4E,KAAK2H,YAED3H,KAAK+E,SAAW3D,EAAYwF,QAE9B,OAAO5G,KAIT,cAAkBnF,OAAOC,KAAKkF,KAAK4H,iCAAmB,CAAjD,IAAM5M,OACTgF,KAAK2B,MAAMI,aAAa/B,KAAK4H,iBAAiB5M,IAchD,OAVAgF,KAAKgH,QAAQO,QAKbvH,KAAKgH,QAAU,IAAInH,EAAQG,KAAKF,SAASoC,KAAKlC,OAE9CA,KAAK+E,OAAS3D,EAAYkF,QAC1BtG,KAAK5B,OAAOiF,YAAYrD,MAEjBA,QAGThF,WAAAI,MAKA,SAAYmB,GACV,IAAMuB,EAASxB,EAAaC,GAE5B,GAAIyD,KAAK+E,SAAW3D,EAAYkF,QAAhC,CAiBA,GAAItG,KAAK+E,SAAW3D,EAAYwF,UAAY5G,KAAKvC,QAAQiE,YACvD,MAAM,IAAI/F,uBACEmC,EAAOnB,mDACfqD,KAAKnC,yHAEuGgK,KAAKC,UACjHhK,EAAOjB,QAKbmD,KAAKgH,QAAQxG,QAAQ1C,OAGvB9C,gBAAAI,MACA,SACEmE,GACM,WACNS,KAAK4H,iBAAiBrI,EAAWjC,OAAOO,IAAMmC,KAAK2B,MAAMC,YAAW,WAC9D,OAAQrC,EAAWjC,QAAUiC,EAAWjC,OAAOK,GACjD4B,EAAWjC,OAAOK,GAAGhF,KAAK4G,EAAWjC,OAAOQ,QAE5CiK,EAAKpP,KAAK4G,EAAWjC,OAAOQ,UAE7ByB,EAAWjC,OAAOM,UAGvB5C,aAAAI,MACA,SAAc4M,GACZhI,KAAK2B,MAAMI,aAAa/B,KAAK4H,iBAAiBI,WACvChI,KAAK4H,iBAAiBI,MAC9BhN,qBAAAI,MAED,WACE,IAAQmG,EAAavB,KAAKvC,QAAlB8D,SACJA,IAEoB,mBAAbA,EAA0BA,EAAWF,GAEtBrB,SAE3BhF,aAAAI,MACD,WACE,MAAO,CACLyC,GAAImC,KAAKnC,OAEZ7C,wBAAAI,MAED,WAAsE,QACpE,yBAAYgH,UAAS6F,sCAAdC,SAAkClI,KAAKkE,WAC/ClJ,IAEO2F,EAAgBvF,MAAxB,WACE,OAAO4E,QACRhF,kBAAAI,MAED,WACE,OAAO4E,KAAKoC,SAASoC,YACjBxE,KAAKoC,SAASoC,YAAYxE,KAAKkE,QAC/BlE,KAAKkE,gBAsBN,SAASiE,EACd/F,EACA3E,GAIA,OAFoB,IAAI0E,EAAYC,EAAU3E,GEzfhD,IAAM2K,EAAiB,YAEhB,MAIA,CACLlK,UANAA,QAOA3B,QANAA,6XCZF,IAAM8L,GAAQ,IAAItF,QCgFX,SAASuF,GAIdC,EACArK,EACAJ,EACA3C,GACS,UACDmD,EAAYnD,EAAZmD,QAEFkK,YAAYlK,MAAAA,aAAAA,EAASb,gCAATgL,EAAkBC,2BAAlBC,EAA2BJ,EAAM3L,qBAAS2L,EAAMC,UAElE,IAAKA,EACH,MAAM,IAAI7M,uBAAgB4M,EAAM3L,iCAGlC,OAAO4L,EAAU,CACftK,QAAAA,EACA3B,MAAOuB,EAAOjB,KACd1B,MAAAA,EACAoN,MAAAA,EACAzK,OAAAA,EACA8K,SAAUN,KAIP,SAASO,GAIdC,EACAC,GACmC,MACnC,OAAInO,EAASkO,GACJ,CACLlM,KAAMkM,EACNN,WAAWO,MAAAA,SAAAA,EAAeD,UAAgB5L,EAC1CI,OAAQ,CAAEV,KAAMkM,IAIhBzM,EAAWyM,GACN,CACLlM,KAAMkM,EAAYnM,KAClB6L,UAAWM,EACXxL,OAAQ,CACNV,KAAMkM,EAAYnM,KAClBA,KAAMmM,EAAYnM,OAKjB,CACLC,KAAMkM,EAAYlM,KAClBU,OAAQwL,EAAYxL,QAAUwL,EAC9B9J,mBACE8J,EAAY9J,6BADJgK,EAEPC,KAAI,SAACC,GAAU,OAAKL,GAAkBK,EAAYH,MACrDP,WACEO,MAAAA,SAAAA,EAAeD,EAAYlM,QAAUkM,EAAoBN,WClD/D,SAASW,GACPC,GAEA,OAAOvO,OAAOwO,OAAOD,EAAUE,QAAQC,QAAO,SAACC,GAAE,MAAiB,YAAZA,EAAG5M,QAG3D,SAAS6M,GACPL,EACAM,GAMA,IAJA,IAAMC,EAAqC,GAGvCC,EAAIR,EAAUxG,OACXgH,GAAKA,IAAMF,GAChBC,EAAU9F,KAAK+F,GACfA,EAAIA,EAAEhH,OAGR,OAAO+G,EAGF,SAASE,GACdC,GAEA,IAM6BpF,EANvBqF,EAAgB,IAAIzH,IAAIwH,GACxBE,EAAmB,IAAI1H,IAAIwH,GAE3BG,EAAUC,GAAWF,OAGXD,GAAa,IAA7B,2BAA+B,CAAA,IAApBI,UAET,GAAe,aAAXA,EAAEvN,MAAyBqN,EAAQ3G,IAAI6G,IAAOF,EAAQ3G,IAAI6G,GAAIrO,QAGhE,GAAe,aAAXqO,EAAEvN,KAAqB,CAAA,IACS4K,MAAd2B,GAAYgB,IAAE,IAAlC,2BAAoC,CAAA,IAAzBpG,UACT,GAAmB,YAAfA,EAAMnH,OAILoN,EAAiBI,IAAIrG,GACxB,cAA+BsG,GAAqBtG,kBAAQ,CAAvD,IAAMuG,OACTN,EAAiB3D,IAAIiE,cAG1B5C,eAAAA,aAbH2C,GAAqBF,GAAG9C,SAAQ,SAACmC,GAAE,OAAKQ,EAAiB3D,IAAImD,gBAkBjE1E,eAAAA,MAAA,IACgCU,MAAhBwE,GAAgB,IAAhC,2BAGE,IAHgC,IAC5BJ,UAAMhH,OAEHgH,GACLI,EAAiB3D,IAAIuD,GACrBA,EAAIA,EAAEhH,gBAET8C,eAAAA,MAED,OAAOsE,EAGT,SAASO,GAAgBC,EAAwBP,GAC/C,IArEyBb,EAqEnBqB,EAAkBR,EAAQ3G,IAAIkH,GAEpC,IAAKC,EACH,MAAO,GAGT,GAAsB,aAAlBD,EAAS5N,KAAqB,CAChC,IAAM8N,EAAiBD,EAAgB,GACvC,IAAIC,EAKF,MAAO,GAJP,GA7Ee,YADMtB,EA8ECsB,GA7EhB9N,MAAwC,UAAnBwM,EAAUxM,KA8EnC,OAAO8N,EAAe1P,IAO5B,IAC4C2P,EADtC1P,EAAa,OACUwP,GAAe,IAA5C,2BAA8C,CAAA,IAAnCC,UACTzP,EAAWyP,EAAe1P,KAAOuP,GAAgBG,EAAgBT,aAClEW,eAAAA,MAED,OAAO3P,EAGF,SAASiP,GAGdH,GACA,IAE6Bc,EAFvBZ,EAAmB,IAAInH,QAEbiH,GAAa,IAA7B,2BAA+B,CAAA,IAApBI,UACJF,EAAQG,IAAID,IACfF,EAAQ7G,IAAI+G,EAAG,IAGbA,EAAEvH,SACCqH,EAAQG,IAAID,EAAEvH,SACjBqH,EAAQ7G,IAAI+G,EAAEvH,OAAQ,IAGxBqH,EAAQ3G,IAAI6G,EAAEvH,QAASiB,KAAKsG,cAE/BW,eAAAA,MAED,OAAOb,EAGF,SAASc,GACdC,EACAjB,GAGA,OAAOQ,GAAgBS,EAAUd,GADlBL,GAAiBE,KAuZ3B,SAASM,GACdjB,GAEA,IAAMhG,EAAM,IAAId,IAwBhB,OAtBA,SAAS2I,EAAKC,GACZ,IAAI9H,EAAIgH,IAAIc,GAIZ,GADA9H,EAAIiD,IAAI6E,GACmB,aAAvBA,EAActO,KAAqB,CAAA,IACqBuO,MAA5BD,EAAcE,QAAQ5L,QAAM,IAA1D,2BAA4D,CAAA,IACI6L,EADrDC,cACO7B,GAAmB6B,EAAiBlC,IAAU,IAA9D,2BAAgE,CAAA,IAArDmC,UACTnI,EAAIiD,IAAIkF,aACTC,eAAAA,MAEDP,EAAKK,aACNG,eAAAA,YACI,GAA2B,aAAvBP,EAActO,KAAqB,CAAA,IACE8O,MAA1BvC,GAAY+B,IAAc,IAA9C,2BAAgD,CAC9CD,qBACDU,eAAAA,QAILV,CAAK7B,KAEMhG,GAKN,SAASwI,GACdxC,EACAyC,GAEA,GZxoB8B,MYwoBhBA,EAra8B,GAsa1C,OAAOzC,EAAU9K,QAAQwN,iBAAiBD,GAE5C,IAAKzC,EAAUE,OACb,MAAM,IAAI3N,gDAC2BkQ,qBAAmBzC,EAAUvL,iCAGpE,IAAMkO,EAAS3C,EAAUE,OAAOuC,GAChC,IAAKE,EACH,MAAM,IAAIpQ,6BACQkQ,kCAAgCzC,EAAUvL,SAG9D,OAAOkO,EAwCF,SAASC,GAId5C,EACAjO,GAEA,IAAMF,EACJE,aAAiB8Q,GACb9Q,EAAMC,MACNV,EAAaS,EAAOiO,EAAU9K,QAAQ9D,WAE5C,GAAII,EAASK,GACX,MAAO,CAACmO,EAAWA,EAAUE,OAAOrO,IAGtC,IAAMiR,EAAiBrR,OAAOC,KAAKG,GAC7BwP,EAAuCyB,EAC1CjD,KAAI,SAACkD,GAAW,OAAKP,GAAaxC,EAAW+C,MAC7C5C,OAAO6C,SAEV,MAAO,CAAChD,EAAU9K,QAAQ+N,KAAMjD,GAAWjN,OACzCsO,EACAyB,EAAeI,QAAO,SAACC,EAAkBJ,GACvC,IAAMK,EAAeZ,GAAaxC,EAAW+C,GAC7C,IAAKK,EACH,OAAOD,EAET,IAAME,EAAgBT,GACpBQ,EACAvR,EAAWkR,IAGb,OAAOI,EAAiBpQ,OAAOsQ,KAC9B,6DCnrBMR,cAuGX,WACES,EACOpO,GACP,YAAAyB,UAAAC,KADO1B,QAAAA,EAAwB2B,sBAAAA,uBAAAA,sBAAAA,wBAAAA,yBAAAA,sBAxF+B,IAAEA,iBAC7B,IAAEA,uBAAAA,gCAAAA,wBAAAA,mBAIZ,GAAKA,yBAAAA,+BAAAA,6BAAAA,0BAqF9BD,KAAK9B,QAAUwO,EAAOxO,QACtB8B,KAAKlC,OAAS4O,EAAO5O,OACrBkC,KAAK2M,yBAAiBD,EAAOC,8BAAkB,GAC/C3M,KAAKzD,MAAQyD,KAAKlC,OAAOjB,KACzBmD,KAAK4M,aAAeF,EAAOE,cAAgB,GAC3C5M,KAAK6M,kBAAUH,EAAOG,uBAAW,GACjC7M,KAAK8M,QAAU9M,KAAK8M,QAAQ5K,KAAKlC,MACjCA,KAAK+M,UAAY/M,KAAK+M,UAAU7K,KAAKlC,MACrCA,KAAK+J,wBACH2C,EAAO3C,6BACP3N,MAAM4Q,KAAKnD,GAAiBmC,GAAc1N,EAAQ+N,KAAMK,EAAOtR,SACjE4E,KAAKiN,YAAcP,EAAOO,YAC1BjN,KAAKhB,SAAW0N,EAAO1N,SAEvBgB,KAAK5E,MAAQ2P,GAAczM,EAAQ+N,KAAMrM,KAAK+J,eAC9C/J,KAAKkN,KAAO,IAAI5K,IAAIrG,EAAQ+D,KAAK+J,cAAcd,KAAI,SAACO,GAAE,OAAKA,EAAG0D,UAC9DlN,KAAKmN,eAAOT,EAAOS,qBACnBnN,KAAKoN,OAASV,EAAOU,OA5BtB,OA+BDlN,MAAAlF,gBAAAI,MAKA,WAGY,WAFVH,yDAAyB+E,KAAK5E,MAC9BZ,yDAAoB,IAEpB,GAAII,EAASK,GACX,MAAO,CAACA,GAEV,IAAMoS,EAAYxS,OAAOC,KAAKG,GAE9B,OAAOoS,EAAUlR,aAAVkR,IACFA,EAAUpE,KAAI,SAACjO,GAAG,OACnBqH,EAAK0K,UAAU9R,EAAWD,GAAMR,GAAWyO,KACzC,SAACkB,GAAC,OAAKnP,EAAMR,EAAY2P,aAIhCnP,aAAAI,MAED,WACuE4E,KAA7D+J,cAA6D/J,KAA9CiN,YAAvB,IAAoCC,EAAiClN,KAAjCkN,KAAiClN,KAA3B1B,QAE1C,iBAFqE0B,cAE7CkN,KAAM9Q,MAAM4Q,KAAKE,GAAOI,KAAMtN,KAAKsN,UAG7DtS,cAAAI,MAIA,SAIEX,GACA,OAAOJ,EAAaI,EAAyBuF,KAAK5E,UAGpDJ,aAAAI,MAIA,SACEmS,GAIA,OAAOvN,KAAKkN,KAAK9C,IAAImD,MAGvBvS,UAAAI,MAQA,SAAWmB,GAGHyD,KAAK1B,QAKX,IAAMkP,EAAiBxN,KAAK1B,QAAQmP,kBAClCzN,KACA1D,EAAaC,IAGf,QACIiR,MAAAA,IAAAA,EAAgB1R,SAElB0R,EAAeE,MAAK,SAACC,GAAC,YAAkBzQ,IAAbyQ,EAAEnO,QAAwBmO,EAAEd,QAAQ/Q,aAInEd,iBAAAsI,IAGA,WAA+C,IHjQzBsK,EAAa5S,EAAa6G,EAC5CgM,SGiQF,OHlQoBD,EGkQR5N,KHlQqBhF,EGkQf,aHlQ4B6G,EGkQd,WAC9B,SACK,IAAIS,IAAIrG,IAAYwK,EAAKsD,cAAcd,KAAI,SAACO,GAAE,OAAKA,EAAGsE,mBHnQ3DD,EAAexF,GAAM/E,IAAIsK,IAKhB5S,KAAO6S,IAClBA,EAAa7S,GAAO6G,MAHpBgM,OAAkB7S,EAAM6G,KACxBwG,GAAMjF,IAAIwK,EAAQC,IAKbA,EAAa7S,MG6PnBA,WAAAsI,IAED,WACE,OAAOtD,KAAK+J,cAAcuC,QAAO,SAACyB,EAAK3E,GAIrC,YAHuBlM,IAAnBkM,EAAUkE,OACZS,EAAI3E,EAAUvL,IAAMuL,EAAUkE,MAEzBS,IACN,SACJ/S,WAAAI,MAjLD,SAIEH,GAG8B,IAF9BiD,yDAAoB,GACpBI,yCAEA,GAAIrD,aAAsBgR,EACxB,OAAIhR,EAAWiD,UAAYA,EAClB,IAAI+N,EACT,CACE7Q,MAAOH,EAAWG,MAClB8C,QAAAA,EACAJ,OAAQ7C,EAAW6C,OACnB+O,QAAS,GACTS,KAAM,GACNvD,cAAe,GACfkD,YAAa,GACbjO,SAAU,IAEZV,GAIGrD,EAGT,IAAM6C,EAASkQ,GAAgB,IAEzBjE,EAAgBF,GACpBmC,GAAc1N,EAAQ+N,KAAMpR,IAG9B,OAAO,IAAIgR,EACT,CACE7Q,MAAOH,EACPiD,QAAAA,EACAJ,OAAAA,EACA+O,QAAS,GACTS,UAAMpQ,EACN6M,cAAe3N,MAAM4Q,KAAKjD,GAC1BkD,YAAa,GACbjO,SAAU,IAEZV,YAuIC,SAAS2P,GACd9S,GAEQ,IADRuR,yDAAyC,GAEzC,OAAO,IAAIT,UACJ9Q,GAAUuR,GACfvR,EAAMmD,SC3QH,SAAS7E,GAKdyU,GAQA,OAAO/Q,EACL,CAAEP,KAAMuR,EAAkB7Q,OAAQ4Q,IAClC,SAACpQ,KAAoC,IAI/BsQ,ETGiBC,ESPZlT,IAAAA,MAAO6C,IAAAA,aACVpB,EAAOuC,EACLtB,EAAYqQ,EAAZrQ,GAAIb,EAAQkR,EAARlR,IAGZ,ITEqBqR,ESFNrR,ITGc,WAAhB9B,EAAOmT,IAA0C,mBAAdA,EAAK1V,KSFnDyV,EAAuB,CACrBxR,KAAAA,EACAU,cACK4Q,OACHxK,IAAK1G,SAGJ,CACL,IAAMD,EAAaD,EACjB3B,EAAMmD,QAAQb,QAAQ6Q,OAAOtR,IAG/B,GAAKD,EAKE,CACL,IAAME,EACJ,UAAWiR,EAAYA,EAAUjR,MAAQF,EAAWE,MAChDyG,EAAMyE,EAAUpL,EAAWC,IAAK,CACpCa,GAAAA,EACAb,IAAAA,EACA4F,OAAQ5E,MAAAA,SAAAA,EAAcG,KACtB0E,SAAUqL,EAAUrL,SACpB5F,MACmB,mBAAVA,EACHA,EAAM,CACJiB,QAAS/C,EAAM+C,QACf3B,MAAOuB,EAAOjB,KACdsB,KAAMH,MAAAA,SAAAA,EAAcG,OAEtBlB,IAGRmR,EAAuB,CACrBxR,KAAAA,EACAU,cACK4Q,OACHxK,IAAAA,UA1BJ0K,EAAuB,CACrBxR,KAAAA,EACAU,OAAQ4Q,GA8Bd,IAAM/K,EAAWiL,EAAqB9Q,OAAOoG,IACvC6K,EAAeN,GAAW9S,EAAO,CACrC6D,gBACK7D,EAAM6D,kBACRnB,EAAKsF,MA6BV,OAzBAiL,EAAqB/O,QAAU,SAACC,GAC9B,IAAMsD,EAAStD,EAASnB,OACJiQ,EAAqB9Q,OAAjCO,IAAAA,KAAI6F,KAUZpE,EAASG,OAAM,WACb,GAAI0D,EAAS4B,SAAW3D,EAAYkF,QAGpC,IAAI,gBACFnD,EAAS0D,oBAAT2H,OAAArL,GACA,MAAOgE,GAEP,YADAvE,EAAOjK,KAAKoB,GAAM8D,EAAIsJ,SAMrB,CAACoH,EAAcH,MCtGrB,SAASK,GAIdtQ,EACAG,EACAJ,EACAJ,EACA4Q,GAEA,OAAO,SAAC1R,GAAsB,IAAjBS,yDAAU,GACrB,GAAI7C,EAASoC,GAAM,CACjB,IAAMD,EAAaD,EAAuBwB,EAAQb,QAAQ6Q,OAAOtR,IAEjE,GAAID,EAAY,CAAA,MACR4R,YAAelR,EAAQI,kBAAM,OAC7BZ,EAAQ,UAAWQ,EAAUA,EAAQR,MAAQF,EAAWE,MAGxDkG,EAAWgF,EAAUpL,EAAWC,IAAK,CACzCa,GAAI8Q,EACJ/L,OAAQzE,EACRlB,MACmB,mBAAVA,EACHA,EAAM,CACJiB,QAAAA,EACA3B,MAAOuB,EAAOjB,KACdsB,KAAAA,IAEFlB,IAcR,OAXAyR,EAAmB7K,KACjBpK,GAAO,CACLoE,GAAIsF,EAAStF,GAEbb,IAAKmG,EACLO,IAAKP,EACLmK,UAAMpQ,EACND,MAAAA,KAIGkG,EAGT,MAAM,IAAIxH,0BACKqB,2CAAoCsB,EAAQT,SAK3D,IAAMsF,EAAWgF,EAAUnL,EAAK,CAC9Ba,GAAIJ,EAAQI,IAAM,YAClB+E,OAAQzE,EACRlB,MAAOQ,EAAQR,QAcjB,OAXAyR,EAAmB7K,KACjBpK,GAAO,CAELuD,IAAKmG,EACLO,IAAKP,EACLtF,GAAIsF,EAAStF,GACbyP,UAAMpQ,EACND,MAAOQ,EAAQR,SAIZkG,OC7CAyL,GAAYtS,EAAa,CAAEM,KAAMuC,IAwCvC,SAAS0P,GAIdzR,GAEA,GAAIG,EAAgBH,GAClB,OAAOA,EAGT,GAAsB,iBAAXA,EACT,MAAO,CAAER,KAAMQ,EAAQE,OAAQ,IAGjC,GAAsB,mBAAXF,EAAuB,CAChC,IAAMR,EAAO,kBACb,OAAOO,EAAoB,CAAEP,KAAAA,EAAMU,OAAQ,KAAM,SAACQ,KAAsB,IAAZ3C,IAAAA,MACpD2T,EAAiC,CACrClS,KAAAA,EACAU,OAAQ,CACNyR,SAAU3R,GAEZiC,QAAS,SAACC,GACR,OAAOlC,EAAO,CACZc,QAAS/C,EAAM+C,QACf3B,MAAOuB,EAAOjB,KACdO,OAAQ0R,EACRhR,OAAQA,EACRK,KAAMmB,EAASnB,KACfC,OAAQkB,EAASlB,WAKvB,MAAO,CAACjD,EAAO2T,MAKnB,OAAO1R,MAGI4R,GAAkB,SAI7B5R,GAEA,OAAKA,GAGW/B,EAAQ+B,GAAUA,EAAS,CAACA,IAC7B6L,IAAI4F,IAHV,IA8CJ,SAAS1J,GAAW8J,EAAkB7B,GAC3C,IAAMxQ,YAAUvE,EAAY6W,uBAAcD,GACpCE,EAAc,CAClBvS,KAAAA,EACAwQ,OAAAA,EAGF+B,SAAuB,WAAA,OAAMvS,IAE7B,OAAOuS,EAGF,SAASpV,GAAM8D,EAAYhB,GAChC,IAAMD,YAAUvE,EAAYyB,0BAAiB+D,GACvCsR,EAAc,CAAEvS,KAAAA,EAAMC,KAAAA,EAE5BsS,SAAuB,WAAA,OAAMvS,IAE7B,OAAOuS,EAGF,SAASnB,GACd/Q,GAEA,OAAOX,EAAa,CAAEM,KAAMuC,EAAkBlC,MAAAA,4BAzDzC,SAAemS,EAA2BvR,GAC/C,IAAMwR,EAAWxR,aAASA,GAAO,GACjC,gBAAUxF,EAAYa,kBAASkW,cAAYC,aCvHtC,SAKLC,GAIA,OAAOnS,EASL,CACEP,KAAMuC,EACN7B,OAAQ,CACNgS,WAAAA,KAGJ,SAACxR,KAA4C,MAAlC3C,IAAAA,MAAOiC,IAAAA,OAAQY,IAAAA,aAClBuR,EAAwC,GAE9C,IAAKpU,EAAM+C,QACT,MAAM,IAAIvC,MACR,iGAIJ,IAAMsC,EAGF,CACFC,QAAS/C,EAAM+C,QACf3B,MAAOuB,EAAOjB,KACdO,OAAAA,EACAU,OAAAA,EACA0R,MAAOf,GACLzQ,MAAAA,SAAAA,EAAcG,KACdhD,EAAMmD,QACNnD,EAAM+C,QACNJ,EACAyR,GAEFpR,eAAMH,MAAAA,SAAAA,EAAcG,oBAAS,GAC7BC,OAAQJ,MAAAA,SAAAA,EAAcI,QAGpBqR,EAAmC,GACvC,GAAIpT,EAAWiT,GACbG,EAAgBH,EAAWrR,QAE3B,cAAkBpD,OAAOC,KAAKwU,kBAAa,CAAtC,IAAMtU,OACH0U,EAAiBJ,EAAWtU,GAClCyU,EAAczU,GAAyBqB,EAAWqT,GAC9CA,EAAezR,GACfyR,EAIR,IAAMC,EAAiB9U,OAAO9B,OAAO,GAAIoC,EAAM+C,QAASuR,GAExD,MAAO,CACLxB,GAAW9S,EAAO,CAChB+C,QAASyR,IAEX,CACE/S,KAAMuC,EACN7B,OAAQ,CACNY,QAASyR,EACT9C,QAAS0C,kBC7Ed,SAKLvH,GAQA,OAAO7K,EACL,CACEP,KAAMgT,EACNtS,OAAQ,CACN0K,OAAAA,KAGJ,SAAClK,KAAoC,MAA1B3C,IAAAA,MAAO6C,IAAAA,aACV6R,EAAiBxT,EAAW2L,GAC9BA,EAAO,CACL9J,QAAS/C,EAAM+C,QACf3B,MAAOuB,EAAOjB,KACdiB,OAAAA,EACAK,eAAMH,MAAAA,SAAAA,EAAcG,oBAAS,GAC7BC,OAAQJ,MAAAA,SAAAA,EAAcI,SAExB4J,EAEJ,MAAO,CACL7M,EACA,CACEyB,KAAM,gBACNU,OAAQ,CACN0K,OAAQ6H,GAEVxQ,QAAS,SAACC,GACYA,EAASnB,KAEjBtF,OAAOgX,mBCjDxB,SAKLnH,GAQA,OAAOvL,EACL,CAAEP,KAAMuC,EAAoB7B,OAAQ,CAAEoL,OAAAA,KACtC,SAAC5K,KAAsB,MAAZ3C,IAAAA,MACH2U,YAAiBpH,EAAOqH,MAAK,SAACC,GAClC,IAAMzH,EACJyH,EAAUzH,OACVM,GACEmH,EAAUzH,OACV,SAAC0H,GAAS,OAAK9U,EAAMmD,QAAQb,QAAQiL,OAAOuH,MAEhD,OAAQ1H,GAASD,GAAcC,EAAOpN,EAAM+C,QAASJ,EAAQ3C,0BAPxC+U,EAQnBrD,QAEJ,MAAO,CACL1R,EACA,CACEyB,KAAMuC,EACN7B,OAAQ,CACNuP,QAASmC,GAAgBc,sCH6G9B,SAAcjS,EAAYuP,GAC/B,IAAMxQ,YAAUvE,EAAYe,sBAAayE,GACnCsR,EAAc,CAClBvS,KAAAA,EACAwQ,OAAAA,EAGF+B,SAAuB,WAAA,OAAMvS,IAE7B,OAAOuS,yCdyGF,SAKLgB,EACA1S,GAEA,OAAOmC,GACL,SAACwQ,GACC,MAAO,CACLxT,KAAMuC,EACNtC,KAAMR,EAAW8T,GAAaA,EAAUC,GAAOD,YAI9C1S,OACHE,GAAIrF,EAAesG,uBAvDlB,SAILY,EACA/B,GAEA,GAC2B,eAAzB4S,QAAQC,IAAIC,YACV/Q,GAA4B,mBAAXA,GACnB,CACA,IAAMgR,EAAiBhR,EACvBA,EAAS,WACP,IAAMb,EACsB,mBAAnB6R,EACHA,0BACAA,EACN,IAAK7R,EACH,MAAM,IAAIhD,mGAIZ,OAAOgD,GAGX,OAAOhG,GAAuB,YAAQ,SAAL4D,eAC5BkB,OACHE,GAAI6B,2BOhOD,WAaL,IARAiR,yDAAqDrI,EACrDsI,yCAQA,OAAOvT,EACL,CAAEP,KAAM+T,EAAerT,OAAQ,CAAEoT,MAAAA,EAAOD,KAAAA,KACxC,SAAC3S,KAAoC,MAA1B3C,IAAAA,MAAO6C,IAAAA,aACV4S,EACY,mBAATH,EACHA,EAAK,CACHvS,QAAS/C,EAAM+C,QACf3B,MAAOuB,EAAOjB,KACdiB,OAAAA,EACAK,eAAMH,MAAAA,SAAAA,EAAcG,oBAAS,GAC7BC,OAAQJ,MAAAA,SAAAA,EAAcI,SAExBqS,EACN,MAAO,CACLtV,EACA,CACEyB,KAAM,aACNU,OAAQ,CACNoT,MAAAA,EACAtV,MAAOwV,GAETvR,QAAS,SAACC,GACG,QAAPoR,YACFpR,EAAS0C,qBAAT6O,OAAAvR,EAAkBoR,EAAOE,aAEzBtR,EAAS0C,qBAAT8O,OAAAxR,EAAkBsR,kBW7CzB,SAKLpT,EAGAC,GAQA,OAAON,EACL,CACEP,KAAMuC,EACN7B,OAAQ,CACNM,MAAOH,EAAUA,EAAQG,WAAQV,EACjCX,MAAOiB,EACPK,GACEJ,QAA0BP,IAAfO,EAAQI,GACfJ,EAAQI,GACe,mBAAhBL,EACPA,EAAYb,KACZa,EAAYZ,QAGtB,SAACkB,KAAoC,MA0B/BC,EA1BK5C,IAAAA,MAAO6C,IAAAA,aACVV,EAAS,CACbM,MAAOH,EAAUA,EAAQG,WAAQV,EACjCX,MAAOiB,EACPK,GACEJ,QAA0BP,IAAfO,EAAQI,GACfJ,EAAQI,GACe,mBAAhBL,EACPA,EAAYb,KACZa,EAAYZ,MAEdqB,EAC0B,CAC9BC,QAAS/C,EAAM+C,QACf3B,MAAOuB,EAAOjB,KACdiB,OAAAA,EACAK,eAAMH,MAAAA,SAAAA,EAAcG,oBAAS,GAC7BC,OAAQJ,MAAAA,SAAAA,EAAcI,QAElBC,EAAYlD,EAAMmD,QAAQb,QAAQc,OAGlCC,EAAgBlC,EACG,mBAAhBkB,EAA6BA,EAAYS,GAAQT,GAI1D,GAA4B,iBAAjBF,EAAOM,MAAoB,CACpC,IAAMa,EAAcJ,GAAaA,EAAUf,EAAOM,OAClDG,EACyB,mBAAhBU,EAA6BA,EAAYR,GAAQQ,OAE1DV,EAC0B,mBAAjBT,EAAOM,MACVN,EAAOM,MAAMK,GACbX,EAAOM,MAGf,IAAMsB,EAIF,CACFtC,KAAMuC,EACN7B,cACKA,OACHQ,OAAQU,EACRjC,MAAOiC,EAAc3B,KACrBe,MAAOG,IAETsB,QAAS,SAACC,GACmC,iBAAhCJ,EAAe5B,OAAOM,OAC9B0B,EAASnB,KAAwBwB,UAAUT,KAMlD,MAAO,CAAC/D,EAAO+D,6BJzEd,SACL4P,EACAiC,GAEA,GAAIxT,EAAgBuR,GAClB,OAAOA,EAET,MAAMkC,EAAqBD,EAAkBjC,EAAalS,MAE1D,MAAkC,mBAAvBoU,EACF7T,EACL,CAAEP,KAAM,kBAAmBU,iBAAQwR,EAAaxR,sBAAU,KAC1D,SAACQ,KAAsB,IAAZ3C,IAAAA,MACHoQ,EAAsB,CAC1B3O,KAAMkS,EAAalS,KACnBU,OAAQwR,EAAaxR,OACrB+B,QAAS,SAACC,GACR,OAAO0R,EAAmB,CACxB9S,QAAS/C,EAAM+C,QACf3B,MAAOpB,EAAMoB,MACba,OAAQmO,EACRzN,OAAQ3C,EAAM2C,OACdM,OAAQkB,EAASlB,OACjBD,KAAMmB,EAASnB,SAKrB,MAAO,CAAChD,EAAOoQ,MAGVyF,GAGFlC,adoIJ,SAKLvS,EACAkB,GAEA,OAAO9E,EAAuB4D,SACzBkB,OACHE,GAAI,YACF,SADKG,OACS4B,6CA+Eb,SAKLuR,EACA1U,EAOAkB,GAEA,OAAO9E,EAA4B4D,SAC9BkB,OACHE,GAAIsT,amBnSD,SAKL9N,GAWA,IAAM8N,EAAQ9N,EAEd,OAAOhG,EACL,CACEP,KAAMsU,EACN5T,OAAQ,CACN2T,MAAAA,KAGJ,SAACnT,KAAsB,IAAZ3C,IAAAA,MACHgW,EAAmB9U,EAAW4U,GAChCA,EAAM,CAAE/S,QAAS/C,EAAM+C,QAAS3B,MAAOuB,EAAOjB,OAC9CoU,EACE9N,EACwB,iBAArBgO,EACHhW,EAAM6D,SAASmS,GACfA,EAEN,MAAO,CACLhW,EACA,CACEyB,KAAM,cACNU,OAAQ,CAAE2T,MAAO9N,GACjB9D,QAAS,SAACC,GACH6D,IAGDA,EAAS4B,SAAW3D,EAAYwF,QAIpCtH,EAASG,OAAM,WACbH,EAASwE,UAAUX,MAJnB7D,EAASwE,UAAUX"}