{"version":3,"sources":["../../../src/agent/durable/constants.ts","../../../src/agent/durable/durable-stream-until-idle.ts","../../../src/agent/durable/utils/serialize-state.ts","../../../src/agent/durable/preparation.ts","../../../src/agent/durable/run-registry.ts","../../../src/agent/durable/stream-adapter.ts","../../../src/agent/durable/workflows/shared/execute-tool-calls.ts","../../../src/agent/durable/workflows/shared/schemas.ts","../../../src/agent/durable/workflows/shared/iteration-state.ts","../../../src/agent/durable/workflows/steps/background-task-check.ts","../../../src/agent/durable/utils/apply-tool-payload-transform.ts","../../../src/agent/durable/utils/resolve-runtime.ts","../../../src/agent/durable/workflows/steps/llm-execution.ts","../../../src/agent/durable/workflows/steps/tool-call.ts","../../../src/agent/durable/workflows/steps/llm-mapping.ts","../../../src/agent/durable/workflows/steps/is-task-complete.ts","../../../src/agent/durable/workflows/steps/goal.ts","../../../src/agent/durable/workflows/steps/signal-drain.ts","../../../src/agent/durable/workflows/create-durable-agentic-workflow.ts","../../../src/agent/durable/durable-agent.ts","../../../src/agent/durable/create-durable-agent.ts","../../../src/agent/durable/evented-agent.ts","../../../src/agent/durable/create-evented-agent.ts"],"names":["RequestContext","MASTRA_THREAD_ID_KEY","MASTRA_RESOURCE_ID_KEY","deepMerge","mastraDBMessageToSignal","MASTRA_VERSIONS_KEY","mergeVersionOverrides","MessageList","getOrCreateSpan","EntityType","ProcessorRunner","createObservabilityContext","TripWire","SaveQueueManager","normalizeToolPayloadTransformPolicy","toStandardSchema","TTLCache","safeEnqueue","safeClose","ReadableStream","MastraModelOutput","z","createStep","PUBSUB_SYMBOL","transformToolPayloadForTargets","withToolPayloadTransformMetadata","getNeedsApprovalFn","resolveModelConfig","isSupportedLanguageModel","mergeProviderOptions","PrepareStepProcessor","composeStepInput","buildLlmPromptArgs","applyAutoResumeSystemMessage","injectBackgroundTaskPrompt","inferProviderExecuted","getStepAvailableToolNames","execute","mergeLlmCallHeaders","buildMemoryHeaders","modelId","output","findProviderToolByName","meta","resolveBackgroundConfig","createBackgroundTask","params","task","runStreamCompletionScorers","formatStreamCompletionFeedback","resolveGoalStore","readObjective","resolveEffectiveGoalSettings","createGoalScorer","messageList","GOAL_SCORER_ID","GOAL_SCORE_WAITING","writeObjective","createProcessorSendSignal","createWorkflow","pruneAgentLoopSnapshot","runScorer","Agent","EventEmitterPubSub","CachingPubSub","InMemoryServerCache"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAeO,IAAM,kBAAA,GAAqB,CAAC,KAAA,KAA0B,CAAA,aAAA,EAAgB,KAAK,CAAA;AAK3E,IAAM,qBAAA,GAAwB;AAAA;AAAA,EAEnC,KAAA,EAAO,OAAA;AAAA;AAAA,EAEP,UAAA,EAAY,YAAA;AAAA;AAAA,EAEZ,WAAA,EAAa,aAAA;AAAA;AAAA,EAEb,MAAA,EAAQ,QAAA;AAAA;AAAA,EAER,KAAA,EAAO,OAAA;AAAA;AAAA,EAEP,SAAA,EAAW,WAAA;AAAA;AAAA,EAEX,KAAA,EAAO,OAAA;AAAA;AAAA,EAEP,kBAAA,EAAoB;AACtB;AAKO,IAAM,oBAAA,GAAuB;AAAA;AAAA,EAElC,SAAA,EAAW,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQX,qBAAA,EAAuB;AACzB;AAKO,IAAM,cAAA,GAAiB;AAAA;AAAA,EAE5B,aAAA,EAAe,uBAAA;AAAA;AAAA,EAEf,SAAA,EAAW,mBAAA;AAAA;AAAA,EAEX,WAAA,EAAa,qBAAA;AAAA;AAAA,EAEb,iBAAA,EAAmB,2BAAA;AAAA;AAAA,EAEnB,YAAA,EAAc,sBAAA;AAAA;AAAA,EAEd,gBAAA,EAAkB,0BAAA;AAAA;AAAA,EAElB,gBAAA,EAAkB;AACpB;;;ACpCA,IAAM,kBAAA,uBAAyB,GAAA,CAAI;AAAA,EACjC,2BAAA;AAAA,EACA,wBAAA;AAAA,EACA,2BAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA;AACF,CAAC,CAAA;AAED,eAAe,YAAA,CACb,OACA,aAAA,EAC2G;AAC3G,EAAA,MAAM,cAAA,GAAkB,aAAA,EAAe,cAAA,IAAiD,IAAIA,gCAAA,EAAe;AAC3G,EAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,SAAA,EAAU;AACrC,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,MAAM,mBAAA,GAAsB,cAAA,CAAe,GAAA,CAAIC,sCAAoB,CAAA;AACnE,EAAA,MAAM,qBAAA,GAAwB,cAAA,CAAe,GAAA,CAAIC,wCAAsB,CAAA;AACvE,EAAA,MAAM,gBAAA,GACJ,OAAO,aAAA,EAAe,MAAA,EAAQ,MAAA,KAAW,QAAA,GACrC,aAAA,CAAc,MAAA,CAAO,MAAA,GACpB,aAAA,EAAe,MAAA,EAAQ,MAAA,EAAwC,EAAA;AAEtE,EAAA,MAAM,WAAW,mBAAA,IAAuB,gBAAA;AACxC,EAAA,MAAM,UAAA,GAAa,qBAAA,IAA0B,aAAA,EAAe,MAAA,EAAQ,QAAA;AACpE,EAAA,MAAM,QAAA,GAAW,YAAY,UAAA,GAAa,CAAA,EAAG,YAAY,EAAE,CAAA,CAAA,EAAI,UAAA,IAAc,EAAE,CAAA,CAAA,GAAK,IAAA;AACpF,EAAA,OAAO,EAAE,QAAA,EAAU,UAAA,EAAY,QAAA,EAAS;AAC1C;AAEA,SAAS,2BAA2B,KAAA,EAA+C;AACjF,EAAA,MAAM,OAAA,GAAU,KAAA,CACb,GAAA,CAAI,CAAA,KAAA,KAAS;AACZ,IAAA,MAAM,OAAA,GAAW,KAAA,CAAgD,OAAA,IAAW,EAAC;AAC7E,IAAA,OAAO;AAAA,MACL,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,WAAA,EAAa,CAAC,CAAC,OAAA,CAAQ;AAAA,KACzB;AAAA,EACF,CAAC,CAAA,CACA,MAAA,CAAO,OAAK,CAAC,CAAC,EAAE,UAAU,CAAA;AAE7B,EAAA,MAAM,MAAA,GAAS,QACZ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,WAAW,CAAA,CAC1B,GAAA,CAAI,CAAA,CAAA,KAAM,CAAA,CAAE,WAAW,CAAA,EAAG,CAAA,CAAE,UAAU,CAAA,EAAA,EAAK,CAAA,CAAE,QAAQ,MAAM,CAAA,CAAE,UAAW,CAAA,CACxE,IAAA,CAAK,IAAI,CAAA;AAKZ,EAAA,MAAM,kBAAkB,OAAA,CACrB,MAAA,CAAO,OAAK,CAAA,CAAE,WAAW,EACzB,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,EAAG,CAAA,CAAE,UAAU,CAAA,EAAA,EAAK,CAAA,CAAE,QAAQ,CAAA,CAAA,CAAG,CAAA,CAC1C,KAAK,IAAI,CAAA;AAEZ,EAAA,OACE,CAAA,2IAAA,EACiF,MAAM,CAAA,sQAAA,EAI9B,eAAe,CAAA,8FAAA,CAAA;AAE5E;AAEA,SAAS,qBAAA,CACP,oBAAA,EACA,aAAA,EACA,KAAA,EACqB;AACrB,EAAA,MAAM,SAAA,GAAY,2BAA2B,KAAK,CAAA;AAClD,EAAA,OAAO;AAAA,IACL,GAAG,oBAAA;AAAA,IACH,OAAA,EAAS,CAAC,GAAI,aAAA,IAAiB,EAAC,EAAI,EAAE,IAAA,EAAM,MAAA,EAAiB,OAAA,EAAS,SAAA,EAAW;AAAA,GACnF;AACF;AAEA,SAAS,iBAAA,CAAkB,aAAA,EAAwC,QAAA,EAAyB,MAAA,EAA0B;AACpH,EAAA,IAAI,CAAC,QAAA,EAAU;AACf,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA;AAC7C,EAAA,UAAA,IAAa;AACb,EAAA,aAAA,CAAc,GAAA,CAAI,UAAU,MAAM,CAAA;AACpC;AAEA,SAAS,iBAAA,CAAkB,aAAA,EAAwC,QAAA,EAAyB,MAAA,EAA0B;AACpH,EAAA,IAAI,CAAC,QAAA,EAAU;AACf,EAAA,IAAI,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,KAAM,MAAA,EAAQ;AAC1C,IAAA,aAAA,CAAc,OAAO,QAAQ,CAAA;AAAA,EAC/B;AACF;AAqBA,eAAe,kBAAA,CACb,KAAA,EACA,aAAA,EACA,IAAA,EACA,SAAA,EAC2C;AAC3C,EAAA,MAAM,EAAE,SAAA,EAAW,UAAA,EAAY,GAAG,iBAAA,EAAkB,GAAI,iBAAiB,EAAC;AAE1E,EAAA,MAAM,cAAA,GAAiB,MAAM,KAAA,CAAM,iBAAA,CAAkB;AAAA,IACnD,gBAAgB,aAAA,EAAe;AAAA,GAChC,CAAA;AACD,EAAA,MAAM,aAAA,GAAgBC,2BAAA;AAAA,IACpB,cAAA;AAAA,IACC,qBAAqB;AAAC,GACzB;AAEA,EAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,CAAa,KAAA,EAAO,aAAa,CAAA;AAErD,EAAA,IAAI,CAAC,IAAA,CAAK,SAAA,IAAa,CAAC,KAAA,EAAO;AAC7B,IAAA,OAAO,UAAU,iBAAwC,CAAA;AAAA,EAC3D;AAEA,EAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAY,QAAA,EAAS,GAAI,KAAA;AAC3C,EAAA,MAAM,SAAA,GAAY,cAAc,CAAA,GAAI,GAAA;AAEpC,EAAA,MAAM,oBAAA,GAAuB;AAAA,IAC3B,GAAI,qBAAqB,EAAC;AAAA,IAC1B,QAAA,EAAU,MAAA;AAAA,IACV,eAAA,EAAiB;AAAA,GACnB;AAEA,EAAA,MAAM,iBAAA,GAAoB;AAAA,IACxB,GAAI,qBAAqB,EAAC;AAAA,IAC1B,eAAA,EAAiB;AAAA,GACnB;AAGA,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAY;AACvC,EAAA,MAAM,qBAAqD,EAAC;AAI5D,EAAA,MAAM,qBAAA,uBAA4B,GAAA,EAAY;AAC9C,EAAA,MAAM,gBAAmC,EAAC;AAI1C,EAAA,MAAM,cAAiD,EAAC;AACxD,EAAA,IAAI,YAAA,GAAe,KAAA;AACnB,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,eAAA;AACJ,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,IAAI,UAAA;AAGJ,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,IAAI,MAAA,EAAQ;AACZ,IAAA,MAAA,GAAS,IAAA;AACT,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,SAAA,GAAY,MAAA;AAAA,IACd;AACA,IAAA,UAAA,CAAW,KAAA,EAAM;AACjB,IAAA,IAAI;AACF,MAAA,eAAA,CAAgB,KAAA,EAAM;AAAA,IACxB,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,KAAA,MAAW,MAAM,aAAA,EAAe;AAC9B,MAAA,IAAI;AACF,QAAA,EAAA,EAAG;AAAA,MACL,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,iBAAA,CAAkB,IAAA,CAAK,aAAA,EAAe,QAAA,EAAU,UAAU,CAAA;AAAA,EAC5D,CAAA;AAEA,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,IAAI,MAAA,EAAQ;AACZ,IAAA,IAAI,YAAA,EAAc;AAClB,IAAA,IAAI,cAAA,CAAe,OAAO,CAAA,EAAG;AAC7B,IAAA,IAAI,kBAAA,CAAmB,SAAS,CAAA,EAAG;AACnC,IAAA,UAAA,EAAW;AAAA,EACb,CAAA;AAEA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,SAAA,GAAY,MAAA;AAAA,IACd;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,IAAI,MAAA,EAAQ;AACZ,IAAA,cAAA,EAAe;AACf,IAAA,IAAI,YAAA,EAAc;AAClB,IAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC/B,IAAA,IAAI,kBAAA,CAAmB,SAAS,CAAA,EAAG;AACnC,IAAA,SAAA,GAAY,UAAA,CAAW,YAAY,SAAS,CAAA;AAAA,EAC9C,CAAA;AAGA,EAAA,MAAM,SAAA,GAAY,OAAO,KAAA,KAA+B;AACtD,IAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU;AAC/B,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,EAAM;AACX,QAAA,IAAI,UAAA,CAAW,OAAO,OAAA,EAAS;AAC/B,QAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,QAAA,IAAI,IAAA,EAAM;AACV,QAAA,cAAA,EAAe;AACf,QAAA,IAAI;AACF,UAAA,eAAA,CAAgB,QAAQ,KAAK,CAAA;AAAA,QAC/B,CAAA,CAAA,MAAQ;AACN,UAAA;AAAA,QACF;AACA,QAAA,IAAI,SAAS,OAAO,KAAA,KAAU,QAAA,IAAa,KAAA,CAAc,SAAS,yBAAA,EAA2B;AAC3F,UAAA,MAAM,MAAA,GAAU,MAAc,OAAA,EAAS,MAAA;AACvC,UAAA,IAAI,MAAA,EAAQ,cAAA,CAAe,GAAA,CAAI,MAAM,CAAA;AAAA,QACvC;AAAA,MACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,MAAA,CAAO,WAAA,EAAY;AAAA,IACrB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,gBAAgB,YAAY;AAChC,IAAA,IAAI,YAAA,IAAgB,MAAA,IAAU,kBAAA,CAAmB,MAAA,KAAW,CAAA,EAAG;AAC/D,IAAA,YAAA,GAAe,IAAA;AACf,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,MAAA,CAAO,CAAA,EAAG,mBAAmB,MAAM,CAAA;AACpE,MAAA,KAAA,MAAW,SAAS,KAAA,EAAO;AACzB,QAAA,MAAM,GAAA,GAAO,MAA4C,OAAA,EAAS,MAAA;AAClE,QAAA,MAAM,QAAS,KAAA,CAA4B,IAAA;AAC3C,QAAA,IAAI,GAAA,IAAO,OAAO,qBAAA,CAAsB,GAAA,CAAI,GAAG,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA;AAAA,MAC/D;AACA,MAAA,MAAM,gBAAA,GAAmB,qBAAA,CAAsB,oBAAA,EAAsB,iBAAA,EAAmB,SAAkB,KAAK,CAAA;AAC/G,MAAA,MAAM,QAAQ,MAAO,KAAA,CAAc,MAAA,CAAO,IAAI,gBAAgB,CAAA;AAC9D,MAAA,aAAA,CAAc,IAAA,CAAK,MAAM,OAAO,CAAA;AAChC,MAAA,IAAI,OAAO,KAAA,CAAM,KAAA,KAAU,YAAY,WAAA,CAAY,IAAA,CAAK,MAAM,KAAK,CAAA;AACnE,MAAA,MAAM,SAAA,CAAU,MAAM,UAAU,CAAA;AAAA,IAClC,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI;AACF,QAAA,eAAA,CAAgB,MAAM,GAAG,CAAA;AAAA,MAC3B,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,UAAA,EAAW;AACX,MAAA;AAAA,IACF,CAAA,SAAE;AACA,MAAA,YAAA,GAAe,KAAA;AACf,MAAA,IAAI,kBAAA,CAAmB,SAAS,CAAA,EAAG;AACjC,QAAA,KAAK,aAAA,EAAc;AAAA,MACrB,CAAA,MAAO;AACL,QAAA,QAAA,EAAS;AACT,QAAA,eAAA,EAAgB;AAAA,MAClB;AAAA,IACF;AAAA,EACF,CAAA;AAGA,EAAA,iBAAA,CAAkB,IAAA,CAAK,aAAA,EAAe,QAAA,EAAU,UAAU,CAAA;AAE1D,EAAC,aAAA,EAAuB,WAAA,EAAa,gBAAA,CAAiB,OAAA,EAAS,UAAU,CAAA;AAEzE,EAAA,MAAM,cAAA,GAAiB,IAAI,cAAA,CAAoB;AAAA,IAC7C,MAAM,UAAA,EAAY;AAChB,MAAA,eAAA,GAAkB,UAAA;AAAA,IACpB,CAAA;AAAA,IACA,MAAA,GAAS;AACP,MAAA,MAAA,GAAS,IAAA;AACT,MAAA,UAAA,CAAW,KAAA,EAAM;AACjB,MAAA,cAAA,EAAe;AAAA,IACjB;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO;AAAA,IACrC,SAAS,KAAA,CAAM,EAAA;AAAA,IACf,QAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAa,UAAA,CAAW;AAAA,GACzB,CAAA;AACD,EAAA,MAAM,QAAA,GAAW,SAAS,SAAA,EAAU;AACpC,EAAA,KAAA,CAAM,YAAY;AAChB,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,EAAM;AACX,QAAA,IAAI,UAAA,CAAW,OAAO,OAAA,EAAS;AAC/B,QAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,SAAS,IAAA,EAAK;AAC5C,QAAA,IAAI,IAAA,EAAM;AACV,QAAA,MAAM,KAAA,GAAQ,KAAA;AACd,QAAA,IAAI,CAAC,SAAS,OAAO,KAAA,KAAU,YAAY,OAAO,KAAA,CAAM,SAAS,QAAA,EAAU;AAE3E,QAAA,MAAM,MAAA,GAAU,MAAM,OAAA,EAA6C,MAAA;AAEnE,QAAA,MAAM,WAAA,GAAc,MAAA,IAAU,kBAAA,CAAmB,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,GAAI,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,CAAA,CAAA,GAAK,MAAA;AAC/F,QAAA,IAAI,WAAA,IAAe,qBAAA,CAAsB,GAAA,CAAI,WAAW,CAAA,EAAG;AACzD,UAAA;AAAA,QACF;AAEA,QAAA,eAAA,EAAgB;AAEhB,QAAA,IAAI;AACF,UAAA,eAAA,CAAgB,QAAQ,KAAK,CAAA;AAAA,QAC/B,CAAA,CAAA,MAAQ;AACN,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,CAAC,MAAA,EAAQ;AACb,QAAA,IAAI,KAAA,CAAM,SAAS,yBAAA,EAA2B;AAC5C,UAAA,cAAA,CAAe,IAAI,MAAM,CAAA;AAAA,QAC3B,CAAA,MAAA,IAAW,kBAAA,CAAmB,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AAC7C,UAAA,cAAA,CAAe,OAAO,MAAM,CAAA;AAC5B,UAAA,kBAAA,CAAmB,KAAK,KAAK,CAAA;AAC7B,UAAA,KAAK,aAAA,EAAc;AAAA,QACrB;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER,CAAA,SAAE;AACA,MAAA,QAAA,CAAS,WAAA,EAAY;AAAA,IACvB;AAAA,EACF,CAAA,GAAG;AAGH,EAAA,YAAA,GAAe,IAAA;AACf,EAAA,cAAA,EAAe;AACf,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI;AACF,IAAA,KAAA,GAAQ,MAAM,UAAU,iBAAwC,CAAA;AAAA,EAClE,SAAS,GAAA,EAAK;AACZ,IAAA,UAAA,EAAW;AACX,IAAA,MAAM,GAAA;AAAA,EACR;AACA,EAAA,UAAA,GAAa,KAAA,CAAM,KAAA;AACnB,EAAA,aAAA,CAAc,IAAA,CAAK,MAAM,OAAO,CAAA;AAChC,EAAA,IAAI,OAAO,KAAA,CAAM,KAAA,KAAU,YAAY,WAAA,CAAY,IAAA,CAAK,MAAM,KAAK,CAAA;AAEnE,EAAA,KAAA,CAAM,YAAY;AAChB,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,CAAU,MAAM,UAAU,CAAA;AAAA,IAClC,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI;AACF,QAAA,eAAA,CAAgB,MAAM,GAAG,CAAA;AAAA,MAC3B,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,YAAA,GAAe,KAAA;AACf,IAAA,IAAI,kBAAA,CAAmB,SAAS,CAAA,EAAG;AACjC,MAAA,KAAK,aAAA,EAAc;AAAA,IACrB,CAAA,MAAO;AACL,MAAA,QAAA,EAAS;AACT,MAAA,eAAA,EAAgB;AAAA,IAClB;AAAA,EACF,CAAA,GAAG;AAEH,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,IAAI,KAAA,CAAM,KAAA,CAAM,MAAA,EAAQ;AAAA,MAC9B,GAAA,CAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,IAAI,IAAA,KAAS,cAAc,OAAO,cAAA;AAClC,QAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,MAAM,MAAM,CAAA;AAC9C,QAAA,OAAO,OAAO,KAAA,KAAU,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,GAAI,KAAA;AAAA,MAC5D;AAAA,KACD,CAAA;AAAA,IACD,IAAI,UAAA,GAAa;AACf,MAAA,OAAO,cAAA;AAAA,IACT,CAAA;AAAA,IACA,KAAA,EAAO,UAAA;AAAA,IACP,QAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA,EAAS,UAAA;AAAA,IACT,KAAA,EAAO,CAAC,MAAA,KAAqB;AAI3B,MAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,QAAA,IAAI;AACF,UAAA,UAAA,CAAW,MAAM,CAAA;AAAA,QACnB,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AACA,MAAA,UAAA,EAAW;AAAA,IACb;AAAA,GACF;AACF;AAQA,eAAsB,yBAAA,CACpB,KAAA,EACA,QAAA,EACA,aAAA,EACA,IAAA,EAC2C;AAC3C,EAAA,OAAO,kBAAA;AAAA,IACL,KAAA;AAAA,IACA,aAAA;AAAA,IACA,IAAA;AAAA,IACA,CAAA,IAAA,KAAS,KAAA,CAAc,MAAA,CAAO,QAAA,EAAU,IAAI;AAAA,GAC9C;AACF;AAUA,eAAsB,+BAAA,CACpB,KAAA,EACA,KAAA,EACA,UAAA,EACA,eACA,IAAA,EAC2C;AAC3C,EAAA,OAAO,kBAAA;AAAA,IACL,KAAA;AAAA,IACA,aAAA;AAAA,IACA,IAAA;AAAA,IACA,CAAA,IAAA,KAAS,KAAA,CAAc,MAAA,CAAO,KAAA,EAAO,YAAY,IAAI;AAAA,GACvD;AACF;;;AC3cO,SAAS,qBAAA,CAAsB,MAAc,IAAA,EAA0C;AAE5F,EAAA,IAAI,WAAA,GAA2B,EAAE,IAAA,EAAM,QAAA,EAAS;AAEhD,EAAA,IAAI,KAAK,UAAA,EAAY;AAEnB,IAAA,IAAI,UAAU,IAAA,CAAK,UAAA,IAAc,OAAO,IAAA,CAAK,UAAA,CAAW,SAAS,QAAA,EAAU;AACzE,MAAA,WAAA,GAAc,IAAA,CAAK,UAAA;AAAA,IACrB,CAAA,MAAA,IAES,YAAA,IAAgB,IAAA,CAAK,UAAA,EAAY;AACxC,MAAA,WAAA,GAAe,KAAK,UAAA,CAAmB,UAAA;AAAA,IACzC,CAAA,MAAA,IAES,MAAA,IAAU,IAAA,CAAK,UAAA,EAAY;AAGlC,MAAA,WAAA,GAAc,EAAE,MAAM,QAAA,EAAS;AAAA,IACjC;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,QAAQ,IAAA,IAAQ,OAAO,KAAK,EAAA,KAAO,QAAA,GAAW,KAAK,EAAA,GAAK,IAAA;AAAA,IAC5D,IAAA;AAAA,IACA,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,WAAA;AAAA,IACA,iBAAkB,IAAA,CAAa,eAAA;AAAA,IAC/B,kBAAmB,IAAA,CAAa;AAAA,GAClC;AACF;AAKO,SAAS,uBAAuB,KAAA,EAA6D;AAClG,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,IAAI,CAAA,KAAM,qBAAA,CAAsB,IAAA,EAAM,IAAI,CAAC,CAAA;AACtF;AAKO,SAAS,qBAAqB,KAAA,EAAqD;AACxF,EAAA,OAAO;AAAA,IACL,UAAU,KAAA,CAAM,QAAA;AAAA,IAChB,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,sBAAsB,KAAA,CAAM,oBAAA;AAAA;AAAA,IAE5B,gBAAgB,CAAA,EAAG,KAAA,CAAM,QAAQ,CAAA,CAAA,EAAI,MAAM,OAAO,CAAA;AAAA;AAAA,GAEpD;AACF;AAKO,SAAS,wBAAwB,KAAA,EAA4D;AAClG,EAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,EAAA,OAAO;AAAA,IACL,IAAI,KAAA,CAAM,EAAA;AAAA,IACV,MAAA,EAAQ;AAAA,MACN,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,sBAAsB,KAAA,CAAM,oBAAA;AAAA,MAC5B,gBAAgB,CAAA,EAAG,KAAA,CAAM,QAAQ,CAAA,CAAA,EAAI,MAAM,OAAO,CAAA,CAAA;AAAA,MAClD,iBAAiB,KAAA,CAAM;AAAA,KACzB;AAAA,IACA,YAAY,KAAA,CAAM,UAAA;AAAA,IAClB,SAAS,KAAA,CAAM;AAAA,GACjB;AACF;AAMO,SAAS,mBAAmB,MAAA,EAAiE;AAClG,EAAA,OAAO,MAAA,CAAO,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,YAAY,KAAK,CAAA,CAAE,IAAI,uBAAuB,CAAA;AAC5E;AAWO,SAAS,uBACd,OAAA,EAI2B;AAC3B,EAAA,MAAM,SAAoC,EAAC;AAE3C,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAElD,IAAA,MAAM,UAAA,GAAa,OAAO,KAAA,CAAM,MAAA,KAAW,WAAW,KAAA,CAAM,MAAA,GAAS,MAAM,MAAA,CAAO,IAAA;AAElF,IAAA,MAAM,WAAA,GAAuC;AAAA,MAC3C;AAAA,KACF;AAGA,IAAA,IAAI,MAAM,QAAA,EAAU;AAClB,MAAA,WAAA,CAAY,WAAW,KAAA,CAAM,QAAA;AAAA,IAC/B;AAEA,IAAA,MAAA,CAAO,GAAG,CAAA,GAAI,WAAA;AAAA,EAChB;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,sBAAsB,MAAA,EAOT;AAC3B,EAAA,OAAO;AAAA,IACL,cAAc,MAAA,CAAO,YAAA;AAAA,IACrB,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,cAAc,MAAA,CAAO,YAAA;AAAA,IACrB,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,qBAAqB,MAAA,CAAO;AAAA,GAC9B;AACF;AAQO,SAAS,uBACd,QAAA,EACuC;AACvC,EAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,KAAa,UAAU,OAAO,MAAA;AAEtD,EAAA,MAAM,MAAA,GAAS,QAAA;AACf,EAAA,MAAM,MAAiC,EAAC;AACxC,EAAA,MAAM,UAAA,GAAa,CAAC,GAAA,KAAyC;AAC3D,IAAA,MAAM,KAAA,GAAQ,OAAO,GAAa,CAAA;AAClC,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AACvD,MAAC,GAAA,CAAgC,GAAa,CAAA,GAAI,KAAA;AAAA,IACpD;AAAA,EACF,CAAA;AAEA,EAAA,UAAA,CAAW,iBAAiB,CAAA;AAC5B,EAAA,UAAA,CAAW,aAAa,CAAA;AACxB,EAAA,UAAA,CAAW,MAAM,CAAA;AACjB,EAAA,UAAA,CAAW,MAAM,CAAA;AACjB,EAAA,UAAA,CAAW,iBAAiB,CAAA;AAC5B,EAAA,UAAA,CAAW,kBAAkB,CAAA;AAC7B,EAAA,UAAA,CAAW,MAAM,CAAA;AACjB,EAAA,UAAA,CAAW,YAAY,CAAA;AAEvB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,aAAa,CAAA,IAAK,MAAA,CAAO,aAAA,CAAc,KAAA,CAAM,CAAA,CAAA,KAAK,OAAO,CAAA,KAAM,QAAQ,CAAA,EAAG;AACjG,IAAA,GAAA,CAAI,gBAAgB,MAAA,CAAO,aAAA;AAAA,EAC7B;AAUA,EAAA,OAAO,OAAO,IAAA,CAAK,GAAG,CAAA,CAAE,MAAA,GAAS,IAAI,GAAA,GAAM,MAAA;AAC7C;AAKO,SAAS,wBAAwB,OAAA,EAsBT;AAE7B,EAAA,IAAI,oBAAA;AACJ,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,IAAI,OAAO,OAAA,CAAQ,UAAA,KAAe,QAAA,EAAU;AAC1C,MAAA,oBAAA,GAAuB,OAAA,CAAQ,UAAA;AAAA,IACjC,WAAW,OAAO,OAAA,CAAQ,eAAe,QAAA,IAAY,MAAA,IAAU,QAAQ,UAAA,EAAY;AACjF,MAAA,IAAI,QAAQ,UAAA,CAAW,IAAA,KAAS,MAAA,IAAU,UAAA,IAAc,QAAQ,UAAA,EAAY;AAC1E,QAAA,oBAAA,GAAuB;AAAA,UACrB,IAAA,EAAM,MAAA;AAAA,UACN,QAAA,EAAU,QAAQ,UAAA,CAAW;AAAA,SAC/B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,UAAA,EAAY,oBAAA;AAAA,IACZ,aAAa,OAAA,CAAQ,WAAA;AAAA,IACrB,aAAA,EAAe,sBAAA,CAAuB,OAAA,CAAQ,aAAa,CAAA;AAAA,IAC3D,qBAAqB,OAAA,CAAQ,mBAAA;AAAA,IAC7B,qBAAqB,OAAA,CAAQ,mBAAA;AAAA,IAC7B,0BAA0B,OAAA,CAAQ,wBAAA;AAAA,IAClC,qBAAqB,OAAA,CAAQ,mBAAA;AAAA,IAC7B,kBAAkB,OAAA,CAAQ,gBAAA;AAAA,IAC1B,kBAAkB,OAAA,CAAQ,gBAAA;AAAA,IAC1B,oBAAoB,OAAA,CAAQ,kBAAA;AAAA,IAC5B,iBAAiB,OAAA,CAAQ,eAAA;AAAA,IACzB,kBAAkB,OAAA,CAAQ,gBAAA;AAAA,IAC1B,gBAAgB,OAAA,CAAQ,cAAA;AAAA,IACxB,wBAAwB,OAAA,CAAQ,sBAAA;AAAA,IAChC,gBAAgB,OAAA,CAAQ,cAAA;AAAA,IACxB,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,sBAAsB,OAAA,CAAQ,oBAAA;AAAA,IAC9B,eAAe,OAAA,CAAQ,aAAA;AAAA,IACvB,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,gBAAgB,OAAA,CAAQ;AAAA,GAC1B;AACF;AAKO,SAAS,oBAAoB,MAAA,EAeJ;AAC9B,EAAA,OAAO;AAAA,IACL,cAAA,EAAgB,eAAA;AAAA,IAChB,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,gBAAA,EAAkB,MAAA,CAAO,WAAA,CAAY,SAAA,EAAU;AAAA,IAC/C,aAAA,EAAe,sBAAA,CAAuB,MAAA,CAAO,KAAK,CAAA;AAAA,IAClD,WAAA,EAAa,oBAAA,CAAqB,MAAA,CAAO,KAAK,CAAA;AAAA,IAC9C,WAAW,MAAA,CAAO,SAAA,GAAY,kBAAA,CAAmB,MAAA,CAAO,SAAS,CAAA,GAAI,MAAA;AAAA,IACrE,SAAS,MAAA,CAAO,OAAA,GAAU,sBAAA,CAAuB,MAAA,CAAO,OAAO,CAAA,GAAI,MAAA;AAAA,IACnE,OAAA,EAAS,uBAAA,CAAwB,MAAA,CAAO,OAAO,CAAA;AAAA,IAC/C,KAAA,EAAO,qBAAA,CAAsB,MAAA,CAAO,KAAK,CAAA;AAAA,IACzC,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,eAAe,MAAA,CAAO,aAAA;AAAA,IACtB,eAAe,MAAA,CAAO,aAAA;AAAA,IACtB,uBAAuB,MAAA,CAAO;AAAA,GAChC;AACF;AAKO,SAAS,eAAe,KAAA,EAAmE;AAChG,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,OAAO;AAAA,MACL,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,OAAO,KAAA,CAAM;AAAA,KACf;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,OAAA;AAAA,IACN,OAAA,EAAS,OAAO,KAAK;AAAA,GACvB;AACF;;;ACxRA,SAAS,8BACP,cAAA,EACqC;AACrC,EAAA,IAAI,CAAC,gBAAgB,OAAO,MAAA;AAC5B,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,IAAI,GAAA,GAAM,KAAA;AACV,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,cAAA,CAAe,SAAQ,EAAG;AACnD,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAC/C,MAAA,GAAA,CAAI,GAAa,CAAA,GAAI,MAAA;AACrB,MAAA,GAAA,GAAM,IAAA;AAAA,IACR,CAAA,CAAA,MAAQ;AAAA,IAGR;AAAA,EACF;AACA,EAAA,OAAO,MAAM,GAAA,GAAM,MAAA;AACrB;AAOA,SAAS,4BAA4B,YAAA,EAAqD;AACxF,EAAA,IAAI,CAAC,cAAc,OAAO,EAAA;AAC1B,EAAA,IAAI,OAAO,YAAA,KAAiB,QAAA,EAAU,OAAO,YAAA;AAC7C,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,EAAG;AAC/B,IAAA,OAAO,aACJ,GAAA,CAAI,CAAA,GAAA,KAAQ,OAAO,GAAA,KAAQ,QAAA,GAAW,MAAM,OAAO,GAAA,CAAI,YAAY,QAAA,GAAW,GAAA,CAAI,UAAU,EAAG,CAAA,CAC/F,OAAO,OAAO,CAAA,CACd,KAAK,MAAM,CAAA;AAAA,EAChB;AACA,EAAA,OAAO,OAAO,YAAA,CAAa,OAAA,KAAY,QAAA,GAAW,aAAa,OAAA,GAAU,EAAA;AAC3E;AAOA,SAAS,uBAAuB,WAAA,EAAgD;AAC9E,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,wBAAA,EAAyB,CAAE,KAAA;AAC/D,EAAA,OAAO,YAAY,GAAA,CAAI,GAAA,CACpB,EAAA,EAAG,CACH,OAAO,CAAA,OAAA,KAAW,OAAA,CAAQ,IAAA,KAAS,QAAA,IAAY,gBAAgB,GAAA,CAAI,OAAA,CAAQ,EAAE,CAAC,CAAA,CAC9E,IAAIC,yCAAuB,CAAA;AAChC;AAkGA,eAAsB,2BACpB,OAAA,EACoC;AACpC,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA,EAAS,cAAA;AAAA,IACT,KAAA,EAAO,aAAA;AAAA,IACP,cAAA,EAAgB,sBAAA;AAAA,IAChB,MAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA,GAAa;AAAA,GACf,GAAI,OAAA;AAEJ,EAAA,MAAM,UAAA,GAAa,KAAA;AAGnB,EAAA,MAAM,KAAA,GAAQ,aAAA,IAAiB,MAAA,CAAO,UAAA,EAAW;AACjD,EAAA,MAAM,SAAA,GAAY,OAAO,UAAA,EAAW;AAGpC,EAAA,MAAM,cAAA,GAAiB,sBAAA,IAA0B,IAAIJ,gCAAA,EAAe;AAMpE,EAAA,MAAM,6BAAA,GAAgC,8BAA8B,cAAc,CAAA;AAMlF,EAAA,MAAM,iBAAiB,MAAM,UAAA,CAAW,iBAAA,CAAkB,EAAE,gBAAgB,CAAA;AAC5E,EAAA,MAAM,WAAA,GAAcG,2BAAA;AAAA,IACjB,kBAAkB,EAAC;AAAA,IACnB,kBAAkB;AAAC,GACtB;AAGA,EAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,GAAA,CAAIE,qCAAmB,CAAA;AAC9D,EAAA,IAAI,cAAA,GAAiBC,uCAAA,CAAsB,MAAA,EAAQ,mBAAA,MAAyB,eAAe,CAAA;AAC3F,EAAA,IAAK,aAAqB,QAAA,EAAU;AAClC,IAAA,cAAA,GAAiBA,uCAAA,CAAsB,cAAA,EAAiB,WAAA,CAAoB,QAAQ,CAAA;AAAA,EACtF;AACA,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,cAAA,CAAe,GAAA,CAAID,uCAAqB,cAAc,CAAA;AAAA,EACxD;AAGA,EAAA,MAAM,MAAA,GACJ,OAAO,WAAA,EAAa,MAAA,EAAQ,MAAA,KAAW,QAAA,GAAW,EAAE,EAAA,EAAI,WAAA,CAAY,MAAA,CAAO,MAAA,EAAO,GAAI,aAAa,MAAA,EAAQ,MAAA;AAC7G,EAAA,MAAM,WAAW,MAAA,EAAQ,EAAA;AACzB,EAAA,MAAM,UAAA,GAAa,aAAa,MAAA,EAAQ,QAAA;AACxC,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI,YAAA,GAAe,KAAA;AAGnB,EAAA,MAAM,WAAA,GAAc,IAAIE,6BAAA,CAAY;AAAA,IAClC,QAAA;AAAA,IACA;AAAA,GACD,CAAA;AAID,EAAA,MAAM,YAAA,GAAe,aAAa,YAAA,IAAiB,MAAM,WAAW,eAAA,CAAgB,EAAE,gBAAgB,CAAA;AACtG,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,IAAI,OAAO,iBAAiB,QAAA,EAAU;AACpC,MAAA,WAAA,CAAY,UAAU,YAAY,CAAA;AAAA,IACpC,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,EAAG;AACtC,MAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,QAAA,WAAA,CAAY,UAAU,IAAI,CAAA;AAAA,MAC5B;AAAA,IACF,CAAA,MAAO;AACL,MAAA,WAAA,CAAY,UAAU,YAAY,CAAA;AAAA,IACpC;AAAA,EACF;AACA,EAAA,MAAM,YAAY,MAAM,UAAA,CAAW,YAAA,CAAa,EAAE,gBAAgB,CAAA;AAKlE,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAM,KAAA,GACJ,OAAO,SAAA,CAAU,mBAAA,KAAwB,UAAA,GAAa,UAAU,mBAAA,EAAoB,GAAI,CAAC,CAAC,SAAA,CAAU,UAAA;AACtG,IAAA,MAAM,KAAA,GAAQ,OAAO,SAAA,CAAU,gBAAA,KAAqB,UAAA,GAAa,UAAU,gBAAA,EAAiB,GAAI,CAAC,CAAC,SAAA,CAAU,OAAA;AAC5G,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,MAAM,iBACJ,OAAO,SAAA,CAAU,oBAAA,KAAyB,UAAA,GACtC,MAAM,SAAA,CAAU,oBAAA,CAAqB,EAAE,cAAA,EAAgB,CAAA,GACvD,SAAA,CAAU,eAAA,CAAgB,EAAE,gBAAgB,CAAA;AAClD,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,WAAA,CAAY,UAAU,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,gBAAgB,CAAA;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,aAAa,OAAA,EAAS;AACxB,IAAA,WAAA,CAAY,GAAA,CAAI,WAAA,CAAY,OAAA,EAAS,SAAS,CAAA;AAAA,EAChD;AAIA,EAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,IAAA,MAAM,MAAM,WAAA,CAAY,MAAA;AACxB,IAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,MAAA,WAAA,CAAY,UAAU,GAAG,CAAA;AAAA,IAC3B,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC7B,MAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,QAAA,WAAA,CAAY,UAAU,CAAC,CAAA;AAAA,MACzB;AAAA,IACF,CAAA,MAAO;AACL,MAAA,WAAA,CAAY,UAAU,GAAG,CAAA;AAAA,IAC3B;AAAA,EACF;AAGA,EAAA,WAAA,CAAY,GAAA,CAAI,UAAU,OAAO,CAAA;AAajC,EAAA,MAAM,SAAS,MAAM,UAAA,CAAW,SAAA,CAAU,EAAE,gBAAgB,CAAA;AAC5D,EAAA,MAAM,YAAA,GAAe,aAAa,MAAA,EAAQ,OAAA;AAC1C,EAAA,IAAI,MAAA,IAAU,YAAY,UAAA,EAAY;AACpC,IAAA,MAAM,iBAAiB,MAAM,MAAA,CAAO,aAAA,CAAc,EAAE,UAAU,CAAA;AAC9D,IAAA,YAAA,GACE,cAAA,IACC,MAAM,MAAA,CAAO,YAAA,CAAa;AAAA,MACzB,QAAA;AAAA,MACA,UAAU,MAAA,EAAQ,QAAA;AAAA,MAClB,OAAO,MAAA,EAAQ,KAAA;AAAA,MACf,YAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA,EAAY;AAAA,KACb,CAAA;AACH,IAAA,YAAA,GAAe,IAAA;AACf,IAAA,cAAA,CAAe,IAAI,cAAA,EAAgB,EAAE,QAAQ,YAAA,EAAc,UAAA,EAAY,cAAc,CAAA;AAAA,EACvF,CAAA,MAAO;AAOL,IAAA,cAAA,CAAe,OAAO,cAAc,CAAA;AAAA,EACtC;AAGA,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAA4B;AACxD,EAAA,IAAI,kBAA8C,EAAC;AACnD,EAAA,IAAI,4BAAwD,EAAC;AAC7D,EAAA,IAAI,mBAAgD,EAAC;AACrD,EAAA,IAAI,kBAA8C,EAAC;AAEnD,EAAA,IAAI;AACF,IAAA,eAAA,GAAkB,MAAM,UAAA,CAAW,mBAAA,CAAoB,cAAc,CAAA;AAGrE,IAAA,yBAAA,GAA4B,MAAM,UAAA,CAAW,0BAAA,CAA2B,cAAc,CAAA;AAGtF,IAAA,gBAAA,GAAmB,aAAa,gBAAA,GAC5B,WAAA,CAAY,mBACZ,MAAM,UAAA,CAAW,qBAAqB,cAAc,CAAA;AACxD,IAAA,eAAA,GAAkB,MAAM,UAAA,CAAW,mBAAA,CAAoB,cAAc,CAAA;AAAA,EACvE,SAAS,KAAA,EAAO;AACd,IAAA,MAAA,EAAQ,IAAA,GAAO,CAAA,2CAAA,EAA8C,KAAK,CAAA,CAAE,CAAA;AAAA,EACtE;AASA,EAAA,MAAM,YAAY,OAAQ,KAAA,CAAc,gBAAgB,UAAA,GAAc,KAAA,CAAc,aAAY,GAAI,MAAA;AACpG,EAAA,MAAM,oBAAoB,SAAA,EAAW,iBAAA;AACrC,EAAA,MAAM,qBACJ,OAAQ,KAAA,CAAc,qBAAqB,UAAA,GAAc,KAAA,CAAc,kBAAiB,GAAI,MAAA;AAC9F,EAAA,MAAM,YAAYC,iCAAA,CAAgB;AAAA,IAChC,IAAA,EAAA,WAAA;AAAA,IACA,IAAA,EAAM,CAAA,YAAA,EAAe,KAAA,CAAM,EAAE,CAAA,CAAA,CAAA;AAAA,IAC7B,YAAYC,4BAAA,CAAW,KAAA;AAAA,IACvB,UAAU,KAAA,CAAM,EAAA;AAAA,IAChB,YAAY,KAAA,CAAM,IAAA;AAAA,IAClB,KAAA,EAAO,QAAA;AAAA,IACP,UAAA,EAAY;AAAA,MACV,cAAA,EAAgB,QAAA;AAAA,MAChB,YAAA,EAAc,4BAA4B,YAAY,CAAA;AAAA;AAAA;AAAA,MAGtD,GAAI,iBAAA,GAAoB,EAAE,iBAAA,KAAsB;AAAC,KACnD;AAAA,IACA,QAAA,EAAU;AAAA,MACR,KAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,GAAI,iBAAA,GAAoB,EAAE,eAAA,EAAiB,iBAAA,KAAsB;AAAC,KACpE;AAAA,IACA,aAAA,EAAe,kBAAA;AAAA,IACf,gBAAgB,WAAA,EAAa,cAAA;AAAA,IAC7B,gBAAgB,WAAA,EAAa,cAAA;AAAA,IAC7B,cAAA;AAAA,IACA;AAAA,GACD,CAAA;AAMD,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,eAAA,EAAAC,gBAAAA,EAAgB,GAAI,MAAM,OAAO,2BAAyB,CAAA;AAClE,MAAA,MAAM,MAAA,GAAS,IAAIA,gBAAAA,CAAgB;AAAA,QACjC,eAAA;AAAA,QACA,gBAAA;AAAA,QACA,eAAA;AAAA,QACA,MAAA;AAAA,QACA,WAAW,KAAA,CAAM,IAAA;AAAA,QACjB;AAAA,OACD,CAAA;AACD,MAAA,MAAM,MAAA,CAAO,kBAAA;AAAA,QACX,WAAA;AAAA,QACAC,4CAAA,CAA2B,EAAE,WAAA,EAAa,SAAA,EAAW,CAAA;AAAA,QACrD,cAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiBC,0BAAA,EAAU;AAC7B,QAAA,YAAA,GAAe;AAAA,UACb,QAAQ,KAAA,CAAM,OAAA;AAAA,UACd,KAAA,EAAO,MAAM,OAAA,EAAS,KAAA;AAAA,UACtB,QAAA,EAAU,MAAM,OAAA,EAAS,QAAA;AAAA,UACzB,aAAa,KAAA,CAAM;AAAA,SACrB;AACA,QAAA,MAAA,EAAQ,OAAO,oCAAA,EAAsC;AAAA,UACnD,OAAO,KAAA,CAAM,IAAA;AAAA,UACb,QAAQ,KAAA,CAAM,OAAA;AAAA,UACd,aAAa,KAAA,CAAM,WAAA;AAAA,UACnB,KAAA,EAAO,MAAM,OAAA,EAAS;AAAA,SACvB,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,MAAA,EAAQ,IAAA,GAAO,CAAA,+CAAA,EAAkD,KAAK,CAAA,CAAE,CAAA;AAAA,MAC1E;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,QAAkC,EAAC;AACvC,EAAA,IAAI;AACF,IAAA,KAAA,GAAQ,MAAM,WAAW,oBAAA,CAAqB;AAAA,MAC5C,UAAU,WAAA,EAAa,QAAA;AAAA,MACvB,aAAa,WAAA,EAAa,WAAA;AAAA,MAC1B,QAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA;AAAA,MACA,cAAA;AAAA,MACA,YAAA,EAAc,aAAa,MAAA,EAAQ,OAAA;AAAA,MACnC,0BAA0B,WAAA,EAAa,wBAAA;AAAA,MACvC,OAAO,WAAA,EAAa,KAAA;AAAA,MACpB,YAAY,WAAA,EAAa,UAAA;AAAA,MACzB;AAAA,KACD,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,MAAA,EAAQ,IAAA,GAAO,CAAA,uCAAA,EAA0C,KAAK,CAAA,CAAE,CAAA;AAAA,EAClE;AAGA,EAAA,MAAM,QAAQ,MAAM,UAAA,CAAW,QAAA,CAAS,EAAE,gBAAgB,CAAA;AAC1D,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAAA,EAC7C;AAEA,EAAA,MAAM,SAAA,GAAY,MAAM,UAAA,CAAW,YAAA,CAAa,cAAc,CAAA;AAG9D,EAAA,MAAM,kBAAmB,WAAA,EAAqB,OAAA;AAC9C,EAAA,IAAI,OAAA;AAEJ,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,OAAA,GAAU,eAAA;AAAA,EACZ,CAAA,MAAO;AACL,IAAA,IAAI;AACF,MAAA,MAAM,eAAe,MAAM,UAAA,CAAW,WAAA,CAAY,EAAE,gBAAgB,CAAA;AACpE,MAAA,IAAI,gBAAgB,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAAE,SAAS,CAAA,EAAG;AACxD,QAAA,OAAA,GAAU,YAAA;AAAA,MACZ;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,EAAQ,KAAA,GAAQ,CAAA,sCAAA,EAAyC,KAAK,CAAA,CAAE,CAAA;AAAA,IAClE;AAAA,EACF;AAGA,EAAA,MAAM,gBAAA,GAAmB,MAAA,GACrB,IAAIC,kCAAA,CAAiB;AAAA,IACnB,MAAA;AAAA,IACA;AAAA,GACD,CAAA,GACD,MAAA;AAGJ,EAAA,IAAI,0BAAA;AACJ,EAAA,IAAI,aAAa,gBAAA,EAAkB;AACjC,IAAA,MAAM,KAAK,WAAA,CAAY,gBAAA;AACvB,IAAA,IAAI,GAAG,MAAA,EAAQ;AACb,MAAA,0BAAA,GAA6B;AAAA,QAC3B,qBAAqB,EAAA,CAAG,mBAAA;AAAA,QACxB,UAAU,EAAA,CAAG;AAAA,OACf;AAEA,MAAA,IAAI,OAAO,EAAA,CAAG,MAAA,KAAW,QAAA,IAAY,MAAA,IAAU,GAAG,MAAA,EAAQ;AACxD,QAAA,0BAAA,CAA2B,SAAS,EAAA,CAAG,MAAA;AAAA,MACzC,WAAW,OAAO,EAAA,CAAG,WAAW,QAAA,IAAY,YAAA,IAAgB,GAAG,MAAA,EAAQ;AACrE,QAAA,0BAAA,CAA2B,MAAA,GAAS,GAAG,MAAA,CAAO,UAAA;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAKA,EAAA,MAAM,qBAAA,GAAwB,WAAW,wBAAA,IAA2B;AACpE,EAAA,MAAM,qBAAA,GAAwB,WAAA,EAAa,sBAAA,GAAyB,MAAA,GAAY,MAAA,EAAQ,qBAAA;AAMxF,EAAA,MAAM,uBACJC,qDAAA,CAAoC,WAAA,EAAa,SAAS,CAAA,IAC1D,UAAA,CAAW,2BAA0B,IACrCA,qDAAA;AAAA,IACE,MAAA,EAAQ,uBAAA,IAA0B,IAAM,MAAA,EAAgB,wBAAA;AAA2B,GACrF;AAGF,EAAA,MAAM,cAAc,WAAA,EAAa,WAAA;AACjC,EAAA,MAAM,mBAAA,GAAsB,CAAC,CAAC,YAAA,EAAc,mBAAA;AAK5C,EAAA,MAAM,SAAA,GAAY,WAAW,eAAA,CAAgB;AAAA,IAC3C,IAAA,EAAA,kBAAA;AAAA,IACA,IAAA,EAAM,CAAA,MAAA,EAAS,KAAA,CAAM,OAAO,CAAA,CAAA,CAAA;AAAA,IAC5B,UAAA,EAAY;AAAA,MACV,OAAO,KAAA,CAAM,OAAA;AAAA,MACb,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,SAAA,EAAW;AAAA,KACb;AAAA,IACA,QAAA,EAAU;AAAA,MACR,KAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,gBAAgB,mBAAA,CAAoB;AAAA,IACxC,KAAA;AAAA,IACA,SAAS,KAAA,CAAM,EAAA;AAAA,IACf,WAAW,KAAA,CAAM,IAAA;AAAA,IACjB,WAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAW,SAAA,IAAa,MAAA;AAAA,IACxB,OAAA;AAAA,IACA,OAAA,EAAS;AAAA,MACP,UAAU,WAAA,EAAa,QAAA;AAAA,MACvB,YAAY,WAAA,EAAa,UAAA;AAAA,MACzB,aAAa,WAAA,EAAa,WAAA;AAAA,MAC1B,eAAe,WAAA,EAAa,aAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAO5B,qBACE,OAAO,WAAA,EAAa,mBAAA,KAAwB,UAAA,GAAa,OAAO,WAAA,EAAa,mBAAA;AAAA,MAC/E,qBAAqB,WAAA,EAAa,mBAAA;AAAA,MAClC,0BAA0B,WAAA,EAAa,wBAAA;AAAA,MACvC,qBAAqB,WAAA,EAAa,mBAAA;AAAA,MAClC,kBAAkB,WAAA,EAAa,gBAAA;AAAA,MAC/B,kBAAmB,WAAA,EAAqB,gBAAA;AAAA,MACxC,kBAAA,EAAoB,gBAAgB,MAAA,GAAS,CAAA;AAAA,MAC7C,iBAAiB,WAAA,EAAa,eAAA;AAAA,MAC9B,gBAAA,EAAkB,0BAAA;AAAA,MAClB,gBAAiB,WAAA,EAAqB,eAAA;AAAA,MACtC,wBAAwB,WAAA,EAAa,sBAAA;AAAA,MACrC,gBAAgB,WAAA,EAAa,cAAA;AAAA,MAC7B,OAAO,WAAA,EAAa,KAAA;AAAA,MACpB,sBAAsB,WAAA,EAAa,YAAA;AAAA,MACnC,eAAe,WAAA,EAAa,MAAA;AAAA,MAC5B,WAAW,oBAAA,EAAsB,OAAA,GAAU,EAAE,OAAA,EAAS,oBAAA,CAAqB,SAAQ,GAAI,MAAA;AAAA,MACvF,cAAA,EAAgB,aAAa,cAAA,GACzB;AAAA,QACE,WAAA,EAAa,WAAA,CAAY,cAAA,CAAe,OAAA,EAAS,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAmB,CAAC,CAAC,CAAC,CAAA;AAAA,QAChG,QAAA,EAAU,YAAY,cAAA,CAAe,QAAA;AAAA,QACrC,OAAA,EAAS,YAAY,cAAA,CAAe,OAAA;AAAA,QACpC,QAAA,EAAU,YAAY,cAAA,CAAe,QAAA;AAAA,QACrC,gBAAA,EAAkB,YAAY,cAAA,CAAe;AAAA,OAC/C,GACA;AAAA,KACN;AAAA,IACA,KAAA,EAAO;AAAA,MACL,YAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA,YAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,SAAA;AAAA,IACA,aAAA,EAAe,WAAW,UAAA,EAAW;AAAA,IACrC,aAAA,EAAe,WAAW,UAAA,EAAW;AAAA,IACrC,qBAAA,EAAuB;AAAA,GACxB,CAAA;AAGD,EAAA,MAAM,aAAA,GAAkC;AAAA,IACtC,KAAA;AAAA,IACA,gBAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA,EAAW,SAAA,GACP,SAAA,CAAU,GAAA,CAAI,CAAC,KAAA,MAAoC;AAAA,MACjD,IAAI,KAAA,CAAM,EAAA;AAAA,MACV,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,UAAA,EAAY,MAAM,UAAA,IAAc,CAAA;AAAA,MAChC,OAAA,EAAS,MAAM,OAAA,IAAW,IAAA;AAAA,MAC1B,SAAS,KAAA,CAAM;AAAA,MACf,CAAA,GACF,MAAA;AAAA,IACJ,SAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAA;AAAA,IACA,yBAAA;AAAA,IACA,gBAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,qBAAA;AAAA,IACA,qBAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,UAAU,WAAA,EAAa,QAAA;AAAA,IACvB,qBAAqB,WAAA,EAAa,mBAAA;AAAA,IAClC,aAAa,WAAA,EAAa,WAAA;AAAA,IAC1B,oBAAA;AAAA,IACA,gBAAgB,WAAA,EAAa,cAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAK7B,qBAAqB,WAAA,EAAa,mBAAA;AAAA;AAAA;AAAA,IAGlC,qBAAqB,CAAA,KAAA,KAAS,UAAA,CAAW,wBAAA,EAAyB,CAAE,OAAO,KAAK,CAAA;AAAA;AAAA;AAAA;AAAA,IAIhF,mBAAA,EAAqB,uBAAuB,WAAW,CAAA;AAAA;AAAA;AAAA,IAGvD,IAAA,EAAM,MAAM,eAAA,EAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,IAK5B,QAAA,EAAU,YAAA;AAAA;AAAA;AAAA;AAAA,IAIV,eAAA,EAAiB,sBAAA,CAAuB,WAAA,EAAa,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOlE,gBAAA,EAAkB,WAAA,EAAa,gBAAA,EAAkB,MAAA,GAC7C;AAAA,MACE,GAAG,WAAA,CAAY,gBAAA;AAAA,MACf,MAAA,EAAQC,kCAAA,CAAiB,WAAA,CAAY,gBAAA,CAAiB,MAAM;AAAA,KAC9D,GACA,MAAA;AAAA,IACJ,SAAS,MAAM;AAAA,IAAC;AAAA,GAClB;AAEA,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACF;AAOA,SAAS,uBACP,aAAA,EACoC;AACpC,EAAA,MAAM,MAAO,aAAA,EAAuD,OAAA;AACpE,EAAA,IAAI,CAAC,OAAO,OAAO,GAAA,KAAQ,YAAY,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG,OAAO,MAAA;AAElE,EAAA,MAAM,UAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAA8B,CAAA,EAAG;AACzE,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAA,CAAQ,GAAG,CAAA,GAAI,KAAA;AAAA,EAChD;AACA,EAAA,OAAO,OAAO,IAAA,CAAK,OAAO,CAAA,CAAE,MAAA,GAAS,IAAI,OAAA,GAAU,MAAA;AACrD;AC7rBO,IAAM,iBAAA,GAAoB,IAAIC,iBAAA,CAAmC;AAAA,EACtE,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,KAAK,EAAA,GAAK,GAAA;AAAA,EACf,cAAA,EAAgB,IAAA;AAAA,EAChB,SAAS,CAAA,KAAA,KAAS;AAChB,IAAA,KAAA,EAAO,OAAA,IAAU;AAAA,EACnB,CAAA;AAAA,EACA,cAAA,EAAgB;AAClB,CAAC;AAQM,SAAS,oBAAA,CAAqB,OAAe,KAAA,EAAoB;AACtE,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA;AACzC,IAAA,CAAC,KAAA,EAAO,mBAAmB,KAAA,EAAO,SAAA,GAAY,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,CAAA;AAC5E,IAAA,CAAC,KAAA,EAAO,mBAAmB,KAAA,EAAO,SAAA,GAAY,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,EAC9E,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAaO,IAAM,cAAN,MAAkB;AAAA,EACvB,QAAA,uBAAe,GAAA,EAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO7C,QAAA,CAAS,OAAe,KAAA,EAA+B;AAErD,IAAA,IAAA,CAAK,QAAQ,KAAK,CAAA;AAClB,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAA,EAAO,KAAK,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,KAAA,EAA6C;AAC/C,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,KAAA,EAAyC;AAChD,IAAA,OAAO,KAAK,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA,EAAG,SAAS,EAAC;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,oBAAoB,KAAA,EAA6C;AAC/D,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA,EAAG,gBAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,KAAA,EAAgD;AACvD,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA,EAAG,KAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,KAAA,EAAwB;AAC1B,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,KAAA,EAAqB;AAC3B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AACrC,IAAA,IAAI,KAAA,EAAO;AAET,MAAA,KAAA,CAAM,OAAA,IAAU;AAChB,MAAA,IAAA,CAAK,QAAA,CAAS,OAAO,KAAK,CAAA;AAAA,IAC5B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,KAAK,QAAA,CAAS,IAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAA,GAAmB;AACrB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAA,GAAc;AACZ,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,QAAA,CAAS,IAAA,EAAK,EAAG;AACxC,MAAA,IAAA,CAAK,QAAQ,KAAK,CAAA;AAAA,IACpB;AAAA,EACF;AACF;AAmBO,IAAM,mBAAA,GAAN,cAAkC,WAAA,CAAY;AAAA,EACnD,aAAA,uBAAoB,GAAA,EAAyB;AAAA,EAC7C,WAAA,uBAAkB,GAAA,EAAwD;AAAA;AAAA;AAAA;AAAA,EAK1E,uBAAA,CACE,KAAA,EACA,KAAA,EACA,WAAA,EACA,UAAA,EACM;AACN,IAAA,IAAA,CAAK,QAAA,CAAS,OAAO,KAAK,CAAA;AAC1B,IAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAA,EAAO,WAAW,CAAA;AACzC,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAA,EAAO,UAAU,CAAA;AAAA,IACxC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,KAAA,EAAwC;AACrD,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,KAAA,EAAuE;AACnF,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKS,QAAQ,KAAA,EAAqB;AACpC,IAAA,KAAA,CAAM,QAAQ,KAAK,CAAA;AACnB,IAAA,IAAA,CAAK,aAAA,CAAc,OAAO,KAAK,CAAA;AAC/B,IAAA,IAAA,CAAK,WAAA,CAAY,OAAO,KAAK,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKS,KAAA,GAAc;AACrB,IAAA,KAAA,CAAM,KAAA,EAAM;AACZ,IAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AACzB,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,EACzB;AACF;AC7LA,SAAS,eAAe,GAAA,EAAmD;AACzE,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,OAAO,EAAE,WAAA,EAAa,CAAA,EAAG,YAAA,EAAc,CAAA,EAAG,aAAa,CAAA,EAAE;AAAA,EAC3D;AACA,EAAA,MAAM,WAAA,GAAe,GAAA,CAAI,WAAA,IAA2B,GAAA,CAAI,YAAA,IAA2B,CAAA;AACnF,EAAA,MAAM,YAAA,GAAgB,GAAA,CAAI,YAAA,IAA4B,GAAA,CAAI,gBAAA,IAA+B,CAAA;AACzF,EAAA,MAAM,WAAA,GAAe,GAAA,CAAI,WAAA,IAA0B,WAAA,GAAc,YAAA;AACjE,EAAA,OAAO,EAAE,WAAA,EAAa,YAAA,EAAc,WAAA,EAAY;AAClD;AAwFO,SAAS,yBACd,OAAA,EACkC;AAClC,EAAA,MAAM;AAAA,IACJ,MAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA;AAAA,IACA,gBAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA;AAAA,IACA,mBAAA;AAAA,IACA,MAAA;AAAA,IACA,cAAA,GAAiB,KAAA;AAAA,IACjB,gBAAA;AAAA,IACA,gBAAA;AAAA,IACA,WAAA,EAAa;AAAA,GACf,GAAI,OAAA;AAGJ,EAAA,MAAM,QAAA,GAAW,CAAC,OAAA,EAAiB,KAAA,KAAmB;AACpD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAA,CAAO,KAAA,CAAM,SAAS,KAAK,CAAA;AAAA,IAC7B,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,KAAA,CAAM,SAAS,KAAK,CAAA;AAAA,IAC9B;AAAA,EACF,CAAA;AAMA,EAAA,MAAM,WAAA,GACJ,mBAAA,IACA,IAAIT,6BAAA,CAAY;AAAA,IACd,QAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGH,EAAA,IAAI,YAAA,GAAe,KAAA;AACnB,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,UAAA,GAAwE,IAAA;AAG5E,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI,WAAA;AACJ,EAAA,MAAM,KAAA,GAAQ,IAAI,OAAA,CAAc,CAAC,SAAS,MAAA,KAAW;AACnD,IAAA,YAAA,GAAe,OAAA;AACf,IAAA,WAAA,GAAc,MAAA;AAAA,EAChB,CAAC,CAAA;AAcD,EAAA,IAAI,gBAAA;AAEJ,EAAA,MAAM,WAAA,GAAc,OAAO,KAAA,KAAiB;AAC1C,IAAA,IAAI,CAAC,UAAA,EAAY;AAGjB,IAAA,MAAM,WAAA,GAAc,KAAA;AAEpB,IAAA,IAAI;AACF,MAAA,QAAQ,YAAY,IAAA;AAAM,QACxB,KAAK,sBAAsB,KAAA,EAAO;AAChC,UAAA,MAAM,QAAQ,WAAA,CAAY,IAAA;AAE1B,UAAA,IAAK,KAAA,CAAc,SAAS,OAAA,EAAS;AACnC,YAAA,MAAM,aAAc,KAAA,CAAc,OAAA;AAClC,YAAA,gBAAA,GAAmB,UAAA,EAAY,KAAA,EAAO,OAAA,IAAW,UAAA,EAAY,OAAA,IAAW,qBAAA;AAAA,UAC1E;AACA,UAAAU,6BAAA,CAAY,YAAY,KAA0B,CAAA;AAClD,UAAA,MAAM,UAAU,KAA0B,CAAA;AAC1C,UAAA;AAAA,QACF;AAAA,QAEA,KAAK,sBAAsB,UAAA,EAAY;AAErC,UAAA,MAAM,QAAQ,WAAA,CAAY,IAAA;AAC1B,UAAA,IAAI,KAAA,IAAS,UAAU,KAAA,EAAO;AAC5B,YAAAA,6BAAA,CAAY,YAAY,KAAK,CAAA;AAAA,UAC/B;AACA,UAAA;AAAA,QACF;AAAA,QAEA,KAAK,sBAAsB,WAAA,EAAa;AACtC,UAAA,MAAM,OAAO,WAAA,CAAY,IAAA;AACzB,UAAA,MAAM,eAAe,IAAI,CAAA;AACzB,UAAA;AAAA,QACF;AAAA,QAEA,KAAK,sBAAsB,MAAA,EAAQ;AACjC,UAAA,MAAM,OAAO,WAAA,CAAY,IAAA;AAEzB,UAAA,MAAM,WAAA,GAAc;AAAA,YAClB,IAAA,EAAM,QAAA;AAAA,YACN,OAAA,EAAS;AAAA,cACP,QAAQ,IAAA,CAAK,MAAA;AAAA,cACb,YAAY,IAAA,CAAK;AAAA;AACnB,WACF;AACA,UAAAA,6BAAA,CAAY,YAAY,WAAW,CAAA;AACnC,UAAAC,2BAAA,CAAU,UAAU,CAAA;AAMpB,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,IAAI;AACF,cAAA,MAAM,KAAA,GAAS,IAAA,CAAK,MAAA,EAAQ,KAAA,IAAS,EAAC;AACtC,cAAA,MAAM,cAAA,GAAiB,MAAM,OAAA,CAAQ,CAAC,MAAW,CAAA,EAAG,WAAA,IAAe,EAAE,CAAA;AACrE,cAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,CAAC,MAAW,CAAA,EAAG,SAAA,IAAa,EAAE,CAAA;AACjE,cAAA,MAAM,QAAA,CAAS;AAAA,gBACb,IAAA,EAAM,IAAA,CAAK,MAAA,EAAQ,IAAA,IAAQ,EAAA;AAAA,gBAC3B,KAAA;AAAA,gBACA,WAAA,EAAa,cAAA;AAAA,gBACb,SAAA,EAAW,YAAA;AAAA,gBACX,kBAAkB,EAAC;AAAA,gBACnB,oBAAoB,EAAC;AAAA,gBACrB,iBAAiB,EAAC;AAAA,gBAClB,mBAAmB,EAAC;AAAA,gBACpB,OAAO,EAAC;AAAA,gBACR,SAAS,EAAC;AAAA,gBACV,WAAW,EAAC;AAAA,gBACZ,SAAS,EAAC;AAAA,gBACV,YAAA,EAAc,IAAA,CAAK,UAAA,EAAY,MAAA,IAAU,MAAA;AAAA,gBACzC,KAAA,EAAO,cAAA,CAAe,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAA;AAAA,gBACxC,UAAA,EAAY,cAAA,CAAe,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAA;AAAA,gBAC7C,QAAA,EAAU,IAAA,CAAK,UAAA,EAAY,QAAA,IAAY,EAAC;AAAA,gBACxC,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,EAAU;AAAA,gBAC3B,UAAU,EAAC;AAAA,gBACX,aAAA,EAAe,MAAA;AAAA,gBACf,gBAAA,EAAkB;AAAA,eACnB,CAAA;AAAA,YACH,SAAS,aAAA,EAAe;AACtB,cAAA,QAAA,CAAS,iDAAiD,aAAa,CAAA;AAAA,YACzE;AAAA,UACF;AAMA,UAAA,IAAI,OAAA,IAAW,IAAA,CAAK,UAAA,EAAY,MAAA,KAAW,OAAA,EAAS;AAClD,YAAA,IAAI;AACF,cAAA,MAAM,OAAA,CAAQ,EAAE,KAAA,EAAO,IAAI,MAAM,gBAAA,IAAoB,qBAAqB,GAAG,CAAA;AAAA,YAC/E,SAAS,aAAA,EAAe;AACtB,cAAA,QAAA,CAAS,8DAA8D,aAAa,CAAA;AAAA,YACtF;AAAA,UACF;AAEA,UAAA,IAAI;AACF,YAAA,MAAM,gBAAA,IAAmB;AAAA,UAC3B,SAAS,aAAA,EAAe;AACtB,YAAA,QAAA,CAAS,yDAAyD,aAAa,CAAA;AAAA,UACjF;AACA,UAAA;AAAA,QACF;AAAA,QAEA,KAAK,sBAAsB,KAAA,EAAO;AAChC,UAAA,MAAM,OAAO,WAAA,CAAY,IAAA;AACzB,UAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,IAAA,CAAK,MAAM,OAAO,CAAA;AAC1C,UAAA,KAAA,CAAM,IAAA,GAAO,KAAK,KAAA,CAAM,IAAA;AACxB,UAAA,IAAI,IAAA,CAAK,MAAM,KAAA,EAAO;AACpB,YAAA,KAAA,CAAM,KAAA,GAAQ,KAAK,KAAA,CAAM,KAAA;AAAA,UAC3B;AAMA,UAAAD,6BAAA,CAAY,UAAA,EAAY;AAAA,YACtB,IAAA,EAAM,OAAA;AAAA,YACN,OAAA,EAAS,EAAE,KAAA;AAAM,WACG,CAAA;AACtB,UAAAC,2BAAA,CAAU,UAAU,CAAA;AACpB,UAAA,IAAI;AACF,YAAA,MAAM,OAAA,GAAU,EAAE,KAAA,EAAO,CAAA;AAAA,UAC3B,SAAS,aAAA,EAAe;AACtB,YAAA,QAAA,CAAS,gDAAgD,aAAa,CAAA;AAAA,UACxE;AACA,UAAA;AAAA,QACF;AAAA,QAEA,KAAK,sBAAsB,SAAA,EAAW;AACpC,UAAA,MAAM,OAAO,WAAA,CAAY,IAAA;AACzB,UAAA,MAAM,cAAc,IAAI,CAAA;AAIxB,UAAA,IAAI,cAAA,EAAgB;AAClB,YAAAA,2BAAA,CAAU,UAAU,CAAA;AAAA,UACtB;AACA,UAAA;AAAA,QACF;AAAA,QAEA,KAAK,sBAAsB,KAAA,EAAO;AAChC,UAAA,MAAM,OAAO,WAAA,CAAY,IAAA;AACzB,UAAA,IAAI;AACF,YAAA,MAAM,UAAU,IAAI,CAAA;AAAA,UACtB,SAAS,aAAA,EAAe;AACtB,YAAA,QAAA,CAAS,gDAAgD,aAAa,CAAA;AAAA,UACxE;AAEA,UAAAA,2BAAA,CAAU,UAAU,CAAA;AACpB,UAAA;AAAA,QACF;AAAA,QAEA,KAAK,sBAAsB,kBAAA,EAAoB;AAC7C,UAAA,MAAM,OAAO,WAAA,CAAY,IAAA;AACzB,UAAA,IAAI;AACF,YAAA,MAAM,sBAAsB,IAAI,CAAA;AAAA,UAClC,SAAS,aAAA,EAAe;AACtB,YAAA,QAAA,CAAS,4DAA4D,aAAa,CAAA;AAAA,UACpF;AACA,UAAA;AAAA,QACF;AAIE;AACJ,IACF,SAAS,KAAA,EAAO;AAKd,MAAA,QAAA,CAAS,CAAA,0CAAA,EAA6C,WAAA,CAAY,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,IAClF;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,MAAA,GAAS,IAAIC,kBAAAA,CAAkC;AAAA,IACnD,MAAM,IAAA,EAAM;AACV,MAAA,UAAA,GAAa,IAAA;AAKb,MAAA,MAAM,KAAA,GAAQ,mBAAmB,KAAK,CAAA;AACtC,MAAA,MAAM,gBAAA,GACJ,MAAA,KAAW,MAAA,GACP,MAAA,CAAO,mBAAA,CAAoB,KAAA,EAAO,MAAA,EAAQ,WAAW,CAAA,GACrD,MAAA,CAAO,mBAAA,CAAoB,KAAA,EAAO,WAAW,CAAA;AAEnD,MAAA,gBAAA,CACG,KAAK,MAAM;AACV,QAAA,IAAI,SAAA,EAAW;AAEb,UAAA,KAAK,OAAO,WAAA,CAAY,KAAA,EAAO,WAAW,CAAA,CAAE,MAAM,CAAA,KAAA,KAAS;AACzD,YAAA,QAAA,CAAS,CAAA,gDAAA,EAAmD,KAAK,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,UAC7E,CAAC,CAAA;AACD,UAAA,YAAA,EAAa;AACb,UAAA;AAAA,QACF;AACA,QAAA,YAAA,GAAe,IAAA;AACf,QAAA,YAAA,EAAa;AAAA,MACf,CAAC,CAAA,CACA,KAAA,CAAM,CAAA,KAAA,KAAS;AACd,QAAA,QAAA,CAAS,CAAA,4CAAA,EAA+C,KAAK,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACvE,QAAA,WAAA,CAAY,KAAK,CAAA;AACjB,QAAA,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,MAClB,CAAC,CAAA;AAAA,IACL,CAAA;AAAA,IACA,MAAA,GAAS;AACP,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,GACD,CAAA;AAKD,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,SAAA,GAAY,IAAA;AACZ,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,YAAA,GAAe,KAAA;AACf,MAAA,MAAM,KAAA,GAAQ,mBAAmB,KAAK,CAAA;AACtC,MAAA,KAAK,OAAO,WAAA,CAAY,KAAA,EAAO,WAAW,CAAA,CAAE,MAAM,CAAA,KAAA,KAAS;AACzD,QAAA,QAAA,CAAS,CAAA,gDAAA,EAAmD,KAAK,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,MAC7E,CAAC,CAAA;AAAA,IACH;AACA,IAAA,UAAA,GAAa,IAAA;AAAA,EACf,CAAA;AAWA,EAAA,MAAM,MAAA,GAAS,IAAIC,mCAAA,CAA0B;AAAA,IAC3C,KAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA,EAAS;AAAA,MACP,KAAA;AAAA,MACA,YAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,gBAAA;AAAA,MACA,kBAAA,EAAoB,IAAA;AAAA,MACpB,oBAAA,EAAsB,IAAA;AAAA,MACtB;AAAA;AACF,GACD,CAAA;AAED,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;AAKA,eAAsB,cAAA,CACpB,MAAA,EACA,KAAA,EACA,KAAA,EACe;AACf,EAAA,MAAM,KAAA,GAAQ,mBAAmB,KAAK,CAAA;AACtC,EAAA,MAAM,MAAA,CAAO,QAAQ,KAAA,EAAO;AAAA,IAC1B,MAAM,qBAAA,CAAsB,KAAA;AAAA,IAC5B,KAAA;AAAA,IACA,IAAA,EAAM;AAAA,GACP,CAAA;AACH;AAOA,eAAsB,kBAAA,CACpB,MAAA,EACA,KAAA,EACA,IAAA,EACe;AACf,EAAA,MAAM,MAAA,CAAO,OAAA,CAAQ,kBAAA,CAAmB,KAAK,CAAA,EAAG;AAAA,IAC9C,MAAM,qBAAA,CAAsB,UAAA;AAAA,IAC5B,KAAA;AAAA,IACA,IAAA,EAAM,EAAE,IAAA,EAAM,YAAA,EAAc,GAAG,IAAA;AAAK,GACrC,CAAA;AACH;AAKA,eAAsB,mBAAA,CACpB,MAAA,EACA,KAAA,EACA,IAAA,EACe;AACf,EAAA,MAAM,MAAA,CAAO,OAAA,CAAQ,kBAAA,CAAmB,KAAK,CAAA,EAAG;AAAA,IAC9C,MAAM,qBAAA,CAAsB,WAAA;AAAA,IAC5B,KAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH;AAKA,eAAsB,eAAA,CAAgB,MAAA,EAAgB,KAAA,EAAe,IAAA,EAA2C;AAC9G,EAAA,MAAM,MAAA,CAAO,OAAA,CAAQ,kBAAA,CAAmB,KAAK,CAAA,EAAG;AAAA,IAC9C,MAAM,qBAAA,CAAsB,MAAA;AAAA,IAC5B,KAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH;AAKA,eAAsB,cAAA,CAAe,MAAA,EAAgB,KAAA,EAAe,KAAA,EAA6B;AAC/F,EAAA,MAAM,MAAA,CAAO,OAAA,CAAQ,kBAAA,CAAmB,KAAK,CAAA,EAAG;AAAA,IAC9C,MAAM,qBAAA,CAAsB,KAAA;AAAA,IAC5B,KAAA;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,KAAA,EAAO;AAAA,QACL,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,SAAS,KAAA,CAAM;AAAA;AAAA;AAEjB;AACF,GACD,CAAA;AACH;AAKA,eAAsB,kBAAA,CAAmB,MAAA,EAAgB,KAAA,EAAe,IAAA,EAA8C;AACpH,EAAA,MAAM,MAAA,CAAO,OAAA,CAAQ,kBAAA,CAAmB,KAAK,CAAA,EAAG;AAAA,IAC9C,MAAM,qBAAA,CAAsB,SAAA;AAAA,IAC5B,KAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH;AAKA,eAAsB,cAAA,CAAe,MAAA,EAAgB,KAAA,EAAe,IAAA,EAA0C;AAC5G,EAAA,MAAM,MAAA,CAAO,OAAA,CAAQ,kBAAA,CAAmB,KAAK,CAAA,EAAG;AAAA,IAC9C,MAAM,qBAAA,CAAsB,KAAA;AAAA,IAC5B,KAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH;AAKA,eAAsB,0BAAA,CACpB,MAAA,EACA,KAAA,EACA,IAAA,EACe;AACf,EAAA,MAAM,MAAA,CAAO,OAAA,CAAQ,kBAAA,CAAmB,KAAK,CAAA,EAAG;AAAA,IAC9C,MAAM,qBAAA,CAAsB,kBAAA;AAAA,IAC5B,KAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH;;;ACzgBA,eAAsB,wBAAwB,GAAA,EAA6D;AACzG,EAAA,MAAM,cAAuC,EAAC;AAE9C,EAAA,KAAA,MAAW,QAAA,IAAY,IAAI,SAAA,EAAW;AAEpC,IAAA,IAAI,QAAA,CAAS,gBAAA,IAAoB,QAAA,CAAS,MAAA,KAAW,MAAA,EAAW;AAC9D,MAAA,WAAA,CAAY,IAAA,CAAK;AAAA,QACf,GAAG,QAAA;AAAA,QACH,QAAQ,QAAA,CAAS;AAAA,OAClB,CAAA;AACD,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,QAAA,CAAS,QAAQ,CAAA;AAExC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,KAAA,GAA4B;AAAA,QAChC,IAAA,EAAM,mBAAA;AAAA,QACN,OAAA,EAAS,CAAA,KAAA,EAAQ,QAAA,CAAS,QAAQ,CAAA,UAAA;AAAA,OACpC;AACA,MAAA,MAAM,GAAA,CAAI,WAAA,GAAc,QAAA,EAAU,KAAK,CAAA;AACvC,MAAA,WAAA,CAAY,IAAA,CAAK;AAAA,QACf,GAAG,QAAA;AAAA,QACH;AAAA,OACD,CAAA;AACD,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,GAAA,CAAI,cAAc,QAAQ,CAAA;AAGhC,IAAA,IAAI;AACF,MAAA,IAAI,KAAK,OAAA,EAAS;AAChB,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,IAAA,EAAM;AAAA,UAC/C,YAAY,QAAA,CAAS,UAAA;AAAA,UACrB,UAAU,EAAC;AAAA,UACX,WAAW,GAAA,CAAI,SAAA;AAAA,UACf,gBAAgB,GAAA,CAAI;AAAA,SACrB,CAAA;AACD,QAAA,MAAM,GAAA,CAAI,YAAA,GAAe,QAAA,EAAU,MAAM,CAAA;AACzC,QAAA,WAAA,CAAY,IAAA,CAAK;AAAA,UACf,GAAG,QAAA;AAAA,UACH;AAAA,SACD,CAAA;AAAA,MACH,CAAA,MAAO;AAEL,QAAA,MAAM,GAAA,CAAI,YAAA,GAAe,QAAA,EAAU,MAAS,CAAA;AAC5C,QAAA,WAAA,CAAY,IAAA,CAAK;AAAA,UACf,GAAG,QAAA;AAAA,UACH,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,MACH;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,SAAA,GAAgC;AAAA,QACpC,IAAA,EAAM,oBAAA;AAAA,QACN,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,QAC9D,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ;AAAA,OAChD;AACA,MAAA,MAAM,GAAA,CAAI,WAAA,GAAc,QAAA,EAAU,SAAS,CAAA;AAC3C,MAAA,WAAA,CAAY,IAAA,CAAK;AAAA,QACf,GAAG,QAAA;AAAA,QACH,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,WAAA;AACT;ACjHO,IAAM,iBAAA,GAAoBC,MAAE,MAAA,CAAO;AAAA,EACxC,QAAA,EAAUA,MAAE,MAAA,EAAO;AAAA,EACnB,OAAA,EAASA,MAAE,MAAA,EAAO;AAAA,EAClB,oBAAA,EAAsBA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1C,QAAA,EAAUA,KAAA,CAAE,MAAA,CAAOA,KAAA,CAAE,MAAA,IAAUA,KAAA,CAAE,GAAA,EAAK,CAAA,CAAE,QAAA,EAAS;AAAA,EACjD,eAAA,EAAiBA,KAAA,CAAE,MAAA,CAAOA,KAAA,CAAE,MAAA,IAAUA,KAAA,CAAE,GAAA,EAAK,CAAA,CAAE,QAAA;AACjD,CAAC;AAKM,IAAM,oBAAA,GAAuBA,MAAE,MAAA,CAAO;AAAA,EAC3C,EAAA,EAAIA,MAAE,MAAA,EAAO;AAAA,EACb,MAAA,EAAQA,MAAE,MAAA,CAAO;AAAA,IACf,QAAA,EAAUA,MAAE,MAAA,EAAO;AAAA,IACnB,OAAA,EAASA,MAAE,MAAA,EAAO;AAAA,IAClB,oBAAA,EAAsBA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC1C,gBAAgBA,KAAA,CAAE,KAAA,CAAM,CAACA,KAAA,CAAE,MAAA,IAAUA,KAAA,CAAE,MAAA,CAAOA,KAAA,CAAE,MAAA,IAAUA,KAAA,CAAE,GAAA,EAAK,CAAC,CAAC,EAAE,QAAA,EAAS;AAAA,IAC9E,eAAA,EAAiBA,KAAA,CAAE,MAAA,CAAOA,KAAA,CAAE,MAAA,IAAUA,KAAA,CAAE,GAAA,EAAK,CAAA,CAAE,QAAA;AAAS,GACzD,CAAA;AAAA,EACD,UAAA,EAAYA,MAAE,MAAA,EAAO;AAAA,EACrB,OAAA,EAASA,MAAE,OAAA;AACb,CAAC;AAKM,IAAM,sBAAA,GAAyBA,MAAE,MAAA,CAAO;AAAA,EAC7C,WAAA,EAAaA,MAAE,MAAA,EAAO;AAAA,EACtB,YAAA,EAAcA,MAAE,MAAA,EAAO;AAAA,EACvB,WAAA,EAAaA,MAAE,MAAA;AACjB,CAAC;AAKM,IAAM,0BAAA,GAA6BA,MAAE,MAAA,CAAO;AAAA,EACjD,gBAAA,EAAkBA,MAAE,GAAA,EAAI;AAAA,EACxB,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA,EACpB,UAAA,EAAYA,MAAE,GAAA,EAAI;AAAA,EAClB,MAAA,EAAQA,MAAE,MAAA,CAAO;AAAA,IACf,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC1B,KAAA,EAAOA,MAAE,GAAA,EAAI;AAAA,IACb,KAAA,EAAOA,KAAA,CAAE,KAAA,CAAMA,KAAA,CAAE,KAAK;AAAA,GACvB,CAAA;AAAA,EACD,KAAA,EAAOA,MAAE,GAAA;AACX,CAAC;AAMM,IAAM,6BAAA,GAAgCA,MAAE,MAAA,CAAO;AAAA,EACpD,KAAA,EAAOA,MAAE,MAAA,EAAO;AAAA,EAChB,OAAA,EAASA,MAAE,MAAA,EAAO;AAAA,EAClB,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC/B,gBAAA,EAAkBA,MAAE,GAAA,EAAI;AAAA,EACxB,aAAA,EAAeA,KAAA,CAAE,KAAA,CAAMA,KAAA,CAAE,KAAK,CAAA;AAAA,EAC9B,WAAA,EAAa,iBAAA;AAAA,EACb,OAAA,EAASA,MAAE,GAAA,EAAI;AAAA,EACf,KAAA,EAAOA,MAAE,GAAA,EAAI;AAAA,EACb,SAAA,EAAWA,MAAE,MAAA;AACf,CAAC;AAMM,IAAM,wBAAA,GAA2BA,MAAE,MAAA,CAAO;AAAA;AAAA,EAE/C,KAAA,EAAOA,MAAE,MAAA,EAAO;AAAA,EAChB,OAAA,EAASA,MAAE,MAAA,EAAO;AAAA,EAClB,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC/B,gBAAA,EAAkBA,MAAE,GAAA,EAAI;AAAA,EACxB,aAAA,EAAeA,KAAA,CAAE,KAAA,CAAMA,KAAA,CAAE,KAAK,CAAA;AAAA,EAC9B,WAAA,EAAaA,MAAE,GAAA,EAAI;AAAA,EACnB,OAAA,EAASA,MAAE,GAAA,EAAI;AAAA,EACf,KAAA,EAAOA,MAAE,GAAA,EAAI;AAAA,EACb,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA;AAAA,EAEpB,cAAA,EAAgBA,MAAE,MAAA,EAAO;AAAA,EACzB,gBAAA,EAAkBA,KAAA,CAAE,KAAA,CAAMA,KAAA,CAAE,KAAK,CAAA;AAAA,EACjC,gBAAA,EAAkB,sBAAA;AAAA;AAAA,EAElB,cAAA,EAAgBA,KAAA,CAAE,GAAA,EAAI,CAAE,QAAA,EAAS;AAAA;AAAA,EAEjC,qBAAA,EAAuBA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA;AAAA,EAE5C,gBAAA,EAAkBA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA;AAAA;AAAA,EAGvC,mBAAA,EAAqBA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA;AAAA,EAE1C,aAAA,EAAeA,KAAA,CAAE,GAAA,EAAI,CAAE,QAAA,EAAS;AAAA,EAChC,aAAA,EAAeA,KAAA,CAAE,GAAA,EAAI,CAAE,QAAA;AACzB,CAAC;;;AClFM,SAAS,yBAAA,CACd,cACA,cAAA,EACkB;AAClB,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,YAAA,CAAa,WAAA,IAAe,cAAA,EAAgB,WAAA,IAAe,CAAA,CAAA;AAAA,IACxE,YAAA,EAAc,YAAA,CAAa,YAAA,IAAgB,cAAA,EAAgB,YAAA,IAAgB,CAAA,CAAA;AAAA,IAC3E,WAAA,EAAa,YAAA,CAAa,WAAA,IAAe,cAAA,EAAgB,WAAA,IAAe,CAAA;AAAA,GAC1E;AACF;AAKO,SAAS,gBAAgB,eAAA,EAA4D;AAC1F,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,gBAAgB,MAAA,CAAO,IAAA;AAAA,IAC7B,SAAA,EAAW,gBAAgB,MAAA,CAAO,SAAA;AAAA,IAClC,aAAa,eAAA,CAAgB,WAAA;AAAA,IAC7B,KAAA,EAAO,gBAAgB,MAAA,CAAO,KAAA;AAAA,IAC9B,YAAA,EAAc,gBAAgB,UAAA,CAAW;AAAA,GAC3C;AACF;AA2BO,SAAS,+BAA+B,KAAA,EAAsD;AACnG,EAAA,MAAM,EAAE,YAAA,EAAc,eAAA,EAAgB,GAAI,KAAA;AAE1C,EAAA,MAAM,WAAW,yBAAA,CAA0B,YAAA,CAAa,gBAAA,EAAkB,eAAA,CAAgB,OAAO,KAAK,CAAA;AACtG,EAAA,MAAM,UAAA,GAAa,gBAAgB,eAAe,CAAA;AAElD,EAAA,OAAO;AAAA,IACL,OAAO,YAAA,CAAa,KAAA;AAAA,IACpB,SAAS,YAAA,CAAa,OAAA;AAAA,IACtB,WAAW,YAAA,CAAa,SAAA;AAAA,IACxB,kBAAkB,eAAA,CAAgB,gBAAA;AAAA,IAClC,eAAe,YAAA,CAAa,aAAA;AAAA,IAC5B,aAAa,YAAA,CAAa,WAAA;AAAA,IAC1B,SAAS,YAAA,CAAa,OAAA;AAAA,IACtB,OAAO,eAAA,CAAgB,KAAA;AAAA,IACvB,WAAW,eAAA,CAAgB,SAAA;AAAA,IAC3B,cAAA,EAAgB,aAAa,cAAA,GAAiB,CAAA;AAAA,IAC9C,gBAAA,EAAkB,CAAC,GAAG,YAAA,CAAa,kBAAkB,UAAU,CAAA;AAAA,IAC/D,gBAAA,EAAkB,QAAA;AAAA,IAClB,gBAAgB,eAAA,CAAgB,UAAA;AAAA,IAChC,uBAAuB,eAAA,CAAgB,qBAAA;AAAA,IACvC,kBAAkB,eAAA,CAAgB,gBAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMlC,qBAAqB,YAAA,CAAa,mBAAA;AAAA;AAAA,IAElC,eAAe,YAAA,CAAa,aAAA;AAAA,IAC5B,eAAe,YAAA,CAAa;AAAA,GAC9B;AACF;ACnGA,IAAM,gBAAA,GAAmB,CAAA,EAAG,cAAA,CAAe,iBAAiB,CAAA,cAAA,CAAA;AAM5D,IAAM,kBAAA,GAAqBA,MAAE,GAAA,EAAI;AACjC,IAAM,mBAAA,GAAsBA,MAAE,GAAA,EAAI;AAe3B,SAAS,oCAAA,GAAuC;AACrD,EAAA,OAAOC,4BAAA,CAAW;AAAA,IAChB,EAAA,EAAI,gBAAA;AAAA,IACJ,WAAA,EAAa,kBAAA;AAAA,IACb,YAAA,EAAc,mBAAA;AAAA,IACd,OAAA,EAAS,OAAM,MAAA,KAAU;AACvB,MAAA,MAAM,EAAE,SAAA,EAAW,WAAA,EAAa,UAAA,EAAW,GAAI,MAAA;AAC/C,MAAA,MAAM,MAAA,GAAU,OAAeC,+BAAa,CAAA;AAC5C,MAAA,MAAM,UAAA,GAAa,SAAA;AAEnB,MAAA,MAAM,WAAW,WAAA,EAKd;AACH,MAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAQ,GAAI,QAAA;AAE3B,MAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA;AACjD,MAAA,MAAM,YAAY,aAAA,EAAe,qBAAA;AAEjC,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,OAAO,UAAA;AAAA,MACT;AAEA,MAAA,MAAM,aAAA,GAAgB,MAAM,SAAA,CAAU,SAAA,CAAU;AAAA,QAC9C,OAAA;AAAA,QACA,MAAA,EAAQ,SAAA;AAAA,QACR,QAAA,EAAU,SAAS,KAAA,EAAO,QAAA;AAAA,QAC1B,UAAA,EAAY,SAAS,KAAA,EAAO;AAAA,OAC7B,CAAA;AACD,MAAA,MAAM,eAAe,aAAA,EAAe,KAAA;AAEpC,MAAA,IAAI,CAAC,YAAA,IAAgB,YAAA,CAAa,MAAA,KAAW,CAAA,EAAG;AAC9C,QAAA,OAAO,UAAA;AAAA,MACT;AAIA,MAAA,IAAI,QAAA,CAAS,SAAS,cAAA,EAAgB;AACpC,QAAA,OAAO,EAAE,GAAG,UAAA,EAAY,qBAAA,EAAuB,IAAA,EAAK;AAAA,MACtD;AAEA,MAAA,MAAM,OAAA,GAAU,YAAA,CAAa,GAAA,CAAI,CAAA,IAAA,KAAQ,KAAK,EAAE,CAAA;AAEhD,MAAA,MAAM,WAAW,aAAA,EAAe,qBAAA;AAChC,MAAA,MAAM,gBAAgB,SAAA,CAAU,MAAA;AAChC,MAAA,MAAM,aAAA,GAAgB,QAAA,EAAU,aAAA,IAAiB,aAAA,EAAe,aAAA;AAuBhE,MAAA,IAAI,UAAA,KAAe,KAAK,aAAA,EAAe;AACrC,QAAA,OAAO,EAAE,GAAG,UAAA,EAAY,qBAAA,EAAuB,IAAA,EAAK;AAAA,MACtD;AAIA,MAAA,MAAM,kBAAkB,aAAA,IAAiB,GAAA;AAGzC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,IAAI;AACF,UAAA,MAAM,cAAA,CAAe,QAAQ,KAAA,EAAO;AAAA,YAClC,IAAA,EAAM,0BAAA;AAAA,YACN,KAAA;AAAA,YACA,IAAA,EAAA,OAAA;AAAA,YACA,SAAS,EAAE,OAAA,EAAS,cAAc,YAAA,CAAa,MAAA,EAAQ,WAAW,CAAA;AAAE,WACrE,CAAA;AAAA,QACH,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAGA,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,CAAU,gBAAgB,OAAA,EAAS;AAAA,UACvC,SAAA,EAAW,eAAA;AAAA,UACX,UAAA,EAAY,CAAC,SAAA,KAAsB;AACjC,YAAA,IAAI,CAAC,MAAA,EAAQ;AACb,YAAA,KAAK,cAAA,CAAe,QAAQ,KAAA,EAAO;AAAA,cACjC,IAAA,EAAM,0BAAA;AAAA,cACN,KAAA;AAAA,cACA,IAAA,EAAA,OAAA;AAAA,cACA,SAAS,EAAE,OAAA,EAAS,YAAA,EAAc,YAAA,CAAa,QAAQ,SAAA;AAAU,aAClE,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,YAAC,CAAC,CAAA;AAAA,UACnB,CAAA;AAAA,UACA,kBAAA,EAAoB;AAAA,SACrB,CAAA;AAAA,MACH,CAAA,CAAA,MAAQ;AAIN,QAAA,OAAO,UAAA;AAAA,MACT;AAGA,MAAA,IAAI,WAAW,UAAA,EAAY;AACzB,QAAA,OAAO;AAAA,UACL,GAAG,UAAA;AAAA,UACH,qBAAA,EAAuB,IAAA;AAAA,UACvB,YAAY,EAAE,GAAG,UAAA,CAAW,UAAA,EAAY,aAAa,IAAA;AAAK,SAC5D;AAAA,MACF;AAEA,MAAA,OAAO,EAAE,GAAG,UAAA,EAAY,qBAAA,EAAuB,IAAA,EAAK;AAAA,IACtD;AAAA,GACD,CAAA;AACH;;;AC9IA,eAAsB,gCAAA,CACpB,OACA,IAAA,EAKiB;AACjB,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO,GAAI,IAAA;AAClC,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,KAAA,EAAO;AACrB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAU,KAAA,CAAM,OAAA;AACtB,EAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AAC3C,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAY,OAAA,CAAmC,QAAA;AACrD,EAAA,MAAM,aAAc,OAAA,CAAqC,UAAA;AACzD,EAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,OAAO,eAAe,QAAA,EAAU;AAClE,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,QAAQ,QAAQ,CAAA;AAC7B,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,MAAA;AAAA,IACA,eAAgB,IAAA,EAA8C;AAAA,GAChE;AAEA,EAAA,IAAI,gBAAA,GAA2B,KAAA;AAC/B,EAAA,IAAI,SAAA;AAEJ,EAAA,IAAI,KAAA,CAAM,SAAS,WAAA,EAAa;AAC9B,IAAA,SAAA,GAAY,MAAMC,gDAAA;AAAA,MAChB;AAAA,QACE,KAAA,EAAO,iBAAA;AAAA,QACP,QAAA;AAAA,QACA,UAAA;AAAA,QACA,OAAQ,OAAA,CAA+B,IAAA;AAAA,QACvC,kBAAmB,OAAA,CAA2D;AAAA,OAChF;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,aAAA,EAAe;AACvC,IAAA,gBAAA,GAAmBC,kDAAA;AAAA,MACjB,gBAAA;AAAA,MACA,MAAMD,gDAAA;AAAA,QACJ;AAAA,UACE,KAAA,EAAO,iBAAA;AAAA,UACP,QAAA;AAAA,UACA,UAAA;AAAA,UACA,OAAQ,OAAA,CAA+B,IAAA;AAAA,UACvC,kBAAmB,OAAA,CAA2D;AAAA,SAChF;AAAA,QACA,MAAA;AAAA,QACA;AAAA;AACF,KACF;AACA,IAAA,SAAA,GAAY,MAAMA,gDAAA;AAAA,MAChB;AAAA,QACE,KAAA,EAAO,kBAAA;AAAA,QACP,QAAA;AAAA,QACA,UAAA;AAAA,QACA,OAAQ,OAAA,CAA+B,IAAA;AAAA,QACvC,QAAS,OAAA,CAAiC,MAAA;AAAA,QAC1C,kBAAmB,OAAA,CAA2D;AAAA,OAChF;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AACtC,IAAA,gBAAA,GAAmBC,kDAAA;AAAA,MACjB,gBAAA;AAAA,MACA,MAAMD,gDAAA;AAAA,QACJ;AAAA,UACE,KAAA,EAAO,iBAAA;AAAA,UACP,QAAA;AAAA,UACA,UAAA;AAAA,UACA,OAAQ,OAAA,CAA+B,IAAA;AAAA,UACvC,kBAAmB,OAAA,CAA2D;AAAA,SAChF;AAAA,QACA,MAAA;AAAA,QACA;AAAA;AACF,KACF;AACA,IAAA,SAAA,GAAY,MAAMA,gDAAA;AAAA,MAChB;AAAA,QACE,KAAA,EAAO,OAAA;AAAA,QACP,QAAA;AAAA,QACA,UAAA;AAAA,QACA,OAAQ,OAAA,CAA+B,IAAA;AAAA,QACvC,OAAQ,OAAA,CAAgC,KAAA;AAAA,QACxC,kBAAmB,OAAA,CAA2D;AAAA,OAChF;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAOC,kDAAA,CAAiC,kBAAyB,SAAS,CAAA;AAC5E;;;AC9CA,eAAsB,2BAA2B,OAAA,EAAsE;AACrH,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,QAAO,GAAI,OAAA;AAQlD,EAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA;AACjD,EAAA,MAAM,WAAA,GAAc,aAAA,EAAe,WAAA,GAC/B,aAAA,CAAc,WAAA,CAAY,YAAY,KAAA,CAAM,gBAAgB,CAAA,GAC5D,IAAIlB,6BAAA,CAAY;AAAA,IACd,QAAA,EAAU,MAAM,KAAA,CAAM,QAAA;AAAA,IACtB,UAAA,EAAY,MAAM,KAAA,CAAM;AAAA,GACzB,CAAA,CAAE,WAAA,CAAY,KAAA,CAAM,gBAAgB,CAAA;AAIzC,EAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA;AAC/C,EAAA,IAAI,KAAA,GAAkC,WAAA,EAAa,KAAA,IAAS,EAAC;AAC7D,EAAA,IAAI,QAA6B,WAAA,EAAa,KAAA;AAC9C,EAAA,IAAI,YAAkD,WAAA,EAAa,SAAA;AACnE,EAAA,IAAI,YAAmC,WAAA,EAAa,SAAA;AACpD,EAAA,IAAI,MAAA;AAGJ,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAA,EAAQ,KAAA,GAAQ,CAAA,cAAA,EAAiB,OAAO,CAAA,qDAAA,EAAwD,KAAK,CAAA,CAAE,CAAA;AAAA,EACzG,WAAW,MAAA,EAAQ;AACjB,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,YAAA,CAAa,OAAO,CAAA;AAGzC,MAAA,MAAM,qBAAA,GAAwB,IAAIP,gCAAA,EAAe;AAGjD,MAAA,KAAA,GAAQ,MAAM,MAAM,oBAAA,CAAqB;AAAA,QACvC,KAAA;AAAA,QACA,QAAA,EAAU,MAAM,KAAA,CAAM,QAAA;AAAA,QACtB,UAAA,EAAY,MAAM,KAAA,CAAM,UAAA;AAAA,QACxB,cAAA,EAAgB,qBAAA;AAAA,QAChB,YAAA,EAAc,MAAM,KAAA,CAAM,YAAA;AAAA,QAC1B,wBAAA,EAA0B,MAAM,OAAA,EAAS;AAAA,OAC1C,CAAA;AAED,MAAA,KAAA,GACG,MAAO,KAAA,CAAc,QAAA,GAAW,EAAE,cAAA,EAAgB,qBAAA,EAAuB,CAAA,IAC1E,YAAA,CAAa,KAAA,CAAM,WAAmB,CAAA;AAExC,MAAA,MAAM,YAAA,GAAe,MAAO,KAAA,CAAc,YAAA,GAAe,qBAAqB,CAAA;AAC9E,MAAA,IAAI,YAAA,IAAgB,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,EAAG;AAC/C,QAAA,SAAA,GAAY,YAAA,CAAa,GAAA,CAAI,CAAC,KAAA,MAAgB;AAAA,UAC5C,IAAI,KAAA,CAAM,EAAA;AAAA,UACV,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,UAAA,EAAY,MAAM,UAAA,IAAc,CAAA;AAAA,UAChC,OAAA,EAAS,MAAM,OAAA,IAAW,IAAA;AAAA,UAC1B,SAAS,KAAA,CAAM;AAAA,SACjB,CAAE,CAAA;AAAA,MACJ;AAEA,MAAA,MAAA,GAAS,MAAO,KAAA,CAAc,SAAA,GAAY,EAAE,cAAA,EAAgB,uBAAuB,CAAA;AACnF,MAAA,SAAA,GAAY,MAAO,KAAA,CAAc,YAAA,GAAe,EAAE,cAAA,EAAgB,uBAAuB,CAAA;AAAA,IAC3F,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,EAAQ,KAAA,GAAQ,CAAA,cAAA,EAAiB,OAAO,CAAA,mCAAA,EAAsC,KAAK,CAAA,CAAE,CAAA;AACrF,MAAA,KAAA,GAAQ,YAAA,CAAa,KAAA,CAAM,WAAmB,CAAA;AAAA,IAChD;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAA,EAAQ,KAAA,GAAQ,CAAA,cAAA,EAAiB,OAAO,CAAA,oDAAA,CAAsD,CAAA;AAC9F,IAAA,KAAA,GAAQ,YAAA,CAAa,MAAM,WAAW,CAAA;AAAA,EACxC;AAEA,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,WAAW,CAAA,EAAG;AACnC,IAAA,MAAA,EAAQ,KAAA,GAAQ,CAAA,cAAA,EAAiB,OAAO,CAAA,4BAAA,EAA+B,KAAK,CAAA,CAAE,CAAA;AAAA,EAChF;AAGA,EAAA,IAAI,gBAAA;AACJ,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,gBAAA,GAAmB,IAAIa,kCAAA,CAAiB;AAAA,MACtC,MAAA,EAAQ,QAAQ,SAAA,IAAY;AAAA,MAC5B;AAAA,KACD,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,YAAY,oBAAA,CAAqB;AAAA,IACrC,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,MAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACF;AACF;AAYO,SAAS,YAAA,CAAa,QAAiC,OAAA,EAAuC;AACnG,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,MAAA,EAAS,MAAA,CAAO,QAAQ,CAAA,CAAA,EAAI,OAAO,OAAO,CAAA,6FAAA;AAAA,KAE5C;AAAA,EACF,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,oBAAA,EAAsB,OAAO,oBAAA,IAAwB,IAAA;AAAA,IACrD,eAAe,EAAC;AAAA,IAChB,UAAA,EAAY,aAAA;AAAA,IACZ,QAAA,EAAU,aAAA;AAAA,IACV,cAAA,EAAgB;AAAA,GAClB;AACF;AAKO,SAAS,qBAAqB,OAAA,EAKlB;AACjB,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,gBAAA,EAAkB,OAAM,GAAI,OAAA;AAEnD,EAAA,OAAO;AAAA;AAAA,IAEL,GAAA,EAAK,MAAM,IAAA,CAAK,GAAA,EAAI;AAAA,IACpB,UAAA,EAAY,MAAM,MAAA,CAAO,UAAA,EAAW;AAAA,IACpC,WAAA,EAAa,sBAAM,IAAI,IAAA,EAAK;AAAA;AAAA,IAG5B,gBAAA;AAAA,IACA,MAAA;AAAA;AAAA,IAGA,cAAc,KAAA,CAAM,YAAA;AAAA,IACpB,UAAU,KAAA,CAAM,QAAA;AAAA,IAChB,YAAY,KAAA,CAAM,UAAA;AAAA,IAClB,cAAc,KAAA,CAAM,YAAA;AAAA;AAAA;AAAA,IAIpB,SAAA,EAAW;AAAA,GACb;AACF;AAKO,SAAS,WAAA,CAAY,UAAkB,MAAA,EAAuC;AAEnF,EAAA,IAAI;AACF,IAAA,OAAO,MAAA,EAAQ,UAAU,QAAe,CAAA;AAAA,EAC1C,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAeA,eAAsB,oBAAA,CACpB,IAAA,EACA,qBAAA,EACA,IAAA,EACA,eAAA,EACkB;AAClB,EAAA,IAAI,cAAA;AACJ,EAAA,IAAI,OAAO,0BAA0B,UAAA,EAAY;AAC/C,IAAA,IAAI;AACF,MAAA,cAAA,GAAiB,CAAC,CAAE,MAAM,qBAAA,CAAsB;AAAA,QAC9C,QAAA,EAAU,iBAAiB,QAAA,IAAY,EAAA;AAAA,QACvC,IAAA,EAAM,QAAQ,EAAC;AAAA,QACf,gBAAgB,eAAA,EAAiB,cAAA;AAAA,QACjC,WAAW,eAAA,EAAiB;AAAA,OAC7B,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AAEN,MAAA,cAAA,GAAiB,IAAA;AAAA,IACnB;AAAA,EACF,CAAA,MAAO;AACL,IAAA,cAAA,GAAiB,CAAC,CAAC,qBAAA;AAAA,EACrB;AAEA,EAAA,IAAI,QAAA,GAAW,cAAA,IAAkB,CAAC,CAAE,IAAA,CAAa,eAAA;AAGjD,EAAA,MAAM,eAAA,GAAkBa,qCAAmB,IAAI,CAAA;AAC/C,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,CAAC,CAAE,MAAM,eAAA,CAAgB,IAAA,IAAQ,EAAE,CAAA;AAAA,IAChD,CAAA,CAAA,MAAQ;AAEN,MAAA,QAAA,GAAW,IAAA;AAAA,IACb;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AA0BA,eAAsB,sBAAA,CACpB,QACA,MAAA,EAC8B;AAC9B,EAAA,MAAM,cAAA,GAAiB,IAAI1B,gCAAA,EAAe;AAG1C,EAAA,MAAM,iBAAA,GAAoB,OAAO,cAAA,IAAkB,CAAA,EAAG,OAAO,QAAQ,CAAA,CAAA,EAAI,OAAO,OAAO,CAAA,CAAA;AAEvF,EAAA,IAAI,OAAO,sBAAsB,QAAA,EAAU;AACzC,IAAA,OAAQ,MAAM2B,oCAAA,CAAmB,iBAAA,EAAmB,cAAA,EAAgB,MAAM,CAAA;AAAA,EAC5E;AAGA,EAAA,OAAQ,MAAMA,oCAAA;AAAA,IACZ,iBAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AACF;AASA,eAAsB,yBAAA,CACpB,OACA,MAAA,EAC8B;AAC9B,EAAA,OAAO,sBAAA,CAAuB,KAAA,CAAM,MAAA,EAAQ,MAAM,CAAA;AACpD;;;AC5TA,IAAM,qBAAA,GAAwBN,MAAE,MAAA,CAAO;AAAA,EACrC,KAAA,EAAOA,MAAE,MAAA,EAAO;AAAA,EAChB,OAAA,EAASA,MAAE,MAAA,EAAO;AAAA,EAClB,SAAA,EAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC/B,gBAAA,EAAkBA,MAAE,GAAA,EAAI;AAAA;AAAA,EACxB,aAAA,EAAeA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,KAAK,CAAA;AAAA,EAC9B,WAAA,EAAaA,MAAE,MAAA,CAAO;AAAA,IACpB,QAAA,EAAUA,MAAE,MAAA,EAAO;AAAA,IACnB,OAAA,EAASA,MAAE,MAAA,EAAO;AAAA,IAClB,oBAAA,EAAsBA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC1C,gBAAgBA,KAAAA,CAAE,KAAA,CAAM,CAACA,KAAAA,CAAE,MAAA,IAAUA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAUA,KAAAA,CAAE,GAAA,EAAK,CAAC,CAAC,EAAE,QAAA,EAAS;AAAA,IAC9E,QAAA,EAAUA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAUA,KAAAA,CAAE,GAAA,EAAK,CAAA,CAAE,QAAA,EAAS;AAAA,IACjD,eAAA,EAAiBA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAUA,KAAAA,CAAE,GAAA,EAAK,CAAA,CAAE,QAAA;AAAS,GACzD,CAAA;AAAA;AAAA,EAED,WAAWA,KAAAA,CACR,KAAA;AAAA,IACCA,MAAE,MAAA,CAAO;AAAA,MACP,EAAA,EAAIA,MAAE,MAAA,EAAO;AAAA,MACb,MAAA,EAAQA,MAAE,MAAA,CAAO;AAAA,QACf,QAAA,EAAUA,MAAE,MAAA,EAAO;AAAA,QACnB,OAAA,EAASA,MAAE,MAAA,EAAO;AAAA,QAClB,oBAAA,EAAsBA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC1C,gBAAgBA,KAAAA,CAAE,KAAA,CAAM,CAACA,KAAAA,CAAE,MAAA,IAAUA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAUA,KAAAA,CAAE,GAAA,EAAK,CAAC,CAAC,EAAE,QAAA,EAAS;AAAA,QAC9E,eAAA,EAAiBA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAUA,KAAAA,CAAE,GAAA,EAAK,CAAA,CAAE,QAAA;AAAS,OACzD,CAAA;AAAA,MACD,UAAA,EAAYA,MAAE,MAAA,EAAO;AAAA,MACrB,OAAA,EAASA,MAAE,OAAA;AAAQ,KACpB;AAAA,IAEF,QAAA,EAAS;AAAA,EACZ,OAAA,EAASA,MAAE,GAAA,EAAI;AAAA,EACf,KAAA,EAAOA,MAAE,GAAA,EAAI;AAAA,EACb,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA;AAAA,EAEpB,aAAA,EAAeA,KAAAA,CAAE,GAAA,EAAI,CAAE,QAAA,EAAS;AAAA;AAAA,EAEhC,aAAA,EAAeA,KAAAA,CAAE,GAAA,EAAI,CAAE,QAAA,EAAS;AAAA;AAAA,EAEhC,SAAA,EAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACxB,CAAC,CAAA;AAKD,IAAM,sBAAA,GAAyBA,MAAE,MAAA,CAAO;AAAA,EACtC,gBAAA,EAAkBA,MAAE,GAAA,EAAI;AAAA,EACxB,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1B,WAAWA,KAAAA,CAAE,KAAA;AAAA,IACXA,MAAE,MAAA,CAAO;AAAA,MACP,UAAA,EAAYA,MAAE,MAAA,EAAO;AAAA,MACrB,QAAA,EAAUA,MAAE,MAAA,EAAO;AAAA,MACnB,IAAA,EAAMA,MAAE,MAAA,CAAOA,KAAAA,CAAE,QAAO,EAAGA,KAAAA,CAAE,KAAK,CAAA;AAAA,MAClC,gBAAA,EAAkBA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAUA,KAAAA,CAAE,GAAA,EAAK,CAAA,CAAE,QAAA,EAAS;AAAA,MACzD,WAAA,EAAaA,MAAE,KAAA,CAAMA,KAAAA,CAAE,QAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA;AAAS,KACtD;AAAA,GACH;AAAA,EACA,UAAA,EAAYA,MAAE,MAAA,CAAO;AAAA,IACnB,MAAA,EAAQA,MAAE,MAAA,EAAO;AAAA,IACjB,QAAA,EAAUA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,KAAK,CAAA;AAAA,IACzB,WAAA,EAAaA,MAAE,OAAA,EAAQ;AAAA,IACvB,UAAA,EAAYA,KAAAA,CAAE,GAAA,EAAI,CAAE,QAAA;AAAS,GAC9B,CAAA;AAAA,EACD,QAAA,EAAUA,MAAE,GAAA,EAAI;AAAA,EAChB,mBAAA,EAAqBA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACzC,sBAAA,EAAwBA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC5C,KAAA,EAAOA,MAAE,GAAA,EAAI;AAAA;AAAA,EAEb,SAAA,EAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAE/B,aAAA,EAAeA,KAAAA,CAAE,GAAA,EAAI,CAAE,QAAA,EAAS;AAAA,EAChC,YAAA,EAAcA,KAAAA,CAAE,GAAA,EAAI,CAAE,QAAA,EAAS;AAAA,EAC/B,iBAAA,EAAmBA,KAAAA,CAAE,GAAA,EAAI,CAAE,QAAA;AAC7B,CAAC,CAAA;AAuBM,SAAS,8BAA8B,QAAA,EAA2C;AACvF,EAAA,OAAOC,4BAAA,CAAW;AAAA,IAChB,IAAI,cAAA,CAAe,aAAA;AAAA,IACnB,WAAA,EAAa,qBAAA;AAAA,IACb,YAAA,EAAc,sBAAA;AAAA,IACd,OAAA,EAAS,OAAM,MAAA,KAAU;AACvB,MAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAQ,cAAA,EAAgB,cAAA,EAAgB,aAAY,GAAI,MAAA;AAG3E,MAAA,MAAM,MAAA,GAAU,OAAeC,+BAAa,CAAA;AAE5C,MAAA,MAAM,UAAA,GAAa,SAAA;AACnB,MAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,OAAA,EAAS,aAAY,GAAI,UAAA;AACrD,MAAA,MAAM,QAAQ,UAAA,CAAW,KAAA;AACzB,MAAA,MAAM,MAAA,GAAS,QAAQ,SAAA,IAAY;AAGnC,MAAA,MAAM,QAAA,GAAW,MAAM,0BAAA,CAA2B;AAAA,QAChD,MAAA;AAAA,QACA,KAAA;AAAA,QACA,OAAA;AAAA,QACA,KAAA,EAAO,UAAA;AAAA,QACP;AAAA,OACD,CAAA;AAED,MAAA,MAAM,EAAE,WAAA,EAAa,KAAA,EAAO,OAAO,aAAA,EAAe,SAAA,EAAW,mBAAkB,GAAI,QAAA;AAMnF,MAAA,MAAM,gBAAA,GAAmB,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG,QAAA;AACvD,MAAA,IAAI,gBAAA,EAAkB;AAGpB,QAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA;AACzC,QAAA,IAAI,KAAA,QAAa,QAAA,GAAW,MAAA;AAE5B,QAAA,MAAA,EAAQ,OAAO,uDAAA,EAAyD;AAAA,UACtE,KAAA,EAAO,OAAA;AAAA,UACP,QAAQ,gBAAA,CAAiB,MAAA;AAAA,UACzB,aAAa,gBAAA,CAAiB,WAAA;AAAA,UAC9B,OAAO,gBAAA,CAAiB;AAAA,SACzB,CAAA;AAED,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAM,cAAA,CAAe,QAAQ,KAAA,EAAO;AAAA,YAClC,IAAA,EAAM,UAAA;AAAA,YACN,KAAA;AAAA,YACA,IAAA,EAAA,OAAA;AAAA,YACA,OAAA,EAAS;AAAA,cACP,MAAA,EAAQ,iBAAiB,MAAA,IAAU,EAAA;AAAA,cACnC,OAAO,gBAAA,CAAiB,KAAA;AAAA,cACxB,UAAU,gBAAA,CAAiB,QAAA;AAAA,cAC3B,aAAa,gBAAA,CAAiB;AAAA;AAChC,WACD,CAAA;AAAA,QACH;AAEA,QAAA,OAAO;AAAA,UACL,gBAAA,EAAkB,YAAY,SAAA,EAAU;AAAA,UACxC,IAAA,EAAM,EAAA;AAAA,UACN,WAAW,EAAC;AAAA,UACZ,UAAA,EAAY;AAAA,YACV,MAAA,EAAQ,UAAA;AAAA,YACR,UAAU,EAAC;AAAA,YACX,WAAA,EAAa;AAAA,WACf;AAAA,UACA,UAAU,EAAC;AAAA,UACX,OAAO,UAAA,CAAW;AAAA,SACpB;AAAA,MACF;AAGA,MAAA,MAAM,YAAA,GAAe,UAAA,CAAW,SAAA,IAAa,UAAA,CAAW,UAAU,MAAA,GAAS,CAAA;AAK3E,MAAA,MAAM,SAAA,GAAY,eACd,UAAA,CAAW,SAAA,CAAW,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,CAAA,GAC3C;AAAA,QACE;AAAA,UACE,EAAA,EAAI,GAAG,UAAA,CAAW,WAAA,CAAY,QAAQ,CAAA,CAAA,EAAI,UAAA,CAAW,YAAY,OAAO,CAAA,CAAA;AAAA,UACxE,QAAQ,UAAA,CAAW,WAAA;AAAA,UACnB,UAAA,EAAY,CAAA;AAAA,UACZ,OAAA,EAAS;AAAA;AACX,OACF;AAEJ,MAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,QAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,MAC7D;AAGA,MAAA,IAAI,SAAA;AACJ,MAAA,IAAI,mBAAA,GAAsB,CAAA;AAC1B,MAAA,MAAM,mBAAA,GACJ,UAAA,CAAW,OAAA,EAAS,mBAAA,KACnB,iBAAA,CAAkB,IAAI,KAAK,CAAA,EAAG,eAAA,EAAiB,MAAA,GAAS,EAAA,GAAK,MAAA,CAAA;AAEhE,MAAA,KAAA,IAAS,UAAA,GAAa,CAAA,EAAG,UAAA,GAAa,SAAA,CAAU,QAAQ,UAAA,EAAA,EAAc;AACpE,QAAA,MAAM,UAAA,GAAa,UAAU,UAAU,CAAA;AACvC,QAAA,MAAM,UAAA,GAAa,WAAW,UAAA,IAAc,CAAA;AAE5C,QAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,UAAA,EAAY,OAAA,EAAA,EAAW;AACtD,UAAA,IAAI;AAGF,YAAA,MAAM,QAAQ,CAAC,YAAA,GACX,aAAA,GACC,iBAAA,EAAmB,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,EAAA,KAAO,UAAA,CAAW,EAAE,CAAA,EAAG,KAAA,IACtD,MAAM,yBAAA,CAA0B,YAAY,MAAgB,CAAA;AAGjE,YAAA,IAAI,CAACK,0CAAA,CAAyB,KAAK,CAAA,EAAG;AACpC,cAAA,MAAM,IAAA,GAAQ,KAAA,CAAc,cAAA,GACxB,4EAAA,GACA,EAAA;AACJ,cAAA,MAAM,IAAI,KAAA;AAAA,gBACR,CAAA,2BAAA,EAA+B,KAAA,CAAc,oBAAoB,CAAA,gCAAA,EAAmC,IAAI,CAAA;AAAA,eAC1G;AAAA,YACF;AAEA,YAAA,IAAI,gBAAA,GAAmB,SAAA;AAGvB,YAAA,IAAI,YAAA,GAAe,KAAA;AACnB,YAAA,IAAI,YAAA,GAAe,KAAA;AACnB,YAAA,IAAI,oBAAoB,WAAA,CAAY,UAAA;AACpC,YAAA,IAAI,qBAAqB,WAAA,CAAY,WAAA;AACrC,YAAA,IAAI,uBAAgD,EAAE,GAAI,WAAA,CAAY,aAAA,IAAiB,EAAC,EAAG;AAC3F,YAAA,IAAI,sBAAA,GAA4DC,sCAAA;AAAA,cAC9D,WAAA,CAAY,eAAA;AAAA,cACZ,WAAW,MAAA,CAAO;AAAA,aACpB;AAKA,YAAA,MAAM,gBAAgB,MAAA,EAAQ,aAAA,EAAe,mBAAA,CAAoB,EAAE,gBAAgB,CAAA;AAInF,YAAA,MAAM,qBAAsB,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG,uBACvD,SAAA,CAAkB,aAAA;AACrB,YAAA,MAAM,SAAA,GAAY,kBAAA,GACb,aAAA,EAAe,WAAA,CAAY,kBAAkB,CAAA,GAC9C,MAAA;AAGJ,YAAA,MAAM,gBAAA,GAAkD,WAAW,aAAA,EAAc;AAIjF,YAAA,MAAM,SAAA,GAAa,UAAkB,SAAA,IAAa,CAAA;AAClD,YAAA,gBAAA,EAAkB,aAAa,SAAS,CAAA;AAKxC,YAAA,MAAM,yBAAyB,WAAA,CAAY,gBAAA;AAC3C,YAAA,IAAI,gBAAA,GACF,sBAAA,EAAwB,MAAA,IAAU,CAAC,wBAAwB,sBAAA,GACvD;AAAA,cACE,QAAQ,sBAAA,CAAuB,MAAA;AAAA,cAC/B,qBAAqB,sBAAA,CAAuB;AAAA,aAC9C,GACA,MAAA;AAEN,YAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA;AACjD,YAAA,MAAM,oBAAA,GAAuB,eAAe,WAAA,IAAe,WAAA;AAC3D,YAAA,MAAM,mBAAA,GAAsB,aAAA,EAAe,eAAA,IAAmB,EAAC;AAC/D,YAAA,MAAM,mBAAA,GAAsB,aAAA,EAAe,WAAA,GACvC,CAAC,GAAG,mBAAA,EAAqB,IAAIC,sCAAA,CAAqB,EAAE,WAAA,EAAa,aAAA,CAAc,WAAA,EAAa,CAAC,CAAA,GAC7F,mBAAA;AACJ,YAAA,IAAI,oBAAoB,MAAA,EAAQ;AAC9B,cAAA,MAAM,kBAAkB,MAAA,GACpB;AAAA,gBACE,MAAA,EAAQ,OAAO,IAAA,KAA2B;AACxC,kBAAA,MAAM,cAAA,CAAe,MAAA,EAAQ,KAAA,EAAO,IAAW,CAAA;AAAA,gBACjD;AAAA,eACF,GACA,MAAA;AACJ,cAAA,MAAM,MAAA,GAAS,IAAIpB,iCAAA,CAAgB;AAAA,gBACjC,eAAA,EAAiB,mBAAA;AAAA,gBACjB,gBAAA,EAAkB,aAAA,EAAe,gBAAA,IAAoB,EAAC;AAAA,gBACtD,eAAA,EAAiB,aAAA,EAAe,eAAA,IAAmB,EAAC;AAAA,gBACpD,MAAA;AAAA,gBACA,SAAA,EAAW,UAAA,CAAW,SAAA,IAAa,UAAA,CAAW,OAAA;AAAA,gBAC9C,iBAAiB,aAAA,EAAe;AAAA,eACjC,CAAA;AACD,cAAA,IAAI;AACF,gBAAA,MAAM,sBAAA,GAAyB,MAAM,MAAA,CAAO,mBAAA,CAAoB;AAAA,kBAC9D,WAAA;AAAA,kBACA,UAAA,EAAY,SAAA;AAAA,kBACZ,KAAA,EAAQ,SAAA,CAAkB,gBAAA,IAAoB,EAAC;AAAA,kBAC/C,cAAA,EAAgB,gBAAA,EAAkB,iBAAA,EAAkB,IAAK,cAAA;AAAA,kBACzD,cAAA;AAAA,kBACA,QAAQ,aAAA,EAAe,MAAA;AAAA,kBACvB,UAAA,EAAY,WAAW,KAAA,EAAO,UAAA;AAAA,kBAC9B,QAAA,EAAU,WAAW,KAAA,EAAO,QAAA;AAAA,kBAC5B,KAAA,EAAO,YAAA;AAAA,kBACP,SAAA,EAAW,gBAAA;AAAA,kBACX,yBAAyB,MAAM;AAC7B,oBAAA,gBAAA,GAAmB,OAAO,UAAA,EAAW;AACrC,oBAAA,OAAO,gBAAA;AAAA,kBACT,CAAA;AAAA,kBACA,KAAA,EAAO,YAAA;AAAA,kBACP,UAAA,EAAY,iBAAA;AAAA,kBACZ,eAAA,EAAiB,sBAAA;AAAA,kBACjB,WAAA,EAAa,kBAAA;AAAA,kBACb,aAAA,EAAe,oBAAA;AAAA,kBACf,gBAAA;AAAA,kBACA,UAAA,EAAa,UAAkB,mBAAA,IAAuB,CAAA;AAAA,kBACtD,WAAA,EAAa,oBAAA;AAAA,kBACb,MAAA,EAAQ;AAAA,iBACT,CAAA;AACD,gBAAA,MAAM,MAAA,GAASqB,kCAAA;AAAA,kBACb;AAAA,oBACE,SAAA,EAAW,gBAAA;AAAA,oBACX,KAAA,EAAO,YAAA;AAAA,oBACP,KAAA,EAAO,YAAA;AAAA,oBACP,UAAA,EAAY,iBAAA;AAAA,oBACZ,WAAA,EAAa,kBAAA;AAAA,oBACb,eAAA,EAAiB,sBAAA;AAAA,oBACjB,aAAA,EAAe,oBAAA;AAAA,oBACf;AAAA,mBACF;AAAA,kBACA;AAAA,iBACF;AACA,gBAAA,gBAAA,GAAmB,MAAA,CAAO,SAAA;AAC1B,gBAAA,YAAA,GAAe,MAAA,CAAO,KAAA;AACtB,gBAAA,YAAA,GAAe,MAAA,CAAO,KAAA;AACtB,gBAAA,iBAAA,GAAoB,MAAA,CAAO,UAAA;AAC3B,gBAAA,kBAAA,GAAqB,MAAA,CAAO,WAAA;AAC5B,gBAAA,sBAAA,GAAyB,MAAA,CAAO,eAAA;AAChC,gBAAA,oBAAA,GAAuB,MAAA,CAAO,aAAA;AAC9B,gBAAA,gBAAA,GAAmB,MAAA,CAAO,gBAAA;AAAA,cAC5B,SAAS,KAAA,EAAO;AAKd,gBAAA,IAAI,iBAAiBnB,0BAAA,EAAU;AAC7B,kBAAA,MAAA,EAAQ,OAAO,8CAAA,EAAgD;AAAA,oBAC7D,QAAQ,KAAA,CAAM,OAAA;AAAA,oBACd,aAAa,KAAA,CAAM,WAAA;AAAA,oBACnB,KAAA,EAAO,MAAM,OAAA,EAAS;AAAA,mBACvB,CAAA;AACD,kBAAA,IAAI,MAAA,EAAQ;AACV,oBAAA,MAAM,cAAA,CAAe,QAAQ,KAAA,EAAO;AAAA,sBAClC,IAAA,EAAM,UAAA;AAAA,sBACN,KAAA;AAAA,sBACA,IAAA,EAAA,OAAA;AAAA,sBACA,OAAA,EAAS;AAAA,wBACP,aAAa,KAAA,CAAM,WAAA;AAAA,wBACnB,QAAQ,KAAA,CAAM,OAAA;AAAA,wBACd,KAAA,EAAO,MAAM,OAAA,EAAS,KAAA;AAAA,wBACtB,QAAA,EAAU,MAAM,OAAA,EAAS;AAAA;AAC3B,qBACD,CAAA;AAAA,kBACH;AAIA,kBAAA,OAAO;AAAA,oBACL,gBAAA,EAAkB,YAAY,SAAA,EAAU;AAAA,oBACxC,IAAA,EAAM,EAAA;AAAA,oBACN,WAAW,EAAC;AAAA,oBACZ,UAAA,EAAY;AAAA,sBACV,MAAA,EAAQ,UAAA;AAAA,sBACR,UAAU,EAAC;AAAA,sBACX,WAAA,EAAa;AAAA,qBACf;AAAA,oBACA,QAAA,EAAU;AAAA,sBACR,SAAS,YAAA,CAAa;AAAA,qBACxB;AAAA,oBACA,OAAO,UAAA,CAAW;AAAA,mBACpB;AAAA,gBACF;AACA,gBAAA,MAAA,EAAQ,KAAA,GAAQ,yCAAyC,KAAK,CAAA;AAC9D,gBAAA,MAAM,KAAA;AAAA,cACR;AAAA,YACF;AAUA,YAAA,IAAI,MAAA,EAAQ;AACV,cAAA,MAAM,sBAAsB,aAAA,EAAe,mBAAA,EAAqB,MAAA,CAAO,CAAC,KAAK,EAAC;AAC9E,cAAA,KAAA,MAAW,iBAAiB,mBAAA,EAAqB;AAC/C,gBAAA,MAAM,cAAA,CAAe,MAAA,EAAQ,KAAA,EAAO,aAAA,CAAc,YAAmB,CAAA;AAAA,cACvE;AAEA,cAAA,MAAM,sBAAsB,SAAA,KAAc,CAAA;AAC1C,cAAA,IAAI,mBAAA,IAAuB,eAAe,mBAAA,EAAqB;AAC7D,gBAAA,MAAM,aAAA,GAAgB,aAAA,CAAc,mBAAA,CAAoB,SAAS,CAAA;AACjE,gBAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,kBAAA,gBAAA,GAAmB,MAAA,EAAQ,UAAA,IAAa,IAAK,MAAA,CAAO,UAAA,EAAW;AAAA,gBACjE;AACA,gBAAA,KAAA,MAAW,gBAAgB,aAAA,EAAe;AACxC,kBAAA,MAAM,mBAAA,GAAsB,WAAA,CAAY,SAAA,CAAU,YAAY,CAAA;AAC9D,kBAAA,MAAM,cAAA,CAAe,MAAA,EAAQ,KAAA,EAAO,mBAAA,CAAoB,YAAmB,CAAA;AAAA,gBAC7E;AAAA,cACF;AAAA,YACF;AAMA,YAAA,MAAM,qBAAA,GAAwB,MAAMoB,oCAAA,CAAmB;AAAA,cACrD,KAAA,EAAO;AAAA,aACR,CAAA;AACD,YAAA,MAAM,iBAAA,GACJ,YAAA,CAAa,oBAAA,KAAyB,IAAA,IAAQ,aAAa,oBAAA,KAAyB,IAAA,GAChF,WAAA,CAAY,GAAA,CAAI,IAAI,IAAA,CAAK,SAAA,GACzB,WAAA,CAAY,GAAA,CAAI,IAAI,IAAA,CAAK,SAAA;AAC/B,YAAA,IAAI,aAAA,GAAiB,MAAM,iBAAA,CAAkB,qBAAqB,CAAA;AAKlE,YAAA,aAAA,GAAgBC,8CAAA,CAA6B;AAAA,cAC3C,YAAY,WAAA,CAAY,wBAAA;AAAA,cACxB,aAAA;AAAA,cACA,QAAA,EAAU,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,EAAA;AAAG,aAClC,CAAA;AAMD,YAAA,aAAA,GAAgBC,4CAAA,CAA2B;AAAA,cACzC,aAAA;AAAA,cACA,uBAAuB,aAAA,EAAe,qBAAA;AAAA,cACtC,KAAA,EAAO,YAAA;AAAA,cACP,uBAAuB,aAAA,EAAe;AAAA,aACvC,CAAA;AAYD,YAAA,IAAI,cAAA;AACJ,YAAA,MAAM,kBAAA,GAAqB,aAAA,EAAe,yBAAA,IAA6B,aAAA,EAAe,mBAAmB,EAAC;AAI1G,YAAA,MAAM,iBAAA,GACJ,kBAAA,CAAmB,MAAA,GAAS,CAAA,GACxB,IAAIxB,iCAAA,CAAgB;AAAA,cAClB,eAAA,EAAiB,kBAAA;AAAA,cACjB,kBAAkB,EAAC;AAAA,cACnB,MAAA;AAAA,cACA,SAAA,EAAW,UAAA,CAAW,SAAA,IAAa,UAAA,CAAW,OAAA;AAAA,cAC9C,iBAAiB,aAAA,EAAe;AAAA,aACjC,CAAA,GACD,MAAA;AACN,YAAA,MAAM,oBAAoB,MAAA,GACtB;AAAA,cACE,MAAA,EAAQ,OAAO,IAAA,KAA2B;AACxC,gBAAA,MAAM,cAAA,CAAe,MAAA,EAAQ,KAAA,EAAO,IAAW,CAAA;AAAA,cACjD;AAAA,aACF,GACA,MAAA;AACJ,YAAA,IAAI,iBAAA,EAAmB;AACrB,cAAA,IAAI;AACF,gBAAA,MAAM,iBAAA,GAAoB,MAAM,iBAAA,CAAkB,oBAAA,CAAqB;AAAA,kBACrE,MAAA,EAAQ,aAAA;AAAA,kBACR,KAAA,EAAO,YAAA;AAAA,kBACP,UAAA,EAAa,SAAA,CAAkB,gBAAA,EAAkB,MAAA,IAAU,CAAA;AAAA,kBAC3D,KAAA,EAAQ,SAAA,CAAkB,gBAAA,IAAoB,EAAC;AAAA,kBAC/C,UAAA,EAAa,UAAkB,mBAAA,IAAuB,CAAA;AAAA,kBACtD,cAAA;AAAA,kBACA,cAAA,EAAgB,gBAAA,EAAkB,iBAAA,EAAkB,IAAK,cAAA;AAAA,kBACzD,MAAA,EAAQ,iBAAA;AAAA,kBACR,WAAA,EAAa;AAAA,iBACd,CAAA;AACD,gBAAA,aAAA,GAAgB,iBAAA,CAAkB,MAAA;AAClC,gBAAA,cAAA,GAAiB,iBAAA,CAAkB,QAAA;AAAA,cACrC,SAAS,KAAA,EAAO;AACd,gBAAA,IAAI,iBAAiBE,0BAAA,EAAU;AAC7B,kBAAA,MAAA,EAAQ,OAAO,gDAAA,EAAkD;AAAA,oBAC/D,QAAQ,KAAA,CAAM,OAAA;AAAA,oBACd,aAAa,KAAA,CAAM,WAAA;AAAA,oBACnB,KAAA,EAAO,MAAM,OAAA,EAAS;AAAA,mBACvB,CAAA;AAGD,kBAAA,IAAI,MAAA,EAAQ;AACV,oBAAA,MAAM,cAAA,CAAe,QAAQ,KAAA,EAAO;AAAA,sBAClC,IAAA,EAAM,UAAA;AAAA,sBACN,KAAA;AAAA,sBACA,IAAA,EAAA,OAAA;AAAA,sBACA,OAAA,EAAS;AAAA,wBACP,aAAa,KAAA,CAAM,WAAA;AAAA,wBACnB,QAAQ,KAAA,CAAM,OAAA;AAAA,wBACd,KAAA,EAAO,MAAM,OAAA,EAAS,KAAA;AAAA,wBACtB,QAAA,EAAU,MAAM,OAAA,EAAS;AAAA;AAC3B,qBACD,CAAA;AAAA,kBACH;AACA,kBAAA,OAAO;AAAA,oBACL,gBAAA,EAAkB,YAAY,SAAA,EAAU;AAAA,oBACxC,IAAA,EAAM,EAAA;AAAA,oBACN,WAAW,EAAC;AAAA,oBACZ,UAAA,EAAY;AAAA,sBACV,MAAA,EAAQ,UAAA;AAAA,sBACR,UAAU,EAAC;AAAA,sBACX,WAAA,EAAa;AAAA,qBACf;AAAA,oBACA,QAAA,EAAU;AAAA,sBACR,SAAS,YAAA,CAAa;AAAA,qBACxB;AAAA,oBACA,OAAO,UAAA,CAAW;AAAA,mBACpB;AAAA,gBACF;AACA,gBAAA,MAAA,EAAQ,KAAA,GAAQ,0CAA0C,KAAK,CAAA;AAC/D,gBAAA,MAAM,KAAA;AAAA,cACR;AAAA,YACF;AAIA,YAAA,gBAAA,EAAkB,kBAAkB,IAAI,CAAA;AAGxC,YAAA,IAAI,WAAkB,EAAC;AACvB,YAAA,IAAI,UAAe,EAAC;AACpB,YAAA,IAAI,cAAmB,EAAC;AACxB,YAAA,MAAM,aAAuB,EAAC;AAC9B,YAAA,MAAM,YAAoC,EAAC;AAC3C,YAAA,IAAI,YAAA,GAAuB,MAAA;AAC3B,YAAA,IAAI,QAAa,EAAE,WAAA,EAAa,GAAG,YAAA,EAAc,CAAA,EAAG,aAAa,CAAA,EAAE;AACnE,YAAA,IAAI,mBAAwB,EAAC;AAM7B,YAAA,MAAM,8BAAA,uBAAqC,GAAA,EAAsB;AACjE,YAAA,MAAM,mCAAA,uBAA0C,GAAA,EAG9C;AAIF,YAAA,MAAM,oBAAA,uBAA2B,GAAA,EAAsB;AAEvD,YAAA,MAAM,cAAA,GAAiB,CAAC,QAAA,KAA2C;AACjE,cAAA,MAAM,UAAA,GAAc,eAAmE,QAAQ,CAAA;AAC/F,cAAA,IAAI,YAAY,OAAO,UAAA;AACvB,cAAA,OAAO,aAAA,EAAe,QAAQ,QAAQ,CAAA;AAAA,YACxC,CAAA;AAEA,YAAA,MAAM,8BAAA,GAAiC,CAAC,UAAA,EAAoB,IAAA,KAAyB;AACnF,cAAA,MAAM,KAAA,GAAQ,mCAAA,CAAoC,GAAA,CAAI,UAAU,CAAA;AAChE,cAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,KAAA,EAAO;AACzB,gBAAA,8BAAA,CAA+B,OAAO,UAAU,CAAA;AAChD,gBAAA;AAAA,cACF;AACA,cAAA,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,IAAA,KAAS,MAAA,GAAY,EAAE,UAAU,EAAE,IAAA,EAAK,EAAE,GAAI,MAAS,CAAA;AACtE,cAAA,KAAA,CAAM,KAAA,GAAQ,IAAA;AACd,cAAA,8BAAA,CAA+B,OAAO,UAAU,CAAA;AAAA,YAClD,CAAA;AAEA,YAAA,MAAM,6BAAA,GAAgC,CAAC,UAAA,KAA4C;AACjF,cAAA,MAAM,MAAA,GAAS,8BAAA,CAA+B,GAAA,CAAI,UAAU,CAAA;AAC5D,cAAA,IAAI,CAAC,MAAA,EAAQ,MAAA,EAAQ,OAAO,MAAA;AAC5B,cAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AAC5B,cAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,cAAA,IAAI;AACF,gBAAA,OAAO,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,cACzB,CAAA,CAAA,MAAQ;AACN,gBAAA,OAAO,MAAA;AAAA,cACT;AAAA,YACF,CAAA;AAEA,YAAA,MAAM,gCAAgC,CAAC;AAAA,cACrC,UAAA;AAAA,cACA,QAAA;AAAA,cACA,IAAA;AAAA,cACA,gBAAA;AAAA,cACA;AAAA,aACF,KAMyC;AACvC,cAAA,MAAM,OAAA,GAAU,eAAe,QAAQ,CAAA;AACvC,cAAA,MAAM,wBAAA,GAA2BuB,uCAAA,CAAsB,gBAAA,EAAkB,OAAO,CAAA;AAChF,cAAA,MAAM,YAAA,GACJ,CAAC,wBAAA,IAA4B,CAAE,OAAA,EAA+C,OAAA;AAEhF,cAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,MAAA,IAAU,CAAC,gBAAgB,WAAA,EAAa;AAC5D,gBAAA,OAAO,EAAE,OAAA,EAAQ;AAAA,cACnB;AAEA,cAAA,MAAM,eAAA,GAAkB,mCAAA,CAAoC,GAAA,CAAI,UAAU,CAAA;AAC1E,cAAA,IAAI,eAAA,EAAiB;AACnB,gBAAA,OAAA,CAAQ,gBAAgB,eAAA,CAAgB,OAAA;AACxC,gBAAA,IAAI,SAAS,MAAA,EAAW;AACtB,kBAAA,8BAAA,CAA+B,YAAY,IAAI,CAAA;AAAA,gBACjD;AACA,gBAAA,OAAO,EAAE,OAAA,EAAQ;AAAA,cACnB;AAEA,cAAA,MAAM,KAAA,GAAS,MAAA,CAAkB,aAAA,EAAe,2BAAA,IAA8B;AAC9E,cAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAE,OAAA,EAAQ;AAE7B,cAAA,IAAI;AACF,gBAAA,MAAM,UAAA,GACJ,cAAA,CAAe,WAAA,CAAY,IAAA,KAAU,WAAA,GACjC,cAAA,CAAe,WAAA,GACb,cAAA,CAAe,WAAA,CAAoB,UAAA,GAAa,WAAW,CAAA,IAAK,cAAA,CAAe,WAAA;AACvF,gBAAA,MAAM,cAAA,GAAkB,WAAmB,eAAA,GAAkB;AAAA,kBAC3D,IAAA,EAAM,kBAAA;AAAA,kBACN,IAAA,EAAM,iBAAiB,QAAQ,CAAA,CAAA,CAAA;AAAA,kBAC/B,YAAY1B,4BAAA,CAAW,IAAA;AAAA,kBACvB,QAAA,EAAU,QAAA;AAAA,kBACV,UAAA,EAAY,QAAA;AAAA,kBACZ,UAAA,EAAY;AAAA,oBACV,iBAAkB,OAAA,EAAkD,WAAA;AAAA,oBACpE,QAAA,EAAU;AAAA,mBACZ;AAAA,kBACA,GAAI,IAAA,KAAS,MAAA,GAAY,EAAE,KAAA,EAAO,IAAA,KAAS;AAAC,iBAC7C,CAAA;AACD,gBAAA,IAAI,cAAA,EAAgB;AAClB,kBAAA,MAAM,OAAA,GAAU,KAAA,CAAM,MAAA,CAAO,cAAc,CAAA;AAC3C,kBAAA,MAAM,QAAQ,EAAE,OAAA,EAAS,IAAA,EAAM,cAAA,EAA2B,OAAO,KAAA,EAAM;AACvE,kBAAA,mCAAA,CAAoC,GAAA,CAAI,YAAY,KAAK,CAAA;AACzD,kBAAA,OAAA,CAAQ,aAAA,GAAgB,OAAA;AACxB,kBAAA,IAAI,SAAS,MAAA,EAAW;AACtB,oBAAA,8BAAA,CAA+B,YAAY,IAAI,CAAA;AAAA,kBACjD;AAAA,gBACF;AAAA,cACF,SAAS,GAAA,EAAK;AACZ,gBAAA,MAAA,EAAQ,OAAO,mEAAA,EAAqE;AAAA,kBAClF,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAAA,kBACtD;AAAA,iBACD,CAAA;AAAA,cACH;AAEA,cAAA,OAAO,EAAE,OAAA,EAAQ;AAAA,YACnB,CAAA;AAGA,YAAA,gBAAA,EAAkB,SAAA,EAAU;AAS5B,YAAA,gBAAA,EAAkB,mBAAA,GAAsB;AAAA,cACtC,UAAA,EAAY,oBAAA;AAAA,cACZ,eAAA,EAAiB,sBAAA;AAAA,cACjB,cAAA,EAAgB2B,2CAAA;AAAA,gBACd,YAAA;AAAA,gBACA;AAAA,eACF;AAAA,cACA,UAAA,EAAY,iBAAA;AAAA,cACZ,cAAA,EAAgB,mBAAmB,aAAA,GAAgB;AAAA,aACpD,CAAA;AACD,YAAA,gBAAA,EAAkB,cAAA,IAAiB;AAKnC,YAAA,MAAM,kBAA6D,EAAC;AAGpE,YAAA,IAAI,WAAA;AACJ,YAAA,IAAI,cAAA,EAAgB;AAIlB,cAAA,QAAA,GAAW,cAAA,CAAe,YAAY,EAAC;AACvC,cAAA,OAAA,GAAU,cAAA,CAAe,WAAW,EAAC;AACrC,cAAA,WAAA,GAAc,cAAA,CAAe,WAAA;AAC7B,cAAA,gBAAA,EAAkB,UAAA,GAAa;AAAA,gBAC7B,OAAA,EAAS,WAAW,EAAC;AAAA,gBACrB,aAAA;AAAA,gBACA,QAAA,EAAU,YAAY,EAAC;AAAA,gBACvB,SAAA,EAAW;AAAA,eACZ,CAAA;AACD,cAAA,MAAM,eAAe,cAAA,CAAe,MAAA;AACpC,cAAA,WAAA,GAAc,IAAI,cAAA,CAAe;AAAA,gBAC/B,MAAM,IAAA,EAAM;AACV,kBAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAChC,oBAAA,IAAA,CAAK,OAAA,CAAQ;AAAA,sBACX,GAAG,KAAA;AAAA,sBACH,KAAA;AAAA,sBACA,IAAA,EAAA,OAAA;AAAA,qBACD,CAAA;AAAA,kBACH;AACA,kBAAA,IAAA,CAAK,KAAA,EAAM;AAAA,gBACb;AAAA,eACD,CAAA;AAAA,YACH,CAAA,MAAO;AACL,cAAA,WAAA,GAAcC,yBAAA,CAAQ;AAAA,gBACpB,KAAA;AAAA,gBACA,KAAA,EAAO,YAAA;AAAA,gBACP,eAAA,EAAiB,sBAAA;AAAA,gBACjB,aAAA;AAAA,gBACA,KAAA,EAAO,YAAA;AAAA,gBACP,UAAA,EAAY,iBAAA;AAAA,gBACZ,WAAA,EAAa,kBAAA;AAAA,gBACb,OAAA,EAAS,EAAE,WAAA,EAAa,oBAAA,EAAqB;AAAA,gBAC7C,SAASC,qCAAA,CAAoB;AAAA,kBAC3B,eAAeC,oCAAA,CAAmB;AAAA,oBAChC,QAAA,EAAU,WAAW,KAAA,EAAO,QAAA;AAAA,oBAC5B,UAAA,EAAY,WAAW,KAAA,EAAO;AAAA,mBAC/B,CAAA;AAAA,kBACD,kBAAA,EAAoB,mBAAmB,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,EAAA,KAAO,UAAA,CAAW,EAAE,CAAA,EAAG,OAAA;AAAA,kBAC1E,eAAA,EACE,aAAA,EAAe,eAAA,IAAmB,oBAAA,CAAqB,OAAA,GACnD;AAAA,oBACE,GAAI,aAAA,EAAe,eAAA;AAAA,oBACnB,GAAI,oBAAA,CAAqB;AAAA,mBAC3B,GACA;AAAA,iBACP,CAAA;AAAA,gBACD,aAAA,EAAe;AAAA,kBACb,GAAG,oBAAA;AAAA,kBACH,UAAA,EAAY;AAAA,iBACd;AAAA,gBACA,kBAAkB,WAAA,CAAY,gBAAA;AAAA,gBAC9B,UAAA,EAAY,QAAA;AAAA,gBACZ,gBAAA;AAAA,gBACA,QAAA,EAAU,CAAC,EAAE,QAAA,EAAU,GAAG,OAAA,EAAS,CAAA,EAAG,WAAA,EAAa,EAAA,EAAG,KAAM;AAC1D,kBAAA,QAAA,GAAW,KAAK,EAAC;AACjB,kBAAA,OAAA,GAAU,KAAK,EAAC;AAChB,kBAAA,WAAA,GAAc,MAAM,EAAC;AACrB,kBAAA,gBAAA,EAAkB,aAAa,EAAE,OAAA,EAAS,eAAe,QAAA,EAAU,SAAA,EAAW,kBAAkB,CAAA;AAAA,gBAClG;AAAA,eACD,CAAA;AAAA,YACH;AAIA,YAAA,MAAM,YAAA,GAAe,IAAInB,mCAAA,CAAkB;AAAA,cACzC,KAAA,EAAO;AAAA,gBACL,SAAS,YAAA,CAAa,OAAA;AAAA,gBACtB,UAAU,YAAA,CAAa,QAAA;AAAA,gBACvB,SAAS,YAAA,CAAa;AAAA,eACxB;AAAA,cACA,MAAA,EAAQ,WAAA;AAAA,cACR,WAAA;AAAA,cACA,SAAA,EAAW,gBAAA;AAAA,cACX,OAAA,EAAS;AAAA,gBACP,KAAA;AAAA,gBACA,cAAA,EAAgB,gBAAA,EAAkB,iBAAA,EAAkB,IAAK,cAAA;AAAA,gBACzD;AAAA;AACF,aACD,CAAA;AAMD,YAAA,MAAM,UAAA,GAAa,aAAa,cAAA,EAAe;AAC/C,YAAA,MAAM,qBAAsB,UAAA,CAAmC,WAAA;AAAA,cAC7D,IAAI,eAAA,CAA0B;AAAA,gBAC5B,SAAA,CAAU,OAAO,UAAA,EAAY;AAC3B,kBAAA,IAAI,KAAA,EAAO,SAAS,QAAA,EAAU;AAC5B,oBAAA,UAAA,CAAW,QAAQ,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,eAAe,CAAA;AAAA,kBACtD,CAAA,MAAO;AACL,oBAAA,UAAA,CAAW,QAAQ,KAAK,CAAA;AAAA,kBAC1B;AAAA,gBACF;AAAA,eACD;AAAA,aACH;AAEA,YAAA,MAAM,aAAA,GAAgB,gBAAA,EAAkB,UAAA,CAAW,kBAAkB,CAAA,IAAK,kBAAA;AAE1E,YAAA,IAAI,uBAAA,GAA+B,IAAA;AACnC,YAAA,IAAI;AACF,cAAA,IAAI,gBAAA,GAAmB,KAAA;AACvB,cAAA,WAAA,MAAiB,YAAY,aAAA,EAAe;AAC1C,gBAAA,IAAI,CAAC,QAAA,EAAU;AAMf,gBAAA,IAAI,CAAC,oBAAoB,MAAA,EAAQ;AAC/B,kBAAA,gBAAA,GAAmB,IAAA;AACnB,kBAAA,MAAM,kBAAA,CAAmB,QAAQ,KAAA,EAAO;AAAA,oBACtC,QAAQ,cAAA,CAAe,aAAA;AAAA,oBACvB,OAAA;AAAA,oBACA;AAAA,mBACD,CAAA;AAAA,gBACH;AAkBA,gBAAA,MAAM,cAAA,GAAiB,YAAA;AACvB,gBAAA,MAAM,cACJ,aAAA,EAAe,oBAAA,IAAwB,cAAA,GACnC,MAAM,iCAAiC,QAAA,EAAU;AAAA,kBAC/C,QAAQ,aAAA,EAAe,oBAAA;AAAA,kBACvB,KAAA,EAAO,cAAA;AAAA,kBACP;AAAA,iBACD,CAAA,GACD,QAAA;AAUN,gBAAA,IAAI,qBAAA;AACJ,gBAAA,IAAI,QAAA,CAAS,SAAS,iCAAA,EAAmC;AACvD,kBAAA,CAAC,EAAE,OAAA,EAAS,qBAAA,EAAsB,GAAI,6BAAA,CAA8B;AAAA,oBAClE,UAAA,EAAY,SAAS,OAAA,CAAQ,UAAA;AAAA,oBAC7B,QAAA,EAAU,SAAS,OAAA,CAAQ,QAAA;AAAA,oBAC3B,gBAAA,EAAkB,SAAS,OAAA,CAAQ,gBAAA;AAAA,oBACnC,SAAU,WAAA,CAAoB;AAAA,mBAC/B,CAAA;AAGD,kBAAA,IAAI,qBAAA,EAAuB;AACzB,oBAAA,oBAAA,CAAqB,GAAA,CAAI,QAAA,CAAS,OAAA,CAAQ,UAAA,EAAY,qBAAqB,CAAA;AAAA,kBAC7E;AAAA,gBACF,CAAA,MAAA,IAAW,QAAA,CAAS,IAAA,KAAS,iBAAA,EAAmB;AAC9C,kBAAA,MAAM,UAAA,GAAa,SAAS,OAAA,CAAQ,UAAA;AACpC,kBAAA,IAAI,UAAA,IAAc,QAAA,CAAS,OAAA,CAAQ,aAAA,EAAe;AAChD,oBAAA,MAAM,MAAA,GAAS,8BAAA,CAA+B,GAAA,CAAI,UAAU,KAAK,EAAC;AAClE,oBAAA,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,aAAa,CAAA;AAC1C,oBAAA,8BAAA,CAA+B,GAAA,CAAI,YAAY,MAAM,CAAA;AAAA,kBACvD;AAAA,gBACF,CAAA,MAAA,IAAW,QAAA,CAAS,IAAA,KAAS,+BAAA,EAAiC;AAC5D,kBAAA,MAAM,UAAA,GAAa,6BAAA,CAA8B,QAAA,CAAS,OAAA,CAAQ,UAAU,CAAA;AAC5E,kBAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,oBAAA,8BAAA,CAA+B,QAAA,CAAS,OAAA,CAAQ,UAAA,EAAY,UAAU,CAAA;AAAA,kBACxE;AAAA,gBACF,CAAA,MAAA,IAAW,QAAA,CAAS,IAAA,KAAS,WAAA,EAAa;AACxC,kBAAA,6BAAA,CAA8B;AAAA,oBAC5B,UAAA,EAAY,SAAS,OAAA,CAAQ,UAAA;AAAA,oBAC7B,QAAA,EAAU,SAAS,OAAA,CAAQ,QAAA;AAAA,oBAC3B,IAAA,EAAM,SAAS,OAAA,CAAQ,IAAA;AAAA,oBACvB,gBAAA,EAAkB,SAAS,OAAA,CAAQ,gBAAA;AAAA,oBACnC,SAAU,WAAA,CAAoB;AAAA,mBAC/B,CAAA;AAAA,gBACH;AAaA,gBAAA,IAAI,MAAA,IAAU,QAAA,CAAS,IAAA,KAAS,OAAA,EAAS;AACvC,kBAAA,IAAI,QAAA,CAAS,SAAS,aAAA,EAAe;AACnC,oBAAA,uBAAA,GAA0B,WAAA;AAAA,kBAC5B,CAAA,MAAO;AACL,oBAAA,MAAM,cAAA,CAAe,MAAA,EAAQ,KAAA,EAAO,WAAW,CAAA;AAAA,kBACjD;AAAA,gBACF;AAMA,gBAAA,IAAI,CAAC,kBAAkB,iBAAA,EAAmB;AACxC,kBAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,oBACnB,MAAM,QAAA,CAAS,IAAA;AAAA,oBACf,OAAA,EAAS,SAAA,IAAa,QAAA,GAAW,QAAA,CAAS,OAAA,GAAU;AAAA,mBACrD,CAAA;AAAA,gBACH;AAKA,gBAAA,QAAQ,SAAS,IAAA;AAAM,kBACrB,KAAK,YAAA,EAAc;AACjB,oBAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,oBAAA,UAAA,CAAW,IAAA,CAAK,QAAQ,IAAI,CAAA;AAC5B,oBAAA;AAAA,kBACF;AAAA,kBAEA,KAAK,iCAAA,EAAmC;AACtC,oBAAA,MAAM,IAAA,GAAO,qBAAA,IAAyB,cAAA,CAAe,QAAA,CAAS,QAAQ,QAAQ,CAAA;AAC9E,oBAAA,IAAI,IAAA,IAAQ,kBAAkB,IAAA,EAAM;AAClC,sBAAA,IAAI;AAIF,wBAAA,MAAO,KAAa,YAAA,GAAe;AAAA,0BACjC,UAAA,EAAY,SAAS,OAAA,CAAQ,UAAA;AAAA,0BAC7B,QAAA,EAAU,aAAA;AAAA,0BACV,WAAA,EAAa;AAAA,yBACd,CAAA;AAAA,sBACH,SAAS,KAAA,EAAO;AACd,wBAAA,MAAA,EAAQ,KAAA,GAAQ,8BAA8B,KAAK,CAAA;AAAA,sBACrD;AAAA,oBACF;AACA,oBAAA;AAAA,kBACF;AAAA,kBAEA,KAAK,iBAAA,EAAmB;AAGtB,oBAAA,MAAM,IAAA,GACJ,oBAAA,CAAqB,GAAA,CAAI,QAAA,CAAS,QAAQ,UAAU,CAAA,KACnD,QAAA,CAAS,OAAA,CAAQ,QAAA,GAAW,cAAA,CAAe,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA,GAAI,MAAA,CAAA;AAC3E,oBAAA,IAAI,IAAA,IAAQ,kBAAkB,IAAA,EAAM;AAClC,sBAAA,IAAI;AACF,wBAAA,MAAO,KAAa,YAAA,GAAe;AAAA,0BACjC,cAAA,EAAgB,SAAS,OAAA,CAAQ,aAAA;AAAA,0BACjC,UAAA,EAAY,SAAS,OAAA,CAAQ,UAAA;AAAA,0BAC7B,QAAA,EAAU,aAAA;AAAA,0BACV,WAAA,EAAa;AAAA,yBACd,CAAA;AAAA,sBACH,SAAS,KAAA,EAAO;AACd,wBAAA,MAAA,EAAQ,KAAA,GAAQ,8BAA8B,KAAK,CAAA;AAAA,sBACrD;AAAA,oBACF;AACA,oBAAA;AAAA,kBACF;AAAA,kBAEA,KAAK,WAAA,EAAa;AAChB,oBAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,oBAAA,SAAA,CAAU,IAAA,CAAK;AAAA,sBACb,YAAY,OAAA,CAAQ,UAAA;AAAA,sBACpB,UAAU,OAAA,CAAQ,QAAA;AAAA,sBAClB,IAAA,EAAM,OAAA,CAAQ,IAAA,IAAQ,EAAC;AAAA,sBACvB,kBAAkB,OAAA,CAAQ,gBAAA;AAAA,sBAC1B,kBAAkB,OAAA,CAAQ,gBAAA;AAAA,sBAC1B,QAAQ,OAAA,CAAQ,MAAA;AAAA,sBAChB,aAAa,kBAAA,IAAsB;AAAA,qBACpC,CAAA;AACD,oBAAA;AAAA,kBACF;AAAA,kBAEA,KAAK,aAAA,EAAe;AAClB,oBAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AAGzB,oBAAA,YAAA,GAAe,OAAA,CAAQ,UAAA,EAAY,MAAA,IAAU,OAAA,CAAQ,YAAA,IAAgB,MAAA;AACrE,oBAAA,KAAA,GAAQ,OAAA,CAAQ,MAAA,EAAQ,KAAA,IAAS,OAAA,CAAQ,KAAA,IAAS,KAAA;AAClD,oBAAA;AAAA,kBACF;AAAA,kBAEA,KAAK,mBAAA,EAAqB;AACxB,oBAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,oBAAA,gBAAA,GAAmB;AAAA,sBACjB,IAAI,OAAA,CAAQ,EAAA;AAAA,sBACZ,WAAW,OAAA,CAAQ,SAAA;AAAA,sBACnB,SAAS,OAAA,CAAQ,OAAA;AAAA,sBACjB,SAAS,OAAA,CAAQ;AAAA,qBACnB;AACA,oBAAA;AAAA,kBACF;AAAA,kBAEA,KAAK,OAAA,EAAS;AACZ,oBAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,oBAAA,MAAM,YAAA,GAAe,OAAA,EAAS,KAAA,EAAO,OAAA,IAAW,SAAS,OAAA,IAAW,qBAAA;AACpE,oBAAA,MAAM,QAAA,GAAW,IAAI,KAAA,CAAM,YAAY,CAAA;AAGvC,oBAAA,MAAM,QAAA;AAAA,kBACR;AAAA;AACF,cACF;AAAA,YACF,SAAS,KAAA,EAAO;AACd,cAAA,MAAA,EAAQ,KAAA,GAAQ,6BAAA,EAA+B,EAAE,KAAA,EAAO,OAAO,CAAA;AAE/D,cAAA,MAAM,QAAA,GAAW,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACzE,cAAA,IAAI,gBAAA,EAAkB;AACpB,gBAAA,gBAAA,CAAiB,qBAAA,CAAsB,EAAE,KAAA,EAAO,QAAA,EAAU,CAAA;AAAA,cAC5D,WAAW,SAAA,EAAW;AACpB,gBAAA,SAAA,CAAU,KAAA,CAAM,EAAE,KAAA,EAAO,QAAA,EAAU,CAAA;AAAA,cACrC;AAUA,cAAA,MAAM,OAAA,GAAU,oBAAA,EAAsB,OAAA,KAAY,IAAA,IAAQ,SAAS,IAAA,KAAS,YAAA;AAC5E,cAAA,IAAI,OAAA,EAAS;AACX,gBAAA,IAAI,MAAA,EAAQ;AACV,kBAAA,MAAM,eAAe,MAAA,EAAQ,KAAA,EAAO,EAAE,KAAA,EAAO,IAAI,CAAA;AAAA,gBACnD;AAGA,gBAAA,MAAM,QAAA;AAAA,cACR;AAEA,cAAA,SAAA,GAAY,QAAA;AAGZ,cAAA,MAAM,kBAAA,GAAqB,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA;AACtD,cAAA,MAAM,kBAAA,GAAqB,mBAAA,KAAwB,MAAA,IAAa,mBAAA,GAAsB,mBAAA;AACtF,cAAA,IAAI,kBAAA,EAAoB,eAAA,EAAiB,MAAA,IAAU,kBAAA,EAAoB;AACrE,gBAAA,IAAI;AACF,kBAAA,MAAM,MAAA,GAAS,IAAIV,iCAAA,CAAgB;AAAA,oBACjC,eAAA,EAAiB,kBAAA,CAAmB,eAAA,IAAmB,EAAC;AAAA,oBACxD,gBAAA,EAAkB,kBAAA,CAAmB,gBAAA,IAAoB,EAAC;AAAA,oBAC1D,iBAAiB,kBAAA,CAAmB,eAAA;AAAA,oBACpC,MAAA;AAAA,oBACA,SAAA,EAAW,UAAA,CAAW,SAAA,IAAa,UAAA,CAAW,OAAA;AAAA,oBAC9C,iBAAiB,kBAAA,CAAmB;AAAA,mBACrC,CAAA;AACD,kBAAA,MAAM,kBAAA,GAAqB,IAAIH,6BAAA,EAAY;AAC3C,kBAAA,kBAAA,CAAmB,WAAA,CAAY,WAAW,gBAAgB,CAAA;AAC1D,kBAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,OAAO,kBAAA,CAAmB;AAAA,oBAChD,KAAA,EAAO,SAAA;AAAA,oBACP,QAAA,EAAU,kBAAA,CAAmB,GAAA,CAAI,GAAA,CAAI,EAAA,EAAG;AAAA,oBACxC,WAAA,EAAa,kBAAA;AAAA,oBACb,UAAA,EAAa,UAAkB,SAAA,IAAa,CAAA;AAAA,oBAC5C,KAAA,EAAQ,SAAA,CAAkB,gBAAA,IAAoB,EAAC;AAAA,oBAC/C,UAAA,EAAY,mBAAA;AAAA,oBACZ;AAAA,mBACD,CAAA;AACD,kBAAA,IAAI,KAAA,EAAO;AACT,oBAAA,mBAAA,EAAA;AAGA,oBAAA,OAAA,EAAA;AACA,oBAAA;AAAA,kBACF;AAAA,gBACF,SAAS,cAAA,EAAgB;AACvB,kBAAA,MAAA,EAAQ,QAAQ,CAAA,gCAAA,EAAmC,cAAc,CAAA,CAAA,EAAI,EAAE,OAAO,CAAA;AAAA,gBAChF;AAAA,cACF;AAEA,cAAA,IAAI,UAAU,UAAA,EAAY;AAC1B,cAAA;AAAA,YACF;AAGA,YAAA,MAAM,cAAc,YAAA,CAAa,KAAA;AACjC,YAAA,IAAI,WAAA,EAAa;AACf,cAAA,MAAM,cAAA,GAAiB,uBAAuB,KAAA,GAAQ,WAAA,GAAc,IAAI,KAAA,CAAM,MAAA,CAAO,WAAW,CAAC,CAAA;AACjG,cAAA,MAAA,EAAQ,QAAQ,uBAAA,EAAyB,EAAE,KAAA,EAAO,cAAA,EAAgB,OAAO,CAAA;AAEzE,cAAA,IAAI,gBAAA,EAAkB;AACpB,gBAAA,gBAAA,CAAiB,qBAAA,CAAsB,EAAE,KAAA,EAAO,cAAA,EAAgB,CAAA;AAAA,cAClE,WAAW,SAAA,EAAW;AACpB,gBAAA,SAAA,CAAU,KAAA,CAAM,EAAE,KAAA,EAAO,cAAA,EAAgB,CAAA;AAAA,cAC3C;AAKA,cAAA,MAAM,kBAAA,GAAqB,oBAAA,EAAsB,OAAA,KAAY,IAAA,IAAQ,eAAe,IAAA,KAAS,YAAA;AAC7F,cAAA,IAAI,kBAAA,EAAoB;AACtB,gBAAA,IAAI,MAAA,EAAQ;AACV,kBAAA,MAAM,eAAe,MAAA,EAAQ,KAAA,EAAO,EAAE,KAAA,EAAO,IAAI,CAAA;AAAA,gBACnD;AACA,gBAAA,MAAM,cAAA;AAAA,cACR;AAEA,cAAA,SAAA,GAAY,cAAA;AACZ,cAAA,IAAI,UAAU,UAAA,EAAY;AAC1B,cAAA;AAAA,YACF;AAQA,YAAA,IAAI,CAAC,kBAAkB,iBAAA,EAAmB;AACxC,cAAA,IAAI;AACF,gBAAA,MAAM,kBAAkB,qBAAA,CAAsB;AAAA,kBAC5C,MAAA,EAAQ,eAAA;AAAA,kBACR,KAAA,EAAO,YAAA;AAAA,kBACP,UAAA,EAAa,SAAA,CAAkB,gBAAA,EAAkB,MAAA,IAAU,CAAA;AAAA,kBAC3D,KAAA,EAAQ,SAAA,CAAkB,gBAAA,IAAoB,EAAC;AAAA,kBAC/C,QAAA;AAAA,kBACA,OAAA;AAAA,kBACA,WAAA;AAAA,kBACA,SAAA,EAAW,KAAA;AAAA,kBACX,UAAA,EAAa,UAAkB,mBAAA,IAAuB,CAAA;AAAA,kBACtD,cAAA;AAAA,kBACA,cAAA,EAAgB,gBAAA,EAAkB,iBAAA,EAAkB,IAAK,cAAA;AAAA,kBACzD,MAAA,EAAQ,iBAAA;AAAA,kBACR,WAAA,EAAa;AAAA,iBACd,CAAA;AAAA,cACH,SAAS,KAAA,EAAO;AACd,gBAAA,IAAI,iBAAiBK,0BAAA,EAAU;AAC7B,kBAAA,MAAA,EAAQ,OAAO,iDAAA,EAAmD;AAAA,oBAChE,QAAQ,KAAA,CAAM,OAAA;AAAA,oBACd,aAAa,KAAA,CAAM,WAAA;AAAA,oBACnB,KAAA,EAAO,MAAM,OAAA,EAAS;AAAA,mBACvB,CAAA;AACD,kBAAA,IAAI,MAAA,EAAQ;AACV,oBAAA,MAAM,cAAA,CAAe,QAAQ,KAAA,EAAO;AAAA,sBAClC,IAAA,EAAM,UAAA;AAAA,sBACN,KAAA;AAAA,sBACA,IAAA,EAAA,OAAA;AAAA,sBACA,OAAA,EAAS;AAAA,wBACP,aAAa,KAAA,CAAM,WAAA;AAAA,wBACnB,QAAQ,KAAA,CAAM,OAAA;AAAA,wBACd,KAAA,EAAO,MAAM,OAAA,EAAS,KAAA;AAAA,wBACtB,QAAA,EAAU,MAAM,OAAA,EAAS;AAAA;AAC3B,qBACD,CAAA;AAAA,kBACH;AACA,kBAAA,OAAO;AAAA,oBACL,gBAAA,EAAkB,YAAY,SAAA,EAAU;AAAA,oBACxC,IAAA,EAAM,UAAA,CAAW,IAAA,CAAK,EAAE,CAAA;AAAA,oBACxB,WAAW,EAAC;AAAA,oBACZ,UAAA,EAAY;AAAA,sBACV,MAAA,EAAQ,UAAA;AAAA,sBACR,QAAA;AAAA,sBACA,WAAA,EAAa;AAAA,qBACf;AAAA,oBACA,QAAA,EAAU;AAAA,sBACR,SAAS,YAAA,CAAa;AAAA,qBACxB;AAAA,oBACA,OAAO,UAAA,CAAW;AAAA,mBACpB;AAAA,gBACF;AACA,gBAAA,MAAA,EAAQ,KAAA,GAAQ,2CAA2C,KAAK,CAAA;AAChE,gBAAA,MAAM,KAAA;AAAA,cACR;AAAA,YACF;AAGA,YAAA,IAAI,UAAA,CAAW,MAAA,GAAS,CAAA,IAAK,SAAA,CAAU,SAAS,CAAA,EAAG;AACjD,cAAA,MAAM,QAAe,EAAC;AAEtB,cAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,gBAAA,KAAA,CAAM,IAAA,CAAK;AAAA,kBACT,IAAA,EAAM,MAAA;AAAA,kBACN,IAAA,EAAM,UAAA,CAAW,IAAA,CAAK,EAAE;AAAA,iBACzB,CAAA;AAAA,cACH;AAEA,cAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,gBAAA,KAAA,CAAM,IAAA,CAAK;AAAA,kBACT,IAAA,EAAM,iBAAA;AAAA,kBACN,cAAA,EAAgB;AAAA,oBACd,KAAA,EAAO,MAAA;AAAA,oBACP,YAAY,EAAA,CAAG,UAAA;AAAA,oBACf,UAAU,EAAA,CAAG,QAAA;AAAA,oBACb,MAAM,EAAA,CAAG;AAAA;AACX,iBACD,CAAA;AAAA,cACH;AAEA,cAAA,MAAM,gBAAA,GAAoC;AAAA,gBACxC,EAAA,EAAI,gBAAA;AAAA,gBACJ,IAAA,EAAM,WAAA;AAAA,gBACN,OAAA,EAAS;AAAA,kBACP,MAAA,EAAQ,CAAA;AAAA,kBACR;AAAA,iBACF;AAAA,gBACA,SAAA,sBAAe,IAAA;AAAK,eACtB;AAEA,cAAA,WAAA,CAAY,GAAA,CAAI,kBAAkB,UAAU,CAAA;AAK5C,cAAA,IAAI,aAAA,EAAe;AACjB,gBAAA,aAAA,CAAc,WAAA,GAAc,WAAA;AAAA,cAC9B;AAAA,YACF;AAGA,YAAA,MAAM,WAAA,GAAc,SAAA,CAAU,MAAA,GAAS,CAAA,IAAK,YAAA,KAAiB,MAAA;AAC7D,YAAA,MAAM,YAAA,GAAe,UAAU,MAAA,GAAS,CAAA;AAIxC,YAAA,IAAI,aAAA,EAAe,gBAAA,IAAoB,aAAA,CAAc,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAChF,cAAA,MAAM,gBAAA,GAAmB,IAAIF,iCAAA,CAAgB;AAAA,gBAC3C,iBAAiB,EAAC;AAAA,gBAClB,kBAAkB,aAAA,CAAc,gBAAA;AAAA,gBAChC,MAAA;AAAA,gBACA,SAAA,EAAW,UAAA,CAAW,SAAA,IAAa,UAAA,CAAW,OAAA;AAAA,gBAC9C,iBAAiB,aAAA,EAAe;AAAA,eACjC,CAAA;AAED,cAAA,MAAM,aAAA,GAAgB,SAAA,CAAU,GAAA,CAAI,CAAA,EAAA,MAAO;AAAA,gBACzC,UAAU,EAAA,CAAG,QAAA;AAAA,gBACb,YAAY,EAAA,CAAG,UAAA;AAAA,gBACf,MAAM,EAAA,CAAG;AAAA,eACX,CAAE,CAAA;AAEF,cAAA,MAAM,mBAAmB,MAAA,GACrB;AAAA,gBACE,MAAA,EAAQ,OAAO,IAAA,KAA2B;AACxC,kBAAA,MAAM,cAAA,CAAe,MAAA,EAAQ,KAAA,EAAO,IAAW,CAAA;AAAA,gBACjD;AAAA,eACF,GACA,MAAA;AAEJ,cAAA,IAAI;AACF,gBAAA,MAAM,iBAAiB,oBAAA,CAAqB;AAAA,kBAC1C,KAAA,EAAQ,SAAA,CAAkB,gBAAA,IAAoB,EAAC;AAAA,kBAC/C,QAAA,EAAU,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,EAAA,EAAG;AAAA,kBACjC,WAAA;AAAA,kBACA,UAAA,EAAa,SAAA,CAAkB,gBAAA,EAAkB,MAAA,IAAU,CAAA;AAAA,kBAC3D,YAAA;AAAA,kBACA,gBAAA,EAAkB,gBAAA;AAAA,kBAClB,SAAA,EAAW,aAAA,CAAc,MAAA,GAAS,CAAA,GAAI,aAAA,GAAgB,MAAA;AAAA,kBACtD,IAAA,EAAM,UAAA,CAAW,IAAA,CAAK,EAAE,CAAA;AAAA,kBACxB,KAAA;AAAA,kBACA,cAAA;AAAA,kBACA,MAAA,EAAQ;AAAA,iBACT,CAAA;AAAA,cACH,SAAS,KAAA,EAAO;AACd,gBAAA,IAAI,iBAAiBE,0BAAA,EAAU;AAE7B,kBAAA,IAAI,MAAA,EAAQ;AACV,oBAAA,MAAM,cAAA,CAAe,QAAQ,KAAA,EAAO;AAAA,sBAClC,IAAA,EAAM,UAAA;AAAA,sBACN,KAAA;AAAA,sBACA,IAAA,EAAA,OAAA;AAAA,sBACA,OAAA,EAAS;AAAA,wBACP,QAAQ,KAAA,CAAM,OAAA;AAAA,wBACd,aAAa,KAAA,CAAM,WAAA;AAAA,wBACnB,QAAA,EAAU,MAAM,OAAA,EAAS;AAAA;AAC3B,qBACD,CAAA;AAAA,kBACH;AACA,kBAAA,OAAO;AAAA,oBACL,gBAAA,EAAkB,YAAY,SAAA,EAAU;AAAA,oBACxC,IAAA,EAAM,EAAA;AAAA,oBACN,WAAW,EAAC;AAAA,oBACZ,UAAA,EAAY;AAAA,sBACV,MAAA,EAAQ,UAAA;AAAA,sBACR,UAAU,EAAC;AAAA,sBACX,WAAA,EAAa;AAAA,qBACf;AAAA,oBACA,QAAA,EAAU,EAAE,OAAA,EAAS,YAAA,CAAa,OAAA,EAAQ;AAAA,oBAC1C,OAAO,UAAA,CAAW;AAAA,mBACpB;AAAA,gBACF;AACA,gBAAA,MAAM,KAAA;AAAA,cACR;AAAA,YACF;AAYA,YAAA,IAAI,UAAU,uBAAA,EAAyB;AACrC,cAAA,IAAI,CAAC,YAAA,EAAc;AAKjB,gBAAA,MAAM,cAA+D,EAAC;AACtE,gBAAA,MAAM,WAAA,GAAc,UAAA,CAAW,IAAA,CAAK,EAAE,CAAA;AACtC,gBAAA,IAAI,WAAA,EAAa;AACf,kBAAA,WAAA,CAAY,KAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,aAAa,CAAA;AAAA,gBACtD;AACA,gBAAA,uBAAA,GAA0B;AAAA,kBACxB,GAAG,uBAAA;AAAA,kBACH,OAAA,EAAS;AAAA,oBACP,GAAG,uBAAA,CAAwB,OAAA;AAAA,oBAC3B,mBAAA,EAAqB;AAAA;AACvB,iBACF;AACA,gBAAA,MAAM,cAAA,CAAe,MAAA,EAAQ,KAAA,EAAO,uBAAuB,CAAA;AAC3D,gBAAA,uBAAA,GAA0B,IAAA;AAAA,cAC5B;AAAA,YAEF;AAIA,YAAA,MAAM,YAAA,GAAe,YAAA,GAAe,gBAAA,EAAkB,iBAAA,EAAkB,GAAI,MAAA;AAC5E,YAAA,MAAM,iBAAA,GAAoB,YAAA,GAAe,gBAAA,EAAkB,2BAAA,EAA4B,GAAI,MAAA;AAG3F,YAAA,MAAM,MAAA,GAA+B;AAAA,cACnC,gBAAA,EAAkB,YAAY,SAAA,EAAU;AAAA,cACxC,IAAA,EAAM,UAAA,CAAW,IAAA,CAAK,EAAE,CAAA;AAAA,cACxB,SAAA;AAAA,cACA,UAAA,EAAY;AAAA,gBACV,MAAA,EAAQ,YAAA;AAAA,gBACR,QAAA;AAAA,gBACA,WAAA;AAAA,gBACA,UAAA,EAAY,KAAA;AAAA,gBACZ,SAAS,WAAA,EAAa,OAAA;AAAA,gBACtB;AAAA,eACF;AAAA,cACA,QAAA,EAAU;AAAA,gBACR,IAAI,gBAAA,CAAiB,EAAA;AAAA,gBACrB,OAAA,EAAS,gBAAA,CAAiB,OAAA,IAAW,YAAA,CAAa,OAAA;AAAA,gBAClD,WAAW,gBAAA,CAAiB,SAAA,IAAA,iBAAa,IAAI,IAAA,IAAO,WAAA,EAAY;AAAA,gBAChE,gBAAA,EAAkB,gBAAA;AAAA,gBAClB,SAAS,WAAA,EAAa,OAAA;AAAA,gBACtB;AAAA,eACF;AAAA,cACA,OAAO,UAAA,CAAW,KAAA;AAAA;AAAA,cAElB,aAAA,EAAe,YAAA,GAAe,SAAA,EAAW,UAAA,IAAa,GAAI,MAAA;AAAA,cAC1D,YAAA;AAAA,cACA,iBAAA;AAAA;AAAA;AAAA,cAGA,uBAAA,EAAyB,eAAe,uBAAA,GAA0B;AAAA,aACpE;AAMA,YAAA,IAAI,CAAC,YAAA,EAAc;AAEjB,cAAA,MAAM,cAAA,GAAiB,kBAAkB,2BAAA,EAA4B;AACrE,cAAA,IAAI,cAAA,EAAgB;AAElB,gBAAA,MAAM,QAAA,GAAW,kBAAkB,iBAAA,EAAkB;AACrD,gBAAA,IAAI,YAAY,aAAA,EAAe;AAC7B,kBAAA,MAAM,eAAA,GAAkB,aAAA,CAAc,WAAA,CAAY,QAAQ,CAAA;AAC1D,kBAAA,eAAA,EAAiB,GAAA,CAAI;AAAA,oBACnB,MAAA,EAAQ;AAAA,sBACN,IAAA,EAAM,UAAA,CAAW,IAAA,CAAK,EAAE,CAAA;AAAA,sBACxB,WAAW;AAAC,qBACd;AAAA,oBACA,UAAA,EAAY;AAAA,sBACV,KAAA,EAAO,eAAe,MAAA,EAAQ,KAAA;AAAA,sBAC9B,YAAA,EAAc,eAAe,UAAA,EAAY,MAAA;AAAA,sBACzC,WAAA,EAAa,eAAe,UAAA,EAAY;AAAA;AAC1C,mBACD,CAAA;AAAA,gBACH;AAAA,cACF;AAAA,YACF;AAGA,YAAA,OAAO,MAAA;AAAA,UACT,SAAS,KAAA,EAAO;AAId,YAAA,IAAI,iBAAiBA,0BAAA,EAAU;AAC7B,cAAA,MAAM,KAAA;AAAA,YACR;AAEA,YAAA,SAAA,GAAY,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAQpE,YAAA,MAAM,kBAAA,GAAqB,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA;AACtD,YAAA,MAAM,gBAAA,GAAmB,oBAAoB,WAAA,IAAe,WAAA;AAC5D,YAAA,MAAM,OAAA,GAAU,gBAAA,EAAkB,OAAA,KAAY,IAAA,IAAQ,UAAU,IAAA,KAAS,YAAA;AACzE,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,MAAM,SAAA;AAAA,YACR;AAEA,YAAA,MAAM4B,QAAAA,GAAU,WAAW,MAAA,CAAO,OAAA;AAClC,YAAA,MAAA,EAAQ,KAAA,GAAQ,yBAAyBA,QAAO,CAAA,UAAA,EAAa,UAAU,CAAC,CAAA,CAAA,EAAI,UAAA,GAAa,CAAC,CAAA,CAAA,EAAI;AAAA,cAC5F,KAAA,EAAO,SAAA;AAAA,cACP,KAAA;AAAA,cACA,UAAA;AAAA,cACA;AAAA,aACD,CAAA;AAKD,YAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA;AACjD,YAAA,MAAM,aAAA,GAAgB,mBAAA,KAAwB,MAAA,IAAa,mBAAA,GAAsB,mBAAA;AACjF,YAAA,IAAI,aAAA,EAAe,eAAA,EAAiB,MAAA,IAAU,aAAA,EAAe;AAC3D,cAAA,IAAI;AACF,gBAAA,MAAM,MAAA,GAAS,IAAI9B,iCAAA,CAAgB;AAAA,kBACjC,eAAA,EAAiB,aAAA,CAAc,eAAA,IAAmB,EAAC;AAAA,kBACnD,gBAAA,EAAkB,aAAA,CAAc,gBAAA,IAAoB,EAAC;AAAA,kBACrD,iBAAiB,aAAA,CAAc,eAAA;AAAA,kBAC/B,MAAA;AAAA,kBACA,SAAA,EAAW,UAAA,CAAW,SAAA,IAAa,UAAA,CAAW,OAAA;AAAA,kBAC9C,iBAAiB,aAAA,CAAc;AAAA,iBAChC,CAAA;AACD,gBAAA,MAAM,kBAAA,GAAqB,IAAIH,6BAAA,EAAY;AAC3C,gBAAA,kBAAA,CAAmB,WAAA,CAAY,WAAW,gBAAgB,CAAA;AAC1D,gBAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,OAAO,kBAAA,CAAmB;AAAA,kBAChD,KAAA,EAAO,SAAA;AAAA,kBACP,QAAA,EAAU,kBAAA,CAAmB,GAAA,CAAI,GAAA,CAAI,EAAA,EAAG;AAAA,kBACxC,WAAA,EAAa,kBAAA;AAAA,kBACb,UAAA,EAAa,UAAkB,SAAA,IAAa,CAAA;AAAA,kBAC5C,KAAA,EAAQ,SAAA,CAAkB,gBAAA,IAAoB,EAAC;AAAA,kBAC/C,UAAA,EAAY,mBAAA;AAAA,kBACZ;AAAA,iBACD,CAAA;AACD,gBAAA,IAAI,KAAA,EAAO;AACT,kBAAA,mBAAA,EAAA;AAEA,kBAAA,OAAA,EAAA;AACA,kBAAA;AAAA,gBACF;AAAA,cACF,SAAS,cAAA,EAAgB;AACvB,gBAAA,MAAA,EAAQ,QAAQ,CAAA,gCAAA,EAAmC,cAAc,CAAA,CAAA,EAAI,EAAE,OAAO,CAAA;AAAA,cAChF;AAAA,YACF;AAEA,YAAA,IAAI,WAAW,UAAA,EAAY;AACzB,cAAA,MAAA,EAAQ,QAAQ,CAAA,4BAAA,EAA+BiC,QAAO,CAAA,mBAAA,CAAA,EAAuB,EAAE,OAAO,CAAA;AACtF,cAAA;AAAA,YACF;AAEA,YAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,GAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,OAAO,CAAA,EAAG,GAAK,CAAA;AAC3D,YAAA,MAAA,EAAQ,KAAA,GAAQ,kBAAkBA,QAAO,CAAA,OAAA,EAAU,OAAO,CAAA,EAAA,CAAA,EAAM,EAAE,KAAA,EAAO,OAAA,EAAS,CAAA;AAClF,YAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,UAC3D;AAAA,QACF;AAAA,MACF;AAKA,MAAA,MAAM,UAAA,GACJ,SAAA,IAAa,IAAI,KAAA,CAAM,0EAA0E,CAAA;AAInG,MAAA,oBAAA,CAAqB,OAAO,UAAU,CAAA;AAGtC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,cAAA,CAAe,QAAQ,KAAA,EAAO;AAAA,UAClC,IAAA,EAAM,OAAA;AAAA,UACN,KAAA;AAAA,UACA,IAAA,EAAA,OAAA;AAAA,UACA,OAAA,EAAS,EAAE,KAAA,EAAO,UAAA;AAAW,SAC9B,CAAA;AAGD,QAAA,MAAM,cAAA,CAAe,QAAQ,KAAA,EAAO;AAAA,UAClC,IAAA,EAAM,aAAA;AAAA,UACN,KAAA;AAAA,UACA,IAAA,EAAA,OAAA;AAAA,UACA,OAAA,EAAS;AAAA,YACP,UAAA,EAAY;AAAA,cACV,MAAA,EAAQ,OAAA;AAAA,cACR,WAAA,EAAa;AAAA,aACf;AAAA,YACA,MAAA,EAAQ;AAAA,cACN,OAAO,EAAE,WAAA,EAAa,GAAG,YAAA,EAAc,CAAA,EAAG,aAAa,CAAA;AAAE,aAC3D;AAAA,YACA,UAAU;AAAC;AACb,SACD,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,OAAA,GAAU,SAAA,CAAU,CAAC,CAAA,EAAG,EAAA,IAAM,SAAA;AACpC,MAAA,OAAO;AAAA,QACL,gBAAA,EAAkB,YAAY,SAAA,EAAU;AAAA,QACxC,IAAA,EAAM,EAAA;AAAA,QACN,WAAW,EAAC;AAAA,QACZ,UAAA,EAAY;AAAA,UACV,MAAA,EAAQ,OAAA;AAAA,UACR,UAAU,EAAC;AAAA,UACX,WAAA,EAAa;AAAA,SACf;AAAA,QACA,QAAA,EAAU,EAAE,OAAA,EAAQ;AAAA,QACpB,OAAO,UAAA,CAAW;AAAA,OACpB;AAAA,IACF;AAAA,GACD,CAAA;AACH;ACl/CA,IAAM,0BAAA,GAA6BnB,MAAE,MAAA,CAAO;AAAA,EAC1C,UAAA,EAAYA,MAAE,MAAA,EAAO;AAAA,EACrB,QAAA,EAAUA,MAAE,MAAA,EAAO;AAAA,EACnB,IAAA,EAAMA,MAAE,MAAA,CAAOA,KAAAA,CAAE,QAAO,EAAGA,KAAAA,CAAE,KAAK,CAAA;AAAA,EAClC,gBAAA,EAAkBA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAUA,KAAAA,CAAE,GAAA,EAAK,CAAA,CAAE,QAAA,EAAS;AAAA,EACzD,gBAAA,EAAkBA,KAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EACvC,MAAA,EAAQA,KAAAA,CAAE,GAAA,EAAI,CAAE,QAAA,EAAS;AAAA,EACzB,WAAA,EAAaA,MAAE,KAAA,CAAMA,KAAAA,CAAE,QAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,EAAS;AAAA;AAAA,EAErD,YAAA,EAAcA,KAAAA,CAAE,GAAA,EAAI,CAAE,QAAA;AACxB,CAAC,CAAA;AAKD,IAAM,2BAAA,GAA8B,2BAA2B,MAAA,CAAO;AAAA,EACpE,MAAA,EAAQA,KAAAA,CAAE,GAAA,EAAI,CAAE,QAAA,EAAS;AAAA,EACzB,KAAA,EAAOA,MACJ,MAAA,CAAO;AAAA,IACN,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA,IACf,OAAA,EAASA,MAAE,MAAA,EAAO;AAAA,IAClB,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAC5B,EACA,QAAA,EAAS;AAAA;AAAA;AAAA,EAGZ,QAAA,EAAUA,MACP,MAAA,CAAO;AAAA,IACN,EAAA,EAAIA,MAAE,MAAA,EAAO;AAAA,IACb,QAAA,EAAUA,MAAE,OAAA,EAAQ;AAAA,IACpB,MAAA,EAAQA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAC7B,EACA,QAAA;AACL,CAAC,CAAA;AAOD,eAAe,6BAAA,CAA8B;AAAA,EAC3C,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EASG;AACD,EAAA,IAAI,CAAC,gBAAA,IAAoB,CAAC,WAAA,IAAe,CAAC,QAAA,EAAU;AAClD,IAAA;AAAA,EACF;AAEA,EAAA,IAAI;AAEF,IAAA,IAAI,MAAA,IAAU,CAAC,YAAA,IAAgB,UAAA,EAAY;AACzC,MAAA,MAAM,SAAS,MAAM,MAAA,CAAO,aAAA,GAAgB,EAAE,UAAU,CAAA;AACxD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,OAAO,YAAA,GAAe;AAAA,UAC1B,QAAA;AAAA,UACA,UAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH;AACA,MAAA,eAAA,IAAkB;AAAA,IACpB;AAGA,IAAA,MAAM,gBAAA,CAAiB,aAAA,CAAc,WAAA,EAAa,QAAA,EAAU,YAAY,CAAA;AAAA,EAC1E,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AASA,eAAe,oCACb,KAAA,EACA,aAAA,EACA,QACA,KAAA,EACA,SAAA,EACA,QACA,WAAA,EAC2B;AAC3B,EAAA,IAAI,CAAC,aAAA,EAAe,gBAAA,EAAkB,MAAA,IAAU,CAAC,cAAc,eAAA,EAAiB;AAC9E,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAIX,iCAAA,CAAgB;AAAA,MACjC,iBAAiB,EAAC;AAAA,MAClB,kBAAkB,aAAA,CAAc,gBAAA;AAAA,MAChC,MAAA;AAAA,MACA,SAAA;AAAA,MACA,iBAAiB,aAAA,CAAc;AAAA,KAChC,CAAA;AAED,IAAA,MAAM;AAAA,MACJ,IAAA,EAAM,SAAA;AAAA,MACN,OAAA;AAAA,MACA,MAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAM,MAAA,CAAO,WAAA;AAAA,MACf,KAAA;AAAA,MACA,aAAA,CAAc,eAAA;AAAA,MACd,MAAA;AAAA;AAAA,MACA,aAAA,CAAc,cAAA;AAAA,MACd,WAAA;AAAA,MACA,CAAA;AAAA,MACA,MAAA,GACI;AAAA,QACE,MAAA,EAAQ,OAAO,IAAA,KAA2B;AACxC,UAAA,MAAM,cAAA,CAAe,MAAA,EAAQ,KAAA,EAAO,IAAiB,CAAA;AAAA,QACvD;AAAA,OACF,GACA;AAAA,KACN;AAEA,IAAA,IAAI,OAAA,EAAS;AAEX,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,cAAA,CAAe,QAAQ,KAAA,EAAO;AAAA,UAClC,IAAA,EAAM,UAAA;AAAA,UACN,OAAA,EAAS;AAAA,YACP,QAAQ,MAAA,IAAU,kCAAA;AAAA,YAClB,OAAO,eAAA,EAAiB,KAAA;AAAA,YACxB,UAAU,eAAA,EAAiB,QAAA;AAAA,YAC3B;AAAA;AACF,SACY,CAAA;AAAA,MAChB;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAQ,SAAA,IAA2B,IAAA;AAAA,EACrC,SAAS,KAAA,EAAO;AACd,IAAA,MAAA,EAAQ,IAAA,GAAO,CAAA,sDAAA,EAAyD,KAAK,CAAA,CAAE,CAAA;AAE/E,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAkBO,SAAS,yBAAA,GAA4B;AAC1C,EAAA,OAAOY,4BAAA,CAAW;AAAA,IAChB,IAAI,cAAA,CAAe,SAAA;AAAA,IACnB,WAAA,EAAa,0BAAA;AAAA,IACb,YAAA,EAAc,2BAAA;AAAA,IACd,OAAA,EAAS,OAAM,MAAA,KAAU;AACvB,MAAA,MAAM,EAAE,WAAW,MAAA,EAAQ,OAAA,EAAS,YAAY,kBAAA,EAAoB,cAAA,EAAgB,aAAY,GAAI,MAAA;AAGpG,MAAA,MAAM,MAAA,GAAU,OAAeC,+BAAa,CAAA;AAE5C,MAAA,MAAM,UAAA,GAAa,SAAA;AACnB,MAAA,MAAM,EAAE,YAAY,QAAA,EAAU,IAAA,EAAM,SAAS,gBAAA,EAAkB,MAAA,EAAQ,aAAY,GAAI,UAAA;AAMvF,MAAA,IAAI,kBAAA,GAA0B,MAAA;AAC9B,MAAA,IAAI,IAAA,GAAY,OAAA;AAChB,MAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,IAAA,EAAM;AACnD,QAAA,MAAM,EAAE,UAAA,EAAY,mBAAA,EAAqB,GAAG,eAAc,GAAI,OAAA;AAC9D,QAAA,IAAA,GAAO,aAAA;AACP,QAAA,kBAAA,GAAqB,mBAAA;AAAA,MACvB;AACA,MAAA,MAAM,aAAa,kBAAA,IAAsB,kBAAA;AAGzC,MAAA,MAAM,WAAW,WAAA,EAYd;AAEH,MAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,YAAA,EAAc,OAAM,GAAI,QAAA;AAChD,MAAA,MAAM,MAAA,GAAU,QAAgB,SAAA,IAAY;AAK5C,MAAA,MAAM,mBAAA,GAAsB,CAAC,IAAA,KAAsE;AACjG,QAAA,IAAI;AACF,UAAA,MAAM,MAAO,MAAA,EAA+B,aAAA,EAAe,mBAAA,CAAoB,EAAE,gBAAgB,CAAA;AACjG,UAAA,IAAI,CAAC,GAAA,EAAK;AACV,UAAA,MAAMkB,OAAAA,GAAS;AAAA,YACb,MAAA,EAAQ,WAAA;AAAA,YACR,QAAQ,IAAA,CAAK,MAAA;AAAA,YACb,UAAU,IAAA,CAAK,QAAA;AAAA,YACf,YAAY,IAAA,CAAK;AAAA,WACnB;AAGA,UAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA;AACvC,UAAA,MAAM,aAAA,GAAgB,GAAA,EAAK,mBAAA,IAAuB,QAAA,CAAS,aAAA;AAC3D,UAAA,MAAM,aAAA,GAAgB,GAAA,EAAK,mBAAA,IAAuB,QAAA,CAAS,aAAA;AAC3D,UAAA,IAAI,WAAW,YAAA,EAAc;AAC3B,YAAA,GAAA,CAAI,WAAA,CAAY,WAAW,YAAiD,CAAA,EAAG,IAAI,EAAE,MAAA,EAAAA,SAAQ,CAAA;AAAA,UAC/F;AACA,UAAA,IAAI,aAAA,EAAe;AACjB,YAAA,GAAA,CAAI,YAAY,aAAwD,CAAA,EAAG,IAAI,EAAE,MAAA,EAAAA,SAAQ,CAAA;AAAA,UAC3F;AACA,UAAA,IAAI,aAAA,EAAe;AACjB,YAAA,GAAA,CAAI,YAAY,aAAiD,CAAA,EAAG,IAAI,EAAE,MAAA,EAAAA,SAAQ,CAAA;AAAA,UACpF;AAAA,QACF,SAAS,KAAA,EAAO;AAEd,UAAA,MAAA,EAAQ,IAAA,GAAO,CAAA,+CAAA,EAAkD,KAAK,CAAA,CAAE,CAAA;AAAA,QAC1E;AAAA,MACF,CAAA;AAGA,MAAA,IAAI,gBAAA,IAAoB,WAAW,MAAA,EAAW;AAC5C,QAAA,OAAO;AAAA,UACL,GAAG,UAAA;AAAA,UACH,MAAA,EAAQ;AAAA,SACV;AAAA,MACF;AAOA,MAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA;AACjD,MAAA,IAAI,IAAA,GAAO,aAAA,EAAe,KAAA,GAAQ,QAAQ,CAAA;AAC1C,MAAA,IAAI,WAAA;AAEJ,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,IAAA,GAAOC,wCAAA,CAAuB,aAAA,EAAe,KAAA,EAAc,QAAQ,CAAA;AAAA,MACrE;AAEA,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,IAAA,GAAO,OAAO,MAAA,CAAO,aAAA,EAAe,KAAA,IAAS,EAAE,CAAA,CAAE,IAAA;AAAA,UAC/C,CAAC,MAAW,CAAA,IAAK,OAAO,MAAM,QAAA,IAAY,IAAA,IAAQ,CAAA,IAAK,CAAA,CAAE,EAAA,KAAO;AAAA,SAClE;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,IAAA,GAAO,WAAA,CAAY,UAAU,MAAgB,CAAA;AAAA,MAC/C;AAEA,MAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,QAAA,WAAA,GAAe,OAAkB,SAAA,IAAY;AAC7C,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,IAAA,GAAOA,wCAAA,CAAuB,aAAoB,QAAQ,CAAA;AAC1D,UAAA,IAAI,CAAC,IAAA,EAAM;AACT,YAAA,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA,CAAE,IAAA;AAAA,cAChC,CAAC,MAAW,CAAA,IAAK,OAAO,MAAM,QAAA,IAAY,IAAA,IAAQ,CAAA,IAAK,CAAA,CAAE,EAAA,KAAO;AAAA,aAClE;AAAA,UACF;AAAA,QACF;AAAA,MACF;AASA,MAAA,MAAM,UAAU,aAAA,EAAe,KAAA,GAAQ,QAAQ,CAAA,GAC3C,WACC,MAAA,CAAO,OAAA,CAAQ,aAAA,EAAe,KAAA,IAAS,EAAE,CAAA,CAAE,KAAK,CAAC,GAAG,cAAc,CAAA,KAAM,cAAA,KAAmB,IAAI,IAAI,CAAC,CAAA,IACrG,OAAO,OAAA,CAAQ,WAAA,IAAe,EAAE,CAAA,CAAE,IAAA,CAAK,CAAC,GAAG,cAAc,MAAM,cAAA,KAAmB,IAAI,IAAI,CAAC,CAAA;AAC/F,MAAA,MAAM,oBAAA,GAAuB,WAAA,KAAgB,IAAA,GAAO,MAAA,GAAa,eAAe,YAAA,CAAa,WAAA;AAC7F,MAAA,MAAM,gBAAgB,OAAA,IAAW,QAAA;AACjC,MAAA,MAAM,wBAAwB,oBAAA,KAAyB,MAAA,IAAa,CAAC,oBAAA,CAAqB,SAAS,aAAa,CAAA;AAEhH,MAAA,IAAI,CAAC,QAAQ,qBAAA,EAAuB;AAClC,QAAA,MAAM,qBAAqB,oBAAA,IAAwB,MAAA,CAAO,KAAK,aAAA,EAAe,KAAA,IAAS,EAAE,CAAA;AACzF,QAAA,MAAM,iBAAA,GACJ,mBAAmB,MAAA,GAAS,CAAA,GAAI,qBAAqB,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GAAK,EAAA;AACzF,QAAA,MAAM,KAAA,GAAQ;AAAA,UACZ,IAAA,EAAM,mBAAA;AAAA,UACN,OAAA,EAAS,CAAA,MAAA,EAAS,QAAQ,CAAA,YAAA,EAAe,iBAAiB,CAAA,uFAAA;AAAA,SAC5D;AACA,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAM,cAAA,CAAe,QAAQ,KAAA,EAAO;AAAA,YAClC,IAAA,EAAM,YAAA;AAAA,YACN,KAAA;AAAA,YACA,IAAA,EAAA,OAAA;AAAA,YACA,OAAA,EAAS,EAAE,UAAA,EAAY,QAAA,EAAU,MAAM,KAAA;AAAM,WAC9C,CAAA;AAAA,QACH;AACA,QAAA,OAAO;AAAA,UACL,GAAG,UAAA;AAAA,UACH;AAAA,SACF;AAAA,MACF;AAGA,MAAA,MAAM,mBAAmB,aAAA,EAAe,gBAAA;AACxC,MAAA,MAAM,SAAS,aAAA,EAAe,MAAA;AAC9B,MAAA,MAAM,YAAY,aAAA,EAAe,SAAA;AACjC,MAAA,IAAI,YAAA,GAAe,OAAO,YAAA,IAAgB,KAAA;AAK1C,MAAA,IAAI,WAAA;AAGJ,MAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA;AACjD,MAAA,IAAI,eAAe,WAAA,EAAa;AAC9B,QAAA,WAAA,GAAc,aAAA,CAAc,WAAA;AAAA,MAC9B;AAEA,MAAA,MAAM,UAAU,YAAY;AAC1B,QAAA,MAAM,6BAAA,CAA8B;AAAA,UAClC,gBAAA;AAAA,UACA,WAAA;AAAA,UACA,MAAA;AAAA,UACA,UAAU,KAAA,EAAO,QAAA;AAAA,UACjB,YAAY,KAAA,EAAO,UAAA;AAAA,UACnB,cAAc,KAAA,EAAO,YAAA;AAAA,UACrB,YAAA;AAAA,UACA,iBAAiB,MAAM;AACrB,YAAA,YAAA,GAAe,IAAA;AAAA,UACjB;AAAA,SACD,CAAA;AAAA,MACH,CAAA;AAMA,MAAA,MAAM,8BAA8B,aAAA,EAAe,mBAAA;AACnD,MAAA,MAAM,4BAAA,GACJ,2BAAA,KAAgC,MAAA,GAAY,2BAAA,GAA8B,YAAA,CAAa,mBAAA;AACzF,MAAA,MAAM,gBAAA,GAAmB,MAAM,oBAAA,CAAqB,IAAA,EAAM,8BAA8B,IAAA,EAAM;AAAA,QAC5F,QAAA;AAAA,QACA,cAAA,EAAgB,aAAA,EAAe,cAAA,GAC3B,MAAA,CAAO,WAAA;AAAA,UACL,CAAC,GAAG,aAAA,CAAc,cAAA,CAAe,OAAA,EAAS,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,GAAG,CAAA,KAAM,QAAQ,8BAA8B;AAAA,SACtG,GACA,MAAA;AAAA,QACJ,WAAW,aAAA,EAAe;AAAA,OAC3B,CAAA;AAMD,MAAA,MAAM,eAAA,GAAkB,CAAC,IAAA,KAInB;AACJ,QAAA,IAAI,CAAC,WAAA,EAAa;AAClB,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,IAAA,KAAS,YAAA,GAAe,gBAAA,GAAmB,sBAAA;AACpE,QAAA,MAAM,gBAAA,GAAmB,WAAA,CAAY,GAAA,CAAI,QAAA,CAAS,EAAA,EAAG;AACrD,QAAA,MAAM,oBAAA,GAAuB,CAAC,GAAG,gBAAgB,CAAA,CAAE,OAAA,EAAQ,CAAE,IAAA,CAAK,CAAA,GAAA,KAAO,GAAA,CAAI,IAAA,KAAS,WAAW,CAAA;AACjG,QAAA,IAAI,CAAC,sBAAsB,OAAA,EAAS;AAEpC,QAAA,IAAI,QAAA;AACJ,QAAA,IACE,OAAO,qBAAqB,OAAA,CAAQ,QAAA,KAAa,YACjD,oBAAA,CAAqB,OAAA,CAAQ,aAAa,IAAA,EAC1C;AACA,UAAA,QAAA,GAAW,qBAAqB,OAAA,CAAQ,QAAA;AAAA,QAC1C,CAAA,MAAO;AACL,UAAA,QAAA,GAAW,EAAC;AACZ,UAAA,oBAAA,CAAqB,QAAQ,QAAA,GAAW,QAAA;AAAA,QAC1C;AACA,QAAA,QAAA,CAAS,WAAW,CAAA,GAAI,QAAA,CAAS,WAAW,KAAK,EAAC;AAClD,QAAA,QAAA,CAAS,WAAW,CAAA,CAAE,UAAU,CAAA,GAAI;AAAA,UAClC,UAAA;AAAA,UACA,QAAA;AAAA,UACA,IAAA;AAAA,UACA,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,KAAA;AAAA,UACA,GAAI,KAAK,IAAA,KAAS,YAAA,GAAe,EAAE,cAAA,EAAgB,IAAA,CAAK,cAAA,EAAe,GAAI,EAAC;AAAA,UAC5E,GAAI,KAAK,YAAA,GAAe,EAAE,cAAc,IAAA,CAAK,YAAA,KAAiB;AAAC,SACjE;AAAA,MACF,CAAA;AAKA,MAAA,MAAM,kBAAA,GAAqB,OAAO,IAAA,KAAoC;AACpE,QAAA,IAAI,CAAC,WAAA,EAAa;AAClB,QAAA,MAAM,WAAA,GAAc,IAAA,KAAS,YAAA,GAAe,gBAAA,GAAmB,sBAAA;AAC/D,QAAA,MAAM,WAAA,GAAc,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,EAAA,EAAG;AAC3C,QAAA,MAAM,oBAAA,GAAuB,CAAC,GAAG,WAAW,EAAE,OAAA,EAAQ,CAAE,KAAK,CAAA,GAAA,KAAO;AAClE,UAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AACpB,UAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,UAAA,MAAMC,KAAAA,GACJ,OAAO,OAAA,CAAQ,QAAA,KAAa,YAAY,OAAA,CAAQ,QAAA,KAAa,IAAA,GACxD,OAAA,CAAQ,QAAA,GACT,MAAA;AACN,UAAA,OACE,CAAC,CAACA,KAAAA,GAAO,WAAW,IAAI,UAAU,CAAA,IAClC,MAAA,CAAO,MAAA,CAAOA,KAAAA,GAAO,WAAW,CAAA,IAAK,EAAE,CAAA,CAAE,IAAA;AAAA,YACvC,CAAC,CAAA,KAAW,CAAA,EAAG,UAAA,KAAe,UAAA,IAAc,GAAG,QAAA,KAAa;AAAA,WAC9D;AAAA,QAEJ,CAAC,CAAA;AACD,QAAA,IAAI,CAAC,sBAAsB,OAAA,EAAS;AACpC,QAAA,MAAM,IAAA,GACJ,OAAO,oBAAA,CAAqB,OAAA,CAAQ,QAAA,KAAa,QAAA,IAAY,oBAAA,CAAqB,OAAA,CAAQ,QAAA,KAAa,IAAA,GAClG,oBAAA,CAAqB,OAAA,CAAQ,QAAA,GAC9B,MAAA;AACN,QAAA,IAAI,CAAC,IAAA,GAAO,WAAW,CAAA,EAAG;AAE1B,QAAA,MAAM,OAAA,GAAU,KAAK,WAAW,CAAA;AAChC,QAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,UAAU,CAAA,GAC1B,aACC,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,OAAA,CAAQ,CAAC,GAAG,UAAA,KAAe,UAAU,CAAA,IACrE,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,IAAA,CAAK,OAAK,OAAA,CAAQ,CAAC,CAAA,EAAG,QAAA,KAAa,QAAQ,CAAA,KAC/D,OAAA,CAAQ,QAAQ,IAAI,QAAA,GAAW,MAAA,CAAA;AACpC,QAAA,IAAI,GAAA,EAAK;AACP,UAAA,OAAO,QAAQ,GAAG,CAAA;AAClB,UAAA,IAAI,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,WAAW,CAAA,EAAG;AACrC,YAAA,OAAO,KAAK,WAAW,CAAA;AAAA,UACzB;AAAA,QACF;AAEA,QAAA,MAAM,OAAA,EAAQ;AAAA,MAChB,CAAA;AAEA,MAAA,IAAI,gBAAA,IAAoB,CAAC,UAAA,EAAY;AACnC,QAAA,MAAM,YAAA,GAAe,KAAK,SAAA,CAAU;AAAA,UAClC,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,YACV,QAAA,EAAU,EAAE,IAAA,EAAM,SAAA;AAAU,WAC9B;AAAA,UACA,QAAA,EAAU,CAAC,UAAU;AAAA,SACtB,CAAA;AAGD,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAM,cAAA,CAAe,QAAQ,KAAA,EAAO;AAAA,YAClC,IAAA,EAAM,oBAAA;AAAA,YACN,KAAA;AAAA,YACA,IAAA,EAAA,OAAA;AAAA,YACA,OAAA,EAAS,EAAE,UAAA,EAAY,QAAA,EAAU,MAAM,YAAA;AAAa,WACrD,CAAA;AAAA,QACH;AAGA,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAM,kBAAA,CAAmB,QAAQ,KAAA,EAAO;AAAA,YACtC,UAAA;AAAA,YACA,QAAA;AAAA,YACA,IAAA;AAAA,YACA,IAAA,EAAM,UAAA;AAAA,YACN;AAAA,WACD,CAAA;AAAA,QACH;AAGA,QAAA,eAAA,CAAgB,EAAE,IAAA,EAAM,UAAA,EAAY,YAAA,EAAc,CAAA;AAGlD,QAAA,MAAM,OAAA,EAAQ;AAGd,QAAA,mBAAA,CAAoB,EAAE,UAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,YAAY,CAAA;AAGhE,QAAA,OAAO,OAAA;AAAA,UACL;AAAA,YACE,IAAA,EAAM,UAAA;AAAA,YACN,UAAA;AAAA,YACA,QAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,YACE,WAAA,EAAa;AAAA;AACf,SACF;AAAA,MACF;AAMA,MAAA,IACE,gBAAA,IACA,cACA,OAAO,UAAA,KAAe,YACtB,UAAA,KAAe,IAAA,IACf,cAAc,UAAA,EACd;AAEA,QAAA,MAAM,mBAAmB,UAAU,CAAA;AAEnC,QAAA,IAAI,CAAE,WAAqC,QAAA,EAAU;AAInD,UAAA,OAAO;AAAA,YACL,GAAG,UAAA;AAAA,YACH,QAAA,EAAU;AAAA,cACR,EAAA,EAAI,UAAA;AAAA,cACJ,QAAA,EAAU,KAAA;AAAA,cACV,MAAA,EAAQ;AAAA;AACV,WACF;AAAA,QACF;AAAA,MACF;AAIA,MAAA,MAAM,gBACJ,gBAAA,IACA,UAAA,IACA,OAAO,UAAA,KAAe,QAAA,IACtB,eAAe,IAAA,IACd,UAAA,CAAsC,aAAa,IAAA,GAC/C,EAAE,UAAU,EAAE,EAAA,EAAI,YAAY,QAAA,EAAU,IAAA,IAAgB,GACzD,MAAA;AAON,MAAA,MAAM,wBAAA,GACJ,UAAA,IACA,OAAO,UAAA,KAAe,QAAA,IACtB,eAAe,IAAA,KACd,gBAAA,GAAmB,EAAE,UAAA,IAAc,UAAA,CAAA,GAAc,IAAA,CAAA;AAIpD,MAAA,IAAI,wBAAA,EAA0B;AAC5B,QAAA,MAAM,mBAAmB,YAAY,CAAA;AAAA,MACvC;AAGA,MAAA,MAAM,YAAY,aAAA,EAAe,qBAAA;AACjC,MAAA,MAAM,WAAW,aAAA,EAAe,qBAAA;AAChC,MAAA,MAAM,eAAgB,IAAA,CAAa,gBAAA;AACnC,MAAA,MAAM,cAAA,GACJ,OAAO,IAAA,KAAS,QAAA,IAAY,SAAS,IAAA,IAAQ,aAAA,IAAiB,IAAA,GAAQ,IAAA,CAAa,WAAA,GAAc,MAAA;AAGnG,MAAA,MAAM,WAAA,GAAc,EAAE,GAAG,IAAA,EAAK;AAC9B,MAAA,IAAI,iBAAiB,WAAA,EAAa;AAChC,QAAA,OAAQ,WAAA,CAAoB,WAAA;AAAA,MAC9B;AAGA,MAAA,IAAI,QAAQ,kBAAA,IAAsB,IAAA,IAAQ,OAAQ,IAAA,CAAa,qBAAqB,UAAA,EAAY;AAC9F,QAAA,IAAI;AACF,UAAA,MAAO,KAAa,gBAAA,CAAiB;AAAA,YACnC,UAAA;AAAA,YACA,KAAA,EAAO,WAAA;AAAA,YACP,QAAA,EAAU,cAAc,WAAA,CAAY,GAAA,CAAI,MAAM,IAAA,CAAK,KAAA,KAAU;AAAC,WAC/D,CAAA;AAAA,QACH,SAAS,SAAA,EAAW;AAClB,UAAA,MAAA,EAAQ,KAAA,GAAQ,kCAAkC,SAAS,CAAA;AAAA,QAC7D;AAAA,MACF;AAGA,MAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,QAAA,OAAO;AAAA,UACL,GAAG,UAAA;AAAA,UACH,MAAA,EAAQ,MAAA;AAAA,UACR,GAAI,iBAAiB;AAAC,SACxB;AAAA,MACF;AAIA,MAAA,MAAM,gBAAiB,MAAA,EAA+B,aAAA,EAAe,mBAAA,CAAoB,EAAE,gBAAgB,CAAA;AAC3G,MAAA,MAAM,QAAA,GACJ,WAAW,YAAA,IAAgB,aAAA,GACvB,cAAc,WAAA,CAAY,UAAA,CAAW,YAAiD,CAAA,GACtF,MAAA;AACN,MAAA,MAAM,kBAAA,GAAqB,QAAA,GAAW,EAAE,WAAA,EAAa,UAAS,GAAI,MAAA;AAMlE,MAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,MAAA,MAAM,WAAA,GAAc;AAAA,QAClB,UAAA;AAAA,QACA,UAAU,EAAC;AAAA,QACX,SAAA;AAAA,QACA,cAAA;AAAA,QACA,cAAA,EAAgB,kBAAA;AAAA;AAAA;AAAA,QAGhB,OAAO,YAAA,EAAc,KAAA;AAAA,QACrB,UAAA,EAAY,2BAA2B,UAAA,GAAa,MAAA;AAAA;AAAA;AAAA,QAGpD,YAAA,EAAc,MAAA,GACV,OAAO,KAAA,KAAe;AACpB,UAAA,MAAM,cAAA,CAAe,MAAA,EAAQ,KAAA,EAAO,KAAkB,CAAA;AAAA,QACxD,CAAA,GACA,MAAA;AAAA;AAAA,QAGJ,OAAA,EAAS,OAAO,cAAA,EAAqB,cAAA,KAAoC;AACvE,UAAA,YAAA,GAAe,IAAA;AACf,UAAA,IAAI,gBAAgB,mBAAA,EAAqB;AAEvC,YAAA,MAAM,oBAAA,GAAuB,KAAK,SAAA,CAAU;AAAA,cAC1C,IAAA,EAAM,QAAA;AAAA,cACN,UAAA,EAAY;AAAA,gBACV,QAAA,EAAU,EAAE,IAAA,EAAM,SAAA;AAAU,eAC9B;AAAA,cACA,QAAA,EAAU,CAAC,UAAU;AAAA,aACtB,CAAA;AAED,YAAA,IAAI,MAAA,EAAQ;AACV,cAAA,MAAM,cAAA,CAAe,QAAQ,KAAA,EAAO;AAAA,gBAClC,IAAA,EAAM,oBAAA;AAAA,gBACN,KAAA;AAAA,gBACA,IAAA,EAAA,OAAA;AAAA,gBACA,SAAS,EAAE,UAAA,EAAY,QAAA,EAAU,IAAA,EAAM,cAAc,oBAAA;AAAqB,eAC3E,CAAA;AAAA,YACH;AAEA,YAAA,IAAI,MAAA,EAAQ;AACV,cAAA,MAAM,kBAAA,CAAmB,QAAQ,KAAA,EAAO;AAAA,gBACtC,UAAA;AAAA,gBACA,QAAA;AAAA,gBACA,IAAA;AAAA,gBACA,IAAA,EAAM,UAAA;AAAA,gBACN,YAAA,EAAc;AAAA,eACf,CAAA;AAAA,YACH;AAGA,YAAA,eAAA,CAAgB,EAAE,IAAA,EAAM,UAAA,EAAY,YAAA,EAAc,sBAAsB,CAAA;AAExE,YAAA,MAAM,OAAA,EAAQ;AAEd,YAAA,mBAAA,CAAoB,EAAE,UAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,YAAY,CAAA;AAEhE,YAAA,OAAO,OAAA;AAAA,cACL;AAAA,gBACE,IAAA,EAAM,UAAA;AAAA,gBACN,mBAAA,EAAqB,EAAE,UAAA,EAAY,QAAA,EAAU,IAAA;AAAK,eACpD;AAAA,cACA,EAAE,aAAa,UAAA;AAAW,aAC5B;AAAA,UACF,CAAA,MAAO;AAEL,YAAA,MAAM,kBAAA,GAA8C;AAAA,cAClD,UAAA;AAAA,cACA,QAAA;AAAA,cACA,IAAA;AAAA,cACA,cAAA;AAAA,cACA,IAAA,EAAM,YAAA;AAAA,cACN,cAAc,cAAA,EAAgB;AAAA,aAChC;AAEA,YAAA,IAAI,MAAA,EAAQ;AACV,cAAA,MAAM,cAAA,CAAe,QAAQ,KAAA,EAAO;AAAA,gBAClC,IAAA,EAAM,qBAAA;AAAA,gBACN,KAAA;AAAA,gBACA,IAAA,EAAA,OAAA;AAAA,gBACA,OAAA,EAAS;AAAA,kBACP,UAAA;AAAA,kBACA,QAAA;AAAA,kBACA,cAAA;AAAA,kBACA,IAAA;AAAA,kBACA,cAAc,cAAA,EAAgB;AAAA;AAChC,eACD,CAAA;AAED,cAAA,MAAM,kBAAA,CAAmB,MAAA,EAAQ,KAAA,EAAO,kBAAkB,CAAA;AAAA,YAC5D;AAGA,YAAA,eAAA,CAAgB;AAAA,cACd,IAAA,EAAM,YAAA;AAAA,cACN,cAAA;AAAA,cACA,cAAc,cAAA,EAAgB;AAAA,aAC/B,CAAA;AAED,YAAA,MAAM,OAAA,EAAQ;AAEd,YAAA,mBAAA,CAAoB,EAAE,UAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,cAAc,CAAA;AAElE,YAAA,OAAO,OAAA;AAAA,cACL;AAAA,gBACE,IAAA,EAAM,YAAA;AAAA,gBACN,iBAAA,EAAmB,cAAA;AAAA,gBACnB,UAAA;AAAA,gBACA,QAAA;AAAA,gBACA,aAAa,cAAA,EAAgB;AAAA,eAC/B;AAAA,cACA,EAAE,aAAa,UAAA;AAAW,aAC5B;AAAA,UACF;AAAA,QACF;AAAA,OACF;AAGA,MAAA,IAAI,SAAA,IAAa,CAAC,QAAA,EAAU,QAAA,IAAY,OAAO,WAAA,KAAgB,QAAA,IAAY,gBAAgB,IAAA,EAAM;AAC/F,QAAA,MAAM,aAAaC,yCAAA,CAAwB;AAAA,UACzC,cAAA;AAAA,UACA,QAAA;AAAA,UACA,UAAA,EAAY,YAAA;AAAA,UACZ,WAAA,EAAa,QAAA;AAAA,UACb,eAAe,SAAA,CAAU;AAAA,SAC1B,CAAA;AAED,QAAA,IAAI,WAAW,eAAA,EAAiB;AAC9B,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAASC,uCAAqB,SAAA,EAAW;AAAA,cAC7C,QAAA;AAAA,cACA,UAAA;AAAA,cACA,IAAA,EAAM,WAAA;AAAA,cACN,SAAS,QAAA,CAAS,OAAA;AAAA,cAClB,UAAU,KAAA,EAAO,QAAA;AAAA,cACjB,YAAY,KAAA,EAAO,UAAA;AAAA,cACnB,KAAA;AAAA,cACA,WAAW,UAAA,CAAW,SAAA;AAAA,cACtB,YAAY,UAAA,CAAW,UAAA;AAAA,cACvB,OAAA,EAAS;AAAA,gBACP,QAAA,EAAU;AAAA,kBACR,OAAA,EAAS,OAAO,QAAA,EAAe,WAAA,KAAqB;AAClD,oBAAA,OAAO,IAAA,CAAK,QAAS,QAAA,EAAU;AAAA,sBAC7B,GAAG,WAAA;AAAA,sBACH,GAAI,aAAa,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,EAAY,WAAA,CAAY,UAAA,EAAW,GAAI,EAAC;AAAA,sBACtF,OAAA,EAAS,OAAO,IAAA,EAAgB,OAAA,KAA6B;AAC3D,wBAAA,MAAM,WAAA,CAAY,OAAA,GAAU,IAAA,EAAM,OAAO,CAAA;AACzC,wBAAA,OAAO,WAAA,EAAa,OAAA,GAAU,IAAA,EAAM,OAAO,CAAA;AAAA,sBAC7C;AAAA,qBACD,CAAA;AAAA,kBACH;AAAA,iBACF;AAAA,gBACA,OAAA,EAAS,CAAC,KAAA,KAAe;AACvB,kBAAA,IAAI,CAAC,MAAA,EAAQ;AACb,kBAAA,IAAI;AACF,oBAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,KAAA;AAE9B,oBAAA,IAAI,OAAA,KAAY,KAAA,IAAU,OAAA,KAAY,KAAA,IAAS,UAAA,EAAa;AAC1D,sBAAA,KAAK,cAAA,CAAe,QAAQ,OAAA,EAAS;AAAA,wBACnC,IAAA,EAAM,WAAA;AAAA,wBACN,KAAA,EAAO,OAAA;AAAA,wBACP,IAAA,EAAA,OAAA;AAAA,wBACA,OAAA,EAAS;AAAA,0BACP,UAAA,EAAY,MAAM,OAAA,CAAQ,UAAA;AAAA,0BAC1B,QAAA,EAAU,MAAM,OAAA,CAAQ,QAAA;AAAA,0BACxB,IAAA,EAAM;AAAA;AACR,uBACD,CAAA;AAAA,oBACH;AAEA,oBAAA,IAAI,KAAA,CAAM,SAAS,2BAAA,EAA6B;AAC9C,sBAAA,KAAK,cAAA,CAAe,QAAQ,OAAA,EAAS;AAAA,wBACnC,IAAA,EAAM,aAAA;AAAA,wBACN,KAAA,EAAO,OAAA;AAAA,wBACP,IAAA,EAAA,OAAA;AAAA,wBACA,OAAA,EAAS;AAAA,0BACP,UAAA,EAAY,MAAM,OAAA,CAAQ,UAAA;AAAA,0BAC1B,QAAA,EAAU,MAAM,OAAA,CAAQ,QAAA;AAAA,0BACxB,IAAA,EAAM,WAAA;AAAA,0BACN,MAAA,EAAQ,MAAM,OAAA,CAAQ;AAAA;AACxB,uBACD,CAAA;AAAA,oBACH,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,wBAAA,EAA0B;AAClD,sBAAA,KAAK,cAAA,CAAe,QAAQ,OAAA,EAAS;AAAA,wBACnC,IAAA,EAAM,YAAA;AAAA,wBACN,KAAA,EAAO,OAAA;AAAA,wBACP,IAAA,EAAA,OAAA;AAAA,wBACA,OAAA,EAAS;AAAA,0BACP,UAAA,EAAY,MAAM,OAAA,CAAQ,UAAA;AAAA,0BAC1B,QAAA,EAAU,MAAM,OAAA,CAAQ,QAAA;AAAA,0BACxB,KAAA,EAAO,MAAM,OAAA,CAAQ,KAAA;AAAA,0BACrB,IAAA,EAAM;AAAA;AACR,uBACD,CAAA;AAAA,oBACH;AAAA,kBACF,CAAA,CAAA,MAAQ;AAAA,kBAER;AAAA,gBACF,CAAA;AAAA,gBAEA,QAAA,EAAU,OAAOC,OAAAA,KAAgB;AAC/B,kBAAA,IAAI,CAAC,WAAA,EAAa;AAElB,kBAAA,MAAM,MAAA,GACJA,OAAAA,CAAO,MAAA,KAAW,QAAA,GACd,CAAA,wBAAA,EAA2BA,QAAO,KAAA,EAAO,OAAA,IAAW,eAAe,CAAA,CAAA,GACnEA,OAAAA,CAAO,MAAA;AAEb,kBAAA,MAAM,UAAU,WAAA,CAAY,oBAAA;AAAA,oBAC1B;AAAA,sBACE,IAAA,EAAM,iBAAA;AAAA,sBACN,cAAA,EAAgB;AAAA,wBACd,KAAA,EAAO,QAAA;AAAA,wBACP,YAAYA,OAAAA,CAAO,UAAA;AAAA,wBACnB,UAAUA,OAAAA,CAAO,QAAA;AAAA,wBACjB,IAAA,EAAM,WAAA;AAAA,wBACN,MAAA;AAAA;AAAA;AAAA,wBAGA,GAAI,iBAAiB;AAAC;AACxB,qBACF;AAAA,oBACA;AAAA,sBACE,eAAA,EAAiB;AAAA,wBACf,CAACA,OAAAA,CAAO,UAAU,GAAG;AAAA,0BACnB,WAAWA,OAAAA,CAAO,SAAA;AAAA,0BAClB,aAAaA,OAAAA,CAAO,WAAA;AAAA,0BACpB,QAAQA,OAAAA,CAAO;AAAA;AACjB;AACF;AACF,mBACF;AAEA,kBAAA,IAAI,CAAC,OAAA,EAAS;AACZ,oBAAA,IAAIA,QAAO,KAAA,KAAU,KAAA,IAAUA,OAAAA,CAAO,KAAA,KAAU,SAAS,UAAA,EAAa;AACpE,sBAAA,WAAA,CAAY,GAAA;AAAA,wBACV;AAAA,0BACE;AAAA,4BACE,IAAA,EAAM,MAAA;AAAA,4BACN,IAAA,EAAM,WAAA;AAAA,4BACN,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,4BACtB,SAAA,sBAAe,IAAA,EAAK;AAAA,4BACpB,OAAA,EAAS;AAAA,8BACP;AAAA,gCACE,IAAA,EAAM,WAAA;AAAA,gCACN,YAAYA,OAAAA,CAAO,UAAA;AAAA,gCACnB,UAAUA,OAAAA,CAAO,QAAA;AAAA,gCACjB,IAAA,EAAM;AAAA;AACR;AACF;AACF,yBACF;AAAA,wBACA;AAAA,uBACF;AAAA,oBACF;AACA,oBAAA,WAAA,CAAY,GAAA;AAAA,sBACV;AAAA,wBACE;AAAA,0BACE,IAAA,EAAM,MAAA;AAAA,0BACN,OAAA,EAAS;AAAA,4BACP;AAAA,8BACE,IAAA,EAAM,aAAA;AAAA,8BACN,YAAYA,OAAAA,CAAO,UAAA;AAAA,8BACnB,UAAUA,OAAAA,CAAO,QAAA;AAAA,8BACjB,MAAA;AAAA,8BACA,OAAA,EAASA,QAAO,MAAA,KAAW;AAAA;AAC7B;AACF;AACF,uBACF;AAAA,sBACA;AAAA,qBACF;AAAA,kBACF;AAEA,kBAAA,IAAI,gBAAA,IAAoB,OAAO,QAAA,EAAU;AACvC,oBAAA,MAAM,iBAAiB,aAAA,CAAc,WAAA,EAAa,KAAA,CAAM,QAAA,EAAU,MAAM,YAAY,CAAA;AAAA,kBACtF;AAAA,gBACF,CAAA;AAAA,gBAEA,WAAA,EAAa,OAAOA,OAAAA,KAAgB;AAClC,kBAAA,IAAI,CAAC,WAAA,EAAa;AAElB,kBAAA,WAAA,CAAY,iCAAA,CAAkCA,QAAO,UAAA,EAAY;AAAA,oBAC/D,eAAA,EAAiB;AAAA,sBACf,CAACA,OAAAA,CAAO,UAAU,GAAG;AAAA,wBACnB,WAAWA,OAAAA,CAAO,SAAA;AAAA,wBAClB,aAAaA,OAAAA,CAAO,WAAA;AAAA,wBACpB,QAAQA,OAAAA,CAAO;AAAA;AACjB;AACF,mBACD,CAAA;AAAA,gBACH,CAAA;AAAA,gBAEA,UAAA,EAAY,YAAA,EAAc,UAAA,IAAc,QAAA,EAAU,cAAA;AAAA,gBAClD,QAAA,EAAU,YAAA,EAAc,QAAA,IAAY,QAAA,EAAU;AAAA;AAChD,aACD,CAAA;AAKD,YAAA,MAAM,sBACJ,wBAAA,IAA4B,UAAA,IAAc,OAAO,UAAA,KAAe,YAAY,UAAA,KAAe,IAAA;AAC7F,YAAA,IAAI,mBAAA,EAAqB;AACvB,cAAA,MAAM,WAAA,GAAc,MAAM,MAAA,CAAO,gBAAA,CAAiB;AAAA,gBAChD,UAAA;AAAA,gBACA,KAAA;AAAA,gBACA,SAAS,QAAA,CAAS,OAAA;AAAA,gBAClB,UAAU,KAAA,EAAO,QAAA;AAAA,gBACjB,YAAY,KAAA,EAAO,UAAA;AAAA,gBACnB;AAAA,eACD,CAAA;AACD,cAAA,IAAI,WAAA,EAAa;AACf,gBAAA,MAAMC,KAAAA,GAAO,MAAM,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA;AAC3C,gBAAA,OAAO;AAAA,kBACL,GAAG,UAAA;AAAA,kBACH,IAAA,EAAM,WAAA;AAAA,kBACN,MAAA,EAAQ,CAAA,kCAAA,EAAqCA,KAAAA,CAAK,EAAE,eAAe,QAAQ,CAAA,uEAAA;AAAA,iBAC7E;AAAA,cACF;AAAA,YACF;AAEA,YAAA,MAAM,EAAE,IAAA,EAAM,cAAA,EAAe,GAAI,MAAM,OAAO,QAAA,EAAS;AAEvD,YAAA,IAAI,CAAC,cAAA,EAAgB;AAEnB,cAAA,IAAI,MAAA,EAAQ;AACV,gBAAA,MAAM,cAAA,CAAe,QAAQ,KAAA,EAAO;AAAA,kBAClC,IAAA,EAAM,yBAAA;AAAA,kBACN,KAAA;AAAA,kBACA,IAAA,EAAA,OAAA;AAAA,kBACA,OAAA,EAAS;AAAA,oBACP,QAAQ,IAAA,CAAK,EAAA;AAAA,oBACb,QAAA;AAAA,oBACA;AAAA;AACF,iBACD,CAAA;AAAA,cACH;AAGA,cAAA,OAAO;AAAA,gBACL,GAAG,UAAA;AAAA,gBACH,IAAA,EAAM,WAAA;AAAA,gBACN,MAAA,EAAQ,CAAA,kCAAA,EAAqC,IAAA,CAAK,EAAE,eAAe,QAAQ,CAAA,uEAAA,CAAA;AAAA,gBAC3E,GAAI,iBAAiB;AAAC,eACxB;AAAA,YACF;AAAA,UAEF,SAAS,OAAA,EAAS;AAChB,YAAA,MAAA,EAAQ,KAAA;AAAA,cACN,CAAA,mDAAA,EAAsD,QAAQ,CAAA,wBAAA,EAA2B,OAAO,CAAA;AAAA,aAClG;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,aAAa,WAAW,CAAA;AAG1D,QAAA,IAAI,QAAQ,UAAA,IAAc,IAAA,IAAQ,OAAQ,IAAA,CAAa,aAAa,UAAA,EAAY;AAC9E,UAAA,IAAI;AACF,YAAA,MAAO,KAAa,QAAA,CAAS;AAAA,cAC3B,UAAA;AAAA,cACA,QAAA;AAAA,cACA,MAAA,EAAQ;AAAA,aACT,CAAA;AAAA,UACH,SAAS,SAAA,EAAW;AAClB,YAAA,MAAA,EAAQ,KAAA,GAAQ,0BAA0B,SAAS,CAAA;AAAA,UACrD;AAAA,QACF;AAQA,QAAA,IAAI,MAAA,IAAU,CAAC,YAAA,EAAc;AAC3B,UAAA,IAAI;AACF,YAAA,MAAM,cAAc,MAAM,gCAAA;AAAA,cACxB;AAAA,gBACE,IAAA,EAAM,aAAA;AAAA,gBACN,KAAA;AAAA,gBACA,IAAA,EAAA,OAAA;AAAA,gBACA,OAAA,EAAS,EAAE,UAAA,EAAY,QAAA,EAAU,MAAM,MAAA;AAAO,eAChD;AAAA,cACA;AAAA,gBACE,QAAQ,aAAA,EAAe,oBAAA;AAAA,gBACvB,OAAO,aAAA,EAAe,KAAA;AAAA,gBACtB;AAAA;AACF,aACF;AAEA,YAAA,MAAM,YAAY,MAAM,mCAAA;AAAA,cACtB,WAAA;AAAA,cACA,aAAA;AAAA,cACA,MAAA;AAAA,cACA,KAAA;AAAA,cACA,QAAA,CAAS,OAAA;AAAA,cACT,MAAA;AAAA,cACA;AAAA,aACF;AACA,YAAA,IAAI,SAAA,EAAW;AACb,cAAA,MAAM,cAAA,CAAe,MAAA,EAAQ,KAAA,EAAO,SAAS,CAAA;AAAA,YAC/C;AAAA,UACF,SAAS,SAAA,EAAW;AAClB,YAAA,MAAA,EAAQ,IAAA,GAAO,CAAA,oDAAA,EAAuD,QAAQ,CAAA,EAAA,EAAK,SAAS,CAAA,CAAE,CAAA;AAAA,UAChG;AAAA,QACF;AAEA,QAAA,OAAO;AAAA,UACL,GAAG,UAAA;AAAA,UACH,MAAA;AAAA,UACA,GAAI,iBAAiB;AAAC,SACxB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,SAAA,GAAY,eAAe,KAAK,CAAA;AAGtC,QAAA,IAAI,MAAA,IAAU,CAAC,YAAA,EAAc;AAC3B,UAAA,IAAI;AACF,YAAA,MAAM,aAAa,MAAM,gCAAA;AAAA,cACvB;AAAA,gBACE,IAAA,EAAM,YAAA;AAAA,gBACN,KAAA;AAAA,gBACA,IAAA,EAAA,OAAA;AAAA,gBACA,SAAS,EAAE,UAAA,EAAY,QAAA,EAAU,IAAA,EAAM,OAAO,SAAA;AAAU,eAC1D;AAAA,cACA;AAAA,gBACE,QAAQ,aAAA,EAAe,oBAAA;AAAA,gBACvB,OAAO,aAAA,EAAe,KAAA;AAAA,gBACtB;AAAA;AACF,aACF;AAEA,YAAA,MAAM,YAAY,MAAM,mCAAA;AAAA,cACtB,UAAA;AAAA,cACA,aAAA;AAAA,cACA,MAAA;AAAA,cACA,KAAA;AAAA,cACA,QAAA,CAAS,OAAA;AAAA,cACT,MAAA;AAAA,cACA;AAAA,aACF;AACA,YAAA,IAAI,SAAA,EAAW;AACb,cAAA,MAAM,cAAA,CAAe,MAAA,EAAQ,KAAA,EAAO,SAAS,CAAA;AAAA,YAC/C;AAAA,UACF,SAAS,SAAA,EAAW;AAClB,YAAA,MAAA,EAAQ,IAAA,GAAO,CAAA,mDAAA,EAAsD,QAAQ,CAAA,EAAA,EAAK,SAAS,CAAA,CAAE,CAAA;AAAA,UAC/F;AAAA,QACF;AAEA,QAAA,OAAO;AAAA,UACL,GAAG,UAAA;AAAA,UACH,KAAA,EAAO,SAAA;AAAA,UACP,GAAI,iBAAiB;AAAC,SACxB;AAAA,MACF;AAAA,IACF;AAAA,GACD,CAAA;AACH;AC1kCA,IAAM,4BAAA,GAA+B1B,MAAE,MAAA,CAAO;AAAA,EAC5C,SAAA,EAAWA,MAAE,GAAA,EAAI;AAAA;AAAA,EACjB,WAAA,EAAaA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,KAAK,CAAA;AAAA;AAAA,EAC5B,KAAA,EAAOA,MAAE,MAAA,EAAO;AAAA,EAChB,OAAA,EAASA,MAAE,MAAA,EAAO;AAAA,EAClB,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA,EACpB,KAAA,EAAOA,MAAE,GAAA;AAAI;AACf,CAAC,CAAA;AAKD,IAAM,6BAAA,GAAgCA,MAAE,MAAA,CAAO;AAAA,EAC7C,gBAAA,EAAkBA,MAAE,GAAA,EAAI;AAAA,EACxB,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA,EACpB,UAAA,EAAYA,MAAE,GAAA,EAAI;AAAA,EAClB,WAAA,EAAaA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,KAAK,CAAA;AAAA,EAC5B,MAAA,EAAQA,MAAE,MAAA,CAAO;AAAA,IACf,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC1B,WAAWA,KAAAA,CAAE,KAAA,CAAMA,MAAE,GAAA,EAAK,EAAE,QAAA,EAAS;AAAA,IACrC,KAAA,EAAOA,MAAE,GAAA,EAAI;AAAA,IACb,KAAA,EAAOA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,KAAK;AAAA,GACvB,CAAA;AAAA,EACD,KAAA,EAAOA,MAAE,GAAA,EAAI;AAAA,EACb,gBAAA,EAAkBA,KAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EACvC,mBAAA,EAAqBA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACzC,sBAAA,EAAwBA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACrC,CAAC,CAAA;AAYD,SAAS,qBAAqB,MAAA,EAA0B;AACtD,EAAA,IAAI,MAAA,IAAU,IAAA,IAAQ,OAAO,MAAA,KAAW,UAAU,OAAO,MAAA;AAEzD,EAAA,MAAM,GAAA,GAAM,MAAA;AACZ,EAAA,IAAI,GAAA,CAAI,SAAS,SAAA,IAAa,CAAC,MAAM,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,MAAA;AAEhE,EAAA,OAAO;AAAA,IACL,GAAG,GAAA;AAAA,IACH,KAAA,EAAQ,GAAA,CAAI,KAAA,CAAoB,GAAA,CAAI,CAAA,IAAA,KAAQ;AAC1C,MAAA,IAAI,IAAA,IAAQ,IAAA,IAAQ,OAAO,IAAA,KAAS,UAAU,OAAO,IAAA;AACrD,MAAA,MAAM,IAAA,GAAO,IAAA;AACb,MAAA,IAAI,KAAK,IAAA,KAAS,WAAA,IAAe,OAAO,IAAA,CAAK,QAAQ,QAAA,EAAU;AAC7D,QAAA,MAAM,SAAA,GACJ,OAAO,IAAA,CAAK,SAAA,KAAc,QAAA,IAAY,KAAK,SAAA,GACvC,IAAA,CAAK,SAAA,GACL,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,OAAO,CAAA,GACzB,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,IAAI,OAAA,CAAQ,GAAG,CAAC,CAAA,IAAK,YAAA,GAC5C,YAAA;AACR,QAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,IAAA,CAAK,KAAK,SAAA,EAAU;AAAA,MACpD;AACA,MAAA,IAAI,KAAK,IAAA,KAAS,YAAA,IAAgB,OAAO,IAAA,CAAK,SAAS,QAAA,EAAU;AAC/D,QAAA,OAAO,EAAE,MAAM,OAAA,EAAS,IAAA,EAAM,KAAK,IAAA,EAAM,SAAA,EAAW,IAAA,CAAK,SAAA,IAAa,YAAA,EAAa;AAAA,MACrF;AACA,MAAA,IAAI,KAAK,IAAA,KAAS,WAAA,IAAe,OAAO,IAAA,CAAK,SAAS,QAAA,EAAU;AAC9D,QAAA,OAAO,EAAE,MAAM,OAAA,EAAS,IAAA,EAAM,KAAK,IAAA,EAAM,SAAA,EAAW,IAAA,CAAK,SAAA,IAAa,0BAAA,EAA2B;AAAA,MACnG;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC;AAAA,GACH;AACF;AAaO,SAAS,2BAAA,GAA8B;AAC5C,EAAA,OAAOC,4BAAA,CAAW;AAAA,IAChB,IAAI,cAAA,CAAe,WAAA;AAAA,IACnB,WAAA,EAAa,4BAAA;AAAA,IACb,YAAA,EAAc,6BAAA;AAAA,IACd,OAAA,EAAS,OAAM,MAAA,KAAU;AACvB,MAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAQ,cAAA,EAAe,GAAI,MAAA;AAC9C,MAAA,MAAM;AAAA,QACJ,SAAA;AAAA,QACA,WAAA;AAAA,QACA,KAAA,EAAO,MAAA;AAAA,QAEP,SAAA;AAAA,QACA;AAAA,OACF,GAAI,SAAA;AAUJ,MAAA,MAAM,WAAA,GAAc,IAAIf,6BAAA,CAAY;AAAA,QAClC,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,YAAY,KAAA,CAAM;AAAA,OACnB,CAAA;AACD,MAAA,WAAA,CAAY,WAAA,CAAY,UAAU,gBAAgB,CAAA;AAKlD,MAAA,MAAM,gBAAA,GAAmB,CAAC,UAAA,KACxB,UAAA,EAAY,UAAU,QAAA,KAAa,KAAA;AAIrC,MAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,GAAA,CAAI,MAAM,CAAA;AAClD,MAAA,MAAM,gBAAgB,aAAA,EAAe,KAAA;AAGrC,MAAA,IAAI,QAAA;AAOJ,MAAA,IAAI,UAAU,YAAA,EAAc;AAC1B,QAAA,IAAI;AACF,UAAA,MAAM,gBAAiB,MAAA,EAA+B,aAAA,EAAe,mBAAA,CAAoB,EAAE,gBAAgB,CAAA;AAC3G,UAAA,QAAA,GAAW,aAAA,EAAe,WAAA,CAAY,SAAA,CAAU,YAAiD,CAAA;AAAA,QACnG,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAEA,MAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,QAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,UAAA,IAAI,gBAAA,CAAiB,UAAU,CAAA,EAAG;AAChC,YAAA,WAAA,CAAY,oBAAA,CAAqB;AAAA,cAC/B,IAAA,EAAM,iBAAA;AAAA,cACN,cAAA,EAAgB;AAAA,gBACd,KAAA,EAAO,eAAA;AAAA,gBACP,YAAY,UAAA,CAAW,UAAA;AAAA,gBACvB,UAAU,UAAA,CAAW,QAAA;AAAA,gBACrB,MAAM,UAAA,CAAW,IAAA;AAAA,gBACjB,QAAA,EAAU;AAAA,kBACR,EAAA,EAAI,WAAW,QAAA,CAAU,EAAA;AAAA,kBACzB,QAAA,EAAU,KAAA;AAAA,kBACV,MAAA,EAAQ,WAAW,QAAA,CAAU;AAAA;AAC/B;AACF,aACD,CAAA;AACD,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,SAAS,UAAA,CAAW,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,UAAU,UAAA,CAAW,MAAA;AAMxE,UAAA,IAAI,mBAAwD,UAAA,CAAW,gBAAA;AAGvE,UAAA,IAAI,CAAC,WAAW,KAAA,IAAS,UAAA,CAAW,UAAU,IAAA,IAAQ,CAAC,WAAW,gBAAA,EAAkB;AAClF,YAAA,MAAM,IAAA,GAAO,aAAA,GAAgB,UAAA,CAAW,QAAQ,CAAA;AAIhD,YAAA,IAAI,MAAM,aAAA,EAAe;AACvB,cAAA,MAAM,WAAA,GAAc,UAAU,eAAA,CAAgB;AAAA,gBAC5C,IAAA,EAAA,SAAA;AAAA,gBACA,IAAA,EAAM,CAAA,sBAAA,EAAyB,UAAA,CAAW,QAAQ,CAAA,CAAA,CAAA;AAAA,gBAClD,YAAYE,4BAAA,CAAW,IAAA;AAAA,gBACvB,UAAU,UAAA,CAAW,QAAA;AAAA,gBACrB,YAAY,UAAA,CAAW,QAAA;AAAA,gBACvB,OAAO,UAAA,CAAW,MAAA;AAAA,gBAClB,UAAA,EAAY;AAAA,kBACV,WAAA,EAAa,eAAA;AAAA,kBACb,YAAY,UAAA,CAAW;AAAA;AACzB,eACD,CAAA;AACD,cAAA,IAAI;AACF,gBAAA,IAAI,WAAA,GAAc,MAAM,IAAA,CAAK,aAAA,CAAc,WAAW,MAAM,CAAA;AAC5D,gBAAA,WAAA,GAAc,qBAAqB,WAAW,CAAA;AAC9C,gBAAA,WAAA,EAAa,GAAA,CAAI,EAAE,MAAA,EAAQ,WAAA,EAAa,CAAA;AAExC,gBAAA,MAAM,cAAA,GAAkB,WAAW,gBAAA,EAA0B,MAAA;AAC7D,gBAAA,gBAAA,GAAmB;AAAA,kBACjB,GAAG,UAAA,CAAW,gBAAA;AAAA,kBACd,MAAA,EAAQ,EAAE,GAAG,cAAA,EAAgB,WAAA;AAAY,iBAC3C;AAAA,cACF,SAAS,GAAA,EAAK;AACZ,gBAAA,WAAA,EAAa,MAAM,EAAE,KAAA,EAAO,GAAA,EAAc,OAAA,EAAS,MAAM,CAAA;AAEzD,gBAAC,MAAA,EACG,aAAY,EACZ,IAAA,GAAO,iDAAiD,UAAA,CAAW,QAAQ,CAAA,GAAA,EAAM,GAAG,CAAA,CAAE,CAAA;AAAA,cAC5F;AAAA,YACF;AAAA,UACF;AAEA,UAAA,MAAM,OAAA,GAAU,YAAY,oBAAA,CAAqB;AAAA,YAC/C,IAAA,EAAM,iBAAA;AAAA,YACN,cAAA,EAAgB;AAAA,cACd,KAAA,EAAO,QAAA;AAAA,cACP,YAAY,UAAA,CAAW,UAAA;AAAA,cACvB,UAAU,UAAA,CAAW,QAAA;AAAA,cACrB,MAAM,UAAA,CAAW,IAAA;AAAA,cACjB,MAAA;AAAA;AAAA;AAAA,cAGA,GAAI,WAAW,QAAA,GAAW,EAAE,UAAU,UAAA,CAAW,QAAA,KAAa;AAAC,aACjE;AAAA,YACA,GAAI,gBAAA,GAAmB,EAAE,gBAAA,KAA8C;AAAC,WACzE,CAAA;AAED,UAAA,IAAI,CAAC,OAAA,EAAS;AACZ,YAAA,WAAA,CAAY,GAAA;AAAA,cACV;AAAA,gBACE;AAAA,kBACE,IAAA,EAAM,MAAA;AAAA,kBACN,OAAA,EAAS;AAAA,oBACP;AAAA,sBACE,IAAA,EAAM,aAAA;AAAA,sBACN,YAAY,UAAA,CAAW,UAAA;AAAA,sBACvB,UAAU,UAAA,CAAW,QAAA;AAAA,sBACrB,MAAA;AAAA,sBACA,OAAA,EAAS,WAAW,KAAA,KAAU;AAAA;AAChC;AACF;AACF,eACF;AAAA,cACA;AAAA,aACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AASA,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,aAAA,CAAc,WAAA,GAAc,WAAA;AAAA,MAC9B;AAOA,MAAA,MAAM,gBAAgB,WAAA,CAAY,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,UAAU,MAAS,CAAA;AACjE,MAAA,MAAM,WAAA,GAAc,aAAA,GAAgB,IAAA,GAAO,SAAA,CAAU,UAAA,CAAW,WAAA;AAMhE,MAAA,IAAI,gBAAA,GAAmB,KAAA;AACvB,MAAA,IAAI,cAAA,EAAgB,GAAA,CAAI,2BAA2B,CAAA,EAAG;AACpD,QAAA,gBAAA,GAAmB,IAAA;AACnB,QAAA,cAAA,CAAe,GAAA,CAAI,6BAA6B,KAAK,CAAA;AAAA,MACvD;AAGA,MAAA,MAAM,MAAA,GAAwC;AAAA,QAC5C,gBAAA,EAAkB,YAAY,SAAA,EAAU;AAAA,QACxC,SAAA;AAAA,QACA,UAAA,EAAY;AAAA,UACV,GAAG,SAAA,CAAU,UAAA;AAAA,UACb;AAAA,SACF;AAAA,QACA,WAAA;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,MAAM,SAAA,CAAU,IAAA;AAAA,UAChB,WAAW,SAAA,CAAU,SAAA;AAAA,UACrB,KAAA,EAAO,SAAA,CAAU,UAAA,CAAW,UAAA,IAAc;AAAA,YACxC,WAAA,EAAa,CAAA;AAAA,YACb,YAAA,EAAc,CAAA;AAAA,YACd,WAAA,EAAa;AAAA,WACf;AAAA,UACA,OAAO;AAAC;AAAA,SACV;AAAA,QACA,KAAA,EAAO;AAAA,UACL,GAAG,KAAA;AAAA,UACH,cAAc,KAAA,CAAM;AAAA,SACtB;AAAA,QACA,qBAAqB,SAAA,CAAU,mBAAA;AAAA,QAC/B,wBAAwB,SAAA,CAAU,sBAAA;AAAA,QAClC;AAAA,OACF;AAKA,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,IAAI;AACF,UAAA,MAAM,iBAAiB,SAAA,CAAU,iBAAA;AACjC,UAAA,QAAA,CAAS,GAAA,CAAI;AAAA,YACX,MAAA,EAAQ;AAAA,cACN,MAAM,SAAA,CAAU,IAAA;AAAA,cAChB,WAAW,SAAA,CAAU;AAAA,aACvB;AAAA,YACA,UAAA,EAAY;AAAA,cACV,KAAA,EAAO,gBAAgB,MAAA,EAAQ,KAAA;AAAA,cAC/B,YAAA,EAAc,gBAAgB,UAAA,EAAY,MAAA;AAAA,cAC1C,WAAA,EAAa,gBAAgB,UAAA,EAAY;AAAA;AAC3C,WACD,CAAA;AAAA,QACH,SAAS,KAAA,EAAO;AAEd,UAAC,QACG,SAAA,IAAY,EACZ,IAAA,GAAO,CAAA,gDAAA,EAAmD,KAAK,CAAA,CAAE,CAAA;AAAA,QACvE;AAAA,MACF;AAOA,MAAA,MAAM,gBAAgB,SAAA,CAAU,uBAAA;AAChC,MAAA,MAAM,MAAA,GAAU,OAAec,+BAAa,CAAA;AAC5C,MAAA,IAAI,iBAAiB,MAAA,EAAQ;AAC3B,QAAA,IAAI;AAOF,UAAA,MAAM,cAAyB,EAAC;AAChC,UAAA,IAAI,UAAU,IAAA,EAAM;AAClB,YAAA,WAAA,CAAY,KAAK,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,SAAA,CAAU,MAAM,CAAA;AAAA,UACzD;AACA,UAAA,KAAA,MAAW,EAAA,IAAM,SAAA,CAAU,SAAA,IAAa,EAAC,EAAG;AAC1C,YAAA,WAAA,CAAY,IAAA,CAAK;AAAA,cACf,IAAA,EAAM,WAAA;AAAA,cACN,YAAY,EAAA,CAAG,UAAA;AAAA,cACf,UAAU,EAAA,CAAG,QAAA;AAAA,cACb,MAAM,EAAA,CAAG;AAAA,aACV,CAAA;AAAA,UACH;AACA,UAAA,KAAA,MAAW,EAAA,IAAM,WAAA,IAAe,EAAC,EAAG;AAClC,YAAA,WAAA,CAAY,IAAA,CAAK;AAAA,cACf,IAAA,EAAM,aAAA;AAAA,cACN,YAAY,EAAA,CAAG,UAAA;AAAA,cACf,UAAU,EAAA,CAAG,QAAA;AAAA,cACb,QAAQ,EAAA,CAAG,KAAA,GAAQ,EAAA,CAAG,KAAA,CAAM,UAAU,EAAA,CAAG,MAAA;AAAA,cACzC,GAAI,EAAA,CAAG,KAAA,GAAQ,EAAE,OAAA,EAAS,IAAA,KAAS;AAAC,aACrC,CAAA;AAAA,UACH;AAEA,UAAA,MAAM,aAAA,GAAgB;AAAA,YACpB,GAAG,aAAA;AAAA,YACH,OAAA,EAAS;AAAA,cACP,GAAG,aAAA,CAAc,OAAA;AAAA,cACjB,mBAAA,EAAqB;AAAA;AACvB,WACF;AACA,UAAA,MAAM,cAAA,CAAe,MAAA,EAAQ,MAAA,EAAQ,aAAa,CAAA;AAAA,QACpD,SAAS,KAAA,EAAO;AACd,UAAC,QACG,SAAA,IAAY,EACZ,IAAA,GAAO,CAAA,oDAAA,EAAuD,KAAK,CAAA,CAAE,CAAA;AAAA,QAC3E;AAAA,MACF;AAEA,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,GACD,CAAA;AACH;AChXO,SAAS,+BAAA,CAAgC,eAAA,GAA0B,oBAAA,CAAqB,SAAA,EAAW;AAMxG,EAAA,OAAOD,4BAAA,CAAW;AAAA,IAChB,IAAI,cAAA,CAAe,gBAAA;AAAA,IACnB,WAAA,EAAaD,MAAE,GAAA,EAAI;AAAA,IACnB,YAAA,EAAcA,MAAE,GAAA,EAAI;AAAA,IACpB,OAAA,EAAS,OAAM,MAAA,KAAU;AACvB,MAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAQ,WAAA,EAAY,GAAI,MAAA;AAC3C,MAAA,MAAM,KAAA,GAAQ,SAAA;AAad,MAAA,MAAM,MAAA,GAAU,OAAeE,+BAAa,CAAA;AAC5C,MAAA,MAAM,WAAW,WAAA,EAAY;AAO7B,MAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA;AACvD,MAAA,MAAM,iBAAiB,aAAA,EAAe,cAAA;AACtC,MAAA,MAAM,aAAa,CAAC,CAAC,gBAAgB,OAAA,IAAW,cAAA,CAAe,QAAQ,MAAA,GAAS,CAAA;AAGhF,MAAA,IAAI,CAAC,UAAA,IAAc,CAAC,cAAA,EAAgB;AAClC,QAAA,OAAO,KAAA;AAAA,MACT;AAIA,MAAA,MAAM,eAAA,GAAkB,KAAA,CAAM,cAAA,EAAgB,WAAA,KAAgB,KAAA;AAC9D,MAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,QAAA,OAAO,KAAA;AAAA,MACT;AAKA,MAAA,IAAI,MAAM,qBAAA,EAAuB;AAC/B,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,MAAM,WAAW,KAAA,CAAM,gBAAA,CAAiB,KAAA,CAAM,gBAAA,CAAiB,SAAS,CAAC,CAAA;AACzE,MAAA,MAAM,kBAAA,GAAsB,QAAA,EAAU,SAAA,IAAa,EAAC;AAIpD,MAAA,MAAM,0BAA0B,CAAC,IAAA,KAC/B,SAAS,qBAAA,IAAyB,IAAA,KAAS,sBAAsB,IAAA,KAAS,uBAAA;AAC5E,MAAA,MAAM,gBAAA,GACJ,kBAAA,CAAmB,MAAA,GAAS,CAAA,IAAK,kBAAA,CAAmB,MAAM,CAAA,EAAA,KAAM,uBAAA,CAAwB,EAAA,CAAG,QAAQ,CAAC,CAAA;AACtG,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,EAAS,QAAA,IAAY,eAAA;AAI/C,MAAA,MAAM,WAAA,GAAc,IAAIhB,6BAAA,EAAY;AACpC,MAAA,WAAA,CAAY,WAAA,CAAY,MAAM,gBAAgB,CAAA;AAC9C,MAAA,MAAM,YAAA,GAAe,WAAA,CAAY,GAAA,CAAI,KAAA,CAAM,EAAA,EAAG;AAC9C,MAAA,MAAM,gBAAA,GAAmB,aAAa,CAAC,CAAA;AACvC,MAAA,IAAI,YAAA,GAAe,cAAA;AACnB,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,IAAI,OAAO,gBAAA,CAAiB,OAAA,KAAY,QAAA,EAAU;AAChD,UAAA,YAAA,GAAe,gBAAA,CAAiB,OAAA;AAAA,QAClC,WAAY,gBAAA,CAAiB,OAAA,EAAiB,QAAQ,CAAC,CAAA,EAAG,SAAS,MAAA,EAAQ;AACzE,UAAA,YAAA,GAAiB,gBAAA,CAAiB,OAAA,CAAgB,KAAA,CAAM,CAAC,CAAA,CAAuB,IAAA;AAAA,QAClF;AAAA,MACF;AAEA,MAAA,MAAM,iBAAA,GAAqB,QAAA,EAAU,WAAA,IAAe,EAAC;AAKrD,MAAA,MAAM,GAAA,GAA+B;AAAA,QACnC,WAAW,KAAA,CAAM,cAAA;AAAA,QACjB,aAAA,EAAe,WAAA;AAAA,QACf,YAAA;AAAA,QACA,WAAA,EAAa,UAAU,IAAA,IAAQ,EAAA;AAAA,QAC/B,SAAA,EAAW,kBAAA,CAAmB,GAAA,CAAI,CAAA,EAAA,MAAO;AAAA,UACvC,IAAA,EAAM,GAAG,QAAA,IAAY,EAAA;AAAA,UACrB,IAAA,EAAO,EAAA,CAAG,IAAA,IAAoC;AAAC,SACjD,CAAE,CAAA;AAAA,QACF,QAAA,EAAU,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,EAAA,EAAG;AAAA,QACjC,WAAA,EAAa,iBAAA,CAAkB,GAAA,CAAI,CAAA,EAAA,MAAO;AAAA,UACxC,IAAA,EAAM,GAAG,QAAA,IAAY,EAAA;AAAA,UACrB,MAAA,EAAS,EAAA,CAAG,MAAA,IAAsC;AAAC,SACrD,CAAE,CAAA;AAAA,QACF,OAAA,EAAS,SAAS,OAAA,IAAW,EAAA;AAAA,QAC7B,SAAA,EAAW,SAAS,SAAA,IAAa,EAAA;AAAA,QACjC,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,QAAA,EAAU,SAAS,KAAA,EAAO,QAAA;AAAA,QAC1B,UAAA,EAAY,SAAS,KAAA,EAAO,UAAA;AAAA,QAC5B,eAAe,QAAA,CAAS;AAAA,OAC1B;AAEA,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,MAAMyC,4CAAA,CAA2B,cAAA,CAAe,OAAA,EAAU,GAAA,EAAK;AAAA,UACtE,UAAU,cAAA,CAAe,QAAA;AAAA,UACzB,UAAU,cAAA,CAAe,QAAA;AAAA,UACzB,SAAS,cAAA,CAAe;AAAA,SACzB,CAAA;AAAA,MACH,SAAS,GAAA,EAAK;AACZ,QAAA,MAAA,EAAQ,SAAA,IAAY,EAAG,IAAA,GAAO,CAAA,8CAAA,EAAiD,GAAG,CAAA,CAAE,CAAA;AACpF,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,IAAI,eAAe,UAAA,EAAY;AAC7B,QAAA,IAAI;AACF,UAAA,MAAM,cAAA,CAAe,WAAW,MAAM,CAAA;AAAA,QACxC,SAAS,GAAA,EAAK;AACZ,UAAA,MAAA,EAAQ,SAAA,IAAY,EAAG,IAAA,GAAO,CAAA,0DAAA,EAA6D,GAAG,CAAA,CAAE,CAAA;AAAA,QAClG;AAAA,MACF;AAEA,MAAA,MAAM,mBAAA,GAAsB,WAAA,GAAc,KAAA,CAAM,cAAA,IAAkB,WAAA,GAAc,KAAA;AAKhF,MAAA,MAAM,SAAA,GAA0B,EAAE,GAAG,KAAA,EAAM;AAC3C,MAAA,IAAI,UAAU,cAAA,EAAgB;AAC5B,QAAA,SAAA,CAAU,cAAA,GAAiB;AAAA,UACzB,GAAG,SAAA,CAAU,cAAA;AAAA,UACb,WAAA,EAAa,CAAC,MAAA,CAAO;AAAA,SACvB;AAAA,MACF;AAOA,MAAA,MAAM,QAAA,GAAWC,gDAAA,CAA+B,MAAA,EAAQ,mBAAmB,CAAA;AAC3E,MAAA,WAAA,CAAY,GAAA;AAAA,QACV;AAAA,UACE,EAAA,EAAI,QAAQ,UAAA,IAAa;AAAA,UACzB,SAAA,sBAAe,IAAA,EAAK;AAAA,UACpB,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM,WAAA;AAAA,UACN,OAAA,EAAS;AAAA,YACP,OAAO,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,UAAU,CAAA;AAAA,YACxC,QAAA,EAAU;AAAA,cACR,IAAA,EAAM,QAAA;AAAA,cACN,gBAAA,EAAkB;AAAA,gBAChB,QAAQ,MAAA,CAAO,QAAA;AAAA,gBACf,gBAAA,EAAkB,CAAC,CAAC,cAAA,CAAe;AAAA;AACrC,aACF;AAAA,YACA,MAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA;AAAA,OACF;AACA,MAAA,SAAA,CAAU,gBAAA,GAAmB,YAAY,SAAA,EAAU;AAEnD,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,IAAI;AACF,UAAA,MAAM,cAAA,CAAe,MAAA,EAAQ,KAAA,CAAM,KAAA,EAAO;AAAA,YACxC,IAAA,EAAM,kBAAA;AAAA,YACN,OAAO,KAAA,CAAM,KAAA;AAAA,YACb,IAAA,EAAA,OAAA;AAAA,YACA,OAAA,EAAS;AAAA,cACP,WAAW,KAAA,CAAM,cAAA;AAAA,cACjB,QAAQ,MAAA,CAAO,QAAA;AAAA,cACf,SAAS,MAAA,CAAO,OAAA;AAAA,cAChB,UAAU,MAAA,CAAO,aAAA;AAAA,cACjB,UAAU,MAAA,CAAO,QAAA;AAAA,cACjB,QAAQ,MAAA,CAAO,gBAAA;AAAA,cACf,mBAAA;AAAA,cACA,gBAAA,EAAkB,CAAC,CAAC,cAAA,CAAe;AAAA;AACrC,WACM,CAAA;AAAA,QACV,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAEA,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,GACD,CAAA;AACH;AChNA,SAAS,oBAAoB,IAAA,EAAuB;AAClD,EAAA,OAAO,IAAA,KAAS,qBAAA,IAAyB,IAAA,KAAS,kBAAA,IAAsB,IAAA,KAAS,uBAAA;AACnF;AAEA,SAAS,wBAAwB,IAAA,EAA8C;AAC7E,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,EAAA,IAAI,IAAA,KAAS,QAAQ,OAAO,MAAA;AAC5B,EAAA,IAAI,IAAA,KAAS,kBAAkB,OAAO,QAAA;AACtC,EAAA,IAAI,IAAA,KAAS,cAAc,OAAO,YAAA;AAClC,EAAA,IAAI,IAAA,KAAS,aAAa,OAAO,MAAA;AACjC,EAAA,IAAI,IAAA,KAAS,eAAe,OAAO,SAAA;AACnC,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,YAAA,CAAa,MAAe,GAAA,EAAiC;AACpE,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA,KAAS,YAAY,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG,OAAO,MAAA;AACrE,EAAA,MAAM,KAAA,GAAS,KAAiC,GAAG,CAAA;AACnD,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,MAAA,GAAS,IAAI,KAAA,GAAQ,MAAA;AACjE;AAEA,SAAS,uBAAuB,KAAA,EAAuB;AACrD,EAAA,OAAO,KAAA,CAAM,SAAS,EAAA,GAAK,CAAA,EAAG,MAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,GAAA,CAAA,GAAQ,KAAA;AAC1D;AAEA,SAAS,uCAAuC,IAAA,EAAkC;AAChF,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,mCAAmC,CAAA;AAC5D,EAAA,MAAM,aAAA,GAAgB,QAAQ,CAAC,CAAA;AAC/B,EAAA,IAAI,CAAC,eAAe,OAAO,MAAA;AAC3B,EAAA,OAAO,aAAA,CAAc,OAAA,CAAQ,MAAA,EAAQ,IAAI,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,IAAI,EAAE,IAAA,EAAK;AAC9F;AAEA,SAAS,0BAAA,CAA2B,MAA0B,IAAA,EAAmC;AAC/F,EAAA,MAAM,KAAA,GAAQ,wBAAwB,IAAI,CAAA;AAC1C,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AAEnB,EAAA,IAAI,IAAA,KAAS,MAAA,IAAU,IAAA,KAAS,WAAA,EAAa;AAC3C,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAA,EAAM,MAAM,CAAA;AACtC,IAAA,OAAO,OAAO,CAAA,EAAG,KAAK,IAAI,sBAAA,CAAuB,IAAI,CAAC,CAAA,CAAA,GAAK,KAAA;AAAA,EAC7D;AAEA,EAAA,IAAI,SAAS,gBAAA,EAAkB;AAC7B,IAAA,MAAM,OAAA,GAAU,YAAA,CAAa,IAAA,EAAM,SAAS,CAAA;AAC5C,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAA,EAAM,MAAM,CAAA;AACtC,IAAA,MAAM,MAAA,GAAS,CAAC,OAAA,EAAS,IAAI,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA;AAC1D,IAAA,OAAO,SAAS,CAAA,EAAG,KAAK,IAAI,sBAAA,CAAuB,MAAM,CAAC,CAAA,CAAA,GAAK,KAAA;AAAA,EACjE;AAEA,EAAA,IAAI,SAAS,YAAA,EAAc;AACzB,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAA,EAAM,MAAM,CAAA;AACtC,IAAA,MAAM,OAAA,GAAU,YAAA,CAAa,IAAA,EAAM,SAAS,CAAA;AAC5C,IAAA,MAAM,MAAA,GAAS,CAAC,IAAA,EAAM,OAAO,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACvD,IAAA,OAAO,SAAS,CAAA,EAAG,KAAK,IAAI,sBAAA,CAAuB,MAAM,CAAC,CAAA,CAAA,GAAK,KAAA;AAAA,EACjE;AAEA,EAAA,IAAI,SAAS,aAAA,EAAe;AAC1B,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAA,EAAM,MAAM,CAAA;AACtC,IAAA,MAAM,IAAA,GACJ,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,MAAA,GAAa,IAAA,CAAiC,IAAA;AAC3G,IAAA,MAAM,MAAA,GAAS,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,EAAG,OAAO,IAAA,KAAS,QAAA,GAAW,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,GAAK,MAAA;AAC/E,IAAA,OAAO,SAAS,CAAA,EAAG,KAAK,IAAI,sBAAA,CAAuB,MAAM,CAAC,CAAA,CAAA,GAAK,KAAA;AAAA,EACjE;AAEA,EAAA,OAAO,KAAA;AACT;AAoBO,SAAS,qBAAA,GAAwB;AACtC,EAAA,OAAO3B,4BAAA,CAAW;AAAA,IAChB,EAAA,EAAI,cAAA;AAAA,IACJ,WAAA,EAAaD,MAAE,GAAA,EAAI;AAAA,IACnB,YAAA,EAAcA,MAAE,GAAA,EAAI;AAAA,IACpB,OAAA,EAAS,OAAM,MAAA,KAAU;AACvB,MAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAQ,WAAA,EAAY,GAAI,MAAA;AAC3C,MAAA,MAAM,KAAA,GAAQ,SAAA;AAcd,MAAA,MAAM,MAAA,GAAU,OAAeE,+BAAa,CAAA;AAC5C,MAAA,MAAM,WAAW,WAAA,EAAY;AAO7B,MAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA;AACvD,MAAA,MAAM,OAAO,aAAA,EAAe,IAAA;AAG5B,MAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAIlB,MAAA,IAAI,KAAA,CAAM,qBAAA,IAAyB,KAAA,CAAM,cAAA,EAAgB,WAAA,EAAa;AACpE,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,MAAM,WAAW,KAAA,CAAM,gBAAA,CAAiB,KAAA,CAAM,gBAAA,CAAiB,SAAS,CAAC,CAAA;AACzE,MAAA,MAAM,kBAAA,GAAsB,QAAA,EAAU,SAAA,IAAa,EAAC;AAIpD,MAAA,IAAI,kBAAA,CAAmB,MAAA,GAAS,CAAA,IAAK,kBAAA,CAAmB,KAAA,CAAM,CAAA,EAAA,KAAM,mBAAA,CAAoB,EAAA,CAAG,QAAA,IAAY,EAAE,CAAC,CAAA,EAAG;AAC3G,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,MAAM,QAAA,GAAW,SAAS,KAAA,EAAO,QAAA;AAGjC,MAAA,MAAM,cAAA,GAAiB,IAAIvB,gCAAA,EAAe;AAC1C,MAAA,IAAI,SAAS,qBAAA,EAAuB;AAClC,QAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,qBAAqB,CAAA,EAAG;AACzE,UAAA,cAAA,CAAe,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,QAC/B;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAS,MAAMkD,kCAAA,CAAiB,MAAa,CAAA;AACnD,MAAA,MAAM,MAAA,GAAS,MAAMC,+BAAA,CAAc,KAAA,EAAO,QAAQ,CAAA;AAGlD,MAAA,IAAI,CAAC,UAAU,MAAA,CAAO,MAAA,KAAW,YAAY,CAAC,KAAA,IAAS,CAAC,QAAA,EAAU;AAChE,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,MAAM,SAAA,GAAYC,+CAA6B,MAAA,EAAQ;AAAA,QACrD,cAAc,OAAO,IAAA,CAAK,KAAA,KAAU,QAAA,GAAW,KAAK,KAAA,GAAQ,MAAA;AAAA,QAC5D,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,UAAU,IAAA,CAAK;AAAA,OAChB,CAAA;AAGD,MAAA,MAAM,SAAA,GAA0B,EAAE,GAAG,KAAA,EAAM;AAC3C,MAAA,IAAI,MAAA,CAAO,QAAA,IAAY,SAAA,CAAU,OAAA,EAAS;AACxC,QAAA,IAAI,UAAU,cAAA,EAAgB;AAC5B,UAAA,SAAA,CAAU,cAAA,GAAiB;AAAA,YACzB,GAAG,SAAA,CAAU,cAAA;AAAA,YACb,WAAA,EAAa;AAAA,WACf;AAAA,QACF;AACA,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,IAAI;AACF,YAAA,MAAM,cAAA,CAAe,MAAA,EAAQ,KAAA,CAAM,KAAA,EAAO;AAAA,cACxC,IAAA,EAAM,MAAA;AAAA,cACN,OAAO,KAAA,CAAM,KAAA;AAAA,cACb,IAAA,EAAA,OAAA;AAAA,cACA,OAAA,EAAS;AAAA,gBACP,WAAW,MAAA,CAAO,SAAA;AAAA,gBAClB,WAAW,MAAA,CAAO,QAAA;AAAA,gBAClB,SAAS,SAAA,CAAU,OAAA;AAAA,gBACnB,MAAA,EAAQ,KAAA;AAAA,gBACR,QAAQ,MAAA,CAAO,MAAA;AAAA,gBACf,SAAS,EAAC;AAAA,gBACV,MAAA,EAAQ,MAAA;AAAA,gBACR,QAAA,EAAU,CAAA;AAAA,gBACV,QAAA,EAAU,KAAA;AAAA,gBACV,cAAA,EAAgB,IAAA;AAAA,gBAChB,gBAAA,EAAkB;AAAA;AACpB,aACM,CAAA;AAAA,UACV,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AACA,QAAA,OAAO,SAAA;AAAA,MACT;AAIA,MAAA,MAAM,mBAAA,GAAsB,KAAK,KAAA,IAAS,OAAO,KAAK,KAAA,KAAU,QAAA,GAAW,KAAK,KAAA,GAAQ,MAAA;AAExF,MAAA,IAAI,gBAAA,GAA4B,uBAAuB,SAAA,CAAU,YAAA;AACjE,MAAA,IAAI,OAAO,qBAAqB,UAAA,EAAY;AAC1C,QAAA,gBAAA,GAAmB,MAAO,gBAAA,CAA4C,EAAE,cAAA,EAAgB,QAAQ,CAAA;AAAA,MAClG;AACA,MAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,QAAA,OAAO,KAAA;AAAA,MACT;AAGA,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAM,iBAAA,GAAoB,CAAC,QAAA,EAAkC,IAAA,KAAmB;AAC9E,UAAA,MAAM,IAAA,GACJ,QAAA,CAAS,IAAA,KAAS,QAAA,GAAW,QAAA,CAAS,OAAO,uBAAA,CAAwB,QAAA,CAAS,IAAA,IAAQ,QAAA,CAAS,OAAO,CAAA;AACxG,UAAA,MAAM,OAAA,GACJ,QAAA,CAAS,IAAA,KAAS,QAAA,GACd,QAAA,CAAS,OAAA,GACT,0BAAA,CAA2B,QAAA,CAAS,IAAA,IAAQ,QAAA,CAAS,OAAA,EAAS,IAAI,CAAA;AACxE,UAAA,IAAI,CAAC,OAAA,IAAW,CAAC,MAAA,EAAQ;AACzB,UAAA,cAAA,CAAe,MAAA,EAAQ,MAAM,KAAA,EAAO;AAAA,YAClC,IAAA,EAAM,MAAA;AAAA,YACN,OAAO,KAAA,CAAM,KAAA;AAAA,YACb,IAAA,EAAA,OAAA;AAAA,YACA,OAAA,EAAS;AAAA,cACP,WAAW,MAAA,CAAO,SAAA;AAAA,cAClB,SAAA,EAAW,OAAO,QAAA,GAAW,CAAA;AAAA,cAC7B,SAAS,SAAA,CAAU,OAAA;AAAA,cACnB,MAAA,EAAQ,KAAA;AAAA,cACR,QAAQ,MAAA,CAAO,MAAA;AAAA,cACf,SAAS,EAAC;AAAA,cACV,QAAA,EAAU,CAAA;AAAA,cACV,QAAA,EAAU,KAAA;AAAA,cACV,cAAA,EAAgB,KAAA;AAAA,cAChB,gBAAA,EAAkB,IAAA;AAAA,cAClB,OAAA,EAAS,IAAA;AAAA,cACT,UAAU,CAAC,EAAE,GAAG,QAAA,EAAU,IAAA,EAAM,SAAS;AAAA;AAC3C,WACM,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,UAAC,CAAC,CAAA;AAAA,QAC1B,CAAA;AAEA,QAAA,MAAM,kBAAA,GAAqB,CAAC,MAAA,KAAsD;AAChF,UAAA,IAAI,CAAC,OAAO,UAAA,EAAY;AACxB,UAAA,KAAA,CAAM,YAAY;AAChB,YAAA,IAAI,YAAA,GAAe,EAAA;AACnB,YAAA,IAAI,UAAA,GAAa,EAAA;AACjB,YAAA,WAAA,MAAiB,KAAA,IAAS,OAAO,UAAA,EAAa;AAC5C,cAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAC/B,gBAAA,YAAA,IAAiB,KAAA,CAAc,SAAS,IAAA,IAAQ,EAAA;AAChD,gBAAA,MAAM,MAAA,GAAS,uCAAuC,YAAY,CAAA;AAClE,gBAAA,IAAI,MAAA,IAAU,WAAW,UAAA,EAAY;AACnC,kBAAA,UAAA,GAAa,MAAA;AACb,kBAAA,iBAAA,CAAkB,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,QAAQ,CAAA;AAAA,gBACvD;AAAA,cACF,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,WAAA,EAAa;AACrC,gBAAA,iBAAA;AAAA,kBACE;AAAA,oBACE,IAAA,EAAM,WAAA;AAAA,oBACN,IAAA,EAAO,MAAc,OAAA,EAAS,QAAA;AAAA,oBAC9B,OAAA,EAAU,MAAc,OAAA,EAAS;AAAA,mBACnC;AAAA,kBACC,MAAc,OAAA,EAAS;AAAA,iBAC1B;AAAA,cACF;AAAA,YACF;AAAA,UACF,CAAA,GAAG;AAAA,QACL,CAAA;AAGA,QAAA,IAAI,MAAA;AACJ,QAAA,IAAI,KAAK,MAAA,EAAQ;AACf,UAAA,MAAA,GACE,OAAO,KAAK,MAAA,KAAW,QAAA,GAClB,QAAQ,SAAA,GAAY,IAAA,CAAK,MAAa,CAAA,GACvC,IAAA,CAAK,MAAA;AAAA,QACb;AACA,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,MAAM,UAAA,GACJ,OAAO,gBAAA,KAAqB,QAAA,GACxB,MAAMzB,oCAAA,CAAmB,gBAAA,EAAkB,cAAA,EAAgB,MAAM,CAAA,GACjE,gBAAA;AAGN,UAAA,MAAM,SAAA,GACJ,OAAO,IAAA,CAAK,KAAA,KAAU,UAAA,GAChB,MAAO,IAAA,CAAK,KAAA,CAAiC,EAAE,cAAA,EAAgB,MAAA,EAAQ,IACzE,IAAA,CAAK,KAAA;AAEX,UAAA,MAAA,GAAS0B,kCAAA,CAAiB;AAAA,YACxB,MAAA;AAAA,YACA,UAAA;AAAA,YACA,QAAQ,SAAA,CAAU,MAAA;AAAA,YAClB,KAAA,EAAO,SAAA;AAAA,YACP,cAAA;AAAA,YACA,QAAA,EAAU,kBAAA;AAAA,YACV,GAAI,UAAU,QAAA,GAAW,EAAE,UAAU,SAAA,CAAU,QAAA,KAAa;AAAC,WAC9D,CAAA;AAAA,QACH;AAGA,QAAA,MAAMC,YAAAA,GAAc,IAAI/C,6BAAA,EAAY;AACpC,QAAA+C,YAAAA,CAAY,WAAA,CAAY,KAAA,CAAM,gBAAgB,CAAA;AAE9C,QAAA,MAAM,SAAA,GAAa,QAAA,EAAU,SAAA,IAAa,EAAC;AAC3C,QAAA,MAAM,WAAA,GAAe,QAAA,EAAU,WAAA,IAAe,EAAC;AAC/C,QAAA,MAAM,WAAA,GAAuC;AAAA,UAC3C,SAAA,EAAW,OAAO,QAAA,GAAW,CAAA;AAAA,UAC7B,eAAe,SAAA,CAAU,OAAA;AAAA,UACzB,cAAc,MAAA,CAAO,SAAA;AAAA,UACrB,WAAA,EAAa,UAAU,IAAA,IAAQ,EAAA;AAAA,UAC/B,SAAA,EAAW,SAAA,CAAU,GAAA,CAAI,CAAA,EAAA,MAAO;AAAA,YAC9B,IAAA,EAAM,GAAG,QAAA,IAAY,EAAA;AAAA,YACrB,IAAA,EAAO,EAAA,CAAG,IAAA,IAAQ;AAAC,WACrB,CAAE,CAAA;AAAA,UACF,QAAA,EAAUA,YAAAA,CAAY,GAAA,CAAI,GAAA,CAAI,EAAA,EAAG;AAAA,UACjC,WAAA,EAAa,WAAA,CAAY,GAAA,CAAI,CAAA,EAAA,MAAO;AAAA,YAClC,IAAA,EAAM,GAAG,QAAA,IAAY,EAAA;AAAA,YACrB,MAAA,EAAS,EAAA,CAAG,MAAA,IAAsC;AAAC,WACrD,CAAE,CAAA;AAAA,UACF,OAAA,EAAS,SAAS,OAAA,IAAW,EAAA;AAAA,UAC7B,SAAA,EAAW,SAAS,SAAA,IAAa,EAAA;AAAA,UACjC,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,QAAA;AAAA,UACA,UAAA,EAAY,SAAS,KAAA,EAAO,UAAA;AAAA,UAC5B,eAAe,QAAA,CAAS;AAAA,SAC1B;AAGA,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,cAAA,CAAe,MAAA,EAAQ,MAAM,KAAA,EAAO;AAAA,YAClC,IAAA,EAAM,MAAA;AAAA,YACN,OAAO,KAAA,CAAM,KAAA;AAAA,YACb,IAAA,EAAA,OAAA;AAAA,YACA,OAAA,EAAS;AAAA,cACP,WAAW,MAAA,CAAO,SAAA;AAAA,cAClB,SAAA,EAAW,OAAO,QAAA,GAAW,CAAA;AAAA,cAC7B,SAAS,SAAA,CAAU,OAAA;AAAA,cACnB,MAAA,EAAQ,KAAA;AAAA,cACR,QAAQ,MAAA,CAAO,MAAA;AAAA,cACf,SAAS,EAAC;AAAA,cACV,QAAA,EAAU,CAAA;AAAA,cACV,QAAA,EAAU,KAAA;AAAA,cACV,cAAA,EAAgB,KAAA;AAAA,cAChB,gBAAA,EAAkB,IAAA;AAAA,cAClB,OAAA,EAAS;AAAA;AACX,WACM,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,UAAC,CAAC,CAAA;AAAA,QAC1B;AAEA,QAAA,MAAA,GAAS,MAAMN,6CAA2B,CAAC,MAAM,GAAG,WAAA,EAAa,EAAE,QAAA,EAAU,KAAA,EAAO,CAAA;AAAA,MACtF,SAAS,KAAA,EAAY;AACnB,QAAA,MAAM,SAAS,CAAA,wBAAA,EAA2B,KAAA,EAAO,OAAA,IAAW,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AACzE,QAAA,MAAA,GAAS;AAAA,UACP,QAAA,EAAU,KAAA;AAAA,UACV,gBAAA,EAAkB,MAAA;AAAA,UAClB,OAAA,EAAS;AAAA,YACP;AAAA,cACE,KAAA,EAAO,CAAA;AAAA,cACP,MAAA,EAAQ,KAAA;AAAA,cACR,MAAA;AAAA,cACA,QAAA,EAAUO,gCAAA;AAAA,cACV,UAAA,EAAY,YAAA;AAAA,cACZ,QAAA,EAAU,CAAA;AAAA,cACV,OAAA,EAAS;AAAA;AACX,WACF;AAAA,UACA,aAAA,EAAe,CAAA;AAAA,UACf,QAAA,EAAU;AAAA,SACZ;AAAA,MACF;AAGA,MAAA,MAAM,gBAAgB,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA;AACxD,MAAA,MAAM,WAAA,GAAc,CAAC,CAAC,aAAA;AACtB,MAAA,MAAM,OAAA,GACJ,CAAC,WAAA,IACD,CAAC,OAAO,QAAA,IACR,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,OAAK,CAAA,CAAE,QAAA,KAAaA,gCAAA,IAAkB,CAAA,CAAE,UAAUC,oCAAkB,CAAA;AAG1F,MAAA,MAAM,QAAA,GAAW,OAAO,QAAA,GAAW,CAAA;AACnC,MAAA,MAAM,cAAA,GAAiB,YAAY,SAAA,CAAU,OAAA;AAC7C,MAAA,IAAI,SAAwC,MAAA,CAAO,MAAA;AACnD,MAAA,IAAI,YAAA;AACJ,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAA,GAAS,QAAA;AACT,QAAA,YAAA,GAAe,eAAe,MAAA,IAAU,kDAAA;AAAA,MAC1C,CAAA,MAAA,IAAW,OAAO,QAAA,EAAU;AAC1B,QAAA,MAAA,GAAS,MAAA;AAAA,MACX,CAAA,MAAA,IAAW,cAAA,IAAkB,CAAC,OAAA,EAAS;AACrC,QAAA,MAAA,GAAS,QAAA;AACT,QAAA,YAAA,GAAe,CAAA,8BAAA,EAAiC,UAAU,OAAO,CAAA,+DAAA,CAAA;AAAA,MACnE;AAEA,MAAA,MAAM,OAAA,GAA+B;AAAA,QACnC,GAAG,MAAA;AAAA,QACH,QAAA;AAAA,QACA,MAAA;AAAA,QACA,YAAA,EAAc,MAAA,KAAW,QAAA,GAAW,YAAA,GAAe,MAAA;AAAA,QACnD,SAAA,EAAW,KAAK,GAAA;AAAI,OACtB;AACA,MAAA,MAAMC,gCAAA,CAAe,KAAA,EAAO,QAAA,EAAU,OAAA,EAAS,cAAc,CAAA;AAG7D,MAAA,MAAM,cAAA,GAAiB,CAAC,MAAA,CAAO,QAAA,IAAY,CAAC,OAAA,IAAW,CAAC,eAAe,CAAC,cAAA;AACxE,MAAA,IAAI,UAAU,cAAA,EAAgB;AAC5B,QAAA,SAAA,CAAU,cAAA,GAAiB;AAAA,UACzB,GAAG,SAAA,CAAU,cAAA;AAAA,UACb,WAAA,EAAa;AAAA,SACf;AAAA,MACF;AAEA,MAAA,MAAM,gBAAA,GAAmB,KAAA;AACzB,MAAA,MAAM,qBAAA,GAAwB;AAAA,QAC5B,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,SAAA,EAAW,QAAA;AAAA,QACX,SAAS,SAAA,CAAU,OAAA;AAAA,QACnB,QAAQ,MAAA,CAAO,QAAA;AAAA,QACf,MAAA;AAAA,QACA,YAAA;AAAA,QACA,WAAA;AAAA,QACA,cAAA,EAAgB,OAAA;AAAA,QAChB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,MAAA,EAAQ,MAAA,KAAW,QAAA,GAAW,YAAA,GAAe,MAAA,CAAO,gBAAA;AAAA,QACpD,UAAU,MAAA,CAAO,aAAA;AAAA,QACjB,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,cAAA;AAAA,QACA;AAAA,OACF;AAGA,MAAA,MAAM,WAAA,GAAc,IAAIlD,6BAAA,EAAY;AACpC,MAAA,WAAA,CAAY,WAAA,CAAY,UAAU,gBAAgB,CAAA;AAElD,MAAA,IAAI,mBAAmB,SAAA,CAAU,SAAA;AACjC,MAAA,MAAM,aAAamD,2CAAA,CAA0B;AAAA,QAC3C,WAAA;AAAA,QACA,QAAQ,MAAA,GACJ;AAAA,UACE,MAAA,EAAQ,OAAO,IAAA,EAAM,QAAA,KAAa;AAChC,YAAA,MAAM,cAAA,CAAe,MAAA,EAAQ,KAAA,CAAM,KAAA,EAAO,IAAiB,CAAA;AAAA,UAC7D;AAAA,SACF,GACA,MAAA;AAAA,QACJ,yBAAyB,MAAM;AAC7B,UAAA,gBAAA,GAAmB,QAAQ,UAAA,IAAa,IAAK,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACpG,UAAA,SAAA,CAAU,SAAA,GAAY,gBAAA;AACtB,UAAA,OAAO,gBAAA;AAAA,QACT;AAAA,OACD,CAAA;AAED,MAAA,MAAM,QAAA,GAAW,OAAO,gBAAA,IAAoB,+BAAA;AAC5C,MAAA,MAAM,YAAA,GAAe,iBACjB,CAAA,cAAA,EAAiB,QAAQ,IAAI,SAAA,CAAU,OAAO,mDAAmD,QAAQ;;AAAA,kCAAA,EAAyC,MAAA,CAAO,SAAS,CAAA,CAAA,GAClK,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAA,EAAI,SAAA,CAAU,OAAO,CAAA;AAAA,EAAM,qBAAA,CAAsB,UAAU,EAAE,CAAA,CAAA;AACvF,MAAA,MAAM,UAAA,CAAW;AAAA,QACf,IAAA,EAAM,iBAAA;AAAA,QACN,QAAA,EAAU,YAAA;AAAA,QACV,UAAA,EAAY,EAAE,IAAA,EAAM,YAAA,EAAa;AAAA,QACjC,QAAA,EAAU,EAAE,cAAA,EAAgB,qBAAA;AAAsB,OACnD,CAAA;AAGD,MAAA,SAAA,CAAU,gBAAA,GAAmB,YAAY,SAAA,EAAU;AAGnD,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,IAAI;AACF,UAAA,MAAM,cAAA,CAAe,MAAA,EAAQ,KAAA,CAAM,KAAA,EAAO;AAAA,YACxC,IAAA,EAAM,MAAA;AAAA,YACN,OAAO,KAAA,CAAM,KAAA;AAAA,YACb,IAAA,EAAA,OAAA;AAAA,YACA,OAAA,EAAS;AAAA,WACH,CAAA;AAAA,QACV,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAEA,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,GACD,CAAA;AACH;AClfA,IAAM,oBAAA,GAAuB,CAAA,EAAG,cAAA,CAAe,iBAAiB,CAAA,aAAA,CAAA;AAazD,SAAS,4BAAA,GAA+B;AAC7C,EAAA,OAAOpC,4BAAA,CAAW;AAAA,IAChB,EAAA,EAAI,oBAAA;AAAA,IACJ,WAAA,EAAaD,MAAE,GAAA,EAAI;AAAA,IACnB,YAAA,EAAcA,MAAE,GAAA,EAAI;AAAA,IACpB,OAAA,EAAS,OAAM,MAAA,KAAU;AACvB,MAAA,MAAM,EAAE,SAAA,EAAW,WAAA,EAAY,GAAI,MAAA;AACnC,MAAA,MAAM,UAAA,GAAa,SAAA;AACnB,MAAA,MAAM,WAAW,WAAA,EAA+B;AAChD,MAAA,MAAM,QAAQ,QAAA,CAAS,KAAA;AACvB,MAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA;AACjD,MAAA,MAAM,UAAU,aAAA,EAAe,mBAAA;AAE/B,MAAA,IAAI,CAAC,SAAS,OAAO,UAAA;AAErB,MAAA,IAAI;AACF,QAAA,MAAM,cAAA,GAAiB,QAAQ,SAAS,CAAA;AACxC,QAAA,IAAI,cAAA,CAAe,MAAA,KAAW,CAAA,EAAG,OAAO,UAAA;AAExC,QAAA,MAAM,SAAA,GAAY,IAAId,6BAAA,EAAY;AAClC,QAAA,SAAA,CAAU,WAAA,CAAY,WAAW,gBAAgB,CAAA;AACjD,QAAA,SAAA,CAAU,2BAAA,CAA4B,WAAW,SAAS,CAAA;AAE1D,QAAA,MAAM,aAAA,GACH,MAAA,CAAO,MAAA,EAA+B,UAAA,IAAa,IACpD,UAAA,CAAW,MAAA,EAAQ,UAAA,IAAa,IAChC,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAEnB,QAAA,MAAM,MAAA,GAAU,OAAegB,+BAAa,CAAA;AAC5C,QAAA,KAAA,MAAW,iBAAiB,cAAA,EAAgB;AAC1C,UAAA,MAAM,mBAAA,GAAsB,SAAA,CAAU,SAAA,CAAU,aAAa,CAAA;AAC7D,UAAA,IAAI,MAAA,EAAQ;AACV,YAAA,MAAM,cAAA,CAAe,MAAA,EAAQ,KAAA,EAAO,mBAAA,CAAoB,YAAmB,CAAA;AAAA,UAC7E;AAAA,QACF;AAEA,QAAA,OAAO;AAAA,UACL,GAAG,UAAA;AAAA,UACH,gBAAA,EAAkB,UAAU,SAAA,EAAU;AAAA,UACtC,SAAA,EAAW,aAAA;AAAA,UACX,UAAA,EAAY;AAAA,YACV,GAAG,UAAA,CAAW,UAAA;AAAA,YACd,SAAA,EAAW,aAAA;AAAA,YACX,WAAA,EAAa;AAAA;AACf,SACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAGN,QAAA,OAAO,UAAA;AAAA,MACT;AAAA,IACF;AAAA,GACD,CAAA;AACH;;;ACxBA,IAAM,yBAAA,GAA4BF,MAAE,MAAA,CAAO;AAAA,EACzC,cAAA,EAAgBA,KAAAA,CAAE,OAAA,CAAQ,eAAe,CAAA;AAAA,EACzC,KAAA,EAAOA,MAAE,MAAA,EAAO;AAAA,EAChB,OAAA,EAASA,MAAE,MAAA,EAAO;AAAA,EAClB,SAAA,EAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC/B,gBAAA,EAAkBA,MAAE,GAAA,EAAI;AAAA,EACxB,aAAA,EAAeA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,KAAK,CAAA;AAAA,EAC9B,WAAA,EAAa,iBAAA;AAAA;AAAA,EAEb,SAAA,EAAWA,KAAAA,CAAE,KAAA,CAAM,oBAAoB,EAAE,QAAA,EAAS;AAAA,EAClD,OAAA,EAASA,MAAE,GAAA,EAAI;AAAA,EACf,KAAA,EAAOA,MAAE,GAAA,EAAI;AAAA,EACb,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA;AAAA,EAEpB,aAAA,EAAeA,KAAAA,CAAE,GAAA,EAAI,CAAE,QAAA,EAAS;AAAA,EAChC,aAAA,EAAeA,KAAAA,CAAE,GAAA,EAAI,CAAE,QAAA,EAAS;AAAA;AAAA;AAAA,EAGhC,qBAAA,EAAuBA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAUA,KAAAA,CAAE,GAAA,EAAK,CAAA,CAAE,QAAA;AACvD,CAAC,CAAA;AASD,IAAM,oBAAA,GAAuB,yBAAyB,MAAA,CAAO;AAAA;AAAA,EAE3D,WAAWA,KAAAA,CAAE,KAAA,CAAMA,MAAE,GAAA,EAAK,EAAE,QAAA;AAC9B,CAAC,CAAA;AAiBM,SAAS,6BAA6B,OAAA,EAAyC;AACpF,EAAA,MAAM,QAAA,GAAW,OAAA,EAAS,QAAA,IAAY,oBAAA,CAAqB,SAAA;AAG3D,EAAA,MAAM,mBAAmB,6BAAA,EAA8B;AAGvD,EAAA,MAAM,eAAe,yBAAA,EAA0B;AAG/C,EAAA,MAAM,iBAAiB,2BAAA,EAA4B;AAGnD,EAAA,MAAM,0BAA0B,oCAAA,EAAqC;AAIrE,EAAA,MAAM,kBAAkB,4BAAA,EAA6B;AAKrD,EAAA,MAAM,kBAAA,GAAqB,gCAAgC,QAAQ,CAAA;AAKnE,EAAA,MAAM,WAAW,qBAAA,EAAsB;AAMvC,EAAA,MAAM,0BAA0BsC,gCAAA,CAAe;AAAA,IAC7C,IAAI,cAAA,CAAe,iBAAA;AAAA,IACnB,WAAA,EAAa,oBAAA;AAAA,IACb,YAAA,EAAc,oBAAA;AAAA,IACd,OAAA,EAAS;AAAA,MACP,uBAAuB,CAAA,MAAA,KAAU;AAK/B,QAAA,OACE,OAAO,cAAA,KAAmB,SAAA,IAC1B,OAAO,cAAA,KAAmB,QAAA,IAC1B,OAAO,cAAA,KAAmB,WAAA;AAAA,MAE9B,CAAA;AAAA;AAAA;AAAA,MAGA,aAAA,EAAeC,wCAAA;AAAA,MACf,cAAA,EAAgB,KAAA;AAAA,MAChB,WAAA,EAAa,IAAA;AAAA;AAAA;AAAA,MAGb,aAAA,EAAe;AAAA,QACb,QAAA,EAAA,CAAA;AAAA;AACF;AACF,GACD,CAAA,CAEE,GAAA;AAAA,IACC,OAAO,EAAE,SAAA,EAAU,KAAM;AACvB,MAAA,MAAM,KAAA,GAAQ,SAAA;AACd,MAAA,OAAO;AAAA,QACL,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,kBAAkB,KAAA,CAAM,gBAAA;AAAA,QACxB,eAAe,KAAA,CAAM,aAAA;AAAA,QACrB,aAAa,KAAA,CAAM,WAAA;AAAA,QACnB,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,WAAW,KAAA,CAAM,cAAA;AAAA,QACjB,eAAe,KAAA,CAAM,aAAA;AAAA,QACrB,eAAe,KAAA,CAAM;AAAA,OACvB;AAAA,IACF,CAAA;AAAA,IACA,EAAE,IAAI,kBAAA;AAAmB,GAC3B,CAEC,IAAA,CAAK,gBAAgB,CAAA,CAErB,GAAA;AAAA,IACC,OAAO,EAAE,SAAA,EAAU,KAAM;AACvB,MAAA,MAAM,SAAA,GAAY,SAAA;AAClB,MAAA,OAAA,CAAQ,SAAA,CAAU,SAAA,IAAa,EAAC,EAAG,IAAI,CAAA,QAAA,MAAa;AAAA,QAClD,GAAG,QAAA;AAAA,QACH,cAAc,SAAA,CAAU;AAAA,OAC1B,CAAE,CAAA;AAAA,IACJ,CAAA;AAAA,IACA,EAAE,IAAI,oBAAA;AAAqB,GAC7B,CAEC,OAAA,CAAQ,YAAY,CAAA,CAEpB,GAAA;AAAA,IACC,OAAO,EAAE,SAAA,EAAW,aAAA,EAAe,aAAY,KAAM;AACnD,MAAA,MAAM,WAAA,GAAc,SAAA;AACpB,MAAA,MAAM,SAAA,GAAY,aAAA,CAAc,gBAAA,CAAiB,EAAE,CAAA;AACnD,MAAA,MAAM,WAAW,WAAA,EAAY;AAE7B,MAAA,OAAO;AAAA,QACL,SAAA;AAAA,QACA,WAAA;AAAA,QACA,OAAO,QAAA,CAAS,KAAA;AAAA,QAChB,SAAS,QAAA,CAAS,OAAA;AAAA,QAClB,WAAW,QAAA,CAAS,SAAA;AAAA,QACpB,KAAA,EAAO,SAAA,EAAW,KAAA,IAAS,QAAA,CAAS;AAAA,OACtC;AAAA,IACF,CAAA;AAAA,IACA,EAAE,IAAI,sBAAA;AAAuB,GAC/B,CAEC,KAAK,cAAc,CAAA,CAEnB,KAAK,uBAAuB,CAAA,CAI5B,IAAA,CAAK,eAAe,CAAA,CAEpB,GAAA;AAAA,IACC,OAAO,EAAE,SAAA,EAAW,WAAA,EAAY,KAAM;AACpC,MAAA,MAAM,eAAA,GAAkB,SAAA;AACxB,MAAA,MAAM,WAAW,WAAA,EAAY;AAG7B,MAAA,MAAM,aAAa,8BAAA,CAA+B;AAAA,QAChD,YAAA,EAAc,QAAA;AAAA,QACd;AAAA,OACD,CAAA;AAGD,MAAA,MAAM,iBAAA,GAAoC;AAAA,QACxC,GAAG,UAAA;AAAA,QACH,WAAW,QAAA,CAAS;AAAA,OACtB;AAEA,MAAA,OAAO,iBAAA;AAAA,IACT,CAAA;AAAA,IACA,EAAE,IAAI,wBAAA;AAAyB,IAMhC,IAAA,CAAK,kBAAkB,EAIvB,IAAA,CAAK,QAAQ,EACb,MAAA,EAAO;AAGV,EAAA,OACED,gCAAA,CAAe;AAAA,IACb,IAAI,cAAA,CAAe,YAAA;AAAA,IACnB,WAAA,EAAa,yBAAA;AAAA,IACb,YAAA,EAAc,0BAAA;AAAA,IACd,OAAA,EAAS;AAAA,MACP,uBAAuB,CAAA,MAAA,KAAU;AAK/B,QAAA,OACE,OAAO,cAAA,KAAmB,SAAA,IAC1B,OAAO,cAAA,KAAmB,QAAA,IAC1B,OAAO,cAAA,KAAmB,WAAA;AAAA,MAE9B,CAAA;AAAA;AAAA;AAAA,MAGA,aAAA,EAAeC,wCAAA;AAAA,MACf,cAAA,EAAgB,KAAA;AAAA;AAAA,MAEhB,aAAA,EAAe;AAAA,QACb,QAAA,EAAA,CAAA;AAAA;AACF;AACF,GACD,CAAA,CAEE,GAAA;AAAA,IACC,OAAO,EAAE,SAAA,EAAU,KAAM;AACvB,MAAA,MAAM,KAAA,GAAQ,SAAA;AACd,MAAA,MAAM,cAAA,GAAiC;AAAA,QACrC,GAAG,KAAA;AAAA,QACH,cAAA,EAAgB,CAAA;AAAA,QAChB,kBAAkB,EAAC;AAAA,QACnB,gBAAA,EAAkB;AAAA,UAChB,WAAA,EAAa,CAAA;AAAA,UACb,YAAA,EAAc,CAAA;AAAA,UACd,WAAA,EAAa;AAAA,SACf;AAAA,QACA,cAAA,EAAgB;AAAA,OAClB;AACA,MAAA,OAAO,cAAA;AAAA,IACT,CAAA;AAAA,IACA,EAAE,IAAI,sBAAA;AAAuB,GAC/B,CAEC,OAAA,CAAQ,uBAAA,EAAyB,OAAM,MAAA,KAAU;AAChD,IAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAO,GAAI,MAAA;AAC9B,IAAA,MAAM,KAAA,GAAQ,SAAA;AACd,IAAA,MAAM,QAAA,GAAW,OAAO,WAAA,EAAY;AACpC,IAAA,MAAM,MAAA,GAAU,OAAerC,+BAAa,CAAA;AAC5C,IAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA;AAIvD,IAAA,IAAI,gBAAA,GAAmB,KAAA;AAGvB,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,IAAI,MAAM,mBAAA,EAAqB;AAC7B,MAAA,gBAAA,GAAmB,IAAA;AACnB,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,KAAA,CAAM,mBAAA,GAAsB,KAAA;AAAA,IAC9B;AAMA,IAAA,IAAI,cAAA,GAAiB,KAAA,CAAM,cAAA,EAAgB,WAAA,KAAgB,IAAA;AAC3D,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,EAAS,QAAA,IAAY,QAAA;AAC/C,IAAA,MAAM,aAAA,GAAgB,MAAM,cAAA,GAAiB,WAAA;AAQ7C,IAAA,IAAI,eAAA,GAAkB,KAAA;AACtB,IAAA,IAAI,cAAA,IAAkB,aAAA,IAAiB,CAAC,gBAAA,EAAkB;AACxD,MAAA,MAAM,WAAW,aAAA,EAAe,QAAA;AAChC,MAAA,IAAI,QAAA,IAAY,KAAA,CAAM,gBAAA,CAAiB,MAAA,GAAS,CAAA,EAAG;AACjD,QAAA,MAAM,aAAa,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,QAAA,GAAW,CAAC,QAAQ,CAAA;AAGjE,QAAA,MAAM,QAAQ,KAAA,CAAM,gBAAA;AACpB,QAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,CAAA,SAAA,KAAa,SAAA,CAAU,EAAE,KAAA,EAAO,CAAC,CAAC,CAAA;AACnF,QAAA,eAAA,GAAkB,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,MACxC;AAAA,IACF;AAEA,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,gBAAA,GAAmB,IAAA;AAAA,IACrB;AAIA,IAAA,MAAM,gBAAA,GAAmB,CAAC,CAAE,KAAA,CAAc,gBAAA;AAC1C,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,gBAAA,GAAmB,IAAA;AACnB,MAAA,QAAA,GAAW,IAAA;AAEX,MAAC,MAAc,gBAAA,GAAmB,KAAA;AAAA,IACpC;AAQA,IAAA,IAAI,MAAA,IAAU,eAAe,mBAAA,EAAqB;AAChD,MAAA,IAAI;AACF,QAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,mBAAA,CAAoB,SAAS,CAAA;AAClE,QAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,UAAA,MAAM,SAAA,GAAY,IAAIhB,6BAAA,EAAY;AAClC,UAAA,SAAA,CAAU,WAAA,CAAY,MAAM,gBAAgB,CAAA;AAC5C,UAAA,SAAA,CAAU,2BAAA,EAA4B;AAEtC,UAAA,MAAM,aAAA,GACH,MAAA,EAA+B,UAAA,IAAa,IAC7C,UAAA,CAAW,MAAA,EAAQ,UAAA,IAAa,IAChC,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AACnB,UAAA,KAAA,CAAM,SAAA,GAAY,aAAA;AAElB,UAAA,KAAA,MAAW,iBAAiB,cAAA,EAAgB;AAC1C,YAAA,MAAM,mBAAA,GAAsB,SAAA,CAAU,SAAA,CAAU,aAAa,CAAA;AAC7D,YAAA,MAAM,eAAe,MAAA,EAAQ,KAAA,CAAM,KAAA,EAAO,mBAAA,CAAoB,YAAmB,CAAA;AAAA,UACnF;AAEA,UAAA,KAAA,CAAM,gBAAA,GAAmB,UAAU,SAAA,EAAU;AAG7C,UAAA,IAAI,MAAM,cAAA,EAAgB;AACxB,YAAA,KAAA,CAAM,eAAe,WAAA,GAAc,IAAA;AAAA,UACrC;AACA,UAAA,cAAA,GAAiB,IAAA;AAAA,QACnB;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAKR;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,GAAU,CAAC,cAAA,IAAkB,CAAC,aAAA,IAAiB,gBAAA;AAOnD,IAAA,MAAM,sBAAsB,aAAA,EAAe,mBAAA;AAC3C,IAAA,IAAI,mBAAA,IAAuB,CAAC,KAAA,CAAM,qBAAA,EAAuB;AACvD,MAAA,MAAM,WAAW,KAAA,CAAM,gBAAA,CAAiB,KAAA,CAAM,gBAAA,CAAiB,SAAS,CAAC,CAAA;AAEzE,MAAA,IAAI;AAEF,QAAA,MAAM,mBAAA,GAAsB,IAAIA,6BAAA,EAAY;AAC5C,QAAA,IAAI;AACF,UAAA,mBAAA,CAAoB,WAAA,CAAY,MAAM,gBAAgB,CAAA;AAAA,QACxD,CAAA,CAAA,MAAQ;AAAA,QAER;AAEA,QAAA,MAAM,gBAAA,GAAmB;AAAA,UACvB,SAAA,EAAW,MAAM,gBAAA,CAAiB,MAAA;AAAA,UAClC,aAAA,EAAe,WAAA;AAAA,UACf,IAAA,EAAM,UAAU,IAAA,IAAQ,EAAA;AAAA,UACxB,YAAY,QAAA,EAAU,SAAA,IAAa,EAAC,EAAG,GAAA,CAAI,CAAC,EAAA,MAAa;AAAA,YACvD,EAAA,EAAI,EAAA,CAAG,UAAA,IAAc,EAAA,CAAG,EAAA,IAAM,EAAA;AAAA,YAC9B,IAAA,EAAM,EAAA,CAAG,QAAA,IAAY,EAAA,CAAG,IAAA,IAAQ,EAAA;AAAA,YAChC,IAAA,EAAO,EAAA,CAAG,IAAA,IAAQ;AAAC,WACrB,CAAE,CAAA;AAAA,UACF,cAAc,QAAA,EAAU,WAAA,IAAe,EAAC,EAAG,GAAA,CAAI,CAAC,EAAA,MAAa;AAAA,YAC3D,EAAA,EAAI,EAAA,CAAG,UAAA,IAAc,EAAA,CAAG,EAAA,IAAM,EAAA;AAAA,YAC9B,IAAA,EAAM,EAAA,CAAG,QAAA,IAAY,EAAA,CAAG,IAAA,IAAQ,EAAA;AAAA,YAChC,QAAQ,EAAA,CAAG,MAAA;AAAA,YACX,OAAO,EAAA,CAAG;AAAA,WACZ,CAAE,CAAA;AAAA,UACF,OAAA;AAAA,UACA,YAAA,EAAc,UAAU,YAAA,IAAgB,SAAA;AAAA,UACxC,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,QAAA,EAAU,SAAS,KAAA,EAAO,QAAA;AAAA,UAC1B,UAAA,EAAY,SAAS,KAAA,EAAO,UAAA;AAAA,UAC5B,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,OAAA;AAAA,UACpC,QAAA,EAAU,mBAAA,CAAoB,GAAA,CAAI,GAAA,CAAI,EAAA;AAAG,SAC3C;AAEA,QAAA,MAAM,eAAA,GAAkB,MAAM,mBAAA,CAAoB,gBAAgB,CAAA;AAElE,QAAA,IAAI,eAAA,EAAiB;AAInB,UAAA,MAAM,oBACJ,CAAC,QAAA,IAAY,aAAA,KAAkB,cAAA,IAAkB,gBAAgB,QAAA,KAAa,IAAA,CAAA;AAEhF,UAAA,IAAI,eAAA,CAAgB,YAAY,iBAAA,EAAmB;AAKjD,YAAA,MAAM,UAAA,GACH,MAAA,EAA+B,UAAA,IAAa,IAC7C,UAAA,CAAW,MAAA,EAAQ,UAAA,IAAa,IAChC,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AACnB,YAAA,mBAAA,CAAoB,GAAA;AAAA,cAClB;AAAA,gBACE,EAAA,EAAI,UAAA;AAAA,gBACJ,SAAA,sBAAe,IAAA,EAAK;AAAA,gBACpB,IAAA,EAAM,MAAA;AAAA,gBACN,IAAA,EAAM,WAAA;AAAA,gBACN,OAAA,EAAS;AAAA,kBACP,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,eAAA,CAAgB,UAAU,CAAA;AAAA,kBACxD,QAAA,EAAU;AAAA,oBACR,IAAA,EAAM,QAAA;AAAA,oBACN,gBAAA,EAAkB,EAAE,gBAAA,EAAkB,IAAA;AAAK,mBAC7C;AAAA,kBACA,MAAA,EAAQ;AAAA;AACV,eACF;AAAA,cACA;AAAA,aACF;AAEA,YAAA,KAAA,CAAM,gBAAA,GAAmB,oBAAoB,SAAA,EAAU;AAEvD,YAAA,IAAI,eAAA,CAAgB,aAAa,KAAA,EAAO;AAGtC,cAAA,KAAA,CAAM,mBAAA,GAAsB,IAAA;AAC5B,cAAA,OAAA,GAAU,KAAA;AAAA,YACZ,CAAA,MAAA,IAAW,CAAC,gBAAA,IAAoB,aAAA,EAAe;AAC7C,cAAA,OAAA,GAAU,KAAA;AACV,cAAA,IAAI,MAAM,cAAA,EAAgB;AACxB,gBAAA,KAAA,CAAM,eAAe,WAAA,GAAc,IAAA;AAAA,cACrC;AAAA,YACF;AAAA,UACF,CAAA,MAAA,IAAW,eAAA,CAAgB,QAAA,KAAa,KAAA,IAAS,CAAC,gBAAA,EAAkB;AAClE,YAAA,gBAAA,GAAmB,IAAA;AACnB,YAAA,OAAA,GAAU,IAAA;AAAA,UACZ,CAAA,MAAA,IAAW,gBAAgB,QAAA,KAAa,IAAA,IAAQ,CAAC,QAAA,KAAa,gBAAA,IAAoB,CAAC,cAAA,CAAA,EAAiB;AAClG,YAAA,IAAI,aAAA,IAAiB,CAAC,WAAA,EAAa;AACjC,cAAA,gBAAA,GAAmB,KAAA;AACnB,cAAA,OAAA,GAAU,KAAA;AACV,cAAA,IAAI,MAAM,cAAA,EAAgB;AACxB,gBAAA,KAAA,CAAM,eAAe,WAAA,GAAc,IAAA;AAAA,cACrC;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,KAAA,EAAO;AAEd,QAAA,MAAM,MAAA,GAAU,QAA+B,SAAA,IAAY;AAC3D,QAAA,MAAA,EAAQ,KAAA,CAAM,sCAAsC,KAAK,CAAA;AAAA,MAC3D;AAAA,IACF;AAaA,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,aAAA,GACH,MAAA,EAA+B,UAAA,IAAa,IAAK,UAAA,CAAW,MAAA,EAAQ,UAAA,IAAa,IAAK,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAC1G,MAAA,KAAA,CAAM,SAAA,GAAY,aAAA;AAElB,MAAA,IAAI;AACF,QAAA,MAAM,YAAA,GAAe,IAAIA,6BAAA,EAAY;AACrC,QAAA,YAAA,CAAa,WAAA,CAAY,MAAM,gBAAgB,CAAA;AAC/C,QAAA,YAAA,CAAa,2BAAA,EAA4B;AACzC,QAAA,KAAA,CAAM,gBAAA,GAAmB,aAAa,SAAA,EAAU;AAAA,MAClD,CAAA,CAAA,MAAQ;AAAA,MAGR;AAAA,IACF;AAOA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,WAAW,KAAA,CAAM,gBAAA,CAAiB,KAAA,CAAM,gBAAA,CAAiB,SAAS,CAAC,CAAA;AACzE,MAAA,MAAM,0BAAA,CAA2B,MAAA,EAAQ,KAAA,CAAM,KAAA,EAAO;AAAA,QACpD,WAAW,KAAA,CAAM,cAAA;AAAA,QACjB,aAAA,EAAe,WAAA;AAAA,QACf,MAAM,QAAA,EAAU,IAAA;AAAA,QAChB,WAAW,QAAA,EAAU,SAAA;AAAA,QACrB,aAAa,QAAA,EAAU,WAAA;AAAA,QACvB,OAAA;AAAA,QACA,cAAc,QAAA,EAAU,YAAA;AAAA,QACxB,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,QAAA,EAAU,SAAS,KAAA,EAAO,QAAA;AAAA,QAC1B,UAAA,EAAY,SAAS,KAAA,EAAO,UAAA;AAAA,QAC5B,SAAS,QAAA,CAAS,OAAA;AAAA,QAClB,WAAW,QAAA,CAAS;AAAA,OACrB,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,CAAC,OAAA;AAAA,EACV,CAAC,CAAA,CAEA,GAAA;AAAA,IACC,OAAM,MAAA,KAAU;AACd,MAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAQ,cAAA,EAAgB,gBAAe,GAAI,MAAA;AAC9D,MAAA,MAAM,KAAA,GAAQ,SAAA;AACd,MAAA,MAAM,QAAA,GAAW,OAAO,WAAA,EAAY;AAEpC,MAAA,MAAM,MAAA,GAAU,OAAegB,+BAAa,CAAA;AAC5C,MAAA,MAAM,MAAA,GAAS,QAAQ,SAAA,IAAY;AAGnC,MAAA,MAAM,WAAW,KAAA,CAAM,gBAAA,CAAiB,KAAA,CAAM,gBAAA,CAAiB,SAAS,CAAC,CAAA;AACzE,MAAA,MAAM,YAAY,QAAA,EAAU,IAAA;AAG5B,MAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA;AACvD,MAAA,IAAI,aAAA,EAAe,kBAAkB,MAAA,EAAQ;AAC3C,QAAA,IAAI;AACF,UAAA,MAAM,EAAE,eAAA,EAAAb,gBAAAA,EAAgB,GAAI,MAAM,OAAO,2BAA4B,CAAA;AACrE,UAAA,MAAM,MAAA,GAAS,IAAIA,gBAAAA,CAAgB;AAAA,YACjC,eAAA,EAAiB,aAAA,CAAc,eAAA,IAAmB,EAAC;AAAA,YACnD,kBAAkB,aAAA,CAAc,gBAAA;AAAA,YAChC,eAAA,EAAiB,aAAA,CAAc,eAAA,IAAmB,EAAC;AAAA,YACnD,MAAA;AAAA,YACA,SAAA,EAAW,QAAA,CAAS,SAAA,IAAa,QAAA,CAAS,OAAA;AAAA,YAC1C,iBAAiB,aAAA,CAAc;AAAA,WAChC,CAAA;AACD,UAAA,MAAM,iBAAA,GAAoB,IAAIH,6BAAA,EAAY;AAC1C,UAAA,iBAAA,CAAkB,WAAA,CAAY,MAAM,gBAAgB,CAAA;AAGpD,UAAA,MAAM,MAAA,CAAO,mBAAA;AAAA,YACX,iBAAA;AAAA,YACAI,6CAA2B,cAAc,CAAA;AAAA,YACzC,cAAA,IAAkB,IAAIX,gCAAA,EAAe;AAAA,YACrC;AAAA,WACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,MAAA,EAAQ,IAAA,GAAO,CAAA,gDAAA,EAAmD,KAAK,CAAA,CAAE,CAAA;AAAA,QAC3E;AAAA,MACF;AAGA,MAAA,MAAM,eAAe,QAAA,CAAS,KAAA;AAC9B,MAAA,IACE,aAAA,EAAe,oBACf,aAAA,CAAc,MAAA,IACd,cAAc,QAAA,IACd,YAAA,EAAc,UAAA,IACd,CAAC,YAAA,CAAa,mBAAA;AAAA;AAAA;AAAA,MAId,CAAC,YAAA,CAAa,YAAA,EAAc,QAAA,EAC5B;AACA,QAAA,IAAI;AACF,UAAA,MAAM,iBAAA,GAAoB,IAAIO,6BAAA,EAAY;AAC1C,UAAA,iBAAA,CAAkB,WAAA,CAAY,MAAM,gBAAgB,CAAA;AAEpD,UAAA,IAAI,CAAC,aAAa,YAAA,EAAc;AAC9B,YAAA,MAAM,aAAA,CAAc,OAAO,YAAA,GAAe;AAAA,cACxC,UAAU,YAAA,CAAa,QAAA;AAAA,cACvB,YAAY,YAAA,CAAa,UAAA;AAAA,cACzB,cAAc,YAAA,CAAa;AAAA,aAC5B,CAAA;AAAA,UACH;AAEA,UAAA,MAAM,cAAc,gBAAA,CAAiB,aAAA;AAAA,YACnC,iBAAA;AAAA,YACA,YAAA,CAAa,QAAA;AAAA,YACb,YAAA,CAAa;AAAA,WACf;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,MAAA,EAAQ,IAAA,GAAO,CAAA,0CAAA,EAA6C,KAAK,CAAA,CAAE,CAAA;AAAA,QACrE;AAAA,MACF;AAEA,MAAA,MAAM,WAAA,GAAc;AAAA,QAClB,kBAAkB,KAAA,CAAM,gBAAA;AAAA,QACxB,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,UAAA,EAAY,MAAM,cAAA,IAAkB;AAAA,UAClC,MAAA,EAAQ,MAAA;AAAA,UACR,UAAU,EAAC;AAAA,UACX,WAAA,EAAa;AAAA,SACf;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM,SAAA;AAAA,UACN,OAAO,KAAA,CAAM,gBAAA;AAAA,UACb,OAAO,KAAA,CAAM;AAAA,SACf;AAAA,QACA,OAAO,KAAA,CAAM;AAAA,OACf;AAEA,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,eAAA,CAAgB,MAAA,EAAQ,KAAA,CAAM,KAAA,EAAO;AAAA,UACzC,QAAQ,WAAA,CAAY,MAAA;AAAA,UACpB,YAAY,WAAA,CAAY;AAAA,SACzB,CAAA;AAAA,MACH;AAIA,MAAA,IAAI;AACF,QAAA,MAAM,aAAA,GAAiB,MAAA,EAA+B,aAAA,EAAe,mBAAA,CAAoB;AAAA,UACvF;AAAA,SACD,CAAA;AACD,QAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,GAAA,CAAI,QAAA,CAAS,KAAK,CAAA;AAChD,QAAA,MAAM,aAAA,GAAgB,GAAA,EAAK,mBAAA,IAAuB,QAAA,CAAS,aAAA;AAC3D,QAAA,MAAM,aAAA,GAAgB,GAAA,EAAK,mBAAA,IAAuB,QAAA,CAAS,aAAA;AAC3D,QAAA,IAAI,aAAA,EAAe;AACjB,UAAA,IAAI,aAAA,EAAe;AACjB,YAAA,MAAM,YAAY,aAAA,CAAc,WAAA;AAAA,cAC9B;AAAA,aACF;AACA,YAAA,SAAA,EAAW,aAAA,IAAiB,aAAA,CAAc;AAAA,cACxC,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,cAC1B,UAAA,EAAY,EAAE,YAAA,EAAc,WAAA,CAAY,YAAY,MAAA,EAAO;AAAA,cAC3D,OAAO,KAAA,CAAM;AAAA,aACd,CAAA;AAAA,UACH;AACA,UAAA,IAAI,aAAA,EAAe;AACjB,YAAA,MAAM,SAAA,GAAY,aAAA,CAAc,WAAA,CAAY,aAAiD,CAAA;AAC7F,YAAA,SAAA,EAAW,IAAI,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,IAAa,CAAA;AAAA,UAChD;AAAA,QACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,EAAQ,IAAA,GAAO,CAAA,iDAAA,EAAoD,KAAK,CAAA,CAAE,CAAA;AAAA,MAC5E;AAEA,MAAA,OAAO,WAAA;AAAA,IACT,CAAA;AAAA,IACA,EAAE,IAAI,kBAAA;AAAmB,GAC3B,CAEC,GAAA;AAAA,IACC,OAAM,MAAA,KAAU;AACd,MAAA,MAAM,EAAE,SAAA,EAAW,WAAA,EAAa,MAAA,EAAQ,cAAA,EAAgB,gBAAe,GAAI,MAAA;AAC3E,MAAA,MAAM,WAAA,GAAc,SAAA;AACpB,MAAA,MAAM,WAAW,WAAA,EAAY;AAG7B,MAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,MAAA,IAAI,CAAC,OAAA,IAAW,MAAA,CAAO,KAAK,OAAO,CAAA,CAAE,WAAW,CAAA,EAAG;AACjD,QAAA,OAAO,WAAA;AAAA,MACT;AAEA,MAAA,MAAM,MAAA,GAAS,QAAQ,SAAA,IAAY;AAGnC,MAAA,MAAM,gBAAA,GAAmB,IAAIA,6BAAA,EAAY;AACzC,MAAA,gBAAA,CAAiB,WAAA,CAAY,SAAS,gBAAgB,CAAA;AAGtD,MAAA,MAAM,WAAA,GAAc;AAAA,QAClB,aAAA,EAAe,gBAAA,CAAiB,YAAA,CAAa,KAAA,CAAM,EAAA,EAAG;AAAA,QACtD,kBAAA,EAAoB,gBAAA,CAAiB,YAAA,CAAa,UAAA,CAAW,EAAA,EAAG;AAAA,QAChE,cAAA,EAAgB,iBAAiB,iBAAA,EAAkB;AAAA,QACnD,oBAAA,EAAsB,iBAAiB,YAAA,CAAa;AAAA,OACtD;AAGA,MAAA,MAAM,iBAAA,GAAoB,IAAIA,6BAAA,EAAY;AAC1C,MAAA,iBAAA,CAAkB,WAAA,CAAY,YAAY,gBAAgB,CAAA;AAC1D,MAAA,MAAM,YAAA,GAAe,iBAAA,CAAkB,YAAA,CAAa,QAAA,CAAS,EAAA,EAAG;AAGhE,MAAA,MAAM,cAAA,GAAiB,cAAA,IAAkB,IAAIP,gCAAA,EAAe;AAG5D,MAAA,KAAA,MAAW,CAAC,SAAA,EAAW,WAAW,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC9D,QAAA,MAAM,EAAE,UAAA,EAAY,QAAA,EAAS,GAAI,WAAA;AAEjC,QAAA,IAAI;AAKF,UAAA,IAAI,MAAA;AACJ,UAAA,IAAI;AACF,YAAA,MAAA,GAAU,MAAA,EAAmB,gBAAgB,UAAU,CAAA;AAAA,UACzD,CAAA,CAAA,MAAQ;AACN,YAAA,MAAA,GAAS,MAAA;AAAA,UACX;AACA,UAAA,IAAI,CAAC,MAAA,EAAQ;AACX,YAAA,IAAI;AACF,cAAA,MAAA,GAAU,MAAA,EAAmB,YAAY,UAAU,CAAA;AAAA,YACrD,CAAA,CAAA,MAAQ;AACN,cAAA,MAAA,GAAS,MAAA;AAAA,YACX;AAAA,UACF;AAEA,UAAA,IAAI,CAAC,MAAA,EAAQ;AACX,YAAA,MAAA,EAAQ,IAAA,GAAO,CAAA,OAAA,EAAU,UAAU,CAAA,8BAAA,CAAA,EAAkC;AAAA,cACnE,OAAO,QAAA,CAAS,KAAA;AAAA,cAChB;AAAA,aACD,CAAA;AACD,YAAA;AAAA,UACF;AAGA,UAAA,MAAM,YAAA,GAAkC;AAAA,YACtC,MAAA;AAAA,YACA;AAAA,WACF;AAGA,UAAA6D,2BAAA,CAAU;AAAA,YACR,OAAO,QAAA,CAAS,KAAA;AAAA,YAChB,QAAA,EAAU,SAAA;AAAA,YACV,YAAA;AAAA,YACA,KAAA,EAAO,WAAA;AAAA,YACP,MAAA,EAAQ,YAAA;AAAA,YACR,cAAA,EAAgB,cAAA;AAAA,YAChB,MAAA,EAAQ;AAAA,cACN,IAAI,QAAA,CAAS,OAAA;AAAA,cACb,IAAA,EAAM,QAAA,CAAS,SAAA,IAAa,QAAA,CAAS;AAAA,aACvC;AAAA,YACA,gBAAA,EAAkB,KAAA;AAAA,YAClB,MAAA,EAAQ,MAAA;AAAA,YACR,UAAA,EAAY,OAAA;AAAA,YACZ,QAAA,EAAU,SAAS,KAAA,EAAO,QAAA;AAAA,YAC1B,UAAA,EAAY,SAAS,KAAA,EAAO,UAAA;AAAA,YAC5B,GAAGlD,6CAA2B,cAAc;AAAA,WAC7C,CAAA;AAAA,QACH,SAAS,KAAA,EAAO;AAEd,UAAA,MAAA,EAAQ,IAAA,GAAO,CAAA,uBAAA,EAA0B,UAAU,CAAA,CAAA,EAAI;AAAA,YACrD,KAAA;AAAA,YACA,OAAO,QAAA,CAAS,KAAA;AAAA,YAChB;AAAA,WACD,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,OAAO,WAAA;AAAA,IACT,CAAA;AAAA,IACA,EAAE,IAAI,iBAAA;AAAkB,IAEzB,MAAA,EAAO;AAEd;;;AC/wBA,IAAM,gBAAA,0BAA0B,+BAA+B,CAAA;AA0PxD,IAAM,YAAA,GAAN,cAIGmD,uBAAA,CAAiC;AAAA;AAAA,EAEhC,aAAA;AAAA;AAAA,EAGA,YAAA;AAAA;AAAA,EAGT,SAAA,GAAoE,IAAA;AAAA;AAAA,EAG3D,SAAA;AAAA;AAAA,EAGT,YAAA;AAAA;AAAA,EAGS,gBAAA;AAAA;AAAA,EAGT,YAAA;AAAA;AAAA,EAGA,cAAA,GAA2C,IAAA;AAAA;AAAA,EAG3C,cAAA,GAAgC,IAAA;AAAA;AAAA,EAGhC,OAAA;AAAA;AAAA,EAGA,sBAAA,uBAA6B,GAAA,EAAwB;AAAA;AAAA,EAG5C,iBAAA;AAAA;AAAA;AAAA;AAAA,EAKT,YAAY,MAAA,EAAuD;AACjE,IAAA,MAAM,EAAE,KAAA,EAAO,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,cAAc,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,gBAAA,EAAiB,GAAI,MAAA;AAGjG,IAAA,MAAM,OAAA,GAAU,cAAc,KAAA,CAAM,EAAA;AACpC,IAAA,MAAM,SAAA,GAAY,YAAA,IAAgB,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,EAAA;AAGtD,IAAA,KAAA,CAAM;AAAA,MACJ,EAAA,EAAI,OAAA;AAAA,MACJ,IAAA,EAAM,SAAA;AAAA;AAAA,MAEN,YAAA,EAAc,CAAC,EAAE,cAAA,OAAqB,KAAA,CAAM,eAAA,CAAgB,EAAE,cAAA,EAAgB,CAAA;AAAA;AAAA,MAE9E,KAAA,EAAQ,KAAA,CAAc,OAAA,IAAW,KAAA,CAAM,QAAA;AAAS,KACjD,CAAA;AAED,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AACrB,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,mBAAA,EAAoB;AAC5C,IAAA,IAAA,CAAK,SAAA,GAAY,QAAA;AACjB,IAAA,IAAA,CAAK,gBAAA,GAAmB,CAAC,CAAC,MAAA;AAC1B,IAAA,IAAA,CAAK,YAAA,GAAe,MAAA,IAAU,IAAIC,oCAAA,EAAmB;AACrD,IAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,IAAA,IAAA,CAAK,oBAAoB,gBAAA,IAAoB,GAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,IAAI,KAAA,GAAkC;AACpC,IAAA,IAAA,CAAK,wBAAA,EAAyB;AAC9B,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,MAAA,GAAiB;AACnB,IAAA,IAAA,CAAK,wBAAA,EAAyB;AAC9B,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,wBAAA,GAAiC;AAC/B,IAAA,IAAI,KAAK,cAAA,EAAgB;AAEzB,IAAA,IAAI,IAAA,CAAK,iBAAiB,KAAA,EAAO;AAE/B,MAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK,YAAA;AAC3B,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,IACxB,CAAA,MAAA,IAAW,IAAA,CAAK,YAAA,YAAwBC,+BAAA,EAAe;AAQrD,MAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK,YAAA;AAC3B,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,SAAS,WAAA,IAAe,IAAA;AAAA,IAC1E,CAAA,MAAO;AAEL,MAAA,MAAM,gBAAgB,IAAA,CAAK,YAAA,IAAgB,KAAK,OAAA,EAAS,WAAA,IAAe,IAAIC,qCAAA,EAAoB;AAChG,MAAA,IAAA,CAAK,cAAA,GAAiB,aAAA;AACtB,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAID,+BAAA,CAAc,IAAA,CAAK,cAAc,aAAa,CAAA;AAAA,IAC1E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAI,KAAA,GAA0C;AAC5C,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,WAAA,GAAmC;AACrC,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAA,GAA+B;AACjC,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,gBAAA,GAA2B;AAC7B,IAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,EACd;AAAA;AAAA,EAGS,SAAS,OAAA,EAAe;AAC/B,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,QAAA,CAAS,OAAO,CAAA;AAAA,EAC5C;AAAA,EAES,gBAAgB,OAAA,EAAe;AACtC,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,eAAA,CAAgB,OAAO,CAAA;AAAA,EACnD;AAAA,EAES,kBAAkB,OAAA,EAAe;AACxC,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,iBAAA,CAAkB,OAAO,CAAA;AAAA,EACrD;AAAA,EAES,UAAU,OAAA,EAAe;AAChC,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,SAAA,CAAU,OAAO,CAAA;AAAA,EAC7C;AAAA,EAES,SAAA,GAAY;AACnB,IAAA,OAAO,IAAA,CAAK,cAAc,SAAA,EAAU;AAAA,EACtC;AAAA,EAES,QAAA,GAAW;AAClB,IAAA,OAAO,IAAA,CAAK,cAAc,QAAA,EAAS;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBS,iBAAA,GAAoB;AAC3B,IAAA,OAAO,IAAA,CAAK,cAAc,iBAAA,EAAkB;AAAA,EAC9C;AAAA,EAES,sBAAA,GAAyB;AAChC,IAAA,OAAO,IAAA,CAAK,cAAc,sBAAA,EAAuB;AAAA,EACnD;AAAA,EAES,qBAAqB,YAAA,EAAuF;AACnH,IAAA,IAAA,CAAK,aAAA,CAAc,qBAAqB,YAAY,CAAA;AAAA,EACtD;AAAA,EAES,cAAc,MAAA,EAA0E;AAC/F,IAAA,IAAA,CAAK,aAAA,CAAc,cAAc,MAAM,CAAA;AAAA,EACzC;AAAA,EAES,WAAW,KAAA,EAAsE;AACxF,IAAA,IAAA,CAAK,aAAA,CAAc,WAAW,KAAK,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcS,MAAA,GAA2C;AAClD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,aAAA,CAAc,MAAA,EAAO;AAE5C,IAAA,MAAM,OAAO,IAAA,CAAK,WAAA;AAIlB,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK;AAAA,MACpB,KAAA,EAAO,SAAA;AAAA,MACP,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAA,EAAQ,IAAA,CAAK,gBAAA,GAAmB,IAAA,CAAK,YAAA,GAAe,MAAA;AAAA,MACpD,OAAO,IAAA,CAAK,YAAA;AAAA,MACZ,UAAU,IAAA,CAAK,SAAA;AAAA,MACf,kBAAkB,IAAA,CAAK;AAAA,KACxB,CAAA;AAKD,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AAAA,IACtB;AACA,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,YAAA;AACzB,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AAInB,IAAC,IAAA,CAAqD,sBACpD,IAAA,CACA,mBAAA;AAKF,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,IAAc,cAAA,GAAyB;AACrC,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAc,mBAAA,GAA2C;AACvD,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAgB,eAAA,CAAgB,KAAA,EAAe,aAAA,EAA2D;AACxG,IAAA,MAAM,QAAA,GAAW,KAAK,WAAA,EAAY;AAClC,IAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA;AACzC,IAAA,MAAM,iBAAiB,KAAA,EAAO,cAAA;AAE9B,IAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,SAAA,CAAU,EAAE,KAAA,EAAO,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,CAAA;AAEnE,IAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,KAAA,CAAM;AAAA,MAC7B,SAAA,EAAW,aAAA;AAAA,MACX,cAAA;AAAA,MACA,GAAGrD,4CAAA,CAA2B,EAAE,WAAA,EAAa,KAAA,EAAO,WAAW;AAAA,KAChE,CAAA;AACD,IAAA,IAAI,MAAA,EAAQ,WAAW,QAAA,EAAU;AAC/B,MAAA,MAAM,QAAQ,IAAI,KAAA,CAAO,MAAA,CAAe,KAAA,EAAO,WAAW,2BAA2B,CAAA;AACrF,MAAA,MAAM,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,KAAK,CAAA;AAAA,IACnC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWU,cAAA,GAAkE;AAC1E,IAAA,OAAO,4BAAA,CAA6B;AAAA,MAClC,UAAU,IAAA,CAAK;AAAA,KAChB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAgB,SAAA,CAAU,KAAA,EAAe,KAAA,EAA6B;AAEpE,IAAA,oBAAA,CAAqB,OAAO,KAAK,CAAA;AACjC,IAAA,MAAM,cAAA,CAAe,IAAA,CAAK,MAAA,EAAQ,KAAA,EAAO,KAAK,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,MAAA,CACJ,QAAA,EACA,OAAA,EAC4C;AAI5C,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,MAAM,EAAE,SAAA,EAAW,GAAG,IAAA,EAAK,GAAI,OAAA;AAC/B,MAAA,MAAM,SAAA,GAAY,OAAO,SAAA,KAAc,QAAA,GAAW,UAAU,SAAA,GAAY,MAAA;AACxE,MAAA,OAAO,yBAAA;AAAA,QACL,IAAA;AAAA,QACA,QAAA;AAAA,QACA,EAAE,GAAG,IAAA,EAAM,SAAA,EAAU;AAAA,QACrB;AAAA,UACE,eAAe,IAAA,CAAK,sBAAA;AAAA,UACpB,SAAA,EAAW,KAAK,OAAA,EAAS;AAAA;AAC3B,OACF;AAAA,IACF;AAGA,IAAA,MAAM,WAAA,GAAc,MAAM,0BAAA,CAAoC;AAAA,MAC5D,OAAO,IAAA,CAAK,aAAA;AAAA,MACZ,QAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,gBAAgB,OAAA,EAAS,cAAA;AAAA,MACzB,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAED,IAAA,MAAM,EAAE,OAAO,SAAA,EAAW,aAAA,EAAe,eAAe,WAAA,EAAa,QAAA,EAAU,YAAW,GAAI,WAAA;AAQ9F,IAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAC5C,IAAA,IAAI,SAAS,WAAA,EAAa;AACxB,MAAA,IAAI,OAAA,CAAQ,YAAY,OAAA,EAAS;AAC/B,QAAA,eAAA,CAAgB,KAAA,CAAO,OAAA,CAAQ,WAAA,CAAmD,MAAM,CAAA;AAAA,MAC1F,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,WAAA,CAAY,gBAAA;AAAA,UAClB,OAAA;AAAA,UACA,MAAM,eAAA,CAAgB,KAAA,CAAO,OAAA,CAAQ,YAAmD,MAAM,CAAA;AAAA,UAC9F,EAAE,MAAM,IAAA;AAAK,SACf;AAAA,MACF;AAAA,IACF;AACA,IAAA,aAAA,CAAc,eAAA,GAAkB,eAAA;AAChC,IAAA,aAAA,CAAc,cAAc,eAAA,CAAgB,MAAA;AAG5C,IAAA,IAAA,CAAK,YAAA,CAAa,wBAAwB,KAAA,EAAO,aAAA,EAAe,aAAa,EAAE,QAAA,EAAU,YAAY,CAAA;AACrG,IAAA,iBAAA,CAAkB,IAAI,KAAA,EAAO,EAAE,GAAG,aAAA,EAAe,aAAa,CAAA;AAG9D,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,gBAAA,GAAyD,IAAA;AAG7D,IAAA,MAAM,sBAAsB,MAAM;AAChC,MAAA,IAAI,gBAAA,IAAoB,SAAA,IAAa,IAAA,CAAK,iBAAA,KAAsB,CAAA,EAAG;AACnE,MAAA,gBAAA,GAAmB,WAAW,MAAM;AAClC,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,KAAK,CAAA;AAC/B,UAAA,iBAAA,CAAkB,OAAO,KAAK,CAAA;AAC9B,UAAA,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAC5B,UAAA,SAAA,GAAY,IAAA;AAAA,QACd;AAAA,MACF,CAAA,EAAG,KAAK,iBAAiB,CAAA;AAAA,IAC3B,CAAA;AAGA,IAAA,MAAM;AAAA,MACJ,MAAA;AAAA,MACA,OAAA,EAAS,aAAA;AAAA,MACT;AAAA,QACE,wBAAA,CAAkC;AAAA,MACpC,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,KAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,cAAc,WAAA,CAAY,OAAA;AAAA,QACnC,QAAA,EAAU,cAAc,WAAA,CAAY,QAAA;AAAA,QACpC,OAAA,EAAS;AAAA,OACX;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAS,OAAA,EAAS,OAAA;AAAA,MAClB,cAAc,OAAA,EAAS,YAAA;AAAA,MACvB,UAAU,OAAA,EAAS,QAAA;AAAA,MACnB,gBAAA,EAAkB,mBAAA;AAAA,MAClB,OAAA,EAAS,OAAM,KAAA,KAAS;AACtB,QAAA,MAAM,OAAA,EAAS,UAAU,KAAK,CAAA;AAC9B,QAAA,mBAAA,EAAoB;AAAA,MACtB,CAAA;AAAA,MACA,aAAa,OAAA,EAAS,WAAA;AAAA,MACtB,OAAA,EAAS,OAAM,IAAA,KAAQ;AACrB,QAAA,IAAI;AACF,UAAA,MAAO,OAAA,EAAS,UAAiE,IAAI,CAAA;AAAA,QACvF,CAAA,SAAE;AACA,UAAA,mBAAA,EAAoB;AAAA,QACtB;AAAA,MACF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAKA,cAAA,EAAiB,OAAA,GAAkB,gBAAgB,CAAA,KAAM,IAAA;AAAA,MACzD,kBAAkB,aAAA,CAAc,gBAAA;AAAA,MAChC,kBAAkB,aAAA,CAAc,gBAAA;AAAA,MAChC;AAAA,KACD,CAAA;AAID,IAAA,MAAM,iBAAA,GAAoB,KAAA,CACvB,IAAA,CAAK,YAAY;AAGhB,MAAA,MAAM,cAAA,CAAe,IAAA,CAAK,MAAA,EAAQ,KAAA,EAAO;AAAA,QACvC,IAAA,EAAM,OAAA;AAAA,QACN,KAAA;AAAA,QACA,IAAA,EAAA,OAAA;AAAA,QACA,OAAA,EAAS,EAAE,EAAA,EAAI,aAAA,CAAc,SAAS,SAAA;AAAU,OACjD,CAAA;AACD,MAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,KAAA,EAAO,aAAa,CAAA;AAAA,IAClD,CAAC,CAAA,CACA,KAAA,CAAM,CAAA,KAAA,KAAS;AACd,MAAA,KAAK,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,KAAK,CAAA;AAAA,IAClC,CAAC,CAAA;AACH,IAAA,MAAM,YAAA,GAAe,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA;AAChD,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,YAAA,CAAa,iBAAA,GAAoB,iBAAA;AAAA,IACnC;AAGA,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,YAAA,CAAa,gBAAgB,CAAA;AAC7B,QAAA,gBAAA,GAAmB,IAAA;AAAA,MACrB;AACA,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,aAAA,EAAc;AACd,QAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,KAAK,CAAA;AAC/B,QAAA,iBAAA,CAAkB,OAAO,KAAK,CAAA;AAC9B,QAAA,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAC5B,QAAA,SAAA,GAAY,IAAA;AAAA,MACd;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,KAAA,GAAQ,CAAC,MAAA,KAAqB;AAClC,MAAA,IAAI,CAAC,eAAA,CAAgB,MAAA,CAAO,OAAA,EAAS;AACnC,QAAA,eAAA,CAAgB,MAAM,MAAM,CAAA;AAAA,MAC9B;AAAA,IACF,CAAA;AAEA,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,IAAI,UAAA,GAAa;AACf,QAAA,OAAO,MAAA,CAAO,UAAA;AAAA,MAChB,CAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CACJ,KAAA,EACA,UAAA,EACA,OAAA,EAsB4C;AAI5C,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,MAAM,EAAE,SAAA,EAAW,GAAG,IAAA,EAAK,GAAI,OAAA;AAC/B,MAAA,MAAM,SAAA,GAAY,OAAO,SAAA,KAAc,QAAA,GAAW,UAAU,SAAA,GAAY,MAAA;AACxE,MAAA,OAAO,+BAAA;AAAA,QACL,IAAA;AAAA,QACA,KAAA;AAAA,QACA,UAAA;AAAA,QACA,EAAE,GAAG,IAAA,EAAM,SAAA,EAAU;AAAA,QACrB;AAAA,UACE,eAAe,IAAA,CAAK,sBAAA;AAAA,UACpB,SAAA,EAAW,KAAK,OAAA,EAAS;AAAA;AAC3B,OACF;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA;AACzC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,KAAK,CAAA,gBAAA,CAAkB,CAAA;AAAA,IAC5E;AAMA,IAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAC5C,IAAA,IAAI,SAAS,WAAA,EAAa;AACxB,MAAA,IAAI,OAAA,CAAQ,YAAY,OAAA,EAAS;AAC/B,QAAA,eAAA,CAAgB,KAAA,CAAO,OAAA,CAAQ,WAAA,CAAmD,MAAM,CAAA;AAAA,MAC1F,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,WAAA,CAAY,gBAAA;AAAA,UAClB,OAAA;AAAA,UACA,MAAM,eAAA,CAAgB,KAAA,CAAO,OAAA,CAAQ,YAAmD,MAAM,CAAA;AAAA,UAC9F,EAAE,MAAM,IAAA;AAAK,SACf;AAAA,MACF;AAAA,IACF;AACA,IAAA,KAAA,CAAM,eAAA,GAAkB,eAAA;AACxB,IAAA,KAAA,CAAM,cAAc,eAAA,CAAgB,MAAA;AACpC,IAAA,MAAM,mBAAA,GAAsB,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA;AACvD,IAAA,IAAI,mBAAA,EAAqB;AACvB,MAAA,mBAAA,CAAoB,eAAA,GAAkB,eAAA;AACtC,MAAA,mBAAA,CAAoB,cAAc,eAAA,CAAgB,MAAA;AAAA,IACpD;AAEA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,YAAA,CAAa,aAAA,CAAc,KAAK,CAAA;AAGxD,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,gBAAA,GAAyD,IAAA;AAE7D,IAAA,MAAM,sBAAsB,MAAM;AAChC,MAAA,IAAI,gBAAA,IAAoB,SAAA,IAAa,IAAA,CAAK,iBAAA,KAAsB,CAAA,EAAG;AACnE,MAAA,gBAAA,GAAmB,WAAW,MAAM;AAClC,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,KAAK,CAAA;AAC/B,UAAA,iBAAA,CAAkB,OAAO,KAAK,CAAA;AAC9B,UAAA,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAC5B,UAAA,SAAA,GAAY,IAAA;AAAA,QACd;AAAA,MACF,CAAA,EAAG,KAAK,iBAAiB,CAAA;AAAA,IAC3B,CAAA;AAEA,IAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA;AAC/C,IAAA,MAAM,cAAc,WAAA,EAAa,KAAA;AAKjC,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,gBAAA,CAAiB,KAAK,CAAA;AAEtD,IAAA,MAAM;AAAA,MACJ,MAAA;AAAA,MACA,OAAA,EAAS,aAAA;AAAA,MACT;AAAA,QACE,wBAAA,CAAkC;AAAA,MACpC,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,KAAA;AAAA,MACA,SAAA,EAAW,OAAO,UAAA,EAAW;AAAA,MAC7B,KAAA,EAAO;AAAA,QACL,SAAS,WAAA,EAAa,OAAA;AAAA,QACtB,UAAU,WAAA,EAAa,QAAA;AAAA,QACvB,OAAA,EAAS;AAAA,OACX;AAAA,MACA,UAAU,UAAA,EAAY,QAAA;AAAA,MACtB,YAAY,UAAA,EAAY,UAAA;AAAA,MACxB,MAAA,EAAQ,YAAA;AAAA,MACR,SAAS,OAAA,EAAS,OAAA;AAAA,MAClB,cAAc,OAAA,EAAS,YAAA;AAAA,MACvB,UAAU,OAAA,EAAS,QAAA;AAAA,MACnB,gBAAA,EAAkB,mBAAA;AAAA,MAClB,OAAA,EAAS,OAAM,KAAA,KAAS;AACtB,QAAA,MAAM,OAAA,EAAS,UAAU,KAAK,CAAA;AAC9B,QAAA,mBAAA,EAAoB;AAAA,MACtB,CAAA;AAAA,MACA,aAAa,OAAA,EAAS,WAAA;AAAA,MACtB,cAAA,EAAiB,OAAA,GAAkB,gBAAgB,CAAA,KAAM,IAAA;AAAA,MACzD,kBAAkB,KAAA,CAAM,gBAAA;AAAA,MACxB,kBAAkB,KAAA,CAAM,gBAAA;AAAA,MACxB,aAAa,WAAA,EAAa,WAAA,IAAe,IAAA,CAAK,YAAA,CAAa,eAAe,KAAK;AAAA,KAChF,CAAA;AAGD,IAAA,MAAM,QAAA,GAAW,KAAK,WAAA,EAAY;AAClC,IAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG,cAAA;AAKrD,IAAA,MAAM,WAAA,GAAc,MAAM,SAAA,EAAW,OAAA;AACrC,IAAA,MAAM,UAAA,GAAa,MAAM,SAAA,EAAW,EAAA;AACpC,IAAA,IAAI,WAAA,IAAe,IAAA,CAAK,OAAA,EAAS,aAAA,EAAe;AAC9C,MAAA,IAAI;AACF,QAAA,MAAM,KAAK,IAAA,CAAK,aAAA;AAIhB,QAAA,MAAM,YAAY,OAAQ,EAAA,CAAW,gBAAgB,UAAA,GAAc,EAAA,CAAW,aAAY,GAAI,MAAA;AAC9F,QAAA,MAAM,oBAAoB,SAAA,EAAW,iBAAA;AACrC,QAAA,MAAM,qBAAqB,OAAO,EAAA,CAAG,qBAAqB,UAAA,GAAa,EAAA,CAAG,kBAAiB,GAAI,MAAA;AAC/F,QAAA,MAAM,kBAAkBH,iCAAA,CAAgB;AAAA,UACtC,IAAA,EAAA,WAAA;AAAA,UACA,IAAA,EAAM,CAAA,YAAA,EAAe,EAAA,CAAG,EAAE,CAAA,WAAA,CAAA;AAAA,UAC1B,YAAYC,4BAAA,CAAW,KAAA;AAAA,UACvB,UAAU,EAAA,CAAG,EAAA;AAAA,UACb,YAAY,EAAA,CAAG,IAAA;AAAA,UACf,QAAA,EAAU;AAAA,YACR,KAAA;AAAA,YACA,OAAA,EAAS,IAAA;AAAA,YACT,GAAI,UAAA,GAAa,EAAE,iBAAA,EAAmB,UAAA,KAAe,EAAC;AAAA,YACtD,GAAI,iBAAA,GAAoB,EAAE,eAAA,EAAiB,iBAAA,KAAsB;AAAC,WACpE;AAAA,UACA,aAAA,EAAe,kBAAA;AAAA,UACf,cAAA,EAAgB,EAAE,OAAA,EAAS,WAAA,EAAY;AAAA,UACvC,cAAA;AAAA,UACA,QAAQ,IAAA,CAAK;AAAA,SACd,CAAA;AACD,QAAA,MAAM,eAAA,GAAkB,iBAAiB,eAAA,CAAgB;AAAA,UACvD,IAAA,EAAA,kBAAA;AAAA,UACA,IAAA,EAAM,CAAA,MAAA,EAAS,WAAA,EAAa,OAAA,IAAW,EAAE,CAAA,CAAA,CAAA;AAAA,UACzC,UAAA,EAAY,EAAE,KAAA,EAAO,WAAA,EAAa,SAAS,QAAA,EAAU,WAAA,EAAa,QAAA,EAAU,SAAA,EAAW,IAAA,EAAK;AAAA,UAC5F,QAAA,EAAU,EAAE,KAAA,EAAO,OAAA,EAAS,IAAA,EAAK;AAAA,UACjC;AAAA,SACD,CAAA;AACD,QAAA,KAAA,MAAW,OAAO,CAAC,KAAA,EAAO,kBAAkB,GAAA,CAAI,KAAK,CAAC,CAAA,EAAG;AACvD,UAAA,IAAI,CAAC,GAAA,EAAK;AACV,UAAA,GAAA,CAAI,eAAA,GAAkB,eAAA;AACtB,UAAA,GAAA,CAAI,eAAA,GAAkB,eAAA;AACtB,UAAA,GAAA,CAAI,mBAAA,GAAsB,iBAAiB,UAAA,EAAW;AACtD,UAAA,GAAA,CAAI,mBAAA,GAAsB,iBAAiB,UAAA,EAAW;AAAA,QACxD;AAAA,MACF,SAAS,KAAA,EAAO;AAEd,QAAA,IAAA,CAAK,SAAS,SAAA,IAAY,EAAG,IAAA,GAAO,CAAA,4CAAA,EAA+C,KAAK,CAAA,CAAE,CAAA;AAAA,MAC5F;AAAA,IACF;AAMA,IAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG,iBAAA;AAErD,IAAA,MAAM,iBAAA,GAAoB,KAAA,CACvB,IAAA,CAAK,YAAY;AAOhB,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,MAAM,cAAA,CAAe,MAAM,MAAM;AAAA,QAEjC,CAAC,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,SAAA,CAAU,EAAE,KAAA,EAAO,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,CAAA;AACnE,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,MAAA,CAAO;AAAA,QAC9B,UAAA;AAAA,QACA,cAAA;AAAA,QACA,GAAGE,6CAA2B,EAAE,WAAA,EAAa,MAAM,eAAA,IAAmB,KAAA,CAAM,WAAW;AAAA,OACxF,CAAA;AACD,MAAA,IAAI,MAAA,EAAQ,WAAW,QAAA,EAAU;AAC/B,QAAA,MAAM,QAAQ,IAAI,KAAA,CAAO,MAAA,CAAe,KAAA,EAAO,WAAW,wBAAwB,CAAA;AAClF,QAAA,KAAK,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,KAAK,CAAA;AAAA,MAClC;AAAA,IACF,CAAC,CAAA,CACA,KAAA,CAAM,CAAA,KAAA,KAAS;AACd,MAAA,KAAK,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,KAAK,CAAA;AAAA,IAClC,CAAC,CAAA;AACH,IAAA,MAAM,kBAAA,GAAqB,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA;AACtD,IAAA,IAAI,kBAAA,EAAoB;AACtB,MAAA,kBAAA,CAAmB,iBAAA,GAAoB,iBAAA;AAAA,IACzC;AAEA,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,YAAA,CAAa,gBAAgB,CAAA;AAC7B,QAAA,gBAAA,GAAmB,IAAA;AAAA,MACrB;AACA,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,aAAA,EAAc;AACd,QAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,KAAK,CAAA;AAC/B,QAAA,iBAAA,CAAkB,OAAO,KAAK,CAAA;AAC9B,QAAA,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAC5B,QAAA,SAAA,GAAY,IAAA;AAAA,MACd;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,KAAA,GAAQ,CAAC,MAAA,KAAqB;AAClC,MAAA,IAAI,CAAC,eAAA,CAAgB,MAAA,CAAO,OAAA,EAAS;AACnC,QAAA,eAAA,CAAgB,MAAM,MAAM,CAAA;AAAA,MAC9B;AAAA,IACF,CAAA;AAEA,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,IAAI,UAAA,GAAa;AACf,QAAA,OAAO,MAAA,CAAO,UAAA;AAAA,MAChB,CAAA;AAAA,MACA,KAAA;AAAA,MACA,UAAU,UAAA,EAAY,QAAA;AAAA,MACtB,YAAY,UAAA,EAAY,UAAA;AAAA,MACxB,OAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAe,YAAA,CAAa,UAAA,EAAiB,aAAA,EAA0D;AACrG,IAAA,MAAM,QAAQ,aAAA,EAAe,KAAA;AAC7B,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,MAAM,mEAAmE,CAAA;AAAA,IACrF;AACA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,UAAA,EAAY;AAAA,MAClD,SAAS,aAAA,EAAe,OAAA;AAAA,MACxB,cAAc,aAAA,EAAe,YAAA;AAAA,MAC7B,UAAU,aAAA,EAAe,QAAA;AAAA,MACzB,SAAS,aAAA,EAAe,OAAA;AAAA;AAAA;AAAA;AAAA,MAIxB,CAAC,gBAAgB,GAAG;AAAA,KAC+C,CAAA;AACrE,IAAA,OAAO,MAAA,CAAO,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAe,gBACb,OAAA,EACiC;AACjC,IAAA,OAAO,KAAK,YAAA,CAAa,EAAE,QAAA,EAAU,IAAA,IAAQ,OAAO,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAe,gBACb,OAAA,EACiC;AACjC,IAAA,OAAO,KAAK,YAAA,CAAa,EAAE,QAAA,EAAU,KAAA,IAAS,OAAO,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+BA,MAAM,QAAA,CACJ,QAAA,EACA,OAAA,EAC8B;AAE9B,IAAA,MAAM,WAAA,GAAc,MAAM,0BAAA,CAAoC;AAAA,MAC5D,OAAO,IAAA,CAAK,aAAA;AAAA,MACZ,QAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,gBAAgB,OAAA,EAAS,cAAA;AAAA,MACzB,QAAQ,IAAA,CAAK,OAAA;AAAA,MACb,UAAA,EAAY;AAAA,KACb,CAAA;AAED,IAAA,MAAM,EAAE,OAAO,SAAA,EAAW,aAAA,EAAe,eAAe,WAAA,EAAa,QAAA,EAAU,YAAW,GAAI,WAAA;AAQ9F,IAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAC5C,IAAA,IAAI,SAAS,WAAA,EAAa;AACxB,MAAA,IAAI,OAAA,CAAQ,YAAY,OAAA,EAAS;AAC/B,QAAA,eAAA,CAAgB,KAAA,CAAO,OAAA,CAAQ,WAAA,CAAmD,MAAM,CAAA;AAAA,MAC1F,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,WAAA,CAAY,gBAAA;AAAA,UAClB,OAAA;AAAA,UACA,MAAM,eAAA,CAAgB,KAAA,CAAO,OAAA,CAAQ,YAAmD,MAAM,CAAA;AAAA,UAC9F,EAAE,MAAM,IAAA;AAAK,SACf;AAAA,MACF;AAAA,IACF;AACA,IAAA,aAAA,CAAc,eAAA,GAAkB,eAAA;AAChC,IAAA,aAAA,CAAc,cAAc,eAAA,CAAgB,MAAA;AAG5C,IAAA,IAAA,CAAK,YAAA,CAAa,wBAAwB,KAAA,EAAO,aAAA,EAAe,aAAa,EAAE,QAAA,EAAU,YAAY,CAAA;AACrG,IAAA,iBAAA,CAAkB,IAAI,KAAA,EAAO,EAAE,GAAG,aAAA,EAAe,aAAa,CAAA;AAG9D,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,gBAAA,GAAyD,IAAA;AAG7D,IAAA,MAAM,sBAAsB,MAAM;AAChC,MAAA,IAAI,gBAAA,IAAoB,SAAA,IAAa,IAAA,CAAK,iBAAA,KAAsB,CAAA,EAAG;AACnE,MAAA,gBAAA,GAAmB,WAAW,MAAM;AAClC,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,KAAK,CAAA;AAC/B,UAAA,iBAAA,CAAkB,OAAO,KAAK,CAAA;AAC9B,UAAA,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAC5B,UAAA,SAAA,GAAY,IAAA;AAAA,QACd;AAAA,MACF,CAAA,EAAG,KAAK,iBAAiB,CAAA;AAAA,IAC3B,CAAA;AAGA,IAAA,MAAM;AAAA,MACJ,MAAA;AAAA,MACA,OAAA,EAAS,aAAA;AAAA,MACT;AAAA,QACE,wBAAA,CAAkC;AAAA,MACpC,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,KAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,cAAc,WAAA,CAAY,OAAA;AAAA,QACnC,QAAA,EAAU,cAAc,WAAA,CAAY,QAAA;AAAA,QACpC,OAAA,EAAS;AAAA,OACX;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAS,OAAA,EAAS,OAAA;AAAA,MAClB,cAAc,OAAA,EAAS,YAAA;AAAA,MACvB,UAAU,OAAA,EAAS,QAAA;AAAA,MACnB,gBAAA,EAAkB,mBAAA;AAAA,MAClB,OAAA,EAAS,OAAM,KAAA,KAAS;AACtB,QAAA,MAAM,OAAA,EAAS,UAAU,KAAK,CAAA;AAC9B,QAAA,mBAAA,EAAoB;AAAA,MACtB,CAAA;AAAA,MACA,aAAa,OAAA,EAAS,WAAA;AAAA,MACtB,OAAA,EAAS,OAAM,IAAA,KAAQ;AACrB,QAAA,IAAI;AACF,UAAA,MAAO,OAAA,EAAS,UAAiE,IAAI,CAAA;AAAA,QACvF,CAAA,SAAE;AACA,UAAA,mBAAA,EAAoB;AAAA,QACtB;AAAA,MACF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAKA,cAAA,EAAgB,IAAA;AAAA,MAChB,kBAAkB,aAAA,CAAc,gBAAA;AAAA,MAChC,kBAAkB,aAAA,CAAc,gBAAA;AAAA,MAChC;AAAA,KACD,CAAA;AAID,IAAA,MAAM,iBAAA,GAAoB,KAAA,CACvB,IAAA,CAAK,YAAY;AAGhB,MAAA,MAAM,cAAA,CAAe,IAAA,CAAK,MAAA,EAAQ,KAAA,EAAO;AAAA,QACvC,IAAA,EAAM,OAAA;AAAA,QACN,KAAA;AAAA,QACA,IAAA,EAAA,OAAA;AAAA,QACA,OAAA,EAAS,EAAE,EAAA,EAAI,aAAA,CAAc,SAAS,SAAA;AAAU,OACjD,CAAA;AACD,MAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,KAAA,EAAO,aAAa,CAAA;AAAA,IAClD,CAAC,CAAA,CACA,KAAA,CAAM,CAAA,KAAA,KAAS;AACd,MAAA,KAAK,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,KAAK,CAAA;AAAA,IAClC,CAAC,CAAA;AACH,IAAA,MAAM,YAAA,GAAe,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA;AAChD,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,YAAA,CAAa,iBAAA,GAAoB,iBAAA;AAAA,IACnC;AAGA,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,YAAA,CAAa,gBAAgB,CAAA;AAC7B,QAAA,gBAAA,GAAmB,IAAA;AAAA,MACrB;AACA,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,aAAA,EAAc;AACd,QAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,KAAK,CAAA;AAC/B,QAAA,iBAAA,CAAkB,OAAO,KAAK,CAAA;AAC9B,QAAA,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAC5B,QAAA,SAAA,GAAY,IAAA;AAAA,MACd;AAAA,IACF,CAAA;AAEA,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAc,MAAM,MAAA,CAAO,aAAA,EAAc;AAC/C,MAAA,IAAI,WAAW,KAAA,EAAO;AACpB,QAAA,MAAM,UAAA,CAAW,KAAA;AAAA,MACnB;AACA,MAAA,SAAA,GAAY,WAAW,YAAA,KAAiB,WAAA;AASxC,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAM,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG,iBAAA;AAAA,MACtC;AAGA,MAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,QAAC,WAAkC,KAAA,GAAQ,KAAA;AAAA,MAC7C;AACA,MAAA,OAAO,UAAA;AAAA,IACT,CAAA,SAAE;AAGA,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,cAAA,CACJ,KAAA,EACA,UAAA,EACA,OAAA,EAC8B;AAC9B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,UAAA,EAAY;AAAA,MAClD,GAAI,WAAW,EAAC;AAAA,MAChB,CAAC,gBAAgB,GAAG;AAAA,KAC+C,CAAA;AACrE,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAc,MAAM,MAAA,CAAO,MAAA,CAAO,aAAA,EAAc;AACtD,MAAA,IAAI,WAAW,KAAA,EAAO;AACpB,QAAA,MAAM,UAAA,CAAW,KAAA;AAAA,MACnB;AACA,MAAA,SAAA,GAAY,WAAW,YAAA,KAAiB,WAAA;AACxC,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAM,iBAAA,CAAkB,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA,EAAG,iBAAA;AAAA,MAC7C;AACA,MAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,QAAC,UAAA,CAAkC,QAAQ,MAAA,CAAO,KAAA;AAAA,MACpD;AACA,MAAA,OAAO,UAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,MAAA,CAAO,OAAA,EAAQ;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,OAAA,CACJ,KAAA,EACA,OAAA,EAQ+E;AAC/E,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,YAAA,CAAa,aAAA,CAAc,KAAK,CAAA;AAGxD,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,gBAAA,GAAyD,IAAA;AAE7D,IAAA,MAAM,sBAAsB,MAAM;AAChC,MAAA,IAAI,gBAAA,IAAoB,SAAA,IAAa,IAAA,CAAK,iBAAA,KAAsB,CAAA,EAAG;AACnE,MAAA,gBAAA,GAAmB,WAAW,MAAM;AAClC,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,KAAK,CAAA;AAC/B,UAAA,iBAAA,CAAkB,OAAO,KAAK,CAAA;AAC9B,UAAA,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAC5B,UAAA,SAAA,GAAY,IAAA;AAAA,QACd;AAAA,MACF,CAAA,EAAG,KAAK,iBAAiB,CAAA;AAAA,IAC3B,CAAA;AAEA,IAAA,MAAM;AAAA,MACJ,MAAA;AAAA,MACA,OAAA,EAAS,aAAA;AAAA,MACT;AAAA,QACE,wBAAA,CAAkC;AAAA,MACpC,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,KAAA;AAAA,MACA,SAAA,EAAW,OAAO,UAAA,EAAW;AAAA,MAC7B,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,MAAA;AAAA,QACT,QAAA,EAAU,MAAA;AAAA,QACV,OAAA,EAAS;AAAA,OACX;AAAA,MACA,UAAU,UAAA,EAAY,QAAA;AAAA,MACtB,YAAY,UAAA,EAAY,UAAA;AAAA,MACxB,QAAQ,OAAA,EAAS,MAAA;AAAA,MACjB,SAAS,OAAA,EAAS,OAAA;AAAA,MAClB,cAAc,OAAA,EAAS,YAAA;AAAA,MACvB,UAAU,OAAA,EAAS,QAAA;AAAA,MACnB,gBAAA,EAAkB,mBAAA;AAAA,MAClB,OAAA,EAAS,OAAM,KAAA,KAAS;AACtB,QAAA,MAAM,OAAA,EAAS,UAAU,KAAK,CAAA;AAC9B,QAAA,mBAAA,EAAoB;AAAA,MACtB,CAAA;AAAA,MACA,aAAa,OAAA,EAAS,WAAA;AAAA,MACtB,gBAAA,EAAkB,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA,EAAG,gBAAA;AAAA,MAChD,gBAAA,EAAkB,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA,EAAG,gBAAA;AAAA,MAChD,WAAA,EAAa,kBAAkB,GAAA,CAAI,KAAK,GAAG,WAAA,IAAe,IAAA,CAAK,YAAA,CAAa,cAAA,CAAe,KAAK;AAAA,KACjG,CAAA;AAGD,IAAA,MAAM,KAAA;AAEN,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,YAAA,CAAa,gBAAgB,CAAA;AAC7B,QAAA,gBAAA,GAAmB,IAAA;AAAA,MACrB;AACA,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,aAAA,EAAc;AACd,QAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,KAAK,CAAA;AAC/B,QAAA,iBAAA,CAAkB,OAAO,KAAK,CAAA;AAC9B,QAAA,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAC5B,QAAA,SAAA,GAAY,IAAA;AAAA,MACd;AAAA,IACF,CAAA;AAMA,IAAA,MAAM,KAAA,GAAQ,CAAC,MAAA,KAAqB;AAClC,MAAA,MAAM,UAAA,GAAA,CAAc,kBAAkB,GAAA,CAAI,KAAK,KAAK,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA,GAAI,eAAA;AACnF,MAAA,IAAI,UAAA,IAAc,CAAC,UAAA,CAAW,MAAA,CAAO,OAAA,EAAS;AAC5C,QAAA,UAAA,CAAW,MAAM,MAAM,CAAA;AAAA,MACzB;AAAA,IACF,CAAA;AAEA,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,IAAI,UAAA,GAAa;AACf,QAAA,OAAO,MAAA,CAAO,UAAA;AAAA,MAChB,CAAA;AAAA,MACA,KAAA;AAAA,MACA,UAAU,UAAA,EAAY,QAAA;AAAA,MACtB,YAAY,UAAA,EAAY,UAAA;AAAA,MACxB,OAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB,KAAA,EAAqB;AACrC,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,IAAI,YAAA,IAAgB,MAAA,IAAU,OAAQ,MAAA,CAAe,eAAe,UAAA,EAAY;AAC9E,MAAA,KAAM,MAAA,CAAe,UAAA,CAAW,kBAAA,CAAmB,KAAK,CAAC,CAAA;AAAA,IAC3D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,iBAAiB,KAAA,EAAgC;AACrD,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AAGpB,IAAA,IAAI,OAAO,MAAA,CAAO,UAAA,KAAe,UAAA,EAAY,OAAO,CAAA;AACpD,IAAA,IAAI;AACF,MAAA,MAAM,UAAU,MAAM,MAAA,CAAO,UAAA,CAAW,kBAAA,CAAmB,KAAK,CAAC,CAAA;AACjE,MAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GAAI,QAAQ,MAAA,GAAS,CAAA;AAAA,IACnD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAA,GAAc;AACZ,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,IAAA,CAAK,SAAA,GAAY,KAAK,cAAA,EAAe;AAKrC,MAAA,IAAI,KAAK,OAAA,EAAS;AAChB,QAAA,IAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,IAAA,CAAK,OAAO,CAAA;AAC5C,QAAA,IAAA,CAAK,UAAU,oBAAA,CAAqB;AAAA,UAClC,MAAA,EAAQ,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAU;AAAA,UAC/B,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,UAAA;AAAW,SAClC,CAAA;AAAA,MACH;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAe,eAAA,CACb,QAAA,EACA,aAAA,EAC2C;AAC3C,IAAA,OAAO,yBAAA;AAAA,MACL,IAAA;AAAA,MACA,QAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,QACE,eAAe,IAAA,CAAK,sBAAA;AAAA,QACpB,SAAA,EAAW,KAAK,OAAA,EAAS;AAAA;AAC3B,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CAAQ,QAAA,EAA4B,OAAA,EAA0C;AAClF,IAAA,MAAM,WAAA,GAAc,MAAM,0BAAA,CAAoC;AAAA,MAC5D,OAAO,IAAA,CAAK,aAAA;AAAA,MACZ,QAAA;AAAA,MACA,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,gBAAgB,OAAA,EAAS,cAAA;AAAA,MACzB,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAED,IAAA,IAAA,CAAK,aAAa,uBAAA,CAAwB,WAAA,CAAY,OAAO,WAAA,CAAY,aAAA,EAAe,YAAY,WAAA,EAAa;AAAA,MAC/G,UAAU,WAAA,CAAY,QAAA;AAAA,MACtB,YAAY,WAAA,CAAY;AAAA,KACzB,CAAA;AACD,IAAA,iBAAA,CAAkB,GAAA,CAAI,YAAY,KAAA,EAAO;AAAA,MACvC,GAAG,WAAA,CAAY,aAAA;AAAA,MACf,aAAa,WAAA,CAAY;AAAA,KAC1B,CAAA;AAED,IAAA,OAAO;AAAA,MACL,OAAO,WAAA,CAAY,KAAA;AAAA,MACnB,WAAW,WAAA,CAAY,SAAA;AAAA,MACvB,eAAe,WAAA,CAAY,aAAA;AAAA,MAC3B,eAAe,WAAA,CAAY,aAAA;AAAA,MAC3B,UAAU,WAAA,CAAY,QAAA;AAAA,MACtB,YAAY,WAAA,CAAY;AAAA,KAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,mBAAA,GAAsB;AACpB,IAAA,OAAO,CAAC,IAAA,CAAK,WAAA,EAAa,CAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YACJ,IAAA,EAC6D;AAC7D,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,WAAA,CAAY,IAAI,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,YAAY,MAAA,EAAsB;AAChC,IAAA,IAAA,CAAK,iBAAiB,MAAM,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,iBAAiB,MAAA,EAAsB;AACrC,IAAA,KAAA,CAAM,iBAAiB,MAAM,CAAA;AAC7B,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAEf,IAAA,IAAA,CAAK,aAAA,CAAc,iBAAiB,MAAM,CAAA;AAI1C,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,IAAoB,CAAC,KAAK,cAAA,EAAgB;AAClD,MAAA,IAAA,CAAK,eAAe,MAAA,CAAO,MAAA;AAAA,IAC7B;AAAA,EACF;AACF;;;ACt/CO,SAAS,mBAId,OAAA,EAAwG;AACxG,EAAA,MAAM,EAAE,KAAA,EAAO,EAAA,EAAI,MAAM,KAAA,EAAO,MAAA,EAAQ,UAAS,GAAI,OAAA;AAErD,EAAA,OAAO,IAAI,YAAA,CAAa;AAAA,IACtB,KAAA;AAAA,IACA,EAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACgD,CAAA;AACpD;AAKO,SAAS,eAAe,GAAA,EAA+B;AAC5D,EAAA,OAAO,GAAA,YAAe,YAAA;AACxB;AAMO,IAAM,mBAAA,GAAsB;;;ACjE5B,IAAM,YAAA,GAAN,cAIG,YAAA,CAAwC;AAAA;AAAA;AAAA;AAAA,EAIhD,YAAY,MAAA,EAAuD;AACjE,IAAA,KAAA,CAAM,MAAM,CAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAyB,eAAA,CAAgB,KAAA,EAAe,aAAA,EAA2D;AACjH,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,KAAK,WAAA,EAAY;AAClC,MAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,SAAA,CAAU;AAAA,QACnC,KAAA;AAAA,QACA,QAAQ,IAAA,CAAK;AAAA,OACd,CAAA;AAID,MAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA;AACzC,MAAA,MAAM,IAAI,UAAA,CAAW;AAAA,QACnB,SAAA,EAAW,aAAA;AAAA,QACX,gBAAgB,KAAA,EAAO,cAAA;AAAA,QACvB,GAAGA,4CAAA,CAA2B,EAAE,WAAA,EAAa,KAAA,EAAO,WAAW;AAAA,OAChE,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA;AAAA,IACvF;AAAA,EACF;AACF;AAKO,SAAS,oBAAoB,GAAA,EAA+B;AACjE,EAAA,OAAO,GAAA,YAAe,YAAA;AACxB;;;ACnBO,SAAS,mBAId,OAAA,EAAwG;AACxG,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,UAAS,GAAI,OAAA;AAE3C,EAAA,OAAO,IAAI,YAAA,CAAa;AAAA,IACtB,KAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACgD,CAAA;AACpD;AAKO,SAAS,eAAe,GAAA,EAA+B;AAC5D,EAAA,OAAO,GAAA,YAAe,YAAA;AACxB","file":"index.cjs","sourcesContent":["/**\n * Constants for DurableAgent pubsub channels and event types\n */\n\n/**\n * Symbol for passing run registry to workflow steps\n * This allows steps to access the actual model/tool instances\n */\nexport const RUN_REGISTRY_SYMBOL = Symbol('run_registry');\n\n/**\n * Generate the pubsub topic name for agent streaming events\n * @param runId - The unique run identifier\n * @returns The topic name for subscribing/publishing agent stream events\n */\nexport const AGENT_STREAM_TOPIC = (runId: string): string => `agent.stream.${runId}`;\n\n/**\n * Event type constants for agent stream events\n */\nexport const AgentStreamEventTypes = {\n  /** Chunk of streaming data (text, tool call, etc.) */\n  CHUNK: 'chunk',\n  /** Start of a new step in the agentic loop */\n  STEP_START: 'step-start',\n  /** End of a step in the agentic loop */\n  STEP_FINISH: 'step-finish',\n  /** Agent execution completed successfully */\n  FINISH: 'finish',\n  /** Error occurred during execution */\n  ERROR: 'error',\n  /** Workflow suspended (e.g., for tool approval) */\n  SUSPENDED: 'suspended',\n  /** Execution aborted by abortSignal */\n  ABORT: 'abort',\n  /** Single agentic-loop iteration completed (observability hook) */\n  ITERATION_COMPLETE: 'iteration-complete',\n} as const;\n\n/**\n * Default values for durable agent execution\n */\nexport const DurableAgentDefaults = {\n  /** Default maximum number of agentic loop iterations */\n  MAX_STEPS: 5,\n  /**\n   * Default tool call concurrency.\n   * NOTE: Currently unused — durable workflows run tool calls sequentially\n   * (concurrency: 1) because tool approval and suspension require sequential\n   * execution. The serialized toolCallConcurrency option is preserved in\n   * workflow input for future use when dynamic foreach concurrency is supported.\n   */\n  TOOL_CALL_CONCURRENCY: 10,\n} as const;\n\n/**\n * Step IDs used in the durable agentic workflow\n */\nexport const DurableStepIds = {\n  /** LLM execution step */\n  LLM_EXECUTION: 'durable-llm-execution',\n  /** Tool call step */\n  TOOL_CALL: 'durable-tool-call',\n  /** LLM mapping step (combines results) */\n  LLM_MAPPING: 'durable-llm-mapping',\n  /** Agentic execution workflow (one iteration) */\n  AGENTIC_EXECUTION: 'durable-agentic-execution',\n  /** Full agentic loop workflow */\n  AGENTIC_LOOP: 'durable-agentic-loop',\n  /** Scorer execution step */\n  SCORER_EXECUTION: 'durable-scorer-execution',\n  /** isTaskComplete evaluation step */\n  IS_TASK_COMPLETE: 'durable-is-task-complete',\n} as const;\n","/**\n * Implementation of `DurableAgent.streamUntilIdle` and\n * `DurableAgent.resume(..., { untilIdle })`. Mirrors the regular agent's\n * `stream-until-idle.ts` (shared `runWithIdleWrapper` + thin delegates per\n * entry point) but adapted for durable execution:\n * - `DurableAgent.stream()` returns `DurableAgentStreamResult` (not `MastraModelOutput`)\n * - Each continuation starts a new durable workflow (new runId)\n * - Cleanup functions from each inner stream are tracked and called on close\n * - Inner `abort()` handles are fanned out so the outer `result.abort()`\n *   cancels every active durable run\n *\n * High-level flow:\n * 1. Resolve memory scope (threadId, resourceId) -- falls through to the\n *    plain underlying call if no memory or bgManager.\n * 2. Register this call as the active wrapper for the scope, aborting any\n *    prior wrapper.\n * 3. Run initial turn via the `firstTurn` callback (either `agent.stream(...)`\n *    or `agent.resume(...)`) and pipe its `fullStream` into a combined outer\n *    stream.\n * 4. Subscribe to `bgManager.stream(...)` for background task lifecycle\n *    events. On terminal events, queue a continuation (always via\n *    `agent.stream([], continuationOpts)` — we're back in normal multi-turn\n *    flow at that point).\n * 5. `maxIdleMs` fires only between turns when nothing is happening.\n */\nimport type { BackgroundTaskManager } from '../../background-tasks/manager';\nimport { MASTRA_RESOURCE_ID_KEY, MASTRA_THREAD_ID_KEY, RequestContext } from '../../request-context';\nimport { deepMerge } from '../../utils';\nimport type { MessageListInput } from '../message-list';\n\nimport type { DurableAgent, DurableAgentStreamOptions, DurableAgentStreamResult } from './durable-agent';\n\nexport interface DurableStreamUntilIdleDeps {\n  activeStreams: Map<string, () => void>;\n  bgManager: BackgroundTaskManager | undefined;\n}\n\nconst TERMINAL_BG_CHUNKS = new Set([\n  'background-task-completed',\n  'background-task-failed',\n  'background-task-cancelled',\n  // Suspended is non-terminal for the bg task itself (it can be resumed\n  // later via `manager.resume`), but it IS terminal-for-this-iteration of\n  // the streamUntilIdle wrapper: the agent should react to the suspend in\n  // a follow-up turn so the user is told the task is parked. Without\n  // this, the wrapper waits indefinitely for completed/failed/cancelled\n  // and the stream times out.\n  'background-task-suspended',\n]);\n\nasync function resolveScope(\n  agent: DurableAgent<any, any, any>,\n  mergedOptions: Record<string, any>,\n): Promise<{ threadId: string | undefined; resourceId: string | undefined; scopeKey: string | null } | null> {\n  const requestContext = (mergedOptions?.requestContext as RequestContext | undefined) ?? new RequestContext();\n  const memory = await agent.getMemory();\n  if (!memory) return null;\n\n  const threadIdFromContext = requestContext.get(MASTRA_THREAD_ID_KEY) as string | undefined;\n  const resourceIdFromContext = requestContext.get(MASTRA_RESOURCE_ID_KEY) as string | undefined;\n  const threadIdFromArgs =\n    typeof mergedOptions?.memory?.thread === 'string'\n      ? mergedOptions.memory.thread\n      : (mergedOptions?.memory?.thread as { id?: string } | undefined)?.id;\n\n  const threadId = threadIdFromContext ?? threadIdFromArgs;\n  const resourceId = resourceIdFromContext ?? (mergedOptions?.memory?.resource as string | undefined);\n  const scopeKey = threadId || resourceId ? `${threadId ?? ''}|${resourceId ?? ''}` : null;\n  return { threadId, resourceId, scopeKey };\n}\n\nfunction buildContinuationDirective(batch: Array<Record<string, unknown>>): string {\n  const entries = batch\n    .map(chunk => {\n      const payload = (chunk as { payload?: Record<string, unknown> }).payload ?? {};\n      return {\n        toolCallId: payload.toolCallId as string | undefined,\n        toolName: payload.toolName as string | undefined,\n        isSuspended: !!payload.suspendedAt,\n      };\n    })\n    .filter(e => !!e.toolCallId);\n\n  const idList = entries\n    .filter(e => !e.isSuspended)\n    .map(e => (e.toolName ? `${e.toolCallId} (${e.toolName})` : e.toolCallId))\n    .join(', ');\n\n  // Suspend payloads are tool-controlled and may carry secrets, PII, or\n  // large opaque blobs — never serialize them into the continuation\n  // prompt. Just name the suspended tool-call IDs.\n  const suspendedIdList = entries\n    .filter(e => e.isSuspended)\n    .map(e => `${e.toolCallId} (${e.toolName})`)\n    .join(', ');\n\n  return (\n    `Background task(s) you previously dispatched have completed. ` +\n    `Process ONLY these tool-call IDs (their results are now in the conversation): ${idList}. ` +\n    `IMPORTANT: Do NOT process any tool-call IDs that were not in the list, ` +\n    `and do NOT call the same tool again — the result is already available. ` +\n    `Use these result(s) to answer the user's original question.` +\n    `IMPORTANT: The following tool-call IDs are suspended: ${suspendedIdList}. Do not attempt to resume them; let the user know they are waiting for explicit resume input.`\n  );\n}\n\nfunction buildContinuationOpts(\n  baseContinuationOpts: Record<string, any>,\n  callerContext: any[] | undefined,\n  batch: Array<Record<string, unknown>>,\n): Record<string, any> {\n  const directive = buildContinuationDirective(batch);\n  return {\n    ...baseContinuationOpts,\n    context: [...(callerContext ?? []), { role: 'user' as const, content: directive }],\n  };\n}\n\nfunction acquireStreamSlot(activeStreams: Map<string, () => void>, scopeKey: string | null, closer: () => void): void {\n  if (!scopeKey) return;\n  const priorClose = activeStreams.get(scopeKey);\n  priorClose?.();\n  activeStreams.set(scopeKey, closer);\n}\n\nfunction releaseStreamSlot(activeStreams: Map<string, () => void>, scopeKey: string | null, closer: () => void): void {\n  if (!scopeKey) return;\n  if (activeStreams.get(scopeKey) === closer) {\n    activeStreams.delete(scopeKey);\n  }\n}\n\n/**\n * Hook the caller passes to `runWithIdleWrapper` to drive the initial turn.\n * Receives the prepared options object and returns the resulting\n * `DurableAgentStreamResult`. Lets `runDurableStreamUntilIdle` pass\n * `agent.stream(messages, opts)` and `runResumeDurableStreamUntilIdle` pass\n * `agent.resume(runId, resumeData, opts)` — the rest of the wrapper (state\n * machine, bg-task subscription, continuation loop) is identical between\n * the two.\n */\ntype FirstTurnRunner<OUTPUT> = (opts: Record<string, any>) => Promise<DurableAgentStreamResult<OUTPUT>>;\n\n/**\n * Shared idle-loop wrapper used by both `runDurableStreamUntilIdle` (initial\n * turn: `agent.stream(messages, ...)`) and `runResumeDurableStreamUntilIdle`\n * (initial turn: `agent.resume(runId, resumeData, ...)`). The continuation\n * loop — triggered by terminal bg-task events — always uses\n * `agent.stream([], continuationOpts)` regardless of how the run started,\n * since at that point we're back to a normal multi-turn conversation.\n */\nasync function runWithIdleWrapper<OUTPUT>(\n  agent: DurableAgent<any, any, OUTPUT>,\n  streamOptions: (DurableAgentStreamOptions<OUTPUT> & { maxIdleMs?: number }) | undefined,\n  deps: DurableStreamUntilIdleDeps,\n  firstTurn: FirstTurnRunner<OUTPUT>,\n): Promise<DurableAgentStreamResult<OUTPUT>> {\n  const { maxIdleMs: _maxIdleMs, ...restStreamOptions } = streamOptions ?? {};\n\n  const defaultOptions = await agent.getDefaultOptions({\n    requestContext: streamOptions?.requestContext,\n  });\n  const mergedOptions = deepMerge(\n    defaultOptions as Record<string, unknown>,\n    (restStreamOptions ?? {}) as Record<string, unknown>,\n  ) as Record<string, any>;\n\n  const scope = await resolveScope(agent, mergedOptions);\n\n  if (!deps.bgManager || !scope) {\n    return firstTurn(restStreamOptions as Record<string, any>);\n  }\n\n  const { threadId, resourceId, scopeKey } = scope;\n  const maxIdleMs = _maxIdleMs ?? 5 * 60_000;\n\n  const baseContinuationOpts = {\n    ...(restStreamOptions ?? {}),\n    onFinish: undefined,\n    _skipBgTaskWait: true,\n  } as Record<string, any>;\n\n  const initialStreamOpts = {\n    ...(restStreamOptions ?? {}),\n    _skipBgTaskWait: true,\n  } as DurableAgentStreamOptions<OUTPUT>;\n\n  // --- State ---\n  const runningTaskIds = new Set<string>();\n  const pendingCompletions: Array<Record<string, unknown>> = [];\n  // Keyed by `${taskId}:${chunkType}` so a task that suspends + later\n  // resumes + completes doesn't see its `background-task-completed`\n  // dropped as a \"duplicate\" of the earlier `background-task-suspended`.\n  const processedTerminalKeys = new Set<string>();\n  const innerCleanups: Array<() => void> = [];\n  // Forward `result.abort(reason)` from the idle-loop wrapper onto whichever\n  // inner DurableAgent.stream() run is currently active. We collect their\n  // `abort` handles as they come up and call each on shutdown.\n  const innerAborts: Array<(reason?: unknown) => void> = [];\n  let isProcessing = false;\n  let closed = false;\n  let idleTimer: ReturnType<typeof setTimeout> | undefined;\n  let outerController!: ReadableStreamDefaultController<any>;\n  const outerAbort = new AbortController();\n  let firstRunId: string | undefined;\n\n  // --- Close / idle timer ---\n  const forceClose = () => {\n    if (closed) return;\n    closed = true;\n    if (idleTimer) {\n      clearTimeout(idleTimer);\n      idleTimer = undefined;\n    }\n    outerAbort.abort();\n    try {\n      outerController.close();\n    } catch {\n      // already closed\n    }\n    for (const fn of innerCleanups) {\n      try {\n        fn();\n      } catch {\n        // ignore\n      }\n    }\n    releaseStreamSlot(deps.activeStreams, scopeKey, forceClose);\n  };\n\n  const tryClose = () => {\n    if (closed) return;\n    if (isProcessing) return;\n    if (runningTaskIds.size > 0) return;\n    if (pendingCompletions.length > 0) return;\n    forceClose();\n  };\n\n  const clearIdleTimer = () => {\n    if (idleTimer) {\n      clearTimeout(idleTimer);\n      idleTimer = undefined;\n    }\n  };\n\n  const updateIdleTimer = () => {\n    if (closed) return;\n    clearIdleTimer();\n    if (isProcessing) return;\n    if (runningTaskIds.size === 0) return;\n    if (pendingCompletions.length > 0) return;\n    idleTimer = setTimeout(forceClose, maxIdleMs);\n  };\n\n  // --- Stream plumbing ---\n  const pipeInner = async (inner: ReadableStream<any>) => {\n    const reader = inner.getReader();\n    try {\n      while (true) {\n        if (outerAbort.signal.aborted) break;\n        const { done, value } = await reader.read();\n        if (done) break;\n        clearIdleTimer();\n        try {\n          outerController.enqueue(value);\n        } catch {\n          break;\n        }\n        if (value && typeof value === 'object' && (value as any).type === 'background-task-started') {\n          const taskId = (value as any).payload?.taskId;\n          if (taskId) runningTaskIds.add(taskId);\n        }\n      }\n    } finally {\n      reader.releaseLock();\n    }\n  };\n\n  const processIfIdle = async () => {\n    if (isProcessing || closed || pendingCompletions.length === 0) return;\n    isProcessing = true;\n    try {\n      const batch = pendingCompletions.splice(0, pendingCompletions.length);\n      for (const chunk of batch) {\n        const tid = (chunk as { payload?: { taskId?: string } }).payload?.taskId;\n        const ctype = (chunk as { type?: string }).type;\n        if (tid && ctype) processedTerminalKeys.add(`${tid}:${ctype}`);\n      }\n      const continuationOpts = buildContinuationOpts(baseContinuationOpts, restStreamOptions?.context as any[], batch);\n      const inner = await (agent as any).stream([], continuationOpts);\n      innerCleanups.push(inner.cleanup);\n      if (typeof inner.abort === 'function') innerAborts.push(inner.abort);\n      await pipeInner(inner.fullStream);\n    } catch (err) {\n      try {\n        outerController.error(err);\n      } catch {\n        // already closed\n      }\n      forceClose();\n      return;\n    } finally {\n      isProcessing = false;\n      if (pendingCompletions.length > 0) {\n        void processIfIdle();\n      } else {\n        tryClose();\n        updateIdleTimer();\n      }\n    }\n  };\n\n  // --- Setup ---\n  acquireStreamSlot(deps.activeStreams, scopeKey, forceClose);\n\n  (streamOptions as any)?.abortSignal?.addEventListener('abort', forceClose);\n\n  const combinedStream = new ReadableStream<any>({\n    start(controller) {\n      outerController = controller;\n    },\n    cancel() {\n      closed = true;\n      outerAbort.abort();\n      clearIdleTimer();\n    },\n  });\n\n  // --- Subscribe to background task events ---\n  const bgStream = deps.bgManager.stream({\n    agentId: agent.id,\n    threadId,\n    resourceId,\n    abortSignal: outerAbort.signal,\n  });\n  const bgReader = bgStream.getReader();\n  void (async () => {\n    try {\n      while (true) {\n        if (outerAbort.signal.aborted) break;\n        const { done, value } = await bgReader.read();\n        if (done) break;\n        const chunk = value as { type?: string; payload?: Record<string, unknown> };\n        if (!chunk || typeof chunk !== 'object' || typeof chunk.type !== 'string') continue;\n\n        const taskId = (chunk.payload as { taskId?: string } | undefined)?.taskId;\n\n        const terminalKey = taskId && TERMINAL_BG_CHUNKS.has(chunk.type) ? `${taskId}:${chunk.type}` : undefined;\n        if (terminalKey && processedTerminalKeys.has(terminalKey)) {\n          continue;\n        }\n\n        updateIdleTimer();\n\n        try {\n          outerController.enqueue(chunk);\n        } catch {\n          break;\n        }\n\n        if (!taskId) continue;\n        if (chunk.type === 'background-task-running') {\n          runningTaskIds.add(taskId);\n        } else if (TERMINAL_BG_CHUNKS.has(chunk.type)) {\n          runningTaskIds.delete(taskId);\n          pendingCompletions.push(chunk);\n          void processIfIdle();\n        }\n      }\n    } catch {\n      // bg stream ended\n    } finally {\n      bgReader.releaseLock();\n    }\n  })();\n\n  // --- Initial turn ---\n  isProcessing = true;\n  clearIdleTimer();\n  let first: DurableAgentStreamResult<OUTPUT>;\n  try {\n    first = await firstTurn(initialStreamOpts as Record<string, any>);\n  } catch (err) {\n    forceClose();\n    throw err;\n  }\n  firstRunId = first.runId;\n  innerCleanups.push(first.cleanup);\n  if (typeof first.abort === 'function') innerAborts.push(first.abort);\n\n  void (async () => {\n    try {\n      await pipeInner(first.fullStream);\n    } catch (err) {\n      try {\n        outerController.error(err);\n      } catch {\n        // already closed\n      }\n    }\n    isProcessing = false;\n    if (pendingCompletions.length > 0) {\n      void processIfIdle();\n    } else {\n      tryClose();\n      updateIdleTimer();\n    }\n  })();\n\n  return {\n    output: new Proxy(first.output, {\n      get(target, prop) {\n        if (prop === 'fullStream') return combinedStream;\n        const value = Reflect.get(target, prop, target);\n        return typeof value === 'function' ? value.bind(target) : value;\n      },\n    }) as any,\n    get fullStream() {\n      return combinedStream;\n    },\n    runId: firstRunId!,\n    threadId,\n    resourceId,\n    cleanup: forceClose,\n    abort: (reason?: unknown) => {\n      // Fan the abort out to every inner DurableAgent.stream() that has been\n      // spawned by the idle loop so far. `forceClose` then unwinds the outer\n      // stream + idle timer.\n      for (const innerAbort of innerAborts) {\n        try {\n          innerAbort(reason);\n        } catch {\n          // ignore — best-effort abort across siblings\n        }\n      }\n      forceClose();\n    },\n  };\n}\n\n/**\n * Run `DurableAgent.streamUntilIdle` (or `DurableAgent.stream({ untilIdle })`).\n * Initial turn invokes `agent.stream(messages, ...)`; continuations triggered\n * by background-task completions run as fresh `agent.stream([], ...)` calls\n * against the same memory thread.\n */\nexport async function runDurableStreamUntilIdle<OUTPUT = undefined>(\n  agent: DurableAgent<any, any, OUTPUT>,\n  messages: MessageListInput,\n  streamOptions: (DurableAgentStreamOptions<OUTPUT> & { maxIdleMs?: number }) | undefined,\n  deps: DurableStreamUntilIdleDeps,\n): Promise<DurableAgentStreamResult<OUTPUT>> {\n  return runWithIdleWrapper<OUTPUT>(\n    agent,\n    streamOptions,\n    deps,\n    opts => (agent as any).stream(messages, opts) as Promise<DurableAgentStreamResult<OUTPUT>>,\n  );\n}\n\n/**\n * Run `DurableAgent.resume(..., { untilIdle })`. Same idle-loop semantics as\n * `runDurableStreamUntilIdle` — initial turn calls `agent.resume(runId,\n * resumeData, ...)` against the existing run snapshot, and subsequent\n * continuations triggered by background-task completions use\n * `agent.stream([], continuationOpts)` (a normal multi-turn agent stream)\n * since the resume completes and we're back in regular conversation flow.\n */\nexport async function runResumeDurableStreamUntilIdle<OUTPUT = undefined>(\n  agent: DurableAgent<any, any, OUTPUT>,\n  runId: string,\n  resumeData: unknown,\n  streamOptions: (DurableAgentStreamOptions<OUTPUT> & { maxIdleMs?: number }) | undefined,\n  deps: DurableStreamUntilIdleDeps,\n): Promise<DurableAgentStreamResult<OUTPUT>> {\n  return runWithIdleWrapper<OUTPUT>(\n    agent,\n    streamOptions,\n    deps,\n    opts => (agent as any).resume(runId, resumeData, opts) as Promise<DurableAgentStreamResult<OUTPUT>>,\n  );\n}\n","import type { JSONSchema7 } from 'json-schema';\nimport type { MastraLanguageModel } from '../../../llm/model/shared.types';\nimport type { MemoryConfig } from '../../../memory/types';\nimport type { CoreTool } from '../../../tools/types';\nimport type { MessageList } from '../../message-list';\nimport type { AgentModelManagerConfig } from '../../types';\nimport type {\n  SerializableToolMetadata,\n  SerializableModelConfig,\n  SerializableModelListEntry,\n  SerializableDurableState,\n  SerializableDurableOptions,\n  SerializableModelSettings,\n  SerializableScorersConfig,\n  SerializableScorerEntry,\n  DurableAgenticWorkflowInput,\n} from '../types';\n\n/**\n * Extract serializable metadata from a CoreTool\n * This strips out the execute function and converts the schema to JSON Schema\n */\nexport function serializeToolMetadata(name: string, tool: CoreTool): SerializableToolMetadata {\n  // Extract JSON Schema from the parameters\n  let inputSchema: JSONSchema7 = { type: 'object' };\n\n  if (tool.parameters) {\n    // If it's already a JSON Schema object\n    if ('type' in tool.parameters && typeof tool.parameters.type === 'string') {\n      inputSchema = tool.parameters as JSONSchema7;\n    }\n    // If it has a jsonSchema property (zod schema converted)\n    else if ('jsonSchema' in tool.parameters) {\n      inputSchema = (tool.parameters as any).jsonSchema as JSONSchema7;\n    }\n    // If it's a Zod schema with _def (try to extract)\n    else if ('_def' in tool.parameters) {\n      // We'll need to use zodToJsonSchema at runtime if available\n      // For now, use a basic object schema\n      inputSchema = { type: 'object' };\n    }\n  }\n\n  return {\n    id: 'id' in tool && typeof tool.id === 'string' ? tool.id : name,\n    name,\n    description: tool.description,\n    inputSchema,\n    requireApproval: (tool as any).requireApproval,\n    hasSuspendSchema: (tool as any).hasSuspendSchema,\n  };\n}\n\n/**\n * Extract serializable metadata from all tools\n */\nexport function serializeToolsMetadata(tools: Record<string, CoreTool>): SerializableToolMetadata[] {\n  return Object.entries(tools).map(([name, tool]) => serializeToolMetadata(name, tool));\n}\n\n/**\n * Extract serializable model configuration\n */\nexport function serializeModelConfig(model: MastraLanguageModel): SerializableModelConfig {\n  return {\n    provider: model.provider,\n    modelId: model.modelId,\n    specificationVersion: model.specificationVersion,\n    // Store the original config string for runtime resolution (e.g., 'openai/gpt-4o')\n    originalConfig: `${model.provider}/${model.modelId}`,\n    // Note: We don't serialize model settings here - they come from execution options\n  };\n}\n\n/**\n * Extract serializable model list entry from AgentModelManagerConfig\n */\nexport function serializeModelListEntry(entry: AgentModelManagerConfig): SerializableModelListEntry {\n  const model = entry.model;\n  return {\n    id: entry.id,\n    config: {\n      provider: model.provider,\n      modelId: model.modelId,\n      specificationVersion: model.specificationVersion,\n      originalConfig: `${model.provider}/${model.modelId}`,\n      providerOptions: entry.providerOptions,\n    },\n    maxRetries: entry.maxRetries,\n    enabled: entry.enabled,\n  };\n}\n\n/**\n * Serialize an array of model configs into a model list.\n * Filters out disabled models since they shouldn't be included in durable execution.\n */\nexport function serializeModelList(models: AgentModelManagerConfig[]): SerializableModelListEntry[] {\n  return models.filter(m => m.enabled !== false).map(serializeModelListEntry);\n}\n\n/**\n * Serialize scorers configuration for durable execution.\n *\n * This extracts the scorer name (for resolution at runtime) and sampling config.\n * The actual scorer objects are resolved from Mastra at step execution time.\n *\n * @param scorers The agent's scorers configuration (from agent.scorers or options.scorers)\n * @returns Serializable scorer configuration\n */\nexport function serializeScorersConfig(\n  scorers: Record<\n    string,\n    { scorer: { name: string } | string; sampling?: { type: 'none' } | { type: 'ratio'; rate: number } }\n  >,\n): SerializableScorersConfig {\n  const result: SerializableScorersConfig = {};\n\n  for (const [key, entry] of Object.entries(scorers)) {\n    // Get the scorer name - can be a string directly or from scorer.name\n    const scorerName = typeof entry.scorer === 'string' ? entry.scorer : entry.scorer.name;\n\n    const scorerEntry: SerializableScorerEntry = {\n      scorerName,\n    };\n\n    // Include sampling if provided\n    if (entry.sampling) {\n      scorerEntry.sampling = entry.sampling;\n    }\n\n    result[key] = scorerEntry;\n  }\n\n  return result;\n}\n\n/**\n * Extract serializable state from _internal-like objects\n */\nexport function serializeDurableState(params: {\n  memoryConfig?: MemoryConfig;\n  threadId?: string;\n  resourceId?: string;\n  threadExists?: boolean;\n  savePerStep?: boolean;\n  observationalMemory?: boolean;\n}): SerializableDurableState {\n  return {\n    memoryConfig: params.memoryConfig,\n    threadId: params.threadId,\n    resourceId: params.resourceId,\n    threadExists: params.threadExists,\n    savePerStep: params.savePerStep,\n    observationalMemory: params.observationalMemory,\n  };\n}\n\n/**\n * Pick the JSON-safe call settings out of an arbitrary `modelSettings` input.\n * Drops any field that is not a primitive value of the expected type so that\n * non-serializable fields (functions, AbortSignal, etc.) never reach the\n * workflow input.\n */\nexport function serializeModelSettings(\n  settings: SerializableModelSettings | Record<string, unknown> | undefined,\n): SerializableModelSettings | undefined {\n  if (!settings || typeof settings !== 'object') return undefined;\n\n  const source = settings as Record<string, unknown>;\n  const out: SerializableModelSettings = {};\n  const pickNumber = (key: keyof SerializableModelSettings) => {\n    const value = source[key as string];\n    if (typeof value === 'number' && Number.isFinite(value)) {\n      (out as Record<string, unknown>)[key as string] = value;\n    }\n  };\n\n  pickNumber('maxOutputTokens');\n  pickNumber('temperature');\n  pickNumber('topP');\n  pickNumber('topK');\n  pickNumber('presencePenalty');\n  pickNumber('frequencyPenalty');\n  pickNumber('seed');\n  pickNumber('maxRetries');\n\n  if (Array.isArray(source.stopSequences) && source.stopSequences.every(v => typeof v === 'string')) {\n    out.stopSequences = source.stopSequences as string[];\n  }\n\n  // Headers are never serialized into the workflow input. They are stored\n  // exclusively on the in-process RunRegistryEntry so they never reach\n  // durable storage. The durable llm-execution step merges them back from\n  // the registry at call time.\n  // (Previously we had a denylist of \"sensitive\" header names, but any\n  // header could carry credentials — the safest approach is to keep them\n  // all off the wire.)\n\n  return Object.keys(out).length > 0 ? out : undefined;\n}\n\n/**\n * Extract serializable options from agent execution options\n */\nexport function serializeDurableOptions(options: {\n  maxSteps?: number;\n  toolChoice?: any;\n  activeTools?: string[];\n  modelSettings?: SerializableModelSettings | Record<string, unknown>;\n  requireToolApproval?: boolean;\n  toolCallConcurrency?: number;\n  autoResumeSuspendedTools?: boolean;\n  maxProcessorRetries?: number;\n  includeRawChunks?: boolean;\n  returnScorerData?: boolean;\n  hasErrorProcessors?: boolean;\n  providerOptions?: SerializableDurableOptions['providerOptions'];\n  structuredOutput?: SerializableDurableOptions['structuredOutput'];\n  skipBgTaskWait?: boolean;\n  disableBackgroundTasks?: boolean;\n  tracingOptions?: SerializableDurableOptions['tracingOptions'];\n  actor?: SerializableDurableOptions['actor'];\n  instructionsOverride?: SerializableDurableOptions['instructionsOverride'];\n  systemMessage?: SerializableDurableOptions['systemMessage'];\n  transform?: SerializableDurableOptions['transform'];\n  isTaskComplete?: SerializableDurableOptions['isTaskComplete'];\n}): SerializableDurableOptions {\n  // Normalize toolChoice to serializable form\n  let serializedToolChoice: SerializableDurableOptions['toolChoice'];\n  if (options.toolChoice) {\n    if (typeof options.toolChoice === 'string') {\n      serializedToolChoice = options.toolChoice as 'auto' | 'none' | 'required';\n    } else if (typeof options.toolChoice === 'object' && 'type' in options.toolChoice) {\n      if (options.toolChoice.type === 'tool' && 'toolName' in options.toolChoice) {\n        serializedToolChoice = {\n          type: 'tool',\n          toolName: options.toolChoice.toolName as string,\n        };\n      }\n    }\n  }\n\n  return {\n    maxSteps: options.maxSteps,\n    toolChoice: serializedToolChoice,\n    activeTools: options.activeTools,\n    modelSettings: serializeModelSettings(options.modelSettings),\n    requireToolApproval: options.requireToolApproval,\n    toolCallConcurrency: options.toolCallConcurrency,\n    autoResumeSuspendedTools: options.autoResumeSuspendedTools,\n    maxProcessorRetries: options.maxProcessorRetries,\n    includeRawChunks: options.includeRawChunks,\n    returnScorerData: options.returnScorerData,\n    hasErrorProcessors: options.hasErrorProcessors,\n    providerOptions: options.providerOptions,\n    structuredOutput: options.structuredOutput,\n    skipBgTaskWait: options.skipBgTaskWait,\n    disableBackgroundTasks: options.disableBackgroundTasks,\n    tracingOptions: options.tracingOptions,\n    actor: options.actor,\n    instructionsOverride: options.instructionsOverride,\n    systemMessage: options.systemMessage,\n    transform: options.transform,\n    isTaskComplete: options.isTaskComplete,\n  };\n}\n\n/**\n * Create the full workflow input from all components\n */\nexport function createWorkflowInput(params: {\n  runId: string;\n  agentId: string;\n  agentName?: string;\n  messageList: MessageList;\n  tools: Record<string, CoreTool>;\n  model: MastraLanguageModel;\n  modelList?: AgentModelManagerConfig[];\n  scorers?: Parameters<typeof serializeScorersConfig>[0];\n  options: Parameters<typeof serializeDurableOptions>[0];\n  state: Parameters<typeof serializeDurableState>[0];\n  messageId: string;\n  agentSpanData?: unknown;\n  modelSpanData?: unknown;\n  requestContextEntries?: Record<string, unknown>;\n}): DurableAgenticWorkflowInput {\n  return {\n    __workflowKind: 'durable-agent',\n    runId: params.runId,\n    agentId: params.agentId,\n    agentName: params.agentName,\n    messageListState: params.messageList.serialize(),\n    toolsMetadata: serializeToolsMetadata(params.tools),\n    modelConfig: serializeModelConfig(params.model),\n    modelList: params.modelList ? serializeModelList(params.modelList) : undefined,\n    scorers: params.scorers ? serializeScorersConfig(params.scorers) : undefined,\n    options: serializeDurableOptions(params.options),\n    state: serializeDurableState(params.state),\n    messageId: params.messageId,\n    agentSpanData: params.agentSpanData,\n    modelSpanData: params.modelSpanData,\n    requestContextEntries: params.requestContextEntries,\n  };\n}\n\n/**\n * Serialize an error for workflow state\n */\nexport function serializeError(error: unknown): { name: string; message: string; stack?: string } {\n  if (error instanceof Error) {\n    return {\n      name: error.name,\n      message: error.message,\n      stack: error.stack,\n    };\n  }\n  return {\n    name: 'Error',\n    message: String(error),\n  };\n}\n\n/**\n * Serialize a Date to ISO string for workflow state\n */\nexport function serializeDate(date: Date | undefined): string | undefined {\n  return date?.toISOString();\n}\n\n/**\n * Deserialize an ISO string back to Date\n */\nexport function deserializeDate(isoString: string | undefined): Date | undefined {\n  return isoString ? new Date(isoString) : undefined;\n}\n","import type { AgentBackgroundConfig } from '../../background-tasks/types';\nimport type { MastraLanguageModel } from '../../llm/model/shared.types';\nimport type { IMastraLogger } from '../../logger';\nimport type { Mastra } from '../../mastra';\nimport type { MastraMemory } from '../../memory/memory';\nimport type { MemoryConfig, MemoryConfig as _MemoryConfig, StorageThreadType } from '../../memory/types';\nimport { EntityType, SpanType, createObservabilityContext, getOrCreateSpan } from '../../observability';\nimport type { InputProcessorOrWorkflow, OutputProcessorOrWorkflow, ErrorProcessorOrWorkflow } from '../../processors';\nimport type { ProcessorState } from '../../processors/runner';\nimport { RequestContext, MASTRA_VERSIONS_KEY, mergeVersionOverrides } from '../../request-context';\nimport type { VersionOverrides } from '../../request-context';\nimport { toStandardSchema } from '../../schema';\nimport { normalizeToolPayloadTransformPolicy } from '../../tools/payload-transform';\nimport type { CoreTool, ToolHooks, ToolPayloadTransformPolicy } from '../../tools/types';\nimport { deepMerge } from '../../utils';\nimport type { Workspace } from '../../workspace';\nimport type { Agent } from '../agent';\nimport type { AgentExecutionOptions, DelegationConfig } from '../agent.types';\nimport { MessageList } from '../message-list';\nimport type { MessageListInput } from '../message-list';\nimport { SaveQueueManager } from '../save-queue';\nimport type { CreatedAgentSignal } from '../signals';\nimport { mastraDBMessageToSignal } from '../signals';\nimport { TripWire } from '../trip-wire';\nimport type {\n  AgentInstructions,\n  AgentMethodType,\n  AgentModelManagerConfig,\n  GoalConfig,\n  ToolsetsInput,\n  ToolsInput,\n} from '../types';\nimport type { DurableAgenticWorkflowInput, RunRegistryEntry, SerializableStructuredOutput } from './types';\nimport { createWorkflowInput } from './utils/serialize-state';\n\n/**\n * JSON-safe snapshot of `requestContext.entries()` so durable steps (e.g.\n * is-task-complete scorers) can see the same `customContext` the non-durable\n * path passes. Best-effort: entries that fail a JSON round-trip are skipped\n * so a single non-serializable value can't break the workflow input.\n */\nfunction snapshotRequestContextEntries(\n  requestContext: RequestContext | undefined,\n): Record<string, unknown> | undefined {\n  if (!requestContext) return undefined;\n  const out: Record<string, unknown> = {};\n  let any = false;\n  for (const [key, value] of requestContext.entries()) {\n    try {\n      const cloned = JSON.parse(JSON.stringify(value));\n      out[key as string] = cloned;\n      any = true;\n    } catch {\n      // Skip non-serializable entries silently — they wouldn't survive the\n      // wire on cross-process engines anyway.\n    }\n  }\n  return any ? out : undefined;\n}\n\n/**\n * Mirror of Agent#convertInstructionsToString — used for the AGENT_RUN span\n * `attributes.instructions` field so durable runs publish the same shape as\n * non-durable runs. Kept local to avoid promoting the private method.\n */\nfunction convertInstructionsToString(instructions: AgentInstructions | undefined): string {\n  if (!instructions) return '';\n  if (typeof instructions === 'string') return instructions;\n  if (Array.isArray(instructions)) {\n    return instructions\n      .map(msg => (typeof msg === 'string' ? msg : typeof msg.content === 'string' ? msg.content : ''))\n      .filter(Boolean)\n      .join('\\n\\n');\n  }\n  return typeof instructions.content === 'string' ? instructions.content : '';\n}\n\n/**\n * Extract signal messages already present in the messageList at run start\n * (from persisted history) so they can be echoed as data-signal stream parts\n * on the first LLM step. Mirrors `prepare-memory-step.ts#getInitialSignalEchoes`.\n */\nfunction getInitialSignalEchoes(messageList: MessageList): CreatedAgentSignal[] {\n  const inputMessageIds = messageList.makeMessageSourceChecker().input;\n  return messageList.get.all\n    .db()\n    .filter(message => message.role === 'signal' && inputMessageIds.has(message.id))\n    .map(mastraDBMessageToSignal);\n}\n\n/**\n * Interface for the Agent methods needed during durable preparation.\n * This provides proper typing for the public Agent methods we call.\n */\ninterface DurablePreparationAgent {\n  id: string;\n  name?: string;\n  getDefaultOptions(opts: { requestContext: RequestContext }): AgentExecutionOptions | Promise<AgentExecutionOptions>;\n  getInstructions(opts: { requestContext: RequestContext }): AgentInstructions | Promise<AgentInstructions>;\n  getModel(opts: { requestContext: RequestContext }): MastraLanguageModel | Promise<MastraLanguageModel>;\n  getModelList(requestContext: RequestContext): Promise<AgentModelManagerConfig[] | null>;\n  getMemory(opts: { requestContext: RequestContext }): Promise<MastraMemory | undefined>;\n  getWorkspace(opts: { requestContext: RequestContext }): Promise<Workspace | undefined>;\n  listScorers(opts: {\n    requestContext: RequestContext;\n  }): Promise<Record<string, { scorer: unknown; sampling?: unknown }> | undefined>;\n  getToolsForExecution(opts: {\n    toolsets?: ToolsetsInput;\n    clientTools?: ToolsInput;\n    threadId?: string;\n    resourceId?: string;\n    runId?: string;\n    requestContext?: RequestContext;\n    memoryConfig?: MemoryConfig;\n    autoResumeSuspendedTools?: boolean;\n    hooks?: ToolHooks;\n    delegation?: DelegationConfig;\n    methodType?: AgentMethodType;\n  }): Promise<Record<string, CoreTool>>;\n  listInputProcessors(requestContext?: RequestContext): Promise<InputProcessorOrWorkflow[]>;\n  listOutputProcessors(requestContext?: RequestContext): Promise<OutputProcessorOrWorkflow[]>;\n  listErrorProcessors(requestContext?: RequestContext): Promise<ErrorProcessorOrWorkflow[]>;\n  getBackgroundTasksConfig(): AgentBackgroundConfig | undefined;\n  getToolPayloadTransform?(): ToolPayloadTransformPolicy | undefined;\n  __getDrainPendingSignals(): (runId: string, scope?: 'pending' | 'pre-run') => CreatedAgentSignal[];\n  __getGoalConfig(): GoalConfig | undefined;\n  __listLLMRequestProcessors(requestContext?: RequestContext): Promise<InputProcessorOrWorkflow[]>;\n}\n\n/**\n * Result from the preparation phase\n */\nexport interface PreparationResult<_OUTPUT = undefined> {\n  /** Unique run identifier */\n  runId: string;\n  /** Message ID for this generation */\n  messageId: string;\n  /** Serialized workflow input */\n  workflowInput: DurableAgenticWorkflowInput;\n  /** Non-serializable state for the run registry */\n  registryEntry: RunRegistryEntry;\n  /** MessageList for callback access */\n  messageList: MessageList;\n  /** Thread ID if using memory */\n  threadId?: string;\n  /** Resource ID if using memory */\n  resourceId?: string;\n}\n\n/**\n * Options for preparation phase\n */\nexport interface PreparationOptions<OUTPUT = undefined> {\n  /** The agent instance */\n  agent: Agent<string, any, OUTPUT>;\n  /** User messages to process */\n  messages: MessageListInput;\n  /** Execution options */\n  options?: AgentExecutionOptions<OUTPUT>;\n  /** Run ID (will be generated if not provided) */\n  runId?: string;\n  /** Request context */\n  requestContext?: RequestContext;\n  /** Logger */\n  logger?: IMastraLogger;\n  /** Mastra instance (for version overrides, background tasks, etc.) */\n  mastra?: Mastra;\n  /** Method type */\n  methodType?: AgentMethodType;\n}\n\n/**\n * Prepare for durable agent execution.\n *\n * This function performs the non-durable preparation phase:\n * 1. Generates run ID and message ID\n * 2. Resolves thread/memory context\n * 3. Creates MessageList with instructions and messages\n * 4. Converts tools to CoreTool format\n * 5. Gets the model configuration\n * 6. Creates serialized workflow input\n * 7. Creates run registry entry for non-serializable state\n *\n * The result includes both the serialized workflow input (for the durable\n * workflow) and the run registry entry (for non-serializable state).\n */\nexport async function prepareForDurableExecution<OUTPUT = undefined>(\n  options: PreparationOptions<OUTPUT>,\n): Promise<PreparationResult<OUTPUT>> {\n  const {\n    agent,\n    messages,\n    options: rawExecOptions,\n    runId: providedRunId,\n    requestContext: providedRequestContext,\n    logger,\n    mastra,\n    methodType = 'stream',\n  } = options;\n\n  const typedAgent = agent as unknown as DurablePreparationAgent;\n\n  // 1. Generate IDs\n  const runId = providedRunId ?? crypto.randomUUID();\n  const messageId = crypto.randomUUID();\n\n  // 2. Get request context\n  const requestContext = providedRequestContext ?? new RequestContext();\n\n  // 2a. Snapshot caller-provided RequestContext entries *before* preparation\n  // mutates the context (version overrides at step 3, MastraMemory at step 4).\n  // The persisted `customContext` should reflect only what the caller passed in,\n  // not internal-key state added during prep.\n  const requestContextEntriesSnapshot = snapshotRequestContextEntries(requestContext);\n\n  // 2b. Merge the wrapped agent's defaultOptions under the per-request options,\n  // mirroring the non-durable Agent.stream()/generate() paths. Without this the\n  // agent's configured defaults (maxSteps, providerOptions, etc.) are silently\n  // dropped and durable runs fall back to DurableAgentDefaults.MAX_STEPS.\n  const defaultOptions = await typedAgent.getDefaultOptions({ requestContext });\n  const execOptions = deepMerge(\n    (defaultOptions ?? {}) as Record<string, unknown>,\n    (rawExecOptions ?? {}) as Record<string, unknown>,\n  ) as AgentExecutionOptions<OUTPUT>;\n\n  // 3. Merge version overrides (Mastra defaults < requestContext < call-site)\n  const requestVersions = requestContext.get(MASTRA_VERSIONS_KEY) as VersionOverrides | undefined;\n  let mergedVersions = mergeVersionOverrides(mastra?.getVersionOverrides?.(), requestVersions);\n  if ((execOptions as any)?.versions) {\n    mergedVersions = mergeVersionOverrides(mergedVersions, (execOptions as any).versions);\n  }\n  if (mergedVersions) {\n    requestContext.set(MASTRA_VERSIONS_KEY, mergedVersions);\n  }\n\n  // 4. Resolve thread/memory context\n  const thread =\n    typeof execOptions?.memory?.thread === 'string' ? { id: execOptions.memory.thread } : execOptions?.memory?.thread;\n  const threadId = thread?.id;\n  const resourceId = execOptions?.memory?.resource;\n  let threadObject: StorageThreadType | undefined;\n  let threadExists = false;\n\n  // 5. Create MessageList\n  const messageList = new MessageList({\n    threadId,\n    resourceId,\n  });\n\n  // Add agent instructions. Per-call `options.instructions` overrides the\n  // agent's default instructions to mirror non-durable Agent.stream() behavior.\n  const instructions = execOptions?.instructions || (await typedAgent.getInstructions({ requestContext }));\n  if (instructions) {\n    if (typeof instructions === 'string') {\n      messageList.addSystem(instructions);\n    } else if (Array.isArray(instructions)) {\n      for (const inst of instructions) {\n        messageList.addSystem(inst);\n      }\n    } else {\n      messageList.addSystem(instructions);\n    }\n  }\n  const workspace = await typedAgent.getWorkspace({ requestContext });\n\n  // Durable preparation runs processInput processors below, but workspace\n  // instructions are a processInputStep concern in the non-durable path.\n  // Add them here once so durable runs get the same workspace context.\n  if (workspace) {\n    const hasFs =\n      typeof workspace.hasFilesystemConfig === 'function' ? workspace.hasFilesystemConfig() : !!workspace.filesystem;\n    const hasSb = typeof workspace.hasSandboxConfig === 'function' ? workspace.hasSandboxConfig() : !!workspace.sandbox;\n    if (hasFs || hasSb) {\n      const wsInstructions =\n        typeof workspace.getInstructionsAsync === 'function'\n          ? await workspace.getInstructionsAsync({ requestContext })\n          : workspace.getInstructions({ requestContext });\n      if (wsInstructions) {\n        messageList.addSystem({ role: 'system', content: wsInstructions });\n      }\n    }\n  }\n\n  // Add context messages if provided\n  if (execOptions?.context) {\n    messageList.add(execOptions.context, 'context');\n  }\n\n  // Per-call `options.system` is appended as an additional system message after\n  // context. Mirrors the non-durable Agent.stream() prepare-memory-step path.\n  if (execOptions?.system) {\n    const sys = execOptions.system;\n    if (typeof sys === 'string') {\n      messageList.addSystem(sys);\n    } else if (Array.isArray(sys)) {\n      for (const s of sys) {\n        messageList.addSystem(s);\n      }\n    } else {\n      messageList.addSystem(sys);\n    }\n  }\n\n  // Add user messages\n  messageList.add(messages, 'input');\n\n  // 6. Establish the memory/thread context BEFORE resolving input processors.\n  //\n  // Memory.getInputProcessors() decides whether to add the working-memory\n  // injector by reading requestContext.get('MastraMemory')?.memoryConfig. When\n  // working memory is disabled in the constructor and enabled per-request (the\n  // documented setup), that runtime config is the only signal that turns the\n  // injector on. If we resolve processors before setting MastraMemory, the\n  // per-request config is invisible, the chain falls back to the constructor\n  // config, and the injector is silently omitted — so stored working memory is\n  // saved by the update-working-memory tool but never read back into the prompt.\n  // Setting the context first keeps read (inject) and write (tool) in sync.\n  const memory = await typedAgent.getMemory({ requestContext });\n  const memoryConfig = execOptions?.memory?.options;\n  if (memory && threadId && resourceId) {\n    const existingThread = await memory.getThreadById({ threadId });\n    threadObject =\n      existingThread ??\n      (await memory.createThread({\n        threadId,\n        metadata: thread?.metadata,\n        title: thread?.title,\n        memoryConfig,\n        resourceId,\n        saveThread: true,\n      }));\n    threadExists = true;\n    requestContext.set('MastraMemory', { thread: threadObject, resourceId, memoryConfig });\n  } else {\n    // This run has no complete per-request memory context. Clear any\n    // MastraMemory inherited from a caller-provided requestContext (e.g. a\n    // parent agent's context during sub-agent delegation) so processor\n    // resolution can't pick up the working-memory injector from stale/parent\n    // memory — that would both leak prior resource memory into this prompt and\n    // break the \"no per-request memory options means no injection\" gate.\n    requestContext.delete('MastraMemory');\n  }\n\n  // Resolve input processors now that the memory context is in place.\n  const processorStates = new Map<string, ProcessorState>();\n  let inputProcessors: InputProcessorOrWorkflow[] = [];\n  let llmRequestInputProcessors: InputProcessorOrWorkflow[] = [];\n  let outputProcessors: OutputProcessorOrWorkflow[] = [];\n  let errorProcessors: ErrorProcessorOrWorkflow[] = [];\n\n  try {\n    inputProcessors = await typedAgent.listInputProcessors(requestContext);\n    // Uncombined processors for processLLMRequest — combined (workflow-wrapped)\n    // processors are skipped by ProcessorRunner.runProcessLLMRequest.\n    llmRequestInputProcessors = await typedAgent.__listLLMRequestProcessors(requestContext);\n    // Call-time outputProcessors replace constructor-level ones (parity with\n    // Agent.listResolvedOutputProcessors which uses overrides-first semantics).\n    outputProcessors = execOptions?.outputProcessors\n      ? execOptions.outputProcessors\n      : await typedAgent.listOutputProcessors(requestContext);\n    errorProcessors = await typedAgent.listErrorProcessors(requestContext);\n  } catch (error) {\n    logger?.warn?.(`[DurableAgent] Error resolving processors: ${error}`);\n  }\n\n  // Open AGENT_RUN here so processor_run spans (and their MEMORY_OPERATION\n  // children) parent to it. MODEL_GENERATION is opened later under it.\n  //\n  // Mirrors non-durable Agent.stream(): forward attributes (conversationId,\n  // resolved instructions string, resolvedVersionId), metadata (entityVersionId),\n  // and the agent-level tracingPolicy so durable runs land in the same span\n  // shape as in-process runs.\n  const rawConfig = typeof (agent as any).toRawConfig === 'function' ? (agent as any).toRawConfig() : undefined;\n  const resolvedVersionId = rawConfig?.resolvedVersionId as string | undefined;\n  const agentTracingPolicy =\n    typeof (agent as any).getTracingPolicy === 'function' ? (agent as any).getTracingPolicy() : undefined;\n  const agentSpan = getOrCreateSpan({\n    type: SpanType.AGENT_RUN,\n    name: `agent run: '${agent.id}'`,\n    entityType: EntityType.AGENT,\n    entityId: agent.id,\n    entityName: agent.name,\n    input: messages,\n    attributes: {\n      conversationId: threadId,\n      instructions: convertInstructionsToString(instructions),\n      // @deprecated — use entityVersionId (top-level span context field) instead.\n      // Kept for backward compatibility during migration.\n      ...(resolvedVersionId ? { resolvedVersionId } : {}),\n    },\n    metadata: {\n      runId,\n      resourceId,\n      threadId,\n      ...(resolvedVersionId ? { entityVersionId: resolvedVersionId } : {}),\n    },\n    tracingPolicy: agentTracingPolicy,\n    tracingContext: execOptions?.tracingContext,\n    tracingOptions: execOptions?.tracingOptions,\n    requestContext,\n    mastra,\n  });\n\n  // Run processInput (once, before execution) if we have any processors.\n  // The MastraMemory context (thread + memoryConfig) was already established\n  // above, before processor resolution, so processors that need it (working\n  // memory, OM, message history) can access it here.\n  let tripwireData: RunRegistryEntry['tripwire'];\n  if (inputProcessors.length > 0) {\n    try {\n      const { ProcessorRunner } = await import('../../processors/runner');\n      const runner = new ProcessorRunner({\n        inputProcessors,\n        outputProcessors,\n        errorProcessors,\n        logger: logger as any,\n        agentName: agent.name,\n        processorStates,\n      });\n      await runner.runInputProcessors(\n        messageList,\n        createObservabilityContext({ currentSpan: agentSpan }),\n        requestContext,\n        0,\n      );\n    } catch (error) {\n      if (error instanceof TripWire) {\n        tripwireData = {\n          reason: error.message,\n          retry: error.options?.retry,\n          metadata: error.options?.metadata,\n          processorId: error.processorId,\n        };\n        logger?.warn?.('Input processor tripwire triggered', {\n          agent: agent.name,\n          reason: error.message,\n          processorId: error.processorId,\n          retry: error.options?.retry,\n        });\n      } else {\n        logger?.warn?.(`[DurableAgent] Error running input processors: ${error}`);\n      }\n    }\n  }\n\n  // 7. Convert tools to CoreTool format for execution\n  let tools: Record<string, CoreTool> = {};\n  try {\n    tools = await typedAgent.getToolsForExecution({\n      toolsets: execOptions?.toolsets,\n      clientTools: execOptions?.clientTools,\n      threadId,\n      resourceId,\n      runId,\n      requestContext,\n      memoryConfig: execOptions?.memory?.options,\n      autoResumeSuspendedTools: execOptions?.autoResumeSuspendedTools,\n      hooks: execOptions?.hooks,\n      delegation: execOptions?.delegation,\n      methodType,\n    });\n  } catch (error) {\n    logger?.warn?.(`[DurableAgent] Error converting tools: ${error}`);\n  }\n\n  // 8. Get model (and model list if configured)\n  const model = await typedAgent.getModel({ requestContext });\n  if (!model) {\n    throw new Error('Agent model not available');\n  }\n\n  const modelList = await typedAgent.getModelList(requestContext);\n\n  // 8b. Get scorers configuration\n  const overrideScorers = (execOptions as any)?.scorers;\n  let scorers: Record<string, { scorer: any; sampling?: any }> | undefined;\n\n  if (overrideScorers) {\n    scorers = overrideScorers;\n  } else {\n    try {\n      const agentScorers = await typedAgent.listScorers({ requestContext });\n      if (agentScorers && Object.keys(agentScorers).length > 0) {\n        scorers = agentScorers;\n      }\n    } catch (error) {\n      logger?.debug?.(`[DurableAgent] Error getting scorers: ${error}`);\n    }\n  }\n\n  // 9. Create SaveQueueManager (memory + memoryConfig were resolved in step 6)\n  const saveQueueManager = memory\n    ? new SaveQueueManager({\n        logger,\n        memory,\n      })\n    : undefined;\n\n  // 10. Serialize structured output if provided\n  let serializedStructuredOutput: SerializableStructuredOutput | undefined;\n  if (execOptions?.structuredOutput) {\n    const so = execOptions.structuredOutput as any;\n    if (so.schema) {\n      serializedStructuredOutput = {\n        jsonPromptInjection: so.jsonPromptInjection,\n        useAgent: so.useAgent,\n      };\n      // Convert Zod schema to JSON Schema if possible\n      if (typeof so.schema === 'object' && 'type' in so.schema) {\n        serializedStructuredOutput.schema = so.schema;\n      } else if (typeof so.schema === 'object' && 'jsonSchema' in so.schema) {\n        serializedStructuredOutput.schema = so.schema.jsonSchema;\n      }\n    }\n  }\n\n  // 11. Get background task config. When the caller opts out with\n  // `disableBackgroundTasks: true`, drop the manager so the registry entry\n  // signals \"no background tasks for this run\" to the check step.\n  const backgroundTasksConfig = typedAgent.getBackgroundTasksConfig?.();\n  const backgroundTaskManager = execOptions?.disableBackgroundTasks ? undefined : mastra?.backgroundTaskManager;\n\n  // Resolve tool payload transform policy with the same precedence the\n  // non-durable Agent uses: per-call > agent-level > mastra-level. The\n  // resolved policy carries a closure, so it lives on the run registry; the\n  // JSON-safe `targets` shadow is serialized into workflow input below.\n  const toolPayloadTransform =\n    normalizeToolPayloadTransformPolicy(execOptions?.transform) ??\n    typedAgent.getToolPayloadTransform?.() ??\n    normalizeToolPayloadTransformPolicy(\n      mastra?.getToolPayloadTransform?.() ?? (mastra as any)?.getToolPayloadProjection?.(),\n    );\n\n  // 12. Resolve memory persistence flags\n  const savePerStep = execOptions?.savePerStep;\n  const observationalMemory = !!memoryConfig?.observationalMemory;\n\n  // 12b. Open MODEL_GENERATION under the AGENT_RUN opened in step 6, and export both\n  // into the workflow input so each durable step can rebuild them. No-ops when\n  // observability is off.\n  const modelSpan = agentSpan?.createChildSpan({\n    type: SpanType.MODEL_GENERATION,\n    name: `llm: '${model.modelId}'`,\n    attributes: {\n      model: model.modelId,\n      provider: model.provider,\n      streaming: true,\n    },\n    metadata: {\n      runId,\n      threadId,\n      resourceId,\n    },\n    requestContext,\n  });\n\n  // 13. Create serialized workflow input\n  const workflowInput = createWorkflowInput({\n    runId,\n    agentId: agent.id,\n    agentName: agent.name,\n    messageList,\n    tools,\n    model,\n    modelList: modelList ?? undefined,\n    scorers,\n    options: {\n      maxSteps: execOptions?.maxSteps,\n      toolChoice: execOptions?.toolChoice as any,\n      activeTools: execOptions?.activeTools,\n      modelSettings: execOptions?.modelSettings as any,\n      // Function-form approval policies are closures that can't ride on the\n      // serialized workflow input — the live closure is parked on the run\n      // registry below. This boolean shadow is the cross-process fallback:\n      // function policies degrade to \"require approval for every tool call\"\n      // when the registry slot is unavailable (e.g. Inngest after a worker\n      // restart), which is the safe default.\n      requireToolApproval:\n        typeof execOptions?.requireToolApproval === 'function' ? true : execOptions?.requireToolApproval,\n      toolCallConcurrency: execOptions?.toolCallConcurrency,\n      autoResumeSuspendedTools: execOptions?.autoResumeSuspendedTools,\n      maxProcessorRetries: execOptions?.maxProcessorRetries,\n      includeRawChunks: execOptions?.includeRawChunks,\n      returnScorerData: (execOptions as any)?.returnScorerData,\n      hasErrorProcessors: errorProcessors.length > 0,\n      providerOptions: execOptions?.providerOptions,\n      structuredOutput: serializedStructuredOutput,\n      skipBgTaskWait: (execOptions as any)?._skipBgTaskWait,\n      disableBackgroundTasks: execOptions?.disableBackgroundTasks,\n      tracingOptions: execOptions?.tracingOptions,\n      actor: execOptions?.actor,\n      instructionsOverride: execOptions?.instructions,\n      systemMessage: execOptions?.system,\n      transform: toolPayloadTransform?.targets ? { targets: toolPayloadTransform.targets } : undefined,\n      isTaskComplete: execOptions?.isTaskComplete\n        ? {\n            scorerNames: execOptions.isTaskComplete.scorers?.map(s => s.name).filter((n): n is string => !!n),\n            strategy: execOptions.isTaskComplete.strategy,\n            timeout: execOptions.isTaskComplete.timeout,\n            parallel: execOptions.isTaskComplete.parallel,\n            suppressFeedback: execOptions.isTaskComplete.suppressFeedback,\n          }\n        : undefined,\n    },\n    state: {\n      memoryConfig,\n      threadId,\n      resourceId,\n      threadExists,\n      savePerStep,\n      observationalMemory,\n    },\n    messageId,\n    agentSpanData: agentSpan?.exportSpan(),\n    modelSpanData: modelSpan?.exportSpan(),\n    requestContextEntries: requestContextEntriesSnapshot,\n  });\n\n  // 14. Create registry entry for non-serializable state\n  const registryEntry: RunRegistryEntry = {\n    tools,\n    saveQueueManager,\n    memory,\n    model,\n    modelList: modelList\n      ? modelList.map((entry: AgentModelManagerConfig) => ({\n          id: entry.id,\n          model: entry.model,\n          maxRetries: entry.maxRetries ?? 0,\n          enabled: entry.enabled ?? true,\n          headers: entry.headers,\n        }))\n      : undefined,\n    workspace,\n    requestContext,\n    inputProcessors,\n    llmRequestInputProcessors,\n    outputProcessors,\n    errorProcessors,\n    processorStates,\n    backgroundTaskManager,\n    backgroundTasksConfig,\n    agentSpan,\n    modelSpan,\n    // Park the stopWhen predicate(s) on the registry so the durable agentic\n    // loop can evaluate them on each iteration. The predicate is a closure and\n    // cannot ride on the serialized workflow input; in-process engines read it\n    // back via globalRunRegistry, cross-process engines degrade to maxSteps.\n    stopWhen: execOptions?.stopWhen,\n    onIterationComplete: execOptions?.onIterationComplete,\n    prepareStep: execOptions?.prepareStep,\n    toolPayloadTransform,\n    isTaskComplete: execOptions?.isTaskComplete,\n    // Park the per-call requireToolApproval policy on the registry so the\n    // durable tool-call step can evaluate function-form policies with the\n    // real (toolName, args) on each call. The boolean shadow on the\n    // serialized workflow input is the cross-process fallback.\n    requireToolApproval: execOptions?.requireToolApproval,\n    // Signal drain — the closure reads from AgentThreadStreamRuntime's queues.\n    // Non-serializable; cross-process engines lose it and signals go undelivered.\n    drainPendingSignals: scope => typedAgent.__getDrainPendingSignals()(runId, scope),\n    // Signal messages already in the messageList at run start (from persisted\n    // history). Echoed as data-signal parts on the first LLM step so the client\n    // sees them without refetching. Spliced once, never re-emitted.\n    initialSignalEchoes: getInitialSignalEchoes(messageList),\n    // Agent-level goal config (judge resolver, tools resolver, scorer).\n    // Non-serializable — cross-process engines skip goal evaluation.\n    goal: agent.__getGoalConfig(),\n    // Tripwire from processInput (initial input processing). When an input\n    // processor calls abort() during runInputProcessors, we store the tripwire\n    // data here so the first llm-execution step can emit a tripwire chunk and\n    // bail immediately without calling the model.\n    tripwire: tripwireData,\n    // Call-time headers from modelSettings.headers. Kept off the serialized\n    // workflow input so they never reach durable storage; the durable\n    // llm-execution step reads them from this registry slot instead.\n    callTimeHeaders: extractCallTimeHeaders(execOptions?.modelSettings),\n    // Call-time structured output config with the live schema. The schema is\n    // non-serializable (Zod / standard-schema instance), so it lives on the\n    // in-process registry. The durable stream adapter reads it to pipe LLM\n    // text through `createObjectStreamTransformer`, producing `object-result`\n    // chunks. Cross-process engines lose this slot and structured output\n    // degrades to raw text.\n    structuredOutput: execOptions?.structuredOutput?.schema\n      ? {\n          ...execOptions.structuredOutput,\n          schema: toStandardSchema(execOptions.structuredOutput.schema),\n        }\n      : undefined,\n    cleanup: () => {},\n  };\n\n  return {\n    runId,\n    messageId,\n    workflowInput,\n    registryEntry,\n    messageList,\n    threadId,\n    resourceId,\n  };\n}\n\n/**\n * Extract string-valued headers from `modelSettings.headers` for storage on the\n * in-process `RunRegistryEntry`. Returns `undefined` when no valid headers are\n * present so the registry slot stays empty rather than carrying an empty object.\n */\nfunction extractCallTimeHeaders(\n  modelSettings: Record<string, unknown> | undefined,\n): Record<string, string> | undefined {\n  const raw = (modelSettings as Record<string, unknown> | undefined)?.headers;\n  if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined;\n\n  const headers: Record<string, string> = {};\n  for (const [key, value] of Object.entries(raw as Record<string, unknown>)) {\n    if (typeof value === 'string') headers[key] = value;\n  }\n  return Object.keys(headers).length > 0 ? headers : undefined;\n}\n","import { TTLCache } from '@isaacs/ttlcache';\nimport type { MastraLanguageModel } from '../../llm/model/shared.types';\nimport type { CoreTool } from '../../tools/types';\nimport type { MessageList } from '../message-list';\nimport type { SaveQueueManager } from '../save-queue';\nimport type { RunRegistryEntry } from './types';\n\n/**\n * Global registry for accessing run entries from workflow steps.\n * This is necessary because workflow steps don't have direct access to\n * the DurableAgent instance's registry.\n *\n * Entries are keyed by runId (which are unique UUIDs).\n *\n * Uses TTLCache to prevent unbounded memory growth: entries auto-expire\n * after 10 minutes (refreshed on access) and the registry is hard-capped\n * at 1000 concurrent entries.\n */\nexport const globalRunRegistry = new TTLCache<string, RunRegistryEntry>({\n  max: 1000,\n  ttl: 10 * 60 * 1000,\n  updateAgeOnGet: true,\n  dispose: entry => {\n    entry?.cleanup?.();\n  },\n  noDisposeOnSet: true,\n});\n\n/**\n * End a run's root spans (MODEL_GENERATION then AGENT_RUN) with an error so the trace\n * still exports — stores persist only span-end events. After a resume the fresh resume\n * spans are the active root, so prefer them. Ending an already-ended span is a no-op,\n * so the duplicate error paths (workflow failure + emitError) are safe. Never throws.\n */\nexport function endRunSpansWithError(runId: string, error: Error): void {\n  try {\n    const entry = globalRunRegistry.get(runId);\n    (entry?.resumeModelSpan ?? entry?.modelSpan)?.error({ error, endSpan: true });\n    (entry?.resumeAgentSpan ?? entry?.agentSpan)?.error({ error, endSpan: true });\n  } catch {\n    // Span bookkeeping must never break error reporting.\n  }\n}\n\n/**\n * Registry for per-run non-serializable state.\n *\n * During durable execution, the DurableAgent needs to store non-serializable\n * objects (tools with execute functions, SaveQueueManager, etc.) that can't\n * flow through workflow state. This registry provides a way to store and\n * retrieve these objects keyed by runId.\n *\n * The registry is scoped to a single DurableAgent instance and entries are\n * cleaned up when a run completes.\n */\nexport class RunRegistry {\n  #entries = new Map<string, RunRegistryEntry>();\n\n  /**\n   * Register non-serializable state for a run\n   * @param runId - The unique run identifier\n   * @param entry - The registry entry containing tools, saveQueueManager, etc.\n   */\n  register(runId: string, entry: RunRegistryEntry): void {\n    // Clean up any existing entry first\n    this.cleanup(runId);\n    this.#entries.set(runId, entry);\n  }\n\n  /**\n   * Get the registry entry for a run\n   * @param runId - The unique run identifier\n   * @returns The registry entry or undefined if not found\n   */\n  get(runId: string): RunRegistryEntry | undefined {\n    return this.#entries.get(runId);\n  }\n\n  /**\n   * Get tools for a specific run\n   * @param runId - The unique run identifier\n   * @returns The tools record or an empty object if not found\n   */\n  getTools(runId: string): Record<string, CoreTool> {\n    return this.#entries.get(runId)?.tools ?? {};\n  }\n\n  /**\n   * Get SaveQueueManager for a specific run\n   * @param runId - The unique run identifier\n   * @returns The SaveQueueManager or undefined if not found\n   */\n  getSaveQueueManager(runId: string): SaveQueueManager | undefined {\n    return this.#entries.get(runId)?.saveQueueManager;\n  }\n\n  /**\n   * Get the language model for a specific run\n   * @param runId - The unique run identifier\n   * @returns The MastraLanguageModel or undefined if not found\n   */\n  getModel(runId: string): MastraLanguageModel | undefined {\n    return this.#entries.get(runId)?.model;\n  }\n\n  /**\n   * Check if a run is registered\n   * @param runId - The unique run identifier\n   * @returns True if the run is registered\n   */\n  has(runId: string): boolean {\n    return this.#entries.has(runId);\n  }\n\n  /**\n   * Cleanup and remove a run's entry from the registry\n   * @param runId - The unique run identifier\n   */\n  cleanup(runId: string): void {\n    const entry = this.#entries.get(runId);\n    if (entry) {\n      // Call cleanup function if provided\n      entry.cleanup?.();\n      this.#entries.delete(runId);\n    }\n  }\n\n  /**\n   * Get the number of active runs in the registry\n   */\n  get size(): number {\n    return this.#entries.size;\n  }\n\n  /**\n   * Get all active run IDs\n   */\n  get runIds(): string[] {\n    return Array.from(this.#entries.keys());\n  }\n\n  /**\n   * Clear all entries from the registry\n   * Calls cleanup on each entry before removing\n   */\n  clear(): void {\n    for (const runId of this.#entries.keys()) {\n      this.cleanup(runId);\n    }\n  }\n}\n\n/**\n * Extended registry entry that also stores the MessageList reference.\n * This is useful for accessing message state outside of workflow steps\n * (e.g., for callbacks that need to read messages).\n */\nexport interface ExtendedRunRegistryEntry extends RunRegistryEntry {\n  /** MessageList reference for callback access */\n  messageList?: MessageList;\n  /** Thread ID for memory */\n  threadId?: string;\n  /** Resource ID for memory */\n  resourceId?: string;\n}\n\n/**\n * Extended run registry that also stores MessageList references and memory info\n */\nexport class ExtendedRunRegistry extends RunRegistry {\n  #messageLists = new Map<string, MessageList>();\n  #memoryInfo = new Map<string, { threadId?: string; resourceId?: string }>();\n\n  /**\n   * Register non-serializable state for a run including MessageList\n   */\n  registerWithMessageList(\n    runId: string,\n    entry: RunRegistryEntry,\n    messageList: MessageList,\n    memoryInfo?: { threadId?: string; resourceId?: string },\n  ): void {\n    this.register(runId, entry);\n    this.#messageLists.set(runId, messageList);\n    if (memoryInfo) {\n      this.#memoryInfo.set(runId, memoryInfo);\n    }\n  }\n\n  /**\n   * Get MessageList for a specific run\n   */\n  getMessageList(runId: string): MessageList | undefined {\n    return this.#messageLists.get(runId);\n  }\n\n  /**\n   * Get memory info for a specific run\n   */\n  getMemoryInfo(runId: string): { threadId?: string; resourceId?: string } | undefined {\n    return this.#memoryInfo.get(runId);\n  }\n\n  /**\n   * Override cleanup to also remove MessageList and memory info\n   */\n  override cleanup(runId: string): void {\n    super.cleanup(runId);\n    this.#messageLists.delete(runId);\n    this.#memoryInfo.delete(runId);\n  }\n\n  /**\n   * Override clear to also clear MessageLists and memory info\n   */\n  override clear(): void {\n    super.clear();\n    this.#messageLists.clear();\n    this.#memoryInfo.clear();\n  }\n}\n","import { ReadableStream } from 'node:stream/web';\nimport type { PubSub } from '../../events/pubsub';\nimport type { Event } from '../../events/types';\nimport type { IMastraLogger } from '../../logger';\nimport type { OutputProcessorOrWorkflow } from '../../processors';\nimport { safeClose, safeEnqueue } from '../../stream/base';\nimport { MastraModelOutput } from '../../stream/base/output';\nimport type {\n  ChunkType,\n  MastraOnFinishCallback,\n  MastraOnStepFinishCallback,\n  LanguageModelUsage,\n} from '../../stream/types';\nimport { MessageList } from '../message-list';\nimport type { StructuredOutputOptions } from '../types';\nimport { AGENT_STREAM_TOPIC, AgentStreamEventTypes } from './constants';\nimport type {\n  AgentStreamEvent,\n  AgentChunkEventData,\n  AgentStepFinishEventData,\n  AgentFinishEventData,\n  AgentErrorEventData,\n  AgentSuspendedEventData,\n  AgentAbortEventData,\n  AgentIterationCompleteEventData,\n} from './types';\n\n/**\n * Map workflow usage (which may use legacy promptTokens/completionTokens) to\n * the canonical LanguageModelUsage shape (inputTokens/outputTokens).\n */\nfunction normalizeUsage(raw?: Record<string, unknown>): LanguageModelUsage {\n  if (!raw) {\n    return { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n  }\n  const inputTokens = (raw.inputTokens as number) ?? (raw.promptTokens as number) ?? 0;\n  const outputTokens = (raw.outputTokens as number) ?? (raw.completionTokens as number) ?? 0;\n  const totalTokens = (raw.totalTokens as number) ?? inputTokens + outputTokens;\n  return { inputTokens, outputTokens, totalTokens };\n}\n\n/**\n * Options for creating a durable agent stream\n */\nexport interface DurableAgentStreamOptions<OUTPUT = undefined> {\n  /** Pubsub instance to subscribe to */\n  pubsub: PubSub;\n  /** Run identifier */\n  runId: string;\n  /** Message ID for this execution */\n  messageId: string;\n  /** Model information for the output */\n  model: {\n    modelId: string | undefined;\n    provider: string | undefined;\n    version: 'v2' | 'v3' | 'v4';\n  };\n  /** Thread ID for memory */\n  threadId?: string;\n  /** Resource ID for memory */\n  resourceId?: string;\n  /**\n   * Start replay from this index (0-based).\n   * If undefined, uses full replay (subscribeWithReplay).\n   * If specified, uses efficient indexed replay (subscribeFromOffset).\n   */\n  offset?: number;\n  /** Callback when chunk is received */\n  onChunk?: (chunk: ChunkType<OUTPUT>) => void | Promise<void>;\n  /** Callback when step finishes */\n  onStepFinish?: (result: AgentStepFinishEventData) => void | Promise<void>;\n  /** Callback when execution finishes — routed through MastraModelOutput for rich step data */\n  onFinish?: MastraOnFinishCallback<OUTPUT>;\n  /** Lifecycle hook called after the FINISH event closes the stream (for cleanup scheduling) */\n  onStreamFinished?: () => void | Promise<void>;\n  /** Callback on error */\n  onError?: ({ error }: { error: Error | string }) => void | Promise<void>;\n  /** Callback when workflow suspends */\n  onSuspended?: (data: AgentSuspendedEventData) => void | Promise<void>;\n  /** Callback when execution is aborted via abortSignal */\n  onAbort?: (data: AgentAbortEventData) => void | Promise<void>;\n  /** Callback fired after each agentic-loop iteration */\n  onIterationComplete?: (data: AgentIterationCompleteEventData) => void | Promise<void>;\n  /** Optional logger for structured logging */\n  logger?: IMastraLogger;\n  /**\n   * If true, close the underlying ReadableStream when a SUSPENDED event is\n   * received. Used by `generate()` / `resumeGenerate()` so that\n   * `getFullOutput()` resolves on suspend instead of hanging. Streaming\n   * callers leave this `false` so the stream stays open for a later resume.\n   */\n  closeOnSuspend?: boolean;\n  /**\n   * Structured output configuration with live schema. When provided,\n   * `MastraModelOutput` pipes LLM text through `createObjectStreamTransformer`\n   * to produce `object-result` chunks.\n   */\n  structuredOutput?: StructuredOutputOptions<OUTPUT>;\n  /** Output processors to run in MastraModelOutput's stream pipeline */\n  outputProcessors?: OutputProcessorOrWorkflow[];\n  /**\n   * Optional external MessageList to use instead of creating a fresh empty one.\n   * When provided (e.g. the registry's live MessageList), MastraModelOutput can\n   * resolve step content from messages added during the workflow execution.\n   */\n  messageList?: MessageList;\n}\n\n/**\n * Result from creating a durable agent stream\n */\nexport interface DurableAgentStreamResult<OUTPUT = undefined> {\n  /** The MastraModelOutput that streams from pubsub events */\n  output: MastraModelOutput<OUTPUT>;\n  /** Cleanup function to unsubscribe from pubsub */\n  cleanup: () => void;\n  /** Promise that resolves when subscription is established */\n  ready: Promise<void>;\n}\n\n/**\n * Create a MastraModelOutput that streams from pubsub events.\n *\n * This adapter subscribes to the agent stream pubsub channel and converts\n * pubsub events into a ReadableStream that MastraModelOutput can consume.\n * Callbacks are invoked as events arrive.\n */\nexport function createDurableAgentStream<OUTPUT = undefined>(\n  options: DurableAgentStreamOptions<OUTPUT>,\n): DurableAgentStreamResult<OUTPUT> {\n  const {\n    pubsub,\n    runId,\n    messageId,\n    model,\n    threadId,\n    resourceId,\n    offset,\n    onChunk,\n    onStepFinish,\n    onFinish,\n    onStreamFinished,\n    onError,\n    onSuspended,\n    onAbort,\n    onIterationComplete,\n    logger,\n    closeOnSuspend = false,\n    structuredOutput,\n    outputProcessors,\n    messageList: externalMessageList,\n  } = options;\n\n  // Helper to log errors (uses logger if available, falls back to console)\n  const logError = (message: string, error: unknown) => {\n    if (logger) {\n      logger.error(message, error);\n    } else {\n      console.error(message, error);\n    }\n  };\n\n  // Use an external MessageList if provided (e.g. the live registry one that\n  // llm-execution.ts keeps in sync), otherwise create a fresh empty one.\n  // This lets MastraModelOutput resolve step content from the real assistant\n  // messages added during the workflow execution.\n  const messageList =\n    externalMessageList ??\n    new MessageList({\n      threadId,\n      resourceId,\n    });\n\n  // Track subscription state\n  let isSubscribed = false;\n  let cancelled = false;\n  let controller: ReadableStreamDefaultController<ChunkType<OUTPUT>> | null = null;\n\n  // Promise that resolves when subscription is established\n  let resolveReady: () => void;\n  let rejectReady: (error: Error) => void;\n  const ready = new Promise<void>((resolve, reject) => {\n    resolveReady = resolve;\n    rejectReady = reject;\n  });\n\n  // Handler for pubsub events.\n  //\n  // All `controller.enqueue` / `controller.close` / `controller.error` calls\n  // are wrapped in safe* helpers because pubsub events can arrive AFTER the\n  // stream has already been closed (e.g. a stale background-task lifecycle\n  // event published after the agent's FINISH chunk closed the controller).\n  // Without the guards, those late events surface as\n  // `TypeError: Invalid state: Controller is already closed` from the\n  // controller, which the outer try/catch logs but which floods the\n  // console and (in test runs) causes timeouts as event handlers retry.\n  // Track the last error message seen in an 'error' chunk, so we can\n  // surface it in onError when the FINISH event arrives with reason 'error'.\n  let lastErrorMessage: string | undefined;\n\n  const handleEvent = async (event: Event) => {\n    if (!controller) return;\n\n    // Parse the event data as AgentStreamEvent\n    const streamEvent = event as unknown as AgentStreamEvent;\n\n    try {\n      switch (streamEvent.type) {\n        case AgentStreamEventTypes.CHUNK: {\n          const chunk = streamEvent.data as AgentChunkEventData;\n          // Track error chunks for onError callback\n          if ((chunk as any).type === 'error') {\n            const errPayload = (chunk as any).payload;\n            lastErrorMessage = errPayload?.error?.message || errPayload?.message || 'LLM execution error';\n          }\n          safeEnqueue(controller, chunk as ChunkType<OUTPUT>);\n          await onChunk?.(chunk as ChunkType<OUTPUT>);\n          break;\n        }\n\n        case AgentStreamEventTypes.STEP_START: {\n          // Step start - enqueue if it's a chunk type\n          const chunk = streamEvent.data as ChunkType<OUTPUT>;\n          if (chunk && 'type' in chunk) {\n            safeEnqueue(controller, chunk);\n          }\n          break;\n        }\n\n        case AgentStreamEventTypes.STEP_FINISH: {\n          const data = streamEvent.data as AgentStepFinishEventData;\n          await onStepFinish?.(data);\n          break;\n        }\n\n        case AgentStreamEventTypes.FINISH: {\n          const data = streamEvent.data as AgentFinishEventData;\n          // Enqueue finish chunk and close stream even if callback throws\n          const finishChunk = {\n            type: 'finish' as const,\n            payload: {\n              output: data.output,\n              stepResult: data.stepResult,\n            },\n          } as ChunkType<OUTPUT>;\n          safeEnqueue(controller, finishChunk);\n          safeClose(controller);\n\n          // Build rich onFinish payload from finish event data.\n          // The pubsub FINISH event carries output.text, output.steps, and\n          // stepResult — enough to reconstruct the fields scenario tests expect\n          // (text, steps, toolResults, finishReason, usage).\n          if (onFinish) {\n            try {\n              const steps = (data.output?.steps ?? []) as any[];\n              const allToolResults = steps.flatMap((s: any) => s?.toolResults ?? []);\n              const allToolCalls = steps.flatMap((s: any) => s?.toolCalls ?? []);\n              await onFinish({\n                text: data.output?.text ?? '',\n                steps,\n                toolResults: allToolResults,\n                toolCalls: allToolCalls,\n                dynamicToolCalls: [],\n                dynamicToolResults: [],\n                staticToolCalls: [],\n                staticToolResults: [],\n                files: [],\n                sources: [],\n                reasoning: [],\n                content: [],\n                finishReason: data.stepResult?.reason ?? 'stop',\n                usage: normalizeUsage(data.output?.usage),\n                totalUsage: normalizeUsage(data.output?.usage),\n                warnings: data.stepResult?.warnings ?? [],\n                request: { body: undefined },\n                response: {},\n                reasoningText: undefined,\n                providerMetadata: undefined,\n              });\n            } catch (callbackError) {\n              logError(`[DurableAgentStream] onFinish callback error:`, callbackError);\n            }\n          }\n\n          // When the finish reason is 'error', also fire onError so\n          // consumers see it — the error was handled gracefully (bail\n          // response) rather than crashing the workflow, so the ERROR\n          // event never fires.\n          if (onError && data.stepResult?.reason === 'error') {\n            try {\n              await onError({ error: new Error(lastErrorMessage || 'LLM execution error') });\n            } catch (callbackError) {\n              logError(`[DurableAgentStream] onError (from FINISH) callback error:`, callbackError);\n            }\n          }\n\n          try {\n            await onStreamFinished?.();\n          } catch (callbackError) {\n            logError(`[DurableAgentStream] onStreamFinished callback error:`, callbackError);\n          }\n          break;\n        }\n\n        case AgentStreamEventTypes.ERROR: {\n          const data = streamEvent.data as AgentErrorEventData;\n          const error = new Error(data.error.message);\n          error.name = data.error.name;\n          if (data.error.stack) {\n            error.stack = data.error.stack;\n          }\n          // Enqueue an error chunk and close the stream normally (mirrors the\n          // regular agent's deferred-error-chunk pattern). Using\n          // controller.error() would error the base ReadableStream, which\n          // MastraModelOutput.consumeStream swallows — leaving fullStream\n          // hanging because no 'finish' event fires on the internal emitter.\n          safeEnqueue(controller, {\n            type: 'error',\n            payload: { error },\n          } as ChunkType<OUTPUT>);\n          safeClose(controller);\n          try {\n            await onError?.({ error });\n          } catch (callbackError) {\n            logError(`[DurableAgentStream] onError callback error:`, callbackError);\n          }\n          break;\n        }\n\n        case AgentStreamEventTypes.SUSPENDED: {\n          const data = streamEvent.data as AgentSuspendedEventData;\n          await onSuspended?.(data);\n          // By default we leave the stream open on suspend so a later resume\n          // can keep streaming chunks. `generate()`/`resumeGenerate()` opt\n          // into closing here so `getFullOutput()` can resolve.\n          if (closeOnSuspend) {\n            safeClose(controller);\n          }\n          break;\n        }\n\n        case AgentStreamEventTypes.ABORT: {\n          const data = streamEvent.data as AgentAbortEventData;\n          try {\n            await onAbort?.(data);\n          } catch (callbackError) {\n            logError(`[DurableAgentStream] onAbort callback error:`, callbackError);\n          }\n          // Abort closes the stream — the run will not continue.\n          safeClose(controller);\n          break;\n        }\n\n        case AgentStreamEventTypes.ITERATION_COMPLETE: {\n          const data = streamEvent.data as AgentIterationCompleteEventData;\n          try {\n            await onIterationComplete?.(data);\n          } catch (callbackError) {\n            logError(`[DurableAgentStream] onIterationComplete callback error:`, callbackError);\n          }\n          break;\n        }\n\n        default:\n          // Unknown event type - ignore\n          break;\n      }\n    } catch (error) {\n      // Intentional catch-and-continue: callback errors (onChunk, onStepFinish,\n      // onSuspended) must not kill the stream. onFinish/onError have their own\n      // inner try/catch and close/error the stream before invoking callbacks,\n      // so they are not affected by this outer handler.\n      logError(`[DurableAgentStream] Error handling event ${streamEvent.type}:`, error);\n    }\n  };\n\n  // Create the readable stream\n  const stream = new ReadableStream<ChunkType<OUTPUT>>({\n    start(ctrl) {\n      controller = ctrl;\n\n      // Subscribe to pubsub with replay support for resumable streams\n      // If offset is specified, use indexed replay for efficiency\n      // Otherwise use full replay\n      const topic = AGENT_STREAM_TOPIC(runId);\n      const subscribePromise =\n        offset !== undefined\n          ? pubsub.subscribeFromOffset(topic, offset, handleEvent)\n          : pubsub.subscribeWithReplay(topic, handleEvent);\n\n      subscribePromise\n        .then(() => {\n          if (cancelled) {\n            // cleanup() was called before subscribe resolved — unsubscribe now\n            void pubsub.unsubscribe(topic, handleEvent).catch(error => {\n              logError(`[DurableAgentStream] Failed to unsubscribe from ${topic}:`, error);\n            });\n            resolveReady();\n            return;\n          }\n          isSubscribed = true;\n          resolveReady();\n        })\n        .catch(error => {\n          logError(`[DurableAgentStream] Failed to subscribe to ${topic}:`, error);\n          rejectReady(error);\n          ctrl.error(error);\n        });\n    },\n    cancel() {\n      cleanup();\n    },\n  });\n\n  // Cleanup function - intentionally fire-and-forget for unsubscribe.\n  // Sets cancelled=true so the subscribe .then() handler will unsubscribe\n  // if cleanup runs before the subscription promise resolves.\n  const cleanup = () => {\n    cancelled = true;\n    if (isSubscribed) {\n      isSubscribed = false;\n      const topic = AGENT_STREAM_TOPIC(runId);\n      void pubsub.unsubscribe(topic, handleEvent).catch(error => {\n        logError(`[DurableAgentStream] Failed to unsubscribe from ${topic}:`, error);\n      });\n    }\n    controller = null;\n  };\n\n  // Create the MastraModelOutput.\n  // onStepFinish is passed to MastraModelOutput so it fires during stream\n  // consumption (the harness and user code iterate fullStream, which drives\n  // consumeStream internally). The pubsub STEP_FINISH event is not emitted\n  // by the durable workflow, so the pubsub handler alone is not sufficient.\n  //\n  // onFinish is called from the pubsub FINISH handler (above) with a\n  // payload built from the event data. This ensures it fires even when\n  // nobody iterates the stream (e.g. resume flows with delay-only waits).\n  const output = new MastraModelOutput<OUTPUT>({\n    model,\n    stream,\n    messageList,\n    messageId,\n    options: {\n      runId,\n      onStepFinish: onStepFinish as MastraOnStepFinishCallback<OUTPUT> | undefined,\n      // For durable agents there is only one MastraModelOutput for the whole run.\n      // isLLMExecutionStep must be true so output processors run per-chunk\n      // (processOutputStream / processPart path) rather than the batch\n      // runOutputProcessors path which only fires at finish.  It also gates\n      // createObjectStreamTransformer for structured output.\n      // resolveFinalPromises forces text/finishReason promise resolution at\n      // step-finish despite isLLMExecutionStep being true — durable agents have\n      // no outer MastraModelOutput to resolve them.\n      structuredOutput: structuredOutput as any,\n      isLLMExecutionStep: true,\n      resolveFinalPromises: true,\n      outputProcessors,\n    },\n  });\n\n  return {\n    output,\n    cleanup,\n    ready,\n  };\n}\n\n/**\n * Helper to emit a chunk event to pubsub\n */\nexport async function emitChunkEvent<OUTPUT = undefined>(\n  pubsub: PubSub,\n  runId: string,\n  chunk: ChunkType<OUTPUT>,\n): Promise<void> {\n  const topic = AGENT_STREAM_TOPIC(runId);\n  await pubsub.publish(topic, {\n    type: AgentStreamEventTypes.CHUNK,\n    runId,\n    data: chunk,\n  });\n}\n\n/**\n * Helper to emit a step start event to pubsub.\n * The `data` payload must include `type: 'step-start'` so the stream-adapter\n * consumer recognises it as a `ChunkType` and enqueues it onto the client stream.\n */\nexport async function emitStepStartEvent(\n  pubsub: PubSub,\n  runId: string,\n  data: { stepId?: string; request?: unknown; warnings?: unknown[] },\n): Promise<void> {\n  await pubsub.publish(AGENT_STREAM_TOPIC(runId), {\n    type: AgentStreamEventTypes.STEP_START,\n    runId,\n    data: { type: 'step-start', ...data },\n  });\n}\n\n/**\n * Helper to emit a step finish event to pubsub\n */\nexport async function emitStepFinishEvent(\n  pubsub: PubSub,\n  runId: string,\n  data: AgentStepFinishEventData,\n): Promise<void> {\n  await pubsub.publish(AGENT_STREAM_TOPIC(runId), {\n    type: AgentStreamEventTypes.STEP_FINISH,\n    runId,\n    data,\n  });\n}\n\n/**\n * Helper to emit a finish event to pubsub\n */\nexport async function emitFinishEvent(pubsub: PubSub, runId: string, data: AgentFinishEventData): Promise<void> {\n  await pubsub.publish(AGENT_STREAM_TOPIC(runId), {\n    type: AgentStreamEventTypes.FINISH,\n    runId,\n    data,\n  });\n}\n\n/**\n * Helper to emit an error event to pubsub\n */\nexport async function emitErrorEvent(pubsub: PubSub, runId: string, error: Error): Promise<void> {\n  await pubsub.publish(AGENT_STREAM_TOPIC(runId), {\n    type: AgentStreamEventTypes.ERROR,\n    runId,\n    data: {\n      error: {\n        name: error.name,\n        message: error.message,\n        // stack intentionally omitted — avoid leaking internals through external pubsub\n      },\n    },\n  });\n}\n\n/**\n * Helper to emit a suspended event to pubsub\n */\nexport async function emitSuspendedEvent(pubsub: PubSub, runId: string, data: AgentSuspendedEventData): Promise<void> {\n  await pubsub.publish(AGENT_STREAM_TOPIC(runId), {\n    type: AgentStreamEventTypes.SUSPENDED,\n    runId,\n    data,\n  });\n}\n\n/**\n * Helper to emit an abort event to pubsub\n */\nexport async function emitAbortEvent(pubsub: PubSub, runId: string, data: AgentAbortEventData): Promise<void> {\n  await pubsub.publish(AGENT_STREAM_TOPIC(runId), {\n    type: AgentStreamEventTypes.ABORT,\n    runId,\n    data,\n  });\n}\n\n/**\n * Helper to emit an iteration-complete event to pubsub\n */\nexport async function emitIterationCompleteEvent(\n  pubsub: PubSub,\n  runId: string,\n  data: AgentIterationCompleteEventData,\n): Promise<void> {\n  await pubsub.publish(AGENT_STREAM_TOPIC(runId), {\n    type: AgentStreamEventTypes.ITERATION_COMPLETE,\n    runId,\n    data,\n  });\n}\n","import type { RequestContext } from '../../../../request-context';\nimport type { Workspace } from '../../../../workspace';\nimport type { DurableToolCallInput, DurableToolCallOutput } from '../../types';\n\n/**\n * Context for tool execution\n */\nexport interface ToolExecutionContext {\n  /** Tool calls from the LLM output */\n  toolCalls: DurableToolCallInput[];\n  /** Resolved tools with execute functions */\n  tools: Record<string, any>;\n  /** Run identifier */\n  runId: string;\n  /** Agent identifier */\n  agentId: string;\n  /** Message identifier */\n  messageId: string;\n  /** Serializable state */\n  state: any;\n  /** Workspace for file/sandbox operations */\n  workspace?: Workspace;\n  /** Request context for auth data, feature flags, etc. */\n  requestContext?: RequestContext;\n\n  /**\n   * Optional hooks for observability/streaming.\n   * All hooks can be sync or async.\n   */\n\n  /** Called before starting tool execution (for span creation) */\n  onToolStart?: (toolCall: DurableToolCallInput) => void | Promise<void>;\n  /** Called after successful tool execution (for span close, pubsub emit) */\n  onToolResult?: (toolCall: DurableToolCallInput, result: unknown) => void | Promise<void>;\n  /** Called on tool execution error (for span error, pubsub emit) */\n  onToolError?: (toolCall: DurableToolCallInput, error: ToolExecutionError) => void | Promise<void>;\n}\n\n/**\n * Error structure for tool execution failures\n */\nexport interface ToolExecutionError {\n  name: string;\n  message: string;\n  stack?: string;\n}\n\n/**\n * Execute tool calls durably with optional hooks for observability and streaming.\n *\n * This is the shared implementation used by:\n * - Core DurableAgent workflow\n * - Inngest durable agent workflow (with observability hooks)\n * - Evented durable agent workflow\n *\n * @param ctx - Tool execution context with tool calls, resolved tools, and optional hooks\n * @returns Array of tool call outputs with results or errors\n */\nexport async function executeDurableToolCalls(ctx: ToolExecutionContext): Promise<DurableToolCallOutput[]> {\n  const toolResults: DurableToolCallOutput[] = [];\n\n  for (const toolCall of ctx.toolCalls) {\n    // Handle provider-executed tools (e.g., OpenAI function calling with parallel_tool_calls)\n    if (toolCall.providerExecuted && toolCall.output !== undefined) {\n      toolResults.push({\n        ...toolCall,\n        result: toolCall.output,\n      });\n      continue;\n    }\n\n    // Resolve the tool from the tools record\n    const tool = ctx.tools[toolCall.toolName];\n\n    if (!tool) {\n      const error: ToolExecutionError = {\n        name: 'ToolNotFoundError',\n        message: `Tool ${toolCall.toolName} not found`,\n      };\n      await ctx.onToolError?.(toolCall, error);\n      toolResults.push({\n        ...toolCall,\n        error,\n      });\n      continue;\n    }\n\n    // Notify start of tool execution (for observability)\n    await ctx.onToolStart?.(toolCall);\n\n    // Execute the tool\n    try {\n      if (tool.execute) {\n        const result = await tool.execute(toolCall.args, {\n          toolCallId: toolCall.toolCallId,\n          messages: [],\n          workspace: ctx.workspace,\n          requestContext: ctx.requestContext,\n        });\n        await ctx.onToolResult?.(toolCall, result);\n        toolResults.push({\n          ...toolCall,\n          result,\n        });\n      } else {\n        // Tool has no execute function - return undefined result\n        await ctx.onToolResult?.(toolCall, undefined);\n        toolResults.push({\n          ...toolCall,\n          result: undefined,\n        });\n      }\n    } catch (error) {\n      const toolError: ToolExecutionError = {\n        name: 'ToolExecutionError',\n        message: error instanceof Error ? error.message : String(error),\n        stack: error instanceof Error ? error.stack : undefined,\n      };\n      await ctx.onToolError?.(toolCall, toolError);\n      toolResults.push({\n        ...toolCall,\n        error: toolError,\n      });\n    }\n  }\n\n  return toolResults;\n}\n","import { z } from 'zod';\n\n/**\n * Shared Zod schemas for durable agentic workflows.\n *\n * These schemas are used by:\n * - Core DurableAgent workflow\n * - Inngest durable agent workflow\n * - Evented durable agent workflow (future)\n */\n\n/**\n * Schema for model configuration\n */\nexport const modelConfigSchema = z.object({\n  provider: z.string(),\n  modelId: z.string(),\n  specificationVersion: z.string().optional(),\n  settings: z.record(z.string(), z.any()).optional(),\n  providerOptions: z.record(z.string(), z.any()).optional(),\n});\n\n/**\n * Schema for model list entry (fallback support)\n */\nexport const modelListEntrySchema = z.object({\n  id: z.string(),\n  config: z.object({\n    provider: z.string(),\n    modelId: z.string(),\n    specificationVersion: z.string().optional(),\n    originalConfig: z.union([z.string(), z.record(z.string(), z.any())]).optional(),\n    providerOptions: z.record(z.string(), z.any()).optional(),\n  }),\n  maxRetries: z.number(),\n  enabled: z.boolean(),\n});\n\n/**\n * Schema for accumulated usage across iterations\n */\nexport const accumulatedUsageSchema = z.object({\n  inputTokens: z.number(),\n  outputTokens: z.number(),\n  totalTokens: z.number(),\n});\n\n/**\n * Schema for output from the durable agentic workflow\n */\nexport const durableAgenticOutputSchema = z.object({\n  messageListState: z.any(),\n  messageId: z.string(),\n  stepResult: z.any(),\n  output: z.object({\n    text: z.string().optional(),\n    usage: z.any(),\n    steps: z.array(z.any()),\n  }),\n  state: z.any(),\n});\n\n/**\n * Base schema for durable agentic workflow input.\n * Implementations can extend this with additional fields.\n */\nexport const baseDurableAgenticInputSchema = z.object({\n  runId: z.string(),\n  agentId: z.string(),\n  agentName: z.string().optional(),\n  messageListState: z.any(),\n  toolsMetadata: z.array(z.any()),\n  modelConfig: modelConfigSchema,\n  options: z.any(),\n  state: z.any(),\n  messageId: z.string(),\n});\n\n/**\n * Base schema for iteration state.\n * Implementations can extend this with additional fields.\n */\nexport const baseIterationStateSchema = z.object({\n  // Original input fields\n  runId: z.string(),\n  agentId: z.string(),\n  agentName: z.string().optional(),\n  messageListState: z.any(),\n  toolsMetadata: z.array(z.any()),\n  modelConfig: z.any(),\n  options: z.any(),\n  state: z.any(),\n  messageId: z.string(),\n  // Iteration tracking\n  iterationCount: z.number(),\n  accumulatedSteps: z.array(z.any()),\n  accumulatedUsage: accumulatedUsageSchema,\n  // Last step result for continuation check\n  lastStepResult: z.any().optional(),\n  // Background task tracking\n  backgroundTaskPending: z.boolean().optional(),\n  // Set when a delegation hook calls ctx.bail() — signals the loop to stop\n  delegationBailed: z.boolean().optional(),\n  // Set when onIterationComplete returns { continue: false, feedback } — allows\n  // one more LLM turn with the feedback, then stops on the next predicate eval.\n  pendingFeedbackStop: z.boolean().optional(),\n  // Span data, carried unchanged so every iteration shares one trace\n  agentSpanData: z.any().optional(),\n  modelSpanData: z.any().optional(),\n});\n\n/**\n * Type for the base iteration state\n */\nexport type BaseIterationState = z.infer<typeof baseIterationStateSchema>;\n\n/**\n * Type for accumulated usage\n */\nexport type AccumulatedUsage = z.infer<typeof accumulatedUsageSchema>;\n","import type { DurableAgenticExecutionOutput } from '../../types';\nimport type { AccumulatedUsage, BaseIterationState } from './schemas';\n\n/**\n * Input for creating iteration state update\n */\nexport interface IterationStateUpdateInput {\n  /** Current iteration state */\n  currentState: BaseIterationState;\n  /** Output from the current iteration's execution */\n  executionOutput: DurableAgenticExecutionOutput;\n}\n\n/**\n * Step record for tracking iteration history\n */\nexport interface StepRecord {\n  text?: string;\n  toolCalls?: unknown[];\n  toolResults?: unknown[];\n  usage?: unknown;\n  finishReason?: string;\n}\n\n/**\n * Calculate accumulated usage from current state and new execution output.\n */\nexport function calculateAccumulatedUsage(\n  currentUsage: AccumulatedUsage,\n  executionUsage?: { inputTokens?: number; outputTokens?: number; totalTokens?: number },\n): AccumulatedUsage {\n  return {\n    inputTokens: currentUsage.inputTokens + (executionUsage?.inputTokens || 0),\n    outputTokens: currentUsage.outputTokens + (executionUsage?.outputTokens || 0),\n    totalTokens: currentUsage.totalTokens + (executionUsage?.totalTokens || 0),\n  };\n}\n\n/**\n * Build a step record from execution output.\n */\nexport function buildStepRecord(executionOutput: DurableAgenticExecutionOutput): StepRecord {\n  return {\n    text: executionOutput.output.text,\n    toolCalls: executionOutput.output.toolCalls,\n    toolResults: executionOutput.toolResults,\n    usage: executionOutput.output.usage,\n    finishReason: executionOutput.stepResult.reason,\n  };\n}\n\n/**\n * Create the base iteration state update.\n *\n * This returns the common fields for iteration state updates.\n * Implementations can extend this with their specific fields.\n *\n * @example\n * ```typescript\n * const baseUpdate = createBaseIterationStateUpdate({\n *   currentState: initData,\n *   executionOutput,\n * });\n *\n * // Core extends with modelList\n * const coreState = { ...baseUpdate, modelList: initData.modelList };\n *\n * // Inngest extends with observability\n * const inngestState = {\n *   ...baseUpdate,\n *   agentSpanData: initData.agentSpanData,\n *   modelSpanData: initData.modelSpanData,\n *   stepIndex: initData.stepIndex + 1,\n * };\n * ```\n */\nexport function createBaseIterationStateUpdate(input: IterationStateUpdateInput): BaseIterationState {\n  const { currentState, executionOutput } = input;\n\n  const newUsage = calculateAccumulatedUsage(currentState.accumulatedUsage, executionOutput.output.usage);\n  const stepRecord = buildStepRecord(executionOutput);\n\n  return {\n    runId: currentState.runId,\n    agentId: currentState.agentId,\n    agentName: currentState.agentName,\n    messageListState: executionOutput.messageListState,\n    toolsMetadata: currentState.toolsMetadata,\n    modelConfig: currentState.modelConfig,\n    options: currentState.options,\n    state: executionOutput.state,\n    messageId: executionOutput.messageId,\n    iterationCount: currentState.iterationCount + 1,\n    accumulatedSteps: [...currentState.accumulatedSteps, stepRecord],\n    accumulatedUsage: newUsage,\n    lastStepResult: executionOutput.stepResult,\n    backgroundTaskPending: executionOutput.backgroundTaskPending,\n    delegationBailed: executionOutput.delegationBailed,\n    // Preserve the two-phase stop flag set by the dowhile predicate's\n    // onIterationComplete handler.  The predicate mutates state on the\n    // *output* of the previous iteration; createBaseIterationStateUpdate\n    // rebuilds the state for the next iteration, so we must carry the\n    // flag forward explicitly.\n    pendingFeedbackStop: currentState.pendingFeedbackStop,\n    // Carry span identity forward unchanged so every iteration shares one trace.\n    agentSpanData: currentState.agentSpanData,\n    modelSpanData: currentState.modelSpanData,\n  };\n}\n","import { z } from 'zod';\nimport type { PubSub } from '../../../../events/pubsub';\nimport { ChunkFrom } from '../../../../stream/types';\nimport { PUBSUB_SYMBOL } from '../../../../workflows/constants';\nimport { createStep } from '../../../../workflows/workflow';\nimport { DurableStepIds } from '../../constants';\nimport { globalRunRegistry } from '../../run-registry';\nimport { emitChunkEvent } from '../../stream-adapter';\n\nconst BG_CHECK_STEP_ID = `${DurableStepIds.AGENTIC_EXECUTION}-bg-task-check`;\n\n/**\n * The background task check step accepts the output of llmMappingStep\n * and passes it through, adding backgroundTaskPending if tasks are running.\n */\nconst bgCheckInputSchema = z.any();\nconst bgCheckOutputSchema = z.any();\n\n/**\n * Create a durable background task check step.\n *\n * Mirrors the regular agent's backgroundTaskCheckStep pattern:\n * - After tool calls complete, checks if any background tasks are still running\n * - If no running tasks: passes through unchanged\n * - If an explicit waitTimeoutMs is configured and retryCount === 0: returns\n *   immediately with backgroundTaskPending=true (caller drives continuation)\n * - Otherwise: waits for the next task to complete using the configured\n *   waitTimeoutMs or a 1 s default — this keeps the workflow (and its pubsub\n *   subscription) alive so background-task tool-result chunks are delivered\n * - When a task completes: sets isContinued=true so the LLM processes the result\n */\nexport function createDurableBackgroundTaskCheckStep() {\n  return createStep({\n    id: BG_CHECK_STEP_ID,\n    inputSchema: bgCheckInputSchema,\n    outputSchema: bgCheckOutputSchema,\n    execute: async params => {\n      const { inputData, getInitData, retryCount } = params;\n      const pubsub = (params as any)[PUBSUB_SYMBOL] as PubSub | undefined;\n      const typedInput = inputData as Record<string, any>;\n\n      const initData = getInitData<{\n        runId: string;\n        agentId: string;\n        options?: { skipBgTaskWait?: boolean };\n        state?: { threadId?: string; resourceId?: string };\n      }>();\n      const { runId, agentId } = initData;\n\n      const registryEntry = globalRunRegistry.get(runId);\n      const bgManager = registryEntry?.backgroundTaskManager;\n\n      if (!bgManager) {\n        return typedInput;\n      }\n\n      const runningResult = await bgManager.listTasks({\n        agentId,\n        status: 'running',\n        threadId: initData.state?.threadId,\n        resourceId: initData.state?.resourceId,\n      });\n      const runningTasks = runningResult?.tasks;\n\n      if (!runningTasks || runningTasks.length === 0) {\n        return typedInput;\n      }\n\n      // When the outer caller drives continuation externally (e.g. streamUntilIdle),\n      // skip the in-loop wait. We still mark pending so ownstream knows.\n      if (initData.options?.skipBgTaskWait) {\n        return { ...typedInput, backgroundTaskPending: true };\n      }\n\n      const taskIds = runningTasks.map(task => task.id);\n\n      const bgConfig = registryEntry?.backgroundTasksConfig;\n      const managerConfig = bgManager.config;\n      const waitTimeoutMs = bgConfig?.waitTimeoutMs ?? managerConfig?.waitTimeoutMs;\n\n      // The regular agent gates on `retryCount === 0 || !waitTimeoutMs`\n      // and can afford to skip waiting because tool-result chunks from\n      // background tasks are pushed directly into the ReadableStream\n      // controller via safeEnqueue — that works even after this step\n      // returns.\n      //\n      // The durable agent emits tool-result chunks via pubsub.  The\n      // pubsub subscription is torn down when the stream closes and the\n      // consumer calls cleanup().  If this step returns without waiting,\n      // the workflow finishes, FINISH fires, the stream closes, cleanup\n      // runs, and the pubsub subscriber is gone before the background\n      // task can deliver its result.\n      //\n      // Therefore the durable agent must always wait when background\n      // tasks are running — using the configured waitTimeoutMs, or a\n      // sensible 1 s default to keep the workflow (and pubsub) alive.\n\n      // First invocation without explicit waitTimeoutMs — match the\n      // regular agent's \"signal pending, don't block\" on retryCount 0,\n      // but only when the caller provided an explicit timeout (meaning\n      // they'll drive continuation externally).\n      if (retryCount === 0 && waitTimeoutMs) {\n        return { ...typedInput, backgroundTaskPending: true };\n      }\n\n      // Use configured timeout, or default to 1 s so the workflow stays\n      // alive long enough for pubsub to deliver background-task results.\n      const effectiveWaitMs = waitTimeoutMs ?? 1000;\n\n      // Emit initial progress chunk\n      if (pubsub) {\n        try {\n          await emitChunkEvent(pubsub, runId, {\n            type: 'background-task-progress' as any,\n            runId,\n            from: ChunkFrom.AGENT,\n            payload: { taskIds, runningCount: runningTasks.length, elapsedMs: 0 },\n          });\n        } catch {\n          // PubSub may be closed\n        }\n      }\n\n      // Wait for the next task to complete (or until timeout)\n      try {\n        await bgManager.waitForNextTask(taskIds, {\n          timeoutMs: effectiveWaitMs,\n          onProgress: (elapsedMs: number) => {\n            if (!pubsub) return;\n            void emitChunkEvent(pubsub, runId, {\n              type: 'background-task-progress' as any,\n              runId,\n              from: ChunkFrom.AGENT,\n              payload: { taskIds, runningCount: runningTasks.length, elapsedMs },\n            }).catch(() => {});\n          },\n          progressIntervalMs: 3000,\n        });\n      } catch {\n        // Timeout elapsed — no task completed. Return unchanged so the loop can end.\n        // The tasks keep running in the background — results are picked up on\n        // the next user message or stream.\n        return typedInput;\n      }\n\n      // A task completed — force the loop to continue so the LLM processes the result\n      if (typedInput.stepResult) {\n        return {\n          ...typedInput,\n          backgroundTaskPending: true,\n          stepResult: { ...typedInput.stepResult, isContinued: true },\n        };\n      }\n\n      return { ...typedInput, backgroundTaskPending: true };\n    },\n  });\n}\n","import type { IMastraLogger } from '../../../logger';\nimport { transformToolPayloadForTargets, withToolPayloadTransformMetadata } from '../../../tools/payload-transform';\nimport type { CoreTool, ToolPayloadTransformPolicy } from '../../../tools/types';\n\n/**\n * Apply the in-process tool payload transform policy to a chunk before the\n * durable layer publishes it. Mirrors `addToolPayloadTransformToChunk` in the\n * non-durable agentic-execution layer, restricted to the chunk types that the\n * durable loop emits (`tool-call`, `tool-result`, `tool-error`).\n *\n * The transform policy is only available for in-process durable runs (it\n * carries a closure that cannot be serialized into the workflow input). When\n * the policy is missing or the chunk is not tool-shaped, the chunk is\n * returned unchanged.\n */\nexport async function applyToolPayloadTransformToChunk<TChunk extends { type: string; payload?: any }>(\n  chunk: TChunk,\n  opts: {\n    policy?: ToolPayloadTransformPolicy;\n    tools?: Record<string, CoreTool>;\n    logger?: IMastraLogger;\n  },\n): Promise<TChunk> {\n  const { policy, tools, logger } = opts;\n  if (!policy && !tools) {\n    return chunk;\n  }\n\n  const payload = chunk.payload;\n  if (!payload || typeof payload !== 'object') {\n    return chunk;\n  }\n\n  const toolName = (payload as { toolName?: unknown }).toolName;\n  const toolCallId = (payload as { toolCallId?: unknown }).toolCallId;\n  if (typeof toolName !== 'string' || typeof toolCallId !== 'string') {\n    return chunk;\n  }\n\n  const tool = tools?.[toolName];\n  const source = {\n    policy,\n    toolTransform: (tool as { transform?: unknown } | undefined)?.transform as any,\n  };\n\n  let transformedChunk: TChunk = chunk;\n  let transform;\n\n  if (chunk.type === 'tool-call') {\n    transform = await transformToolPayloadForTargets(\n      {\n        phase: 'input-available',\n        toolName,\n        toolCallId,\n        input: (payload as { args?: unknown }).args,\n        providerMetadata: (payload as { providerMetadata?: Record<string, unknown> }).providerMetadata,\n      },\n      source,\n      logger,\n    );\n  } else if (chunk.type === 'tool-result') {\n    transformedChunk = withToolPayloadTransformMetadata(\n      transformedChunk as any,\n      await transformToolPayloadForTargets(\n        {\n          phase: 'input-available',\n          toolName,\n          toolCallId,\n          input: (payload as { args?: unknown }).args,\n          providerMetadata: (payload as { providerMetadata?: Record<string, unknown> }).providerMetadata,\n        },\n        source,\n        logger,\n      ),\n    ) as TChunk;\n    transform = await transformToolPayloadForTargets(\n      {\n        phase: 'output-available',\n        toolName,\n        toolCallId,\n        input: (payload as { args?: unknown }).args,\n        output: (payload as { result?: unknown }).result,\n        providerMetadata: (payload as { providerMetadata?: Record<string, unknown> }).providerMetadata,\n      },\n      source,\n      logger,\n    );\n  } else if (chunk.type === 'tool-error') {\n    transformedChunk = withToolPayloadTransformMetadata(\n      transformedChunk as any,\n      await transformToolPayloadForTargets(\n        {\n          phase: 'input-available',\n          toolName,\n          toolCallId,\n          input: (payload as { args?: unknown }).args,\n          providerMetadata: (payload as { providerMetadata?: Record<string, unknown> }).providerMetadata,\n        },\n        source,\n        logger,\n      ),\n    ) as TChunk;\n    transform = await transformToolPayloadForTargets(\n      {\n        phase: 'error',\n        toolName,\n        toolCallId,\n        input: (payload as { args?: unknown }).args,\n        error: (payload as { error?: unknown }).error,\n        providerMetadata: (payload as { providerMetadata?: Record<string, unknown> }).providerMetadata,\n      },\n      source,\n      logger,\n    );\n  } else {\n    return chunk;\n  }\n\n  return withToolPayloadTransformMetadata(transformedChunk as any, transform) as TChunk;\n}\n","import type { ToolSet } from '@internal/ai-sdk-v5';\nimport { resolveModelConfig } from '../../../llm/model/resolve-model';\nimport type { MastraLanguageModel } from '../../../llm/model/shared.types';\nimport type { StreamInternal } from '../../../loop/types';\nimport type { Mastra } from '../../../mastra';\nimport type { MastraMemory } from '../../../memory/memory';\nimport { RequestContext } from '../../../request-context';\nimport { getNeedsApprovalFn } from '../../../tools/toolchecks';\nimport type { CoreTool, RequireToolApproval, ToolApprovalContext } from '../../../tools/types';\nimport type { Workspace } from '../../../workspace';\nimport { MessageList } from '../../message-list';\nimport { SaveQueueManager } from '../../save-queue';\nimport { globalRunRegistry } from '../run-registry';\nimport type {\n  SerializableDurableState,\n  SerializableModelConfig,\n  SerializableModelListEntry,\n  SerializableToolMetadata,\n  DurableAgenticWorkflowInput,\n  RegistryModelListEntry,\n} from '../types';\n\n/**\n * Runtime dependencies that need to be resolved at step execution time.\n * These cannot be serialized and must be recreated from available context.\n */\nexport interface ResolvedRuntimeDependencies {\n  /** Reconstructed _internal object for compatibility with existing code */\n  _internal: StreamInternal;\n  /** Resolved tools with execute functions */\n  tools: Record<string, CoreTool>;\n  /** Resolved language model */\n  model: MastraLanguageModel;\n  /** Resolved model list for fallback support (actual model instances) */\n  modelList?: RegistryModelListEntry[];\n  /** Deserialized MessageList */\n  messageList: MessageList;\n  /** Memory instance (if available) */\n  memory?: MastraMemory;\n  /** SaveQueueManager for message persistence */\n  saveQueueManager?: SaveQueueManager;\n  /** Workspace for file/sandbox operations */\n  workspace?: Workspace;\n}\n\n/**\n * Options for resolving runtime dependencies\n */\nexport interface ResolveRuntimeOptions {\n  /** Mastra instance for accessing services */\n  mastra?: Mastra;\n  /** Run identifier */\n  runId: string;\n  /** Agent identifier */\n  agentId: string;\n  /** Workflow input containing serialized state */\n  input: DurableAgenticWorkflowInput;\n  /** Logger for debugging */\n  logger?: { debug?: (...args: any[]) => void; error?: (...args: any[]) => void };\n}\n\n/**\n * Resolve all runtime dependencies needed for durable step execution.\n *\n * This function reconstructs the non-serializable state needed to execute\n * agent steps from:\n * 1. The Mastra instance (for agent lookup, tools, model)\n * 2. The serialized workflow input (for MessageList, state)\n *\n * Unlike the registry-based approach, this reconstructs tools and model\n * from the agent registered with Mastra, making it truly durable across\n * process restarts.\n */\nexport async function resolveRuntimeDependencies(options: ResolveRuntimeOptions): Promise<ResolvedRuntimeDependencies> {\n  const { mastra, runId, agentId, input, logger } = options;\n\n  // 1. Deserialize MessageList\n  // Reuse the existing MessageList from the registry if available so that\n  // external consumers (e.g. the stream adapter) that hold a reference to it\n  // see the updated state.  Creating a new instance each iteration would\n  // orphan those references (their newResponseMessages Set would point at\n  // stale objects).\n  const existingEntry = globalRunRegistry.get(runId);\n  const messageList = existingEntry?.messageList\n    ? existingEntry.messageList.deserialize(input.messageListState)\n    : new MessageList({\n        threadId: input.state.threadId,\n        resourceId: input.state.resourceId,\n      }).deserialize(input.messageListState);\n\n  // 2. Check global registry first (for local/test execution)\n  // This is necessary because workflow steps don't have direct access to DurableAgent's registry\n  const globalEntry = globalRunRegistry.get(runId);\n  let tools: Record<string, CoreTool> = globalEntry?.tools ?? {};\n  let model: MastraLanguageModel = globalEntry?.model as MastraLanguageModel;\n  let modelList: RegistryModelListEntry[] | undefined = globalEntry?.modelList;\n  let workspace: Workspace | undefined = globalEntry?.workspace;\n  let memory: MastraMemory | undefined;\n\n  // If we found the entry in global registry, we already have model and tools\n  if (globalEntry) {\n    logger?.debug?.(`[DurableAgent:${agentId}] Using model and tools from global registry for run ${runId}`);\n  } else if (mastra) {\n    try {\n      const agent = mastra.getAgentById(agentId);\n\n      // Build a request context with version overrides if available\n      const resolveRequestContext = new RequestContext();\n      // Future: restore serialized version overrides from workflow input here\n\n      tools = await agent.getToolsForExecution({\n        runId,\n        threadId: input.state.threadId,\n        resourceId: input.state.resourceId,\n        requestContext: resolveRequestContext,\n        memoryConfig: input.state.memoryConfig,\n        autoResumeSuspendedTools: input.options?.autoResumeSuspendedTools,\n      });\n\n      model =\n        (await (agent as any).getModel?.({ requestContext: resolveRequestContext })) ??\n        resolveModel(input.modelConfig, mastra);\n\n      const rawModelList = await (agent as any).getModelList?.(resolveRequestContext);\n      if (rawModelList && Array.isArray(rawModelList)) {\n        modelList = rawModelList.map((entry: any) => ({\n          id: entry.id,\n          model: entry.model,\n          maxRetries: entry.maxRetries ?? 0,\n          enabled: entry.enabled ?? true,\n          headers: entry.headers,\n        }));\n      }\n\n      memory = await (agent as any).getMemory?.({ requestContext: resolveRequestContext });\n      workspace = await (agent as any).getWorkspace?.({ requestContext: resolveRequestContext });\n    } catch (error) {\n      logger?.debug?.(`[DurableAgent:${agentId}] Failed to get agent from Mastra: ${error}`);\n      model = resolveModel(input.modelConfig, mastra);\n    }\n  } else {\n    logger?.debug?.(`[DurableAgent:${agentId}] No Mastra instance available, using fallback model`);\n    model = resolveModel(input.modelConfig);\n  }\n\n  if (Object.keys(tools).length === 0) {\n    logger?.debug?.(`[DurableAgent:${agentId}] No tools resolved for run ${runId}`);\n  }\n\n  // 3. Get or create SaveQueueManager\n  let saveQueueManager: SaveQueueManager | undefined;\n  if (memory) {\n    saveQueueManager = new SaveQueueManager({\n      logger: mastra?.getLogger?.(),\n      memory,\n    });\n  }\n\n  // 4. Reconstruct _internal for compatibility with existing code\n  const _internal = resolveInternalState({\n    state: input.state,\n    memory,\n    saveQueueManager,\n    tools,\n  });\n\n  return {\n    _internal,\n    tools,\n    model,\n    modelList,\n    messageList,\n    memory,\n    saveQueueManager,\n    workspace,\n  };\n}\n\n/**\n * Resolve the language model from serialized config.\n *\n * Note: This is a fallback when the model is not in the run registry.\n * The preferred approach is to store the actual model instance in the\n * run registry during preparation and retrieve it via runRegistry.getModel().\n *\n * This fallback returns a metadata-only stub that will fail the\n * isSupportedLanguageModel check with a descriptive error message.\n */\nexport function resolveModel(config: SerializableModelConfig, _mastra?: Mastra): MastraLanguageModel {\n  const metadataError = () => {\n    throw new Error(\n      `Model ${config.provider}/${config.modelId} is a metadata-only stub. ` +\n        `The actual model instance should be resolved from the run registry.`,\n    );\n  };\n\n  return {\n    provider: config.provider,\n    modelId: config.modelId,\n    specificationVersion: config.specificationVersion ?? 'v2',\n    supportedUrls: {},\n    doGenerate: metadataError,\n    doStream: metadataError,\n    __metadataOnly: true,\n  } as MastraLanguageModel;\n}\n\n/**\n * Reconstruct the _internal (StreamInternal) object from available state\n */\nexport function resolveInternalState(options: {\n  state: SerializableDurableState;\n  memory?: MastraMemory;\n  saveQueueManager?: SaveQueueManager;\n  tools?: Record<string, CoreTool>;\n}): StreamInternal {\n  const { state, memory, saveQueueManager, tools } = options;\n\n  return {\n    // Functions - create fresh\n    now: () => Date.now(),\n    generateId: () => crypto.randomUUID(),\n    currentDate: () => new Date(),\n\n    // Class instances - from resolved state\n    saveQueueManager,\n    memory,\n\n    // Serializable state\n    memoryConfig: state.memoryConfig,\n    threadId: state.threadId,\n    resourceId: state.resourceId,\n    threadExists: state.threadExists,\n\n    // Tools if provided - cast to ToolSet for compatibility\n    // CoreTool and ToolSet are structurally compatible at runtime\n    stepTools: tools as ToolSet | undefined,\n  };\n}\n\n/**\n * Resolve a single tool by name from Mastra's global tool registry\n */\nexport function resolveTool(toolName: string, mastra?: Mastra): CoreTool | undefined {\n  // Get from Mastra's global tool registry\n  try {\n    return mastra?.getTool?.(toolName as any) as CoreTool | undefined;\n  } catch {\n    // Tool not found in global registry\n    return undefined;\n  }\n}\n\n/**\n * Check if a tool requires human approval.\n *\n * Mirrors the non-durable precedence:\n *  - Function-form global `requireToolApproval` is evaluated per call with\n *    `(toolName, args, ...)`. Throwing defaults to \"require approval\" (safe).\n *  - Boolean global / tool-level `requireApproval` seed the decision.\n *  - A per-tool `needsApprovalFn` (e.g. skill tools) is authoritative when\n *    present and overrides the seed.\n *\n * In durable execution the function form lives on the run registry, not on\n * the serialized workflow input — pass the resolved value from the caller.\n */\nexport async function toolRequiresApproval(\n  tool: CoreTool,\n  globalRequireApproval?: RequireToolApproval,\n  args?: Record<string, unknown>,\n  approvalContext?: Partial<ToolApprovalContext> & { toolName: string },\n): Promise<boolean> {\n  let globalRequires: boolean;\n  if (typeof globalRequireApproval === 'function') {\n    try {\n      globalRequires = !!(await globalRequireApproval({\n        toolName: approvalContext?.toolName ?? '',\n        args: args ?? {},\n        requestContext: approvalContext?.requestContext,\n        workspace: approvalContext?.workspace,\n      }));\n    } catch {\n      // On error, default to requiring approval (safe default).\n      globalRequires = true;\n    }\n  } else {\n    globalRequires = !!globalRequireApproval;\n  }\n\n  let requires = globalRequires || !!(tool as any).requireApproval;\n\n  // needsApprovalFn overrides all other flags (e.g., skill tools return false)\n  const needsApprovalFn = getNeedsApprovalFn(tool);\n  if (needsApprovalFn) {\n    try {\n      requires = !!(await needsApprovalFn(args ?? {}));\n    } catch {\n      // On error, default to requiring approval (safe default)\n      requires = true;\n    }\n  }\n\n  return requires;\n}\n\n/**\n * Extract tool metadata needed for LLM from resolved tools\n * This is useful when we need to pass tool info to the model\n */\nexport function extractToolsForModel(\n  tools: Record<string, CoreTool>,\n  _toolsMetadata: SerializableToolMetadata[],\n): Record<string, CoreTool> {\n  // Return the tools as-is since they're already in CoreTool format\n  // The metadata is just for reference/serialization\n  return tools;\n}\n\n/**\n * Resolve a language model from a serialized model config.\n *\n * This is used during durable execution to reconstruct models from\n * serialized configuration. It uses the originalConfig string (e.g., 'openai/gpt-4o')\n * to resolve the model through the standard model resolution pipeline.\n *\n * @param config The serialized model configuration\n * @param mastra Optional Mastra instance for custom gateways\n * @returns Resolved language model\n */\nexport async function resolveModelFromConfig(\n  config: SerializableModelConfig,\n  mastra?: Mastra,\n): Promise<MastraLanguageModel> {\n  const requestContext = new RequestContext();\n\n  // Use originalConfig if available (e.g., 'openai/gpt-4o'), otherwise construct from provider/modelId\n  const modelConfigString = config.originalConfig ?? `${config.provider}/${config.modelId}`;\n\n  if (typeof modelConfigString === 'string') {\n    return (await resolveModelConfig(modelConfigString, requestContext, mastra)) as MastraLanguageModel;\n  }\n\n  // If originalConfig is an object, pass it through\n  return (await resolveModelConfig(\n    modelConfigString as Parameters<typeof resolveModelConfig>[0],\n    requestContext,\n    mastra,\n  )) as MastraLanguageModel;\n}\n\n/**\n * Resolve a model from a model list entry.\n *\n * @param entry The model list entry with config, maxRetries, enabled\n * @param mastra Optional Mastra instance\n * @returns Resolved language model\n */\nexport async function resolveModelFromListEntry(\n  entry: SerializableModelListEntry,\n  mastra?: Mastra,\n): Promise<MastraLanguageModel> {\n  return resolveModelFromConfig(entry.config, mastra);\n}\n","import type { LanguageModelV2Prompt } from '@ai-sdk/provider-v5';\nimport type { ToolChoice, ToolSet } from '@internal/ai-sdk-v5';\nimport { z } from 'zod';\nimport type { PubSub } from '../../../../events/pubsub';\nimport { mergeProviderOptions } from '../../../../llm/model/provider-options';\nimport type { SharedProviderOptions } from '../../../../llm/model/shared.types';\nimport { applyAutoResumeSystemMessage } from '../../../../loop/shared/auto-resume-system-message';\nimport { buildLlmPromptArgs } from '../../../../loop/shared/build-llm-prompt-args';\nimport { composeStepInput } from '../../../../loop/shared/compose-step-input';\nimport { injectBackgroundTaskPrompt } from '../../../../loop/shared/inject-background-task-prompt';\nimport { buildMemoryHeaders, mergeLlmCallHeaders } from '../../../../loop/shared/merge-llm-call-headers';\nimport type { Mastra } from '../../../../mastra';\nimport type {\n  SpanType,\n  AIModelGenerationSpan,\n  ExportedSpan,\n  IModelSpanTracker,\n  AnySpan,\n} from '../../../../observability';\nimport { EntityType } from '../../../../observability';\nimport { getStepAvailableToolNames } from '../../../../observability/utils';\nimport type { CachedLLMStepResponse } from '../../../../processors';\nimport { PrepareStepProcessor } from '../../../../processors/processors/prepare-step';\nimport { ProcessorRunner } from '../../../../processors/runner';\nimport { execute } from '../../../../stream/aisdk/v5/execute';\nimport { MastraModelOutput } from '../../../../stream/base/output';\nimport type { TextDeltaPayload, ToolCallPayload } from '../../../../stream/types';\nimport { ChunkFrom } from '../../../../stream/types';\nimport { inferProviderExecuted } from '../../../../tools/provider-tool-utils';\nimport type { CoreTool } from '../../../../tools/types';\nimport { PUBSUB_SYMBOL } from '../../../../workflows/constants';\nimport { createStep } from '../../../../workflows/workflow';\nimport { MessageList } from '../../../message-list';\nimport type { MastraDBMessage } from '../../../message-list';\nimport { TripWire } from '../../../trip-wire';\nimport { isSupportedLanguageModel } from '../../../utils';\nimport { DurableStepIds } from '../../constants';\nimport { endRunSpansWithError, globalRunRegistry } from '../../run-registry';\nimport { emitAbortEvent, emitChunkEvent, emitStepStartEvent } from '../../stream-adapter';\nimport type { DurableAgenticWorkflowInput, DurableLLMStepOutput, DurableToolCallInput } from '../../types';\nimport { applyToolPayloadTransformToChunk } from '../../utils/apply-tool-payload-transform';\nimport { resolveRuntimeDependencies, resolveModelFromListEntry } from '../../utils/resolve-runtime';\n\n/**\n * Input schema for the durable LLM execution step\n */\nconst durableLLMInputSchema = z.object({\n  runId: z.string(),\n  agentId: z.string(),\n  agentName: z.string().optional(),\n  messageListState: z.any(), // SerializedMessageListState\n  toolsMetadata: z.array(z.any()),\n  modelConfig: z.object({\n    provider: z.string(),\n    modelId: z.string(),\n    specificationVersion: z.string().optional(),\n    originalConfig: z.union([z.string(), z.record(z.string(), z.any())]).optional(),\n    settings: z.record(z.string(), z.any()).optional(),\n    providerOptions: z.record(z.string(), z.any()).optional(),\n  }),\n  // Model list for fallback support (when agent configured with array of models)\n  modelList: z\n    .array(\n      z.object({\n        id: z.string(),\n        config: z.object({\n          provider: z.string(),\n          modelId: z.string(),\n          specificationVersion: z.string().optional(),\n          originalConfig: z.union([z.string(), z.record(z.string(), z.any())]).optional(),\n          providerOptions: z.record(z.string(), z.any()).optional(),\n        }),\n        maxRetries: z.number(),\n        enabled: z.boolean(),\n      }),\n    )\n    .optional(),\n  options: z.any(),\n  state: z.any(),\n  messageId: z.string(),\n  // Agent span data for model span parenting\n  agentSpanData: z.any().optional(),\n  // Model span data (ONE span for entire agent run, created before workflow)\n  modelSpanData: z.any().optional(),\n  // Step index for continuation (step: 0, 1, 2, ...)\n  stepIndex: z.number().optional(),\n});\n\n/**\n * Output schema for the durable LLM execution step\n */\nconst durableLLMOutputSchema = z.object({\n  messageListState: z.any(),\n  text: z.string().optional(),\n  toolCalls: z.array(\n    z.object({\n      toolCallId: z.string(),\n      toolName: z.string(),\n      args: z.record(z.string(), z.any()),\n      providerMetadata: z.record(z.string(), z.any()).optional(),\n      activeTools: z.array(z.string()).nullable().optional(),\n    }),\n  ),\n  stepResult: z.object({\n    reason: z.string(),\n    warnings: z.array(z.any()),\n    isContinued: z.boolean(),\n    totalUsage: z.any().optional(),\n  }),\n  metadata: z.any(),\n  processorRetryCount: z.number().optional(),\n  processorRetryFeedback: z.string().optional(),\n  state: z.any(),\n  // Step index used in this execution (for tracking)\n  stepIndex: z.number().optional(),\n  // Exported span data forwarded to downstream steps for trace nesting/closing\n  modelSpanData: z.any().optional(),\n  stepSpanData: z.any().optional(),\n  stepFinishPayload: z.any().optional(),\n});\n\n/**\n * Options for creating the durable LLM execution step\n */\nexport interface DurableLLMExecutionStepOptions {\n  // No options needed - tools and model are resolved from Mastra at runtime\n}\n\n/**\n * Create a durable LLM execution step.\n *\n * This step:\n * 1. Deserializes the MessageList from workflow input\n * 2. Resolves tools and model from the runtime context\n * 3. Executes the LLM call\n * 4. Emits streaming chunks via pubsub\n * 5. Returns serialized state for the next step\n *\n * The key difference from the non-durable version is that all state\n * flows through the workflow input/output, and non-serializable\n * dependencies are resolved at execution time.\n */\nexport function createDurableLLMExecutionStep(_options?: DurableLLMExecutionStepOptions) {\n  return createStep({\n    id: DurableStepIds.LLM_EXECUTION,\n    inputSchema: durableLLMInputSchema,\n    outputSchema: durableLLMOutputSchema,\n    execute: async params => {\n      const { inputData, mastra, tracingContext, requestContext, abortSignal } = params;\n\n      // Access pubsub via symbol\n      const pubsub = (params as any)[PUBSUB_SYMBOL] as PubSub | undefined;\n\n      const typedInput = inputData as DurableAgenticWorkflowInput;\n      const { agentId, messageId, options: execOptions } = typedInput;\n      const runId = typedInput.runId;\n      const logger = mastra?.getLogger?.();\n\n      // 1. Resolve runtime dependencies (tools from Mastra)\n      const resolved = await resolveRuntimeDependencies({\n        mastra: mastra as Mastra,\n        runId,\n        agentId,\n        input: typedInput,\n        logger,\n      });\n\n      const { messageList, tools, model: resolvedModel, modelList: resolvedModelList } = resolved;\n\n      // 1b. Check for tripwire from processInput (initial input processing).\n      // If an input processor called abort() during preparation, the tripwire\n      // data is stored on the registry entry. Emit a tripwire chunk and bail\n      // immediately — the model must never be called.\n      const registryTripwire = globalRunRegistry.get(runId)?.tripwire;\n      if (registryTripwire) {\n        // Clear it so it doesn't fire again on a subsequent iteration (shouldn't\n        // happen since the loop will stop, but belt-and-suspenders).\n        const entry = globalRunRegistry.get(runId);\n        if (entry) entry.tripwire = undefined;\n\n        logger?.warn?.('Input processor tripwire triggered (from preparation)', {\n          agent: agentId,\n          reason: registryTripwire.reason,\n          processorId: registryTripwire.processorId,\n          retry: registryTripwire.retry,\n        });\n\n        if (pubsub) {\n          await emitChunkEvent(pubsub, runId, {\n            type: 'tripwire',\n            runId,\n            from: ChunkFrom.AGENT,\n            payload: {\n              reason: registryTripwire.reason || '',\n              retry: registryTripwire.retry,\n              metadata: registryTripwire.metadata,\n              processorId: registryTripwire.processorId,\n            },\n          });\n        }\n\n        return {\n          messageListState: messageList.serialize(),\n          text: '',\n          toolCalls: [],\n          stepResult: {\n            reason: 'tripwire' as const,\n            warnings: [],\n            isContinued: false,\n          },\n          metadata: {},\n          state: typedInput.state,\n        } satisfies DurableLLMStepOutput;\n      }\n\n      // 2. Determine if we have a model list for fallback support\n      const hasModelList = typedInput.modelList && typedInput.modelList.length > 0;\n\n      // 3. Build the model list - either from explicit list or single model\n      // For single model case (no modelList), we use the resolved model directly\n      // which supports mock models and directly-provided models\n      const modelList = hasModelList\n        ? typedInput.modelList!.filter(m => m.enabled)\n        : [\n            {\n              id: `${typedInput.modelConfig.provider}/${typedInput.modelConfig.modelId}`,\n              config: typedInput.modelConfig,\n              maxRetries: 0,\n              enabled: true,\n            },\n          ];\n\n      if (modelList.length === 0) {\n        throw new Error('No enabled models available for execution');\n      }\n\n      // 4. Execute with model fallback - try each model in the list with retries\n      let lastError: Error | undefined;\n      let processorRetryCount = 0;\n      const maxProcessorRetries =\n        typedInput.options?.maxProcessorRetries ??\n        (globalRunRegistry.get(runId)?.errorProcessors?.length ? 10 : undefined);\n\n      for (let modelIndex = 0; modelIndex < modelList.length; modelIndex++) {\n        const modelEntry = modelList[modelIndex]!;\n        const maxRetries = modelEntry.maxRetries || 0;\n\n        for (let attempt = 0; attempt <= maxRetries; attempt++) {\n          try {\n            // Resolve the model - for single model case (no modelList), use resolved model\n            // For model list case, try registry first (works with mock models), then config resolution (for Inngest)\n            const model = !hasModelList\n              ? resolvedModel\n              : (resolvedModelList?.find(m => m.id === modelEntry.id)?.model ??\n                (await resolveModelFromListEntry(modelEntry, mastra as Mastra)));\n\n            // Check if model is supported\n            if (!isSupportedLanguageModel(model)) {\n              const hint = (model as any).__metadataOnly\n                ? ' The model could not be resolved from the run registry or Mastra instance.'\n                : '';\n              throw new Error(\n                `Unsupported model version: ${(model as any).specificationVersion}. Model must implement doStream.${hint}`,\n              );\n            }\n\n            let currentMessageId = messageId;\n\n            // 5. Prepare tools - cast through unknown as CoreTool and ToolSet are structurally compatible at runtime\n            let currentModel = model;\n            let currentTools = tools as unknown as ToolSet;\n            let currentToolChoice = execOptions.toolChoice as ToolChoice<ToolSet> | undefined;\n            let currentActiveTools = execOptions.activeTools;\n            let currentModelSettings: Record<string, unknown> = { ...(execOptions.modelSettings ?? {}) };\n            let currentProviderOptions: SharedProviderOptions | undefined = mergeProviderOptions(\n              execOptions.providerOptions,\n              modelEntry.config.providerOptions,\n            ) as SharedProviderOptions | undefined;\n\n            // 6. Rebuild MODEL_GENERATION span from passed data\n            // For durable execution, ONE model_generation span is created BEFORE the workflow starts\n            // and passed through each iteration. This ensures all steps are children of the same span.\n            const observability = mastra?.observability?.getSelectedInstance({ requestContext });\n\n            // modelSpanData is threaded through the iteration state (seeded in preparation.ts);\n            // after a resume the registry override points steps at the resumed generation.\n            const inputModelSpanData = (globalRunRegistry.get(runId)?.resumeModelSpanData ??\n              (inputData as any).modelSpanData) as ExportedSpan<SpanType.MODEL_GENERATION> | undefined;\n            const modelSpan = inputModelSpanData\n              ? (observability?.rebuildSpan(inputModelSpanData) as AIModelGenerationSpan | undefined)\n              : undefined;\n\n            // Create model span tracker for MODEL_STEP and MODEL_CHUNK spans\n            const modelSpanTracker: IModelSpanTracker | undefined = modelSpan?.createTracker();\n\n            // Set the step index for continuation (step: 0, 1, 2, ...)\n            // This ensures step numbering continues across agentic loop iterations\n            const stepIndex = (inputData as any).stepIndex ?? 0;\n            modelSpanTracker?.setStepIndex(stepIndex);\n\n            // Build structured output for AI SDK if configured. Held in a `let`\n            // because `composeStepInput` (driven by input processors / prepareStep)\n            // is allowed to replace `structuredOutput` for this iteration.\n            const structuredOutputConfig = execOptions.structuredOutput;\n            let structuredOutput =\n              structuredOutputConfig?.schema && !structuredOutputConfig?.structuringModelConfig\n                ? {\n                    schema: structuredOutputConfig.schema,\n                    jsonPromptInjection: structuredOutputConfig.jsonPromptInjection,\n                  }\n                : undefined;\n\n            const registryEntry = globalRunRegistry.get(runId);\n            const executionAbortSignal = registryEntry?.abortSignal ?? abortSignal;\n            const baseInputProcessors = registryEntry?.inputProcessors ?? [];\n            const stepInputProcessors = registryEntry?.prepareStep\n              ? [...baseInputProcessors, new PrepareStepProcessor({ prepareStep: registryEntry.prepareStep })]\n              : baseInputProcessors;\n            if (stepInputProcessors.length) {\n              const inputStepWriter = pubsub\n                ? {\n                    custom: async (data: { type: string }) => {\n                      await emitChunkEvent(pubsub, runId, data as any);\n                    },\n                  }\n                : undefined;\n              const runner = new ProcessorRunner({\n                inputProcessors: stepInputProcessors,\n                outputProcessors: registryEntry?.outputProcessors ?? [],\n                errorProcessors: registryEntry?.errorProcessors ?? [],\n                logger: logger as any,\n                agentName: typedInput.agentName ?? typedInput.agentId,\n                processorStates: registryEntry?.processorStates,\n              });\n              try {\n                const processInputStepResult = await runner.runProcessInputStep({\n                  messageList,\n                  stepNumber: stepIndex,\n                  steps: (inputData as any).accumulatedSteps ?? [],\n                  tracingContext: modelSpanTracker?.getTracingContext() ?? tracingContext,\n                  requestContext,\n                  memory: registryEntry?.memory,\n                  resourceId: typedInput.state?.resourceId,\n                  threadId: typedInput.state?.threadId,\n                  model: currentModel,\n                  messageId: currentMessageId,\n                  rotateResponseMessageId: () => {\n                    currentMessageId = crypto.randomUUID();\n                    return currentMessageId;\n                  },\n                  tools: currentTools,\n                  toolChoice: currentToolChoice,\n                  providerOptions: currentProviderOptions,\n                  activeTools: currentActiveTools,\n                  modelSettings: currentModelSettings,\n                  structuredOutput: structuredOutput as any,\n                  retryCount: (inputData as any).processorRetryCount ?? 0,\n                  abortSignal: executionAbortSignal,\n                  writer: inputStepWriter,\n                });\n                const merged = composeStepInput(\n                  {\n                    messageId: currentMessageId,\n                    model: currentModel,\n                    tools: currentTools,\n                    toolChoice: currentToolChoice,\n                    activeTools: currentActiveTools,\n                    providerOptions: currentProviderOptions,\n                    modelSettings: currentModelSettings,\n                    structuredOutput,\n                  },\n                  processInputStepResult,\n                );\n                currentMessageId = merged.messageId;\n                currentModel = merged.model as typeof currentModel;\n                currentTools = merged.tools as ToolSet;\n                currentToolChoice = merged.toolChoice as ToolChoice<ToolSet> | undefined;\n                currentActiveTools = merged.activeTools;\n                currentProviderOptions = merged.providerOptions;\n                currentModelSettings = merged.modelSettings;\n                structuredOutput = merged.structuredOutput;\n              } catch (error) {\n                // Handle TripWire from processInputStep — emit tripwire chunk and\n                // bail the step, mirroring the regular agent's buildTripWireBailResponse.\n                // Return a bail output with reason: 'tripwire' so the dowhile loop\n                // stops gracefully and emits a proper finish event.\n                if (error instanceof TripWire) {\n                  logger?.warn?.('Streaming input processor tripwire triggered', {\n                    reason: error.message,\n                    processorId: error.processorId,\n                    retry: error.options?.retry,\n                  });\n                  if (pubsub) {\n                    await emitChunkEvent(pubsub, runId, {\n                      type: 'tripwire',\n                      runId,\n                      from: ChunkFrom.AGENT,\n                      payload: {\n                        processorId: error.processorId,\n                        reason: error.message,\n                        retry: error.options?.retry,\n                        metadata: error.options?.metadata,\n                      },\n                    });\n                  }\n                  // Return a bail response instead of throwing — the dowhile\n                  // predicate will see isContinued: false and stop the loop,\n                  // then emitFinishEvent will emit reason: 'tripwire'.\n                  return {\n                    messageListState: messageList.serialize(),\n                    text: '',\n                    toolCalls: [],\n                    stepResult: {\n                      reason: 'tripwire' as const,\n                      warnings: [],\n                      isContinued: false,\n                    },\n                    metadata: {\n                      modelId: currentModel.modelId,\n                    },\n                    state: typedInput.state,\n                  } satisfies DurableLLMStepOutput;\n                }\n                logger?.error?.('Error in processInputStep processors:', error);\n                throw error;\n              }\n            }\n\n            // ── Signal echo & pre-run drain ───────────────────────────────\n            // Mirror the non-durable llm-execution-step:\n            //  1. Echo initialSignalEchoes (signals that were part of the input\n            //     messages, e.g. from persisted memory) so the client sees them.\n            //  2. Pre-run signals: if this is the first model request of the run\n            //     (stepIndex === 0), drain signals that were queued before the\n            //     run made its first request. These must be added to messageList\n            //     BEFORE inputMessages is materialized so the model sees them.\n            if (pubsub) {\n              const initialSignalEchoes = registryEntry?.initialSignalEchoes?.splice(0) ?? [];\n              for (const initialSignal of initialSignalEchoes) {\n                await emitChunkEvent(pubsub, runId, initialSignal.toDataPart() as any);\n              }\n\n              const isFirstModelRequest = stepIndex === 0;\n              if (isFirstModelRequest && registryEntry?.drainPendingSignals) {\n                const preRunSignals = registryEntry.drainPendingSignals('pre-run');\n                if (preRunSignals.length > 0) {\n                  currentMessageId = mastra?.generateId?.() ?? crypto.randomUUID();\n                }\n                for (const preRunSignal of preRunSignals) {\n                  const signalForTranscript = messageList.addSignal(preRunSignal);\n                  await emitChunkEvent(pubsub, runId, signalForTranscript.toDataPart() as any);\n                }\n              }\n            }\n\n            // `downloadRetries` / `downloadConcurrency` are internal-only on the\n            // non-durable path today (not exposed through AgentExecutionOptions),\n            // so durable also relies on the MessageList defaults here. If those\n            // ever become user-facing they should be plumbed in identically.\n            const messageListPromptArgs = await buildLlmPromptArgs({\n              model: currentModel,\n            });\n            const llmPromptForModel =\n              currentModel.specificationVersion === 'v3' || currentModel.specificationVersion === 'v4'\n                ? messageList.get.all.aiV6.llmPrompt\n                : messageList.get.all.aiV5.llmPrompt;\n            let inputMessages = (await llmPromptForModel(messageListPromptArgs)) as LanguageModelV2Prompt;\n\n            // Inject the auto-resume directive into the leading system message when\n            // there are suspended tools waiting for resumption (parity with the\n            // non-durable agentic-execution step).\n            inputMessages = applyAutoResumeSystemMessage({\n              autoResume: execOptions.autoResumeSuspendedTools,\n              inputMessages,\n              messages: messageList.get.all.db(),\n            });\n\n            // Tell the model about background-task capabilities when a\n            // background-task manager is wired in. Mirrors the non-durable\n            // agentic-execution step so background-enabled tools surface the\n            // same `_background` guidance to the LLM.\n            inputMessages = injectBackgroundTaskPrompt({\n              inputMessages,\n              backgroundTaskManager: registryEntry?.backgroundTaskManager,\n              tools: currentTools as Record<string, { background?: any; description?: string }> | undefined,\n              agentBackgroundConfig: registryEntry?.backgroundTasksConfig,\n            });\n\n            // Run `processLLMRequest` for any input processors that implement it.\n            // This hook lets processors rewrite the outbound prompt transiently\n            // without persisting changes back to the message list, or short-circuit\n            // the call entirely by returning a cached response.\n            // Mirrors loop/workflows/agentic-execution/llm-execution-step.ts.\n            //\n            // Use `llmRequestInputProcessors` (uncombined) because combined\n            // (workflow-wrapped) processors are skipped by\n            // `ProcessorRunner.runProcessLLMRequest`. Fall back to\n            // `inputProcessors` for backward compatibility.\n            let cachedResponse: CachedLLMStepResponse | undefined;\n            const allInputProcessors = registryEntry?.llmRequestInputProcessors ?? registryEntry?.inputProcessors ?? [];\n            // Create a single ProcessorRunner shared between processLLMRequest\n            // and processLLMResponse so processor state (e.g. cache keys stashed\n            // in the request hook) is available in the response hook.\n            const requestStepRunner =\n              allInputProcessors.length > 0\n                ? new ProcessorRunner({\n                    inputProcessors: allInputProcessors,\n                    outputProcessors: [],\n                    logger: logger as any,\n                    agentName: typedInput.agentName ?? typedInput.agentId,\n                    processorStates: registryEntry?.processorStates,\n                  })\n                : undefined;\n            const requestStepWriter = pubsub\n              ? {\n                  custom: async (data: { type: string }) => {\n                    await emitChunkEvent(pubsub, runId, data as any);\n                  },\n                }\n              : undefined;\n            if (requestStepRunner) {\n              try {\n                const requestStepResult = await requestStepRunner.runProcessLLMRequest({\n                  prompt: inputMessages,\n                  model: currentModel,\n                  stepNumber: (inputData as any).accumulatedSteps?.length ?? 0,\n                  steps: (inputData as any).accumulatedSteps ?? [],\n                  retryCount: (inputData as any).processorRetryCount ?? 0,\n                  requestContext,\n                  tracingContext: modelSpanTracker?.getTracingContext() ?? tracingContext,\n                  writer: requestStepWriter,\n                  abortSignal: executionAbortSignal,\n                });\n                inputMessages = requestStepResult.prompt;\n                cachedResponse = requestStepResult.response;\n              } catch (error) {\n                if (error instanceof TripWire) {\n                  logger?.warn?.('Streaming request processor tripwire triggered', {\n                    reason: error.message,\n                    processorId: error.processorId,\n                    retry: error.options?.retry,\n                  });\n                  // Emit a tripwire chunk and return a bail response so the\n                  // dowhile loop stops gracefully with reason: 'tripwire'.\n                  if (pubsub) {\n                    await emitChunkEvent(pubsub, runId, {\n                      type: 'tripwire',\n                      runId,\n                      from: ChunkFrom.AGENT,\n                      payload: {\n                        processorId: error.processorId,\n                        reason: error.message,\n                        retry: error.options?.retry,\n                        metadata: error.options?.metadata,\n                      },\n                    });\n                  }\n                  return {\n                    messageListState: messageList.serialize(),\n                    text: '',\n                    toolCalls: [],\n                    stepResult: {\n                      reason: 'tripwire' as const,\n                      warnings: [],\n                      isContinued: false,\n                    },\n                    metadata: {\n                      modelId: currentModel.modelId,\n                    },\n                    state: typedInput.state,\n                  } satisfies DurableLLMStepOutput;\n                }\n                logger?.error?.('Error in processLLMRequest processors:', error);\n                throw error;\n              }\n            }\n\n            // Enable defer mode - step-finish won't auto-close the step span\n            // This allows us to export the step span and close it later after tool execution\n            modelSpanTracker?.setDeferStepClose(true);\n\n            // 7. Track state during streaming\n            let warnings: any[] = [];\n            let request: any = {};\n            let rawResponse: any = {};\n            const textDeltas: string[] = [];\n            const toolCalls: DurableToolCallInput[] = [];\n            let finishReason: string = 'stop';\n            let usage: any = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n            let responseMetadata: any = {};\n\n            // ── Client-tool observability + onInputStart / onInputDelta ──\n            // Mirrors the regular agent's injectClientToolObservability / endClientToolObservabilitySpan\n            // helpers. Creates CLIENT_TOOL_CALL spans for tools executed on the client side and\n            // invokes the tool-level onInputStart / onInputDelta callbacks as chunks arrive.\n            const clientToolArgsTextByToolCallId = new Map<string, string[]>();\n            const clientToolObservabilityByToolCallId = new Map<\n              string,\n              { carrier: unknown; span: AnySpan; ended: boolean }\n            >();\n            // Cache resolved tool defs by toolCallId so `tool-call-delta` chunks\n            // (which may carry only a toolCallId, no toolName) can still find the\n            // tool resolved during the preceding `tool-call-input-streaming-start`.\n            const resolvedToolByCallId = new Map<string, CoreTool>();\n\n            const resolveToolDef = (toolName: string): CoreTool | undefined => {\n              const directTool = (currentTools as unknown as Record<string, CoreTool> | undefined)?.[toolName];\n              if (directTool) return directTool;\n              return registryEntry?.tools?.[toolName];\n            };\n\n            const endClientToolObservabilitySpan = (toolCallId: string, args?: unknown): void => {\n              const entry = clientToolObservabilityByToolCallId.get(toolCallId);\n              if (!entry || entry.ended) {\n                clientToolArgsTextByToolCallId.delete(toolCallId);\n                return;\n              }\n              entry.span.end(args !== undefined ? { metadata: { args } } : undefined);\n              entry.ended = true;\n              clientToolArgsTextByToolCallId.delete(toolCallId);\n            };\n\n            const parseClientToolArgsFromDeltas = (toolCallId: string): unknown | undefined => {\n              const deltas = clientToolArgsTextByToolCallId.get(toolCallId);\n              if (!deltas?.length) return undefined;\n              const input = deltas.join('');\n              if (!input) return undefined;\n              try {\n                return JSON.parse(input);\n              } catch {\n                return undefined;\n              }\n            };\n\n            const injectClientToolObservability = ({\n              toolCallId,\n              toolName,\n              args,\n              providerExecuted,\n              payload,\n            }: {\n              toolCallId: string;\n              toolName: string;\n              args?: unknown;\n              providerExecuted?: boolean;\n              payload: Record<string, unknown> & { observability?: unknown };\n            }): { toolDef: CoreTool | undefined } => {\n              const toolDef = resolveToolDef(toolName);\n              const inferredProviderExecuted = inferProviderExecuted(providerExecuted, toolDef);\n              const isClientTool =\n                !inferredProviderExecuted && !(toolDef as { execute?: unknown } | undefined)?.execute;\n\n              if (!isClientTool || !mastra || !tracingContext?.currentSpan) {\n                return { toolDef };\n              }\n\n              const existingCarrier = clientToolObservabilityByToolCallId.get(toolCallId);\n              if (existingCarrier) {\n                payload.observability = existingCarrier.carrier;\n                if (args !== undefined) {\n                  endClientToolObservabilitySpan(toolCallId, args);\n                }\n                return { toolDef };\n              }\n\n              const proxy = (mastra as Mastra).observability?.getClientObservabilityProxy?.();\n              if (!proxy) return { toolDef };\n\n              try {\n                const parentSpan =\n                  tracingContext.currentSpan.type === ('agent_run' as string)\n                    ? tracingContext.currentSpan\n                    : ((tracingContext.currentSpan as any).findParent?.('agent_run') ?? tracingContext.currentSpan);\n                const clientToolSpan = (parentSpan as any).createChildSpan?.({\n                  type: 'client_tool_call',\n                  name: `client_tool: '${toolName}'`,\n                  entityType: EntityType.TOOL,\n                  entityId: toolName,\n                  entityName: toolName,\n                  attributes: {\n                    toolDescription: (toolDef as { description?: string } | undefined)?.description,\n                    toolType: 'client-tool',\n                  },\n                  ...(args !== undefined ? { input: args } : {}),\n                });\n                if (clientToolSpan) {\n                  const carrier = proxy.inject(clientToolSpan);\n                  const entry = { carrier, span: clientToolSpan as AnySpan, ended: false };\n                  clientToolObservabilityByToolCallId.set(toolCallId, entry);\n                  payload.observability = carrier;\n                  if (args !== undefined) {\n                    endClientToolObservabilitySpan(toolCallId, args);\n                  }\n                }\n              } catch (err) {\n                logger?.warn?.('[ClientObservabilityProxy] failed to create CLIENT_TOOL_CALL span', {\n                  error: err instanceof Error ? err.message : String(err),\n                  toolName,\n                });\n              }\n\n              return { toolDef };\n            };\n\n            // 8. Start MODEL_STEP span at the beginning of LLM execution\n            modelSpanTracker?.startStep();\n\n            // Apply post-processor request-side context to MODEL_INFERENCE then\n            // open the inference span immediately before the model call so its\n            // startTime excludes any input processor work and availableTools /\n            // toolChoice reflect per-step mutations. responseFormat tracks the\n            // actual structuredOutput payload sent to execute() — which is\n            // undefined when structuringModelConfig routes through a separate\n            // structuring step instead of asking the model for json_schema.\n            modelSpanTracker?.setInferenceContext?.({\n              parameters: currentModelSettings as Record<string, unknown> | undefined,\n              providerOptions: currentProviderOptions as Record<string, unknown> | undefined,\n              availableTools: getStepAvailableToolNames(\n                currentTools as Record<string, unknown> | undefined,\n                currentActiveTools,\n              ),\n              toolChoice: currentToolChoice,\n              responseFormat: structuredOutput ? 'json_schema' : undefined,\n            });\n            modelSpanTracker?.startInference?.();\n\n            // Collect chunks for the processLLMResponse hook (pairs with\n            // processLLMRequest — lets processors like ResponseCache persist\n            // the model's response). Only populated when there's no cache hit.\n            const collectedChunks: Array<{ type: string; payload: unknown }> = [];\n\n            // 10. Execute LLM call (or replay cached response)\n            let modelResult: ReturnType<typeof execute>;\n            if (cachedResponse) {\n              // Short-circuit: replay cached chunks instead of calling the model.\n              // Output processors are skipped on cache hit because the cached\n              // chunks already reflect their effects from the original call.\n              warnings = cachedResponse.warnings ?? [];\n              request = cachedResponse.request ?? {};\n              rawResponse = cachedResponse.rawResponse;\n              modelSpanTracker?.updateStep?.({\n                request: request || {},\n                inputMessages,\n                warnings: warnings || [],\n                messageId: currentMessageId,\n              });\n              const replayChunks = cachedResponse.chunks;\n              modelResult = new ReadableStream({\n                start(ctrl) {\n                  for (const chunk of replayChunks) {\n                    ctrl.enqueue({\n                      ...chunk,\n                      runId,\n                      from: ChunkFrom.AGENT,\n                    });\n                  }\n                  ctrl.close();\n                },\n              }) as unknown as ReturnType<typeof execute>;\n            } else {\n              modelResult = execute({\n                runId,\n                model: currentModel,\n                providerOptions: currentProviderOptions,\n                inputMessages,\n                tools: currentTools,\n                toolChoice: currentToolChoice,\n                activeTools: currentActiveTools,\n                options: { abortSignal: executionAbortSignal },\n                headers: mergeLlmCallHeaders({\n                  memoryHeaders: buildMemoryHeaders({\n                    threadId: typedInput.state?.threadId,\n                    resourceId: typedInput.state?.resourceId,\n                  }),\n                  modelConfigHeaders: resolvedModelList?.find(m => m.id === modelEntry.id)?.headers,\n                  callTimeHeaders:\n                    registryEntry?.callTimeHeaders || currentModelSettings.headers\n                      ? {\n                          ...(registryEntry?.callTimeHeaders as Record<string, string> | undefined),\n                          ...(currentModelSettings.headers as Record<string, string> | undefined),\n                        }\n                      : undefined,\n                }),\n                modelSettings: {\n                  ...currentModelSettings,\n                  maxRetries: 0,\n                },\n                includeRawChunks: execOptions.includeRawChunks,\n                methodType: 'stream',\n                structuredOutput: structuredOutput as any,\n                onResult: ({ warnings: w, request: r, rawResponse: rr }) => {\n                  warnings = w || [];\n                  request = r || {};\n                  rawResponse = rr || {};\n                  modelSpanTracker?.updateStep?.({ request, inputMessages, warnings, messageId: currentMessageId });\n                },\n              });\n            }\n\n            // 10. Create output stream to process chunks\n            // Note: We cast through any to handle the web/node ReadableStream type mismatch\n            const outputStream = new MastraModelOutput({\n              model: {\n                modelId: currentModel.modelId,\n                provider: currentModel.provider,\n                version: currentModel.specificationVersion,\n              },\n              stream: modelResult as any,\n              messageList,\n              messageId: currentMessageId,\n              options: {\n                runId,\n                tracingContext: modelSpanTracker?.getTracingContext() ?? tracingContext,\n                requestContext,\n              },\n            });\n\n            // 11. Process the stream and emit chunks via pubsub.\n            // The inner LLM stream emits 'finish' but never 'step-finish' (durable calls\n            // `execute` directly). Rewrite 'finish' -> 'step-finish' before the tracker so\n            // MODEL_STEP / MODEL_INFERENCE close and the client buffers the step.\n            const baseStream = outputStream._getBaseStream();\n            const stepBoundaryStream = (baseStream as ReadableStream<any>).pipeThrough(\n              new TransformStream<any, any>({\n                transform(chunk, controller) {\n                  if (chunk?.type === 'finish') {\n                    controller.enqueue({ ...chunk, type: 'step-finish' });\n                  } else {\n                    controller.enqueue(chunk);\n                  }\n                },\n              }),\n            );\n            // Wrap with ModelSpanTracker to create/close MODEL_STEP and MODEL_CHUNK spans\n            const trackedStream = modelSpanTracker?.wrapStream(stepBoundaryStream) ?? stepBoundaryStream;\n\n            let deferredStepFinishChunk: any = null;\n            try {\n              let stepStartEmitted = false;\n              for await (const rawChunk of trackedStream) {\n                if (!rawChunk) continue;\n\n                // Emit step-start before the first stream chunk so the\n                // ordering matches the regular agent: start → step-start → response-metadata → …\n                // onResult has already fired by the time the first chunk arrives,\n                // so `request` and `warnings` are populated.\n                if (!stepStartEmitted && pubsub) {\n                  stepStartEmitted = true;\n                  await emitStepStartEvent(pubsub, runId, {\n                    stepId: DurableStepIds.LLM_EXECUTION,\n                    request,\n                    warnings,\n                  });\n                }\n\n                // Enrich tool-related chunks with the in-process payload transform\n                // policy (mirrors the non-durable agentic-execution layer). The\n                // policy lives on the run registry; serializable `targets` shadow\n                // travels with the workflow input. No-op for non-tool chunks or\n                // when no policy is configured for this run.\n                //\n                // IMPORTANT: the transformed chunk is only used for client-facing\n                // emission. Internal tool-call state (args persisted into\n                // `toolCalls`, downstream tool execution) MUST be built from the\n                // untransformed `rawChunk` so display-layer redactions/rewrites\n                // do not leak into actual tool inputs.\n                //\n                // Use the per-step `currentTools` (post-`prepareStep` and input\n                // processors) rather than the registry-level tool list — that way\n                // any tool-level `transformToolPayload` added or replaced for the\n                // current step is honoured, instead of being silently skipped.\n                const transformTools = currentTools as unknown as Record<string, CoreTool> | undefined;\n                const clientChunk =\n                  registryEntry?.toolPayloadTransform || transformTools\n                    ? await applyToolPayloadTransformToChunk(rawChunk, {\n                        policy: registryEntry?.toolPayloadTransform,\n                        tools: transformTools,\n                        logger: logger as any,\n                      })\n                    : rawChunk;\n\n                // ── Client-tool observability injection ──\n                // For tool-call streaming chunks, inject CLIENT_TOOL_CALL spans\n                // and collect deltas so the span can be ended with parsed args.\n                //\n                // IMPORTANT: inject into `clientChunk.payload` (the published\n                // chunk), not `rawChunk.payload`. When a payload transform is\n                // active, `clientChunk` is a new object — mutating `rawChunk`\n                // would lose the observability carrier on the wire.\n                let toolInputStartToolDef: CoreTool | undefined;\n                if (rawChunk.type === 'tool-call-input-streaming-start') {\n                  ({ toolDef: toolInputStartToolDef } = injectClientToolObservability({\n                    toolCallId: rawChunk.payload.toolCallId,\n                    toolName: rawChunk.payload.toolName,\n                    providerExecuted: rawChunk.payload.providerExecuted,\n                    payload: (clientChunk as any).payload as Record<string, unknown> & { observability?: unknown },\n                  }));\n                  // Cache the resolved tool so subsequent delta chunks (which may\n                  // carry only toolCallId, no toolName) can still find it.\n                  if (toolInputStartToolDef) {\n                    resolvedToolByCallId.set(rawChunk.payload.toolCallId, toolInputStartToolDef);\n                  }\n                } else if (rawChunk.type === 'tool-call-delta') {\n                  const toolCallId = rawChunk.payload.toolCallId;\n                  if (toolCallId && rawChunk.payload.argsTextDelta) {\n                    const deltas = clientToolArgsTextByToolCallId.get(toolCallId) ?? [];\n                    deltas.push(rawChunk.payload.argsTextDelta);\n                    clientToolArgsTextByToolCallId.set(toolCallId, deltas);\n                  }\n                } else if (rawChunk.type === 'tool-call-input-streaming-end') {\n                  const parsedArgs = parseClientToolArgsFromDeltas(rawChunk.payload.toolCallId);\n                  if (parsedArgs !== undefined) {\n                    endClientToolObservabilitySpan(rawChunk.payload.toolCallId, parsedArgs);\n                  }\n                } else if (rawChunk.type === 'tool-call') {\n                  injectClientToolObservability({\n                    toolCallId: rawChunk.payload.toolCallId,\n                    toolName: rawChunk.payload.toolName,\n                    args: rawChunk.payload.args,\n                    providerExecuted: rawChunk.payload.providerExecuted,\n                    payload: (clientChunk as any).payload as Record<string, unknown> & { observability?: unknown },\n                  });\n                }\n\n                // Forward every chunk to the client ('finish' was rewritten to 'step-finish' above).\n                // Skip 'error' chunks — they are handled internally by the retry/fallback\n                // logic and must not be emitted to the client stream. When all models are\n                // exhausted the fatal error is propagated via emitError (mirrors the regular\n                // agent's deferredErrorChunk pattern).\n                //\n                // Defer 'step-finish': for intermediate steps (hasToolCalls) we save it\n                // on the output so llm-mapping can emit it AFTER tool-result chunks,\n                // matching the regular agent's ordering (tool-result → step-finish).\n                // For final steps (no tool calls) we emit it after the assistant message\n                // is added to messageList.\n                if (pubsub && rawChunk.type !== 'error') {\n                  if (rawChunk.type === 'step-finish') {\n                    deferredStepFinishChunk = clientChunk;\n                  } else {\n                    await emitChunkEvent(pubsub, runId, clientChunk);\n                  }\n                }\n\n                // Collect every chunk for post-stream processLLMResponse hook.\n                // Skipped on cache hit because the processor already handled\n                // the original response, and skipped when no request/response\n                // processors exist to avoid buffering the entire stream in memory.\n                if (!cachedResponse && requestStepRunner) {\n                  collectedChunks.push({\n                    type: rawChunk.type,\n                    payload: 'payload' in rawChunk ? rawChunk.payload : undefined,\n                  });\n                }\n\n                // Process different chunk types — always from the raw chunk so\n                // internal state (tool args, finish reason, usage, metadata) is\n                // never affected by display-layer transforms.\n                switch (rawChunk.type) {\n                  case 'text-delta': {\n                    const payload = rawChunk.payload as TextDeltaPayload;\n                    textDeltas.push(payload.text);\n                    break;\n                  }\n\n                  case 'tool-call-input-streaming-start': {\n                    const tool = toolInputStartToolDef || resolveToolDef(rawChunk.payload.toolName);\n                    if (tool && 'onInputStart' in tool) {\n                      try {\n                        // Pass the actual prompt sent to the model (post-processLLMRequest\n                        // rewrites) instead of rebuilding from messageList, which would\n                        // drop any transient prompt modifications made by input processors.\n                        await (tool as any).onInputStart?.({\n                          toolCallId: rawChunk.payload.toolCallId,\n                          messages: inputMessages,\n                          abortSignal: executionAbortSignal,\n                        });\n                      } catch (error) {\n                        logger?.error?.('Error calling onInputStart', error);\n                      }\n                    }\n                    break;\n                  }\n\n                  case 'tool-call-delta': {\n                    // Prefer the cached tool resolved during the preceding start chunk.\n                    // Fall back to toolName-based resolution for completeness.\n                    const tool =\n                      resolvedToolByCallId.get(rawChunk.payload.toolCallId) ??\n                      (rawChunk.payload.toolName ? resolveToolDef(rawChunk.payload.toolName) : undefined);\n                    if (tool && 'onInputDelta' in tool) {\n                      try {\n                        await (tool as any).onInputDelta?.({\n                          inputTextDelta: rawChunk.payload.argsTextDelta,\n                          toolCallId: rawChunk.payload.toolCallId,\n                          messages: inputMessages,\n                          abortSignal: executionAbortSignal,\n                        });\n                      } catch (error) {\n                        logger?.error?.('Error calling onInputDelta', error);\n                      }\n                    }\n                    break;\n                  }\n\n                  case 'tool-call': {\n                    const payload = rawChunk.payload as ToolCallPayload;\n                    toolCalls.push({\n                      toolCallId: payload.toolCallId,\n                      toolName: payload.toolName,\n                      args: payload.args || {},\n                      providerMetadata: payload.providerMetadata as Record<string, unknown> | undefined,\n                      providerExecuted: payload.providerExecuted,\n                      output: payload.output,\n                      activeTools: currentActiveTools ?? null,\n                    });\n                    break;\n                  }\n\n                  case 'step-finish': {\n                    const payload = rawChunk.payload as any;\n                    // The terminal chunk (rewritten from 'finish' above) carries finishReason\n                    // in stepResult.reason and usage in output.usage.\n                    finishReason = payload.stepResult?.reason || payload.finishReason || 'stop';\n                    usage = payload.output?.usage || payload.usage || usage;\n                    break;\n                  }\n\n                  case 'response-metadata': {\n                    const payload = rawChunk.payload as any;\n                    responseMetadata = {\n                      id: payload.id,\n                      timestamp: payload.timestamp,\n                      modelId: payload.modelId,\n                      headers: payload.headers,\n                    };\n                    break;\n                  }\n\n                  case 'error': {\n                    const payload = rawChunk.payload as any;\n                    const errorMessage = payload?.error?.message || payload?.message || 'LLM execution error';\n                    const errorObj = new Error(errorMessage);\n                    // DON'T emit error event here - we might have fallback models to try\n                    // Error event will be emitted after all models are exhausted\n                    throw errorObj;\n                  }\n                }\n              }\n            } catch (error) {\n              logger?.error?.('Error processing LLM stream', { error, runId });\n\n              const errorObj = error instanceof Error ? error : new Error(String(error));\n              if (modelSpanTracker) {\n                modelSpanTracker.reportGenerationError({ error: errorObj });\n              } else if (modelSpan) {\n                modelSpan.error({ error: errorObj });\n              }\n\n              // If this error was triggered by abortSignal cancellation, surface an\n              // abort event to the client so onAbort callbacks fire and bail out\n              // of the entire fallback/retry flow — a confirmed abort should not\n              // trigger retries on the same model nor fall through to other\n              // models. We deliberately avoid matching on arbitrary error message\n              // text (e.g. /abort/i) because that can fire for retryable provider\n              // errors whose message happens to mention \"abort\"; we only trust\n              // the canonical AbortError name or an actual aborted signal.\n              const isAbort = executionAbortSignal?.aborted === true || errorObj.name === 'AbortError';\n              if (isAbort) {\n                if (pubsub) {\n                  await emitAbortEvent(pubsub, runId, { steps: [] });\n                }\n                // Re-throw so the outer fallback catch also bypasses retry /\n                // processAPIError and terminates the step cleanly.\n                throw errorObj;\n              }\n\n              lastError = errorObj;\n\n              // Try processAPIError before deciding retry/break\n              const registryEntryInner = globalRunRegistry.get(runId);\n              const canRetryErrorInner = maxProcessorRetries !== undefined && processorRetryCount < maxProcessorRetries;\n              if (registryEntryInner?.errorProcessors?.length && canRetryErrorInner) {\n                try {\n                  const runner = new ProcessorRunner({\n                    inputProcessors: registryEntryInner.inputProcessors ?? [],\n                    outputProcessors: registryEntryInner.outputProcessors ?? [],\n                    errorProcessors: registryEntryInner.errorProcessors,\n                    logger: logger as any,\n                    agentName: typedInput.agentName ?? typedInput.agentId,\n                    processorStates: registryEntryInner.processorStates,\n                  });\n                  const currentMessageList = new MessageList();\n                  currentMessageList.deserialize(typedInput.messageListState);\n                  const { retry } = await runner.runProcessAPIError({\n                    error: lastError,\n                    messages: currentMessageList.get.all.db(),\n                    messageList: currentMessageList,\n                    stepNumber: (inputData as any).stepIndex ?? 0,\n                    steps: (inputData as any).accumulatedSteps ?? [],\n                    retryCount: processorRetryCount,\n                    requestContext,\n                  });\n                  if (retry) {\n                    processorRetryCount++;\n                    // Error processor retry should NOT consume a model retry attempt.\n                    // Decrement attempt so the `for` loop increment restores it.\n                    attempt--;\n                    continue;\n                  }\n                } catch (processorError) {\n                  logger?.debug?.(`processAPIError handler failed: ${processorError}`, { runId });\n                }\n              }\n\n              if (attempt < maxRetries) continue; // retry same model\n              break; // exhausted retries, try next model\n            }\n\n            // Check if the stream captured an error (MastraModelOutput swallows errors internally)\n            const streamError = outputStream.error;\n            if (streamError) {\n              const streamErrorObj = streamError instanceof Error ? streamError : new Error(String(streamError));\n              logger?.error?.('Stream captured error', { error: streamErrorObj, runId });\n\n              if (modelSpanTracker) {\n                modelSpanTracker.reportGenerationError({ error: streamErrorObj });\n              } else if (modelSpan) {\n                modelSpan.error({ error: streamErrorObj });\n              }\n\n              // Mirror the iterator catch: a captured stream error that turns out\n              // to be a confirmed abort must short-circuit retry/fallback and\n              // publish the abort event so the client bridge closes cleanly.\n              const isStreamErrorAbort = executionAbortSignal?.aborted === true || streamErrorObj.name === 'AbortError';\n              if (isStreamErrorAbort) {\n                if (pubsub) {\n                  await emitAbortEvent(pubsub, runId, { steps: [] });\n                }\n                throw streamErrorObj;\n              }\n\n              lastError = streamErrorObj;\n              if (attempt < maxRetries) continue; // retry same model\n              break; // exhausted retries, try next model\n            }\n\n            // Run `processLLMResponse` for any input processors that implement\n            // it. Pairs with `processLLMRequest`: lets a processor write the\n            // response to a cache (or sink) using state stashed in the request\n            // hook. Skipped on cache hit — that response did not come from the\n            // model, so writing it back would just rewrite the same value.\n            // Mirrors loop/workflows/agentic-execution/llm-execution-step.ts.\n            if (!cachedResponse && requestStepRunner) {\n              try {\n                await requestStepRunner.runProcessLLMResponse({\n                  chunks: collectedChunks,\n                  model: currentModel,\n                  stepNumber: (inputData as any).accumulatedSteps?.length ?? 0,\n                  steps: (inputData as any).accumulatedSteps ?? [],\n                  warnings,\n                  request,\n                  rawResponse,\n                  fromCache: false,\n                  retryCount: (inputData as any).processorRetryCount ?? 0,\n                  requestContext,\n                  tracingContext: modelSpanTracker?.getTracingContext() ?? tracingContext,\n                  writer: requestStepWriter,\n                  abortSignal: executionAbortSignal,\n                });\n              } catch (error) {\n                if (error instanceof TripWire) {\n                  logger?.warn?.('Streaming response processor tripwire triggered', {\n                    reason: error.message,\n                    processorId: error.processorId,\n                    retry: error.options?.retry,\n                  });\n                  if (pubsub) {\n                    await emitChunkEvent(pubsub, runId, {\n                      type: 'tripwire',\n                      runId,\n                      from: ChunkFrom.AGENT,\n                      payload: {\n                        processorId: error.processorId,\n                        reason: error.message,\n                        retry: error.options?.retry,\n                        metadata: error.options?.metadata,\n                      },\n                    });\n                  }\n                  return {\n                    messageListState: messageList.serialize(),\n                    text: textDeltas.join(''),\n                    toolCalls: [],\n                    stepResult: {\n                      reason: 'tripwire' as const,\n                      warnings,\n                      isContinued: false,\n                    },\n                    metadata: {\n                      modelId: currentModel.modelId,\n                    },\n                    state: typedInput.state,\n                  } satisfies DurableLLMStepOutput;\n                }\n                logger?.error?.('Error in processLLMResponse processors:', error);\n                throw error;\n              }\n            }\n\n            // 12. Add assistant response to message list\n            if (textDeltas.length > 0 || toolCalls.length > 0) {\n              const parts: any[] = [];\n\n              if (textDeltas.length > 0) {\n                parts.push({\n                  type: 'text' as const,\n                  text: textDeltas.join(''),\n                });\n              }\n\n              for (const tc of toolCalls) {\n                parts.push({\n                  type: 'tool-invocation' as const,\n                  toolInvocation: {\n                    state: 'call' as const,\n                    toolCallId: tc.toolCallId,\n                    toolName: tc.toolName,\n                    args: tc.args,\n                  },\n                });\n              }\n\n              const assistantMessage: MastraDBMessage = {\n                id: currentMessageId,\n                role: 'assistant' as const,\n                content: {\n                  format: 2,\n                  parts,\n                },\n                createdAt: new Date(),\n              };\n\n              messageList.add(assistantMessage, 'response');\n\n              // Sync the updated messageList to the in-process registry so\n              // downstream steps (e.g. tool-call.ts's doFlush()) see the\n              // assistant message when persisting before suspension.\n              if (registryEntry) {\n                registryEntry.messageList = messageList;\n              }\n            }\n\n            // 13. Determine if we should continue (has tool calls)\n            const isContinued = toolCalls.length > 0 && finishReason !== 'stop';\n            const hasToolCalls = toolCalls.length > 0;\n\n            // 13.5. Run processOutputStep for output processors (runs AFTER LLM response, BEFORE tool execution)\n            // Mirrors the regular agent's llm-execution-step.ts processOutputStep call\n            if (registryEntry?.outputProcessors && registryEntry.outputProcessors.length > 0) {\n              const outputStepRunner = new ProcessorRunner({\n                inputProcessors: [],\n                outputProcessors: registryEntry.outputProcessors,\n                logger: logger as any,\n                agentName: typedInput.agentName ?? typedInput.agentId,\n                processorStates: registryEntry?.processorStates,\n              });\n\n              const toolCallInfos = toolCalls.map(tc => ({\n                toolName: tc.toolName,\n                toolCallId: tc.toolCallId,\n                args: tc.args,\n              }));\n\n              const outputStepWriter = pubsub\n                ? {\n                    custom: async (data: { type: string }) => {\n                      await emitChunkEvent(pubsub, runId, data as any);\n                    },\n                  }\n                : undefined;\n\n              try {\n                await outputStepRunner.runProcessOutputStep({\n                  steps: (inputData as any).accumulatedSteps ?? [],\n                  messages: messageList.get.all.db(),\n                  messageList,\n                  stepNumber: (inputData as any).accumulatedSteps?.length ?? 0,\n                  finishReason,\n                  providerMetadata: responseMetadata,\n                  toolCalls: toolCallInfos.length > 0 ? toolCallInfos : undefined,\n                  text: textDeltas.join(''),\n                  usage,\n                  requestContext,\n                  writer: outputStepWriter,\n                });\n              } catch (error) {\n                if (error instanceof TripWire) {\n                  // Emit tripwire chunk and return bail response\n                  if (pubsub) {\n                    await emitChunkEvent(pubsub, runId, {\n                      type: 'tripwire',\n                      runId,\n                      from: ChunkFrom.AGENT,\n                      payload: {\n                        reason: error.message,\n                        processorId: error.processorId,\n                        metadata: error.options?.metadata,\n                      },\n                    });\n                  }\n                  return {\n                    messageListState: messageList.serialize(),\n                    text: '',\n                    toolCalls: [],\n                    stepResult: {\n                      reason: 'tripwire' as any,\n                      warnings: [],\n                      isContinued: false,\n                    },\n                    metadata: { modelId: currentModel.modelId },\n                    state: typedInput.state,\n                  };\n                }\n                throw error;\n              }\n            }\n\n            // 13.9. step-finish emission strategy:\n            //\n            // For FINAL steps (no tool calls): emit step-finish now. The assistant\n            // message is in messageList and there are no tool-results to wait for.\n            //\n            // For INTERMEDIATE steps (hasToolCalls): save the step-finish chunk\n            // on the output so llm-mapping can emit it AFTER tool-call.ts has\n            // emitted tool-result chunks. This matches the regular agent's chunk\n            // ordering (tool-result → step-finish) which MastraModelOutput relies\n            // on for correct step content reconstruction.\n            if (pubsub && deferredStepFinishChunk) {\n              if (!hasToolCalls) {\n                // Final step: emit immediately with pre-computed content\n                // Build step content directly from the current step's data rather\n                // than relying on messageList which may contain response messages\n                // from previous iterations after deserialization.\n                const stepContent: Array<{ type: string; [key: string]: unknown }> = [];\n                const currentText = textDeltas.join('');\n                if (currentText) {\n                  stepContent.push({ type: 'text', text: currentText });\n                }\n                deferredStepFinishChunk = {\n                  ...deferredStepFinishChunk,\n                  payload: {\n                    ...deferredStepFinishChunk.payload,\n                    _durableStepContent: stepContent,\n                  },\n                };\n                await emitChunkEvent(pubsub, runId, deferredStepFinishChunk);\n                deferredStepFinishChunk = null;\n              }\n              // else: intermediate step — saved in output.deferredStepFinishChunk below\n            }\n\n            // 14. Export spans if there are tool calls (so tools can be children of model_step)\n            // Don't end the spans yet - they will be ended after tool execution\n            const stepSpanData = hasToolCalls ? modelSpanTracker?.exportCurrentStep() : undefined;\n            const stepFinishPayload = hasToolCalls ? modelSpanTracker?.getPendingStepFinishPayload() : undefined;\n\n            // 15. Build output\n            const output: DurableLLMStepOutput = {\n              messageListState: messageList.serialize(),\n              text: textDeltas.join(''),\n              toolCalls,\n              stepResult: {\n                reason: finishReason as any,\n                warnings,\n                isContinued,\n                totalUsage: usage,\n                headers: rawResponse?.headers,\n                request,\n              },\n              metadata: {\n                id: responseMetadata.id,\n                modelId: responseMetadata.modelId || currentModel.modelId,\n                timestamp: responseMetadata.timestamp || new Date().toISOString(),\n                providerMetadata: responseMetadata,\n                headers: rawResponse?.headers,\n                request,\n              },\n              state: typedInput.state,\n              // Pass span data so tool calls can be children of model_step\n              modelSpanData: hasToolCalls ? modelSpan?.exportSpan?.() : undefined,\n              stepSpanData,\n              stepFinishPayload,\n              // For intermediate steps (hasToolCalls), save the deferred step-finish\n              // chunk so llm-mapping can emit it AFTER tool-result chunks.\n              deferredStepFinishChunk: hasToolCalls ? deferredStepFinishChunk : undefined,\n            };\n\n            // 16. End step span only if there are NO tool calls\n            // If there are tool calls, step span will be ended after tool execution\n            // NOTE: We NEVER close the model span here - it stays open for the entire agent run\n            // and is closed in map-final-output after the agentic loop completes\n            if (!hasToolCalls) {\n              // Close the step span with usage/finish info\n              const pendingPayload = modelSpanTracker?.getPendingStepFinishPayload() as any;\n              if (pendingPayload) {\n                // End step span using the pending payload\n                const stepSpan = modelSpanTracker?.exportCurrentStep();\n                if (stepSpan && observability) {\n                  const rebuiltStepSpan = observability.rebuildSpan(stepSpan);\n                  rebuiltStepSpan?.end({\n                    output: {\n                      text: textDeltas.join(''),\n                      toolCalls: [],\n                    },\n                    attributes: {\n                      usage: pendingPayload.output?.usage,\n                      finishReason: pendingPayload.stepResult?.reason,\n                      isContinued: pendingPayload.stepResult?.isContinued,\n                    },\n                  });\n                }\n              }\n            }\n\n            // Success - return the output\n            return output;\n          } catch (error) {\n            // TripWire errors from processLLMRequest / processLLMResponse are\n            // guardrail/cache processor decisions, not model failures. They\n            // must not be retried or fall back to the next model.\n            if (error instanceof TripWire) {\n              throw error;\n            }\n\n            lastError = error instanceof Error ? error : new Error(String(error));\n\n            // Confirmed aborts bypass all retry / fallback / processAPIError\n            // handling — the user (or upstream caller) explicitly cancelled the\n            // run and we must terminate immediately rather than burning more\n            // attempts or paying for fallback model calls. Re-derive the signal\n            // from the registry (the inner try-scoped `executionAbortSignal` is\n            // out of scope here).\n            const outerRegistryEntry = globalRunRegistry.get(runId);\n            const outerAbortSignal = outerRegistryEntry?.abortSignal ?? abortSignal;\n            const isAbort = outerAbortSignal?.aborted === true || lastError.name === 'AbortError';\n            if (isAbort) {\n              throw lastError;\n            }\n\n            const modelId = modelEntry.config.modelId;\n            logger?.error?.(`Error executing model ${modelId}, attempt ${attempt + 1}/${maxRetries + 1}`, {\n              error: lastError,\n              runId,\n              modelIndex,\n              attempt,\n            });\n\n            // Error processor retry for non-stream errors (e.g. provider\n            // rejections that throw before the stream opens). Stream-level\n            // errors are already handled in the inner catch above.\n            const registryEntry = globalRunRegistry.get(runId);\n            const canRetryError = maxProcessorRetries !== undefined && processorRetryCount < maxProcessorRetries;\n            if (registryEntry?.errorProcessors?.length && canRetryError) {\n              try {\n                const runner = new ProcessorRunner({\n                  inputProcessors: registryEntry.inputProcessors ?? [],\n                  outputProcessors: registryEntry.outputProcessors ?? [],\n                  errorProcessors: registryEntry.errorProcessors,\n                  logger: logger as any,\n                  agentName: typedInput.agentName ?? typedInput.agentId,\n                  processorStates: registryEntry.processorStates,\n                });\n                const currentMessageList = new MessageList();\n                currentMessageList.deserialize(typedInput.messageListState);\n                const { retry } = await runner.runProcessAPIError({\n                  error: lastError,\n                  messages: currentMessageList.get.all.db(),\n                  messageList: currentMessageList,\n                  stepNumber: (inputData as any).stepIndex ?? 0,\n                  steps: (inputData as any).accumulatedSteps ?? [],\n                  retryCount: processorRetryCount,\n                  requestContext,\n                });\n                if (retry) {\n                  processorRetryCount++;\n                  // Error processor retry should NOT consume a model retry attempt.\n                  attempt--;\n                  continue;\n                }\n              } catch (processorError) {\n                logger?.debug?.(`processAPIError handler failed: ${processorError}`, { runId });\n              }\n            }\n\n            if (attempt >= maxRetries) {\n              logger?.debug?.(`Exhausted retries for model ${modelId}, trying next model`, { runId });\n              break;\n            }\n\n            const delayMs = Math.min(1000 * Math.pow(2, attempt), 10000);\n            logger?.debug?.(`Retrying model ${modelId} after ${delayMs}ms`, { runId, attempt });\n            await new Promise(resolve => setTimeout(resolve, delayMs));\n          }\n        } // end retry loop\n      } // end model loop\n\n      // All models exhausted - emit error + step-finish chunks and return a bail response.\n      // This mirrors the regular agent which sets stepResult.reason = 'error' and emits\n      // a deferred error chunk rather than crashing the loop.\n      const fatalError =\n        lastError ?? new Error('Exhausted all fallback models and reached the maximum number of retries.');\n\n      // End the root spans here too — this is the only error path that covers EventedAgent,\n      // whose fire-and-forget launch never sees the failure (so emitError never runs).\n      endRunSpansWithError(runId, fatalError);\n\n      // Emit the deferred error chunk so consumers see it\n      if (pubsub) {\n        await emitChunkEvent(pubsub, runId, {\n          type: 'error',\n          runId,\n          from: ChunkFrom.AGENT,\n          payload: { error: fatalError },\n        });\n\n        // Emit step-finish so MastraModelOutput resolves finishReason to 'error'\n        await emitChunkEvent(pubsub, runId, {\n          type: 'step-finish',\n          runId,\n          from: ChunkFrom.AGENT,\n          payload: {\n            stepResult: {\n              reason: 'error',\n              isContinued: false,\n            },\n            output: {\n              usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },\n            },\n            metadata: {},\n          },\n        });\n      }\n\n      const modelId = modelList[0]?.id ?? 'unknown';\n      return {\n        messageListState: messageList.serialize(),\n        text: '',\n        toolCalls: [],\n        stepResult: {\n          reason: 'error' as any,\n          warnings: [],\n          isContinued: false,\n        },\n        metadata: { modelId },\n        state: typedInput.state,\n      };\n    },\n  });\n}\n","import { z } from 'zod';\nimport { createBackgroundTask } from '../../../../background-tasks/create';\nimport { resolveBackgroundConfig } from '../../../../background-tasks/resolve-config';\nimport type { ToolBackgroundConfig } from '../../../../background-tasks/types';\nimport type { PubSub } from '../../../../events/pubsub';\nimport type { Mastra } from '../../../../mastra';\nimport type { MastraMemory } from '../../../../memory/memory';\nimport type { MemoryConfig } from '../../../../memory/types';\nimport type { ExportedSpan, SpanType } from '../../../../observability';\nimport type { ProcessorState } from '../../../../processors';\nimport { ProcessorRunner } from '../../../../processors/runner';\nimport type { ChunkType } from '../../../../stream/types';\nimport { ChunkFrom } from '../../../../stream/types';\nimport { findProviderToolByName } from '../../../../tools/provider-tool-utils';\nimport { PUBSUB_SYMBOL } from '../../../../workflows/constants';\nimport type { SuspendOptions } from '../../../../workflows/step';\nimport { createStep } from '../../../../workflows/workflow';\nimport type { MessageList } from '../../../message-list';\nimport type { SaveQueueManager } from '../../../save-queue';\nimport { DurableStepIds } from '../../constants';\nimport { globalRunRegistry } from '../../run-registry';\nimport { emitSuspendedEvent, emitChunkEvent } from '../../stream-adapter';\nimport type {\n  DurableToolCallInput,\n  SerializableDurableOptions,\n  AgentSuspendedEventData,\n  RunRegistryEntry,\n} from '../../types';\nimport { applyToolPayloadTransformToChunk } from '../../utils/apply-tool-payload-transform';\nimport { resolveTool, toolRequiresApproval } from '../../utils/resolve-runtime';\nimport { serializeError } from '../../utils/serialize-state';\n\n/**\n * Input schema for the durable tool call step.\n * Each tool call flows through this schema when using .foreach()\n */\nconst durableToolCallInputSchema = z.object({\n  toolCallId: z.string(),\n  toolName: z.string(),\n  args: z.record(z.string(), z.any()),\n  providerMetadata: z.record(z.string(), z.any()).optional(),\n  providerExecuted: z.boolean().optional(),\n  output: z.any().optional(),\n  activeTools: z.array(z.string()).nullable().optional(),\n  // Exported MODEL_STEP span so the TOOL_CALL nests under the LLM call\n  stepSpanData: z.any().optional(),\n});\n\n/**\n * Output schema for the durable tool call step\n */\nconst durableToolCallOutputSchema = durableToolCallInputSchema.extend({\n  result: z.any().optional(),\n  error: z\n    .object({\n      name: z.string(),\n      message: z.string(),\n      stack: z.string().optional(),\n    })\n    .optional(),\n  // Approval decision for a `requireApproval` tool. Without this field Zod would strip the\n  // approval off the step output, so a declined call would lose its `output-denied` marker.\n  approval: z\n    .object({\n      id: z.string(),\n      approved: z.boolean(),\n      reason: z.string().optional(),\n    })\n    .optional(),\n});\n\n/**\n * Flush messages to memory before suspending.\n * Mirrors the base Agent's flushMessagesBeforeSuspension() to ensure\n * the thread exists and all pending messages are persisted.\n */\nasync function flushMessagesBeforeSuspension({\n  saveQueueManager,\n  messageList,\n  memory,\n  threadId,\n  resourceId,\n  memoryConfig,\n  threadExists,\n  onThreadCreated,\n}: {\n  saveQueueManager?: SaveQueueManager;\n  messageList?: MessageList;\n  memory?: MastraMemory;\n  threadId?: string;\n  resourceId?: string;\n  memoryConfig?: MemoryConfig;\n  threadExists?: boolean;\n  onThreadCreated?: () => void;\n}) {\n  if (!saveQueueManager || !messageList || !threadId) {\n    return;\n  }\n\n  try {\n    // Ensure thread exists before flushing messages\n    if (memory && !threadExists && resourceId) {\n      const thread = await memory.getThreadById?.({ threadId });\n      if (!thread) {\n        await memory.createThread?.({\n          threadId,\n          resourceId,\n          memoryConfig,\n        });\n      }\n      onThreadCreated?.();\n    }\n\n    // Flush all pending messages immediately\n    await saveQueueManager.flushMessages(messageList, threadId, memoryConfig);\n  } catch {\n    // Log but don't throw — suspension should proceed even if flush fails\n  }\n}\n\n/**\n * Run a tool-result or tool-error chunk through the run's output processor pipeline.\n * Returns the processed chunk (possibly modified), or `null` if a processor blocked it\n * (in which case a tripwire chunk is emitted instead).\n *\n * Mirrors the regular agent's `processAndEnqueueChunk` in llm-mapping-step.ts.\n */\nasync function processChunkThroughOutputProcessors(\n  chunk: ChunkType,\n  registryEntry: RunRegistryEntry | undefined,\n  pubsub: PubSub | undefined,\n  runId: string,\n  agentName: string,\n  logger: any,\n  messageList?: MessageList,\n): Promise<ChunkType | null> {\n  if (!registryEntry?.outputProcessors?.length || !registryEntry.processorStates) {\n    return chunk;\n  }\n\n  try {\n    const runner = new ProcessorRunner({\n      inputProcessors: [],\n      outputProcessors: registryEntry.outputProcessors,\n      logger,\n      agentName,\n      processorStates: registryEntry.processorStates,\n    });\n\n    const {\n      part: processed,\n      blocked,\n      reason,\n      tripwireOptions,\n      processorId,\n    } = await runner.processPart(\n      chunk,\n      registryEntry.processorStates as Map<string, ProcessorState>,\n      undefined, // observabilityContext\n      registryEntry.requestContext,\n      messageList,\n      0,\n      pubsub\n        ? {\n            custom: async (data: { type: string }) => {\n              await emitChunkEvent(pubsub, runId, data as ChunkType);\n            },\n          }\n        : undefined,\n    );\n\n    if (blocked) {\n      // Emit a tripwire chunk so downstream knows about the block\n      if (pubsub) {\n        await emitChunkEvent(pubsub, runId, {\n          type: 'tripwire',\n          payload: {\n            reason: reason || 'Output processor blocked content',\n            retry: tripwireOptions?.retry,\n            metadata: tripwireOptions?.metadata,\n            processorId,\n          },\n        } as ChunkType);\n      }\n      return null;\n    }\n\n    return (processed as ChunkType) ?? null;\n  } catch (error) {\n    logger?.warn?.(`[DurableAgent] Output processor error for tool chunk: ${error}`);\n    // Fall through: emit the original chunk if processor fails\n    return chunk;\n  }\n}\n\n/**\n * Create a durable tool call step.\n *\n * This step mirrors the base Agent's createToolCallStep pattern:\n * 1. Resolves the tool from the run registry or Mastra\n * 2. Checks if approval is required (global or per-tool)\n * 3. If approval required, emits suspended event, persists messages, and suspends\n * 4. Executes the tool with a suspend callback for in-execution suspension\n * 5. Emits tool-result or tool-error chunks via PubSub\n * 6. Returns the result or error\n *\n * Tool suspension is handled via workflow suspend/resume mechanism:\n * - Tool approval: step suspends with approval payload\n * - In-execution suspension: tool calls suspend() callback, step suspends with suspension payload\n * - Message persistence: messages are flushed before any suspension\n */\nexport function createDurableToolCallStep() {\n  return createStep({\n    id: DurableStepIds.TOOL_CALL,\n    inputSchema: durableToolCallInputSchema,\n    outputSchema: durableToolCallOutputSchema,\n    execute: async params => {\n      const { inputData, mastra, suspend, resumeData: workflowResumeData, requestContext, getInitData } = params;\n\n      // Access pubsub via symbol\n      const pubsub = (params as any)[PUBSUB_SYMBOL] as PubSub | undefined;\n\n      const typedInput = inputData as DurableToolCallInput;\n      const { toolCallId, toolName, args: rawArgs, providerExecuted, output, activeTools } = typedInput;\n\n      // Extract resumeData from tool call arguments (autoResumeSuspendedTools path)\n      // When the LLM auto-resumes a suspended tool, it injects `resumeData` into the\n      // tool call arguments. We extract it here to skip re-suspending for approval.\n      // Mirrors the regular agent's tool-call-step.ts logic.\n      let resumeDataFromArgs: any = undefined;\n      let args: any = rawArgs;\n      if (typeof rawArgs === 'object' && rawArgs !== null) {\n        const { resumeData: resumeDataFromInput, ...argsFromInput } = rawArgs as Record<string, any>;\n        args = argsFromInput;\n        resumeDataFromArgs = resumeDataFromInput;\n      }\n      const resumeData = resumeDataFromArgs ?? workflowResumeData;\n\n      // Get context from init data (the parent workflow input)\n      const initData = getInitData<{\n        runId: string;\n        agentId: string;\n        options: SerializableDurableOptions;\n        state: {\n          threadId?: string;\n          resourceId?: string;\n          memoryConfig?: MemoryConfig;\n          threadExists?: boolean;\n        };\n        agentSpanData?: unknown;\n        modelSpanData?: unknown;\n      }>();\n\n      const { runId, options: agentOptions, state } = initData;\n      const logger = (mastra as any)?.getLogger?.();\n\n      // End the open MODEL_STEP + MODEL_GENERATION + AGENT_RUN as `suspended` before\n      // pausing — stores persist only span-end events, so an un-ended root is dropped if\n      // the run is never resumed. On resume a fresh root is opened (see DurableAgent.resume).\n      const endSpansAsSuspended = (info: { toolCallId?: string; toolName?: string; reason?: string }) => {\n        try {\n          const obs = (mastra as Mastra | undefined)?.observability?.getSelectedInstance({ requestContext });\n          if (!obs) return;\n          const output = {\n            status: 'suspended' as const,\n            reason: info.reason,\n            toolName: info.toolName,\n            toolCallId: info.toolCallId,\n          };\n          // After a prior resume, end the resume spans (registry override) — they are the\n          // active root for this segment. Otherwise end the threaded originals.\n          const reg = globalRunRegistry.get(runId);\n          const agentSpanData = reg?.resumeAgentSpanData ?? initData.agentSpanData;\n          const modelSpanData = reg?.resumeModelSpanData ?? initData.modelSpanData;\n          if (typedInput.stepSpanData) {\n            obs.rebuildSpan(typedInput.stepSpanData as ExportedSpan<SpanType.MODEL_STEP>)?.end({ output });\n          }\n          if (modelSpanData) {\n            obs.rebuildSpan(modelSpanData as ExportedSpan<SpanType.MODEL_GENERATION>)?.end({ output });\n          }\n          if (agentSpanData) {\n            obs.rebuildSpan(agentSpanData as ExportedSpan<SpanType.AGENT_RUN>)?.end({ output });\n          }\n        } catch (error) {\n          // Span bookkeeping must never break suspension.\n          logger?.warn?.(`[DurableAgent] Failed to end spans on suspend: ${error}`);\n        }\n      };\n\n      // If the tool was already executed by the provider, return the output\n      if (providerExecuted && output !== undefined) {\n        return {\n          ...typedInput,\n          result: output,\n        };\n      }\n\n      // 1. Resolve the tool from global registry first, then by provider-tool\n      // model-facing name (e.g. `web_search` resolves to `webSearch` when the\n      // provider tool advertises the snake-case name), then by id, then fall\n      // back to the Mastra-wide tool registry (exact name, provider-tool\n      // name, then by id). Mirrors the non-durable tool-call step.\n      const registryEntry = globalRunRegistry.get(runId);\n      let tool = registryEntry?.tools?.[toolName];\n      let mastraTools: Record<string, any> | undefined;\n\n      if (!tool) {\n        tool = findProviderToolByName(registryEntry?.tools as any, toolName) as typeof tool;\n      }\n\n      if (!tool) {\n        tool = Object.values(registryEntry?.tools ?? {}).find(\n          (t: any) => t && typeof t === 'object' && 'id' in t && t.id === toolName,\n        ) as typeof tool;\n      }\n\n      if (!tool) {\n        tool = resolveTool(toolName, mastra as Mastra);\n      }\n\n      if (!tool && mastra) {\n        mastraTools = (mastra as Mastra).listTools?.() as Record<string, any> | undefined;\n        if (mastraTools) {\n          tool = findProviderToolByName(mastraTools as any, toolName) as typeof tool;\n          if (!tool) {\n            tool = Object.values(mastraTools).find(\n              (t: any) => t && typeof t === 'object' && 'id' in t && t.id === toolName,\n            ) as typeof tool;\n          }\n        }\n      }\n\n      // Resolve the key the tool is registered under for activeTools filtering.\n      // Prefer the per-run registryEntry key (exact name then identity match),\n      // and fall back to the Mastra-wide registry when the tool was resolved\n      // there. Without this fallback, a globally-registered tool like\n      // `webSearch` invoked by its model-facing name `web_search` would be\n      // hidden whenever `activeTools` was set, because the key from\n      // registryEntry.tools would be `undefined`.\n      const toolKey = registryEntry?.tools?.[toolName]\n        ? toolName\n        : (Object.entries(registryEntry?.tools ?? {}).find(([, registeredTool]) => registeredTool === tool)?.[0] ??\n          Object.entries(mastraTools ?? {}).find(([, registeredTool]) => registeredTool === tool)?.[0]);\n      const effectiveActiveTools = activeTools === null ? undefined : (activeTools ?? agentOptions.activeTools);\n      const activeToolKey = toolKey ?? toolName;\n      const isHiddenByActiveTools = effectiveActiveTools !== undefined && !effectiveActiveTools.includes(activeToolKey);\n\n      if (!tool || isHiddenByActiveTools) {\n        const availableToolNames = effectiveActiveTools ?? Object.keys(registryEntry?.tools ?? {});\n        const availableToolsStr =\n          availableToolNames.length > 0 ? ` Available tools: ${availableToolNames.join(', ')}` : '';\n        const error = {\n          name: 'ToolNotFoundError',\n          message: `Tool \"${toolName}\" not found.${availableToolsStr}. Call tools by their exact name only — never add prefixes, namespaces, or colons.`,\n        };\n        if (pubsub) {\n          await emitChunkEvent(pubsub, runId, {\n            type: 'tool-error',\n            runId,\n            from: ChunkFrom.AGENT,\n            payload: { toolCallId, toolName, args, error },\n          });\n        }\n        return {\n          ...typedInput,\n          error,\n        };\n      }\n\n      // Get memory-related state for message persistence\n      const saveQueueManager = registryEntry?.saveQueueManager;\n      const memory = registryEntry?.memory;\n      const workspace = registryEntry?.workspace;\n      let threadExists = state?.threadExists ?? false;\n\n      // Reconstruct MessageList from workflow state if available\n      // Note: In foreach mode, the message list from the registry may be available\n      // but for durability, we access what's available through the registry\n      let messageList: MessageList | undefined;\n      // For local execution, the globalRunRegistry might have an ExtendedRunRegistry entry\n      // that stores the messageList. We cast and check safely.\n      const extendedEntry = globalRunRegistry.get(runId) as any;\n      if (extendedEntry?.messageList) {\n        messageList = extendedEntry.messageList;\n      }\n\n      const doFlush = async () => {\n        await flushMessagesBeforeSuspension({\n          saveQueueManager,\n          messageList,\n          memory,\n          threadId: state?.threadId,\n          resourceId: state?.resourceId,\n          memoryConfig: state?.memoryConfig,\n          threadExists,\n          onThreadCreated: () => {\n            threadExists = true;\n          },\n        });\n      };\n\n      // 2. Check if tool requires approval. Prefer the live policy on the\n      //    in-process registry (which preserves the function form with real\n      //    toolName/args); fall back to the JSON-safe boolean shadow on the\n      //    serialized workflow input for cross-process engines.\n      const registryRequireToolApproval = registryEntry?.requireToolApproval;\n      const effectiveRequireToolApproval =\n        registryRequireToolApproval !== undefined ? registryRequireToolApproval : agentOptions.requireToolApproval;\n      const requiresApproval = await toolRequiresApproval(tool, effectiveRequireToolApproval, args, {\n        toolName,\n        requestContext: registryEntry?.requestContext\n          ? Object.fromEntries(\n              [...registryEntry.requestContext.entries()].filter(([key]) => key !== '__mastra_requireToolApproval'),\n            )\n          : undefined,\n        workspace: registryEntry?.workspace,\n      });\n\n      // Add suspended-tool / pending-approval metadata to the last assistant\n      // message so `extractSuspendedToolsFromMessages` can detect it on the\n      // next turn (autoResumeSuspendedTools) or on page-refresh resume.\n      // Mirrors the regular agent's `addToolMetadata()`.\n      const addToolMetadata = (opts: {\n        type: 'approval' | 'suspension';\n        resumeSchema?: string;\n        suspendPayload?: unknown;\n      }) => {\n        if (!messageList) return;\n        const metadataKey = opts.type === 'suspension' ? 'suspendedTools' : 'pendingToolApprovals';\n        const responseMessages = messageList.get.response.db();\n        const lastAssistantMessage = [...responseMessages].reverse().find(msg => msg.role === 'assistant');\n        if (!lastAssistantMessage?.content) return;\n\n        let metadata: Record<string, any>;\n        if (\n          typeof lastAssistantMessage.content.metadata === 'object' &&\n          lastAssistantMessage.content.metadata !== null\n        ) {\n          metadata = lastAssistantMessage.content.metadata as Record<string, any>;\n        } else {\n          metadata = {};\n          lastAssistantMessage.content.metadata = metadata;\n        }\n        metadata[metadataKey] = metadata[metadataKey] || {};\n        metadata[metadataKey][toolCallId] = {\n          toolCallId,\n          toolName,\n          args,\n          type: opts.type,\n          runId,\n          ...(opts.type === 'suspension' ? { suspendPayload: opts.suspendPayload } : {}),\n          ...(opts.resumeSchema ? { resumeSchema: opts.resumeSchema } : {}),\n        };\n      };\n\n      // Remove suspended-tool / pending-approval metadata from the last\n      // assistant message when a tool is being resumed. This mirrors the\n      // regular agent's `removeToolMetadata()`.\n      const removeToolMetadata = async (type: 'suspension' | 'approval') => {\n        if (!messageList) return;\n        const metadataKey = type === 'suspension' ? 'suspendedTools' : 'pendingToolApprovals';\n        const allMessages = messageList.get.all.db();\n        const lastAssistantMessage = [...allMessages].reverse().find(msg => {\n          const content = msg.content;\n          if (!content) return false;\n          const meta =\n            typeof content.metadata === 'object' && content.metadata !== null\n              ? (content.metadata as Record<string, any>)\n              : undefined;\n          return (\n            !!meta?.[metadataKey]?.[toolCallId] ||\n            Object.values(meta?.[metadataKey] ?? {}).some(\n              (e: any) => e?.toolCallId === toolCallId || e?.toolName === toolName,\n            )\n          );\n        });\n        if (!lastAssistantMessage?.content) return;\n        const meta =\n          typeof lastAssistantMessage.content.metadata === 'object' && lastAssistantMessage.content.metadata !== null\n            ? (lastAssistantMessage.content.metadata as Record<string, any>)\n            : undefined;\n        if (!meta?.[metadataKey]) return;\n        // Resolve key: exact toolCallId, then by entry toolCallId, then by toolName\n        const entries = meta[metadataKey] as Record<string, any>;\n        const key = entries[toolCallId]\n          ? toolCallId\n          : (Object.keys(entries).find(k => entries[k]?.toolCallId === toolCallId) ??\n            Object.keys(entries).find(k => entries[k]?.toolName === toolName) ??\n            (entries[toolName] ? toolName : undefined));\n        if (key) {\n          delete entries[key];\n          if (Object.keys(entries).length === 0) {\n            delete meta[metadataKey];\n          }\n        }\n        // Flush to persist the metadata removal\n        await doFlush();\n      };\n\n      if (requiresApproval && !resumeData) {\n        const resumeSchema = JSON.stringify({\n          type: 'object',\n          properties: {\n            approved: { type: 'boolean' },\n          },\n          required: ['approved'],\n        });\n\n        // Emit approval chunk via PubSub (mirrors base agent's controller.enqueue)\n        if (pubsub) {\n          await emitChunkEvent(pubsub, runId, {\n            type: 'tool-call-approval',\n            runId,\n            from: ChunkFrom.AGENT,\n            payload: { toolCallId, toolName, args, resumeSchema },\n          });\n        }\n\n        // Emit suspended event for the stream adapter\n        if (pubsub) {\n          await emitSuspendedEvent(pubsub, runId, {\n            toolCallId,\n            toolName,\n            args,\n            type: 'approval',\n            resumeSchema,\n          });\n        }\n\n        // Add approval metadata to message before persisting\n        addToolMetadata({ type: 'approval', resumeSchema });\n\n        // Flush messages before suspension\n        await doFlush();\n\n        // End the trace's open spans as suspended before pausing.\n        endSpansAsSuspended({ toolCallId, toolName, reason: 'approval' });\n\n        // Suspend and wait for approval\n        return suspend(\n          {\n            type: 'approval',\n            toolCallId,\n            toolName,\n            args,\n          },\n          {\n            resumeLabel: toolCallId,\n          },\n        );\n      }\n\n      // Check if resuming from approval — only when the tool actually requires\n      // approval.  Without the `requiresApproval` guard, generic resume data that\n      // happens to contain an `approved` field (e.g. from context.agent.suspend())\n      // would be misinterpreted as an approval response.\n      if (\n        requiresApproval &&\n        resumeData &&\n        typeof resumeData === 'object' &&\n        resumeData !== null &&\n        'approved' in resumeData\n      ) {\n        // Remove approval metadata since we're resuming (either approved or declined)\n        await removeToolMetadata('approval');\n\n        if (!(resumeData as { approved: boolean }).approved) {\n          // Return the approval decision (not a `result` string) so it persists as\n          // `state: 'output-denied'` with `approval`. The denial reason carries the\n          // existing string so downstream consumers/UI keep the same message.\n          return {\n            ...typedInput,\n            approval: {\n              id: toolCallId,\n              approved: false,\n              reason: 'Tool call was not approved by the user',\n            },\n          };\n        }\n      }\n\n      // When an approval-gated tool is approved on resume, tag the resolved output with the\n      // approval decision so it round-trips through persistence as `approval: { approved: true }`.\n      const approvalGrant =\n        requiresApproval &&\n        resumeData &&\n        typeof resumeData === 'object' &&\n        resumeData !== null &&\n        (resumeData as { approved?: boolean }).approved === true\n          ? ({ approval: { id: toolCallId, approved: true as const } } as const)\n          : undefined;\n\n      // Check if resuming from in-execution suspension\n      // Pass resumeData through to the tool so it can continue from where it left off.\n      // For approval-gated tools, the approval check above already handled the\n      // `approved` field, so the tool executes fresh (not as a \"from-suspension\"\n      // resume).  For non-approval tools, ANY resume data is forwarded.\n      const isResumingFromSuspension =\n        resumeData &&\n        typeof resumeData === 'object' &&\n        resumeData !== null &&\n        (requiresApproval ? !('approved' in resumeData) : true);\n\n      // Remove suspension metadata when resuming from an in-execution (non-approval-decision) suspension.\n      // `isResumingFromSuspension` already excludes the approval-decision case above.\n      if (isResumingFromSuspension) {\n        await removeToolMetadata('suspension');\n      }\n\n      // 3. Check for background task execution\n      const bgManager = registryEntry?.backgroundTaskManager;\n      const bgConfig = registryEntry?.backgroundTasksConfig;\n      const toolBgConfig = (tool as any).backgroundConfig as ToolBackgroundConfig | undefined;\n      const llmBgOverrides =\n        typeof args === 'object' && args !== null && '_background' in args ? (args as any)._background : undefined;\n\n      // Strip _background from args before execution (same as non-durable path)\n      const cleanedArgs = { ...args };\n      if ('_background' in cleanedArgs) {\n        delete (cleanedArgs as any)._background;\n      }\n\n      // Fire onInputAvailable lifecycle hook before execution (matches non-durable path).\n      if (tool && 'onInputAvailable' in tool && typeof (tool as any).onInputAvailable === 'function') {\n        try {\n          await (tool as any).onInputAvailable({\n            toolCallId,\n            input: cleanedArgs,\n            messages: messageList ? messageList.get.input.aiV5.model() : [],\n          });\n        } catch (hookError) {\n          logger?.error?.('Error calling onInputAvailable', hookError);\n        }\n      }\n\n      // Execute the tool\n      if (!tool.execute) {\n        return {\n          ...typedInput,\n          result: undefined,\n          ...(approvalGrant ?? {}),\n        };\n      }\n\n      // Rebuild the forwarded model_step span and pass it as the tool's tracing context so\n      // the TOOL_CALL span nests under the LLM call (matches the non-durable path).\n      const observability = (mastra as Mastra | undefined)?.observability?.getSelectedInstance({ requestContext });\n      const stepSpan =\n        typedInput.stepSpanData && observability\n          ? observability.rebuildSpan(typedInput.stepSpanData as ExportedSpan<SpanType.MODEL_STEP>)\n          : undefined;\n      const toolTracingContext = stepSpan ? { currentSpan: stepSpan } : undefined;\n\n      // Track whether the tool's suspend callback was invoked so we can skip\n      // emitting a spurious tool-result after tool.execute() returns (the\n      // workflow engine's suspend() sets an internal flag but does not throw,\n      // so execution continues past the suspend call).\n      let wasSuspended = false;\n\n      const toolOptions = {\n        toolCallId,\n        messages: [],\n        workspace,\n        requestContext,\n        tracingContext: toolTracingContext,\n        // Forward per-call ActorSignal so FGA checks inside tool execution\n        // see the same actor as the non-durable Agent path.\n        actor: agentOptions?.actor,\n        resumeData: isResumingFromSuspension ? resumeData : undefined,\n        // Provide outputWriter so context.writer.write() / context.writer.custom()\n        // emit chunks through pubsub (matching the regular agent's tool streaming).\n        outputWriter: pubsub\n          ? async (chunk: any) => {\n              await emitChunkEvent(pubsub, runId, chunk as ChunkType);\n            }\n          : undefined,\n\n        // In-execution suspend callback — allows tools to suspend mid-execution\n        suspend: async (suspendPayload: any, suspendOptions?: SuspendOptions) => {\n          wasSuspended = true;\n          if (suspendOptions?.requireToolApproval) {\n            // Tool is requesting approval during execution\n            const approvalResumeSchema = JSON.stringify({\n              type: 'object',\n              properties: {\n                approved: { type: 'boolean' },\n              },\n              required: ['approved'],\n            });\n\n            if (pubsub) {\n              await emitChunkEvent(pubsub, runId, {\n                type: 'tool-call-approval',\n                runId,\n                from: ChunkFrom.AGENT,\n                payload: { toolCallId, toolName, args, resumeSchema: approvalResumeSchema },\n              });\n            }\n\n            if (pubsub) {\n              await emitSuspendedEvent(pubsub, runId, {\n                toolCallId,\n                toolName,\n                args,\n                type: 'approval',\n                resumeSchema: approvalResumeSchema,\n              });\n            }\n\n            // Add approval metadata to message before persisting\n            addToolMetadata({ type: 'approval', resumeSchema: approvalResumeSchema });\n\n            await doFlush();\n\n            endSpansAsSuspended({ toolCallId, toolName, reason: 'approval' });\n\n            return suspend(\n              {\n                type: 'approval',\n                requireToolApproval: { toolCallId, toolName, args },\n              },\n              { resumeLabel: toolCallId },\n            );\n          } else {\n            // General tool suspension (e.g., tool calls context.agent.suspend())\n            const suspendedEventData: AgentSuspendedEventData = {\n              toolCallId,\n              toolName,\n              args,\n              suspendPayload,\n              type: 'suspension',\n              resumeSchema: suspendOptions?.resumeSchema,\n            };\n\n            if (pubsub) {\n              await emitChunkEvent(pubsub, runId, {\n                type: 'tool-call-suspended',\n                runId,\n                from: ChunkFrom.AGENT,\n                payload: {\n                  toolCallId,\n                  toolName,\n                  suspendPayload,\n                  args,\n                  resumeSchema: suspendOptions?.resumeSchema,\n                },\n              });\n\n              await emitSuspendedEvent(pubsub, runId, suspendedEventData);\n            }\n\n            // Add suspension metadata to message before persisting\n            addToolMetadata({\n              type: 'suspension',\n              suspendPayload,\n              resumeSchema: suspendOptions?.resumeSchema,\n            });\n\n            await doFlush();\n\n            endSpansAsSuspended({ toolCallId, toolName, reason: 'suspension' });\n\n            return suspend(\n              {\n                type: 'suspension',\n                toolCallSuspended: suspendPayload,\n                toolCallId,\n                toolName,\n                resumeLabel: suspendOptions?.resumeLabel,\n              },\n              { resumeLabel: toolCallId },\n            );\n          }\n        },\n      };\n\n      // Resolve whether to run in background using the shared config resolver\n      if (bgManager && !bgConfig?.disabled && typeof cleanedArgs === 'object' && cleanedArgs !== null) {\n        const bgResolved = resolveBackgroundConfig({\n          llmBgOverrides,\n          toolName,\n          toolConfig: toolBgConfig,\n          agentConfig: bgConfig,\n          managerConfig: bgManager.config,\n        });\n\n        if (bgResolved.runInBackground) {\n          try {\n            const bgTask = createBackgroundTask(bgManager, {\n              toolName,\n              toolCallId,\n              args: cleanedArgs,\n              agentId: initData.agentId,\n              threadId: state?.threadId,\n              resourceId: state?.resourceId,\n              runId,\n              timeoutMs: bgResolved.timeoutMs,\n              maxRetries: bgResolved.maxRetries,\n              context: {\n                executor: {\n                  execute: async (taskArgs: any, taskContext: any) => {\n                    return tool.execute!(taskArgs, {\n                      ...toolOptions,\n                      ...(taskContext?.resumeData !== undefined ? { resumeData: taskContext.resumeData } : {}),\n                      suspend: async (data?: unknown, options?: SuspendOptions) => {\n                        await toolOptions.suspend?.(data, options);\n                        return taskContext?.suspend?.(data, options);\n                      },\n                    });\n                  },\n                },\n                onChunk: (chunk: any) => {\n                  if (!pubsub) return;\n                  try {\n                    const bgRunId = chunk.payload.runId;\n                    // Emit tool-call chunk so UIs can render the invocation inline\n                    if (bgRunId !== runId || (bgRunId === runId && resumeData)) {\n                      void emitChunkEvent(pubsub, bgRunId, {\n                        type: 'tool-call',\n                        runId: bgRunId,\n                        from: ChunkFrom.AGENT,\n                        payload: {\n                          toolCallId: chunk.payload.toolCallId,\n                          toolName: chunk.payload.toolName,\n                          args: cleanedArgs,\n                        },\n                      });\n                    }\n\n                    if (chunk.type === 'background-task-completed') {\n                      void emitChunkEvent(pubsub, bgRunId, {\n                        type: 'tool-result',\n                        runId: bgRunId,\n                        from: ChunkFrom.AGENT,\n                        payload: {\n                          toolCallId: chunk.payload.toolCallId,\n                          toolName: chunk.payload.toolName,\n                          args: cleanedArgs,\n                          result: chunk.payload.result,\n                        },\n                      });\n                    } else if (chunk.type === 'background-task-failed') {\n                      void emitChunkEvent(pubsub, bgRunId, {\n                        type: 'tool-error',\n                        runId: bgRunId,\n                        from: ChunkFrom.AGENT,\n                        payload: {\n                          toolCallId: chunk.payload.toolCallId,\n                          toolName: chunk.payload.toolName,\n                          error: chunk.payload.error,\n                          args: cleanedArgs,\n                        },\n                      });\n                    }\n                  } catch {\n                    // PubSub may be closed — ignore\n                  }\n                },\n\n                onResult: async (params: any) => {\n                  if (!messageList) return;\n\n                  const result =\n                    params.status === 'failed'\n                      ? `Background task failed: ${params.error?.message ?? 'Unknown error'}`\n                      : params.result;\n\n                  const updated = messageList.updateToolInvocation(\n                    {\n                      type: 'tool-invocation',\n                      toolInvocation: {\n                        state: 'result',\n                        toolCallId: params.toolCallId,\n                        toolName: params.toolName,\n                        args: cleanedArgs,\n                        result,\n                        // Preserve the approval decision for an approved approval-gated tool that\n                        // ran in the background so it round-trips on recall, matching the sync path.\n                        ...(approvalGrant ?? {}),\n                      },\n                    },\n                    {\n                      backgroundTasks: {\n                        [params.toolCallId]: {\n                          startedAt: params.startedAt,\n                          completedAt: params.completedAt,\n                          taskId: params.taskId,\n                        },\n                      },\n                    },\n                  );\n\n                  if (!updated) {\n                    if (params.runId !== runId || (params.runId === runId && resumeData)) {\n                      messageList.add(\n                        [\n                          {\n                            role: 'tool' as const,\n                            type: 'tool-call',\n                            id: crypto.randomUUID(),\n                            createdAt: new Date(),\n                            content: [\n                              {\n                                type: 'tool-call' as const,\n                                toolCallId: params.toolCallId,\n                                toolName: params.toolName,\n                                args: cleanedArgs,\n                              },\n                            ],\n                          },\n                        ],\n                        'response',\n                      );\n                    }\n                    messageList.add(\n                      [\n                        {\n                          role: 'tool' as const,\n                          content: [\n                            {\n                              type: 'tool-result' as const,\n                              toolCallId: params.toolCallId,\n                              toolName: params.toolName,\n                              result,\n                              isError: params.status === 'failed',\n                            },\n                          ],\n                        },\n                      ],\n                      'response',\n                    );\n                  }\n\n                  if (saveQueueManager && state?.threadId) {\n                    await saveQueueManager.flushMessages(messageList, state.threadId, state.memoryConfig);\n                  }\n                },\n\n                onExecution: async (params: any) => {\n                  if (!messageList) return;\n\n                  messageList.updateMessageMetadataByToolCallId(params.toolCallId, {\n                    backgroundTasks: {\n                      [params.toolCallId]: {\n                        startedAt: params.startedAt,\n                        suspendedAt: params.suspendedAt,\n                        taskId: params.taskId,\n                      },\n                    },\n                  });\n                },\n\n                onComplete: toolBgConfig?.onComplete ?? bgConfig?.onTaskComplete,\n                onFailed: toolBgConfig?.onFailed ?? bgConfig?.onTaskFailed,\n              },\n            });\n\n            // If the agent is resuming this tool call and a previously-suspended\n            // bg task exists for this toolCallId+runId, resume the bg task with\n            // the agent-resume payload instead of dispatching a fresh one.\n            const isSuspendedBgResume =\n              isResumingFromSuspension && resumeData && typeof resumeData === 'object' && resumeData !== null;\n            if (isSuspendedBgResume) {\n              const isSuspended = await bgTask.checkIfSuspended({\n                toolCallId,\n                runId,\n                agentId: initData.agentId,\n                threadId: state?.threadId,\n                resourceId: state?.resourceId,\n                toolName,\n              });\n              if (isSuspended) {\n                const task = await bgTask.resume(resumeData);\n                return {\n                  ...typedInput,\n                  args: cleanedArgs,\n                  result: `Background task resumed. Task ID: ${task.id}. The tool \"${toolName}\" is running in the background. You will be notified when it completes.`,\n                };\n              }\n            }\n\n            const { task, fallbackToSync } = await bgTask.dispatch();\n\n            if (!fallbackToSync) {\n              // Emit background-task-started chunk via PubSub\n              if (pubsub) {\n                await emitChunkEvent(pubsub, runId, {\n                  type: 'background-task-started' as any,\n                  runId,\n                  from: ChunkFrom.AGENT,\n                  payload: {\n                    taskId: task.id,\n                    toolName,\n                    toolCallId,\n                  },\n                });\n              }\n\n              // Return placeholder result so the LLM can continue\n              return {\n                ...typedInput,\n                args: cleanedArgs,\n                result: `Background task started. Task ID: ${task.id}. The tool \"${toolName}\" is running in the background. You will be notified when it completes.`,\n                ...(approvalGrant ?? {}),\n              };\n            }\n            // fallbackToSync: concurrency limit hit, fall through to synchronous execution\n          } catch (bgError) {\n            logger?.debug?.(\n              `[DurableAgent] Background task dispatch failed for ${toolName}, falling back to sync: ${bgError}`,\n            );\n          }\n        }\n      }\n\n      try {\n        const result = await tool.execute(cleanedArgs, toolOptions);\n\n        // Fire onOutput lifecycle hook after successful execution (matches non-durable path).\n        if (tool && 'onOutput' in tool && typeof (tool as any).onOutput === 'function') {\n          try {\n            await (tool as any).onOutput({\n              toolCallId,\n              toolName,\n              output: result,\n            });\n          } catch (hookError) {\n            logger?.error?.('Error calling onOutput', hookError);\n          }\n        }\n\n        // Emit tool-result chunk (non-fatal — result is returned regardless).\n        // Skip emission when the tool called suspend() — the workflow engine's\n        // suspend() sets a flag but does NOT throw, so execution continues past\n        // the suspend call and tool.execute() returns undefined. Emitting a\n        // tool-result with undefined would produce a spurious entry that\n        // confuses downstream consumers (e.g. MastraModelOutput.toolResults).\n        if (pubsub && !wasSuspended) {\n          try {\n            const resultChunk = await applyToolPayloadTransformToChunk(\n              {\n                type: 'tool-result' as const,\n                runId,\n                from: ChunkFrom.AGENT,\n                payload: { toolCallId, toolName, args, result },\n              },\n              {\n                policy: registryEntry?.toolPayloadTransform,\n                tools: registryEntry?.tools,\n                logger: logger as any,\n              },\n            );\n            // Run through output processors (tripwire/blocking/redaction)\n            const processed = await processChunkThroughOutputProcessors(\n              resultChunk,\n              registryEntry,\n              pubsub,\n              runId,\n              initData.agentId,\n              logger,\n              messageList,\n            );\n            if (processed) {\n              await emitChunkEvent(pubsub, runId, processed);\n            }\n          } catch (emitError) {\n            logger?.warn?.(`[DurableAgent] Failed to emit tool-result chunk for ${toolName}: ${emitError}`);\n          }\n        }\n\n        return {\n          ...typedInput,\n          result,\n          ...(approvalGrant ?? {}),\n        };\n      } catch (error) {\n        const toolError = serializeError(error);\n\n        // Emit tool-error chunk (non-fatal — error result is returned regardless)\n        if (pubsub && !wasSuspended) {\n          try {\n            const errorChunk = await applyToolPayloadTransformToChunk(\n              {\n                type: 'tool-error' as const,\n                runId,\n                from: ChunkFrom.AGENT,\n                payload: { toolCallId, toolName, args, error: toolError },\n              },\n              {\n                policy: registryEntry?.toolPayloadTransform,\n                tools: registryEntry?.tools,\n                logger: logger as any,\n              },\n            );\n            // Run through output processors (tripwire/blocking/redaction)\n            const processed = await processChunkThroughOutputProcessors(\n              errorChunk,\n              registryEntry,\n              pubsub,\n              runId,\n              initData.agentId,\n              logger,\n              messageList,\n            );\n            if (processed) {\n              await emitChunkEvent(pubsub, runId, processed);\n            }\n          } catch (emitError) {\n            logger?.warn?.(`[DurableAgent] Failed to emit tool-error chunk for ${toolName}: ${emitError}`);\n          }\n        }\n\n        return {\n          ...typedInput,\n          error: toolError,\n          ...(approvalGrant ?? {}),\n        };\n      }\n    },\n  });\n}\n","import { z } from 'zod';\nimport type { PubSub } from '../../../../events/pubsub';\nimport type { Mastra } from '../../../../mastra';\nimport { EntityType, SpanType } from '../../../../observability';\nimport type { ExportedSpan } from '../../../../observability';\nimport { PUBSUB_SYMBOL } from '../../../../workflows/constants';\nimport { createStep } from '../../../../workflows/workflow';\nimport { MessageList } from '../../../message-list';\nimport { DurableStepIds } from '../../constants';\nimport { globalRunRegistry } from '../../run-registry';\nimport { emitChunkEvent } from '../../stream-adapter';\nimport type {\n  DurableLLMStepOutput,\n  DurableToolCallOutput,\n  DurableAgenticExecutionOutput,\n  SerializableDurableState,\n} from '../../types';\n\n/**\n * Input schema for the durable LLM mapping step.\n * This combines the LLM execution output with tool call results.\n */\nconst durableLLMMappingInputSchema = z.object({\n  llmOutput: z.any(), // DurableLLMStepOutput\n  toolResults: z.array(z.any()), // DurableToolCallOutput[]\n  runId: z.string(),\n  agentId: z.string(),\n  messageId: z.string(),\n  state: z.any(), // SerializableDurableState\n});\n\n/**\n * Output schema for the durable LLM mapping step\n */\nconst durableLLMMappingOutputSchema = z.object({\n  messageListState: z.any(),\n  messageId: z.string(),\n  stepResult: z.any(),\n  toolResults: z.array(z.any()),\n  output: z.object({\n    text: z.string().optional(),\n    toolCalls: z.array(z.any()).optional(),\n    usage: z.any(),\n    steps: z.array(z.any()),\n  }),\n  state: z.any(),\n  delegationBailed: z.boolean().optional(),\n  processorRetryCount: z.number().optional(),\n  processorRetryFeedback: z.string().optional(),\n});\n\n/**\n * Normalize modelOutput from toModelOutput() into the AI SDK's\n * LanguageModelV2ToolResultOutput shape.\n *\n * The AI SDK's content array only accepts type 'text' or 'media'.\n * Mastra's createTool docs show type 'image-url' as a convenience shorthand,\n * so we normalize that here into type 'media' with the correct structure.\n *\n * Mirrors the normalizeModelOutput in llm-mapping-step.ts (regular agent).\n */\nfunction normalizeModelOutput(output: unknown): unknown {\n  if (output == null || typeof output !== 'object') return output;\n\n  const obj = output as Record<string, unknown>;\n  if (obj.type !== 'content' || !Array.isArray(obj.value)) return output;\n\n  return {\n    ...obj,\n    value: (obj.value as unknown[]).map(item => {\n      if (item == null || typeof item !== 'object') return item;\n      const part = item as Record<string, unknown>;\n      if (part.type === 'image-url' && typeof part.url === 'string') {\n        const mediaType =\n          typeof part.mediaType === 'string' && part.mediaType\n            ? part.mediaType\n            : part.url.startsWith('data:')\n              ? part.url.slice(5, part.url.indexOf(';')) || 'image/jpeg'\n              : 'image/jpeg';\n        return { type: 'media', data: part.url, mediaType };\n      }\n      if (part.type === 'image-data' && typeof part.data === 'string') {\n        return { type: 'media', data: part.data, mediaType: part.mediaType ?? 'image/jpeg' };\n      }\n      if (part.type === 'file-data' && typeof part.data === 'string') {\n        return { type: 'media', data: part.data, mediaType: part.mediaType ?? 'application/octet-stream' };\n      }\n      return part;\n    }),\n  };\n}\n\n/**\n * Create a durable LLM mapping step.\n *\n * This step:\n * 1. Takes the LLM execution output and tool call results\n * 2. Updates the message list with tool results\n * 3. Combines everything into the final iteration output\n *\n * This is the \"merge\" step that combines parallel tool call results\n * back into a single coherent state.\n */\nexport function createDurableLLMMappingStep() {\n  return createStep({\n    id: DurableStepIds.LLM_MAPPING,\n    inputSchema: durableLLMMappingInputSchema,\n    outputSchema: durableLLMMappingOutputSchema,\n    execute: async params => {\n      const { inputData, mastra, requestContext } = params;\n      const {\n        llmOutput,\n        toolResults,\n        runId: _runId,\n        agentId: _agentId,\n        messageId,\n        state,\n      } = inputData as {\n        llmOutput: DurableLLMStepOutput;\n        toolResults: DurableToolCallOutput[];\n        runId: string;\n        agentId: string;\n        messageId: string;\n        state: SerializableDurableState;\n      };\n\n      // 1. Deserialize message list\n      const messageList = new MessageList({\n        threadId: state.threadId,\n        resourceId: state.resourceId,\n      });\n      messageList.deserialize(llmOutput.messageListState);\n\n      // A declined approval has no `result` but is fully resolved: persist it as `output-denied`\n      // with the approval decision (rather than as a successful `result`) so it round-trips on\n      // recall. Mirrors the non-durable llm-mapping-step.\n      const isDeniedApproval = (toolResult: { approval?: { approved?: boolean } }) =>\n        toolResult?.approval?.approved === false;\n\n      // 2. Add tool results to message list\n      // Look up tools from the in-process registry for toModelOutput support\n      const registryEntry = globalRunRegistry.get(_runId);\n      const registryTools = registryEntry?.tools;\n\n      // Rebuild the MODEL_STEP span early so MAPPING child spans can nest under it\n      let stepSpan:\n        | ReturnType<\n            NonNullable<\n              ReturnType<NonNullable<NonNullable<Mastra['observability']>['getSelectedInstance']>>\n            >['rebuildSpan']\n          >\n        | undefined;\n      if (llmOutput.stepSpanData) {\n        try {\n          const observability = (mastra as Mastra | undefined)?.observability?.getSelectedInstance({ requestContext });\n          stepSpan = observability?.rebuildSpan(llmOutput.stepSpanData as ExportedSpan<SpanType.MODEL_STEP>);\n        } catch {\n          // Span bookkeeping must never break the merge step.\n        }\n      }\n\n      if (toolResults.length > 0) {\n        for (const toolResult of toolResults) {\n          if (isDeniedApproval(toolResult)) {\n            messageList.updateToolInvocation({\n              type: 'tool-invocation' as const,\n              toolInvocation: {\n                state: 'output-denied' as const,\n                toolCallId: toolResult.toolCallId,\n                toolName: toolResult.toolName,\n                args: toolResult.args,\n                approval: {\n                  id: toolResult.approval!.id,\n                  approved: false,\n                  reason: toolResult.approval!.reason,\n                },\n              },\n            });\n            continue;\n          }\n\n          const result = toolResult.error ? toolResult.error.message : toolResult.result;\n\n          // Compute toModelOutput for successful tool results (Bug 9 parity).\n          // Start from the existing providerMetadata so it's preserved even when\n          // toModelOutput is absent or fails — otherwise provider-executed tools\n          // or tools without a mapper lose their metadata.\n          let providerMetadata: Record<string, unknown> | undefined = toolResult.providerMetadata as\n            | Record<string, unknown>\n            | undefined;\n          if (!toolResult.error && toolResult.result != null && !toolResult.providerExecuted) {\n            const tool = registryTools?.[toolResult.toolName] as\n              | { toModelOutput?: (output: unknown) => unknown }\n              | undefined;\n\n            if (tool?.toModelOutput) {\n              const mappingSpan = stepSpan?.createChildSpan({\n                type: SpanType.MAPPING,\n                name: `tool output mapping: '${toolResult.toolName}'`,\n                entityType: EntityType.TOOL,\n                entityId: toolResult.toolName,\n                entityName: toolResult.toolName,\n                input: toolResult.result,\n                attributes: {\n                  mappingType: 'toModelOutput',\n                  toolCallId: toolResult.toolCallId,\n                },\n              });\n              try {\n                let modelOutput = await tool.toModelOutput(toolResult.result);\n                modelOutput = normalizeModelOutput(modelOutput);\n                mappingSpan?.end({ output: modelOutput });\n\n                const existingMastra = (toolResult.providerMetadata as any)?.mastra;\n                providerMetadata = {\n                  ...toolResult.providerMetadata,\n                  mastra: { ...existingMastra, modelOutput },\n                };\n              } catch (err) {\n                mappingSpan?.error({ error: err as Error, endSpan: true });\n                // toModelOutput errors are non-fatal — the tool result is still usable\n                (mastra as Mastra | undefined)\n                  ?.getLogger?.()\n                  ?.warn?.(`[DurableAgent] toModelOutput failed for tool \"${toolResult.toolName}\": ${err}`);\n              }\n            }\n          }\n\n          const updated = messageList.updateToolInvocation({\n            type: 'tool-invocation' as const,\n            toolInvocation: {\n              state: 'result' as const,\n              toolCallId: toolResult.toolCallId,\n              toolName: toolResult.toolName,\n              args: toolResult.args,\n              result,\n              // Preserve the approval decision for an approved approval-gated tool so it\n              // round-trips on recall as `approval: { approved: true }`.\n              ...(toolResult.approval ? { approval: toolResult.approval } : {}),\n            },\n            ...(providerMetadata ? { providerMetadata: providerMetadata as any } : {}),\n          });\n\n          if (!updated) {\n            messageList.add(\n              [\n                {\n                  role: 'tool' as const,\n                  content: [\n                    {\n                      type: 'tool-result' as const,\n                      toolCallId: toolResult.toolCallId,\n                      toolName: toolResult.toolName,\n                      result,\n                      isError: toolResult.error !== undefined,\n                    },\n                  ],\n                },\n              ],\n              'response',\n            );\n          }\n        }\n      }\n\n      // 2b. Sync the updated messageList back to the in-process registry.\n      // The durable workflow deserializes a fresh MessageList on every step,\n      // so updates (output-denied, tool results) are invisible to other\n      // steps that read from the registry — in particular tool-call.ts's\n      // doFlush() which persists messages before suspension. Without this\n      // sync, a declined tool's output-denied state would never reach memory\n      // if the workflow re-suspends on a subsequent iteration.\n      if (registryEntry) {\n        registryEntry.messageList = messageList;\n      }\n\n      // 3. Determine if we should continue\n      // When tool errors occur, always continue the agentic loop so the model\n      // can see the error messages (already added to messageList above) and\n      // self-correct. This matches the regular agent's behaviour where both\n      // ToolNotFoundError and generic tool execution errors are recoverable.\n      const hasToolErrors = toolResults.some(r => r.error !== undefined);\n      const isContinued = hasToolErrors ? true : llmOutput.stepResult.isContinued;\n\n      // Check if any delegation hook called ctx.bail(). The bail flag is\n      // communicated via requestContext because Zod output validation strips\n      // unknown fields from the tool result. We read it here and propagate\n      // it on the serializable output so the dowhile predicate can stop.\n      let delegationBailed = false;\n      if (requestContext?.get('__mastra_delegationBailed')) {\n        delegationBailed = true;\n        requestContext.set('__mastra_delegationBailed', false);\n      }\n\n      // 4. Build the output\n      const output: DurableAgenticExecutionOutput = {\n        messageListState: messageList.serialize(),\n        messageId,\n        stepResult: {\n          ...llmOutput.stepResult,\n          isContinued,\n        },\n        toolResults,\n        output: {\n          text: llmOutput.text,\n          toolCalls: llmOutput.toolCalls,\n          usage: llmOutput.stepResult.totalUsage ?? {\n            inputTokens: 0,\n            outputTokens: 0,\n            totalTokens: 0,\n          },\n          steps: [], // Steps are accumulated at the loop level\n        },\n        state: {\n          ...state,\n          threadExists: state.threadExists,\n        },\n        processorRetryCount: llmOutput.processorRetryCount,\n        processorRetryFeedback: llmOutput.processorRetryFeedback,\n        delegationBailed,\n      };\n\n      // Close the MODEL_STEP span for tool-calling iterations: the LLM step defers it so\n      // tool calls can nest under it, and the tools have now run. No-ops without tool calls.\n      // The span was already rebuilt earlier so MAPPING child spans could nest under it.\n      if (stepSpan) {\n        try {\n          const pendingPayload = llmOutput.stepFinishPayload as any;\n          stepSpan.end({\n            output: {\n              text: llmOutput.text,\n              toolCalls: llmOutput.toolCalls,\n            },\n            attributes: {\n              usage: pendingPayload?.output?.usage,\n              finishReason: pendingPayload?.stepResult?.reason,\n              isContinued: pendingPayload?.stepResult?.isContinued,\n            },\n          });\n        } catch (error) {\n          // Span bookkeeping must never break the merge step.\n          (mastra as Mastra | undefined)\n            ?.getLogger?.()\n            ?.warn?.(`[DurableAgent] Failed to close model_step span: ${error}`);\n        }\n      }\n\n      // Emit the deferred step-finish chunk for intermediate steps.\n      // llm-execution defers step-finish emission for tool-calling steps so that\n      // it arrives AFTER tool-result chunks (emitted by tool-call.ts). This\n      // matches the regular agent's chunk ordering which MastraModelOutput\n      // relies on for correct step content reconstruction in onStepFinish.\n      const deferredChunk = llmOutput.deferredStepFinishChunk as any;\n      const pubsub = (params as any)[PUBSUB_SYMBOL] as PubSub | undefined;\n      if (deferredChunk && pubsub) {\n        try {\n          // Build step content directly from this iteration's data.\n          // We cannot rely on messageList.get.response.aiV5.modelContent(-1)\n          // because each durable step deserializes a fresh MessageList, so\n          // the MastraModelOutput's reference is stale. Instead, construct\n          // the content array from the LLM output (text + tool calls) and\n          // the tool results collected in this step.\n          const stepContent: unknown[] = [];\n          if (llmOutput.text) {\n            stepContent.push({ type: 'text', text: llmOutput.text });\n          }\n          for (const tc of llmOutput.toolCalls ?? []) {\n            stepContent.push({\n              type: 'tool-call',\n              toolCallId: tc.toolCallId,\n              toolName: tc.toolName,\n              args: tc.args,\n            });\n          }\n          for (const tr of toolResults ?? []) {\n            stepContent.push({\n              type: 'tool-result',\n              toolCallId: tr.toolCallId,\n              toolName: tr.toolName,\n              result: tr.error ? tr.error.message : tr.result,\n              ...(tr.error ? { isError: true } : {}),\n            });\n          }\n\n          const enrichedChunk = {\n            ...deferredChunk,\n            payload: {\n              ...deferredChunk.payload,\n              _durableStepContent: stepContent,\n            },\n          };\n          await emitChunkEvent(pubsub, _runId, enrichedChunk);\n        } catch (error) {\n          (mastra as Mastra | undefined)\n            ?.getLogger?.()\n            ?.warn?.(`[DurableAgent] Failed to emit deferred step-finish: ${error}`);\n        }\n      }\n\n      return output;\n    },\n  });\n}\n","import { z } from 'zod';\nimport type { IsTaskCompleteRunResult, MastraDBMessage } from '../../../../agent';\nimport type { PubSub } from '../../../../events/pubsub';\nimport type { StreamCompletionContext } from '../../../../loop/network/validation';\nimport { formatStreamCompletionFeedback, runStreamCompletionScorers } from '../../../../loop/network/validation';\nimport { ChunkFrom } from '../../../../stream/types';\nimport { PUBSUB_SYMBOL } from '../../../../workflows/constants';\nimport { createStep } from '../../../../workflows/workflow';\nimport { MessageList } from '../../../message-list';\nimport { DurableAgentDefaults, DurableStepIds } from '../../constants';\nimport { globalRunRegistry } from '../../run-registry';\nimport { emitChunkEvent } from '../../stream-adapter';\n\n/**\n * Create the durable isTaskComplete step.\n *\n * Mirrors the non-durable `createIsTaskCompleteStep` contract:\n *  - Runs after each agentic iteration has settled its tool calls.\n *  - Only scores iterations where the LLM has signaled it is done\n *    (`lastStepResult.isContinued === false`) so we don't interrupt mid-loop\n *    tool execution.\n *  - Skips working-memory-only iterations (same heuristic as the non-durable\n *    step) — those are bookkeeping, not user-visible task progress.\n *  - Pulls the scorer instances + `onComplete` closure from the in-process run\n *    registry. They can't survive the wire, so cross-process engines (Inngest\n *    after a worker restart) simply skip this step and fall back to\n *    `maxSteps` + `stopWhen`.\n *  - On a verdict it flips `state.lastStepResult.isContinued` so the outer\n *    `dowhile` predicate either stops the loop (passed) or runs one more LLM\n *    iteration (not passed). Feedback (when not suppressed) is appended as an\n *    assistant message so the next LLM call can see it.\n *  - Emits an `is-task-complete` chunk via pubsub so external observers see\n *    the verdict and payload exactly like the non-durable path.\n */\nexport function createDurableIsTaskCompleteStep(defaultMaxSteps: number = DurableAgentDefaults.MAX_STEPS) {\n  // The step is a pass-through over the IterationState — we mutate\n  // `lastStepResult.isContinued` and `messageListState` in place when a\n  // verdict requires it. We use `z.any()` instead of the iteration schema to\n  // avoid coupling this step to whichever extended schema each workflow uses\n  // (core's IterationState extends the base shape with `modelList`).\n  return createStep({\n    id: DurableStepIds.IS_TASK_COMPLETE,\n    inputSchema: z.any(),\n    outputSchema: z.any(),\n    execute: async params => {\n      const { inputData, mastra, getInitData } = params;\n      const state = inputData as {\n        runId: string;\n        iterationCount: number;\n        messageListState: any;\n        accumulatedSteps: Array<{\n          text?: string;\n          toolCalls?: Array<{ toolName?: string; args?: unknown }>;\n          toolResults?: Array<{ toolName?: string; result?: unknown }>;\n        }>;\n        lastStepResult?: { isContinued?: boolean };\n        options?: { maxSteps?: number };\n        backgroundTaskPending?: boolean;\n      };\n      const pubsub = (params as any)[PUBSUB_SYMBOL] as PubSub | undefined;\n      const initData = getInitData() as {\n        agentId?: string;\n        agentName?: string;\n        state?: { threadId?: string; resourceId?: string };\n        requestContextEntries?: Record<string, unknown>;\n      };\n\n      const registryEntry = globalRunRegistry.get(state.runId);\n      const isTaskComplete = registryEntry?.isTaskComplete;\n      const hasScorers = !!isTaskComplete?.scorers && isTaskComplete.scorers.length > 0;\n\n      // Fast path — nothing to do without a registered policy.\n      if (!hasScorers || !isTaskComplete) {\n        return state;\n      }\n\n      // Don't interrupt mid-tool loops. The non-durable step has the same\n      // guard via `inputData.stepResult?.isContinued`.\n      const llmSignaledDone = state.lastStepResult?.isContinued === false;\n      if (!llmSignaledDone) {\n        return state;\n      }\n\n      // The background-task-check step may set backgroundTaskPending=true to\n      // force one more LLM iteration after a task settles. Skip scoring in\n      // that case so we don't double-score the same outcome.\n      if (state.backgroundTaskPending) {\n        return state;\n      }\n\n      const lastStep = state.accumulatedSteps[state.accumulatedSteps.length - 1];\n      const iterationToolCalls = (lastStep?.toolCalls ?? []) as Array<{\n        toolName?: string;\n        args?: unknown;\n      }>;\n      const isWorkingMemoryToolName = (name?: string) =>\n        name === 'updateWorkingMemory' || name === 'setWorkingMemory' || name === 'update-working-memory';\n      const allWorkingMemory =\n        iterationToolCalls.length > 0 && iterationToolCalls.every(tc => isWorkingMemoryToolName(tc.toolName));\n      if (allWorkingMemory) {\n        return state;\n      }\n\n      const runMaxSteps = state.options?.maxSteps ?? defaultMaxSteps;\n\n      // Rehydrate the message list once so we can read the original task and\n      // append feedback after scoring.\n      const messageList = new MessageList();\n      messageList.deserialize(state.messageListState);\n      const userMessages = messageList.get.input.db();\n      const firstUserMessage = userMessages[0];\n      let originalTask = 'Unknown task';\n      if (firstUserMessage) {\n        if (typeof firstUserMessage.content === 'string') {\n          originalTask = firstUserMessage.content;\n        } else if ((firstUserMessage.content as any)?.parts?.[0]?.type === 'text') {\n          originalTask = ((firstUserMessage.content as any).parts[0] as { text: string }).text;\n        }\n      }\n\n      const toolResultsForCtx = (lastStep?.toolResults ?? []) as Array<{\n        toolName?: string;\n        result?: unknown;\n      }>;\n\n      const ctx: StreamCompletionContext = {\n        iteration: state.iterationCount,\n        maxIterations: runMaxSteps,\n        originalTask,\n        currentText: lastStep?.text || '',\n        toolCalls: iterationToolCalls.map(tc => ({\n          name: tc.toolName || '',\n          args: (tc.args as Record<string, unknown>) ?? {},\n        })),\n        messages: messageList.get.all.db(),\n        toolResults: toolResultsForCtx.map(tr => ({\n          name: tr.toolName || '',\n          result: (tr.result as Record<string, unknown>) ?? {},\n        })),\n        agentId: initData.agentId || '',\n        agentName: initData.agentName || '',\n        runId: state.runId,\n        threadId: initData.state?.threadId,\n        resourceId: initData.state?.resourceId,\n        customContext: initData.requestContextEntries,\n      };\n\n      let result: IsTaskCompleteRunResult | undefined;\n      try {\n        result = await runStreamCompletionScorers(isTaskComplete.scorers!, ctx, {\n          strategy: isTaskComplete.strategy,\n          parallel: isTaskComplete.parallel,\n          timeout: isTaskComplete.timeout,\n        });\n      } catch (err) {\n        mastra?.getLogger?.()?.warn?.(`[DurableAgent] isTaskComplete scoring failed: ${err}`);\n        return state;\n      }\n\n      if (!result) {\n        return state;\n      }\n\n      if (isTaskComplete.onComplete) {\n        try {\n          await isTaskComplete.onComplete(result);\n        } catch (err) {\n          mastra?.getLogger?.()?.warn?.(`[DurableAgent] isTaskComplete onComplete callback failed: ${err}`);\n        }\n      }\n\n      const maxIterationReached = runMaxSteps ? state.iterationCount >= runMaxSteps : false;\n\n      // Flip isContinued based on the verdict so the outer dowhile predicate\n      // continues (not complete) or stops (complete). This is the contract\n      // the non-durable createIsTaskCompleteStep uses.\n      const nextState: typeof state = { ...state };\n      if (nextState.lastStepResult) {\n        nextState.lastStepResult = {\n          ...nextState.lastStepResult,\n          isContinued: !result.complete,\n        };\n      }\n\n      // Append the formatted feedback as an assistant message so the next\n      // LLM iteration can see the verdict — this is what lets the model\n      // course-correct when scorers say \"not complete\". The message is always\n      // added; `suppressFeedback` is a display hint stored in metadata that\n      // the frontend uses to hide it from the end user.\n      const feedback = formatStreamCompletionFeedback(result, maxIterationReached);\n      messageList.add(\n        {\n          id: mastra?.generateId?.(),\n          createdAt: new Date(),\n          type: 'text',\n          role: 'assistant',\n          content: {\n            parts: [{ type: 'text', text: feedback }],\n            metadata: {\n              mode: 'stream',\n              completionResult: {\n                passed: result.complete,\n                suppressFeedback: !!isTaskComplete.suppressFeedback,\n              },\n            },\n            format: 2,\n          },\n        } as MastraDBMessage,\n        'response',\n      );\n      nextState.messageListState = messageList.serialize();\n\n      if (pubsub) {\n        try {\n          await emitChunkEvent(pubsub, state.runId, {\n            type: 'is-task-complete',\n            runId: state.runId,\n            from: ChunkFrom.AGENT,\n            payload: {\n              iteration: state.iterationCount,\n              passed: result.complete,\n              results: result.scorers,\n              duration: result.totalDuration,\n              timedOut: result.timedOut,\n              reason: result.completionReason,\n              maxIterationReached,\n              suppressFeedback: !!isTaskComplete.suppressFeedback,\n            },\n          } as any);\n        } catch {\n          // PubSub may be closed — fall through.\n        }\n      }\n\n      return nextState;\n    },\n  });\n}\n","import { z } from 'zod';\nimport type { MastraScorer } from '../../../../evals';\nimport type { PubSub } from '../../../../events/pubsub';\nimport { resolveModelConfig } from '../../../../llm';\nimport type { MastraLanguageModel } from '../../../../llm/model/shared.types';\nimport { runStreamCompletionScorers } from '../../../../loop/network/validation';\nimport type { StreamCompletionContext } from '../../../../loop/network/validation';\nimport { createProcessorSendSignal } from '../../../../processors/send-signal';\nimport { RequestContext } from '../../../../request-context';\nimport type { GoalObjectiveRecord } from '../../../../storage/domains/thread-state/base';\nimport type { ChunkType, GoalEvaluationActivity } from '../../../../stream/types';\nimport { ChunkFrom } from '../../../../stream/types';\nimport { PUBSUB_SYMBOL } from '../../../../workflows/constants';\nimport { createStep } from '../../../../workflows/workflow';\nimport type { ResolvedGoalStore } from '../../../goal';\nimport {\n  createGoalScorer,\n  GOAL_SCORE_WAITING,\n  GOAL_SCORER_ID,\n  readObjective,\n  resolveEffectiveGoalSettings,\n  resolveGoalStore,\n  writeObjective,\n} from '../../../goal';\nimport { MessageList } from '../../../message-list';\nimport type { ToolsInput } from '../../../types';\nimport { globalRunRegistry } from '../../run-registry';\nimport { emitChunkEvent } from '../../stream-adapter';\n\nfunction isWorkingMemoryTool(name: string): boolean {\n  return name === 'updateWorkingMemory' || name === 'setWorkingMemory' || name === 'update-working-memory';\n}\n\nfunction formatJudgeActivityName(name: string | undefined): string | undefined {\n  if (!name) return undefined;\n  if (name === 'view') return 'read';\n  if (name === 'search_content') return 'search';\n  if (name === 'find_files') return 'find files';\n  if (name === 'file_stat') return 'stat';\n  if (name === 'lsp_inspect') return 'inspect';\n  return name;\n}\n\nfunction getStringArg(args: unknown, key: string): string | undefined {\n  if (!args || typeof args !== 'object' || Array.isArray(args)) return undefined;\n  const value = (args as Record<string, unknown>)[key];\n  return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction truncateActivityDetail(value: string): string {\n  return value.length > 80 ? `${value.slice(0, 77)}...` : value;\n}\n\nfunction extractPartialReasonFromStructuredText(text: string): string | undefined {\n  const match = text.match(/\"reason\"\\s*:\\s*\"((?:\\\\.|[^\"\\\\])*)/);\n  const partialReason = match?.[1];\n  if (!partialReason) return undefined;\n  return partialReason.replace(/\\\\n/g, '\\n').replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, '\\\\').trim();\n}\n\nfunction formatJudgeActivityMessage(name: string | undefined, args: unknown): string | undefined {\n  const label = formatJudgeActivityName(name);\n  if (!label) return undefined;\n\n  if (name === 'view' || name === 'file_stat') {\n    const path = getStringArg(args, 'path');\n    return path ? `${label} ${truncateActivityDetail(path)}` : label;\n  }\n\n  if (name === 'search_content') {\n    const pattern = getStringArg(args, 'pattern');\n    const path = getStringArg(args, 'path');\n    const detail = [pattern, path].filter(Boolean).join(' in ');\n    return detail ? `${label} ${truncateActivityDetail(detail)}` : label;\n  }\n\n  if (name === 'find_files') {\n    const path = getStringArg(args, 'path');\n    const pattern = getStringArg(args, 'pattern');\n    const detail = [path, pattern].filter(Boolean).join(' ');\n    return detail ? `${label} ${truncateActivityDetail(detail)}` : label;\n  }\n\n  if (name === 'lsp_inspect') {\n    const path = getStringArg(args, 'path');\n    const line =\n      !args || typeof args !== 'object' || Array.isArray(args) ? undefined : (args as Record<string, unknown>).line;\n    const detail = path ? `${path}${typeof line === 'number' ? `:${line}` : ''}` : undefined;\n    return detail ? `${label} ${truncateActivityDetail(detail)}` : label;\n  }\n\n  return label;\n}\n\n/**\n * Create the durable goal step.\n *\n * Mirrors the non-durable `createGoalStep` contract:\n *  - Runs after `isTaskCompleteStep` in the `singleIterationWorkflow`.\n *  - Only evaluates iterations where the LLM has signaled it is done\n *    (`lastStepResult.isContinued === false`) so we don't interrupt mid-loop\n *    tool execution.\n *  - Skips background-pending, working-memory-only iterations (same\n *    heuristic as the non-durable step).\n *  - Pulls the `goal` config from the in-process run registry (closures\n *    like `judge`, `scorer`, `tools` can't survive the wire). Cross-process\n *    engines without this slot skip goal evaluation.\n *  - Reads/writes the `GoalObjectiveRecord` from/to thread state storage.\n *  - Emits `goal` chunks via pubsub so external observers see the verdict.\n *  - Injects system-reminder + goal feedback into `messageList` via\n *    `createProcessorSendSignal` so the next LLM iteration can see it.\n */\nexport function createDurableGoalStep() {\n  return createStep({\n    id: 'durable-goal',\n    inputSchema: z.any(),\n    outputSchema: z.any(),\n    execute: async params => {\n      const { inputData, mastra, getInitData } = params;\n      const state = inputData as {\n        runId: string;\n        iterationCount: number;\n        messageListState: any;\n        messageId: string;\n        accumulatedSteps: Array<{\n          text?: string;\n          toolCalls?: Array<{ toolName?: string; args?: unknown }>;\n          toolResults?: Array<{ toolName?: string; result?: unknown }>;\n        }>;\n        lastStepResult?: { isContinued?: boolean };\n        options?: { maxSteps?: number };\n        backgroundTaskPending?: boolean;\n      };\n      const pubsub = (params as any)[PUBSUB_SYMBOL] as PubSub | undefined;\n      const initData = getInitData() as {\n        agentId?: string;\n        agentName?: string;\n        state?: { threadId?: string; resourceId?: string };\n        requestContextEntries?: Record<string, unknown>;\n      };\n\n      const registryEntry = globalRunRegistry.get(state.runId);\n      const goal = registryEntry?.goal;\n\n      // No goal configured → nothing to do.\n      if (!goal) return state;\n\n      // Same gating as isTaskComplete: skip background results, mid-tool-loop\n      // continuations, and working-memory-only iterations.\n      if (state.backgroundTaskPending || state.lastStepResult?.isContinued) {\n        return state;\n      }\n\n      const lastStep = state.accumulatedSteps[state.accumulatedSteps.length - 1];\n      const iterationToolCalls = (lastStep?.toolCalls ?? []) as Array<{\n        toolName?: string;\n        args?: unknown;\n      }>;\n      if (iterationToolCalls.length > 0 && iterationToolCalls.every(tc => isWorkingMemoryTool(tc.toolName ?? ''))) {\n        return state;\n      }\n\n      const threadId = initData.state?.threadId;\n\n      // Reconstruct requestContext from serialized entries for resolvers.\n      const requestContext = new RequestContext();\n      if (initData.requestContextEntries) {\n        for (const [key, value] of Object.entries(initData.requestContextEntries)) {\n          requestContext.set(key, value);\n        }\n      }\n\n      const store = (await resolveGoalStore(mastra as any)) as ResolvedGoalStore | undefined;\n      const record = await readObjective(store, threadId);\n\n      // No active objective → no gating, no chunk.\n      if (!record || record.status !== 'active' || !store || !threadId) {\n        return state;\n      }\n\n      const effective = resolveEffectiveGoalSettings(record, {\n        judgeModelId: typeof goal.judge === 'string' ? goal.judge : undefined,\n        maxRuns: goal.maxRuns,\n        prompt: goal.prompt,\n        maxSteps: goal.maxSteps,\n      });\n\n      // Defensive budget guard.\n      const nextState: typeof state = { ...state };\n      if (record.runsUsed >= effective.maxRuns) {\n        if (nextState.lastStepResult) {\n          nextState.lastStepResult = {\n            ...nextState.lastStepResult,\n            isContinued: false,\n          };\n        }\n        if (pubsub) {\n          try {\n            await emitChunkEvent(pubsub, state.runId, {\n              type: 'goal',\n              runId: state.runId,\n              from: ChunkFrom.AGENT,\n              payload: {\n                objective: record.objective,\n                iteration: record.runsUsed,\n                maxRuns: effective.maxRuns,\n                passed: false,\n                status: record.status,\n                results: [],\n                reason: undefined,\n                duration: 0,\n                timedOut: false,\n                maxRunsReached: true,\n                suppressFeedback: false,\n              },\n            } as any);\n          } catch {\n            // PubSub may be closed — fall through.\n          }\n        }\n        return nextState;\n      }\n\n      // Determine the judge model config. A non-string agent `goal.judge` (a\n      // resolved model or a model-resolver function) takes precedence.\n      const nonStringAgentJudge = goal.judge && typeof goal.judge !== 'string' ? goal.judge : undefined;\n\n      let judgeModelConfig: unknown = nonStringAgentJudge ?? effective.judgeModelId;\n      if (typeof judgeModelConfig === 'function') {\n        judgeModelConfig = await (judgeModelConfig as (args: any) => unknown)({ requestContext, mastra });\n      }\n      if (!judgeModelConfig) {\n        return state;\n      }\n\n      // Evaluate the goal. Catch any failure to prevent infinite loops.\n      let result: Awaited<ReturnType<typeof runStreamCompletionScorers>>;\n      try {\n        const emitJudgeActivity = (activity: GoalEvaluationActivity, args?: unknown) => {\n          const name =\n            activity.type === 'reason' ? activity.name : formatJudgeActivityName(activity.name ?? activity.message);\n          const message =\n            activity.type === 'reason'\n              ? activity.message\n              : formatJudgeActivityMessage(activity.name ?? activity.message, args);\n          if (!message || !pubsub) return;\n          emitChunkEvent(pubsub, state.runId, {\n            type: 'goal',\n            runId: state.runId,\n            from: ChunkFrom.AGENT,\n            payload: {\n              objective: record.objective,\n              iteration: record.runsUsed + 1,\n              maxRuns: effective.maxRuns,\n              passed: false,\n              status: record.status,\n              results: [],\n              duration: 0,\n              timedOut: false,\n              maxRunsReached: false,\n              suppressFeedback: true,\n              pending: true,\n              activity: [{ ...activity, name, message }],\n            },\n          } as any).catch(() => {});\n        };\n\n        const observeJudgeStream = (stream: { fullStream?: AsyncIterable<ChunkType> }) => {\n          if (!stream.fullStream) return;\n          void (async () => {\n            let streamedText = '';\n            let lastReason = '';\n            for await (const chunk of stream.fullStream!) {\n              if (chunk.type === 'text-delta') {\n                streamedText += (chunk as any).payload?.text ?? '';\n                const reason = extractPartialReasonFromStructuredText(streamedText);\n                if (reason && reason !== lastReason) {\n                  lastReason = reason;\n                  emitJudgeActivity({ type: 'reason', message: reason });\n                }\n              } else if (chunk.type === 'tool-call') {\n                emitJudgeActivity(\n                  {\n                    type: 'tool-call',\n                    name: (chunk as any).payload?.toolName,\n                    message: (chunk as any).payload?.toolName,\n                  },\n                  (chunk as any).payload?.args,\n                );\n              }\n            }\n          })();\n        };\n\n        // Resolve the scorer.\n        let scorer: MastraScorer<any, any, any, any> | undefined;\n        if (goal.scorer) {\n          scorer =\n            typeof goal.scorer === 'string'\n              ? (mastra?.getScorer?.(goal.scorer as any) as MastraScorer<any, any, any, any> | undefined)\n              : goal.scorer;\n        }\n        if (!scorer) {\n          const judgeModel = (\n            typeof judgeModelConfig === 'string'\n              ? await resolveModelConfig(judgeModelConfig, requestContext, mastra)\n              : judgeModelConfig\n          ) as MastraLanguageModel;\n\n          const goalTools: ToolsInput | undefined =\n            typeof goal.tools === 'function'\n              ? ((await (goal.tools as (args: any) => unknown)({ requestContext, mastra })) as ToolsInput | undefined)\n              : goal.tools;\n\n          scorer = createGoalScorer({\n            mastra,\n            judgeModel,\n            prompt: effective.prompt,\n            tools: goalTools,\n            requestContext,\n            onStream: observeJudgeStream,\n            ...(effective.maxSteps ? { maxSteps: effective.maxSteps } : {}),\n          });\n        }\n\n        // Build scorer context.\n        const messageList = new MessageList();\n        messageList.deserialize(state.messageListState);\n\n        const toolCalls = (lastStep?.toolCalls ?? []) as Array<{ toolName?: string; args?: unknown }>;\n        const toolResults = (lastStep?.toolResults ?? []) as Array<{ toolName?: string; result?: unknown }>;\n        const goalContext: StreamCompletionContext = {\n          iteration: record.runsUsed + 1,\n          maxIterations: effective.maxRuns,\n          originalTask: record.objective,\n          currentText: lastStep?.text || '',\n          toolCalls: toolCalls.map(tc => ({\n            name: tc.toolName || '',\n            args: (tc.args || {}) as Record<string, unknown>,\n          })),\n          messages: messageList.get.all.db(),\n          toolResults: toolResults.map(tr => ({\n            name: tr.toolName || '',\n            result: (tr.result as Record<string, unknown>) ?? {},\n          })),\n          agentId: initData.agentId || '',\n          agentName: initData.agentName || '',\n          runId: state.runId,\n          threadId,\n          resourceId: initData.state?.resourceId,\n          customContext: initData.requestContextEntries,\n        };\n\n        // Emit a pending chunk so consumers can show a loading indicator.\n        if (pubsub) {\n          emitChunkEvent(pubsub, state.runId, {\n            type: 'goal',\n            runId: state.runId,\n            from: ChunkFrom.AGENT,\n            payload: {\n              objective: record.objective,\n              iteration: record.runsUsed + 1,\n              maxRuns: effective.maxRuns,\n              passed: false,\n              status: record.status,\n              results: [],\n              duration: 0,\n              timedOut: false,\n              maxRunsReached: false,\n              suppressFeedback: true,\n              pending: true,\n            },\n          } as any).catch(() => {});\n        }\n\n        result = await runStreamCompletionScorers([scorer], goalContext, { strategy: 'all' });\n      } catch (error: any) {\n        const reason = `Goal evaluation failed: ${error?.message ?? String(error)}`;\n        result = {\n          complete: false,\n          completionReason: undefined,\n          scorers: [\n            {\n              score: 0,\n              passed: false,\n              reason,\n              scorerId: GOAL_SCORER_ID,\n              scorerName: 'Goal (LLM)',\n              duration: 0,\n              errored: true,\n            },\n          ],\n          totalDuration: 0,\n          timedOut: false,\n        };\n      }\n\n      // Tri-state decision: done / waiting / keep working / errored.\n      const erroredScorer = result.scorers.find(s => s.errored);\n      const judgeFailed = !!erroredScorer;\n      const waiting =\n        !judgeFailed &&\n        !result.complete &&\n        result.scorers.some(s => s.scorerId === GOAL_SCORER_ID && s.score === GOAL_SCORE_WAITING);\n\n      // Increment runs and update status.\n      const runsUsed = record.runsUsed + 1;\n      const maxRunsReached = runsUsed >= effective.maxRuns;\n      let status: GoalObjectiveRecord['status'] = record.status;\n      let pausedReason: string | undefined;\n      if (judgeFailed) {\n        status = 'paused';\n        pausedReason = erroredScorer?.reason ?? 'The goal judge failed to evaluate the objective.';\n      } else if (result.complete) {\n        status = 'done';\n      } else if (maxRunsReached && !waiting) {\n        status = 'paused';\n        pausedReason = `Ran out of evaluation budget (${effective.maxRuns} runs) before reaching the goal — raise maxRuns to resume.`;\n      }\n\n      const updated: GoalObjectiveRecord = {\n        ...record,\n        runsUsed,\n        status,\n        pausedReason: status === 'paused' ? pausedReason : undefined,\n        updatedAt: Date.now(),\n      };\n      await writeObjective(store, threadId, updated, requestContext);\n\n      // Continuation decision.\n      const shouldContinue = !result.complete && !waiting && !judgeFailed && !maxRunsReached;\n      if (nextState.lastStepResult) {\n        nextState.lastStepResult = {\n          ...nextState.lastStepResult,\n          isContinued: shouldContinue,\n        };\n      }\n\n      const suppressFeedback = false;\n      const goalEvaluationPayload = {\n        objective: record.objective,\n        iteration: runsUsed,\n        maxRuns: effective.maxRuns,\n        passed: result.complete,\n        status,\n        pausedReason,\n        judgeFailed,\n        waitingForUser: waiting,\n        results: result.scorers,\n        reason: status === 'paused' ? pausedReason : result.completionReason,\n        duration: result.totalDuration,\n        timedOut: result.timedOut,\n        maxRunsReached,\n        suppressFeedback,\n      };\n\n      // Inject feedback into messageList via signal so the next LLM call sees it.\n      const messageList = new MessageList();\n      messageList.deserialize(nextState.messageListState);\n\n      let currentMessageId = nextState.messageId;\n      const sendSignal = createProcessorSendSignal({\n        messageList,\n        writer: pubsub\n          ? {\n              custom: async (data, _options) => {\n                await emitChunkEvent(pubsub, state.runId, data as ChunkType);\n              },\n            }\n          : undefined,\n        rotateResponseMessageId: () => {\n          currentMessageId = mastra?.generateId?.() ?? `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n          nextState.messageId = currentMessageId;\n          return currentMessageId;\n        },\n      });\n\n      const feedback = result.completionReason ?? 'The goal is not yet complete.';\n      const continuation = shouldContinue\n        ? `[Goal attempt ${runsUsed}/${effective.maxRuns}] The goal is not yet complete. Judge feedback: ${feedback}\\n\\nContinue working toward the goal: ${record.objective}`\n        : `${status} (${runsUsed}/${effective.maxRuns})\\n${goalEvaluationPayload.reason ?? ''}`;\n      await sendSignal({\n        type: 'system-reminder',\n        contents: continuation,\n        attributes: { type: 'goal-judge' },\n        metadata: { goalEvaluation: goalEvaluationPayload },\n      });\n\n      // Re-serialize messageList after signal injection.\n      nextState.messageListState = messageList.serialize();\n\n      // Emit the final goal chunk for external observers.\n      if (pubsub) {\n        try {\n          await emitChunkEvent(pubsub, state.runId, {\n            type: 'goal',\n            runId: state.runId,\n            from: ChunkFrom.AGENT,\n            payload: goalEvaluationPayload,\n          } as any);\n        } catch {\n          // PubSub may be closed — fall through.\n        }\n      }\n\n      return nextState;\n    },\n  });\n}\n","import { z } from 'zod';\nimport type { PubSub } from '../../../../events/pubsub';\nimport type { Mastra } from '../../../../mastra';\nimport { PUBSUB_SYMBOL } from '../../../../workflows/constants';\nimport { createStep } from '../../../../workflows/workflow';\nimport { MessageList } from '../../../message-list';\nimport { DurableStepIds } from '../../constants';\nimport { globalRunRegistry } from '../../run-registry';\nimport { emitChunkEvent } from '../../stream-adapter';\n\nconst SIGNAL_DRAIN_STEP_ID = `${DurableStepIds.AGENTIC_EXECUTION}-signal-drain`;\n\n/**\n * Create a durable signal drain step.\n *\n * Mirrors the regular agent's `signalDrainStep` which sits between\n * backgroundTaskCheckStep and isTaskCompleteStep:\n * - Drains any signals queued while tool execution was running\n * - Adds drained signals to the messageList transcript\n * - Emits signal chunks via pubsub for the stream adapter\n * - Sets isContinued=true so the LLM processes the signals on the next turn\n * - Best-effort: swallows errors so signals remain queued on failure\n */\nexport function createDurableSignalDrainStep() {\n  return createStep({\n    id: SIGNAL_DRAIN_STEP_ID,\n    inputSchema: z.any(),\n    outputSchema: z.any(),\n    execute: async params => {\n      const { inputData, getInitData } = params;\n      const execOutput = inputData as Record<string, any>;\n      const initData = getInitData<{ runId: string }>();\n      const runId = initData.runId;\n      const registryEntry = globalRunRegistry.get(runId);\n      const drainFn = registryEntry?.drainPendingSignals;\n\n      if (!drainFn) return execOutput;\n\n      try {\n        const pendingSignals = drainFn('pending');\n        if (pendingSignals.length === 0) return execOutput;\n\n        const drainList = new MessageList();\n        drainList.deserialize(execOutput.messageListState);\n        drainList.markResponseMessageBoundary(execOutput.messageId);\n\n        const nextMessageId =\n          (params.mastra as Mastra | undefined)?.generateId?.() ??\n          globalThis.crypto?.randomUUID?.() ??\n          `msg_${Date.now()}`;\n\n        const pubsub = (params as any)[PUBSUB_SYMBOL] as PubSub | undefined;\n        for (const pendingSignal of pendingSignals) {\n          const signalForTranscript = drainList.addSignal(pendingSignal);\n          if (pubsub) {\n            await emitChunkEvent(pubsub, runId, signalForTranscript.toDataPart() as any);\n          }\n        }\n\n        return {\n          ...execOutput,\n          messageListState: drainList.serialize(),\n          messageId: nextMessageId,\n          stepResult: {\n            ...execOutput.stepResult,\n            messageId: nextMessageId,\n            isContinued: true,\n          },\n        };\n      } catch {\n        // Signal drain is best-effort; drainPendingSignals() is inside\n        // the try so signals remain queued if it throws.\n        return execOutput;\n      }\n    },\n  });\n}\n","import { z } from 'zod';\nimport type { MastraScorer, MastraScorerEntry } from '../../../evals/base';\nimport { runScorer } from '../../../evals/hooks';\nimport type { PubSub } from '../../../events/pubsub';\nimport { pruneAgentLoopSnapshot } from '../../../loop/workflows/prune-snapshot';\nimport type { Mastra } from '../../../mastra';\nimport { createObservabilityContext, InternalSpans } from '../../../observability';\nimport type { AIModelGenerationSpan, ExportedSpan, SpanType } from '../../../observability';\nimport { RequestContext } from '../../../request-context';\nimport { PUBSUB_SYMBOL } from '../../../workflows/constants';\nimport { createWorkflow } from '../../../workflows/create';\nimport { MessageList } from '../../message-list';\nimport { DurableStepIds, DurableAgentDefaults } from '../constants';\nimport { globalRunRegistry } from '../run-registry';\nimport { emitChunkEvent, emitFinishEvent, emitIterationCompleteEvent } from '../stream-adapter';\nimport type {\n  DurableToolCallInput,\n  DurableAgenticWorkflowInput,\n  DurableAgenticExecutionOutput,\n  DurableLLMStepOutput,\n  DurableToolCallOutput,\n  SerializableScorersConfig,\n} from '../types';\nimport {\n  modelConfigSchema,\n  modelListEntrySchema,\n  durableAgenticOutputSchema,\n  baseIterationStateSchema,\n  createBaseIterationStateUpdate,\n} from './shared';\nimport {\n  createDurableBackgroundTaskCheckStep,\n  createDurableGoalStep,\n  createDurableIsTaskCompleteStep,\n  createDurableLLMExecutionStep,\n  createDurableToolCallStep,\n  createDurableLLMMappingStep,\n  createDurableSignalDrainStep,\n} from './steps';\n\n/**\n * Options for creating a durable agentic workflow\n */\nexport interface DurableAgenticWorkflowOptions {\n  /** Maximum number of agentic loop iterations */\n  maxSteps?: number;\n}\n\n/**\n * Input schema for the durable agentic workflow.\n * Extends base schema with model list for fallback support.\n */\nconst durableAgenticInputSchema = z.object({\n  __workflowKind: z.literal('durable-agent'),\n  runId: z.string(),\n  agentId: z.string(),\n  agentName: z.string().optional(),\n  messageListState: z.any(),\n  toolsMetadata: z.array(z.any()),\n  modelConfig: modelConfigSchema,\n  // Model list for fallback support (when agent configured with array of models)\n  modelList: z.array(modelListEntrySchema).optional(),\n  options: z.any(),\n  state: z.any(),\n  messageId: z.string(),\n  // Exported AGENT_RUN / MODEL_GENERATION span data, threaded so the run shares one trace\n  agentSpanData: z.any().optional(),\n  modelSpanData: z.any().optional(),\n  // JSON-safe snapshot of requestContext.entries() so durable steps can read\n  // it (e.g. is-task-complete scorers pass it as customContext).\n  requestContextEntries: z.record(z.string(), z.any()).optional(),\n});\n\n// Re-export shared output schema (identical across implementations)\n// Note: durableAgenticOutputSchema is imported from shared\n\n/**\n * Schema for the iteration state that flows through the dowhile loop.\n * Extends base schema with model list for fallback support.\n */\nconst iterationStateSchema = baseIterationStateSchema.extend({\n  // Model list for fallback support\n  modelList: z.array(z.any()).optional(),\n});\n\ntype IterationState = z.infer<typeof iterationStateSchema>;\n\n/**\n * Create a durable agentic workflow.\n *\n * This workflow implements the agentic loop pattern in a durable way:\n *\n * 1. LLM Execution Step - Calls the LLM and gets response/tool calls\n * 2. Tool Call Steps (foreach) - Executes each tool call in parallel\n * 3. LLM Mapping Step - Merges tool results back into state\n * 4. Loop - Continues if more tool calls are needed (dowhile)\n *\n * All state flows through workflow input/output, making it durable across\n * process restarts and execution engine replays.\n */\nexport function createDurableAgenticWorkflow(options?: DurableAgenticWorkflowOptions) {\n  const maxSteps = options?.maxSteps ?? DurableAgentDefaults.MAX_STEPS;\n\n  // Create the LLM execution step - tools and model are resolved from Mastra at runtime\n  const llmExecutionStep = createDurableLLMExecutionStep();\n\n  // Create the tool call step - each tool call runs as its own step with suspend support\n  const toolCallStep = createDurableToolCallStep();\n\n  // Create the LLM mapping step\n  const llmMappingStep = createDurableLLMMappingStep();\n\n  // Create the background task check step\n  const backgroundTaskCheckStep = createDurableBackgroundTaskCheckStep();\n\n  // Create the signal drain step — mirrors the non-durable `signalDrainStep`\n  // which drains signals queued during tool execution.\n  const signalDrainStep = createDurableSignalDrainStep();\n\n  // Create the isTaskComplete evaluation step (mirrors the non-durable\n  // createIsTaskCompleteStep). Lives as a real step (not predicate logic)\n  // so it shows up in workflow traces and produces a proper state transition.\n  const isTaskCompleteStep = createDurableIsTaskCompleteStep(maxSteps);\n\n  // Create the goal evaluation step — mirrors the non-durable\n  // `createGoalStep`. Runs after isTaskComplete so the goal judge\n  // sees whether isTaskComplete already stopped the loop.\n  const goalStep = createDurableGoalStep();\n\n  // Create the single iteration workflow (LLM -> Tool Calls -> Mapping)\n  // Note: foreach runs with concurrency: 1 (sequential) because tool approval\n  // and suspension require sequential execution to properly handle suspend/resume.\n  // The workflow is created once at startup and reused for all runs.\n  const singleIterationWorkflow = createWorkflow({\n    id: DurableStepIds.AGENTIC_EXECUTION,\n    inputSchema: iterationStateSchema,\n    outputSchema: iterationStateSchema,\n    options: {\n      shouldPersistSnapshot: params => {\n        // We need a persisted snapshot record to support `resumeStream()`.\n        // - Create the initial record early (\"pending\")\n        // - Update it when execution is suspended (\"paused\"/\"suspended\")\n        // Avoid persisting \"running\" snapshots so we don't overwrite an existing suspended snapshot.\n        return (\n          params.workflowStatus === 'pending' ||\n          params.workflowStatus === 'paused' ||\n          params.workflowStatus === 'suspended'\n        );\n      },\n      // Agent-loop snapshots are pure resume artifacts — strip everything a\n      // resume never reads before persisting.\n      pruneSnapshot: pruneAgentLoopSnapshot,\n      validateInputs: false,\n      sharePubsub: true,\n      // Internal durable-agent execution plumbing — hide workflow spans;\n      // the agent/tool/model spans within still surface for users.\n      tracingPolicy: {\n        internal: InternalSpans.WORKFLOW,\n      },\n    },\n  })\n    // Step 0: Convert iteration state to LLM input format\n    .map(\n      async ({ inputData }) => {\n        const state = inputData as IterationState;\n        return {\n          runId: state.runId,\n          agentId: state.agentId,\n          agentName: state.agentName,\n          messageListState: state.messageListState,\n          toolsMetadata: state.toolsMetadata,\n          modelConfig: state.modelConfig,\n          modelList: state.modelList,\n          options: state.options,\n          state: state.state,\n          messageId: state.messageId,\n          stepIndex: state.iterationCount,\n          agentSpanData: state.agentSpanData,\n          modelSpanData: state.modelSpanData,\n        };\n      },\n      { id: 'map-to-llm-input' },\n    )\n    // Step 1: Execute LLM\n    .then(llmExecutionStep)\n    // Step 2: Extract tool calls as array for foreach (forward model_step span for nesting)\n    .map(\n      async ({ inputData }) => {\n        const llmOutput = inputData as DurableLLMStepOutput;\n        return (llmOutput.toolCalls ?? []).map(toolCall => ({\n          ...toolCall,\n          stepSpanData: llmOutput.stepSpanData,\n        })) as DurableToolCallInput[];\n      },\n      { id: 'extract-tool-calls' },\n    )\n    // Step 3: Execute each tool call individually (with suspend support)\n    .foreach(toolCallStep)\n    // Step 4: Collect tool results and bundle with LLM output for mapping step\n    .map(\n      async ({ inputData, getStepResult, getInitData }) => {\n        const toolResults = inputData as DurableToolCallOutput[];\n        const llmOutput = getStepResult(llmExecutionStep.id) as DurableLLMStepOutput;\n        const initData = getInitData() as IterationState;\n\n        return {\n          llmOutput,\n          toolResults,\n          runId: initData.runId,\n          agentId: initData.agentId,\n          messageId: initData.messageId,\n          state: llmOutput?.state ?? initData.state,\n        };\n      },\n      { id: 'collect-tool-results' },\n    )\n    // Step 5: Map tool results back to state\n    .then(llmMappingStep)\n    // Step 6: Check for pending background tasks\n    .then(backgroundTaskCheckStep)\n    // Step 6.5: Drain signals that were queued while tool execution was running\n    // within this iteration. Mirrors the non-durable `signalDrainStep` which\n    // sits between backgroundTaskCheckStep and isTaskCompleteStep.\n    .then(signalDrainStep)\n    // Step 7: Map back to iteration state format using shared function\n    .map(\n      async ({ inputData, getInitData }) => {\n        const executionOutput = inputData as DurableAgenticExecutionOutput;\n        const initData = getInitData() as IterationState;\n\n        // Use shared function for base state update\n        const baseUpdate = createBaseIterationStateUpdate({\n          currentState: initData,\n          executionOutput,\n        });\n\n        // Extend with core-specific fields\n        const newIterationState: IterationState = {\n          ...baseUpdate,\n          modelList: initData.modelList,\n        };\n\n        return newIterationState;\n      },\n      { id: 'update-iteration-state' },\n    )\n    // Step 8: Evaluate user-supplied isTaskComplete scorers (if any). Runs as\n    // a real step so it shows up in traces and may mutate lastStepResult /\n    // messageListState before the dowhile predicate decides whether to loop\n    // again. No-op when the run has no policy configured.\n    .then(isTaskCompleteStep)\n    // Step 9: Goal evaluation. Mirrors the non-durable createGoalStep — judges\n    // whether the thread's active objective is satisfied or should continue.\n    // No-op when no goal is configured or no active objective exists.\n    .then(goalStep)\n    .commit();\n\n  // Create the main agentic loop workflow with dowhile\n  return (\n    createWorkflow({\n      id: DurableStepIds.AGENTIC_LOOP,\n      inputSchema: durableAgenticInputSchema,\n      outputSchema: durableAgenticOutputSchema,\n      options: {\n        shouldPersistSnapshot: params => {\n          // We need a persisted snapshot record to support `resumeStream()`.\n          // - Create the initial record early (\"pending\")\n          // - Update it when execution is suspended (\"paused\"/\"suspended\")\n          // Avoid persisting \"running\" snapshots so we don't overwrite an existing suspended snapshot.\n          return (\n            params.workflowStatus === 'pending' ||\n            params.workflowStatus === 'paused' ||\n            params.workflowStatus === 'suspended'\n          );\n        },\n        // Agent-loop snapshots are pure resume artifacts — strip everything a\n        // resume never reads before persisting.\n        pruneSnapshot: pruneAgentLoopSnapshot,\n        validateInputs: false,\n        // Internal durable-agent execution plumbing — see singleIterationWorkflow.\n        tracingPolicy: {\n          internal: InternalSpans.WORKFLOW,\n        },\n      },\n    })\n      // Initialize iteration state from input\n      .map(\n        async ({ inputData }) => {\n          const input = inputData as DurableAgenticWorkflowInput;\n          const iterationState: IterationState = {\n            ...input,\n            iterationCount: 0,\n            accumulatedSteps: [],\n            accumulatedUsage: {\n              inputTokens: 0,\n              outputTokens: 0,\n              totalTokens: 0,\n            },\n            lastStepResult: undefined,\n          };\n          return iterationState;\n        },\n        { id: 'init-iteration-state' },\n      )\n      // Run the agentic loop with dowhile\n      .dowhile(singleIterationWorkflow, async params => {\n        const { inputData, mastra } = params;\n        const state = inputData as IterationState;\n        const initData = params.getInitData() as DurableAgenticWorkflowInput;\n        const pubsub = (params as any)[PUBSUB_SYMBOL] as PubSub | undefined;\n        const registryEntry = globalRunRegistry.get(state.runId);\n        // Two-phase stop: if onIterationComplete returned { continue: false, feedback }\n        // on the previous iteration, we allowed one more LLM turn with that feedback.\n        // Now that the turn has completed, stop the loop unconditionally.\n        let hasFinishedSteps = false;\n        // Hard-stop tracks reasons that onIterationComplete must NOT override.\n        // pendingFeedbackStop and delegationBailed are unconditional stops.\n        let hardStop = false;\n        if (state.pendingFeedbackStop) {\n          hasFinishedSteps = true;\n          hardStop = true;\n          state.pendingFeedbackStop = false;\n        }\n\n        // Continuation check. isTaskComplete (when configured) runs as a\n        // proper step inside singleIterationWorkflow and may have already\n        // flipped lastStepResult.isContinued by the time we get here.\n        // Declared as `let` because signal drain may force isContinued later.\n        let shouldContinue = state.lastStepResult?.isContinued === true;\n        const runMaxSteps = state.options?.maxSteps ?? maxSteps;\n        const underMaxSteps = state.iterationCount < runMaxSteps;\n\n        // Evaluate user-supplied stopWhen predicate(s) parked on the registry\n        // up-front so we can include them in the finality decision emitted on\n        // the iteration-complete event. The predicate is a closure and can't\n        // survive the wire, so we read it from in-process state. Cross-process\n        // engines (Inngest after worker restart) won't have the registry entry\n        // and fall back to maxSteps only.\n        let stopWhenMatched = false;\n        if (shouldContinue && underMaxSteps && !hasFinishedSteps) {\n          const stopWhen = registryEntry?.stopWhen;\n          if (stopWhen && state.accumulatedSteps.length > 0) {\n            const conditions = Array.isArray(stopWhen) ? stopWhen : [stopWhen];\n            // Mirror agentic-loop: cast steps to any for v5/v6 StopCondition shape\n            // compatibility — the StepRecord we accumulate is sufficient at runtime.\n            const steps = state.accumulatedSteps as any;\n            const results = await Promise.all(conditions.map(condition => condition({ steps })));\n            stopWhenMatched = results.some(Boolean);\n          }\n        }\n\n        if (stopWhenMatched) {\n          hasFinishedSteps = true;\n        }\n\n        // Check if a delegation hook called ctx.bail() during this iteration.\n        // The flag was set by the mapping step and propagated via iteration state.\n        const delegationBailed = !!(state as any).delegationBailed;\n        if (delegationBailed) {\n          hasFinishedSteps = true;\n          hardStop = true;\n          // Reset the flag so it doesn't carry forward\n          (state as any).delegationBailed = false;\n        }\n\n        // ── Inter-iteration signal drain ──────────────────────────────\n        // Mirror the non-durable agentic-loop predicate: drain pending\n        // signals that were queued while the previous iteration was\n        // running. If signals are present, mark a response boundary,\n        // rotate the messageId, add them to the transcript, emit them\n        // to the stream, and force continuation so the LLM sees them.\n        if (pubsub && registryEntry?.drainPendingSignals) {\n          try {\n            const pendingSignals = registryEntry.drainPendingSignals('pending');\n            if (pendingSignals.length > 0) {\n              const drainList = new MessageList();\n              drainList.deserialize(state.messageListState);\n              drainList.markResponseMessageBoundary();\n\n              const nextMessageId =\n                (mastra as Mastra | undefined)?.generateId?.() ??\n                globalThis.crypto?.randomUUID?.() ??\n                `msg_${Date.now()}`;\n              state.messageId = nextMessageId;\n\n              for (const pendingSignal of pendingSignals) {\n                const signalForTranscript = drainList.addSignal(pendingSignal);\n                await emitChunkEvent(pubsub, state.runId, signalForTranscript.toDataPart() as any);\n              }\n\n              state.messageListState = drainList.serialize();\n\n              // Force continuation — the LLM must see the injected signals\n              if (state.lastStepResult) {\n                state.lastStepResult.isContinued = true;\n              }\n              shouldContinue = true;\n            }\n          } catch {\n            // Signal drain is best-effort; if deserialization fails\n            // the next iteration still runs with the un-drained state.\n            // drainPendingSignals() is inside the try so signals remain\n            // queued if the drain function itself throws.\n          }\n        }\n\n        let isFinal = !shouldContinue || !underMaxSteps || hasFinishedSteps;\n\n        // Call onIterationComplete hook if provided (for every iteration, not\n        // just continued ones). Mirrors the regular agentic-loop predicate:\n        // the handler can return { continue: false } to stop, { continue: true }\n        // to force-continue (if under maxSteps), and/or { feedback } to inject\n        // a message before the next turn.\n        const onIterationComplete = registryEntry?.onIterationComplete;\n        if (onIterationComplete && !state.backgroundTaskPending) {\n          const lastStep = state.accumulatedSteps[state.accumulatedSteps.length - 1];\n\n          try {\n            // Deserialize messageList for the callback's messages snapshot\n            const callbackMessageList = new MessageList();\n            try {\n              callbackMessageList.deserialize(state.messageListState);\n            } catch {\n              // If deserialization fails, callback sees empty messages\n            }\n\n            const iterationContext = {\n              iteration: state.accumulatedSteps.length,\n              maxIterations: runMaxSteps,\n              text: lastStep?.text ?? '',\n              toolCalls: (lastStep?.toolCalls ?? []).map((tc: any) => ({\n                id: tc.toolCallId || tc.id || '',\n                name: tc.toolName || tc.name || '',\n                args: (tc.args || {}) as Record<string, unknown>,\n              })),\n              toolResults: (lastStep?.toolResults ?? []).map((tr: any) => ({\n                id: tr.toolCallId || tr.id || '',\n                name: tr.toolName || tr.name || '',\n                result: tr.result,\n                error: tr.error,\n              })),\n              isFinal,\n              finishReason: lastStep?.finishReason ?? 'unknown',\n              runId: state.runId,\n              threadId: initData.state?.threadId,\n              resourceId: initData.state?.resourceId,\n              agentId: state.agentId,\n              agentName: state.agentName ?? state.agentId,\n              messages: callbackMessageList.get.all.db(),\n            };\n\n            const iterationResult = await onIterationComplete(iterationContext);\n\n            if (iterationResult) {\n              // Determine whether we can run another turn. Hard stops\n              // (pendingFeedbackStop, delegationBailed) are unconditional —\n              // onIterationComplete cannot override them.\n              const canRunAnotherTurn =\n                !hardStop && underMaxSteps && (shouldContinue || iterationResult.continue === true);\n\n              if (iterationResult.feedback && canRunAnotherTurn) {\n                // Inject feedback as a synthetic assistant message so the LLM\n                // sees it on the next turn. Mirror the regular agent: mark it\n                // with completionResult.suppressFeedback so isTaskComplete\n                // scorers skip it.\n                const feedbackId =\n                  (mastra as Mastra | undefined)?.generateId?.() ??\n                  globalThis.crypto?.randomUUID?.() ??\n                  `msg_${Date.now()}`;\n                callbackMessageList.add(\n                  {\n                    id: feedbackId,\n                    createdAt: new Date(),\n                    type: 'text',\n                    role: 'assistant',\n                    content: {\n                      parts: [{ type: 'text', text: iterationResult.feedback }],\n                      metadata: {\n                        mode: 'stream',\n                        completionResult: { suppressFeedback: true },\n                      },\n                      format: 2,\n                    },\n                  } as any,\n                  'response',\n                );\n                // Re-serialize the updated messageList\n                state.messageListState = callbackMessageList.serialize();\n\n                if (iterationResult.continue === false) {\n                  // Two-phase stop: let one more LLM turn run with the feedback,\n                  // then stop on the next predicate evaluation.\n                  state.pendingFeedbackStop = true;\n                  isFinal = false;\n                } else if (!hasFinishedSteps && underMaxSteps) {\n                  isFinal = false;\n                  if (state.lastStepResult) {\n                    state.lastStepResult.isContinued = true;\n                  }\n                }\n              } else if (iterationResult.continue === false && !hasFinishedSteps) {\n                hasFinishedSteps = true;\n                isFinal = true;\n              } else if (iterationResult.continue === true && !hardStop && (hasFinishedSteps || !shouldContinue)) {\n                if (underMaxSteps || !runMaxSteps) {\n                  hasFinishedSteps = false;\n                  isFinal = false;\n                  if (state.lastStepResult) {\n                    state.lastStepResult.isContinued = true;\n                  }\n                }\n              }\n            }\n          } catch (error) {\n            // Log error but don't fail the iteration\n            const logger = (mastra as Mastra | undefined)?.getLogger?.();\n            logger?.error('Error in onIterationComplete hook:', error);\n          }\n        }\n\n        // Rotate messageId for the next iteration. Each iteration's assistant\n        // response is a distinct message, mirroring the non-durable agentic\n        // loop which calls rotateResponseMessageId() between iterations. The\n        // mutated state.messageId flows into the next singleIterationWorkflow\n        // input via map-to-llm-input.\n        //\n        // We also mark the current MessageList's last assistant message as a\n        // response boundary so MessageMerger won't collapse the next\n        // iteration's assistant content into it. Without this, persisted\n        // memory keeps a single assistant message and the rotated id is never\n        // observable to consumers.\n        if (!isFinal) {\n          const nextMessageId =\n            (mastra as Mastra | undefined)?.generateId?.() ?? globalThis.crypto?.randomUUID?.() ?? `msg_${Date.now()}`;\n          state.messageId = nextMessageId;\n\n          try {\n            const boundaryList = new MessageList();\n            boundaryList.deserialize(state.messageListState);\n            boundaryList.markResponseMessageBoundary();\n            state.messageListState = boundaryList.serialize();\n          } catch {\n            // Boundary marking is best-effort; if deserialization fails the\n            // next iteration will still run with the un-marked state.\n          }\n        }\n\n        // Emit an iteration-complete event for observability. This fires after\n        // every iteration (including the last one) so client-side callbacks\n        // (via stream-adapter) can track progress. The in-process callback\n        // above has already been evaluated and its result applied to the\n        // continuation decision.\n        if (pubsub) {\n          const lastStep = state.accumulatedSteps[state.accumulatedSteps.length - 1];\n          await emitIterationCompleteEvent(pubsub, state.runId, {\n            iteration: state.iterationCount,\n            maxIterations: runMaxSteps,\n            text: lastStep?.text,\n            toolCalls: lastStep?.toolCalls,\n            toolResults: lastStep?.toolResults,\n            isFinal,\n            finishReason: lastStep?.finishReason,\n            runId: state.runId,\n            threadId: initData.state?.threadId,\n            resourceId: initData.state?.resourceId,\n            agentId: initData.agentId,\n            agentName: initData.agentName,\n          });\n        }\n\n        return !isFinal;\n      })\n      // Map final state to output format, run output processors, persist memory, emit finish\n      .map(\n        async params => {\n          const { inputData, mastra, requestContext, tracingContext } = params;\n          const state = inputData as IterationState;\n          const initData = params.getInitData() as DurableAgenticWorkflowInput;\n\n          const pubsub = (params as any)[PUBSUB_SYMBOL] as PubSub | undefined;\n          const logger = mastra?.getLogger?.();\n\n          // Extract final text from last step\n          const lastStep = state.accumulatedSteps[state.accumulatedSteps.length - 1];\n          const finalText = lastStep?.text;\n\n          // Run output processors (processOutputResult) if available\n          const registryEntry = globalRunRegistry.get(state.runId);\n          if (registryEntry?.outputProcessors?.length) {\n            try {\n              const { ProcessorRunner } = await import('../../../processors/runner');\n              const runner = new ProcessorRunner({\n                inputProcessors: registryEntry.inputProcessors ?? [],\n                outputProcessors: registryEntry.outputProcessors,\n                errorProcessors: registryEntry.errorProcessors ?? [],\n                logger: logger as any,\n                agentName: initData.agentName ?? initData.agentId,\n                processorStates: registryEntry.processorStates,\n              });\n              const outputMessageList = new MessageList();\n              outputMessageList.deserialize(state.messageListState);\n              // Forward the step's tracingContext so processor_run spans parent\n              // to the AGENT_RUN ancestor via ProcessorRunner's findParent walk.\n              await runner.runOutputProcessors(\n                outputMessageList,\n                createObservabilityContext(tracingContext),\n                requestContext ?? new RequestContext(),\n                0,\n              );\n            } catch (error) {\n              logger?.warn?.(`[DurableAgent] Error running output processors: ${error}`);\n            }\n          }\n\n          // Memory persistence (executeOnFinish equivalent)\n          const durableState = initData.state;\n          if (\n            registryEntry?.saveQueueManager &&\n            registryEntry.memory &&\n            durableState?.threadId &&\n            durableState?.resourceId &&\n            !durableState.observationalMemory &&\n            // Respect readOnly memory config (\"read memory but don't save new\n            // messages\"). Mirrors the non-durable executeOnFinish `!readOnlyMemory`\n            // guard and the MessageHistory output processor's readOnly check.\n            !durableState.memoryConfig?.readOnly\n          ) {\n            try {\n              const memoryMessageList = new MessageList();\n              memoryMessageList.deserialize(state.messageListState);\n\n              if (!durableState.threadExists) {\n                await registryEntry.memory.createThread?.({\n                  threadId: durableState.threadId,\n                  resourceId: durableState.resourceId,\n                  memoryConfig: durableState.memoryConfig,\n                });\n              }\n\n              await registryEntry.saveQueueManager.flushMessages(\n                memoryMessageList,\n                durableState.threadId,\n                durableState.memoryConfig,\n              );\n            } catch (error) {\n              logger?.warn?.(`[DurableAgent] Error persisting messages: ${error}`);\n            }\n          }\n\n          const finalOutput = {\n            messageListState: state.messageListState,\n            messageId: state.messageId,\n            stepResult: state.lastStepResult || {\n              reason: 'stop',\n              warnings: [],\n              isContinued: false,\n            },\n            output: {\n              text: finalText,\n              usage: state.accumulatedUsage,\n              steps: state.accumulatedSteps,\n            },\n            state: state.state,\n          };\n\n          if (pubsub) {\n            await emitFinishEvent(pubsub, state.runId, {\n              output: finalOutput.output,\n              stepResult: finalOutput.stepResult,\n            });\n          }\n\n          // End MODEL_GENERATION then AGENT_RUN once at completion. After a resume the\n          // originals were ended as `suspended`, so end the *resume* spans (registry override).\n          try {\n            const observability = (mastra as Mastra | undefined)?.observability?.getSelectedInstance({\n              requestContext,\n            });\n            const reg = globalRunRegistry.get(initData.runId);\n            const modelSpanData = reg?.resumeModelSpanData ?? initData.modelSpanData;\n            const agentSpanData = reg?.resumeAgentSpanData ?? initData.agentSpanData;\n            if (observability) {\n              if (modelSpanData) {\n                const modelSpan = observability.rebuildSpan(\n                  modelSpanData as ExportedSpan<SpanType.MODEL_GENERATION>,\n                ) as AIModelGenerationSpan | undefined;\n                modelSpan?.createTracker()?.endGeneration({\n                  output: { text: finalText },\n                  attributes: { finishReason: finalOutput.stepResult?.reason },\n                  usage: state.accumulatedUsage,\n                });\n              }\n              if (agentSpanData) {\n                const agentSpan = observability.rebuildSpan(agentSpanData as ExportedSpan<SpanType.AGENT_RUN>);\n                agentSpan?.end({ output: { text: finalText } });\n              }\n            }\n          } catch (error) {\n            logger?.warn?.(`[DurableAgent] Error ending observability spans: ${error}`);\n          }\n\n          return finalOutput;\n        },\n        { id: 'map-final-output' },\n      )\n      // Execute scorers (fire-and-forget, doesn't affect main result)\n      .map(\n        async params => {\n          const { inputData, getInitData, mastra, requestContext, tracingContext } = params;\n          const finalOutput = inputData;\n          const initData = getInitData() as DurableAgenticWorkflowInput;\n\n          // If no scorers configured, skip\n          const scorers = initData.scorers as SerializableScorersConfig | undefined;\n          if (!scorers || Object.keys(scorers).length === 0) {\n            return finalOutput;\n          }\n\n          const logger = mastra?.getLogger?.();\n\n          // Reconstruct input MessageList to extract scorer input\n          const inputMessageList = new MessageList();\n          inputMessageList.deserialize(initData.messageListState);\n\n          // Build scorer input (messages before generation)\n          const scorerInput = {\n            inputMessages: inputMessageList.getPersisted.input.db(),\n            rememberedMessages: inputMessageList.getPersisted.remembered.db(),\n            systemMessages: inputMessageList.getSystemMessages(),\n            taggedSystemMessages: inputMessageList.getPersisted.taggedSystemMessages,\n          };\n\n          // Reconstruct output MessageList to extract scorer output\n          const outputMessageList = new MessageList();\n          outputMessageList.deserialize(finalOutput.messageListState);\n          const scorerOutput = outputMessageList.getPersisted.response.db();\n\n          // Create request context for scorer resolution\n          const resolveContext = requestContext ?? new RequestContext();\n\n          // Execute each scorer (fire-and-forget)\n          for (const [scorerKey, scorerEntry] of Object.entries(scorers)) {\n            const { scorerName, sampling } = scorerEntry;\n\n            try {\n              // Resolve the scorer from Mastra. We serialize scorers by name,\n              // and `getScorerById` searches by id-or-name without throwing\n              // on the common path, so try it first. Fall back to the\n              // registration-key-keyed `getScorer` for older configs.\n              let scorer: MastraScorer | undefined;\n              try {\n                scorer = (mastra as Mastra)?.getScorerById?.(scorerName) as MastraScorer | undefined;\n              } catch {\n                scorer = undefined;\n              }\n              if (!scorer) {\n                try {\n                  scorer = (mastra as Mastra)?.getScorer?.(scorerName) as MastraScorer | undefined;\n                } catch {\n                  scorer = undefined;\n                }\n              }\n\n              if (!scorer) {\n                logger?.warn?.(`Scorer ${scorerName} not found in Mastra, skipping`, {\n                  runId: initData.runId,\n                  scorerKey,\n                });\n                continue;\n              }\n\n              // Create the scorer entry expected by runScorer\n              const scorerObject: MastraScorerEntry = {\n                scorer,\n                sampling,\n              };\n\n              // Call runScorer (fire-and-forget via hooks)\n              runScorer({\n                runId: initData.runId,\n                scorerId: scorerKey,\n                scorerObject,\n                input: scorerInput,\n                output: scorerOutput,\n                requestContext: resolveContext as any,\n                entity: {\n                  id: initData.agentId,\n                  name: initData.agentName ?? initData.agentId,\n                },\n                structuredOutput: false,\n                source: 'LIVE',\n                entityType: 'AGENT',\n                threadId: initData.state?.threadId,\n                resourceId: initData.state?.resourceId,\n                ...createObservabilityContext(tracingContext),\n              });\n            } catch (error) {\n              // Log but don't fail - scorer errors shouldn't affect main execution\n              logger?.warn?.(`Error executing scorer ${scorerName}`, {\n                error,\n                runId: initData.runId,\n                scorerKey,\n              });\n            }\n          }\n\n          return finalOutput;\n        },\n        { id: 'execute-scorers' },\n      )\n      .commit()\n  );\n}\n","import type { MastraServerCache } from '../../cache/base';\nimport { InMemoryServerCache } from '../../cache/inmemory';\nimport { CachingPubSub } from '../../events/caching-pubsub';\nimport { EventEmitterPubSub } from '../../events/event-emitter';\nimport type { PubSub } from '../../events/pubsub';\nimport type { Mastra } from '../../mastra';\nimport { createObservabilityContext, getOrCreateSpan, SpanType, EntityType } from '../../observability';\nimport type { FullOutput, MastraModelOutput } from '../../stream/base/output';\nimport type { ChunkType, MastraOnFinishCallback } from '../../stream/types';\nimport { ChunkFrom } from '../../stream/types';\nimport { Agent } from '../agent';\nimport type { AgentExecutionOptions } from '../agent.types';\nimport type { MessageListInput } from '../message-list';\nimport type { ToolsInput } from '../types';\n\nimport { AGENT_STREAM_TOPIC } from './constants';\nimport { runDurableStreamUntilIdle, runResumeDurableStreamUntilIdle } from './durable-stream-until-idle';\nimport { prepareForDurableExecution } from './preparation';\nimport { endRunSpansWithError, ExtendedRunRegistry, globalRunRegistry } from './run-registry';\nimport { createDurableAgentStream, emitChunkEvent, emitErrorEvent } from './stream-adapter';\nimport type { AgentStepFinishEventData, AgentSuspendedEventData, DurableAgenticWorkflowInput } from './types';\nimport { createDurableAgenticWorkflow } from './workflows';\n\n/**\n * Internal flag used by `generate()`/`resumeGenerate()` to tell the stream\n * adapter to close the underlying ReadableStream on SUSPENDED events so that\n * `getFullOutput()` resolves instead of hanging on a suspended run.\n * Not part of the public `DurableAgentStreamOptions` surface.\n */\nconst CLOSE_ON_SUSPEND = Symbol('mastra.durable.closeOnSuspend');\n\n/**\n * Options for DurableAgent.stream()\n */\nexport interface DurableAgentStreamOptions<OUTPUT = undefined> {\n  /** Custom instructions that override the agent's default instructions for this execution */\n  instructions?: AgentExecutionOptions<OUTPUT>['instructions'];\n  /** Additional context messages to provide to the agent */\n  context?: AgentExecutionOptions<OUTPUT>['context'];\n  /** Memory configuration for conversation persistence and retrieval */\n  memory?: AgentExecutionOptions<OUTPUT>['memory'];\n  /** Unique identifier for this execution run */\n  runId?: string;\n  /** Request Context containing dynamic configuration and state */\n  requestContext?: AgentExecutionOptions<OUTPUT>['requestContext'];\n  /** Maximum number of steps to run */\n  maxSteps?: number;\n  /**\n   * Conditions for stopping execution (e.g., step count, token limit).\n   *\n   * The predicate is non-serializable, so it's parked on the in-process run\n   * registry and evaluated by the durable loop on every iteration. Cross-process\n   * durable engines (e.g. Inngest after a worker restart) cannot recover the\n   * closure and degrade to `maxSteps` only.\n   */\n  stopWhen?: AgentExecutionOptions<OUTPUT>['stopWhen'];\n  /** Additional tool sets that can be used for this execution */\n  toolsets?: AgentExecutionOptions<OUTPUT>['toolsets'];\n  /** Client-side tools available during execution */\n  clientTools?: AgentExecutionOptions<OUTPUT>['clientTools'];\n  /** Tool selection strategy */\n  toolChoice?: AgentExecutionOptions<OUTPUT>['toolChoice'];\n  /** Tool names enabled for this execution */\n  activeTools?: AgentExecutionOptions<OUTPUT>['activeTools'];\n  /** Model-specific settings like temperature */\n  modelSettings?: AgentExecutionOptions<OUTPUT>['modelSettings'];\n  /** Require approval for tool calls. Boolean (gate all / none) or a per-call function policy. */\n  requireToolApproval?: AgentExecutionOptions<OUTPUT>['requireToolApproval'];\n  /** Automatically resume suspended tools */\n  autoResumeSuspendedTools?: boolean;\n  /** Maximum number of tool calls to execute concurrently */\n  toolCallConcurrency?: number;\n  /** Whether to include raw chunks in the stream output */\n  includeRawChunks?: boolean;\n  /** Maximum processor retries */\n  maxProcessorRetries?: number;\n  /** Structured output configuration */\n  structuredOutput?: AgentExecutionOptions<OUTPUT>['structuredOutput'];\n  /** Version overrides for sub-agent delegation */\n  versions?: AgentExecutionOptions<OUTPUT>['versions'];\n  /** Callback when chunk is received */\n  onChunk?: (chunk: ChunkType<OUTPUT>) => void | Promise<void>;\n  /** Callback when step finishes */\n  onStepFinish?: (result: AgentStepFinishEventData) => void | Promise<void>;\n  /** Callback when execution finishes — receives rich step data (text, steps, toolResults) */\n  onFinish?: MastraOnFinishCallback<OUTPUT>;\n  /** Callback on error */\n  onError?: ({ error }: { error: Error | string }) => void | Promise<void>;\n  /** Callback when workflow suspends (e.g., for tool approval) */\n  onSuspended?: (data: AgentSuspendedEventData) => void | Promise<void>;\n  /** Callback when execution is aborted via abortSignal */\n  onAbort?: AgentExecutionOptions<OUTPUT>['onAbort'];\n  /** Callback fired after each agentic-loop iteration */\n  onIterationComplete?: AgentExecutionOptions<OUTPUT>['onIterationComplete'];\n  /** Additional system message appended after context but before user messages. */\n  system?: AgentExecutionOptions<OUTPUT>['system'];\n  /** When true, background tasks are disabled for this run. */\n  disableBackgroundTasks?: AgentExecutionOptions<OUTPUT>['disableBackgroundTasks'];\n  /** Tracing options forwarded to the agent/model spans. */\n  tracingOptions?: AgentExecutionOptions<OUTPUT>['tracingOptions'];\n  /** Per-call actor signal forwarded to FGA checks and tool execution. */\n  actor?: AgentExecutionOptions<OUTPUT>['actor'];\n  /**\n   * Per-invocation tool payload transform policy. The closure rides on the\n   * in-process run registry; only the JSON-safe `targets` shadow is serialized\n   * for cross-process engines.\n   */\n  transform?: AgentExecutionOptions<OUTPUT>['transform'];\n  /**\n   * Per-step preparation hook. Closure-only: stored on the in-process run\n   * registry and invoked as a `PrepareStepProcessor` at the start of every\n   * iteration. Cross-process resumes lose the hook.\n   */\n  prepareStep?: AgentExecutionOptions<OUTPUT>['prepareStep'];\n  /**\n   * Per-call `isTaskComplete` policy. Scorer instances and `onComplete` are\n   * closure-only and live on the in-process run registry; the JSON-safe\n   * primitives (`strategy`, `timeout`, `parallel`, `suppressFeedback`,\n   * `scorerNames`) are serialized for cross-process observability.\n   */\n  isTaskComplete?: AgentExecutionOptions<OUTPUT>['isTaskComplete'];\n  /**\n   * Sub-agent delegation hooks (`onDelegationStart`, `onDelegationComplete`,\n   * `messageFilter`, etc.). The callbacks are forwarded into `convertTools`\n   * at prepare time and burned into the sub-agent `CoreTool` wrappers on the\n   * in-process run registry. Cross-process resumes lose the callbacks (only\n   * `includeSubAgentToolResultsInModelContext` would be JSON-safe), so a\n   * fresh worker degrades to default delegation behaviour.\n   */\n  delegation?: AgentExecutionOptions<OUTPUT>['delegation'];\n  /**\n   * When set, `stream()` delegates to the idle-loop wrapper that keeps the\n   * outer stream open across background-task continuations — the same\n   * behaviour as the now-deprecated `streamUntilIdle()`.\n   *\n   * Pass `true` for default idle timeout (5 min), or `{ maxIdleMs }` to\n   * customise.\n   *\n   * @example\n   * ```typescript\n   * const { output, cleanup } = await durableAgent.stream('Research topic', {\n   *   untilIdle: true,\n   *   memory: { thread: 't1', resource: 'u1' },\n   * });\n   * ```\n   */\n  untilIdle?: boolean | { maxIdleMs?: number };\n  /** When true, the in-loop background task check step skips waiting (streamUntilIdle sets this) */\n  _skipBgTaskWait?: boolean;\n  /**\n   * External abort signal. The durable agent always installs its own internal\n   * `AbortController` for the run; when this signal is provided, its `abort`\n   * event is forwarded to the internal controller so either source can cancel\n   * the run.\n   *\n   * Cross-process resumes (e.g. Inngest after a worker restart) cannot\n   * recover the signal — call `resume(runId, ..., { abortSignal })` with a\n   * fresh signal on each segment if you need abortability post-resume.\n   */\n  abortSignal?: AbortSignal;\n}\n\n/**\n * Result from DurableAgent.stream()\n */\nexport interface DurableAgentStreamResult<OUTPUT = undefined> {\n  /** The streaming output */\n  output: MastraModelOutput<OUTPUT>;\n  /** The full stream - delegates to output.fullStream for server compatibility */\n  readonly fullStream: ReadableStream<any>;\n  /** The unique run ID for this execution */\n  runId: string;\n  /** Thread ID if using memory */\n  threadId?: string;\n  /** Resource ID if using memory */\n  resourceId?: string;\n  /** Cleanup function to call when done (unsubscribes from pubsub) */\n  cleanup: () => void;\n  /**\n   * Abort the run. Flips the internal `AbortController` for this run, which\n   * surfaces as an `AbortError` inside the durable LLM-execution step and\n   * is bridged to the user's `onAbort` callback via the run's pubsub topic.\n   *\n   * Safe to call after the run has already finished — it's a no-op in that\n   * case.\n   */\n  abort: (reason?: unknown) => void;\n}\n\n/**\n * Configuration for DurableAgent - wraps an existing Agent with durable execution\n */\nexport interface DurableAgentConfig<\n  TAgentId extends string = string,\n  TTools extends ToolsInput = ToolsInput,\n  TOutput = undefined,\n> {\n  /**\n   * The Agent to wrap with durable execution capabilities.\n   * All agent methods (getModel, listTools, etc.) delegate to this agent.\n   */\n  agent: Agent<TAgentId, TTools, TOutput>;\n\n  /**\n   * Optional ID override. Defaults to agent.id.\n   */\n  id?: TAgentId;\n\n  /**\n   * Optional name override. Defaults to agent.name.\n   */\n  name?: string;\n\n  /**\n   * PubSub instance for streaming events.\n   * Optional - if not provided, defaults to EventEmitterPubSub.\n   */\n  pubsub?: PubSub;\n\n  /**\n   * Cache instance for storing stream events.\n   * Enables resumable streams - clients can disconnect and reconnect\n   * without missing events.\n   *\n   * - If not provided: Inherits from Mastra instance, or uses InMemoryServerCache\n   * - If provided: Uses the provided cache backend (e.g., Redis)\n   * - If set to `false`: Disables caching (streams are not resumable)\n   */\n  cache?: MastraServerCache | false;\n\n  /**\n   * Maximum steps for the agentic loop.\n   * Defaults to the workflow default if not specified.\n   */\n  maxSteps?: number;\n\n  /**\n   * Timeout in milliseconds before automatic cleanup of registry entries\n   * after a stream finishes or errors. This provides a grace period for\n   * late observers to access the stream.\n   *\n   * Defaults to 30000 (30 seconds).\n   * Set to 0 to disable auto-cleanup (manual cleanup() required).\n   */\n  cleanupTimeoutMs?: number;\n}\n\n/**\n * DurableAgent wraps an existing Agent with durable execution capabilities.\n *\n * Key features:\n * 1. Resumable streams - clients can disconnect and reconnect without missing events\n * 2. Serializable workflow inputs - works with durable execution engines\n * 3. PubSub-based streaming - events flow through pubsub for distribution\n *\n * DurableAgent extends Agent, delegating most methods to the wrapped agent.\n * It overrides stream() to use durable execution with the agentic workflow.\n *\n * Subclasses (EventedAgent, InngestAgent) override executeWorkflow() to\n * customize how the workflow is executed.\n *\n * @example\n * ```typescript\n * import { Agent } from '@mastra/core/agent';\n * import { DurableAgent } from '@mastra/core/agent/durable';\n *\n * const agent = new Agent({\n *   id: 'my-agent',\n *   instructions: 'You are a helpful assistant',\n *   model: openai('gpt-4'),\n * });\n *\n * const durableAgent = new DurableAgent({ agent });\n *\n * const { output, runId, cleanup } = await durableAgent.stream('Hello!');\n * const text = await output.text;\n * cleanup();\n * ```\n */\nexport class DurableAgent<\n  TAgentId extends string = string,\n  TTools extends ToolsInput = ToolsInput,\n  TOutput = undefined,\n> extends Agent<TAgentId, TTools, TOutput> {\n  /** The wrapped agent */\n  readonly #wrappedAgent: Agent<TAgentId, TTools, TOutput>;\n\n  /** Registry for per-run non-serializable state */\n  readonly #runRegistry: ExtendedRunRegistry;\n\n  /** The durable workflow for agent execution */\n  #workflow: ReturnType<typeof createDurableAgenticWorkflow> | null = null;\n\n  /** Maximum steps for the agentic loop */\n  readonly #maxSteps?: number;\n\n  /** Inner pubsub (before CachingPubSub wrapper) */\n  #innerPubsub: PubSub;\n\n  /** Whether the user explicitly provided a pubsub (don't override with mastra.pubsub) */\n  readonly #hasCustomPubsub: boolean;\n\n  /** User-provided cache (undefined = inherit from mastra, false = disabled) */\n  #cacheConfig: MastraServerCache | false | undefined;\n\n  /** Resolved cache instance (lazily initialized) */\n  #resolvedCache: MastraServerCache | null = null;\n\n  /** CachingPubSub instance (lazily initialized) */\n  #cachingPubsub: PubSub | null = null;\n\n  /** Mastra instance (set via __setMastra when registered) */\n  #mastra: Mastra | undefined;\n\n  /** Active streamUntilIdle wrappers keyed by scope (threadId|resourceId) */\n  #activeStreamUntilIdle = new Map<string, () => void>();\n\n  /** Timeout for auto-cleanup after stream finishes (0 = disabled) */\n  readonly #cleanupTimeoutMs: number;\n\n  /**\n   * Create a new DurableAgent that wraps an existing Agent\n   */\n  constructor(config: DurableAgentConfig<TAgentId, TTools, TOutput>) {\n    const { agent, id: idOverride, name: nameOverride, pubsub, cache, maxSteps, cleanupTimeoutMs } = config;\n\n    // Use provided id/name or fall back to agent.id/agent.name\n    const agentId = idOverride ?? agent.id;\n    const agentName = nameOverride ?? agent.name ?? agent.id;\n\n    // Call Agent constructor with minimal config - we delegate to the wrapped agent\n    super({\n      id: agentId as TAgentId,\n      name: agentName,\n      // Delegate to wrapped agent's instructions\n      instructions: ({ requestContext }) => agent.getInstructions({ requestContext }),\n      // We need to provide model to satisfy the base class, but we'll delegate to wrapped agent\n      model: (agent as any).__model ?? agent.getModel(),\n    });\n\n    this.#wrappedAgent = agent;\n    this.#runRegistry = new ExtendedRunRegistry();\n    this.#maxSteps = maxSteps;\n    this.#hasCustomPubsub = !!pubsub;\n    this.#innerPubsub = pubsub ?? new EventEmitterPubSub();\n    this.#cacheConfig = cache;\n    this.#cleanupTimeoutMs = cleanupTimeoutMs ?? 30_000;\n  }\n\n  // ===========================================================================\n  // Lazy PubSub/Cache initialization (allows inheriting cache from Mastra)\n  // ===========================================================================\n\n  /**\n   * Get the resolved cache instance.\n   * Lazily initialized to allow inheriting from Mastra.\n   */\n  get cache(): MastraServerCache | null {\n    this.#ensurePubsubInitialized();\n    return this.#resolvedCache;\n  }\n\n  /**\n   * Get the PubSub instance.\n   * Returns CachingPubSub if caching is enabled, otherwise the inner pubsub.\n   */\n  get pubsub(): PubSub {\n    this.#ensurePubsubInitialized();\n    return this.#cachingPubsub!;\n  }\n\n  /**\n   * Ensure pubsub and cache are initialized.\n   * Called lazily on first access to allow inheriting cache from Mastra.\n   */\n  #ensurePubsubInitialized(): void {\n    if (this.#cachingPubsub) return;\n\n    if (this.#cacheConfig === false) {\n      // Caching explicitly disabled\n      this.#cachingPubsub = this.#innerPubsub;\n      this.#resolvedCache = null;\n    } else if (this.#innerPubsub instanceof CachingPubSub) {\n      // The inner pubsub already provides caching/replay. This happens when the\n      // user passes a CachingPubSub to `new Mastra({ pubsub })`: on registration\n      // the agent adopts mastra.pubsub as its inner transport. Wrapping it again\n      // in a second CachingPubSub that shares the same cache would store every\n      // event twice (once per layer, with consecutive indices), so observe()/\n      // replay would deliver the buffered prefix doubled (issue #18148). Reuse\n      // the existing instance instead of double-wrapping.\n      this.#cachingPubsub = this.#innerPubsub;\n      this.#resolvedCache = this.#cacheConfig ?? this.#mastra?.serverCache ?? null;\n    } else {\n      // Resolve cache: user-provided > mastra's cache > default InMemoryServerCache\n      const resolvedCache = this.#cacheConfig ?? this.#mastra?.serverCache ?? new InMemoryServerCache();\n      this.#resolvedCache = resolvedCache;\n      this.#cachingPubsub = new CachingPubSub(this.#innerPubsub, resolvedCache);\n    }\n  }\n\n  // ===========================================================================\n  // Delegate to wrapped agent\n  // ===========================================================================\n\n  /**\n   * Get the wrapped agent instance.\n   */\n  get agent(): Agent<TAgentId, TTools, TOutput> {\n    return this.#wrappedAgent;\n  }\n\n  /**\n   * Get the run registry (for testing and advanced usage)\n   */\n  get runRegistry(): ExtendedRunRegistry {\n    return this.#runRegistry;\n  }\n\n  /**\n   * Get the max steps configured for this agent\n   */\n  get maxSteps(): number | undefined {\n    return this.#maxSteps;\n  }\n\n  /**\n   * Get the cleanup timeout in milliseconds.\n   * Returns 0 if auto-cleanup is disabled.\n   */\n  get cleanupTimeoutMs(): number {\n    return this.#cleanupTimeoutMs;\n  }\n\n  // Delegate Agent methods to wrapped agent\n  override getModel(options?: any) {\n    return this.#wrappedAgent.getModel(options);\n  }\n\n  override getInstructions(options?: any) {\n    return this.#wrappedAgent.getInstructions(options);\n  }\n\n  override getDefaultOptions(options?: any) {\n    return this.#wrappedAgent.getDefaultOptions(options);\n  }\n\n  override listTools(options?: any) {\n    return this.#wrappedAgent.listTools(options);\n  }\n\n  override getMemory() {\n    return this.#wrappedAgent.getMemory();\n  }\n\n  override getVoice() {\n    return this.#wrappedAgent.getVoice();\n  }\n\n  // ===========================================================================\n  // Editor / fork delegation\n  //\n  // The base Agent serves tools/instructions/model from its own private fields,\n  // but a DurableAgent serves all of them from the wrapped agent (see the\n  // delegating getters above). The editor applies stored overrides per request\n  // by calling `__fork()` and then mutating the fork via `__updateInstructions`\n  // / `__updateModel` / `__setTools`, and inspecting it via `__getEditorConfig`\n  // / `__getOverridableFields`. If those operated on the DurableAgent's own\n  // (unused) base fields the served agent would silently lose its tools and\n  // ignore overrides, so forward them to the wrapped agent — it stays the single\n  // source of truth.\n  // ===========================================================================\n\n  override __getEditorConfig() {\n    return this.#wrappedAgent.__getEditorConfig();\n  }\n\n  override __getOverridableFields() {\n    return this.#wrappedAgent.__getOverridableFields();\n  }\n\n  override __updateInstructions(instructions: Parameters<Agent<TAgentId, TTools, TOutput>['__updateInstructions']>[0]) {\n    this.#wrappedAgent.__updateInstructions(instructions);\n  }\n\n  override __updateModel(config: Parameters<Agent<TAgentId, TTools, TOutput>['__updateModel']>[0]) {\n    this.#wrappedAgent.__updateModel(config);\n  }\n\n  override __setTools(tools: Parameters<Agent<TAgentId, TTools, TOutput>['__setTools']>[0]) {\n    this.#wrappedAgent.__setTools(tools);\n  }\n\n  /**\n   * Create a per-request clone for applying stored editor overrides.\n   *\n   * The base `Agent.__fork()` builds a bare `new Agent(...)`, which for a\n   * DurableAgent would drop the wrapped agent and every delegating override\n   * (tools, model, memory, voice, durable streaming) — the served fork ends up a\n   * plain `Agent` with no tools. Instead, fork the wrapped agent (so overrides\n   * applied to this fork don't mutate the singleton) and re-wrap it in the same\n   * durable subclass, preserving pubsub/cache/run configuration.\n   *\n   * @internal\n   */\n  override __fork(): Agent<TAgentId, TTools, TOutput> {\n    const innerFork = this.#wrappedAgent.__fork();\n\n    const Ctor = this.constructor as new (\n      config: DurableAgentConfig<TAgentId, TTools, TOutput>,\n    ) => DurableAgent<TAgentId, TTools, TOutput>;\n\n    const fork = new Ctor({\n      agent: innerFork,\n      id: this.id,\n      name: this.name,\n      pubsub: this.#hasCustomPubsub ? this.#innerPubsub : undefined,\n      cache: this.#cacheConfig,\n      maxSteps: this.#maxSteps,\n      cleanupTimeoutMs: this.#cleanupTimeoutMs,\n    });\n\n    // Preserve runtime state set after construction (mastra registration and the\n    // wired inner pubsub, e.g. mastra.pubsub) without re-triggering registration\n    // side effects — mirrors Agent.__fork().\n    if (this.#mastra) {\n      fork.#mastra = this.#mastra;\n    }\n    fork.#innerPubsub = this.#innerPubsub;\n    fork.source = this.source;\n    // `_agentNetworkAppend` is a private base-class flag; copy it via an indexed\n    // cast (the same idiom the base uses in `toRawConfig()`) so the fork mirrors\n    // `Agent.__fork()` without widening the field's visibility.\n    (fork as unknown as { _agentNetworkAppend: unknown })._agentNetworkAppend = (\n      this as unknown as { _agentNetworkAppend: unknown }\n    )._agentNetworkAppend;\n\n    // DurableAgent intentionally diverges from Agent's `stream` signature, so the\n    // re-wrapped fork is bridged to the base `Agent` return type here. The editor's\n    // fork-then-mutate contract only relies on the base Agent surface.\n    return fork as unknown as Agent<TAgentId, TTools, TOutput>;\n  }\n\n  // ===========================================================================\n  // Protected methods for subclass overrides\n  // ===========================================================================\n\n  /**\n   * Get the PubSub instance for use by subclasses.\n   * @internal\n   */\n  protected get pubsubInternal(): PubSub {\n    return this.pubsub;\n  }\n\n  /**\n   * Get the run registry for use by subclasses.\n   * @internal\n   */\n  protected get runRegistryInternal(): ExtendedRunRegistry {\n    return this.#runRegistry;\n  }\n\n  /**\n   * Execute the durable workflow.\n   *\n   * Subclasses override this method to customize how the workflow is executed:\n   * - DurableAgent (this): Runs the workflow directly via createRun + start\n   * - EventedAgent: Uses run.startAsync() for fire-and-forget execution\n   * - InngestAgent: Uses inngest.send() to trigger Inngest function\n   *\n   * @param runId - The unique run ID\n   * @param workflowInput - The serialized workflow input\n   * @internal\n   */\n  protected async executeWorkflow(runId: string, workflowInput: DurableAgenticWorkflowInput): Promise<void> {\n    const workflow = this.getWorkflow();\n    const entry = globalRunRegistry.get(runId);\n    const requestContext = entry?.requestContext;\n\n    const run = await workflow.createRun({ runId, pubsub: this.pubsub });\n    // Parent the workflow run under the AGENT_RUN span so the trace exports under it.\n    const result = await run.start({\n      inputData: workflowInput,\n      requestContext,\n      ...createObservabilityContext({ currentSpan: entry?.agentSpan }),\n    });\n    if (result?.status === 'failed') {\n      const error = new Error((result as any).error?.message || 'Workflow execution failed');\n      await this.emitError(runId, error);\n    }\n  }\n\n  /**\n   * Create the durable workflow for this agent.\n   *\n   * Subclasses can override this method to use a different workflow implementation:\n   * - DurableAgent (this): Uses createDurableAgenticWorkflow()\n   * - InngestAgent: Uses createInngestDurableAgenticWorkflow()\n   *\n   * @internal\n   */\n  protected createWorkflow(): ReturnType<typeof createDurableAgenticWorkflow> {\n    return createDurableAgenticWorkflow({\n      maxSteps: this.#maxSteps,\n    });\n  }\n\n  /**\n   * Emit an error event to pubsub.\n   *\n   * @param runId - The run ID\n   * @param error - The error to emit\n   * @internal\n   */\n  protected async emitError(runId: string, error: Error): Promise<void> {\n    // End the root spans on error so the trace exports (mirrors the non-durable map-results-step).\n    endRunSpansWithError(runId, error);\n    await emitErrorEvent(this.pubsub, runId, error);\n  }\n\n  // ===========================================================================\n  // Public API\n  // ===========================================================================\n\n  /**\n   * Stream a response from the agent using durable execution.\n   */\n  // @ts-expect-error - Intentionally different signature for durable execution\n  async stream(\n    messages: MessageListInput,\n    options?: DurableAgentStreamOptions<TOutput>,\n  ): Promise<DurableAgentStreamResult<TOutput>> {\n    // Delegate to the idle-loop wrapper when `untilIdle` is set.\n    // Strip `untilIdle` before passing to the wrapper so its internal\n    // agent.stream() call doesn't recurse.\n    if (options?.untilIdle) {\n      const { untilIdle, ...rest } = options;\n      const maxIdleMs = typeof untilIdle === 'object' ? untilIdle.maxIdleMs : undefined;\n      return runDurableStreamUntilIdle<TOutput>(\n        this as unknown as DurableAgent<any, any, TOutput>,\n        messages,\n        { ...rest, maxIdleMs },\n        {\n          activeStreams: this.#activeStreamUntilIdle,\n          bgManager: this.#mastra?.backgroundTaskManager,\n        },\n      );\n    }\n\n    // 1. Prepare for durable execution (non-durable phase)\n    const preparation = await prepareForDurableExecution<TOutput>({\n      agent: this.#wrappedAgent as Agent<string, any, TOutput>,\n      messages,\n      options: options as AgentExecutionOptions<TOutput>,\n      runId: options?.runId,\n      requestContext: options?.requestContext,\n      mastra: this.#mastra,\n    });\n\n    const { runId, messageId, workflowInput, registryEntry, messageList, threadId, resourceId } = preparation;\n\n    // 1a. Install the abort controller for this run. The controller is owned\n    // by this DurableAgent instance; the result's abort() method flips it,\n    // and the durable LLM-execution step reads `abortSignal` off the registry\n    // to thread it into the model call + abort short-circuits. If the caller\n    // also supplied an external signal, forward its abort to the internal\n    // controller so either source can cancel the run.\n    const abortController = new AbortController();\n    if (options?.abortSignal) {\n      if (options.abortSignal.aborted) {\n        abortController.abort((options.abortSignal as AbortSignal & { reason?: unknown }).reason);\n      } else {\n        options.abortSignal.addEventListener(\n          'abort',\n          () => abortController.abort((options.abortSignal as AbortSignal & { reason?: unknown }).reason),\n          { once: true },\n        );\n      }\n    }\n    registryEntry.abortController = abortController;\n    registryEntry.abortSignal = abortController.signal;\n\n    // 2. Register non-serializable state (both local and global registries)\n    this.#runRegistry.registerWithMessageList(runId, registryEntry, messageList, { threadId, resourceId });\n    globalRunRegistry.set(runId, { ...registryEntry, messageList });\n\n    // Track cleanup state to avoid double cleanup\n    let cleanedUp = false;\n    let autoCleanupTimer: ReturnType<typeof setTimeout> | null = null;\n\n    // Schedule automatic registry cleanup after stream ends\n    const scheduleAutoCleanup = () => {\n      if (autoCleanupTimer || cleanedUp || this.#cleanupTimeoutMs === 0) return;\n      autoCleanupTimer = setTimeout(() => {\n        if (!cleanedUp) {\n          this.#runRegistry.cleanup(runId);\n          globalRunRegistry.delete(runId);\n          this.#clearPubsubTopic(runId);\n          cleanedUp = true;\n        }\n      }, this.#cleanupTimeoutMs);\n    };\n\n    // 3. Create the durable agent stream (subscribes to pubsub)\n    const {\n      output,\n      cleanup: streamCleanup,\n      ready,\n    } = createDurableAgentStream<TOutput>({\n      pubsub: this.pubsub,\n      runId,\n      messageId,\n      model: {\n        modelId: workflowInput.modelConfig.modelId,\n        provider: workflowInput.modelConfig.provider,\n        version: 'v3',\n      },\n      threadId,\n      resourceId,\n      onChunk: options?.onChunk,\n      onStepFinish: options?.onStepFinish,\n      onFinish: options?.onFinish,\n      onStreamFinished: scheduleAutoCleanup,\n      onError: async error => {\n        await options?.onError?.(error);\n        scheduleAutoCleanup();\n      },\n      onSuspended: options?.onSuspended,\n      onAbort: async data => {\n        try {\n          await (options?.onAbort as ((event: any) => void | Promise<void>) | undefined)?.(data);\n        } finally {\n          scheduleAutoCleanup();\n        }\n      },\n      // onIterationComplete is NOT forwarded here — the dowhile predicate\n      // now calls it in-process from globalRunRegistry and honors its return\n      // value ({ continue, feedback }). The pubsub ITERATION_COMPLETE event\n      // still fires for external observability subscribers.\n      closeOnSuspend: (options as any)?.[CLOSE_ON_SUSPEND] === true,\n      structuredOutput: registryEntry.structuredOutput as any,\n      outputProcessors: registryEntry.outputProcessors,\n      messageList,\n    });\n\n    // 4. Wait for subscription to be ready, then execute workflow\n    // This prevents race conditions where events are published before subscription\n    const workflowExecution = ready\n      .then(async () => {\n        // Emit 'start' chunk before the workflow begins (matches regular agent's stream.ts).\n        // Only the initial stream() path emits 'start'; resume() does not.\n        await emitChunkEvent(this.pubsub, runId, {\n          type: 'start',\n          runId,\n          from: ChunkFrom.AGENT,\n          payload: { id: workflowInput.agentId, messageId },\n        });\n        return this.executeWorkflow(runId, workflowInput);\n      })\n      .catch(error => {\n        void this.emitError(runId, error);\n      });\n    const trackedEntry = globalRunRegistry.get(runId);\n    if (trackedEntry) {\n      trackedEntry.workflowExecution = workflowExecution;\n    }\n\n    // 5. Create cleanup function (cancels auto-cleanup timer if called)\n    const cleanup = () => {\n      if (autoCleanupTimer) {\n        clearTimeout(autoCleanupTimer);\n        autoCleanupTimer = null;\n      }\n      if (!cleanedUp) {\n        streamCleanup();\n        this.#runRegistry.cleanup(runId);\n        globalRunRegistry.delete(runId);\n        this.#clearPubsubTopic(runId);\n        cleanedUp = true;\n      }\n    };\n\n    const abort = (reason?: unknown) => {\n      if (!abortController.signal.aborted) {\n        abortController.abort(reason);\n      }\n    };\n\n    return {\n      output,\n      get fullStream() {\n        return output.fullStream as ReadableStream<any>;\n      },\n      runId,\n      threadId,\n      resourceId,\n      cleanup,\n      abort,\n    };\n  }\n\n  /**\n   * Resume a suspended workflow execution.\n   */\n  async resume(\n    runId: string,\n    resumeData: unknown,\n    options?: {\n      onChunk?: (chunk: ChunkType<TOutput>) => void | Promise<void>;\n      onStepFinish?: (result: AgentStepFinishEventData) => void | Promise<void>;\n      onFinish?: MastraOnFinishCallback<TOutput>;\n      onError?: ({ error }: { error: Error | string }) => void | Promise<void>;\n      onSuspended?: (data: AgentSuspendedEventData) => void | Promise<void>;\n      /**\n       * Optional abort signal scoped to the resumed segment. Forwarded onto a\n       * fresh internal controller installed on the run's registry entry, so\n       * `result.abort()` and the external signal can both cancel the resumed\n       * iterations.\n       */\n      abortSignal?: AbortSignal;\n      /**\n       * When set, keep the resumed segment open after the workflow's initial\n       * resume turn finishes and continue streaming follow-up turns until the\n       * agent goes idle (no in-flight background tasks for the same memory\n       * scope). Same semantics as `stream({ untilIdle })`. Pass an object to\n       * tune `maxIdleMs`.\n       */\n      untilIdle?: boolean | { maxIdleMs?: number };\n    },\n  ): Promise<DurableAgentStreamResult<TOutput>> {\n    // Delegate to the idle-loop wrapper when `untilIdle` is set. Strip\n    // `untilIdle` before passing to the wrapper so the inner agent.resume()\n    // call (and subsequent agent.stream([]) continuations) don't recurse.\n    if (options?.untilIdle) {\n      const { untilIdle, ...rest } = options;\n      const maxIdleMs = typeof untilIdle === 'object' ? untilIdle.maxIdleMs : undefined;\n      return runResumeDurableStreamUntilIdle<TOutput>(\n        this as unknown as DurableAgent<any, any, TOutput>,\n        runId,\n        resumeData,\n        { ...rest, maxIdleMs } as DurableAgentStreamOptions<TOutput> & { maxIdleMs?: number },\n        {\n          activeStreams: this.#activeStreamUntilIdle,\n          bgManager: this.#mastra?.backgroundTaskManager,\n        },\n      );\n    }\n\n    const entry = this.#runRegistry.get(runId);\n    if (!entry) {\n      throw new Error(`No registry entry found for run ${runId}. Cannot resume.`);\n    }\n\n    // Install a fresh abort controller for the resumed segment. The original\n    // controller is gone (the stream that owned it has already settled), so\n    // we overwrite the registry slot. If the caller passed an external\n    // signal, forward it onto the new internal controller.\n    const abortController = new AbortController();\n    if (options?.abortSignal) {\n      if (options.abortSignal.aborted) {\n        abortController.abort((options.abortSignal as AbortSignal & { reason?: unknown }).reason);\n      } else {\n        options.abortSignal.addEventListener(\n          'abort',\n          () => abortController.abort((options.abortSignal as AbortSignal & { reason?: unknown }).reason),\n          { once: true },\n        );\n      }\n    }\n    entry.abortController = abortController;\n    entry.abortSignal = abortController.signal;\n    const globalEntryForAbort = globalRunRegistry.get(runId);\n    if (globalEntryForAbort) {\n      globalEntryForAbort.abortController = abortController;\n      globalEntryForAbort.abortSignal = abortController.signal;\n    }\n\n    const memoryInfo = this.#runRegistry.getMemoryInfo(runId);\n\n    // Track cleanup state to avoid double cleanup\n    let cleanedUp = false;\n    let autoCleanupTimer: ReturnType<typeof setTimeout> | null = null;\n\n    const scheduleAutoCleanup = () => {\n      if (autoCleanupTimer || cleanedUp || this.#cleanupTimeoutMs === 0) return;\n      autoCleanupTimer = setTimeout(() => {\n        if (!cleanedUp) {\n          this.#runRegistry.cleanup(runId);\n          globalRunRegistry.delete(runId);\n          this.#clearPubsubTopic(runId);\n          cleanedUp = true;\n        }\n      }, this.#cleanupTimeoutMs);\n    };\n\n    const globalEntry = globalRunRegistry.get(runId);\n    const resumeModel = globalEntry?.model as any;\n\n    // Skip events already broadcast by the original run (e.g. the SUSPENDED\n    // chunk that paused it). Without this, a resume that closes on suspend\n    // (resumeGenerate) would immediately close on the replayed SUSPENDED.\n    const resumeOffset = await this.#getPubsubOffset(runId);\n\n    const {\n      output,\n      cleanup: streamCleanup,\n      ready,\n    } = createDurableAgentStream<TOutput>({\n      pubsub: this.pubsub,\n      runId,\n      messageId: crypto.randomUUID(),\n      model: {\n        modelId: resumeModel?.modelId,\n        provider: resumeModel?.provider,\n        version: 'v3',\n      },\n      threadId: memoryInfo?.threadId,\n      resourceId: memoryInfo?.resourceId,\n      offset: resumeOffset,\n      onChunk: options?.onChunk,\n      onStepFinish: options?.onStepFinish,\n      onFinish: options?.onFinish,\n      onStreamFinished: scheduleAutoCleanup,\n      onError: async error => {\n        await options?.onError?.(error);\n        scheduleAutoCleanup();\n      },\n      onSuspended: options?.onSuspended,\n      closeOnSuspend: (options as any)?.[CLOSE_ON_SUSPEND] === true,\n      structuredOutput: entry.structuredOutput as any,\n      outputProcessors: entry.outputProcessors,\n      messageList: globalEntry?.messageList ?? this.#runRegistry.getMessageList(runId),\n    });\n\n    // Wait for subscription to be ready, then resume workflow\n    const workflow = this.getWorkflow();\n    const requestContext = globalRunRegistry.get(runId)?.requestContext;\n\n    // Open a fresh AGENT_RUN + MODEL_GENERATION for the resumed segment on the same\n    // traceId — the originals were ended as `suspended` and can't be reopened. Post-resume\n    // steps + terminal end() target these via the registry override. (Linking = follow-up.)\n    const origTraceId = entry.agentSpan?.traceId;\n    const origSpanId = entry.agentSpan?.id;\n    if (origTraceId && this.#mastra?.observability) {\n      try {\n        const ag = this.#wrappedAgent as Agent<string, any, any>;\n        // Match non-durable Agent.stream() resume-span shape: same name suffix\n        // `(resumed)`, forward agent-level tracingPolicy, link to the original\n        // span via `resumedFromSpanId` metadata, and carry the resolvedVersionId.\n        const rawConfig = typeof (ag as any).toRawConfig === 'function' ? (ag as any).toRawConfig() : undefined;\n        const resolvedVersionId = rawConfig?.resolvedVersionId as string | undefined;\n        const agentTracingPolicy = typeof ag.getTracingPolicy === 'function' ? ag.getTracingPolicy() : undefined;\n        const resumeAgentSpan = getOrCreateSpan({\n          type: SpanType.AGENT_RUN,\n          name: `agent run: '${ag.id}' (resumed)`,\n          entityType: EntityType.AGENT,\n          entityId: ag.id,\n          entityName: ag.name,\n          metadata: {\n            runId,\n            resumed: true,\n            ...(origSpanId ? { resumedFromSpanId: origSpanId } : {}),\n            ...(resolvedVersionId ? { entityVersionId: resolvedVersionId } : {}),\n          },\n          tracingPolicy: agentTracingPolicy,\n          tracingOptions: { traceId: origTraceId },\n          requestContext,\n          mastra: this.#mastra,\n        });\n        const resumeModelSpan = resumeAgentSpan?.createChildSpan({\n          type: SpanType.MODEL_GENERATION,\n          name: `llm: '${resumeModel?.modelId ?? ''}'`,\n          attributes: { model: resumeModel?.modelId, provider: resumeModel?.provider, streaming: true },\n          metadata: { runId, resumed: true },\n          requestContext,\n        });\n        for (const reg of [entry, globalRunRegistry.get(runId)]) {\n          if (!reg) continue;\n          reg.resumeAgentSpan = resumeAgentSpan;\n          reg.resumeModelSpan = resumeModelSpan;\n          reg.resumeAgentSpanData = resumeAgentSpan?.exportSpan();\n          reg.resumeModelSpanData = resumeModelSpan?.exportSpan();\n        }\n      } catch (error) {\n        // Span bookkeeping must never block resume.\n        this.#mastra?.getLogger?.()?.warn?.(`[DurableAgent] Failed to open resume spans: ${error}`);\n      }\n    }\n\n    // Capture the prior workflow execution BEFORE creating the new promise.\n    // If we read it inside the `.then()` callback, the global registry will\n    // already point to the NEW promise (assigned synchronously below),\n    // causing a self-referential deadlock.\n    const priorExecution = globalRunRegistry.get(runId)?.workflowExecution;\n\n    const workflowExecution = ready\n      .then(async () => {\n        // Wait for the prior workflow execution (stream / previous resume) to\n        // fully settle so the snapshot is persisted as 'suspended' before we\n        // attempt to resume it.  Without this, the pubsub tool-call-suspended\n        // event can arrive (and the consumer can call resumeStream) before the\n        // engine has finished writing the snapshot, leading to\n        // \"This workflow run was not suspended\".\n        if (priorExecution) {\n          await priorExecution.catch(() => {\n            /* errors already handled by the prior segment */\n          });\n        }\n\n        const run = await workflow.createRun({ runId, pubsub: this.pubsub });\n        const result = await run.resume({\n          resumeData,\n          requestContext,\n          ...createObservabilityContext({ currentSpan: entry.resumeAgentSpan ?? entry.agentSpan }),\n        });\n        if (result?.status === 'failed') {\n          const error = new Error((result as any).error?.message || 'Workflow resume failed');\n          void this.emitError(runId, error);\n        }\n      })\n      .catch(error => {\n        void this.emitError(runId, error);\n      });\n    const trackedResumeEntry = globalRunRegistry.get(runId);\n    if (trackedResumeEntry) {\n      trackedResumeEntry.workflowExecution = workflowExecution;\n    }\n\n    const cleanup = () => {\n      if (autoCleanupTimer) {\n        clearTimeout(autoCleanupTimer);\n        autoCleanupTimer = null;\n      }\n      if (!cleanedUp) {\n        streamCleanup();\n        this.#runRegistry.cleanup(runId);\n        globalRunRegistry.delete(runId);\n        this.#clearPubsubTopic(runId);\n        cleanedUp = true;\n      }\n    };\n\n    const abort = (reason?: unknown) => {\n      if (!abortController.signal.aborted) {\n        abortController.abort(reason);\n      }\n    };\n\n    return {\n      output,\n      get fullStream() {\n        return output.fullStream as ReadableStream<any>;\n      },\n      runId,\n      threadId: memoryInfo?.threadId,\n      resourceId: memoryInfo?.resourceId,\n      cleanup,\n      abort,\n    };\n  }\n\n  /**\n   * Override the inherited `resumeStream()` so that callers using the base\n   * `Agent` API (including `approveToolCall` / `declineToolCall`) are routed\n   * through the durable `resume()` path instead of the regular Agent's\n   * snapshot-based resume.\n   *\n   * Returns just the `MastraModelOutput` (matching the base Agent's return\n   * type) while internally delegating to `this.resume()`.\n   */\n  override async resumeStream(resumeData: any, streamOptions?: any): Promise<MastraModelOutput<TOutput>> {\n    const runId = streamOptions?.runId;\n    if (!runId) {\n      throw new Error('resumeStream() on DurableAgent requires a runId in streamOptions.');\n    }\n    const result = await this.resume(runId, resumeData, {\n      onChunk: streamOptions?.onChunk,\n      onStepFinish: streamOptions?.onStepFinish,\n      onFinish: streamOptions?.onFinish,\n      onError: streamOptions?.onError,\n      // Close the stream when the workflow re-suspends so the caller's\n      // `for await` loop terminates. Without this the stream stays open\n      // indefinitely when the resumed turn hits another suspend point.\n      [CLOSE_ON_SUSPEND]: true,\n    } as Parameters<DurableAgent<TAgentId, TTools, TOutput>['resume']>[2]);\n    return result.output;\n  }\n\n  /**\n   * Override the inherited `approveToolCall()` to route through the durable\n   * `resume()` path.\n   */\n  override async approveToolCall(\n    options: { runId: string; toolCallId?: string } & Record<string, any>,\n  ): Promise<MastraModelOutput<any>> {\n    return this.resumeStream({ approved: true }, options);\n  }\n\n  /**\n   * Override the inherited `declineToolCall()` to route through the durable\n   * `resume()` path.\n   */\n  override async declineToolCall(\n    options: { runId: string; toolCallId?: string } & Record<string, any>,\n  ): Promise<MastraModelOutput<any>> {\n    return this.resumeStream({ approved: false }, options);\n  }\n\n  /**\n   * Generate a complete response from the agent using durable execution.\n   *\n   * Drains the underlying durable stream to completion and returns the same\n   * {@link FullOutput} shape as non-durable `Agent.generate`. The underlying\n   * workflow is identical to `stream()` — it just collects the final result\n   * for callers that don't want to consume chunks themselves.\n   *\n   * This method intentionally re-implements the `stream()` setup rather than\n   * delegating to `this.stream(...)` so that `prepareForDurableExecution` (and\n   * downstream `convertTools`) receives `methodType: 'generate'`. Tool\n   * factories that vary their `CoreTool` output based on the calling method\n   * (e.g. `clientTools` vs server-side tools) rely on this signal — calling\n   * `stream()` here would silently pass `methodType: 'stream'`.\n   *\n   * If the run suspends (e.g. tool approval or `suspend()` from a tool), the\n   * returned output's `finishReason` will be `'suspended'` and\n   * `suspendPayload` will be populated. Use {@link DurableAgent.resumeGenerate}\n   * to continue.\n   *\n   * Note on suspend persistence: for the base `DurableAgent`, the workflow\n   * engine's `run.start()` only resolves after the suspend snapshot is\n   * persisted, so awaiting `workflowExecution` on suspend is sufficient for\n   * a subsequent `resumeGenerate()` to find the snapshot. Subclasses like\n   * `EventedAgent` use a fire-and-forget `run.startAsync()` and therefore\n   * cannot rely on this await for snapshot durability — see the\n   * `EventedAgent` docs for the recommended pattern.\n   */\n  // @ts-expect-error - Intentionally different signature for durable execution\n  async generate(\n    messages: MessageListInput,\n    options?: DurableAgentStreamOptions<TOutput>,\n  ): Promise<FullOutput<TOutput>> {\n    // 1. Prepare for durable execution (non-durable phase)\n    const preparation = await prepareForDurableExecution<TOutput>({\n      agent: this.#wrappedAgent as Agent<string, any, TOutput>,\n      messages,\n      options: options as AgentExecutionOptions<TOutput>,\n      runId: options?.runId,\n      requestContext: options?.requestContext,\n      mastra: this.#mastra,\n      methodType: 'generate',\n    });\n\n    const { runId, messageId, workflowInput, registryEntry, messageList, threadId, resourceId } = preparation;\n\n    // 1a. Install the abort controller for this run. The controller is owned\n    // by this DurableAgent instance; the result's abort() method flips it,\n    // and the durable LLM-execution step reads `abortSignal` off the registry\n    // to thread it into the model call + abort short-circuits. If the caller\n    // also supplied an external signal, forward its abort to the internal\n    // controller so either source can cancel the run.\n    const abortController = new AbortController();\n    if (options?.abortSignal) {\n      if (options.abortSignal.aborted) {\n        abortController.abort((options.abortSignal as AbortSignal & { reason?: unknown }).reason);\n      } else {\n        options.abortSignal.addEventListener(\n          'abort',\n          () => abortController.abort((options.abortSignal as AbortSignal & { reason?: unknown }).reason),\n          { once: true },\n        );\n      }\n    }\n    registryEntry.abortController = abortController;\n    registryEntry.abortSignal = abortController.signal;\n\n    // 2. Register non-serializable state (both local and global registries)\n    this.#runRegistry.registerWithMessageList(runId, registryEntry, messageList, { threadId, resourceId });\n    globalRunRegistry.set(runId, { ...registryEntry, messageList });\n\n    // Track cleanup state to avoid double cleanup\n    let cleanedUp = false;\n    let autoCleanupTimer: ReturnType<typeof setTimeout> | null = null;\n\n    // Schedule automatic registry cleanup after stream ends\n    const scheduleAutoCleanup = () => {\n      if (autoCleanupTimer || cleanedUp || this.#cleanupTimeoutMs === 0) return;\n      autoCleanupTimer = setTimeout(() => {\n        if (!cleanedUp) {\n          this.#runRegistry.cleanup(runId);\n          globalRunRegistry.delete(runId);\n          this.#clearPubsubTopic(runId);\n          cleanedUp = true;\n        }\n      }, this.#cleanupTimeoutMs);\n    };\n\n    // 3. Create the durable agent stream (subscribes to pubsub)\n    const {\n      output,\n      cleanup: streamCleanup,\n      ready,\n    } = createDurableAgentStream<TOutput>({\n      pubsub: this.pubsub,\n      runId,\n      messageId,\n      model: {\n        modelId: workflowInput.modelConfig.modelId,\n        provider: workflowInput.modelConfig.provider,\n        version: 'v3',\n      },\n      threadId,\n      resourceId,\n      onChunk: options?.onChunk,\n      onStepFinish: options?.onStepFinish,\n      onFinish: options?.onFinish,\n      onStreamFinished: scheduleAutoCleanup,\n      onError: async error => {\n        await options?.onError?.(error);\n        scheduleAutoCleanup();\n      },\n      onSuspended: options?.onSuspended,\n      onAbort: async data => {\n        try {\n          await (options?.onAbort as ((event: any) => void | Promise<void>) | undefined)?.(data);\n        } finally {\n          scheduleAutoCleanup();\n        }\n      },\n      // onIterationComplete is NOT forwarded here — the dowhile predicate\n      // now calls it in-process from globalRunRegistry and honors its return\n      // value ({ continue, feedback }). The pubsub ITERATION_COMPLETE event\n      // still fires for external observability subscribers.\n      closeOnSuspend: true,\n      structuredOutput: registryEntry.structuredOutput as any,\n      outputProcessors: registryEntry.outputProcessors,\n      messageList,\n    });\n\n    // 4. Wait for subscription to be ready, then execute workflow\n    // This prevents race conditions where events are published before subscription\n    const workflowExecution = ready\n      .then(async () => {\n        // Emit 'start' chunk before the workflow begins (matches regular agent's stream.ts).\n        // Only the initial generate()/stream() path emits 'start'; resume() does not.\n        await emitChunkEvent(this.pubsub, runId, {\n          type: 'start',\n          runId,\n          from: ChunkFrom.AGENT,\n          payload: { id: workflowInput.agentId, messageId },\n        });\n        return this.executeWorkflow(runId, workflowInput);\n      })\n      .catch(error => {\n        void this.emitError(runId, error);\n      });\n    const trackedEntry = globalRunRegistry.get(runId);\n    if (trackedEntry) {\n      trackedEntry.workflowExecution = workflowExecution;\n    }\n\n    // 5. Create cleanup function (cancels auto-cleanup timer if called)\n    const cleanup = () => {\n      if (autoCleanupTimer) {\n        clearTimeout(autoCleanupTimer);\n        autoCleanupTimer = null;\n      }\n      if (!cleanedUp) {\n        streamCleanup();\n        this.#runRegistry.cleanup(runId);\n        globalRunRegistry.delete(runId);\n        this.#clearPubsubTopic(runId);\n        cleanedUp = true;\n      }\n    };\n\n    let suspended = false;\n    try {\n      const fullOutput = (await output.getFullOutput()) as FullOutput<TOutput>;\n      if (fullOutput.error) {\n        throw fullOutput.error;\n      }\n      suspended = fullOutput.finishReason === 'suspended';\n      // On suspend, the SUSPENDED event is emitted from the tool-call step\n      // before the workflow engine has persisted the snapshot. Awaiting the\n      // workflow execution promise blocks until `run.start()` returns, which\n      // happens after the suspend snapshot has been persisted — so a later\n      // `resumeGenerate()` can find the snapshot. Subclasses that drive the\n      // workflow with a fire-and-forget API (see `EventedAgent`) need their\n      // own persistence guarantee here; their `executeWorkflow` promise may\n      // resolve before the snapshot lands.\n      if (suspended) {\n        await globalRunRegistry.get(runId)?.workflowExecution;\n      }\n      // Fall back to the stream-level runId if MastraModelOutput.runId wasn't\n      // populated (no chunk surfaced before suspend).\n      if (!fullOutput.runId) {\n        (fullOutput as { runId?: string }).runId = runId;\n      }\n      return fullOutput;\n    } finally {\n      // Keep the registry entry alive on suspend so `resumeGenerate()` can\n      // pick it up. Auto-cleanup is scheduled by FINISH/ERROR/ABORT paths.\n      if (!suspended) {\n        cleanup();\n      }\n    }\n  }\n\n  /**\n   * Resume a suspended durable run and drain it to a single\n   * {@link FullOutput}. Mirrors {@link Agent.resumeGenerate} on top of\n   * {@link DurableAgent.resume}.\n   *\n   * Unlike `generate()`, this delegates to `resume()` because resume reads\n   * its tools from the existing run-registry entry rather than running\n   * `prepareForDurableExecution` again — there is no `methodType` to thread\n   * through. The same `EventedAgent` caveat about fire-and-forget snapshot\n   * persistence noted on `generate()` applies if the resumed turn suspends.\n   */\n  async resumeGenerate(\n    runId: string,\n    resumeData: unknown,\n    options?: Parameters<DurableAgent<TAgentId, TTools, TOutput>['resume']>[2],\n  ): Promise<FullOutput<TOutput>> {\n    const result = await this.resume(runId, resumeData, {\n      ...(options ?? {}),\n      [CLOSE_ON_SUSPEND]: true,\n    } as Parameters<DurableAgent<TAgentId, TTools, TOutput>['resume']>[2]);\n    let suspended = false;\n    try {\n      const fullOutput = (await result.output.getFullOutput()) as FullOutput<TOutput>;\n      if (fullOutput.error) {\n        throw fullOutput.error;\n      }\n      suspended = fullOutput.finishReason === 'suspended';\n      if (suspended) {\n        await globalRunRegistry.get(result.runId)?.workflowExecution;\n      }\n      if (!fullOutput.runId) {\n        (fullOutput as { runId?: string }).runId = result.runId;\n      }\n      return fullOutput;\n    } finally {\n      if (!suspended) {\n        result.cleanup();\n      }\n    }\n  }\n\n  /**\n   * Observe an existing stream.\n   * Use this to reconnect to a stream after a network disconnection.\n   *\n   * **Warning:** The returned `cleanup()` function destroys the run's registry\n   * entries and cached PubSub events. Only call it when you are done with the\n   * run entirely. If the workflow is suspended and you intend to resume later,\n   * do not call cleanup — let the auto-cleanup timer handle it after\n   * FINISH/ERROR. Auto-cleanup does not fire on SUSPENDED events.\n   */\n  async observe(\n    runId: string,\n    options?: {\n      offset?: number;\n      onChunk?: (chunk: ChunkType<TOutput>) => void | Promise<void>;\n      onStepFinish?: (result: AgentStepFinishEventData) => void | Promise<void>;\n      onFinish?: MastraOnFinishCallback<TOutput>;\n      onError?: ({ error }: { error: Error | string }) => void | Promise<void>;\n      onSuspended?: (data: AgentSuspendedEventData) => void | Promise<void>;\n    },\n  ): Promise<Omit<DurableAgentStreamResult<TOutput>, 'runId'> & { runId: string }> {\n    const memoryInfo = this.#runRegistry.getMemoryInfo(runId);\n\n    // Track cleanup state to avoid double cleanup\n    let cleanedUp = false;\n    let autoCleanupTimer: ReturnType<typeof setTimeout> | null = null;\n\n    const scheduleAutoCleanup = () => {\n      if (autoCleanupTimer || cleanedUp || this.#cleanupTimeoutMs === 0) return;\n      autoCleanupTimer = setTimeout(() => {\n        if (!cleanedUp) {\n          this.#runRegistry.cleanup(runId);\n          globalRunRegistry.delete(runId);\n          this.#clearPubsubTopic(runId);\n          cleanedUp = true;\n        }\n      }, this.#cleanupTimeoutMs);\n    };\n\n    const {\n      output,\n      cleanup: streamCleanup,\n      ready,\n    } = createDurableAgentStream<TOutput>({\n      pubsub: this.pubsub,\n      runId,\n      messageId: crypto.randomUUID(),\n      model: {\n        modelId: undefined,\n        provider: undefined,\n        version: 'v3',\n      },\n      threadId: memoryInfo?.threadId,\n      resourceId: memoryInfo?.resourceId,\n      offset: options?.offset,\n      onChunk: options?.onChunk,\n      onStepFinish: options?.onStepFinish,\n      onFinish: options?.onFinish,\n      onStreamFinished: scheduleAutoCleanup,\n      onError: async error => {\n        await options?.onError?.(error);\n        scheduleAutoCleanup();\n      },\n      onSuspended: options?.onSuspended,\n      structuredOutput: this.#runRegistry.get(runId)?.structuredOutput as any,\n      outputProcessors: this.#runRegistry.get(runId)?.outputProcessors,\n      messageList: globalRunRegistry.get(runId)?.messageList ?? this.#runRegistry.getMessageList(runId),\n    });\n\n    // Wait for subscription to be ready\n    await ready;\n\n    const cleanup = () => {\n      if (autoCleanupTimer) {\n        clearTimeout(autoCleanupTimer);\n        autoCleanupTimer = null;\n      }\n      if (!cleanedUp) {\n        streamCleanup();\n        this.#runRegistry.cleanup(runId);\n        globalRunRegistry.delete(runId);\n        this.#clearPubsubTopic(runId);\n        cleanedUp = true;\n      }\n    };\n\n    // observe() doesn't own the run's lifecycle, but for API symmetry the\n    // returned `abort` flips the in-process controller currently installed\n    // on the registry. If the run already ended (or is running in a\n    // different process), this is a best-effort no-op.\n    const abort = (reason?: unknown) => {\n      const controller = (globalRunRegistry.get(runId) ?? this.#runRegistry.get(runId))?.abortController;\n      if (controller && !controller.signal.aborted) {\n        controller.abort(reason);\n      }\n    };\n\n    return {\n      output,\n      get fullStream() {\n        return output.fullStream as ReadableStream<any>;\n      },\n      runId,\n      threadId: memoryInfo?.threadId,\n      resourceId: memoryInfo?.resourceId,\n      cleanup,\n      abort,\n    };\n  }\n\n  /**\n   * Clear cached pubsub events for a run's topic.\n   * Only effective when pubsub supports clearTopic (e.g. CachingPubSub).\n   */\n  #clearPubsubTopic(runId: string): void {\n    const pubsub = this.pubsub;\n    if ('clearTopic' in pubsub && typeof (pubsub as any).clearTopic === 'function') {\n      void (pubsub as any).clearTopic(AGENT_STREAM_TOPIC(runId));\n    }\n  }\n\n  /**\n   * Read the current number of cached events for this run's stream topic.\n   * Used by `resume()` as the subscription offset so we don't re-deliver\n   * events emitted by the original run (notably the SUSPENDED chunk that\n   * paused it).\n   */\n  async #getPubsubOffset(runId: string): Promise<number> {\n    const pubsub = this.pubsub as PubSub & {\n      getHistory?: (topic: string) => Promise<unknown[]>;\n    };\n    if (typeof pubsub.getHistory !== 'function') return 0;\n    try {\n      const history = await pubsub.getHistory(AGENT_STREAM_TOPIC(runId));\n      return Array.isArray(history) ? history.length : 0;\n    } catch {\n      return 0;\n    }\n  }\n\n  /**\n   * Get the workflow instance for direct execution.\n   * Lazily creates the workflow and registers Mastra on it (needed for\n   * getAgentById in execution steps).\n   */\n  getWorkflow() {\n    if (!this.#workflow) {\n      this.#workflow = this.createWorkflow();\n      // Register mastra on the workflow so execution steps can access agents/tools.\n      // DurableAgent goes through the normal Agent registration path (not the durable wrapper\n      // path that calls addWorkflow), so the workflow isn't registered in Mastra's #workflows.\n      // We set mastra directly here instead.\n      if (this.#mastra) {\n        this.#workflow.__registerMastra(this.#mastra);\n        this.#workflow.__registerPrimitives({\n          logger: this.#mastra.getLogger(),\n          storage: this.#mastra.getStorage(),\n        });\n      }\n    }\n    return this.#workflow;\n  }\n\n  /**\n   * @deprecated Use `stream(messages, { untilIdle: true })` instead.\n   *\n   * Stream until all background tasks complete and the agent is idle.\n   * Mirrors the regular Agent's streamUntilIdle but adapted for durable execution.\n   */\n  // @ts-expect-error - Intentionally different return type for durable execution\n  override async streamUntilIdle<OUTPUT = TOutput>(\n    messages: MessageListInput,\n    streamOptions?: DurableAgentStreamOptions<OUTPUT> & { maxIdleMs?: number },\n  ): Promise<DurableAgentStreamResult<OUTPUT>> {\n    return runDurableStreamUntilIdle<OUTPUT>(\n      this as unknown as DurableAgent<any, any, OUTPUT>,\n      messages,\n      streamOptions,\n      {\n        activeStreams: this.#activeStreamUntilIdle,\n        bgManager: this.#mastra?.backgroundTaskManager,\n      },\n    );\n  }\n\n  /**\n   * Prepare for durable execution without starting it.\n   */\n  async prepare(messages: MessageListInput, options?: AgentExecutionOptions<TOutput>) {\n    const preparation = await prepareForDurableExecution<TOutput>({\n      agent: this.#wrappedAgent as Agent<string, any, TOutput>,\n      messages,\n      options,\n      // Forward the caller-provided runId (mirrors stream()). Without this,\n      // prepareForDurableExecution mints a fresh id, so prepare() registers a\n      // different run than requested and a follow-up resume(runId) — e.g. when\n      // rehydrating a persisted, suspended run in a fresh process — can't find\n      // its registry entry.\n      runId: options?.runId,\n      requestContext: options?.requestContext,\n      mastra: this.#mastra,\n    });\n\n    this.#runRegistry.registerWithMessageList(preparation.runId, preparation.registryEntry, preparation.messageList, {\n      threadId: preparation.threadId,\n      resourceId: preparation.resourceId,\n    });\n    globalRunRegistry.set(preparation.runId, {\n      ...preparation.registryEntry,\n      messageList: preparation.messageList,\n    });\n\n    return {\n      runId: preparation.runId,\n      messageId: preparation.messageId,\n      workflowInput: preparation.workflowInput,\n      registryEntry: preparation.registryEntry,\n      threadId: preparation.threadId,\n      resourceId: preparation.resourceId,\n    };\n  }\n\n  /**\n   * Get the durable workflows required by this agent.\n   * Called by Mastra during agent registration.\n   * @internal\n   */\n  getDurableWorkflows() {\n    return [this.getWorkflow()];\n  }\n\n  /**\n   * Delegate scorer listing to the wrapped agent so that callers querying the\n   * durable wrapper still see the underlying agent's scorers.\n   */\n  async listScorers(\n    opts?: Parameters<Agent<TAgentId, TTools, TOutput>['listScorers']>[0],\n  ): ReturnType<Agent<TAgentId, TTools, TOutput>['listScorers']> {\n    return this.#wrappedAgent.listScorers(opts);\n  }\n\n  /**\n   * Set the Mastra instance.\n   * Called by the durable agent registration path in addAgent().\n   * Delegates to __registerMastra so the pubsub wiring and agent\n   * registration happen regardless of which entry point is called first.\n   * @internal\n   */\n  __setMastra(mastra: Mastra): void {\n    this.__registerMastra(mastra);\n  }\n\n  /**\n   * Register the Mastra instance.\n   * Called by Mastra during agent registration (normal Agent path).\n   *\n   * Also wires mastra.pubsub as the inner pubsub (if the user didn't provide\n   * a custom one), so that the OBSERVE_AGENT_STREAM_ROUTE handler can subscribe\n   * to the same PubSub instance that this agent publishes to.\n   * @internal\n   */\n  __registerMastra(mastra: Mastra): void {\n    super.__registerMastra(mastra);\n    this.#mastra = mastra;\n    // Also set on wrapped agent\n    this.#wrappedAgent.__registerMastra(mastra);\n\n    // Wire mastra.pubsub as the inner pubsub if user didn't provide a custom one.\n    // This must happen before CachingPubSub initialization.\n    if (!this.#hasCustomPubsub && !this.#cachingPubsub) {\n      this.#innerPubsub = mastra.pubsub;\n    }\n  }\n}\n","/**\n * Factory function to create a DurableAgent that wraps an existing Agent.\n *\n * This is the recommended way to add durable execution capabilities to an agent.\n * The factory creates a DurableAgent instance with resumable streams.\n *\n * @example\n * ```typescript\n * import { Agent } from '@mastra/core/agent';\n * import { createDurableAgent } from '@mastra/core/agent/durable';\n *\n * const agent = new Agent({\n *   id: 'my-agent',\n *   name: 'My Agent',\n *   instructions: 'You are a helpful assistant',\n *   model: openai('gpt-4'),\n * });\n *\n * const durableAgent = createDurableAgent({ agent });\n *\n * const mastra = new Mastra({\n *   agents: { myAgent: durableAgent },\n * });\n * ```\n */\n\nimport type { MastraServerCache } from '../../cache/base';\nimport type { PubSub } from '../../events/pubsub';\nimport type { Agent } from '../agent';\n\nimport { DurableAgent } from './durable-agent';\nimport type { DurableAgentConfig } from './durable-agent';\n\n/**\n * Options for createDurableAgent factory function.\n */\nexport interface CreateDurableAgentOptions<\n  TAgentId extends string = string,\n  TTools extends Record<string, any> = Record<string, any>,\n  TOutput = undefined,\n> {\n  /** The Agent to wrap with durable execution capabilities */\n  agent: Agent<TAgentId, TTools, TOutput>;\n\n  /** Optional ID override (defaults to agent.id) */\n  id?: TAgentId;\n\n  /** Optional name override (defaults to agent.name) */\n  name?: string;\n\n  /**\n   * Cache instance for storing stream events.\n   * Enables resumable streams - clients can disconnect and reconnect\n   * without missing events.\n   *\n   * - If not provided: Inherits from Mastra instance, or uses InMemoryServerCache\n   * - If provided: Uses the provided cache backend (e.g., Redis)\n   * - If set to `false`: Disables caching (streams are not resumable)\n   */\n  cache?: MastraServerCache | false;\n\n  /**\n   * PubSub instance for streaming events.\n   * Optional - if not provided, defaults to EventEmitterPubSub.\n   */\n  pubsub?: PubSub;\n\n  /** Maximum steps for agentic loop */\n  maxSteps?: number;\n}\n\n/**\n * Create a DurableAgent that wraps an existing Agent.\n *\n * This factory function is the recommended way to add durable execution\n * capabilities to an agent. It creates a DurableAgent instance with\n * resumable streams.\n *\n * @param options - Configuration options\n * @returns A DurableAgent instance\n *\n * @example\n * ```typescript\n * const agent = new Agent({\n *   id: 'my-agent',\n *   instructions: 'You are helpful',\n *   model: openai('gpt-4'),\n * });\n *\n * const durableAgent = createDurableAgent({ agent });\n *\n * const mastra = new Mastra({\n *   agents: { myAgent: durableAgent },\n * });\n * ```\n */\nexport function createDurableAgent<\n  TAgentId extends string = string,\n  TTools extends Record<string, any> = Record<string, any>,\n  TOutput = undefined,\n>(options: CreateDurableAgentOptions<TAgentId, TTools, TOutput>): DurableAgent<TAgentId, TTools, TOutput> {\n  const { agent, id, name, cache, pubsub, maxSteps } = options;\n\n  return new DurableAgent({\n    agent,\n    id,\n    name,\n    cache,\n    pubsub,\n    maxSteps,\n  } as DurableAgentConfig<TAgentId, TTools, TOutput>);\n}\n\n/**\n * Check if an object is a DurableAgent\n */\nexport function isDurableAgent(obj: any): obj is DurableAgent {\n  return obj instanceof DurableAgent;\n}\n\n/**\n * Alias for isDurableAgent for backwards compatibility\n * @deprecated Use isDurableAgent instead\n */\nexport const isLocalDurableAgent = isDurableAgent;\n\n// Re-export types for convenience\nexport type { DurableAgentConfig, DurableAgentStreamOptions, DurableAgentStreamResult } from './durable-agent';\n\n// Backwards compatibility type aliases\nexport type LocalDurableAgent<\n  TAgentId extends string = string,\n  TTools extends Record<string, any> = Record<string, any>,\n  TOutput = undefined,\n> = DurableAgent<TAgentId, TTools, TOutput>;\n","/**\n * EventedAgent - A durable agent that uses fire-and-forget execution.\n *\n * EventedAgent extends DurableAgent and overrides the execution strategy to use\n * fire-and-forget execution via the workflow engine's startAsync() method.\n *\n * Unlike DurableAgent which runs the workflow synchronously, EventedAgent:\n * 1. Uses startAsync() for non-blocking execution\n * 2. Fire-and-forget pattern - execution starts and returns immediately\n * 3. Events are streamed via pubsub as the workflow executes\n */\n\nimport { createObservabilityContext } from '../../observability';\nimport type { ToolsInput } from '../types';\n\nimport { DurableAgent } from './durable-agent';\nimport type { DurableAgentConfig } from './durable-agent';\nimport { globalRunRegistry } from './run-registry';\nimport type { DurableAgenticWorkflowInput } from './types';\n\n/**\n * Configuration for EventedAgent - wraps an existing Agent with fire-and-forget execution\n */\nexport interface EventedAgentConfig<\n  TAgentId extends string = string,\n  TTools extends ToolsInput = ToolsInput,\n  TOutput = undefined,\n> extends DurableAgentConfig<TAgentId, TTools, TOutput> {}\n\n/**\n * EventedAgent extends DurableAgent to use fire-and-forget execution.\n *\n * This agent type uses the built-in evented workflow engine, which is useful when:\n * - You don't need an external execution engine (like Inngest)\n * - You want fire-and-forget execution with pubsub streaming\n * - You need resumable streams with event caching\n *\n * The key difference from DurableAgent is the execution strategy:\n * - DurableAgent: Runs the workflow synchronously via createRun + start\n * - EventedAgent: Uses run.startAsync() for fire-and-forget execution\n *\n * @example\n * ```typescript\n * import { Agent } from '@mastra/core/agent';\n * import { EventedAgent } from '@mastra/core/agent/durable';\n *\n * const agent = new Agent({\n *   id: 'my-agent',\n *   instructions: 'You are a helpful assistant',\n *   model: openai('gpt-4'),\n * });\n *\n * const eventedAgent = new EventedAgent({ agent });\n *\n * const { output, runId, cleanup } = await eventedAgent.stream('Hello!');\n * const text = await output.text;\n * cleanup();\n * ```\n */\nexport class EventedAgent<\n  TAgentId extends string = string,\n  TTools extends ToolsInput = ToolsInput,\n  TOutput = undefined,\n> extends DurableAgent<TAgentId, TTools, TOutput> {\n  /**\n   * Create a new EventedAgent that wraps an existing Agent\n   */\n  constructor(config: EventedAgentConfig<TAgentId, TTools, TOutput>) {\n    super(config);\n  }\n\n  /**\n   * Execute the durable workflow using fire-and-forget pattern.\n   *\n   * Unlike DurableAgent which runs the workflow synchronously, EventedAgent uses\n   * the workflow's startAsync() method for non-blocking execution.\n   *\n   * @param runId - The unique run ID\n   * @param workflowInput - The serialized workflow input\n   * @internal\n   */\n  protected override async executeWorkflow(runId: string, workflowInput: DurableAgenticWorkflowInput): Promise<void> {\n    try {\n      const workflow = this.getWorkflow();\n      const run = await workflow.createRun({\n        runId,\n        pubsub: this.pubsubInternal,\n      });\n      // Fire and forget - use startAsync for non-blocking execution.\n      // Pass the caller's requestContext (so config selectors pick the same observability\n      // instance the root spans were created with) and parent the run under the AGENT_RUN span.\n      const entry = globalRunRegistry.get(runId);\n      await run.startAsync({\n        inputData: workflowInput,\n        requestContext: entry?.requestContext,\n        ...createObservabilityContext({ currentSpan: entry?.agentSpan }),\n      });\n    } catch (error) {\n      await this.emitError(runId, error instanceof Error ? error : new Error(String(error)));\n    }\n  }\n}\n\n/**\n * Check if an object is an EventedAgent class instance\n */\nexport function isEventedAgentClass(obj: any): obj is EventedAgent {\n  return obj instanceof EventedAgent;\n}\n","/**\n * Factory function to create an EventedAgent that wraps an existing Agent.\n *\n * This creates a durable agent that uses fire-and-forget execution via\n * the built-in workflow engine with startAsync().\n *\n * @example\n * ```typescript\n * import { Agent } from '@mastra/core/agent';\n * import { createEventedAgent } from '@mastra/core/agent/durable';\n *\n * const agent = new Agent({\n *   id: 'my-agent',\n *   name: 'My Agent',\n *   instructions: 'You are a helpful assistant',\n *   model: openai('gpt-4'),\n * });\n *\n * const eventedAgent = createEventedAgent({ agent });\n *\n * const mastra = new Mastra({\n *   agents: { myAgent: eventedAgent },\n * });\n * ```\n */\n\nimport type { MastraServerCache } from '../../cache/base';\nimport type { PubSub } from '../../events/pubsub';\nimport type { Agent } from '../agent';\n\nimport { EventedAgent } from './evented-agent';\nimport type { EventedAgentConfig } from './evented-agent';\n\n/**\n * Options for createEventedAgent factory function.\n */\nexport interface CreateEventedAgentOptions<\n  TAgentId extends string = string,\n  TTools extends Record<string, any> = Record<string, any>,\n  TOutput = undefined,\n> {\n  /** The Agent to wrap with evented durable execution capabilities */\n  agent: Agent<TAgentId, TTools, TOutput>;\n\n  /**\n   * PubSub instance for streaming events.\n   * Optional - if not provided, defaults to EventEmitterPubSub.\n   */\n  pubsub?: PubSub;\n\n  /**\n   * Cache instance for storing stream events.\n   * Enables resumable streams - clients can disconnect and reconnect\n   * without missing events.\n   *\n   * - If not provided: Inherits from Mastra instance, or uses InMemoryServerCache\n   * - If provided: Uses the provided cache backend (e.g., Redis)\n   * - If set to `false`: Disables caching (streams are not resumable)\n   */\n  cache?: MastraServerCache | false;\n\n  /** Maximum steps for agentic loop */\n  maxSteps?: number;\n}\n\n/**\n * Create an EventedAgent that wraps an existing Agent.\n *\n * This factory function creates an EventedAgent instance with fire-and-forget\n * execution via the built-in workflow engine.\n *\n * @param options - Configuration options\n * @returns An EventedAgent instance\n *\n * @example\n * ```typescript\n * const agent = new Agent({\n *   id: 'my-agent',\n *   instructions: 'You are helpful',\n *   model: openai('gpt-4'),\n * });\n *\n * const eventedAgent = createEventedAgent({ agent });\n *\n * const mastra = new Mastra({\n *   agents: { myAgent: eventedAgent },\n * });\n * ```\n */\nexport function createEventedAgent<\n  TAgentId extends string = string,\n  TTools extends Record<string, any> = Record<string, any>,\n  TOutput = undefined,\n>(options: CreateEventedAgentOptions<TAgentId, TTools, TOutput>): EventedAgent<TAgentId, TTools, TOutput> {\n  const { agent, pubsub, cache, maxSteps } = options;\n\n  return new EventedAgent({\n    agent,\n    pubsub,\n    cache,\n    maxSteps,\n  } as EventedAgentConfig<TAgentId, TTools, TOutput>);\n}\n\n/**\n * Check if an object is an EventedAgent\n */\nexport function isEventedAgent(obj: any): obj is EventedAgent {\n  return obj instanceof EventedAgent;\n}\n\n// Re-export types for convenience\nexport type { EventedAgentConfig } from './evented-agent';\n"]}