{"version":3,"sources":["../src/bus/route-event.ts","../src/bus/base.ts","../src/spans/serialization.ts","../src/bus/observability-bus.ts","../src/config.ts","../src/context/logger.ts","../src/context/metrics.ts","../src/metrics/pricing-model.ts","../src/metrics/pricing-registry.ts","../src/metrics/types.ts","../src/metrics/usage-metrics.ts","../src/metrics/estimator.ts","../src/metrics/auto-extract.ts","../src/metrics/cardinality.ts","../src/usage.ts","../src/model-tracing.ts","../src/spans/base.ts","../src/spans/default.ts","../src/spans/no-op.ts","../src/instances/base.ts","../src/client/id.ts","../src/client/otlp.ts","../src/client/w3c.ts","../src/client/proxy.ts","../src/exporters/base.ts","../src/exporters/tracking.ts","../src/exporters/span-formatters.ts","../src/exporters/auth-failure-cooldown.ts","../src/exporters/cloud.ts","../src/exporters/console.ts","../src/exporters/event-buffer.ts","../src/exporters/default.ts","../src/exporters/mastra-platform.ts","../src/exporters/mastra-storage.ts","../src/exporters/test.ts","../src/instances/default.ts","../src/recorded.ts","../src/registry.ts","../src/span_processors/sensitive-data-filter.ts","../src/default.ts","../src/features.ts","../src/tracing-options.ts"],"names":["TracingEventType","MastraBase","RegisteredLogger","cleaned","SamplingStrategyType","z","SpanType","generateSignalId","fs","path","require","createRequire","DEFAULT_BLOCKED_LABELS","coreFeatures","TransformStream","InternalSpans","error","MastraError","noOpLoggerContext","getNestedValue","setNestedValue","EntityType","ConsoleLogger","LogLevel","fetchWithRetry","ErrorDomain","ErrorCategory","buildUpdateSpanRecord","buildFeedbackRecord","buildLogRecord","buildMetricRecord","buildScoreRecord","buildCreateSpanRecord","SIGNAL_PUBLISH_SUFFIXES","SIGNAL_PUBLISH_SEGMENTS","trimTrailingSlashes","createInvalidEndpointError","VALID_PROJECT_ID","createInvalidProjectIdError","resolveBaseEndpoint","buildSignalPath","buildSignalEndpoint","resolveExplicitSignalEndpoint","deriveSignalEndpointFromTracesEndpoint","resolveTracingStorageStrategy","EventType"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAmDO,SAAS,cAAA,CACd,OAAA,EACA,KAAA,EACA,MAAA,EACsB;AACtB,EAAA,IAAI;AACF,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAKA,8BAAA,CAAiB,YAAA;AAAA,MACtB,KAAKA,8BAAA,CAAiB,YAAA;AAAA,MACtB,KAAKA,+BAAiB,UAAA,EAAY;AAChC,QAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,cAAA,GACf,OAAA,CAAQ,cAAA,CAAe,IAAA,CAAK,OAAO,CAAA,GACnC,OAAA,CAAQ,kBAAA,CAAmB,IAAA,CAAK,OAAO,CAAA;AAC3C,QAAA,OAAO,iBAAiB,EAAA,CAAG,KAAqB,GAAG,OAAA,CAAQ,IAAA,EAAM,WAAW,MAAM,CAAA;AAAA,MACpF;AAAA,MAEA,KAAK,KAAA;AACH,QAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,UAAA,OAAO,gBAAA,CAAiB,QAAQ,UAAA,CAAW,KAAiB,GAAG,OAAA,CAAQ,IAAA,EAAM,OAAO,MAAM,CAAA;AAAA,QAC5F;AACA,QAAA;AAAA,MAEF,KAAK,QAAA;AACH,QAAA,IAAI,QAAQ,aAAA,EAAe;AACzB,UAAA,OAAO,gBAAA,CAAiB,QAAQ,aAAA,CAAc,KAAoB,GAAG,OAAA,CAAQ,IAAA,EAAM,UAAU,MAAM,CAAA;AAAA,QACrG;AACA,QAAA;AAAA,MAEF,KAAK,OAAA;AACH,QAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,UAAA,OAAO,gBAAA,CAAiB,QAAQ,YAAA,CAAa,KAAmB,GAAG,OAAA,CAAQ,IAAA,EAAM,SAAS,MAAM,CAAA;AAAA,QAClG;AACA,QAAA,IAAK,QAA+B,eAAA,EAAiB;AACnD,UAAA,MAAM,QAAS,KAAA,CAAqB,KAAA;AACpC,UAAA,IAAI,CAAC,MAAM,OAAA,EAAS;AACpB,UAAA,OAAO,gBAAA;AAAA,YACJ,QAA+B,eAAA,CAAiB;AAAA,cAC/C,SAAS,KAAA,CAAM,OAAA;AAAA,cACf,GAAI,MAAM,MAAA,GAAS,EAAE,QAAQ,KAAA,CAAM,MAAA,KAAW,EAAC;AAAA,cAC/C,OAAO,KAAA,CAAM,KAAA;AAAA,cACb,GAAI,MAAM,MAAA,GAAS,EAAE,QAAQ,KAAA,CAAM,MAAA,KAAW,EAAC;AAAA,cAC/C,UAAA,EAAY,KAAA,CAAM,UAAA,IAAc,KAAA,CAAM,QAAA;AAAA,cACtC,GAAI,MAAM,QAAA,GAAW,EAAE,UAAU,KAAA,CAAM,QAAA,KAAoC;AAAC,aAC7E,CAAA;AAAA,YACD,OAAA,CAAQ,IAAA;AAAA,YACR,OAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF;AACA,QAAA;AAAA,MAEF,KAAK,UAAA;AACH,QAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,UAAA,OAAO,gBAAA,CAAiB,QAAQ,eAAA,CAAgB,KAAsB,GAAG,OAAA,CAAQ,IAAA,EAAM,YAAY,MAAM,CAAA;AAAA,QAC3G;AACA,QAAA;AAAA;AACJ,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,MAAA,CAAO,KAAA,CAAM,CAAA,uCAAA,EAA0C,OAAA,CAAQ,IAAI,MAAM,GAAG,CAAA;AAAA,EAC9E;AACF;AAQO,SAAS,kBAAA,CACd,OAAA,EACA,KAAA,EACA,MAAA,EACsB;AACtB,EAAA,IAAI;AACF,IAAA,IAAI,QAAQ,cAAA,EAAgB;AAC1B,MAAA,OAAO,gBAAA,CAAiB,QAAQ,cAAA,CAAe,KAAK,GAAG,OAAA,CAAQ,IAAA,EAAM,QAAQ,MAAM,CAAA;AAAA,IACrF;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,MAAA,CAAO,KAAA,CAAM,CAAA,uCAAA,EAA0C,OAAA,CAAQ,IAAI,MAAM,GAAG,CAAA;AAAA,EAC9E;AACF;AAMA,SAAS,gBAAA,CACP,MAAA,EACA,WAAA,EACA,MAAA,EACA,MAAA,EACsB;AACtB,EAAA,IAAI,MAAA,IAAU,OAAQ,MAAA,CAAyB,IAAA,KAAS,UAAA,EAAY;AAClE,IAAA,OAAQ,MAAA,CAAyB,MAAM,CAAA,GAAA,KAAO;AAC5C,MAAA,MAAA,CAAO,MAAM,CAAA,gBAAA,EAAmB,MAAM,CAAA,wBAAA,EAA2B,WAAW,MAAM,GAAG,CAAA;AAAA,IACvF,CAAC,CAAA;AAAA,EACH;AACF;ACnIO,IAAM,yBAAA,GAAN,MAAM,0BAAA,SAA0CC,eAAA,CAAoD;AAAA,EACjG,WAAA,uBAAgD,GAAA,EAAI;AAAA;AAAA,EAGpD,kBAAA,uBAA6C,GAAA,EAAI;AAAA,EAEzD,WAAA,CAAY,EAAE,IAAA,EAAK,GAAuB,EAAC,EAAG;AAC5C,IAAA,KAAA,CAAM,EAAE,SAAA,EAAWC,uBAAA,CAAiB,eAAe,IAAA,EAAM,IAAA,IAAQ,YAAY,CAAA;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAAK,KAAA,EAAqB;AACxB,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,WAAA,EAAa;AACtC,MAAA,IAAI;AAGF,QAAA,MAAM,MAAA,GAAkB,QAAQ,KAAK,CAAA;AACrC,QAAA,IAAI,MAAA,IAAU,OAAQ,MAAA,CAAyB,IAAA,KAAS,UAAA,EAAY;AAClE,UAAA,MAAM,OAAA,GAAW,MAAA,CAAyB,KAAA,CAAM,CAAA,GAAA,KAAO;AACrD,YAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,wCAAA,EAA0C,GAAG,CAAA;AAAA,UACjE,CAAC,CAAA;AACD,UAAA,IAAA,CAAK,kBAAA,CAAmB,IAAI,OAAO,CAAA;AACnC,UAAA,KAAK,QAAQ,OAAA,CAAQ,MAAM,KAAK,kBAAA,CAAmB,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,QACpE;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,wCAAA,EAA0C,GAAG,CAAA;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAU,OAAA,EAA8C;AACtD,IAAA,IAAA,CAAK,WAAA,CAAY,IAAI,OAAO,CAAA;AAC5B,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,WAAA,CAAY,OAAO,OAAO,CAAA;AAAA,IACjC,CAAA;AAAA,EACF;AAAA;AAAA,EAGA,OAAwB,oBAAA,GAAuB,CAAA;AAAA;AAAA,EAG/C,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,OAAO,IAAA,CAAK,kBAAA,CAAmB,IAAA,GAAO,CAAA,EAAG;AACvC,MAAA,MAAM,QAAQ,UAAA,CAAW,CAAC,GAAG,IAAA,CAAK,kBAAkB,CAAC,CAAA;AACrD,MAAA,UAAA,EAAA;AACA,MAAA,IAAI,UAAA,IAAc,2BAA0B,oBAAA,EAAsB;AAChE,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,UACV,4CAA4C,0BAAA,CAA0B,oBAAoB,CAAA,yBAAA,EACrF,IAAA,CAAK,mBAAmB,IAAI,CAAA,kEAAA;AAAA,SACnC;AACA,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,QAAA,GAA0B;AAC9B,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,EACzB;AACF;;;ACzDO,IAAM,qBAAA,uBAA4B,GAAA,CAAI;AAAA,EAC3C,QAAA;AAAA,EACA,+BAAA;AAAA,EACA,kBAAA;AAAA,EACA,OAAA;AAAA,EACA,gBAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA;AAAA;AACF,CAAC;AAUM,IAAM,0BAAA,GAA+C,OAAO,MAAA,CAAO;AAAA,EACxE,WAAA,EAAa,qBAAA;AAAA,EACb,QAAA,EAAU,CAAA;AAAA,EACV,iBAAiB,GAAA,GAAM,IAAA;AAAA;AAAA,EACvB,cAAA,EAAgB,EAAA;AAAA,EAChB,aAAA,EAAe;AACjB,CAAC;AAMM,SAAS,0BAA0B,WAAA,EAKrB;AACnB,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,0BAAA;AAAA,EACT;AACA,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,qBAAA;AAAA,IACb,QAAA,EAAU,WAAA,CAAY,QAAA,IAAY,0BAAA,CAA2B,QAAA;AAAA,IAC7D,eAAA,EAAiB,WAAA,CAAY,eAAA,IAAmB,0BAAA,CAA2B,eAAA;AAAA,IAC3E,cAAA,EAAgB,WAAA,CAAY,cAAA,IAAkB,0BAAA,CAA2B,cAAA;AAAA,IACzE,aAAA,EAAe,WAAA,CAAY,aAAA,IAAiB,0BAAA,CAA2B;AAAA,GACzE;AACF;AAKO,SAAS,cAAA,CAAe,GAAW,QAAA,EAA0B;AAClE,EAAA,IAAI,CAAA,CAAE,UAAU,QAAA,EAAU;AACxB,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,OAAO,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA,GAAI,mBAAA;AAChC;AAUA,SAAS,yBAAyB,KAAA,EAAwB;AACxD,EAAA,OAAO,CAAA,CAAA,EAAI,iBAAiB,KAAA,GAAQ,cAAA,CAAe,MAAM,OAAA,EAAS,GAAG,IAAI,eAAe,CAAA,CAAA,CAAA;AAC1F;AAEA,SAAS,cAAc,GAAA,EAAsB;AAC3C,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,eAAe,IAAA,EAAM;AACvB,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,IAAA,OAAO,OAAA;AAAA,EACT;AACA,EAAA,IAAI,eAAe,GAAA,EAAK;AACtB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,eAAe,GAAA,EAAK;AACtB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,eAAe,KAAA,EAAO;AACxB,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,OAAO,OAAO,GAAA;AAChB;AAEA,SAAS,uBAAA,CAAwB,SAAiB,GAAA,EAAmB;AACnE,EAAA,QAAQ,OAAA;AAAS,IACf,KAAK,WAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,IAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,GAAI,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,GAAI,GAAA;AAAA,IACnF,KAAK,MAAA;AACH,MAAA,OAAO,OAAO,GAAA,KAAQ,QAAA,GAAW,IAAI,IAAA,CAAK,GAAG,CAAA,GAAI,GAAA;AAAA,IACnD;AACE,MAAA,OAAO,GAAA;AAAA;AAEb;AAEO,SAAS,gBAAgB,KAAA,EAAwC;AACtE,EAAA,OACE,OAAO,KAAA,KAAU,QAAA,IACjB,KAAA,KAAU,IAAA,IACT,KAAA,CAAwB,MAAA,KAAW,KAAA,IACpC,KAAA,CAAM,OAAA,CAAS,KAAA,CAAwB,aAAa,CAAA;AAExD;AAEO,SAAS,yBAAyB,KAAA,EAA6C;AACpF,EAAA,OAAO,IAAI,GAAA;AAAA,IACT,KAAA,CAAM,aAAA,CAAc,GAAA,CAAI,CAAC,CAAC,OAAA,EAAS,GAAA,EAAK,QAAQ,CAAA,KAAM,CAAC,uBAAA,CAAwB,OAAA,EAAS,GAAG,CAAA,EAAG,QAAQ,CAAC;AAAA,GACzG;AACF;AAMA,SAAS,aAAa,GAAA,EAAmB;AACvC,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,MAAM,OAAO,KAAA;AAGpD,EAAA,IAAI,GAAA,CAAI,OAAA,IAAW,OAAO,GAAA,CAAI,OAAA,KAAY,YAAY,GAAA,CAAI,OAAA,CAAQ,QAAA,CAAS,aAAa,CAAA,EAAG;AACzF,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,GAAA,CAAI,SAAS,QAAA,IAAY,GAAA,CAAI,cAAc,OAAO,GAAA,CAAI,eAAe,QAAA,EAAU;AACjF,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AAYO,SAAS,SAAA,CAAU,KAAA,EAAY,OAAA,GAA4B,0BAAA,EAAiC;AACjG,EAAA,MAAM,EAAE,WAAA,EAAa,QAAA,EAAU,eAAA,EAAiB,cAAA,EAAgB,eAAc,GAAI,OAAA;AAKlF,EAAA,MAAM,QAAA,GACJ,WAAA,YAAuB,GAAA,GACnB,WAAA,GACA,IAAI,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,GAAI,WAAA,GAAc,MAAA,CAAO,IAAA,CAAK,WAAW,CAAC,CAAA;AAMjF,EAAA,MAAM,SAAA,uBAAgB,OAAA,EAAa;AAEnC,EAAA,SAAS,MAAA,CAAO,KAAU,KAAA,EAAoB;AAC5C,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,OAAO,YAAA;AAAA,IACT;AAGA,IAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,MAAA,EAAW;AACrC,MAAA,OAAO,GAAA;AAAA,IACT;AAGA,IAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,MAAA,OAAO,cAAA,CAAe,KAAK,eAAe,CAAA;AAAA,IAC5C;AAGA,IAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,OAAO,QAAQ,SAAA,EAAW;AACvD,MAAA,OAAO,GAAA;AAAA,IACT;AACA,IAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,MAAA,OAAO,GAAG,GAAG,CAAA,CAAA,CAAA;AAAA,IACf;AACA,IAAA,IAAI,OAAO,QAAQ,UAAA,EAAY;AAC7B,MAAA,OAAO,YAAA;AAAA,IACT;AACA,IAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,MAAA,OAAO,GAAA,CAAI,WAAA,GAAc,CAAA,QAAA,EAAW,GAAA,CAAI,WAAW,CAAA,EAAA,CAAA,GAAO,UAAA;AAAA,IAC5D;AAGA,IAAA,IAAI,eAAe,IAAA,EAAM;AACvB,MAAA,OAAO,GAAA;AAAA,IACT;AAIA,IAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,MAAA,IAAI,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,EAAG;AACtB,QAAA,OAAO,YAAA;AAAA,MACT;AACA,MAAA,SAAA,CAAU,IAAI,GAAG,CAAA;AAAA,IACnB;AAEA,IAAA,IAAI;AAIF,MAAA,IAAI,eAAe,KAAA,EAAO;AACxB,QAAA,IAAI,SAAA;AACJ,QAAA,IAAI,YAAA;AACJ,QAAA,IAAI,UAAA;AACJ,QAAA,IAAI,QAAA;AACJ,QAAA,IAAI,eAAA,GAAkB,KAAA;AAEtB,QAAA,IAAI;AACF,UAAA,SAAA,GAAY,GAAA,CAAI,IAAA;AAAA,QAClB,SAAS,KAAA,EAAO;AACd,UAAA,SAAA,GAAY,yBAAyB,KAAK,CAAA;AAAA,QAC5C;AAEA,QAAA,IAAI;AACF,UAAA,YAAA,GAAe,GAAA,CAAI,OAAA;AAAA,QACrB,SAAS,KAAA,EAAO;AACd,UAAA,YAAA,GAAe,yBAAyB,KAAK,CAAA;AAAA,QAC/C;AAEA,QAAA,IAAI;AACF,UAAA,UAAA,GAAa,GAAA,CAAI,KAAA;AAAA,QACnB,SAAS,KAAA,EAAO;AACd,UAAA,UAAA,GAAa,yBAAyB,KAAK,CAAA;AAAA,QAC7C;AAEA,QAAA,IAAI;AACF,UAAA,QAAA,GAAY,GAAA,CAAY,KAAA;AAAA,QAC1B,SAAS,KAAA,EAAO;AACd,UAAA,eAAA,GAAkB,IAAA;AAClB,UAAA,QAAA,GAAW,yBAAyB,KAAK,CAAA;AAAA,QAC3C;AAEA,QAAA,MAAM,YAAA,GAAoC;AAAA,UACxC,MAAM,OAAO,SAAA,KAAc,WAAW,cAAA,CAAe,SAAA,EAAW,eAAe,CAAA,GAAI,SAAA;AAAA,UACnF,SAAS,OAAO,YAAA,KAAiB,WAAW,cAAA,CAAe,YAAA,EAAc,eAAe,CAAA,GAAI;AAAA,SAC9F;AACA,QAAA,IAAI,OAAO,eAAe,QAAA,EAAU;AAClC,UAAA,YAAA,CAAa,KAAA,GAAQ,cAAA,CAAe,UAAA,EAAY,eAAe,CAAA;AAAA,QACjE,CAAA,MAAA,IAAW,eAAe,MAAA,EAAW;AACnC,UAAA,YAAA,CAAa,KAAA,GAAQ,UAAA;AAAA,QACvB;AACA,QAAA,IAAI,eAAA,EAAiB;AACnB,UAAA,YAAA,CAAa,KAAA,GAAQ,QAAA;AAAA,QACvB,CAAA,MAAA,IAAW,aAAa,MAAA,EAAW;AACjC,UAAA,IAAI;AACF,YAAA,YAAA,CAAa,KAAA,GAAQ,MAAA,CAAO,QAAA,EAAU,KAAA,GAAQ,CAAC,CAAA;AAAA,UACjD,SAAS,KAAA,EAAO;AACd,YAAA,YAAA,CAAa,KAAA,GAAQ,yBAAyB,KAAK,CAAA;AAAA,UACrD;AAAA,QACF;AACA,QAAA,OAAO,YAAA;AAAA,MACT;AAGA,MAAA,IAAI,eAAe,GAAA,EAAK;AACtB,QAAA,MAAM,aAA4B,EAAE,MAAA,EAAQ,KAAA,EAAO,aAAA,EAAe,EAAC,EAAE;AACrE,QAAA,IAAI,WAAA,GAAc,CAAA;AAClB,QAAA,IAAI,iBAAA,GAAoB,CAAA;AACxB,QAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,MAAM,CAAA,IAAK,GAAA,EAAK;AAClC,UAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG;AACtD,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,eAAe,aAAA,EAAe;AAChC,YAAA,iBAAA,EAAA;AACA,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,UAAA,GAAa,cAAc,MAAM,CAAA;AACvC,UAAA,IAAI,aAAA;AACJ,UAAA,IAAI,eAAA;AAEJ,UAAA,IAAI;AACF,YAAA,aAAA,GAAgB,MAAA,CAAO,MAAA,EAAQ,KAAA,GAAQ,CAAC,CAAA;AAAA,UAC1C,SAAS,KAAA,EAAO;AACd,YAAA,aAAA,GAAgB,yBAAyB,KAAK,CAAA;AAAA,UAChD;AAEA,UAAA,IAAI;AACF,YAAA,eAAA,GAAkB,MAAA,CAAO,MAAA,EAAQ,KAAA,GAAQ,CAAC,CAAA;AAAA,UAC5C,SAAS,KAAA,EAAO;AACd,YAAA,eAAA,GAAkB,yBAAyB,KAAK,CAAA;AAAA,UAClD;AAEA,UAAA,UAAA,CAAW,cAAc,IAAA,CAAK,CAAC,UAAA,EAAY,aAAA,EAAe,eAAe,CAAC,CAAA;AAC1E,UAAA,WAAA,EAAA;AAAA,QACF;AACA,QAAA,IAAI,oBAAoB,CAAA,EAAG;AACzB,UAAA,UAAA,CAAW,WAAA,GAAc,GAAG,iBAAiB,CAAA,kBAAA,CAAA;AAAA,QAC/C;AACA,QAAA,OAAO,UAAA;AAAA,MACT;AAGA,MAAA,IAAI,eAAe,GAAA,EAAK;AACtB,QAAA,MAAM,aAAoB,EAAC;AAC3B,QAAA,IAAI,CAAA,GAAI,CAAA;AACR,QAAA,MAAM,eAAe,GAAA,CAAI,IAAA;AACzB,QAAA,KAAA,MAAW,QAAQ,GAAA,EAAK;AACtB,UAAA,IAAI,KAAK,cAAA,EAAgB;AACzB,UAAA,IAAI;AACF,YAAA,UAAA,CAAW,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,KAAA,GAAQ,CAAC,CAAC,CAAA;AAAA,UACzC,SAAS,KAAA,EAAO;AACd,YAAA,UAAA,CAAW,IAAA,CAAK,wBAAA,CAAyB,KAAK,CAAC,CAAA;AAAA,UACjD;AACA,UAAA,CAAA,EAAA;AAAA,QACF;AACA,QAAA,IAAI,eAAe,cAAA,EAAgB;AACjC,UAAA,UAAA,CAAW,IAAA,CAAK,CAAA,OAAA,EAAK,YAAA,GAAe,cAAc,CAAA,YAAA,CAAc,CAAA;AAAA,QAClE;AACA,QAAA,OAAO,UAAA;AAAA,MACT;AAGA,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,QAAA,MAAMC,WAAU,EAAC;AAEjB,QAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,IAAA,CAAK,IAAI,GAAA,CAAI,MAAA,EAAQ,cAAc,CAAA,EAAG,CAAA,EAAA,EAAK;AAC7D,UAAA,IAAI;AACF,YAAAA,QAAAA,CAAQ,KAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAC,CAAA;AAAA,UACxC,SAAS,KAAA,EAAO;AACd,YAAAA,QAAAA,CAAQ,IAAA,CAAK,wBAAA,CAAyB,KAAK,CAAC,CAAA;AAAA,UAC9C;AAAA,QACF;AAEA,QAAA,IAAI,GAAA,CAAI,SAAS,cAAA,EAAgB;AAC/B,UAAAA,SAAQ,IAAA,CAAK,CAAA,OAAA,EAAK,GAAA,CAAI,MAAA,GAAS,cAAc,CAAA,YAAA,CAAc,CAAA;AAAA,QAC7D;AACA,QAAA,OAAOA,QAAAA;AAAA,MACT;AAGA,MAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,EAAG;AACzD,QAAA,OAAO,CAAA,eAAA,EAAkB,IAAI,MAAM,CAAA,CAAA,CAAA;AAAA,MACrC;AAEA,MAAA,IAAI,WAAA,CAAY,MAAA,CAAO,GAAG,CAAA,EAAG;AAC3B,QAAA,MAAM,IAAA,GAAQ,GAAA,CAAY,WAAA,EAAa,IAAA,IAAQ,YAAA;AAC/C,QAAA,MAAM,UAAA,GAAc,IAAY,UAAA,IAAc,GAAA;AAC9C,QAAA,OAAO,CAAA,CAAA,EAAI,IAAI,CAAA,YAAA,EAAe,UAAU,CAAA,CAAA,CAAA;AAAA,MAC1C;AAEA,MAAA,IAAI,eAAe,WAAA,EAAa;AAC9B,QAAA,OAAO,CAAA,wBAAA,EAA2B,IAAI,UAAU,CAAA,CAAA,CAAA;AAAA,MAClD;AAGA,MAAA,IAAI,gBAAA;AACJ,MAAA,IAAI;AACF,QAAA,gBAAA,GAAmB,GAAA,CAAI,gBAAA;AAAA,MACzB,SAAS,KAAA,EAAO;AACd,QAAA,OAAO,CAAA,0BAAA,EAA6B,iBAAiB,KAAA,GAAQ,cAAA,CAAe,MAAM,OAAA,EAAS,GAAG,IAAI,eAAe,CAAA,CAAA,CAAA;AAAA,MACnH;AAEA,MAAA,IAAI,OAAO,qBAAqB,UAAA,EAAY;AAC1C,QAAA,IAAI;AACF,UAAA,OAAO,MAAA,CAAO,gBAAA,CAAiB,IAAA,CAAK,GAAG,GAAG,KAAK,CAAA;AAAA,QACjD,SAAS,KAAA,EAAO;AACd,UAAA,OAAO,CAAA,0BAAA,EAA6B,iBAAiB,KAAA,GAAQ,cAAA,CAAe,MAAM,OAAA,EAAS,GAAG,IAAI,eAAe,CAAA,CAAA,CAAA;AAAA,QACnH;AAAA,MACF;AAKA,MAAA,IAAI,mBAAA,GAAsB,KAAA;AAC1B,MAAA,IAAI;AACF,QAAA,mBAAA,GAAsB,aAAa,GAAG,CAAA;AAAA,MACxC,CAAA,CAAA,MAAQ;AACN,QAAA,mBAAA,GAAsB,KAAA;AAAA,MACxB;AAEA,MAAA,IAAI,mBAAA,EAAqB;AACvB,QAAA,OAAO,GAAA;AAAA,MACT;AAGA,MAAA,MAAM,UAA+B,EAAC;AACtC,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,CAAE,MAAA,CAAO,CAAA,GAAA,KAAO,CAAC,QAAA,CAAS,GAAA,CAAI,GAAG,CAAC,CAAA;AAC9D,MAAA,IAAI,QAAA,GAAW,CAAA;AAEf,MAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,QAAA,IAAI,YAAY,aAAA,EAAe;AAC7B,UAAA,OAAA,CAAQ,aAAa,CAAA,GAAI,CAAA,EAAG,IAAA,CAAK,SAAS,QAAQ,CAAA,kBAAA,CAAA;AAClD,UAAA;AAAA,QACF;AAEA,QAAA,IAAI;AACF,UAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,MAAA,CAAQ,IAAgC,GAAG,CAAA,EAAG,QAAQ,CAAC,CAAA;AACtE,UAAA,QAAA,EAAA;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,wBAAA,CAAyB,KAAK,CAAA;AAC7C,UAAA,QAAA,EAAA;AAAA,QACF;AAAA,MACF;AAEA,MAAA,OAAO,OAAA;AAAA,IACT,CAAA,SAAE;AAGA,MAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAA,EAAM;AAC3C,QAAA,SAAA,CAAU,OAAO,GAAG,CAAA;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,CAAO,OAAO,CAAC,CAAA;AACxB;;;AChaA,SAAS,UAAA,CAAW,OAA2B,OAAA,EAA+C;AAC5F,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,KAAA;AACH,MAAA,OAAO,EAAE,MAAM,KAAA,EAAO,GAAA,EAAK,UAAU,KAAA,CAAM,GAAA,EAAK,OAAO,CAAA,EAAE;AAAA,IAC3D,KAAK,QAAA;AACH,MAAA,OAAO,EAAE,MAAM,QAAA,EAAU,MAAA,EAAQ,UAAU,KAAA,CAAM,MAAA,EAAQ,OAAO,CAAA,EAAE;AAAA,IACpE,KAAK,OAAA;AACH,MAAA,OAAO,EAAE,MAAM,OAAA,EAAS,KAAA,EAAO,UAAU,KAAA,CAAM,KAAA,EAAO,OAAO,CAAA,EAAE;AAAA,IACjE,KAAK,UAAA;AACH,MAAA,OAAO,EAAE,MAAM,UAAA,EAAY,QAAA,EAAU,UAAU,KAAA,CAAM,QAAA,EAAU,OAAO,CAAA,EAAE;AAAA,IAC1E;AAEE,MAAA,OAAO,KAAA;AAAA;AAEb;AAGA,IAAM,oBAAA,GAAuB,CAAA;AAMtB,IAAM,gBAAA,GAAN,cAA+B,yBAAA,CAA8C;AAAA,EAC1E,YAAqC,EAAC;AAAA,EACtC,MAAA;AAAA;AAAA,EAGA,eAAA,uBAA0C,GAAA,EAAI;AAAA,EAE9C,uBAAA,GAA0B,CAAA;AAAA,EAC1B,mCAAA,GAAsC,CAAA;AAAA;AAAA,EAGtC,gBAAA;AAAA,EAER,YAAY,IAAA,EAAwD;AAClE,IAAA,KAAA,CAAM,EAAE,IAAA,EAAM,kBAAA,EAAoB,CAAA;AAClC,IAAA,IAAA,CAAK,gBAAA,GAAmB,yBAAA,CAA0B,IAAA,EAAM,oBAAoB,CAAA;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,iBAAiB,QAAA,EAAuC;AACtD,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA,EAAG;AACrC,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,QAAQ,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,mBAAmB,QAAA,EAA0C;AAC3D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,QAAQ,CAAA;AAC7C,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,KAAA,EAAO,CAAC,CAAA;AAC9B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAiD;AAC/C,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,SAAS,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eAAe,MAAA,EAAmC;AAChD,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,4DAAA,CAA8D,CAAA;AAAA,IACjF;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAAA,GAA4B;AAC1B,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAA6C;AAC3C,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,KAAK,KAAA,EAAiC;AAIpC,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,KAAA,EAAO,IAAA,CAAK,gBAAgB,CAAA;AAGvD,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,SAAA,EAAW;AACrC,MAAA,IAAA,CAAK,aAAa,cAAA,CAAe,QAAA,EAAU,OAAA,EAAS,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,IAClE;AAGA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAA,CAAK,aAAa,cAAA,CAAe,IAAA,CAAK,QAAQ,OAAA,EAAS,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,IACrE;AAGA,IAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cAAc,KAAA,EAAqC;AACjD,IAAA,IAAI,IAAA,CAAK,0BAA0B,CAAA,EAAG;AACpC,MAAA,IAAA,CAAK,mCAAA,EAAA;AAAA,IACP;AAEA,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,SAAA,EAAW;AACrC,MAAA,IAAA,CAAK,aAAa,kBAAA,CAAmB,QAAA,EAAU,KAAA,EAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,IACpE;AAEA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAA,CAAK,aAAa,kBAAA,CAAmB,IAAA,CAAK,QAAQ,KAAA,EAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,IACvE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,aAAa,MAAA,EAAoC;AACvD,IAAA,IAAI,MAAA,IAAU,OAAQ,MAAA,CAAyB,IAAA,KAAS,UAAA,EAAY;AAClE,MAAA,MAAM,OAAA,GAAU,MAAA;AAChB,MAAA,IAAA,CAAK,eAAA,CAAgB,IAAI,OAAO,CAAA;AAChC,MAAA,KAAK,QAAQ,OAAA,CAAQ,MAAM,KAAK,eAAA,CAAgB,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,IACjE;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,oBAAA,GAAsC;AAClD,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,IAAA,GAAO,CAAA,EAAG;AACpC,MAAA,MAAM,QAAQ,UAAA,CAAW,CAAC,GAAG,IAAA,CAAK,eAAe,CAAC,CAAA;AAClD,MAAA,UAAA,EAAA;AACA,MAAA,IAAI,cAAc,oBAAA,EAAsB;AACtC,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,UACV,CAAA,oCAAA,EAAuC,oBAAoB,CAAA,yBAAA,EACtD,IAAA,CAAK,gBAAgB,IAAI,CAAA,kEAAA;AAAA,SAChC;AAGA,QAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,IAAA,GAAO,CAAA,EAAG;AACjC,UAAA,MAAM,QAAQ,UAAA,CAAW,CAAC,GAAG,IAAA,CAAK,eAAe,CAAC,CAAA;AAAA,QACpD;AACA,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,mBAAA,GAAwC;AACpD,IAAA,MAAM,mBAAmB,IAAA,CAAK,mCAAA;AAC9B,IAAA,IAAA,CAAK,uBAAA,EAAA;AACL,IAAA,IAAI;AACF,MAAA,MAAM,sBAAuC,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,CAAA;AAC9E,MAAA,IAAI,KAAK,MAAA,EAAQ;AACf,QAAA,mBAAA,CAAoB,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,MAC9C;AACA,MAAA,IAAI,mBAAA,CAAoB,SAAS,CAAA,EAAG;AAClC,QAAA,MAAM,OAAA,CAAQ,WAAW,mBAAmB,CAAA;AAAA,MAC9C;AACA,MAAA,OAAO,KAAK,mCAAA,GAAsC,gBAAA;AAAA,IACpD,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,uBAAA,EAAA;AAAA,IACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,KAAA,GAAuB;AAE3B,IAAA,MAAM,KAAK,oBAAA,EAAqB;AAChC,IAAA,MAAM,MAAM,KAAA,EAAM;AAElB,IAAA,KAAA,IAAS,UAAA,GAAa,CAAA,EAAG,UAAA,GAAa,oBAAA,EAAsB,UAAA,EAAA,EAAc;AACxE,MAAA,MAAM,iBAAA,GAAoB,MAAM,IAAA,CAAK,mBAAA,EAAoB;AACzD,MAAA,IAAI,CAAC,iBAAA,IAAqB,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAA,EAAG;AACzD,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,KAAK,oBAAA,EAAqB;AAChC,MAAA,MAAM,MAAM,KAAA,EAAM;AAAA,IACpB;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,MACV,uCAAuC,oBAAoB,CAAA,kFAAA;AAAA,KAE7D;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,QAAA,GAA0B;AAC9B,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,MAAM,MAAM,QAAA,EAAS;AAAA,EACvB;AACF;ACrQO,IAAK,oBAAA,qBAAAC,qBAAAA,KAAL;AACL,EAAAA,sBAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,sBAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,sBAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,sBAAA,QAAA,CAAA,GAAS,QAAA;AAJC,EAAA,OAAAA,qBAAAA;AAAA,CAAA,EAAA,oBAAA,IAAA,EAAA;AAOZ,IAAM,iBAAiBC,IAAA,CAAE,MAAA,CAAoC,CAAA,KAAA,KAAS,OAAO,UAAU,UAAA,EAAY;AAAA,EACjG,OAAA,EAAS;AACX,CAAC,CAAA;AAgJM,IAAM,sBAAA,GAAyBA,IAAA,CAAE,kBAAA,CAAmB,MAAA,EAAQ;AAAA,EACjEA,KAAE,MAAA,CAAO;AAAA,IACP,IAAA,EAAMA,IAAA,CAAE,OAAA,CAAQ,QAAA;AAA2B,GAC5C,CAAA;AAAA,EACDA,KAAE,MAAA,CAAO;AAAA,IACP,IAAA,EAAMA,IAAA,CAAE,OAAA,CAAQ,OAAA;AAA0B,GAC3C,CAAA;AAAA,EACDA,KAAE,MAAA,CAAO;AAAA,IACP,IAAA,EAAMA,IAAA,CAAE,OAAA,CAAQ,OAAA,aAA0B;AAAA,IAC1C,WAAA,EAAaA,IAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,GAAG,qCAAqC,CAAA,CAAE,GAAA,CAAI,CAAA,EAAG,qCAAqC;AAAA,GACnH,CAAA;AAAA,EACDA,KAAE,MAAA,CAAO;AAAA,IACP,IAAA,EAAMA,IAAA,CAAE,OAAA,CAAQ,QAAA,cAA2B;AAAA,IAC3C,OAAA,EAAS;AAAA,GACV;AACH,CAAC;AAKM,IAAM,0BAAA,GAA6BA,KACvC,MAAA,CAAO;AAAA,EACN,eAAA,EAAiBA,KAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACtD,QAAA,EAAUA,KAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC/C,cAAA,EAAgBA,KAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACrD,aAAA,EAAeA,KAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,GAAW,QAAA;AAC7C,CAAC,EACA,QAAA;AAEH,IAAM,aAAa,CAAC,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,SAAS,OAAO,CAAA;AAE7D,IAAM,uBAAA,GAA0BA,KAC7B,MAAA,CAAO;AAAA,EACN,eAAeA,IAAA,CAAE,KAAA,CAAMA,KAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EAC5C,UAAA,EAAYA,IAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAC1B,CAAC,EACA,QAAA,EAAS;AAEZ,IAAM,mBAAA,GAAsBA,KACzB,MAAA,CAAO;AAAA,EACN,OAAA,EAASA,IAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAC9B,KAAA,EAAOA,IAAA,CAAE,IAAA,CAAK,UAAU,EAAE,QAAA;AAC5B,CAAC,EACA,QAAA,EAAS;AAEZ,IAAM,gBAAA,GAAmB,eAAe,QAAA,EAAS;AAEjD,IAAM,iCAAA,GAAoC;AAAA,EACxC,aAAaA,IAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,GAAG,0BAA0B,CAAA;AAAA,EACzD,QAAA,EAAU,uBAAuB,QAAA,EAAS;AAAA,EAC1C,WAAWA,IAAA,CAAE,KAAA,CAAMA,KAAE,GAAA,EAAK,EAAE,QAAA,EAAS;AAAA,EACrC,MAAA,EAAQA,IAAA,CAAE,GAAA,EAAI,CAAE,QAAA,EAAS;AAAA,EACzB,sBAAsBA,IAAA,CAAE,KAAA,CAAMA,KAAE,GAAA,EAAK,EAAE,QAAA,EAAS;AAAA,EAChD,oBAAA,EAAsBA,IAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAC3C,gBAAA,EAAkBA,KAAE,KAAA,CAAMA,IAAA,CAAE,WAAWC,sBAAQ,CAAC,EAAE,QAAA,EAAS;AAAA,EAC3D,UAAA,EAAY,gBAAA;AAAA,EACZ,oBAAoBD,IAAA,CAAE,KAAA,CAAMA,KAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACjD,oBAAA,EAAsB,0BAAA;AAAA,EACtB,WAAA,EAAa,uBAAA;AAAA,EACb,OAAA,EAAS;AACX,CAAA;AAOO,IAAM,iCAAA,GAAoCA,KAC9C,MAAA,CAAO;AAAA,EACN,MAAMA,IAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,GAAG,kBAAkB,CAAA;AAAA,EAC1C,GAAG;AACL,CAAC,CAAA,CACA,MAAA;AAAA,EACC,CAAA,IAAA,KAAQ;AAEN,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,UAAU,MAAA,GAAS,CAAA;AAC/D,IAAA,MAAM,SAAA,GAAY,CAAC,CAAC,IAAA,CAAK,MAAA;AACzB,IAAA,OAAO,YAAA,IAAgB,SAAA;AAAA,EACzB,CAAA;AAAA,EACA;AAAA,IACE,OAAA,EAAS;AAAA;AAEb;AAMK,IAAM,8BAAA,GAAiCA,IAAA,CAAE,MAAA,CAAO,iCAAiC,CAAA,CAAE,MAAA;AAAA,EACxF,CAAA,IAAA,KAAQ;AAEN,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,UAAU,MAAA,GAAS,CAAA;AAC/D,IAAA,MAAM,SAAA,GAAY,CAAC,CAAC,IAAA,CAAK,MAAA;AACzB,IAAA,OAAO,YAAA,IAAgB,SAAA;AAAA,EACzB,CAAA;AAAA,EACA;AAAA,IACE,OAAA,EAAS;AAAA;AAEb;AAQA,IAAM,gCAAA,GAAmCA,KACtC,MAAA,CAAO;AAAA,EACN,iBAAiBA,IAAA,CAAE,KAAA,CAAMA,KAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EAC9C,cAAA,EAAgBA,IAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACpC,cAAA,EAAgBA,KAAE,IAAA,CAAK,CAAC,QAAQ,SAAS,CAAC,EAAE,QAAA;AAC9C,CAAC,EACA,MAAA,EAAO;AAEH,IAAM,iCAAA,GAAoCA,KAC9C,MAAA,CAAO;AAAA,EACN,OAAA,EAASA,KACN,MAAA,CAAO;AAAA,IACN,OAAA,EAASA,IAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAAS,GAC/B,CAAA,CACA,QAAA,EAAS,CACT,QAAA,EAAS;AAAA,EACZ,OAAA,EAASA,IAAA,CAAE,KAAA,CAAM,CAACA,IAAA,CAAE,OAAOA,IAAA,CAAE,MAAA,EAAO,EAAGA,IAAA,CAAE,GAAA,EAAK,GAAGA,IAAA,CAAE,KAAA,CAAMA,IAAA,CAAE,GAAA,EAAK,CAAA,EAAGA,KAAE,IAAA,EAAM,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EACvF,cAAA,EAAgB,eAAe,QAAA,EAAS;AAAA,EACxC,mBAAA,EAAqBA,IAAA,CAAE,KAAA,CAAM,CAACA,IAAA,CAAE,SAAQ,EAAG,gCAAgC,CAAC,CAAA,CAAE,QAAA;AAChF,CAAC,CAAA,CACA,aAAY,CACZ,MAAA;AAAA,EACC,CAAA,IAAA,KAAQ;AAEN,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,OAAA,EAAS,OAAA,KAAY,IAAA;AAEnD,IAAA,MAAM,aACJ,IAAA,CAAK,OAAA,IAAW,OAAO,IAAA,CAAK,OAAA,KAAY,YAAY,CAAC,KAAA,CAAM,QAAQ,IAAA,CAAK,OAAO,IAC3E,MAAA,CAAO,IAAA,CAAK,KAAK,OAAO,CAAA,CAAE,SAAS,CAAA,GACnC,KAAA;AAGN,IAAA,OAAO,EAAE,gBAAA,IAAoB,UAAA,CAAA;AAAA,EAC/B,CAAA;AAAA,EACA;AAAA,IACE,OAAA,EACE;AAAA;AAEN,CAAA,CACC,MAAA;AAAA,EACC,CAAA,IAAA,KAAQ;AAEN,IAAA,MAAM,cACJ,IAAA,CAAK,OAAA,IAAW,OAAO,IAAA,CAAK,OAAA,KAAY,YAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,GAC3E,MAAA,CAAO,KAAK,IAAA,CAAK,OAAO,EAAE,MAAA,GAC1B,CAAA;AAGN,IAAA,IAAI,WAAA,GAAc,CAAA,IAAK,CAAC,IAAA,CAAK,cAAA,EAAgB;AAC3C,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EACA;AAAA,IACE,OAAA,EACE;AAAA;AAEN,CAAA,CACC,MAAA;AAAA,EACC,CAAA,IAAA,KAAQ;AAEN,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,OAAA,EAAS,OAAA,KAAY,IAAA;AACnD,MAAA,MAAM,aACJ,IAAA,CAAK,OAAA,IAAW,OAAO,IAAA,CAAK,OAAA,KAAY,YAAY,CAAC,KAAA,CAAM,QAAQ,IAAA,CAAK,OAAO,IAC3E,MAAA,CAAO,IAAA,CAAK,KAAK,OAAO,CAAA,CAAE,SAAS,CAAA,GACnC,KAAA;AAGN,MAAA,OAAO,gBAAA,IAAoB,UAAA;AAAA,IAC7B;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EACA;AAAA,IACE,OAAA,EAAS;AAAA;AAEb;AC9UF,IAAM,kBAAA,GAA+C;AAAA,EACnD,KAAA,EAAO,CAAA;AAAA,EACP,IAAA,EAAM,CAAA;AAAA,EACN,IAAA,EAAM,CAAA;AAAA,EACN,KAAA,EAAO,CAAA;AAAA,EACP,KAAA,EAAO;AACT,CAAA;AAEO,IAAM,oBAAN,MAAiD;AAAA,EAC9C,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMR,YAAY,MAAA,EAA6B;AACvC,IAAA,MAAM,qBAAqB,MAAA,CAAO,kBAAA,GAAqB,EAAE,GAAG,MAAA,CAAO,oBAAmB,GAAI,MAAA;AAE1F,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,GAAG,MAAA;AAAA,MACH,OAAA,EAAS,MAAA,CAAO,OAAA,IAAW,kBAAA,EAAoB,OAAA;AAAA,MAC/C,MAAA,EAAQ,MAAA,CAAO,MAAA,IAAU,kBAAA,EAAoB,MAAA;AAAA,MAC7C,kBAAA;AAAA,MACA,UAAU,MAAA,CAAO,QAAA,GAAW,eAAA,CAAgB,MAAA,CAAO,QAAQ,CAAA,GAAI;AAAA,KACjE;AAAA,EACF;AAAA;AAAA,EAGA,KAAA,CAAM,SAAiB,IAAA,EAAsC;AAC3D,IAAA,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA;AAAA,EACjC;AAAA;AAAA,EAGA,IAAA,CAAK,SAAiB,IAAA,EAAsC;AAC1D,IAAA,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,OAAA,EAAS,IAAI,CAAA;AAAA,EAChC;AAAA;AAAA,EAGA,IAAA,CAAK,SAAiB,IAAA,EAAsC;AAC1D,IAAA,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,OAAA,EAAS,IAAI,CAAA;AAAA,EAChC;AAAA;AAAA,EAGA,KAAA,CAAM,SAAiB,IAAA,EAAsC;AAC3D,IAAA,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA;AAAA,EACjC;AAAA;AAAA,EAGA,KAAA,CAAM,SAAiB,IAAA,EAAsC;AAC3D,IAAA,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKQ,GAAA,CAAI,KAAA,EAAiB,OAAA,EAAiB,IAAA,EAAsC;AAClF,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,QAAA,IAAY,MAAA;AACzC,IAAA,IAAI,kBAAA,CAAmB,KAAK,CAAA,GAAI,kBAAA,CAAmB,QAAQ,CAAA,EAAG;AAC5D,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAA2B;AAAA,MAC/B,OAAOE,8BAAA,EAAiB;AAAA,MACxB,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,KAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA,EAAS,KAAK,MAAA,CAAO,OAAA;AAAA,MACrB,MAAA,EAAQ,KAAK,MAAA,CAAO,MAAA;AAAA,MACpB,kBAAA,EAAoB,KAAK,MAAA,CAAO,kBAAA;AAAA,MAChC,QAAA,EAAU,KAAK,MAAA,CAAO;AAAA,KACxB;AAEA,IAAA,MAAM,KAAA,GAAkB,EAAE,IAAA,EAAM,KAAA,EAAO,KAAK,WAAA,EAAY;AACxD,IAAA,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,IAAA,CAAK,KAAK,CAAA;AAAA,EACzC;AACF;AC5DO,IAAM,qBAAN,MAAmD;AAAA,EAChD,OAAA;AAAA,EACA,MAAA;AAAA,EACA,kBAAA;AAAA,EACA,QAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMR,YAAY,MAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,qBAAqB,MAAA,CAAO,kBAAA,GAAqB,EAAE,GAAG,MAAA,CAAO,oBAAmB,GAAI,MAAA;AACzF,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,OAAA,IAAW,IAAA,CAAK,kBAAA,EAAoB,OAAA;AAC1D,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,MAAA,IAAU,IAAA,CAAK,kBAAA,EAAoB,MAAA;AACxD,IAAA,IAAA,CAAK,WAAW,MAAA,CAAO,QAAA,GAAW,eAAA,CAAgB,MAAA,CAAO,QAAQ,CAAA,GAAI,MAAA;AACrE,IAAA,IAAA,CAAK,oBAAoB,MAAA,CAAO,iBAAA;AAChC,IAAA,IAAA,CAAK,mBAAmB,MAAA,CAAO,gBAAA;AAAA,EACjC;AAAA;AAAA,EAGA,IAAA,CAAK,IAAA,EAAc,KAAA,EAAe,MAAA,EAAiC,OAAA,EAAmC;AACpG,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,IAAK,QAAQ,CAAA,EAAG;AACxC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,iBAAiB,MAAA,GAAS,IAAA,CAAK,kBAAkB,YAAA,CAAa,MAAM,IAAI,EAAC;AAC/E,IAAA,MAAM,cAAc,OAAA,EAAS,WAAA,GAAc,gBAAA,CAAiB,OAAA,CAAQ,WAAW,CAAA,GAAI,MAAA;AAEnF,IAAA,MAAM,cAAA,GAAiC;AAAA,MACrC,UAAUA,8BAAAA,EAAiB;AAAA,MAC3B,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,IAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA,EAAQ,cAAA;AAAA,MACR,oBAAoB,IAAA,CAAK,kBAAA;AAAA,MACzB,WAAA;AAAA,MACA,UAAU,IAAA,CAAK;AAAA,KACjB;AAEA,IAAA,MAAM,KAAA,GAAqB,EAAE,IAAA,EAAM,QAAA,EAAU,QAAQ,cAAA,EAAe;AACpE,IAAA,IAAA,CAAK,gBAAA,CAAiB,KAAK,KAAK,CAAA;AAAA,EAClC;AAAA;AAAA,EAGA,QAAQ,IAAA,EAAuB;AAC7B,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,CAAC,KAAA,EAAe,gBAAA,KAA8C;AACjE,QAAA,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,gBAAgB,CAAA;AAAA,MACzC;AAAA,KACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,IAAA,EAAqB;AACzB,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,CAAC,KAAA,EAAe,gBAAA,KAA8C;AACjE,QAAA,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,gBAAgB,CAAA;AAAA,MACzC;AAAA,KACF;AAAA,EACF;AAAA;AAAA,EAGA,UAAU,IAAA,EAAyB;AACjC,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,CAAC,KAAA,EAAe,gBAAA,KAA8C;AACpE,QAAA,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,gBAAgB,CAAA;AAAA,MACzC;AAAA,KACF;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,WAAA,EAAuC;AAC/D,EAAA,OAAO;AAAA,IACL,UAAU,WAAA,CAAY,QAAA;AAAA,IACtB,OAAO,WAAA,CAAY,KAAA;AAAA,IACnB,eAAe,WAAA,CAAY,aAAA;AAAA,IAC3B,UAAU,WAAA,CAAY,QAAA;AAAA,IACtB,cAAc,WAAA,CAAY,YAAA,GAAe,eAAA,CAAgB,WAAA,CAAY,YAAY,CAAA,GAAI;AAAA,GACvF;AACF;;;ACjIO,IAAM,cAAN,MAAkB;AAAA,EACd,KAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EAET,YAAY,IAAA,EAIT;AACD,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAClB,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAAA,EACpB;AAAA,EAEA,aAAa,KAAA,EAA4B;AACvC,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,IAAA,CAAK,WAAW,CAAA,EAAG;AACxC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,KAAK,KAAA,CAAM,CAAA,SAAA,KAAa,KAAK,gBAAA,CAAiB,SAAA,EAAW,KAAK,CAAC,CAAA;AAAA,EAC7E;AAAA,EAEA,yBAAyB,KAAA,EAA8B;AACrD,IAAA,OAAO,QAAQ,KAAA,IAAS,OAAO,KAAK,KAAA,CAAM,KAAK,MAAM,QAAQ,CAAA;AAAA,EAC/D;AAAA,EAEQ,gBAAA,CACN,WACA,KAAA,EACS;AACT,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,sBAAA,CAAuB,SAAA,CAAU,OAAO,KAAK,CAAA;AAC/D,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,QAAQ,UAAU,EAAA;AAAI,MACpB,KAAK,IAAA;AACH,QAAA,OAAO,OAAO,SAAA,CAAU,KAAA;AAAA,MAC1B,KAAK,KAAA;AACH,QAAA,OAAO,QAAQ,SAAA,CAAU,KAAA;AAAA,MAC3B,KAAK,IAAA;AACH,QAAA,OAAO,OAAO,SAAA,CAAU,KAAA;AAAA,MAC1B,KAAK,KAAA;AACH,QAAA,OAAO,QAAQ,SAAA,CAAU,KAAA;AAAA,MAC3B,KAAK,IAAA;AACH,QAAA,OAAO,SAAS,SAAA,CAAU,KAAA;AAAA,MAC5B,KAAK,KAAA;AACH,QAAA,OAAO,SAAS,SAAA,CAAU,KAAA;AAAA,MAC5B;AACE,QAAA,OAAO,KAAA;AAAA;AACX,EACF;AAAA,EAEQ,sBAAA,CAAuB,OAA8B,KAAA,EAAkC;AAC7F,IAAA,QAAQ,KAAA;AAAO,MACb,KAAK,oBAAA;AACH,QAAA,OAAO,OAAO,KAAA,CAAM,WAAA,KAAgB,QAAA,GAAW,MAAM,WAAA,GAAc,IAAA;AAAA,MACrE;AACE,QAAA,OAAO,IAAA;AAAA;AACX,EACF;AACF,CAAA;AAEO,IAAM,eAAN,MAAmB;AAAA,EACf,EAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EAET,YAAY,IAAA,EAOT;AACD,IAAA,IAAA,CAAK,KAAK,IAAA,CAAK,EAAA;AACf,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AACrB,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAClB,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AACrB,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAAA,EACpB;AAAA,EAEA,uBAAuB,KAAA,EAAuC;AAC5D,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,MAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA,IAAK,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA,EAAG;AACjE,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,KAAK,kBAAA,EAAmB;AAAA,EACjC;AAAA,EAEA,kBAAA,GAAyC;AACvC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,IAAK,IAAA;AAAA,EAC1B;AACF,CAAA;;;AClGA,IAAM,cAAA,GAAiB,oBAAA;AA6BvB,IAAM,2BAAA,GAAsE;AAAA,EAC1E,EAAA,EAAI,cAAA;AAAA,EACJ,EAAA,EAAI,eAAA;AAAA,EACJ,IAAA,EAAM,yBAAA;AAAA,EACN,IAAA,EAAM,0BAAA;AAAA,EACN,GAAA,EAAK,oBAAA;AAAA,EACL,GAAA,EAAK,qBAAA;AAAA,EACL,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,qCAAA,GAAkG;AAAA,EACtG,GAAA,EAAK;AACP,CAAA;AAEA,IAAI,eAAA,GAAiC,IAAA;AAE9B,IAAM,eAAA,GAAN,MAAM,gBAAA,CAAgB;AAAA,EAG3B,YAA6B,aAAA,EAA0C;AAA1C,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AAAA,EAA2C;AAAA,EAA3C,aAAA;AAAA,EAF7B,OAAe,cAAA,GAAyC,IAAA;AAAA,EAIxD,OAAO,SAAS,gBAAA,EAA2C;AACzD,IAAA,OAAO,IAAI,gBAAA,CAAgB,qBAAA,CAAsB,gBAAgB,CAAC,CAAA;AAAA,EACpE;AAAA,EAEA,OAAO,SAAA,GAAoC;AACzC,IAAA,IAAI,iBAAgB,cAAA,EAAgB;AAClC,MAAA,OAAO,gBAAA,CAAgB,cAAA;AAAA,IACzB;AAEA,IAAA,MAAM,gBAAgB,iBAAA,EAAkB;AACxC,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,gBAAA,CAAgB,cAAA,GAAiB,IAAI,gBAAA,CAAgB,aAAa,CAAA;AAClE,IAAA,OAAO,gBAAA,CAAgB,cAAA;AAAA,EACzB;AAAA,EAEA,IAAI,IAAA,EAAgE;AAElE,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,IAAA,CAAK,KAAK,CAAA;AAC5C,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,GAAA,GAAM,eAAe,EAAE,QAAA,EAAU,KAAK,QAAA,EAAU,KAAA,EAAO,SAAS,CAAA;AACtE,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AACxC,MAAA,IAAI,OAAO,OAAO,KAAA;AAAA,IACpB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAA;AAEA,SAAS,iBAAA,GAAsD;AAC7D,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAUC,mBAAA,CAAG,YAAA,CAAa,uBAAA,IAA2B,OAAO,CAAA;AAClE,IAAA,OAAO,sBAAsB,OAAO,CAAA;AAAA,EACtC,SAAS,KAAA,EAAO;AACd,IAAA,eAAA,GAAkB,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACvE,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,sBAAsB,OAAA,EAA4C;AACzE,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAA0B;AAEpD,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,EAAG;AACtC,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACjC,IAAA,MAAM,YAAA,GAAe,sBAAsB,MAAM,CAAA;AACjD,IAAA,aAAA,CAAc,GAAA,CAAI,cAAA,CAAe,YAAY,CAAA,EAAG,YAAY,CAAA;AAAA,EAC9D;AAEA,EAAA,OAAO,aAAA;AACT;AAEA,SAAS,sBAAsB,GAAA,EAA4C;AACzE,EAAA,OAAO,IAAI,YAAA,CAAa;AAAA,IACtB,IAAI,GAAA,CAAI,CAAA;AAAA,IACR,UAAU,GAAA,CAAI,CAAA;AAAA,IACd,OAAO,GAAA,CAAI,CAAA;AAAA,IACX,MAAA,EAAQ,IAAI,CAAA,CAAE,CAAA;AAAA,IACd,QAAA,EAAU,GAAA,CAAI,CAAA,CAAE,CAAA,CAAE,CAAA;AAAA,IAClB,KAAA,EAAO,GAAA,CAAI,CAAA,CAAE,CAAA,CAAE,CAAA,CAAE,GAAA;AAAA,MACf,CAAC,IAAA,EAAM,KAAA,KACL,IAAI,WAAA,CAAY;AAAA,QACd,KAAA;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,CAAA,EAAG,GAAA,CAAI,CAAA,SAAA,MAAc;AAAA,UAC9B,KAAA,EAAO,qCAAA,CAAsC,SAAA,CAAU,CAAC,CAAA;AAAA,UACxD,IAAI,SAAA,CAAU,EAAA;AAAA,UACd,OAAO,SAAA,CAAU;AAAA,SACnB,CAAE,CAAA;AAAA,QACF,OAAO,MAAA,CAAO,WAAA;AAAA,UACZ,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,CAAE,IAAI,CAAC,CAAC,KAAA,EAAO,KAAK,CAAA,KAAM;AAAA,YAC7C,4BAA4B,KAAyB,CAAA;AAAA,YACrD,KAAA,CAAO;AAAA,WACR;AAAA;AACH,OACD;AAAA;AACL,GACD,CAAA;AACH;AAEA,SAAS,uBAAA,GAAkC;AACzC,EAAA,MAAM,cAAc,cAAA,EAAe;AACnC,EAAA,MAAM,UAAA,GAAa;AAAA,IACjBC,qBAAA,CAAK,IAAA,CAAK,WAAA,EAAa,MAAA,EAAQ,WAAW,cAAc,CAAA;AAAA,IACxDA,qBAAA,CAAK,IAAA,CAAK,WAAA,EAAa,KAAA,EAAO,WAAW,cAAc,CAAA;AAAA,IACvDA,qBAAA,CAAK,KAAK,OAAA,CAAQ,GAAA,IAAO,eAAA,EAAiB,QAAA,EAAU,KAAA,EAAO,SAAA,EAAW,cAAc,CAAA;AAAA,IACpFA,sBAAK,IAAA,CAAK,OAAA,CAAQ,KAAI,EAAG,KAAA,EAAO,WAAW,cAAc;AAAA,GAC3D;AAEA,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,IAAID,mBAAA,CAAG,UAAA,CAAW,SAAS,CAAA,EAAG;AAC5B,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uDAAA,EAA0D,WAAW,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AACnG;AAEA,SAAS,cAAA,GAAyB;AAChC,EAAA,IAAI;AACF,IAAA,MAAME,QAAAA,GAAUC,sBAAA,CAAc,2PAAY,IAAO,SAAS,CAAA;AAC1D,IAAA,MAAM,eAAA,GAAkBD,QAAAA,CAAQ,OAAA,CAAQ,oCAAoC,CAAA;AAC5E,IAAA,OAAOD,qBAAA,CAAK,QAAQ,eAAe,CAAA;AAAA,EACrC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,QAAQ,GAAA,EAAI;AAAA,EACrB;AACF;AAEA,SAAS,eAAe,IAAA,EAAmD;AACzE,EAAA,OAAO,CAAA,EAAG,kBAAkB,IAAA,CAAK,QAAQ,CAAC,CAAA,EAAA,EAAK,gBAAA,CAAiB,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA;AAC7E;AAEA,SAAS,iBAAiB,KAAA,EAAuB;AAC/C,EAAA,OAAO,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AAClC;AAOA,SAAS,kBAAkB,QAAA,EAA0B;AACnD,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,IAAA,EAAK,CAAE,WAAA,EAAY;AAC/C,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,OAAA,CAAQ,GAAG,CAAA;AACvC,EAAA,OAAO,aAAa,EAAA,GAAK,UAAA,CAAW,SAAA,CAAU,CAAA,EAAG,QAAQ,CAAA,GAAI,UAAA;AAC/D;AAgBA,SAAS,iBAAiB,KAAA,EAAyB;AACjD,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,EAAA,MAAM,GAAA,GAAM,CAAC,CAAA,KAAc;AACzB,IAAA,QAAA,CAAS,IAAI,CAAC,CAAA;AACd,IAAA,QAAA,CAAS,GAAA,CAAI,eAAA,CAAgB,CAAC,CAAC,CAAA;AAAA,EACjC,CAAA;AAEA,EAAA,GAAA,CAAI,KAAK,CAAA;AACT,EAAA,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAC,CAAA;AAC7B,EAAA,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAC,CAAA;AAE/B,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AACpC,EAAA,IAAI,eAAe,EAAA,EAAI;AAIrB,IAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,SAAA,CAAU,UAAA,GAAa,CAAC,CAAA;AACpD,IAAA,GAAA,CAAI,aAAa,CAAA;AACjB,IAAA,GAAA,CAAI,aAAA,CAAc,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAC,CAAA;AAAA,EACvC;AAEA,EAAA,OAAO,CAAC,GAAG,QAAQ,CAAA;AACrB;AASA,SAAS,gBAAgB,KAAA,EAAuB;AAE9C,EAAA,IAAI,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,uBAAA,EAAyB,EAAE,CAAA;AACxD,EAAA,IAAI,QAAA,KAAa,OAAO,OAAO,QAAA;AAG/B,EAAA,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,qBAAA,EAAuB,IAAI,CAAA;AACpD,EAAA,IAAI,QAAA,KAAa,OAAO,OAAO,QAAA;AAG/B,EAAA,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,iBAAA,EAAmB,EAAE,CAAA;AAC9C,EAAA,OAAO,QAAA;AACT;;;ACrPO,IAAM,YAAA,GAAe;AAAA,EAC1B,YAAA,EAAc,cAAA;AAAA,EACd,kBAAA,EAAoB,oBAAA;AAAA,EACpB,uBAAA,EAAyB,yBAAA;AAAA,EACzB,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,kBAAA,EAAoB,oBAAA;AAAA,EAEpB,aAAA,EAAe,eAAA;AAAA,EACf,mBAAA,EAAqB,qBAAA;AAAA,EACrB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,uBAAA,EAAyB;AAC3B,CAAA;AAIO,IAAM,YAAA,GAAe;AAAA,EAC1B,WAAA,EAAa,iCAAA;AAAA,EACb,YAAA,EAAc,kCAAA;AAAA,EACd,UAAA,EAAY,gCAAA;AAAA,EACZ,gBAAA,EAAkB,sCAAA;AAAA,EAClB,iBAAA,EAAmB,uCAAA;AAAA,EACnB,WAAA,EAAa,iCAAA;AAAA,EACb,WAAA,EAAa,iCAAA;AAAA,EACb,WAAA,EAAa,iCAAA;AAAA,EACb,gBAAA,EAAkB,sCAAA;AAAA,EAClB,YAAA,EAAc,kCAAA;AAAA,EACd,YAAA,EAAc;AAChB,CAAA;;;ACtBO,SAAS,sBAAsB,KAAA,EAAwC;AAC5E,EAAA,MAAM,UAA+B,EAAC;AACtC,EAAA,MAAM,aAAA,GAAgB,CAAC,IAAA,EAAoB,KAAA,KAA8B;AACvE,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,CAAA;AAAA,IAC9B;AAAA,EACF,CAAA;AACA,EAAA,MAAM,cAAA,GAAiB,CAAC,IAAA,EAAoB,KAAA,KAA8B;AACxE,IAAA,IAAI,KAAA,IAAS,IAAA,IAAQ,KAAA,GAAQ,CAAA,EAAG;AAC9B,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,CAAA;AAAA,IAC9B;AAAA,EACF,CAAA;AAEA,EAAA,aAAA,CAAc,YAAA,CAAa,WAAA,EAAa,KAAA,CAAM,WAAW,CAAA;AACzD,EAAA,aAAA,CAAc,YAAA,CAAa,YAAA,EAAc,KAAA,CAAM,YAAY,CAAA;AAE3D,EAAA,IAAI,MAAM,YAAA,EAAc;AACtB,IAAA,cAAA,CAAe,YAAA,CAAa,UAAA,EAAY,KAAA,CAAM,YAAA,CAAa,IAAI,CAAA;AAC/D,IAAA,cAAA,CAAe,YAAA,CAAa,gBAAA,EAAkB,KAAA,CAAM,YAAA,CAAa,SAAS,CAAA;AAC1E,IAAA,cAAA,CAAe,YAAA,CAAa,iBAAA,EAAmB,KAAA,CAAM,YAAA,CAAa,UAAU,CAAA;AAC5E,IAAA,cAAA,CAAe,YAAA,CAAa,WAAA,EAAa,KAAA,CAAM,YAAA,CAAa,KAAK,CAAA;AACjE,IAAA,cAAA,CAAe,YAAA,CAAa,WAAA,EAAa,KAAA,CAAM,YAAA,CAAa,KAAK,CAAA;AAAA,EACnE;AAEA,EAAA,IAAI,MAAM,aAAA,EAAe;AACvB,IAAA,cAAA,CAAe,YAAA,CAAa,WAAA,EAAa,KAAA,CAAM,aAAA,CAAc,IAAI,CAAA;AACjE,IAAA,cAAA,CAAe,YAAA,CAAa,gBAAA,EAAkB,KAAA,CAAM,aAAA,CAAc,SAAS,CAAA;AAC3E,IAAA,cAAA,CAAe,YAAA,CAAa,YAAA,EAAc,KAAA,CAAM,aAAA,CAAc,KAAK,CAAA;AACnE,IAAA,cAAA,CAAe,YAAA,CAAa,YAAA,EAAc,KAAA,CAAM,aAAA,CAAc,KAAK,CAAA;AAAA,EACrE;AAEA,EAAA,OAAO,OAAA;AACT;;;AClCO,SAAS,aAAA,CACd,IAAA,EAKA,eAAA,GAA0C,eAAA,CAAgB,WAAU,EACpC;AAChC,EAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAO,KAAA,EAAM,GAAI,IAAA;AACnC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAA+B;AAEnD,EAAA,MAAM,eAAe,eAAA,EAAiB,GAAA,CAAI,EAAE,QAAA,EAAU,OAAO,CAAA;AAC7D,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,MAAM,YAAA,GAA4B,EAAE,YAAA,EAAc,EAAE,OAAO,mBAAA,EAAoB,EAAG,UAAU,KAAA,EAAM;AAClG,IAAA,yBAAA,CAA0B,OAAA,EAAS,OAAO,YAAY,CAAA;AACtD,IAAA,OAAO,OAAA;AAAA,EACT;AACA,EAAA,MAAM,YAAA,GAAwC,EAAE,UAAA,EAAY,YAAA,CAAa,EAAA,EAAG;AAE5E,EAAA,MAAM,WAAA,GAAc,YAAA,CAAa,sBAAA,CAAuB,KAAK,CAAA;AAC7D,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,MAAM,YAAA,GAA4B,EAAE,YAAA,EAAc,EAAE,GAAG,cAAc,KAAA,EAAO,kBAAA,EAAmB,EAAG,QAAA,EAAU,KAAA,EAAM;AAClH,IAAA,yBAAA,CAA0B,OAAA,EAAS,OAAO,YAAY,CAAA;AACtD,IAAA,OAAO,OAAA;AAAA,EACT;AACA,EAAA,YAAA,CAAa,YAAY,IAAI,WAAA,CAAY,KAAA;AAEzC,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,YAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,qBAA4E,EAAC;AACnF,EAAA,IAAI,KAAA,CAAM,cAAc,KAAA,EAAO;AAC7B,IAAA,MAAM,SAAS,oBAAA,CAAqB;AAAA,MAClC,OAAO,YAAA,CAAa,kBAAA;AAAA,MACpB,UAAA,EAAY,MAAM,YAAA,CAAa,KAAA;AAAA,MAC/B,GAAG;AAAA,KACJ,CAAA;AACD,IAAA,OAAA,CAAQ,GAAA,CAAI,YAAA,CAAa,WAAA,EAAa,MAAA,CAAO,WAAW,CAAA;AACxD,IAAA,kBAAA,CAAmB,KAAK,MAAM,CAAA;AAAA,EAChC;AAEA,EAAA,IAAI,KAAA,CAAM,cAAc,SAAA,EAAW;AACjC,IAAA,MAAM,SAAS,oBAAA,CAAqB;AAAA,MAClC,OAAO,YAAA,CAAa,uBAAA;AAAA,MACpB,UAAA,EAAY,MAAM,YAAA,CAAa,SAAA;AAAA,MAC/B,GAAG;AAAA,KACJ,CAAA;AACD,IAAA,OAAA,CAAQ,GAAA,CAAI,YAAA,CAAa,gBAAA,EAAkB,MAAA,CAAO,WAAW,CAAA;AAC7D,IAAA,kBAAA,CAAmB,KAAK,MAAM,CAAA;AAAA,EAChC;AAEA,EAAA,IAAI,KAAA,CAAM,cAAc,UAAA,EAAY;AAClC,IAAA,MAAM,SAAS,oBAAA,CAAqB;AAAA,MAClC,OAAO,YAAA,CAAa,wBAAA;AAAA,MACpB,UAAA,EAAY,MAAM,YAAA,CAAa,UAAA;AAAA,MAC/B,GAAG;AAAA,KACJ,CAAA;AACD,IAAA,OAAA,CAAQ,GAAA,CAAI,YAAA,CAAa,iBAAA,EAAmB,MAAA,CAAO,WAAW,CAAA;AAC9D,IAAA,kBAAA,CAAmB,KAAK,MAAM,CAAA;AAAA,EAChC;AAEA,EAAA,IAAI,KAAA,CAAM,cAAc,KAAA,EAAO;AAC7B,IAAA,MAAM,SAAS,oBAAA,CAAqB;AAAA,MAClC,OAAO,YAAA,CAAa,kBAAA;AAAA,MACpB,UAAA,EAAY,MAAM,YAAA,CAAa,KAAA;AAAA,MAC/B,GAAG;AAAA,KACJ,CAAA;AACD,IAAA,OAAA,CAAQ,GAAA,CAAI,YAAA,CAAa,WAAA,EAAa,MAAA,CAAO,WAAW,CAAA;AACxD,IAAA,kBAAA,CAAmB,KAAK,MAAM,CAAA;AAAA,EAChC;AAEA,EAAA,IAAI,KAAA,CAAM,cAAc,IAAA,EAAM;AAC5B,IAAA,MAAM,SAAS,oBAAA,CAAqB;AAAA,MAClC,OAAO,YAAA,CAAa,YAAA;AAAA,MACpB,UAAA,EAAY,MAAM,YAAA,CAAa,IAAA;AAAA,MAC/B,GAAG;AAAA,KACJ,CAAA;AACD,IAAA,OAAA,CAAQ,GAAA,CAAI,YAAA,CAAa,UAAA,EAAY,MAAA,CAAO,WAAW,CAAA;AACvD,IAAA,kBAAA,CAAmB,KAAK,MAAM,CAAA;AAAA,EAChC;AAEA,EAAA,uBAAA,CAAwB;AAAA,IACtB,OAAA;AAAA,IACA,aAAa,YAAA,CAAa,WAAA;AAAA,IAC1B,eAAe,YAAA,CAAa,YAAA;AAAA,IAC5B,iBAAiB,KAAA,CAAM,WAAA;AAAA,IACvB,aAAA,EAAe,kBAAA;AAAA,IACf,GAAG;AAAA,GACJ,CAAA;AAED,EAAA,MAAM,sBAA6E,EAAC;AACpF,EAAA,IAAI,KAAA,CAAM,eAAe,KAAA,EAAO;AAC9B,IAAA,MAAM,SAAS,oBAAA,CAAqB;AAAA,MAClC,OAAO,YAAA,CAAa,mBAAA;AAAA,MACpB,UAAA,EAAY,MAAM,aAAA,CAAc,KAAA;AAAA,MAChC,GAAG;AAAA,KACJ,CAAA;AACD,IAAA,OAAA,CAAQ,GAAA,CAAI,YAAA,CAAa,YAAA,EAAc,MAAA,CAAO,WAAW,CAAA;AACzD,IAAA,mBAAA,CAAoB,KAAK,MAAM,CAAA;AAAA,EACjC;AAEA,EAAA,IAAI,KAAA,CAAM,eAAe,KAAA,EAAO;AAC9B,IAAA,MAAM,SAAS,oBAAA,CAAqB;AAAA,MAClC,OAAO,YAAA,CAAa,mBAAA;AAAA,MACpB,UAAA,EAAY,MAAM,aAAA,CAAc,KAAA;AAAA,MAChC,GAAG;AAAA,KACJ,CAAA;AACD,IAAA,OAAA,CAAQ,GAAA,CAAI,YAAA,CAAa,YAAA,EAAc,MAAA,CAAO,WAAW,CAAA;AACzD,IAAA,mBAAA,CAAoB,KAAK,MAAM,CAAA;AAAA,EACjC;AAEA,EAAA,IAAI,KAAA,CAAM,eAAe,SAAA,EAAW;AAClC,IAAA,MAAM,SAAS,oBAAA,CAAqB;AAAA,MAClC,OAAO,YAAA,CAAa,uBAAA;AAAA,MACpB,UAAA,EAAY,MAAM,aAAA,CAAc,SAAA;AAAA,MAChC,GAAG;AAAA,KACJ,CAAA;AACD,IAAA,OAAA,CAAQ,GAAA,CAAI,YAAA,CAAa,gBAAA,EAAkB,MAAA,CAAO,WAAW,CAAA;AAC7D,IAAA,mBAAA,CAAoB,KAAK,MAAM,CAAA;AAAA,EACjC;AAEA,EAAA,IAAI,KAAA,CAAM,eAAe,IAAA,EAAM;AAC7B,IAAA,MAAM,SAAS,oBAAA,CAAqB;AAAA,MAClC,OAAO,YAAA,CAAa,aAAA;AAAA,MACpB,UAAA,EAAY,MAAM,aAAA,CAAc,IAAA;AAAA,MAChC,GAAG;AAAA,KACJ,CAAA;AACD,IAAA,OAAA,CAAQ,GAAA,CAAI,YAAA,CAAa,WAAA,EAAa,MAAA,CAAO,WAAW,CAAA;AACxD,IAAA,mBAAA,CAAoB,KAAK,MAAM,CAAA;AAAA,EACjC;AAEA,EAAA,uBAAA,CAAwB;AAAA,IACtB,OAAA;AAAA,IACA,aAAa,YAAA,CAAa,YAAA;AAAA,IAC1B,eAAe,YAAA,CAAa,aAAA;AAAA,IAC5B,iBAAiB,KAAA,CAAM,YAAA;AAAA,IACvB,aAAA,EAAe,mBAAA;AAAA,IACf,GAAG;AAAA,GACJ,CAAA;AAED,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,yBAAA,CACP,OAAA,EACA,KAAA,EACA,YAAA,EACM;AACN,EAAA,KAAA,MAAW,MAAA,IAAU,qBAAA,CAAsB,KAAK,CAAA,EAAG;AACjD,IAAA,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,YAAY,CAAA;AAAA,EACvC;AACF;AAEA,SAAS,wBAAwB,IAAA,EASxB;AACP,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA,eAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF,GAAI,IAAA;AACJ,EAAA,IAAI,mBAAmB,IAAA,EAAM;AAC3B,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,wBAAwB,aAAA,CAC3B,MAAA,CAAO,YAAU,MAAA,CAAO,OAAO,EAC/B,GAAA,CAAI,CAAA,MAAA,KAAU,MAAA,CAAO,WAAA,CAAY,aAAa,CAAA,CAC9C,MAAA,CAAO,CAAC,KAAA,KAA2B,OAAO,UAAU,QAAQ,CAAA;AAE/D,EAAA,IAAI,qBAAA,CAAsB,SAAS,CAAA,EAAG;AACpC,IAAA,MAAM,sBAAsB,aAAA,CAAc,IAAA,CAAK,CAAA,MAAA,KAAU,CAAC,OAAO,OAAO,CAAA;AACxE,IAAA,OAAA,CAAQ,IAAI,WAAA,EAAa;AAAA,MACvB,UAAU,YAAA,CAAa,QAAA;AAAA,MACvB,OAAO,YAAA,CAAa,KAAA;AAAA,MACpB,aAAA,EAAe,sBAAsB,MAAA,CAAO,CAAC,KAAK,KAAA,KAAU,GAAA,GAAM,OAAO,CAAC,CAAA;AAAA,MAC1E,UAAU,YAAA,CAAa,QAAA;AAAA,MACvB,YAAA,EAAc,mBAAA,GAAsB,EAAE,GAAG,YAAA,EAAc,OAAO,cAAA,EAAe,GAAI,EAAE,GAAG,YAAA;AAAa,KACpG,CAAA;AACD,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,iBAAiB,oBAAA,CAAqB;AAAA,IAC1C,KAAA,EAAO,aAAA;AAAA,IACP,UAAA,EAAY,eAAA;AAAA,IACZ,YAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,OAAA,CAAQ,GAAA,CAAI,WAAA,EAAa,cAAA,CAAe,WAAW,CAAA;AACrD;AAEA,SAAS,qBAAqB,IAAA,EAS5B;AACA,EAAA,MAAM,EAAE,YAAA,EAAc,WAAA,EAAa,KAAA,EAAO,UAAA,EAAY,cAAa,GAAI,IAAA;AACvE,EAAA,MAAM,WAAA,GAA2B;AAAA,IAC/B,UAAU,YAAA,CAAa,QAAA;AAAA,IACvB,OAAO,YAAA,CAAa;AAAA,GACtB;AACA,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,KAAA,CAAM,KAAK,CAAA;AAC5C,EAAA,IAAI,OAAO,iBAAiB,QAAA,EAAU;AACpC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,WAAA,EAAa;AAAA,QACX,GAAG,WAAA;AAAA,QACH,YAAA,EAAc,EAAE,GAAG,YAAA,EAAc,OAAO,2BAAA;AAA4B;AACtE,KACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa;AAAA,MACX,GAAG,WAAA;AAAA,MACH,eAAe,UAAA,GAAa,YAAA;AAAA,MAC5B,UAAU,YAAA,CAAa,QAAA;AAAA,MACvB,YAAA,EAAc,EAAE,GAAG,YAAA;AAAa;AAClC,GACF;AACF;;;ACvOO,SAAS,mBAAA,CAAoB,MAAe,OAAA,EAA+B;AAChF,EAAA,MAAM,kBAAA,GAAqB,sBAAsB,IAAI,CAAA;AACrD,EAAA,IAAI,CAAC,kBAAA,IAAsB,CAAC,KAAK,SAAA,IAAa,CAAC,KAAK,OAAA,EAAS;AAC3D,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,aAAa,IAAA,CAAK,OAAA,CAAQ,SAAQ,GAAI,IAAA,CAAK,UAAU,OAAA,EAAQ;AACnE,EAAA,OAAA,CAAQ,IAAA,CAAK,oBAAoB,UAAA,EAAY;AAAA,IAC3C,MAAA,EAAQ,IAAA,CAAK,SAAA,GAAY,OAAA,GAAU;AAAA,GACpC,CAAA;AACH;AAGO,SAAS,gBAAA,CAAiB,MAAe,OAAA,EAA+B;AAC7E,EAAA,IAAI,IAAA,CAAK,IAAA,KAASH,sBAAAA,CAAS,gBAAA,EAAkB;AAC3C,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,QAAQ,IAAA,CAAK,UAAA;AACnB,EAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,IAAA;AAAA,EACF;AAEA,EAAA,gBAAA,CAAiB,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,OAAO,CAAA;AAC9C;AAWO,SAAS,wBAAA,CACd,KAAA,EACA,QAAA,EACA,KAAA,EACA,OAAA,EACM;AACN,EAAA,gBAAA,CAAiB,EAAE,QAAA,EAAU,KAAA,EAAM,EAAgC,OAAO,OAAO,CAAA;AACnF;AAGO,SAAS,wBAAA,CAAyB,MAAe,OAAA,EAA+B;AACrF,EAAA,mBAAA,CAAoB,MAAM,OAAO,CAAA;AACjC,EAAA,gBAAA,CAAiB,MAAM,OAAO,CAAA;AAChC;AAEA,SAAS,gBAAA,CACP,KAAA,EACA,KAAA,EACA,OAAA,EACM;AACN,EAAA,IAAI,WAAA,uBAAkB,GAAA,EAA+B;AACrD,EAAA,MAAM,mBAAA,GAAsB,sBAAA,CAAuB,KAAA,EAAO,KAAK,CAAA;AAC/D,EAAA,IAAI,mBAAA,EAAqB;AACvB,IAAA,WAAA,GAAc,mBAAA;AAAA,EAChB,CAAA,MAAO;AACL,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,KAAA,CAAM,QAAA;AACvB,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,aAAA,IAAiB,KAAA,CAAM,KAAA;AAE3C,MAAA,IAAI,YAAY,KAAA,EAAO;AACrB,QAAA,WAAA,GAAc,aAAA,CAAc;AAAA,UAC1B,QAAA;AAAA,UACA,KAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,WAAA,uBAAkB,GAAA,EAAI;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,EAAoB,KAAA,KAAkB;AAClD,IAAA,MAAM,WAAA,GAAc,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AACxC,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,KAAK,CAAA;AACxB,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,KAAK,IAAA,EAAM,KAAA,EAAO,MAAA,EAAW,EAAE,aAAa,CAAA;AAAA,EACtD,CAAA;AAEA,EAAA,KAAA,MAAW,MAAA,IAAU,qBAAA,CAAsB,KAAK,CAAA,EAAG;AACjD,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,KAAK,CAAA;AAAA,EAChC;AACF;AAEA,SAAS,sBAAA,CACP,OACA,KAAA,EAC4C;AAC5C,EAAA,MAAM,cAAc,KAAA,CAAM,WAAA;AAC1B,EAAA,IAAI,OAAO,WAAA,EAAa,aAAA,KAAkB,QAAA,EAAU;AAClD,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,gBAAgB,KAAA,CAAM,WAAA,KAAgB,MAAA,GAAY,YAAA,CAAa,cAAc,YAAA,CAAa,YAAA;AAChG,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,QAAA,IAAY,KAAA,CAAM,QAAA;AAC/C,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,KAAA,IAAS,KAAA,CAAM,iBAAiB,KAAA,CAAM,KAAA;AAChE,EAAA,MAAM,QAAA,uBAAe,GAAA,EAA+B;AAEpD,EAAA,KAAA,MAAW,MAAA,IAAU,qBAAA,CAAsB,KAAK,CAAA,EAAG;AACjD,IAAA,QAAA,CAAS,GAAA,CAAI,OAAO,IAAA,EAAM;AAAA,MACxB,QAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,QAAA,CAAS,IAAI,aAAA,EAAe;AAAA,IAC1B,GAAG,WAAA;AAAA,IACH,QAAA;AAAA,IACA,KAAA;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,GAAG,WAAA,CAAY,YAAA;AAAA,MACf,UAAA,EAAY;AAAA;AACd,GACD,CAAA;AAED,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,sBAAsB,IAAA,EAA8B;AAC3D,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAKA,sBAAAA,CAAS,SAAA;AACZ,MAAA,OAAO,0BAAA;AAAA,IACT,KAAKA,sBAAAA,CAAS,SAAA;AAAA,IACd,KAAKA,sBAAAA,CAAS,aAAA;AACZ,MAAA,OAAO,yBAAA;AAAA,IACT,KAAKA,sBAAAA,CAAS,gBAAA;AAKZ,MAAA,OAAO,IAAA;AAAA,IACT,KAAKA,sBAAAA,CAAS,YAAA;AACZ,MAAA,OAAO,6BAAA;AAAA,IACT,KAAKA,sBAAAA,CAAS,gBAAA;AACZ,MAAA,OAAO,0BAAA;AAAA,IACT,KAAKA,sBAAAA,CAAS,aAAA;AACZ,MAAA,OAAO,8BAAA;AAAA,IACT;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;ACzJA,IAAM,UAAA,GAAa,iEAAA;AAEZ,IAAM,oBAAN,MAAwB;AAAA,EACrB,aAAA;AAAA,EACA,UAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMR,YAAY,MAAA,EAA4B;AACtC,IAAA,MAAM,OAAA,GAAU,MAAA,EAAQ,aAAA,IAAiB,CAAC,GAAGM,oCAAsB,CAAA;AACnE,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,EAAa,CAAC,CAAA;AAC9D,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,IAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAa,MAAA,EAAwD;AACnE,IAAA,MAAM,WAAmC,EAAC;AAE1C,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,MAAA,IAAI,KAAK,aAAA,CAAc,GAAA,CAAI,GAAA,CAAI,WAAA,EAAa,CAAA,EAAG;AAC7C,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,IAAA,CAAK,UAAA,IAAc,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA,EAAG;AAC7C,QAAA;AAAA,MACF;AAEA,MAAA,QAAA,CAAS,GAAG,CAAA,GAAI,KAAA;AAAA,IAClB;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AACF;;;ACdA,SAAS,aAAa,GAAA,EAAiC;AACrD,EAAA,OAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,QAAQ,aAAA,IAAiB,GAAA;AACrE;AAcA,SAAS,UAAU,KAAA,EAAiC;AAClD,EAAA,OAAO,KAAA,IAAS,IAAA;AAClB;AAsBO,SAAS,mBAAA,CAAoB,OAA4B,gBAAA,EAAiD;AAC/G,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,eAAkC,EAAC;AACzC,EAAA,MAAM,gBAAoC,EAAC;AAE3C,EAAA,IAAI,cAAc,KAAA,CAAM,WAAA;AACxB,EAAA,MAAM,eAAe,KAAA,CAAM,YAAA;AAM3B,EAAA,MAAM,eAAgB,KAAA,CAAyD,iBAAA;AAE/E,EAAA,IAAI,SAAA,CAAU,YAAA,EAAc,eAAe,CAAA,EAAG;AAC5C,IAAA,YAAA,CAAa,YAAY,YAAA,CAAa,eAAA;AAAA,EACxC;AACA,EAAA,IAAI,SAAA,CAAU,YAAA,EAAc,gBAAgB,CAAA,EAAG;AAC7C,IAAA,YAAA,CAAa,aAAa,YAAA,CAAa,gBAAA;AAAA,EACzC;AAGA,EAAA,IAAI,CAAC,UAAU,YAAA,CAAa,SAAS,KAAK,SAAA,CAAU,KAAA,CAAM,iBAAiB,CAAA,EAAG;AAC5E,IAAA,YAAA,CAAa,YAAY,KAAA,CAAM,iBAAA;AAAA,EACjC;AACA,EAAA,IAAI,CAAC,UAAU,YAAA,CAAa,UAAU,KAAK,SAAA,CAAU,KAAA,CAAM,wBAAwB,CAAA,EAAG;AACpF,IAAA,YAAA,CAAa,aAAa,KAAA,CAAM,wBAAA;AAAA,EAClC;AAGA,EAAA,IAAI,SAAA,CAAU,KAAA,CAAM,eAAe,CAAA,EAAG;AACpC,IAAA,aAAA,CAAc,YAAY,KAAA,CAAM,eAAA;AAAA,EAClC;AAKA,EAAA,MAAM,YAAY,gBAAA,EAAkB,SAAA;AAEpC,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAM,kBAAkB,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA,CAAM,IAAI,WAAA,GAAc,MAAA;AAC1E,IAAA,MAAM,iBAAA,GACJ,iBAAiB,KAAA,KAAU,MAAA,KAC1B,gBAAgB,SAAA,KAAc,MAAA,IAAa,gBAAgB,UAAA,KAAe,MAAA,CAAA;AAE7E,IAAA,IAAI,CAAC,UAAU,YAAA,CAAa,SAAS,KAAK,SAAA,CAAU,SAAA,CAAU,oBAAoB,CAAA,EAAG;AACnF,MAAA,YAAA,CAAa,YAAY,SAAA,CAAU,oBAAA;AAAA,IACrC;AACA,IAAA,IAAI,CAAC,UAAU,YAAA,CAAa,UAAU,KAAK,SAAA,CAAU,SAAA,CAAU,wBAAwB,CAAA,EAAG;AACxF,MAAA,YAAA,CAAa,aAAa,SAAA,CAAU,wBAAA;AAAA,IACtC;AAGA,IAAA,MAAM,yBAAA,GACJ,iBAAA,IACC,SAAA,CAAU,KAAA,CAAM,iBAAiB,CAAA,IAAK,KAAA,CAAM,iBAAA,GAAoB,CAAA,IAChE,SAAA,CAAU,KAAA,CAAM,wBAAwB,CAAA,IAAK,MAAM,wBAAA,GAA2B,CAAA;AAEjF,IAAA,IAAI,CAAC,8BAA8B,SAAA,CAAU,YAAA,CAAa,SAAS,CAAA,IAAK,SAAA,CAAU,YAAA,CAAa,UAAU,CAAA,CAAA,EAAI;AAC3G,MAAA,WAAA,GAAA,CAAe,MAAM,WAAA,IAAe,CAAA,KAAM,aAAa,SAAA,IAAa,CAAA,CAAA,IAAM,aAAa,UAAA,IAAc,CAAA,CAAA;AAAA,IACvG;AAAA,EACF;AAIA,EAAA,MAAM,SAAS,gBAAA,EAAkB,MAAA;AAEjC,EAAA,IAAI,QAAQ,aAAA,EAAe;AACzB,IAAA,IAAI,CAAC,UAAU,YAAA,CAAa,SAAS,KAAK,SAAA,CAAU,MAAA,CAAO,aAAA,CAAc,uBAAuB,CAAA,EAAG;AACjG,MAAA,YAAA,CAAa,SAAA,GAAY,OAAO,aAAA,CAAc,uBAAA;AAAA,IAChD;AAEA,IAAA,IAAI,SAAA,CAAU,MAAA,CAAO,aAAA,CAAc,kBAAkB,CAAA,EAAG;AACtD,MAAA,aAAA,CAAc,SAAA,GAAY,OAAO,aAAA,CAAc,kBAAA;AAAA,IACjD;AAAA,EACF;AAEA,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,YAAA,CAAa,OAAO,IAAA,CAAK,GAAA;AAAA,MACvB,CAAA;AAAA,MACA,WAAA,GAAc,iBAAiB,YAAA,EAAc,CAAC,aAAa,YAAA,EAAc,OAAA,EAAS,OAAO,CAAC;AAAA,KAC5F;AAAA,EACF;AAEA,EAAA,IAAI,SAAA,CAAU,YAAY,CAAA,EAAG;AAC3B,IAAA,aAAA,CAAc,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,YAAA,GAAe,gBAAA,CAAiB,aAAA,EAAe,CAAC,WAAA,EAAa,OAAA,EAAS,OAAO,CAAC,CAAC,CAAA;AAAA,EAClH;AAGA,EAAA,MAAM,MAAA,GAAqB;AAAA,IACzB,WAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAAE,SAAS,CAAA,EAAG;AACxC,IAAA,MAAA,CAAO,YAAA,GAAe,YAAA;AAAA,EACxB;AACA,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA,CAAE,SAAS,CAAA,EAAG;AACzC,IAAA,MAAA,CAAO,aAAA,GAAgB,aAAA;AAAA,EACzB;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,gBAAA,CAAsD,KAAQ,IAAA,EAAmB;AACxF,EAAA,OAAO,IAAA,CAAK,MAAA,CAAO,CAAC,GAAA,EAAK,GAAA,KAAQ,OAAQ,GAAA,CAAI,GAAG,CAAA,IAA4B,CAAA,CAAA,EAAI,CAAC,CAAA;AACnF;AAEA,SAAS,WAAA,CAAY,GAAuB,CAAA,EAA2C;AACrF,EAAA,IAAI,CAAA,KAAM,MAAA,IAAa,CAAA,KAAM,MAAA,EAAW,OAAO,MAAA;AAC/C,EAAA,OAAA,CAAQ,CAAA,IAAK,MAAM,CAAA,IAAK,CAAA,CAAA;AAC1B;AAEA,SAAS,iBAAA,CACP,GACA,CAAA,EAC+B;AAC/B,EAAA,IAAI,CAAC,CAAA,EAAG,OAAO,IAAI,EAAE,GAAG,GAAE,GAAI,MAAA;AAC9B,EAAA,IAAI,CAAC,CAAA,EAAG,OAAO,EAAE,GAAG,CAAA,EAAE;AACtB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,WAAA,CAAY,CAAA,CAAE,IAAA,EAAM,EAAE,IAAI,CAAA;AAAA,IAChC,SAAA,EAAW,WAAA,CAAY,CAAA,CAAE,SAAA,EAAW,EAAE,SAAS,CAAA;AAAA,IAC/C,UAAA,EAAY,WAAA,CAAY,CAAA,CAAE,UAAA,EAAY,EAAE,UAAU,CAAA;AAAA,IAClD,KAAA,EAAO,WAAA,CAAY,CAAA,CAAE,KAAA,EAAO,EAAE,KAAK,CAAA;AAAA,IACnC,KAAA,EAAO,WAAA,CAAY,CAAA,CAAE,KAAA,EAAO,EAAE,KAAK;AAAA,GACrC;AACF;AAEA,SAAS,kBAAA,CACP,GACA,CAAA,EACgC;AAChC,EAAA,IAAI,CAAC,CAAA,EAAG,OAAO,IAAI,EAAE,GAAG,GAAE,GAAI,MAAA;AAC9B,EAAA,IAAI,CAAC,CAAA,EAAG,OAAO,EAAE,GAAG,CAAA,EAAE;AACtB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,WAAA,CAAY,CAAA,CAAE,IAAA,EAAM,EAAE,IAAI,CAAA;AAAA,IAChC,SAAA,EAAW,WAAA,CAAY,CAAA,CAAE,SAAA,EAAW,EAAE,SAAS,CAAA;AAAA,IAC/C,KAAA,EAAO,WAAA,CAAY,CAAA,CAAE,KAAA,EAAO,EAAE,KAAK,CAAA;AAAA,IACnC,KAAA,EAAO,WAAA,CAAY,CAAA,CAAE,KAAA,EAAO,EAAE,KAAK;AAAA,GACrC;AACF;AAQO,SAAS,aAAA,CAAc,GAA2B,CAAA,EAA2B;AAClF,EAAA,IAAI,CAAC,CAAA,EAAG;AACN,IAAA,OAAO;AAAA,MACL,GAAG,CAAA;AAAA,MACH,cAAc,CAAA,CAAE,YAAA,GAAe,EAAE,GAAG,CAAA,CAAE,cAAa,GAAI,MAAA;AAAA,MACvD,eAAe,CAAA,CAAE,aAAA,GAAgB,EAAE,GAAG,CAAA,CAAE,eAAc,GAAI;AAAA,KAC5D;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,WAAA,CAAY,CAAA,CAAE,WAAA,EAAa,EAAE,WAAW,CAAA;AAAA,IACrD,YAAA,EAAc,WAAA,CAAY,CAAA,CAAE,YAAA,EAAc,EAAE,YAAY,CAAA;AAAA,IACxD,YAAA,EAAc,iBAAA,CAAkB,CAAA,CAAE,YAAA,EAAc,EAAE,YAAY,CAAA;AAAA,IAC9D,aAAA,EAAe,kBAAA,CAAmB,CAAA,CAAE,aAAA,EAAe,EAAE,aAAa;AAAA,GACpE;AACF;;;AC9MA,SAAS,sBAAA,GAAkC;AACzC,EAAA,OAAOC,qBAAA,CAAa,IAAI,sBAAsB,CAAA;AAChD;AAMA,SAAS,kBAAA,CAAmB,OAAgB,QAAA,EAA0B;AACpE,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,MAAA,GAAS,IAAI,KAAA,GAAQ,QAAA;AACjE;AAEA,SAAS,cAAc,IAAA,EAAuB;AAC5C,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAA,IAAU,IAAA,IAAQ,OAAO,IAAA,CAAK,SAAS,QAAA,EAAU;AACnD,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EACd;AAEA,EAAA,IAAI,WAAW,IAAA,IAAQ,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG;AAChD,IAAA,OAAO,IAAA,CAAK,MAAM,GAAA,CAAI,aAAa,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAAA,EAC9D;AAEA,EAAA,IAAI,gBAAgB,IAAA,IAAQ,IAAA,CAAK,cAAc,OAAO,IAAA,CAAK,eAAe,QAAA,EAAU;AAClF,IAAA,OAAO,IAAI,kBAAA,CAAoB,IAAA,CAAK,UAAA,CAAsC,QAAA,EAAU,QAAQ,CAAC,CAAA,CAAA,CAAA;AAAA,EAC/F;AAEA,EAAA,IAAI,eAAe,IAAA,EAAM;AACvB,IAAA,OAAO,SAAA;AAAA,EACT;AAEA,EAAA,IAAI,kBAAkB,IAAA,IAAQ,IAAA,CAAK,gBAAgB,OAAO,IAAA,CAAK,iBAAiB,QAAA,EAAU;AACxF,IAAA,OAAO,UAAU,kBAAA,CAAoB,IAAA,CAAK,YAAA,CAAoC,IAAA,EAAM,SAAS,CAAC,CAAA,CAAA,CAAA;AAAA,EAChG;AAEA,EAAA,IAAI,mBAAmB,IAAA,IAAQ,IAAA,CAAK,iBAAiB,OAAO,IAAA,CAAK,kBAAkB,QAAA,EAAU;AAC3F,IAAA,OAAO,UAAU,kBAAA,CAAoB,IAAA,CAAK,aAAA,CAAqC,IAAA,EAAM,SAAS,CAAC,CAAA,CAAA,CAAA;AAAA,EACjG;AAEA,EAAA,IAAI,cAAc,IAAA,IAAQ,IAAA,CAAK,YAAY,OAAO,IAAA,CAAK,aAAa,QAAA,EAAU;AAC5E,IAAA,OAAO,UAAU,kBAAA,CAAoB,IAAA,CAAK,QAAA,CAAgC,IAAA,EAAM,SAAS,CAAC,CAAA,CAAA,CAAA;AAAA,EAC5F;AAEA,EAAA,IAAI,cAAc,IAAA,EAAM;AACtB,IAAA,OAAO,CAAA,OAAA,EAAU,kBAAA,CAAoB,IAAA,CAAgC,QAAA,EAAU,SAAS,CAAC,CAAA,CAAA,CAAA;AAAA,EAC3F;AAEA,EAAA,IAAI,MAAA,IAAU,IAAA,IAAQ,OAAO,IAAA,CAAK,SAAS,QAAA,EAAU;AACnD,IAAA,QAAQ,KAAK,IAAA;AAAM,MACjB,KAAK,OAAA;AACH,QAAA,OAAO,SAAA;AAAA,MACT,KAAK,MAAA;AACH,QAAA,OAAO,QAAA;AAAA,MACT,KAAK,WAAA;AACH,QAAA,OAAO,aAAA;AAAA,MACT,KAAK,WAAA;AACH,QAAA,OAAO,CAAA,OAAA,EAAU,kBAAA,CAAoB,IAAA,CAAgC,QAAA,EAAU,SAAS,CAAC,CAAA,CAAA,CAAA;AAAA,MAC3F,KAAK,aAAA;AACH,QAAA,OAAO,eAAA;AAAA,MACT;AACE,QAAA,OAAO,CAAA,CAAA,EAAI,KAAK,IAAI,CAAA,CAAA,CAAA;AAAA;AACxB,EACF;AAEA,EAAA,IAAI,SAAA,IAAa,IAAA,IAAQ,OAAO,IAAA,CAAK,YAAY,QAAA,EAAU;AACzD,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAEA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,wBAAwB,OAAA,EAA0B;AACzD,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,IAAA,OAAO,OAAA,CAAQ,IAAI,aAAa,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,KAAK,EAAE,CAAA;AAAA,EAC3D;AAEA,EAAA,IAAI,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AAC1C,IAAA,IAAI,WAAW,OAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,EAAG;AACtD,MAAA,OAAO,OAAA,CAAQ,MAAM,GAAA,CAAI,aAAa,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAAA,IACjE;AAEA,IAAA,OAAO,cAAc,OAAO,CAAA;AAAA,EAC9B;AAEA,EAAA,IAAI,WAAW,IAAA,EAAM;AACnB,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,OAAO,OAAO,OAAO,CAAA;AACvB;AAEA,SAAS,iBAAA,CAAkB,SAAiB,SAAA,EAA4B;AACtE,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,IAAK,SAAA,CAAU,WAAW,CAAA,EAAG;AACvD,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAc,SAAA,CACjB,GAAA,CAAI,CAAA,QAAA,KAAY,aAAA,CAAc,QAAQ,CAAC,CAAA,CACvC,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,GAAG,CAAA;AAEX,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,OAAO,OAAA,GAAU,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,GAAK,WAAA;AACjD;AAEA,SAAS,aAAA,CAAc,SAAiB,QAAA,EAA0B;AAChE,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,OAAO,OAAA,GAAU,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,GAAK,QAAA;AAC9C;AAEA,SAAS,kBAAkB,QAAA,EAA+D;AACxF,EAAA,OAAO,QAAA,CAAS,IAAI,CAAA,OAAA,KAAW;AAC7B,IAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AAC3C,MAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,uBAAA,CAAwB,OAAO,CAAA,EAAE;AAAA,IACnE;AAEA,IAAA,MAAM,OAAO,OAAQ,OAAA,CAA+B,IAAA,KAAS,QAAA,GAAY,QAA6B,IAAA,GAAO,MAAA;AAE7G,IAAA,MAAM,WAAA,GAAc,uBAAA,CAAyB,OAAA,CAAkC,OAAO,CAAA;AACtF,IAAA,MAAM,qBAAA,GAAwB,iBAAA;AAAA,MAC5B,iBAAA,CAAkB,WAAA,EAAc,OAAA,CAAoC,SAAS,CAAA;AAAA,MAC5E,OAAA,CAAqC;AAAA,KACxC;AACA,IAAA,MAAM,eAAgB,OAAA,CAAuC,YAAA;AAC7D,IAAA,MAAM,sBAAsB,YAAA,KAAiB,MAAA,GAAY,KAAK,aAAA,CAAc,EAAE,cAAc,CAAA;AAC5F,IAAA,MAAM,wBAAyB,OAAA,CAAwC,aAAA;AACvE,IAAA,MAAM,4BAAA,GACJ,0BAA0B,MAAA,GAAY,EAAA,GAAK,cAAc,EAAE,aAAA,EAAe,uBAAuB,CAAA;AACnG,IAAA,MAAM,uBAAA,GAA0B,aAAA;AAAA,MAC9B,aAAA,CAAc,uBAAuB,mBAAmB,CAAA;AAAA,MACxD;AAAA,KACF;AAEA,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,uBAAA,EAAwB;AAAA,EAClD,CAAC,CAAA;AACH;AAEA,SAAS,qBAAqB,IAAA,EAAiC;AAC7D,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,OAAO,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,GAAO,OAAO,IAAI,CAAA;AAAA,EACtD;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAS,IAAA,CAAgC,QAAQ,CAAA,EAAG;AAC5D,IAAA,OAAO,iBAAA,CAAmB,KAAiC,QAAQ,CAAA;AAAA,EACrE;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAS,IAAA,CAA6B,KAAK,CAAA,EAAG;AACtD,IAAA,OAAO,iBAAA,CAAmB,KAA8B,KAAK,CAAA;AAAA,EAC/D;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAS,IAAA,CAAgC,QAAQ,CAAA,EAAG;AAC5D,IAAA,OAAQ,IAAA,CAAoE,QAAA,CAAS,GAAA,CAAI,CAAA,IAAA,MAAS;AAAA,MAChG,MAAM,OAAO,IAAA,EAAM,IAAA,KAAS,QAAA,GAAW,KAAK,IAAA,GAAO,MAAA;AAAA,MACnD,SAAS,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,KAAK,IAAI,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,aAAa,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,GAAI;AAAA,KACjG,CAAE,CAAA;AAAA,EACJ;AAEA,EAAA,MAAM,UAAmC,EAAC;AAE1C,EAAA,IAAI,OAAQ,IAAA,CAA6B,KAAA,KAAU,QAAA,EAAU;AAC3D,IAAA,OAAA,CAAQ,QAAS,IAAA,CAA2B,KAAA;AAAA,EAC9C;AAEA,EAAA,MAAM,QAAA,GAAW,OAAO,IAAA,CAAK,IAA+B,EAAE,MAAA,CAAO,CAAA,GAAA,KAAO,QAAQ,MAAM,CAAA;AAC1F,EAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,IAAA,OAAA,CAAQ,IAAA,GAAO,QAAA;AAAA,EACjB;AAEA,EAAA,OAAO,OAAO,IAAA,CAAK,OAAO,CAAA,CAAE,MAAA,GAAS,IAAI,OAAA,GAAU,gBAAA;AACrD;AAKA,SAAS,iBAAiB,OAAA,EAA8C;AACtE,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS,aAAa,CAAA,EAAG;AACzC,IAAA,OAAO,iBAAA,CAAkB,QAAQ,aAAa,CAAA;AAAA,EAChD;AAEA,EAAA,MAAM,UAAU,OAAA,EAAS,OAAA;AACzB,EAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AAErB,EAAA,MAAM,EAAE,MAAK,GAAI,OAAA;AACjB,EAAA,IAAI,IAAA,IAAQ,MAAM,OAAO,OAAA;AAEzB,EAAA,IAAI;AACF,IAAA,MAAM,SAAS,OAAO,IAAA,KAAS,WAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAC7D,IAAA,OAAO,qBAAqB,MAAM,CAAA;AAAA,EACpC,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,OAAA;AAAA,EACT;AACF;AAQO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,UAAA;AAAA,EACA,gBAAA;AAAA,EACA,qBAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,eAAoC,EAAC;AAAA,EACrC,UAAA,GAAqB,CAAA;AAAA,EACrB,cAAA,GAAyB,CAAA;AAAA,EACzB,oBAAA;AAAA,EACA,wBAAA,GAAoC,KAAA;AAAA;AAAA,EAEpC,eAAA,GAA2B,KAAA;AAAA;AAAA,EAE3B,yBAAA;AAAA;AAAA,EAEA,iBAAA;AAAA,EAEA,YAAY,SAAA,EAA6C;AACvD,IAAA,IAAA,CAAK,UAAA,GAAa,SAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,oBAAoB,OAAA,EAAsC;AACxD,IAAA,IAAA,CAAK,iBAAA,GAAoB,OAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,2BAAA,GAAoC;AAClC,IAAA,IAAI,KAAK,oBAAA,EAAsB;AAC7B,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,oBAAA,uBAA2B,IAAA,EAAK;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAA,GAAoC;AAClC,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,IAAA,CAAK,gBAAA,IAAoB,IAAA,CAAK;AAAA,KAC7C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,sBAAsB,OAAA,EAA4D;AAChF,IAAA,IAAI,KAAK,qBAAA,EAAuB;AAC9B,MAAA,IAAA,CAAK,qBAAA,CAAsB,MAAM,EAAE,KAAA,EAAO,QAAQ,KAAA,EAAO,OAAA,EAAS,MAAM,CAAA;AACxE,MAAA,IAAA,CAAK,qBAAA,GAAwB,MAAA;AAAA,IAC/B;AACA,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,IAAA,CAAK,gBAAA,CAAiB,MAAM,EAAE,KAAA,EAAO,QAAQ,KAAA,EAAO,OAAA,EAAS,MAAM,CAAA;AACnE,MAAA,IAAA,CAAK,gBAAA,GAAmB,MAAA;AAAA,IAC1B;AACA,IAAA,IAAA,CAAK,UAAA,EAAY,MAAM,OAAO,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc,OAAA,EAAsC;AAClD,IAAA,MAAM,EAAE,KAAA,EAAO,gBAAA,EAAkB,GAAG,WAAA,EAAY,GAAI,WAAW,EAAC;AAEhE,IAAA,IAAI,YAAY,UAAA,EAAY;AAC1B,MAAA,WAAA,CAAY,UAAA,CAAW,sBAAsB,IAAA,CAAK,oBAAA;AAClD,MAAA,WAAA,CAAY,UAAA,CAAW,KAAA,GAAQ,mBAAA,CAAoB,KAAA,EAAO,gBAAgB,CAAA;AAAA,IAC5E;AAEA,IAAA,IAAA,CAAK,UAAA,EAAY,IAAI,WAAW,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,OAAA,EAA6D;AAC5E,IAAA,IAAA,CAAK,UAAA,EAAY,OAAO,OAAO,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkB,KAAA,EAAsB;AACtC,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAA,GAAqF;AACnF,IAAA,OAAO,IAAA,CAAK,kBAAkB,UAAA,EAAW;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,2BAAA,GAAuE;AACrE,IAAA,OAAO,IAAA,CAAK,yBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,KAAA,EAAqB;AAChC,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,UAAU,OAAA,EAAkC;AAE1C,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,iBAAiB,OAAO,CAAA;AACtC,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA,CAAK,UAAA,EAAY,eAAA,CAAgB;AAAA,MACvD,IAAA,EAAM,CAAA,MAAA,EAAS,IAAA,CAAK,UAAU,CAAA,CAAA;AAAA,MAC9B,MAAMP,sBAAAA,CAAS,UAAA;AAAA,MACf,UAAA,EAAY;AAAA,QACV,WAAW,IAAA,CAAK,UAAA;AAAA,QAChB,GAAI,SAAS,SAAA,GAAY,EAAE,WAAW,OAAA,CAAQ,SAAA,KAAc,EAAC;AAAA,QAC7D,GAAI,SAAS,QAAA,EAAU,MAAA,GAAS,EAAE,QAAA,EAAU,OAAA,CAAQ,QAAA,EAAS,GAAI;AAAC,OACpE;AAAA,MACA,KAAA;AAAA,MACA,aAAA,EAAe,KAAK,UAAA,EAAY;AAAA,KACjC,CAAA;AACD,IAAA,IAAA,CAAK,wBAAA,GAA2B,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS,aAAa,CAAA;AAEpE,IAAA,IAAA,CAAK,cAAA,GAAiB,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,kBAA0B,OAAA,EAA+C;AACvE,IAAA,IAAI,CAAC,KAAK,qBAAA,EAAuB;AAEjC,IAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAU,GAAG,WAAA,KAAgB,OAAA,CAAQ,MAAA;AACpD,IAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,QAAA,EAAU,OAAA,CAAQ,UAAU,gBAAgB,CAAA;AAE9E,IAAA,IAAA,CAAK,sBAAsB,GAAA,CAAI;AAAA,MAC7B,MAAA,EAAQ,WAAA;AAAA,MACR,UAAA,EAAY;AAAA,QACV,KAAA;AAAA,QACA,YAAA,EAAc,QAAQ,UAAA,CAAW,MAAA;AAAA,QACjC,QAAA,EAAU,QAAQ,UAAA,CAAW,QAAA;AAAA,QAC7B,qBAAqB,IAAA,CAAK;AAAA;AAC5B,KACD,CAAA;AACD,IAAA,IAAA,CAAK,qBAAA,GAAwB,MAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,eAAe,OAAA,EAAkC;AAC/C,IAAA,IAAI,CAAC,wBAAuB,EAAG;AAC7B,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,IAAoB,IAAA,CAAK,qBAAA,EAAuB;AACxD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,iBAAiB,OAAO,CAAA;AACtC,IAAA,MAAM,eAAA,GAAkB,KAAK,UAAA,EAAY,UAAA;AACzC,IAAA,MAAM,MAAM,IAAA,CAAK,iBAAA;AACjB,IAAA,IAAA,CAAK,qBAAA,GAAwB,IAAA,CAAK,gBAAA,CAAiB,eAAA,CAAgB;AAAA,MACjE,IAAA,EAAM,CAAA,WAAA,EAAc,IAAA,CAAK,UAAU,CAAA,CAAA;AAAA,MACnC,MAAMA,sBAAAA,CAAS,eAAA;AAAA,MACf,UAAA,EAAY;AAAA,QACV,WAAW,IAAA,CAAK,UAAA;AAAA,QAChB,OAAO,eAAA,EAAiB,KAAA;AAAA,QACxB,UAAU,eAAA,EAAiB,QAAA;AAAA,QAC3B,WAAW,eAAA,EAAiB,SAAA;AAAA,QAC5B,GAAI,KAAK,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,EAAY,GAAA,CAAI,UAAA,EAAW,GAAI,EAAC;AAAA,QACtE,GAAI,KAAK,eAAA,KAAoB,MAAA,GAAY,EAAE,eAAA,EAAiB,GAAA,CAAI,eAAA,EAAgB,GAAI,EAAC;AAAA,QACrF,GAAI,KAAK,cAAA,KAAmB,MAAA,GAAY,EAAE,cAAA,EAAgB,GAAA,CAAI,cAAA,EAAe,GAAI,EAAC;AAAA,QAClF,GAAI,KAAK,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,EAAY,GAAA,CAAI,UAAA,EAAW,GAAI,EAAC;AAAA,QACtE,GAAI,KAAK,cAAA,KAAmB,MAAA,GAAY,EAAE,cAAA,EAAgB,GAAA,CAAI,cAAA,EAAe,GAAI;AAAC,OACpF;AAAA,MACA,KAAA;AAAA,MACA,aAAA,EAAe,KAAK,UAAA,EAAY;AAAA,KACjC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,OAAA,EAAkC;AAC3C,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,IAAoB,CAAC,OAAA,EAAS;AACtC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,aAAa,CAAA;AACzD,IAAA,MAAM,QAAQ,aAAA,IAAiB,CAAC,KAAK,wBAAA,GAA2B,gBAAA,CAAiB,OAAO,CAAA,GAAI,MAAA;AAG5F,IAAA,IAAA,CAAK,iBAAiB,MAAA,CAAO;AAAA,MAC3B,GAAI,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,KAAU,EAAC;AAAA,MACvC,UAAA,EAAY;AAAA,QACV,GAAI,QAAQ,SAAA,GAAY,EAAE,WAAW,OAAA,CAAQ,SAAA,KAAc,EAAC;AAAA,QAC5D,GAAI,QAAQ,QAAA,EAAU,MAAA,GAAS,EAAE,QAAA,EAAU,OAAA,CAAQ,QAAA,EAAS,GAAI;AAAC;AACnE,KACD,CAAA;AACD,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,IAAA,CAAK,wBAAA,GAA2B,IAAA;AAAA,IAClC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAqB,OAAA,EAAyC;AAG5D,IAAA,IAAA,CAAK,aAAA,EAAc;AAEnB,IAAA,IAAI,CAAC,KAAK,gBAAA,EAAkB;AAG5B,IAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AACvB,IAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAU,GAAG,aAAY,GAAI,MAAA;AAC5C,IAAA,MAAM,aAAa,OAAA,CAAQ,UAAA;AAC3B,IAAA,MAAM,WAAW,OAAA,CAAQ,QAAA;AAGzB,IAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,QAAA,EAAU,QAAA,EAAU,gBAAgB,CAAA;AAMtE,IAAA,MAAM,aAAA,GAAgB,QAAA,GAAW,EAAE,GAAG,UAAS,GAAI,MAAA;AACnD,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,KAAA,MAAW,GAAA,IAAO,CAAC,SAAA,EAAW,IAAA,EAAM,aAAa,SAAA,EAAW,cAAA,EAAgB,eAAe,CAAA,EAAG;AAC5F,QAAA,OAAO,cAAc,GAAG,CAAA;AAAA,MAC1B;AAAA,IACF;AAKA,IAAA,IAAA,CAAK,kBAAkB,OAAO,CAAA;AAE9B,IAAA,IAAA,CAAK,iBAAiB,GAAA,CAAI;AAAA,MACxB,MAAA,EAAQ,WAAA;AAAA,MACR,UAAA,EAAY;AAAA,QACV,KAAA;AAAA,QACA,aAAa,UAAA,CAAW,WAAA;AAAA,QACxB,cAAc,UAAA,CAAW,MAAA;AAAA,QACzB,UAAU,UAAA,CAAW;AAAA,OACvB;AAAA,MACA,QAAA,EAAU;AAAA,QACR,GAAG;AAAA;AACL,KACD,CAAA;AACD,IAAA,IAAA,CAAK,gBAAA,GAAmB,MAAA;AACxB,IAAA,IAAA,CAAK,wBAAA,GAA2B,KAAA;AAChC,IAAA,IAAA,CAAK,UAAA,EAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAA,GAAuF;AACrF,IAAA,OAAO,IAAA,CAAK,yBAAyB,IAAA,CAAK,gBAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,uBAAA,GAAgC;AAC9B,IAAA,IAAI,CAAC,KAAK,gBAAA,EAAkB;AAC1B,MAAA,IAAA,CAAK,SAAA,EAAU;AAAA,IACjB;AACA,IAAA,IAAI,CAAC,KAAK,qBAAA,EAAuB;AAC/B,MAAA,IAAA,CAAK,cAAA,EAAe;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,CAAgB,WAAmB,WAAA,EAAmC;AAGpE,IAAA,IAAA,CAAK,aAAA,EAAc;AAEnB,IAAA,IAAA,CAAK,uBAAA,EAAwB;AAE7B,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA,CAAK,YAAA,EAAa,EAAG,eAAA,CAAgB;AAAA,MAC5D,IAAA,EAAM,WAAW,SAAS,CAAA,CAAA,CAAA;AAAA,MAC1B,MAAMA,sBAAAA,CAAS,WAAA;AAAA,MACf,UAAA,EAAY;AAAA,QACV,SAAA;AAAA,QACA,gBAAgB,IAAA,CAAK;AAAA,OACvB;AAAA,MACA,aAAA,EAAe,KAAK,UAAA,EAAY;AAAA,KACjC,CAAA;AACD,IAAA,IAAA,CAAK,iBAAA,GAAoB,SAAA;AACzB,IAAA,IAAA,CAAK,YAAA,GAAe,eAAe,EAAC;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAA,CAAqB,OAAe,IAAA,EAAc;AAChD,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA,KAAM,MAAA,EAAW;AAC1C,MAAA,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA,GAAI,IAAA;AAAA,IAC7B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA,IAAK,IAAA;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc,MAAA,EAAc;AAC1B,IAAA,IAAI,CAAC,KAAK,iBAAA,EAAmB;AAE7B,IAAA,IAAA,CAAK,kBAAkB,GAAA,CAAI;AAAA,MACzB,MAAA,EAAQ,MAAA,KAAW,MAAA,GAAY,MAAA,GAAS,IAAA,CAAK;AAAA,KAC9C,CAAA;AACD,IAAA,IAAA,CAAK,iBAAA,GAAoB,MAAA;AACzB,IAAA,IAAA,CAAK,iBAAA,GAAoB,MAAA;AACzB,IAAA,IAAA,CAAK,eAAe,EAAC;AACrB,IAAA,IAAA,CAAK,cAAA,EAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,CACE,SAAA,EACA,MAAA,EACA,OAAA,EACA;AACA,IAAA,IAAA,CAAK,uBAAA,EAAwB;AAE7B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,EAAa,EAAG,eAAA,CAAgB;AAAA,MAChD,IAAA,EAAM,WAAW,SAAS,CAAA,CAAA,CAAA;AAAA,MAC1B,MAAMA,sBAAAA,CAAS,WAAA;AAAA,MACf,UAAA,EAAY;AAAA,QACV,SAAA;AAAA,QACA,gBAAgB,IAAA,CAAK,cAAA;AAAA,QACrB,GAAG,OAAA,EAAS;AAAA,OACd;AAAA,MACA,UAAU,OAAA,EAAS,QAAA;AAAA,MACnB,MAAA;AAAA,MACA,aAAA,EAAe,KAAK,UAAA,EAAY;AAAA,KACjC,CAAA;AAED,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAA,CAAK,cAAA,EAAA;AAAA,IACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAA,GAA+B;AAC7B,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,iBAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAAuC;AACrC,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAyB,KAAA,EAA0B;AACjD,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAK,YAAA;AACH,QAAA,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAC3B,QAAA;AAAA,MAEF,KAAK,YAAA;AAIH,QAAA,IAAI,IAAA,CAAK,sBAAsB,MAAA,EAAQ;AACrC,UAAA,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAAA,QAC7B;AACA,QAAA,IAAA,CAAK,oBAAA,CAAqB,MAAA,EAAQ,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA;AACpD,QAAA;AAAA,MAEF,KAAK,UAAA,EAAY;AACf,QAAA,IAAA,CAAK,aAAA,EAAc;AACnB,QAAA;AAAA,MACF;AAAA;AACF,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,sBAA8B,KAAA,EAA0B;AACtD,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAK,iBAAA;AACH,QAAA,IAAA,CAAK,gBAAgB,WAAW,CAAA;AAChC,QAAA;AAAA,MAEF,KAAK,iBAAA;AAIH,QAAA,IAAI,IAAA,CAAK,sBAAsB,WAAA,EAAa;AAC1C,UAAA,IAAA,CAAK,gBAAgB,WAAW,CAAA;AAAA,QAClC;AACA,QAAA,IAAA,CAAK,oBAAA,CAAqB,MAAA,EAAQ,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA;AACpD,QAAA;AAAA,MAEF,KAAK,eAAA,EAAiB;AACpB,QAAA,IAAA,CAAK,aAAA,EAAc;AACnB,QAAA;AAAA,MACF;AAAA;AACF,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,qBAA6B,KAAA,EAA0B;AACrD,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAK,iCAAA;AACH,QAAA,IAAA,CAAK,gBAAgB,WAAA,EAAa;AAAA,UAChC,QAAA,EAAU,MAAM,OAAA,CAAQ,QAAA;AAAA,UACxB,UAAA,EAAY,MAAM,OAAA,CAAQ;AAAA,SAC3B,CAAA;AACD,QAAA;AAAA,MAEF,KAAK,iBAAA;AACH,QAAA,IAAA,CAAK,oBAAA,CAAqB,WAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,aAAa,CAAA;AAClE,QAAA;AAAA,MAEF,KAAK,+BAAA;AAAA,MACL,KAAK,WAAA,EAAa;AAEhB,QAAA,MAAM,GAAA,GAAM,KAAK,eAAA,EAAgB;AACjC,QAAA,IAAI,SAAA;AACJ,QAAA,IAAI;AACF,UAAA,SAAA,GAAY,IAAI,SAAA,GAAY,IAAA,CAAK,MAAM,GAAA,CAAI,SAAS,IAAI,EAAC;AAAA,QAC3D,CAAA,CAAA,MAAQ;AACN,UAAA,SAAA,GAAY,GAAA,CAAI,SAAA;AAAA,QAClB;AACA,QAAA,IAAA,CAAK,aAAA,CAAc;AAAA,UACjB,UAAU,GAAA,CAAI,QAAA;AAAA,UACd,YAAY,GAAA,CAAI,UAAA;AAAA,UAChB;AAAA,SACD,CAAA;AACD,QAAA;AAAA,MACF;AAAA;AACF,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,mBAA2B,KAAA,EAA0B;AACnD,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAK,QAAA;AAIH,QAAA,IAAI,IAAA,CAAK,sBAAsB,QAAA,EAAU;AACvC,UAAA,IAAA,CAAK,gBAAgB,QAAQ,CAAA;AAAA,QAC/B;AACA,QAAA;AAAA,MAEF,KAAK,eAAA;AAEH,QAAA,IAAA,CAAK,aAAA,CAAc,MAAM,MAAM,CAAA;AAC/B,QAAA;AAAA;AACJ,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,yBAAiC,KAAA,EAA0B;AACzD,IAAA,IAAI,KAAA,CAAM,SAAS,oBAAA,EAAsB;AACzC,IAAA,MAAM,UAAU,KAAA,CAAM,OAAA;AAEtB,IAAA,IAAA,CAAK,uBAAA,EAAwB;AAI7B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,EAAa,EAAG,eAAA,CAAgB;AAAA,MAChD,IAAA,EAAM,CAAA,2BAAA,CAAA;AAAA,MACN,MAAMA,sBAAAA,CAAS,WAAA;AAAA,MACf,UAAA,EAAY;AAAA,QACV,SAAA,EAAW,oBAAA;AAAA,QACX,gBAAgB,IAAA,CAAK;AAAA,OACvB;AAAA,MACA,MAAA,EAAQ,OAAA;AAAA,MACR,aAAA,EAAe,KAAK,UAAA,EAAY;AAAA,KACjC,CAAA;AAED,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAA,CAAK,cAAA,EAAA;AAAA,IACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAgD,MAAA,EAAc;AAC5D,IAAA,OAAO,MAAA,CAAO,WAAA;AAAA,MACZ,IAAIQ,mBAAA,CAAgB;AAAA,QAClB,SAAA,EAAW,CAAC,KAAA,EAAO,UAAA,KAAe;AAEhC,UAAA,QAAQ,MAAM,IAAA;AAAM,YAClB,KAAK,YAAA;AAAA,YACL,KAAK,iBAAA;AAAA,YACL,KAAK,iBAAA;AACH,cAAA,IAAA,CAAK,2BAAA,EAA4B;AACjC,cAAA;AAAA;AAGJ,UAAA,UAAA,CAAW,QAAQ,KAAK,CAAA;AAGxB,UAAA,QAAQ,MAAM,IAAA;AAAM,YAClB,KAAK,YAAA;AAAA,YACL,KAAK,YAAA;AAAA,YACL,KAAK,UAAA;AACH,cAAA,IAAA,CAAK,iBAAiB,KAAK,CAAA;AAC3B,cAAA;AAAA,YAEF,KAAK,iCAAA;AAAA,YACL,KAAK,iBAAA;AAAA,YACL,KAAK,+BAAA;AAAA,YACL,KAAK,WAAA;AACH,cAAA,IAAA,CAAK,qBAAqB,KAAK,CAAA;AAC/B,cAAA;AAAA,YAEF,KAAK,iBAAA;AAAA,YACL,KAAK,iBAAA;AAAA,YACL,KAAK,eAAA;AACH,cAAA,IAAA,CAAK,sBAAsB,KAAK,CAAA;AAChC,cAAA;AAAA,YAEF,KAAK,QAAA;AAAA,YACL,KAAK,eAAA;AACH,cAAA,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAC7B,cAAA;AAAA,YAEF,KAAK,YAAA;AAGH,cAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,gBAAA,IAAA,CAAK,UAAA,CAAW,MAAM,OAAO,CAAA;AAAA,cAC/B,CAAA,MAAO;AACL,gBAAA,IAAA,CAAK,SAAA,CAAU,MAAM,OAAO,CAAA;AAAA,cAC9B;AAKA,cAAA,IAAI,CAAC,KAAK,qBAAA,EAAuB;AAC/B,gBAAA,IAAA,CAAK,cAAA,CAAe,MAAM,OAAO,CAAA;AAAA,cACnC;AACA,cAAA;AAAA,YAEF,KAAK,aAAA;AACH,cAAA,IAAI,KAAK,eAAA,EAAiB;AAKxB,gBAAA,IAAA,CAAK,4BAA4B,KAAA,CAAM,OAAA;AACvC,gBAAA,IAAA,CAAK,aAAA,EAAc;AACnB,gBAAA,IAAA,CAAK,iBAAA,CAAkB,MAAM,OAAO,CAAA;AAAA,cACtC,CAAA,MAAO;AAEL,gBAAA,IAAA,CAAK,YAAA,CAAa,MAAM,OAAO,CAAA;AAAA,cACjC;AACA,cAAA;AAAA;AAAA;AAAA,YAIF,KAAK,KAAA;AAAA;AAAA,YACL,KAAK,OAAA;AAAA;AAAA,YACL,KAAK,QAAA;AAAA;AAAA,YACL,KAAK,mBAAA;AAAA;AAAA,YACL,KAAK,QAAA;AAAA;AAAA,YACL,KAAK,MAAA;AAAA;AAAA,YACL,KAAK,OAAA;AAAA;AAAA,YACL,KAAK,OAAA;AAAA;AAAA,YACL,KAAK,UAAA;AAAA;AAAA,YACL,KAAK,OAAA;AAAA;AAAA,YACL,KAAK,YAAA;AAAA;AAAA,YACL,KAAK,qBAAA;AAAA;AAAA,YACL,KAAK,qBAAA;AAAA;AAAA,YACL,KAAK,oBAAA;AAAA;AAAA,YACL,KAAK,aAAA;AAEH,cAAA;AAAA,YAEF,KAAK,oBAAA;AACH,cAAA,IAAA,CAAK,yBAAyB,KAAK,CAAA;AACnC,cAAA;AAAA,YAEF,KAAK,aAAA;AAGH,cAAA;AAAA,YAEF,KAAK,aAAA,EAAe;AAGlB,cAAA,MAAM;AAAA;AAAA,gBAEJ,UAAA;AAAA,gBACA,QAAA;AAAA,gBACA,OAAA;AAAA,gBACA,OAAA;AAAA,gBACA,gBAAA;AAAA,gBACA,gBAAA;AAAA;AAAA;AAAA;AAAA,gBAIA,MAGF,CAAA,GAAK,KAAA,CAAM,OAAA,IAAmC,EAAC;AAG/C,cAAA,MAAM,QAAA,GAAgC,EAAE,UAAA,EAAY,QAAA,EAAS;AAC7D,cAAA,IAAI,OAAA,KAAY,MAAA,EAAW,QAAA,CAAS,OAAA,GAAU,OAAA;AAC9C,cAAA,IAAI,OAAA,KAAY,MAAA,EAAW,QAAA,CAAS,OAAA,GAAU,OAAA;AAC9C,cAAA,IAAI,gBAAA,KAAqB,MAAA,EAAW,QAAA,CAAS,gBAAA,GAAmB,gBAAA;AAChE,cAAA,IAAI,gBAAA,KAAqB,MAAA,EAAW,QAAA,CAAS,gBAAA,GAAmB,gBAAA;AAEhE,cAAA,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAA,EAAM,gBAAA,GAAmB,SAAS,MAAA,EAAW,EAAE,UAAU,CAAA;AACrF,cAAA;AAAA,YACF;AAOE;AACJ,QACF;AAAA,OACD;AAAA,KACH;AAAA,EACF;AACF;;;ACx6BA,SAAS,cAAA,CAAe,UAAoB,KAAA,EAAgC;AAC1E,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAUC,2BAAA,CAAc,IAAA,EAAM;AACvD,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,QAAQ,QAAA;AAAU;AAAA,IAEhB,KAAKT,sBAAAA,CAAS,YAAA;AAAA,IACd,KAAKA,sBAAAA,CAAS,aAAA;AAAA,IACd,KAAKA,sBAAAA,CAAS,oBAAA;AAAA,IACd,KAAKA,sBAAAA,CAAS,yBAAA;AAAA,IACd,KAAKA,sBAAAA,CAAS,iBAAA;AAAA,IACd,KAAKA,sBAAAA,CAAS,aAAA;AAAA,IACd,KAAKA,sBAAAA,CAAS,cAAA;AAAA,IACd,KAAKA,sBAAAA,CAAS,mBAAA;AACZ,MAAA,OAAA,CAAQ,KAAA,GAAQS,4BAAc,QAAA,MAAc,CAAA;AAAA;AAAA,IAG9C,KAAKT,sBAAAA,CAAS,SAAA;AACZ,MAAA,OAAA,CAAQ,KAAA,GAAQS,4BAAc,KAAA,MAAW,CAAA;AAAA;AAAA,IAG3C,KAAKT,sBAAAA,CAAS,SAAA;AAAA,IACd,KAAKA,sBAAAA,CAAS,aAAA;AACZ,MAAA,OAAA,CAAQ,KAAA,GAAQS,4BAAc,IAAA,MAAU,CAAA;AAAA;AAAA,IAG1C,KAAKT,sBAAAA,CAAS,gBAAA;AAAA,IACd,KAAKA,sBAAAA,CAAS,UAAA;AAAA,IACd,KAAKA,sBAAAA,CAAS,eAAA;AAAA,IACd,KAAKA,sBAAAA,CAAS,WAAA;AACZ,MAAA,OAAA,CAAQ,KAAA,GAAQS,4BAAc,KAAA,MAAW,CAAA;AAAA;AAAA,IAG3C;AACE,MAAA,OAAO,KAAA;AAAA;AAEb;AA6BO,SAAS,oBAAoB,OAAA,EAAqD;AACvF,EAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAA,CAAQ,OAAO,UAAA,EAAY;AAE7B,IAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,eAAA,CAAgB,KAAK,CAAA;AAAA,EAC7C,CAAA,MAAO;AAEL,IAAA,OAAO,QAAQ,MAAA,CAAO,EAAA;AAAA,EACxB;AACF;AAEO,IAAe,WAAf,MAA6E;AAAA,EAI3E,IAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,qBAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EASA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA;AAAA,EAEA,UAAA;AAAA;AAAA,EAEA,QAAA;AAAA;AAAA,EAEA,UAAA;AAAA;AAAA,EAEG,YAAA;AAAA;AAAA,EAEA,gBAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,UAAA;AAAA;AAAA,EAEA,kBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMV,IAAc,cAAA,GAA0B;AACtC,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,WAAA,CAAY,SAAmC,qBAAA,EAA8C;AAE3F,IAAA,MAAM,mBAAA,GAAsB,sBAAsB,SAAA,EAAU;AAC5D,IAAA,IAAA,CAAK,gBAAA,GAAmB,yBAAA,CAA0B,mBAAA,CAAoB,oBAAoB,CAAA;AAE1F,IAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AACpB,IAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AACpB,IAAA,IAAA,CAAK,aAAa,cAAA,CAAe,IAAA,CAAK,IAAA,EAAM,OAAA,CAAQ,eAAe,QAAQ,CAAA;AAO3E,IAAA,IAAA,CAAK,UAAA,GACH,IAAA,CAAK,cAAA,IACL,mBAAA,CAAoB,gBAAA,EAAkB,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,KAAM,IAAA,IAC7D,IAAA,CAAK,UAAA,IAAc,CAAC,mBAAA,CAAoB,oBAAA;AAM3C,IAAA,IAAA,CAAK,QAAA,GAAW,SAAA;AAAA,MACd,OAAA,CAAQ,MAAA,EAAQ,QAAA,IAAY,OAAA,CAAQ,QAAA,GAAW,EAAE,GAAG,OAAA,CAAQ,MAAA,EAAQ,QAAA,EAAU,GAAG,OAAA,CAAQ,UAAS,GAAI,MAAA;AAAA,MACtG,IAAA,CAAK;AAAA,KACP;AAEA,IAAA,IAAI,QAAQ,cAAA,IAAkB,OAAA,CAAQ,cAAA,CAAe,IAAA,KAAS,CAAA,EAAG;AAC/D,MAAA,IAAA,CAAK,iBAAiB,SAAA,CAAU,OAAA,CAAQ,cAAA,CAAe,GAAA,EAAK,KAAK,gBAAgB,CAAA;AAAA,IACnF;AAEA,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,SAAA,GAAY,OAAA,CAAQ,SAAA,oBAAa,IAAI,IAAA,EAAK;AAC/C,IAAA,IAAA,CAAK,qBAAA,GAAwB,qBAAA;AAC7B,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,OAAA,IAAW,KAAA;AAClC,IAAA,IAAA,CAAK,gBAAgB,OAAA,CAAQ,aAAA;AAC7B,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA;AAE1B,IAAA,IAAA,CAAK,IAAA,GAAO,CAAC,OAAA,CAAQ,MAAA,IAAU,QAAQ,IAAA,EAAM,MAAA,GAAS,QAAQ,IAAA,GAAO,MAAA;AAErE,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,aAAA,CAAc,KAAK,CAAA;AAC7C,IAAA,IAAA,CAAK,UAAA,GAAa,OAAA,CAAQ,UAAA,IAAc,YAAA,EAAc,UAAA;AACtD,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA,CAAQ,QAAA,IAAY,YAAA,EAAc,QAAA;AAClD,IAAA,IAAA,CAAK,UAAA,GAAa,OAAA,CAAQ,UAAA,IAAc,YAAA,EAAc,UAAA;AAEtD,IAAA,IAAI,KAAK,UAAA,EAAY;AAGnB,MAAA,IAAA,CAAK,aAAa,EAAC;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,aAAa,SAAA,CAAU,OAAA,CAAQ,YAAY,IAAA,CAAK,gBAAgB,KAAM,EAAC;AAC5E,IAAA,IAAI,QAAQ,cAAA,IAAkB,OAAA,CAAQ,cAAA,CAAe,IAAA,KAAS,CAAA,EAAG;AAC/D,MAAA,IAAA,CAAK,iBAAiB,SAAA,CAAU,OAAA,CAAQ,cAAA,CAAe,GAAA,EAAK,KAAK,gBAAgB,CAAA;AAAA,IACnF;AAEA,IAAA,IAAI,KAAK,OAAA,EAAS;AAGhB,MAAA,IAAA,CAAK,MAAA,GAAS,SAAA,CAAU,OAAA,CAAQ,MAAA,EAAQ,KAAK,gBAAgB,CAAA;AAAA,IAC/D,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,KAAA,GAAQ,SAAA,CAAU,OAAA,CAAQ,KAAA,EAAO,KAAK,gBAAgB,CAAA;AAAA,IAC7D;AAAA,EACF;AAAA,EAaA,gBAA6C,OAAA,EAAyD;AACpG,IAAA,OAAO,IAAA,CAAK,qBAAA,CAAsB,SAAA,CAAsB,EAAE,GAAG,SAAS,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,CAAA;AAAA,EACtG;AAAA,EAEA,gBAA6C,OAAA,EAA0D;AACrG,IAAA,OAAO,IAAA,CAAK,qBAAA,CAAsB,SAAA,CAAsB,EAAE,GAAG,SAAS,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,EACrG;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAA,GAA+C;AAE7C,IAAA,IAAI,IAAA,CAAK,IAAA,KAAST,sBAAAA,CAAS,gBAAA,EAAkB;AAC3C,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAI,iBAAiB,IAAuC,CAAA;AAAA,EACrE;AAAA;AAAA,EAGA,IAAI,UAAA,GAAsB;AACxB,IAAA,OAAO,CAAC,IAAA,CAAK,MAAA;AAAA,EACf;AAAA;AAAA,EAMO,cAAc,oBAAA,EAAqD;AACxE,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,IAAI,oBAAA,SAA6B,IAAA,CAAK,MAAA;AACtC,IAAA,IAAI,KAAK,MAAA,CAAO,UAAA,SAAoB,IAAA,CAAK,MAAA,CAAuB,cAAc,oBAAoB,CAAA;AAClG,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA,EAGO,gBAAgB,oBAAA,EAAoD;AACzE,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAEhB,MAAA,OAAO,IAAA,CAAK,YAAA;AAAA,IACd;AACA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,oBAAoB,CAAA;AAC1D,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,OAAO,UAAA,CAAW,EAAA;AAAA,IACpB;AAEA,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,eAAA,CAAgB,oBAAoB,CAAA;AAAA,EACzD;AAAA;AAAA,EAGO,WAA+B,QAAA,EAAkC;AACtE,IAAA,IAAI,UAA+B,IAAA,CAAK,MAAA;AAExC,IAAA,OAAO,OAAA,EAAS;AACd,MAAA,IAAI,OAAA,CAAQ,SAAS,QAAA,EAAU;AAC7B,QAAA,OAAO,OAAA;AAAA,MACT;AACA,MAAA,OAAA,GAAU,OAAA,CAAQ,MAAA;AAAA,IACpB;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGO,qBAAA,GAA4C;AACjD,IAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,MAAA,OAAO,IAAA,CAAK,kBAAA;AAAA,IACd;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,EAAC;AACnC,IAAA,MAAM,iBAAA,GAAoB,CAAC,GAAA,KACzB,OAAO,QAAA,CAAS,GAAG,CAAA,KAAM,QAAA,GAAW,QAAA,CAAS,GAAG,CAAA,GAAI,MAAA;AACtD,IAAA,MAAM,qBAAA,GAAwB,CAAC,IAAA,EAAkC,GAAA,KAAoC;AACnG,MAAA,MAAM,IAAI,IAAA,EAAM,QAAA;AAChB,MAAA,OAAO,CAAA,IAAK,OAAO,CAAA,CAAE,GAAG,MAAM,QAAA,GAAW,CAAA,CAAE,GAAG,CAAA,GAAI,MAAA;AAAA,IACpD,CAAA;AACA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,KAAK,CAAA;AAE3C,IAAA,IAAI,QAAA,GAAoB,IAAA;AACxB,IAAA,OAAO,SAAS,MAAA,EAAQ;AACtB,MAAA,QAAA,GAAW,QAAA,CAAS,MAAA;AAAA,IACtB;AAEA,IAAA,MAAM,QAAA,GAAW,SAAS,IAAA,EAAM,MAAA,GAAS,CAAC,GAAG,QAAA,CAAS,IAAI,CAAA,GAAI,MAAA;AAE9D,IAAA,IAAA,CAAK,kBAAA,GAAqB;AAAA,MACxB,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,IAAA,EAAM,QAAA;AAAA,MACN,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,eAAA,EAAiB,kBAAkB,iBAAiB,CAAA;AAAA,MACpD,kBAAkB,UAAA,EAAY,UAAA;AAAA,MAC9B,gBAAgB,UAAA,EAAY,QAAA;AAAA,MAC5B,kBAAkB,UAAA,EAAY,UAAA;AAAA,MAC9B,qBAAA,EAAuB,qBAAA,CAAsB,UAAA,EAAY,iBAAiB,CAAA;AAAA,MAC1E,gBAAgB,QAAA,CAAS,UAAA;AAAA,MACzB,cAAc,QAAA,CAAS,QAAA;AAAA,MACvB,gBAAgB,QAAA,CAAS,UAAA;AAAA,MACzB,mBAAA,EAAqB,qBAAA,CAAsB,QAAA,EAAU,iBAAiB,CAAA;AAAA,MACtE,MAAA,EAAQ,kBAAkB,QAAQ,CAAA;AAAA,MAClC,cAAA,EAAgB,kBAAkB,gBAAgB,CAAA;AAAA,MAClD,UAAA,EAAY,kBAAkB,YAAY,CAAA;AAAA,MAC1C,KAAA,EAAO,kBAAkB,OAAO,CAAA;AAAA,MAChC,SAAA,EAAW,kBAAkB,WAAW,CAAA;AAAA,MACxC,QAAA,EAAU,kBAAkB,UAAU,CAAA;AAAA,MACtC,SAAA,EAAW,kBAAkB,WAAW,CAAA;AAAA,MACxC,aAAa,iBAAA,CAAkB,aAAa,CAAA,IAAK,IAAA,CAAK,sBAAsB,oBAAA,IAAuB;AAAA,MACnG,MAAA,EAAQ,kBAAkB,QAAQ,CAAA;AAAA,MAClC,aAAa,iBAAA,CAAkB,aAAa,KAAK,IAAA,CAAK,qBAAA,CAAsB,WAAU,CAAE,WAAA;AAAA,MACxF,YAAA,EAAc,kBAAkB,cAAc;AAAA,KAChD;AAEA,IAAA,OAAO,IAAA,CAAK,kBAAA;AAAA,EACd;AAAA;AAAA,EAGO,WAAW,oBAAA,EAAqD;AAErE,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,EAAY,SAAA,IAAa,KAAA;AAChD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,EAAY,UAAA,IAAc,KAAA;AAElD,IAAA,OAAO;AAAA,MACL,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,KAAA,EAAO,SAAA,GAAY,MAAA,GAAY,IAAA,CAAK,KAAA;AAAA,MACpC,MAAA,EAAQ,UAAA,GAAa,MAAA,GAAY,IAAA,CAAK,MAAA;AAAA,MACtC,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,gBAAgB,IAAA,CAAK,cAAA;AAAA,MACrB,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,YAAA,EAAc,IAAA,CAAK,eAAA,CAAgB,oBAAoB,CAAA;AAAA;AAAA,MAEvD,GAAI,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,IAAA,EAAM,MAAA,GAAS,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,GAAI;AAAC,KACpE;AAAA,EACF;AAAA,EAEA,IAAI,eAAA,GAAsC;AACxC,IAAA,OAAO,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,GAAU,MAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,iBAAoB,EAAA,EAAkC;AAC1D,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,qBAAA,CAAsB,SAAA,EAAU;AAEpD,IAAA,IAAI,QAAQ,gBAAA,EAAkB;AAC5B,MAAA,MAAM,oBAAoB,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,KAAK,CAAA,GAAI,IAAA;AACxE,MAAA,OAAO,OAAO,gBAAA,CAAiB,iBAAA,EAAmB,EAAA,IAAM,IAAA,CAAK,IAAI,EAAE,CAAA;AAAA,IACrE;AAEA,IAAA,OAAO,EAAA,EAAG;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,qBAAwB,EAAA,EAAgB;AACtC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,qBAAA,CAAsB,SAAA,EAAU;AAEpD,IAAA,IAAI,QAAQ,oBAAA,EAAsB;AAChC,MAAA,MAAM,oBAAoB,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,KAAK,CAAA,GAAI,IAAA;AACxE,MAAA,OAAO,OAAO,oBAAA,CAAqB,iBAAA,EAAmB,EAAA,IAAM,IAAA,CAAK,IAAI,EAAE,CAAA;AAAA,IACzE;AAEA,IAAA,OAAO,EAAA,EAAG;AAAA,EACZ;AACF;AC1aO,IAAM,WAAA,GAAN,cAAkD,QAAA,CAAgB;AAAA,EAChE,EAAA;AAAA,EACA,OAAA;AAAA,EAEP,WAAA,CAAY,SAAmC,qBAAA,EAA8C;AAC3F,IAAA,KAAA,CAAM,SAAS,qBAAqB,CAAA;AAGpC,IAAA,IAAI,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,OAAA,EAAS;AACrC,MAAA,IAAA,CAAK,KAAK,OAAA,CAAQ,MAAA;AAClB,MAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,OAAA;AACvB,MAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,QAAA,IAAA,CAAK,eAAe,OAAA,CAAQ,YAAA;AAAA,MAC9B;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,MAAA,GAAS,sBAAsB,SAAA,EAAU;AAC/C,IAAA,IAAI,MAAA,IAAU,CAAC,IAAA,CAAK,UAAA,EAAY;AAC9B,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,UAAA,CAAW,OAAO,CAAA;AAC3C,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,IAAA,CAAK,KAAK,SAAA,CAAU,MAAA;AACpB,QAAA,IAAA,CAAK,UAAU,SAAA,CAAU,OAAA;AACzB,QAAA,IAAA,CAAK,eAAe,SAAA,CAAU,YAAA;AAC9B,QAAA;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,MAAA,CAAO,OAAA;AAC9B,MAAA,IAAA,CAAK,YAAA,GAAe,QAAQ,MAAA,CAAO,EAAA;AACnC,MAAA,IAAA,CAAK,KAAK,cAAA,EAAe;AACzB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,mBAAmB,OAAO,CAAA;AACzC,IAAA,IAAA,CAAK,KAAK,cAAA,EAAe;AAEzB,IAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,MAAA,IAAI,aAAA,CAAc,OAAA,CAAQ,YAAY,CAAA,EAAG;AACvC,QAAA,IAAA,CAAK,eAAe,OAAA,CAAQ,YAAA;AAAA,MAC9B,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN,CAAA,iFAAA,EAAoF,QAAQ,YAAY,CAAA,YAAA;AAAA,SAC1G;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAI,OAAA,EAAuC;AACzC,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,OAAA,uBAAc,IAAA,EAAK;AAExB,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,IAAA,CAAK,QAAA,GAAW,EAAE,GAAG,IAAA,CAAK,QAAA,EAAU,GAAG,SAAA,CAAU,OAAA,CAAQ,QAAA,EAAU,IAAA,CAAK,gBAAgB,CAAA,EAAE;AAAA,IAC5F;AACA,IAAA,IAAI,KAAK,UAAA,EAAY;AAEnB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAA,EAAS,WAAW,MAAA,EAAW;AACjC,MAAA,IAAA,CAAK,MAAA,GAAS,SAAA,CAAU,OAAA,CAAQ,MAAA,EAAQ,KAAK,gBAAgB,CAAA;AAAA,IAC/D;AACA,IAAA,IAAI,SAAS,UAAA,EAAY;AACvB,MAAA,IAAA,CAAK,UAAA,GAAa,EAAE,GAAG,IAAA,CAAK,UAAA,EAAY,GAAG,SAAA,CAAU,OAAA,CAAQ,UAAA,EAAY,IAAA,CAAK,gBAAgB,CAAA,EAAE;AAAA,IAClG;AAAA,EAEF;AAAA,EAEA,MAAM,OAAA,EAAwC;AAC5C,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAEU,OAAA,EAAO,OAAA,GAAU,IAAA,EAAM,UAAA,EAAY,UAAS,GAAI,OAAA;AAExD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,QAAA,GAAW,EAAE,GAAG,IAAA,CAAK,QAAA,EAAU,GAAG,SAAA,CAAU,QAAA,EAAU,IAAA,CAAK,gBAAgB,CAAA,EAAE;AAAA,IACpF;AAEA,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,QACfA,mBAAiBC,iBAAA,GACb;AAAA,UACE,IAAID,OAAA,CAAM,EAAA;AAAA,UACV,SAASA,OAAA,CAAM,OAAA;AAAA,UACf,UAAUA,OAAA,CAAM,QAAA;AAAA,UAChB,QAAQA,OAAA,CAAM,MAAA;AAAA,UACd,SAASA,OAAA,CAAM,OAAA;AAAA,UACf,MAAMA,OAAA,CAAM,IAAA;AAAA;AAAA;AAAA;AAAA,UAIZ,OAAQA,OAAA,CAAM,KAAA,YAAiB,SAASA,OAAA,CAAM,KAAA,CAAM,SAAUA,OAAA,CAAM;AAAA,SACtE,GACA;AAAA,UACE,SAASA,OAAA,CAAM,OAAA;AAAA,UACf,MAAMA,OAAA,CAAM,IAAA;AAAA,UACZ,OAAOA,OAAA,CAAM;AAAA,SACf;AAAA,QACJ,IAAA,CAAK;AAAA,OACP;AAEA,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,IAAA,CAAK,UAAA,GAAa,EAAE,GAAG,IAAA,CAAK,UAAA,EAAY,GAAG,SAAA,CAAU,UAAA,EAAY,IAAA,CAAK,gBAAgB,CAAA,EAAE;AAAA,MAC1F;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,GAAA,EAAI;AAAA,IACX,CAAA,MAAO;AAEL,MAAA,IAAA,CAAK,MAAA,CAAO,EAAE,CAAA;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,OAAO,OAAA,EAAyC;AAC9C,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAW;AAC9B,MAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AAAA,IACtB;AAEA,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,IAAA,CAAK,QAAA,GAAW,EAAE,GAAG,IAAA,CAAK,QAAA,EAAU,GAAG,SAAA,CAAU,OAAA,CAAQ,QAAA,EAAU,IAAA,CAAK,gBAAgB,CAAA,EAAE;AAAA,IAC5F;AACA,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAA,CAAQ,UAAU,MAAA,EAAW;AAC/B,MAAA,IAAA,CAAK,KAAA,GAAQ,SAAA,CAAU,OAAA,CAAQ,KAAA,EAAO,KAAK,gBAAgB,CAAA;AAAA,IAC7D;AACA,IAAA,IAAI,OAAA,CAAQ,WAAW,MAAA,EAAW;AAChC,MAAA,IAAA,CAAK,MAAA,GAAS,SAAA,CAAU,OAAA,CAAQ,MAAA,EAAQ,KAAK,gBAAgB,CAAA;AAAA,IAC/D;AACA,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,IAAA,CAAK,UAAA,GAAa,EAAE,GAAG,IAAA,CAAK,UAAA,EAAY,GAAG,SAAA,CAAU,OAAA,CAAQ,UAAA,EAAY,IAAA,CAAK,gBAAgB,CAAA,EAAE;AAAA,IAClG;AAAA,EAEF;AAAA,EAEA,IAAI,OAAA,GAAmB;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,MAAA,GAA0B;AAC9B,IAAA,OAAO,KAAK,SAAA,CAAU;AAAA,MACpB,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,UAAU,IAAA,CAAK;AAAA,KAChB,CAAA;AAAA,EACH;AACF;AAKA,SAAS,gBAAgB,KAAA,EAAyB;AAChD,EAAA,IAAI;AAEF,IAAA,MAAM,YAAY,UAAA,CAAW,MAAA;AAC7B,IAAA,IAAI,WAAW,eAAA,EAAiB;AAC9B,MAAA,SAAA,CAAU,eAAA,CAAgB,IAAA,CAAK,SAAA,EAAW,KAAK,CAAA;AAC/C,MAAA;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,KAAA,CAAM,CAAC,CAAA,GAAI,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,KAAW,GAAG,CAAA;AAAA,EAC3C;AACF;AAEA,SAAS,cAAA,GAAyB;AAChC,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,CAAC,CAAA;AAC9B,EAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,CAAA,IAAA,KAAQ,KAAK,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAC9E;AAKA,SAAS,eAAA,GAA0B;AACjC,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,EAAE,CAAA;AAC/B,EAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,CAAA,IAAA,KAAQ,KAAK,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAC9E;AAKA,SAAS,eAAe,OAAA,EAA0B;AAChD,EAAA,OAAO,mBAAA,CAAoB,KAAK,OAAO,CAAA;AACzC;AAKA,SAAS,cAAc,MAAA,EAAyB;AAC9C,EAAA,OAAO,mBAAA,CAAoB,KAAK,MAAM,CAAA;AACxC;AAEA,SAAS,mBAAmB,OAAA,EAA8C;AACxE,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,IAAI,cAAA,CAAe,OAAA,CAAQ,OAAO,CAAA,EAAG;AACnC,MAAA,OAAO,OAAA,CAAQ,OAAA;AAAA,IACjB,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,KAAA;AAAA,QACN,CAAA,4EAAA,EAA+E,QAAQ,OAAO,CAAA,2BAAA;AAAA,OAChG;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,eAAA,EAAgB;AACzB;;;AC5NO,IAAM,QAAA,GAAN,cAAqD,QAAA,CAAgB;AAAA,EACnE,EAAA;AAAA,EACA,OAAA;AAAA,EAEP,WAAA,CAAY,SAAmC,qBAAA,EAA8C;AAC3F,IAAA,KAAA,CAAM,SAAS,qBAAqB,CAAA;AACpC,IAAA,IAAA,CAAK,EAAA,GAAK,OAAA;AACV,IAAA,IAAA,CAAK,OAAA,GAAU,aAAA;AAAA,EACjB;AAAA,EAEA,IAAI,QAAA,EAAwC;AAAA,EAAC;AAAA,EAE7C,MAAM,QAAA,EAAyC;AAAA,EAAC;AAAA,EAEhD,OAAO,QAAA,EAA0C;AAAA,EAAC;AAAA,EAElD,IAAI,OAAA,GAAmB;AACrB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAGA,IAAuB,cAAA,GAA0B;AAC/C,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;ACYO,IAAe,yBAAA,GAAf,cAAiDf,eAAAA,CAA4C;AAAA,EACxF,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAA;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOV,kBAAA;AAAA,EAEA,YAAY,MAAA,EAAqC;AAC/C,IAAA,KAAA,CAAM,EAAE,SAAA,EAAWC,uBAAAA,CAAiB,eAAe,IAAA,EAAM,MAAA,CAAO,aAAa,CAAA;AAG7E,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,QAAA,EAAU,MAAA,CAAO,QAAA,IAAY,EAAE,IAAA,EAAA,QAAA,eAAkC;AAAA,MACjE,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,EAAC;AAAA,MAChC,oBAAA,EAAsB,MAAA,CAAO,oBAAA,IAAwB,EAAC;AAAA,MACtD,MAAA,EAAQ,OAAO,MAAA,IAAU,MAAA;AAAA,MACzB,oBAAA,EAAsB,OAAO,oBAAA,IAAwB,KAAA;AAAA,MACrD,kBAAkB,MAAA,CAAO,gBAAA;AAAA,MACzB,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,kBAAA,EAAoB,MAAA,CAAO,kBAAA,IAAsB,EAAC;AAAA,MAClD,sBAAsB,MAAA,CAAO,oBAAA;AAAA,MAC7B,SAAS,MAAA,CAAO;AAAA,KAClB;AAGA,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAI,iBAAA,CAAkB,MAAA,CAAO,WAAW,CAAA;AAGjE,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAI,gBAAA,CAAiB;AAAA,MAC3C,oBAAA,EAAsB,KAAK,MAAA,CAAO;AAAA,KACnC,CAAA;AAED,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,SAAA,EAAW;AACrC,MAAA,IAAA,CAAK,gBAAA,CAAiB,iBAAiB,QAAQ,CAAA;AAAA,IACjD;AAGA,IAAA,IAAI,IAAA,CAAK,OAAO,MAAA,EAAQ;AACtB,MAAA,IAAA,CAAK,gBAAA,CAAiB,cAAA,CAAe,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AAAA,IACzD;AAGA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,IAAA,EAAM;AAC5B,MAAA,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,IACjD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,MAAA,EAAuB;AACjC,IAAA,KAAA,CAAM,YAAY,MAAM,CAAA;AAGxB,IAAA,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,QAAA,KAAY;AACjC,MAAA,IAAI,OAAO,QAAA,CAAS,WAAA,KAAgB,UAAA,EAAY;AAC9C,QAAA,QAAA,CAAS,YAAY,MAAM,CAAA;AAAA,MAC7B;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,WAAA,EAAa;AACnC,MAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,WAAA,CAAY,MAAM,CAAA;AAAA,IACvC;AAGA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,MACV,wCAAwC,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA,YAAA,EAAe,IAAA,CAAK,OAAO,IAAI,CAAA,YAAA,EAAe,IAAA,CAAK,MAAA,CAAO,UAAU,IAAI,CAAA,UAAA,EAAa,CAAC,CAAC,IAAA,CAAK,OAAO,MAAM,CAAA,CAAA;AAAA,KAC1K;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,IAAc,SAAA,GAAqC;AACjD,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,EAAC;AAAA,EACnC;AAAA,EAEA,IAAc,oBAAA,GAA8C;AAC1D,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,oBAAA,IAAwB,EAAC;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,UAAkC,OAAA,EAA+C;AAC/E,IAAA,MAAM,EAAE,oBAAA,EAAsB,cAAA,EAAgB,UAAU,cAAA,EAAgB,GAAG,MAAK,GAAI,OAAA;AAGpF,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAGlB,MAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,CAAO,OAAA,EAAS;AAC3B,QAAA,OAAO,IAAI,QAAA,CAAgB,EAAE,GAAG,IAAA,EAAM,QAAA,IAAY,IAAI,CAAA;AAAA,MACxD;AAAA,IAEF,CAAA,MAAO;AAEL,MAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,oBAAoB,CAAA,EAAG;AAC5C,QAAA,OAAO,IAAI,QAAA,CAAgB,EAAE,GAAG,IAAA,EAAM,QAAA,IAAY,IAAI,CAAA;AAAA,MACxD;AAAA,IACF;AAGA,IAAA,IAAI,UAAA;AAEJ,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAElB,MAAA,UAAA,GAAa,QAAQ,MAAA,CAAO,UAAA;AAAA,IAC9B,CAAA,MAAO;AAEL,MAAA,UAAA,GAAa,IAAA,CAAK,kBAAkB,cAAc,CAAA;AAAA,IACpD;AAGA,IAAA,MAAM,eAAA,GAAkB,CAAC,OAAA,CAAQ,MAAA,GAAS,gBAAgB,QAAA,GAAW,MAAA;AACrE,IAAA,MAAM,cAAA,GAAiB,YAAY,eAAA,GAAkB,EAAE,GAAG,QAAA,EAAU,GAAG,iBAAgB,GAAI,MAAA;AAG3F,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,iCAAA,CAAkC,cAAA,EAAgB,gBAAgB,UAAU,CAAA;AAS1G,IAAA,MAAM,aAAA,GACJ,CAAC,OAAA,CAAQ,MAAA,IACT,KAAK,kBAAA,KAAuB,MAAA,KAC3B,qBAAqB,MAAA,IAAa,gBAAA,CAAiB,gBAAgB,MAAA,CAAA,GAChE,EAAE,GAAI,gBAAA,IAAoB,IAAK,WAAA,EAAa,IAAA,CAAK,oBAAmB,GACpE,gBAAA;AAGN,IAAA,MAAM,IAAA,GAAO,CAAC,OAAA,CAAQ,MAAA,GAAS,gBAAgB,IAAA,GAAO,MAAA;AAItD,IAAA,MAAM,OAAA,GAAU,CAAC,OAAA,CAAQ,MAAA,GAAU,QAAQ,OAAA,IAAW,cAAA,EAAgB,UAAW,OAAA,CAAQ,OAAA;AACzF,IAAA,MAAM,YAAA,GAAe,CAAC,OAAA,CAAQ,MAAA,GACzB,QAAQ,YAAA,IAAgB,cAAA,EAAgB,eACzC,OAAA,CAAQ,YAAA;AAEZ,IAAA,MAAM,IAAA,GAAO,KAAK,UAAA,CAAkB;AAAA,MAClC,GAAG,IAAA;AAAA,MACH,OAAA;AAAA,MACA,YAAA;AAAA,MACA,QAAA,EAAU,aAAA;AAAA,MACV,UAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,IACzB,CAAA,MAAO;AAEL,MAAA,IAAA,CAAK,kBAAkB,IAAI,CAAA;AAG3B,MAAA,IAAA,CAAK,gBAAgB,IAAI,CAAA;AAAA,IAC3B;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,YAAoC,MAAA,EAA0C;AAE5E,IAAA,MAAM,IAAA,GAAO,KAAK,UAAA,CAAkB;AAAA,MAClC,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,QAAQ,MAAA,CAAO,EAAA;AAAA,MACf,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,SAAA,EAAW,OAAO,SAAA,YAAqB,IAAA,GAAO,OAAO,SAAA,GAAY,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA;AAAA,MAC1F,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,YAAY,MAAA,CAAO;AAAA,KACpB,CAAA;AAGD,IAAA,IAAA,CAAK,kBAAkB,IAAI,CAAA;AAE3B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2BA,SAAA,GAAmD;AACjD,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,MAAA,EAAO;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,oBAAA,GAA2C;AACzC,IAAA,OAAO,IAAA,CAAK,kBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,uBAAuB,WAAA,EAAuC;AAC5D,IAAA,IAAA,CAAK,kBAAA,GAAqB,WAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,YAAA,GAAiD;AAC/C,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,SAAS,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAiB,QAAA,EAAuC;AACtD,IAAA,IAAA,CAAK,gBAAA,CAAiB,iBAAiB,QAAQ,CAAA;AAC/C,IAAA,IAAA,CAAK,MAAA,CAAO,cAAc,EAAC;AAC3B,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC5C,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,IAAA,CAAK,QAAQ,CAAA;AAEnC,IAAA,IAAI,OAAO,QAAA,CAAS,WAAA,KAAgB,UAAA,EAAY;AAC9C,MAAA,QAAA,CAAS,WAAA,CAAY,KAAK,MAAM,CAAA;AAAA,IAClC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAA,GAA0D;AACxD,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,oBAAoB,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAA6C;AAC3C,IAAA,OAAO,KAAK,MAAA,CAAO,MAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAAY;AACV,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,mBAAA,GAAwC;AACtC,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,iBAAiB,IAAA,EAA+B;AAC9C,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,OAAA,KAAY,KAAA,EAAO;AAC1C,MAAA,OAAOgB,+BAAA;AAAA,IACT;AAEA,IAAA,MAAM,kBAAA,GAAqB,MAAM,qBAAA,IAAwB;AACzD,IAAA,MAAM,WAAgD,IAAA,EAAM,QAAA,GAAW,eAAA,CAAgB,IAAA,CAAK,QAAQ,CAAA,GAAI,MAAA;AAExG,IAAA,OAAO,IAAI,iBAAA,CAAkB;AAAA,MAC3B,SAAS,IAAA,EAAM,OAAA;AAAA,MACf,QAAQ,IAAA,EAAM,EAAA;AAAA,MACd,kBAAA;AAAA,MACA,QAAA;AAAA,MACA,kBAAkB,IAAA,CAAK,gBAAA;AAAA,MACvB,QAAA,EAAU,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS;AAAA,KAChC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkB,IAAA,EAAgC;AAChD,IAAA,MAAM,kBAAA,GAAqB,MAAM,qBAAA,IAAwB;AACzD,IAAA,MAAM,WAAgD,IAAA,EAAM,QAAA,GAAW,eAAA,CAAgB,IAAA,CAAK,QAAQ,CAAA,GAAI,MAAA;AAExG,IAAA,OAAO,IAAI,kBAAA,CAAmB;AAAA,MAC5B,SAAS,IAAA,EAAM,OAAA;AAAA,MACf,QAAQ,IAAA,EAAM,EAAA;AAAA,MACd,kBAAA;AAAA,MACA,QAAA;AAAA,MACA,mBAAmB,IAAA,CAAK,iBAAA;AAAA,MACxB,kBAAkB,IAAA,CAAK;AAAA,KACxB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOU,uBAAuB,KAAA,EAAiC;AAChE,IAAA,IAAA,CAAK,gBAAA,CAAiB,KAAK,KAAK,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,oBAAoB,KAAA,EAAiC;AACnD,IAAA,IAAA,CAAK,uBAAuB,KAAK,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,uBAAuB,KAAA,EAAiC;AACtD,IAAA,IAAA,CAAK,uBAAuB,KAAK,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,kBAA0C,IAAA,EAAyB;AAOzE,IAAA,IAAI,CAAC,KAAK,MAAA,CAAO,oBAAA,IAAwB,KAAK,UAAA,IAAc,IAAA,CAAK,IAAA,KAASZ,sBAAAA,CAAS,gBAAA,EAAkB;AACnG,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA;AACtC,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAG5C,IAAA,IAAA,CAAK,GAAA,GAAM,CAAC,OAAA,KAAoC;AAC9C,MAAA,IAAI,KAAK,OAAA,EAAS;AAChB,QAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,yCAAA,CAA2C,CAAA;AAC5D,QAAA;AAAA,MACF;AAMA,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,uBAAA,CAAwB,IAAA,EAAM,OAAO,CAAA;AAE/D,MAAA,WAAA,CAAY,OAAO,CAAA;AAEnB,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,IAAA,CAAK,iBAAiB,YAAY,CAAA;AAAA,MACpC;AAEA,MAAA,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,IACzB,CAAA;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,CAAC,OAAA,KAAsC;AACnD,MAAA,IAAI,KAAK,OAAA,EAAS;AAChB,QAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,wCAAA,CAA0C,CAAA;AAC3D,QAAA;AAAA,MACF;AACA,MAAA,cAAA,CAAe,OAAO,CAAA;AACtB,MAAA,IAAA,CAAK,gBAAgB,IAAI,CAAA;AAAA,IAC3B,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASU,aAAa,OAAA,EAAyC;AAE9D,IAAA,MAAM,EAAE,QAAA,EAAS,GAAI,IAAA,CAAK,MAAA;AAE1B,IAAA,QAAQ,UAAU,IAAA;AAAM,MACtB,KAAK,MAAA;AACH,QAAA,OAAO,IAAA;AAAA,MACT,KAAA,QAAA;AACE,QAAA,OAAO,IAAA;AAAA,MACT,KAAA,OAAA;AACE,QAAA,OAAO,KAAA;AAAA,MACT,KAAA,OAAA;AACE,QAAA,IAAI,QAAA,CAAS,gBAAgB,MAAA,IAAa,QAAA,CAAS,cAAc,CAAA,IAAK,QAAA,CAAS,cAAc,CAAA,EAAG;AAC9F,UAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,YACV,CAAA,8BAAA,EAAiC,SAAS,WAAW,CAAA,4DAAA;AAAA,WACvD;AACA,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,OAAO,IAAA,CAAK,MAAA,EAAO,GAAI,QAAA,CAAS,WAAA;AAAA,MAClC,KAAA,QAAA;AACE,QAAA,OAAO,QAAA,CAAS,QAAQ,OAAO,CAAA;AAAA,MACjC;AACE,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wCAAA,EAA4C,QAAA,CAAiB,IAAI,CAAA,CAAE,CAAA;AAAA;AACvF,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,kBAAkB,cAAA,EAAyD;AACnF,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,MAAA,CAAO,kBAAA,IAAsB,EAAC;AAC1D,IAAA,MAAM,cAAA,GAAiB,cAAA,EAAgB,kBAAA,IAAsB,EAAC;AAG9D,IAAA,MAAM,OAAA,GAAU,CAAC,GAAG,cAAA,EAAgB,GAAG,cAAc,CAAA;AAErD,IAAA,MAAM,YAAY,cAAA,EAAgB,SAAA;AAClC,IAAA,MAAM,aAAa,cAAA,EAAgB,UAAA;AAGnC,IAAA,IAAI,QAAQ,MAAA,KAAW,CAAA,IAAK,CAAC,SAAA,IAAa,CAAC,UAAA,EAAY;AACrD,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,OAAO;AAAA,MACL,kBAAA,EAAoB,OAAA;AAAA,MACpB,GAAI,SAAA,KAAc,MAAA,IAAa,EAAE,SAAA,EAAU;AAAA,MAC3C,GAAI,UAAA,KAAe,MAAA,IAAa,EAAE,UAAA;AAAW,KAC/C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,iCAAA,CACR,cAAA,EACA,gBAAA,EACA,UAAA,EACiC;AACjC,IAAA,IAAI,CAAC,cAAA,IAAkB,CAAC,cAAc,UAAA,CAAW,kBAAA,CAAmB,WAAW,CAAA,EAAG;AAChF,MAAA,OAAO,gBAAA;AAAA,IACT;AAEA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,WAAA,CAAY,cAAA,EAAgB,WAAW,kBAAkB,CAAA;AAGhF,IAAA,IAAI,OAAO,IAAA,CAAK,SAAS,EAAE,MAAA,KAAW,CAAA,IAAK,CAAC,gBAAA,EAAkB;AAC5D,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,OAAO;AAAA,MACL,GAAG,SAAA;AAAA,MACH,GAAG;AAAA;AAAA,KACL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,WAAA,CAAY,gBAAgC,IAAA,EAAqC;AACzF,IAAA,MAAM,SAA8B,EAAC;AAErC,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AAEtB,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAC3B,MAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AACvB,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA;AAExC,MAAA,IAAI,UAAU,MAAA,EAAW;AAEvB,QAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,UAAA,MAAM,aAAa,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AAC1C,UAAA,MAAM,WAAA,GAAca,oBAAA,CAAe,KAAA,EAAO,UAAU,CAAA;AACpD,UAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,YAAAC,oBAAA,CAAe,MAAA,EAAQ,KAAK,WAAW,CAAA;AAAA,UACzC;AAAA,QACF,CAAA,MAAO;AAEL,UAAAA,oBAAA,CAAe,MAAA,EAAQ,KAAK,KAAK,CAAA;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,IAAA,EAAqC;AACvD,IAAA,KAAA,MAAW,SAAA,IAAa,KAAK,oBAAA,EAAsB;AACjD,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA;AAAA,MACF;AAEA,MAAA,IAAI;AACF,QAAA,IAAA,GAAO,SAAA,CAAU,QAAQ,IAAI,CAAA;AAAA,MAC/B,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,OAAO,KAAA,CAAM,CAAA,sCAAA,EAAyC,SAAA,CAAU,IAAI,KAAK,KAAK,CAAA;AAAA,MAErF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAiB,IAAA,EAA4C;AAC3D,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,OAAO,MAAA;AAC1B,IAAA,IAAI,KAAK,UAAA,IAAc,CAAC,IAAA,CAAK,MAAA,CAAO,sBAAsB,OAAO,MAAA;AAGjE,IAAA,IAAI,KAAK,MAAA,CAAO,gBAAA,EAAkB,SAAS,IAAA,CAAK,IAAI,GAAG,OAAO,MAAA;AAE9D,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AAC3C,IAAA,MAAM,YAAA,GAAe,aAAA,EAAe,UAAA,CAAW,IAAA,CAAK,OAAO,oBAAoB,CAAA;AAC/E,IAAA,IAAI,CAAC,cAAc,OAAO,MAAA;AAG1B,IAAA,IAAI,IAAA,CAAK,OAAO,UAAA,EAAY;AAC1B,MAAA,IAAI;AACF,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,YAAY,GAAG,OAAO,MAAA;AAAA,MACpD,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,gCAAA,CAAA,EAAoC,KAAK,CAAA;AAAA,MAE7D;AAAA,IACF;AAEA,IAAA,OAAO,YAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,gBAAgB,IAAA,EAAqB;AAC7C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,gBAAA,CAAiB,IAAI,CAAA;AAC/C,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,KAAA,GAAsB,EAAE,IAAA,EAAMpB,8BAAAA,CAAiB,cAAc,YAAA,EAAa;AAChF,MAAA,IAAA,CAAK,iBAAiB,KAAK,CAAA;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOU,cAAc,IAAA,EAAqB;AAC3C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,gBAAA,CAAiB,IAAI,CAAA;AAE/C,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,IAAI;AASF,QAAA,wBAAA,CAAyB,IAAA,EAAM,IAAA,CAAK,iBAAA,CAAkB,IAAI,CAAC,CAAA;AAAA,MAC7D,SAAS,GAAA,EAAK;AACZ,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,wCAAA,EAA0C,GAAG,CAAA;AAAA,MACjE;AAEA,MAAA,MAAM,KAAA,GAAsB,EAAE,IAAA,EAAMA,8BAAAA,CAAiB,YAAY,YAAA,EAAa;AAC9E,MAAA,IAAA,CAAK,iBAAiB,KAAK,CAAA;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,gBAAgB,IAAA,EAAqB;AAC7C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,gBAAA,CAAiB,IAAI,CAAA;AAC/C,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,KAAA,GAAsB,EAAE,IAAA,EAAMA,8BAAAA,CAAiB,cAAc,YAAA,EAAa;AAChF,MAAA,IAAA,CAAK,iBAAiB,KAAK,CAAA;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,uBAAA,CACN,MACA,UAAA,EACyF;AACzF,IAAA,IAAI,IAAA,CAAK,IAAA,KAASM,sBAAAA,CAAS,gBAAA,EAAkB,OAAO,MAAA;AAGpD,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,MAAA,CAAO,sBAAsB,OAAO,MAAA;AAMjE,IAAA,MAAM,QAAA,GAAY,YAAY,UAAA,IAAwD,MAAA;AACtF,IAAA,MAAM,YAAY,IAAA,CAAK,UAAA;AACvB,IAAA,MAAM,KAAA,GAAQ,QAAA,EAAU,KAAA,IAAS,SAAA,EAAW,KAAA;AAC5C,IAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AAEnB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,oBAAA,CAAqB,IAAI,CAAA;AAC/C,IAAA,IAAI,CAAC,UAAU,OAAO,MAAA;AAEtB,IAAA,MAAM,QAAA,GAAW,QAAA,EAAU,QAAA,IAAY,SAAA,EAAW,QAAA;AAClD,IAAA,MAAM,QAAQ,QAAA,EAAU,aAAA,IAAiB,UAAU,KAAA,IAAS,SAAA,EAAW,iBAAiB,SAAA,EAAW,KAAA;AAEnG,IAAA,OAAO,EAAE,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,KAAA,EAAM;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,iBAAiB,MAAA,EAA2F;AAClH,IAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,OAAM,GAAI,MAAA;AAM7C,IAAA,MAAM,QAAQ,QAAA,CAAS,UAAA;AACvB,IAAA,KAAA,CAAM,aAAA,GAAgB,aAAA,CAAc,KAAA,CAAM,aAAA,EAAe,KAAK,CAAA;AAE9D,IAAA,IAAI;AACF,MAAA,wBAAA,CAAyB,OAAO,QAAA,EAAU,KAAA,EAAO,IAAA,CAAK,iBAAA,CAAkB,QAAQ,CAAC,CAAA;AAAA,IACnF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,qDAAA,EAAuD,GAAG,CAAA;AAAA,IAC9E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYQ,qBAAqB,IAAA,EAAoC;AAC/D,IAAA,IAAI,WAAgC,IAAA,CAAK,MAAA;AACzC,IAAA,OAAO,QAAA,IAAY,IAAA,CAAK,oBAAA,CAAqB,QAAQ,CAAA,EAAG;AACtD,MAAA,QAAA,GAAW,QAAA,CAAS,MAAA;AAAA,IACtB;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,qBAAqB,IAAA,EAAwB;AACnD,IAAA,IAAI,KAAK,UAAA,IAAc,CAAC,IAAA,CAAK,MAAA,CAAO,sBAAsB,OAAO,IAAA;AACjE,IAAA,IAAI,KAAK,MAAA,CAAO,gBAAA,EAAkB,SAAS,IAAA,CAAK,IAAI,GAAG,OAAO,IAAA;AAC9D,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,iBAAiB,KAAA,EAA2B;AAClD,IAAA,IAAA,CAAK,gBAAA,CAAiB,KAAK,KAAK,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAgB,mBAAmB,KAAA,EAAoC;AAErE,IAAA,MAAM,OAAA,GAA+F;AAAA,MACnG,GAAG,IAAA,CAAK;AAAA,KACV;AAGA,IAAA,IAAI,IAAA,CAAK,OAAO,MAAA,EAAQ;AACtB,MAAA,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AAAA,IACjC;AAGA,IAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,GAAA,CAAI,OAAM,MAAA,KAAU;AACjD,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,CAAO,mBAAmB,KAAK,CAAA;AACrC,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,uCAAA,EAA0C,MAAA,CAAO,IAAI,CAAA,QAAA,EAAW,KAAA,CAAM,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,MACjG,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,OAAO,KAAA,CAAM,CAAA,qCAAA,EAAwC,MAAA,CAAO,IAAI,KAAK,KAAK,CAAA;AAAA,MAEjF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,OAAA,CAAQ,WAAW,cAAc,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,6CAAA,EAAgD,IAAA,CAAK,IAAI,CAAA,CAAA,CAAG,CAAA;AAK9E,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,+CAAA,EAAkD,IAAA,CAAK,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,oCAAA,EAAuC,IAAA,CAAK,IAAI,CAAA,CAAA,CAAG,CAAA;AACrE,IAAA,MAAM,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAClC,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,sCAAA,EAAyC,IAAA,CAAK,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,GAA0B;AAC9B,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,uCAAA,EAA0C,IAAA,CAAK,IAAI,CAAA,CAAA,CAAG,CAAA;AAGxE,IAAA,MAAM,IAAA,CAAK,iBAAiB,QAAA,EAAS;AAGrC,IAAA,MAAM,gBAAA,GAAoC;AAAA,MACxC,GAAG,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,UAAU,CAAA;AAAA,MACvC,GAAG,IAAA,CAAK,oBAAA,CAAqB,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,UAAU;AAAA,KACpD;AACA,IAAA,IAAI,IAAA,CAAK,OAAO,MAAA,EAAQ;AACtB,MAAA,gBAAA,CAAiB,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA;AAAA,IACrD;AACA,IAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA,CAAW,gBAAgB,CAAA;AACzD,MAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,QAAA,IAAI,MAAA,CAAO,WAAW,UAAA,EAAY;AAChC,UAAA,IAAA,CAAK,OAAO,KAAA,CAAM,CAAA,gDAAA,EAAmD,KAAK,IAAI,CAAA,EAAA,CAAA,EAAM,OAAO,MAAM,CAAA;AAAA,QACnG;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,yCAAA,EAA4C,IAAA,CAAK,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EAC3E;AACF;;;ACv5BO,SAAS,sBAAA,GAAiC;AAC/C,EAAA,OAAO,UAAA,CAAW,OAAO,UAAA,EAAW;AACtC;ACyBA,SAAS,YAAY,KAAA,EAAsB;AACzC,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,IAAI,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,GAAG,CAAC,CAAA;AAAA,EACzC;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAG7B,IAAA,IAAI,MAAM,MAAA,IAAU,CAAA,EAAG,uBAAO,IAAI,KAAK,CAAC,CAAA;AACxC,IAAA,MAAM,KAAK,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AACpC,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,GAAI,IAAI,KAAK,EAAE,CAAA,mBAAI,IAAI,IAAA,CAAK,CAAC,CAAA;AAAA,EACxD;AACA,EAAA,uBAAO,IAAI,KAAK,CAAC,CAAA;AACnB;AAOA,SAAS,kBAAkB,SAAA,EAAyD;AAClF,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,SAAS,GAAG,OAAO,MAAA;AACtC,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,IAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACvC,IAAA,MAAM,MAAO,IAAA,CAA2B,GAAA;AACxC,IAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC7B,IAAA,MAAM,IAAK,IAAA,CAA6B,KAAA;AACxC,IAAA,IAAI,CAAC,CAAA,IAAK,OAAO,CAAA,KAAM,QAAA,EAAU;AACjC,IAAA,MAAM,KAAA,GAAQ,CAAA;AACd,IAAA,IAAI,aAAA,IAAiB,KAAA,EAAO,GAAA,CAAI,GAAG,IAAI,KAAA,CAAM,WAAA;AAAA,SAAA,IACpC,cAAc,KAAA,EAAO,GAAA,CAAI,GAAG,CAAA,GAAI,MAAA,CAAO,MAAM,QAAQ,CAAA;AAAA,SAAA,IACrD,aAAA,IAAiB,KAAA,EAAO,GAAA,CAAI,GAAG,IAAI,KAAA,CAAM,WAAA;AAAA,SAAA,IACzC,WAAA,IAAe,KAAA,EAAO,GAAA,CAAI,GAAG,IAAI,KAAA,CAAM,SAAA;AAAA,SAAA,IACvC,YAAA,IAAgB,KAAA,IAAS,aAAA,IAAiB,KAAA,EAAO;AAExD,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA;AAAA,IACb;AAAA,EACF;AACA,EAAA,OAAO,OAAO,IAAA,CAAK,GAAG,CAAA,CAAE,MAAA,GAAS,IAAI,GAAA,GAAM,MAAA;AAC7C;AAqCO,SAAS,oBAAoB,OAAA,EAAqC;AACvE,EAAA,MAAM,MAAyB,EAAC;AAChC,EAAA,MAAM,gBAAiB,OAAA,EAAuD,aAAA;AAC9E,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,aAAa,GAAG,OAAO,GAAA;AAE1C,EAAA,KAAA,MAAW,MAAM,aAAA,EAAe;AAC9B,IAAA,MAAM,aAAc,EAAA,EAA+C,UAAA;AACnE,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,EAAG;AAChC,IAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,MAAA,MAAM,QAAS,EAAA,EAA0C,KAAA;AACzD,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC3B,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACvC,QAAA,MAAM,CAAA,GAAI,IAAA;AACV,QAAA,MAAM,UAAU,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,EAAE,OAAA,GAAU,MAAA;AAC5D,QAAA,MAAM,SAAS,OAAO,CAAA,CAAE,MAAA,KAAW,QAAA,GAAW,EAAE,MAAA,GAAS,MAAA;AACzD,QAAA,MAAM,OAAO,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,GAAW,EAAE,IAAA,GAAO,MAAA;AACnD,QAAA,IAAI,CAAC,OAAA,IAAW,CAAC,MAAA,IAAU,CAAC,IAAA,EAAM;AAClC,QAAA,MAAM,OAAA,GAA2B;AAAA,UAC/B,OAAA;AAAA,UACA,MAAA;AAAA,UACA,YAAA,EAAc,OAAO,CAAA,CAAE,YAAA,KAAiB,YAAY,CAAA,CAAE,YAAA,GAAe,EAAE,YAAA,GAAe,MAAA;AAAA,UACtF,IAAA;AAAA,UACA,SAAA,EAAW,WAAA,CAAY,CAAA,CAAE,iBAAiB,CAAA;AAAA,UAC1C,SAAS,CAAA,CAAE,eAAA,KAAoB,SAAY,WAAA,CAAY,CAAA,CAAE,eAAe,CAAA,GAAI,MAAA;AAAA,UAC5E,UAAA,EAAY,iBAAA,CAAkB,CAAA,CAAE,UAAU;AAAA,SAC5C;AACA,QAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,QAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACxC,UAAA,IAAI,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,EAAU,OAAA,CAAQ,aAAa,MAAA,CAAO,IAAA;AACjE,UAAA,IAAI,OAAO,MAAA,CAAO,OAAA,KAAY,QAAA,EAAU,OAAA,CAAQ,gBAAgB,MAAA,CAAO,OAAA;AAAA,QACzE;AACA,QAAA,GAAA,CAAI,KAAK,OAAO,CAAA;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,mBAAmB,OAAA,EAAoC;AACrE,EAAA,MAAM,MAAwB,EAAC;AAC/B,EAAA,MAAM,eAAgB,OAAA,EAAsD,YAAA;AAC5E,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,YAAY,GAAG,OAAO,GAAA;AAEzC,EAAA,KAAA,MAAW,MAAM,YAAA,EAAc;AAC7B,IAAA,MAAM,YAAa,EAAA,EAA8C,SAAA;AACjE,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC/B,IAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,MAAA,MAAM,aAAc,EAAA,EAA+C,UAAA;AACnE,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,EAAG;AAChC,MAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAC/B,QAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AAC3C,QAAA,MAAM,CAAA,GAAI,MAAA;AACV,QAAA,MAAM,UAAU,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,EAAE,OAAA,GAAU,MAAA;AAC5D,QAAA,IAAI,CAAC,OAAA,EAAS;AAGd,QAAA,IAAI,OAAgB,CAAA,CAAE,IAAA;AACtB,QAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,iBAAkB,IAAA,EAAkC;AAC1F,UAAA,IAAA,GAAQ,IAAA,CAAiC,WAAA;AAAA,QAC3C;AACA,QAAA,GAAA,CAAI,IAAA,CAAK;AAAA,UACP,OAAA;AAAA,UACA,MAAA,EAAQ,OAAO,CAAA,CAAE,MAAA,KAAW,YAAY,CAAA,CAAE,MAAA,GAAS,EAAE,MAAA,GAAS,MAAA;AAAA,UAC9D,SAAA,EAAW,CAAA,CAAE,YAAA,KAAiB,MAAA,GAAY,WAAA,CAAY,EAAE,YAAY,CAAA,GAAI,WAAA,CAAY,CAAA,CAAE,oBAAoB,CAAA;AAAA,UAC1G,cAAc,OAAO,CAAA,CAAE,YAAA,KAAiB,QAAA,GAAW,EAAE,YAAA,GAAe,MAAA;AAAA,UACpE,gBAAgB,OAAO,CAAA,CAAE,cAAA,KAAmB,QAAA,GAAW,EAAE,cAAA,GAAiB,MAAA;AAAA,UAC1E,IAAA;AAAA,UACA,UAAA,EAAY,iBAAA,CAAkB,CAAA,CAAE,UAAU;AAAA,SAC3C,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAQO,SAAS,sBAAA,CAAuB,MAA0B,GAAA,EAAmC;AAClG,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,MAAM,EAAA,GAAK,KAAK,WAAA,EAAY;AAC5B,IAAA,IAAI,EAAA,CAAG,WAAW,OAAO,CAAA,IAAK,GAAG,UAAA,CAAW,OAAO,GAAG,OAAO,OAAA;AAC7D,IAAA,IAAI,EAAA,CAAG,UAAA,CAAW,MAAM,CAAA,EAAG,OAAO,MAAA;AAClC,IAAA,IAAI,EAAA,CAAG,UAAA,CAAW,MAAM,CAAA,EAAG,OAAO,MAAA;AAClC,IAAA,IAAI,EAAA,CAAG,UAAA,CAAW,OAAO,CAAA,EAAG,OAAO,OAAA;AACnC,IAAA,IAAI,EAAA,CAAG,UAAA,CAAW,OAAO,CAAA,EAAG,OAAO,OAAA;AAAA,EACrC;AACA,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,IAAI,GAAA,IAAO,GAAG,OAAO,OAAA;AACrB,IAAA,IAAI,GAAA,IAAO,IAAI,OAAO,MAAA;AACtB,IAAA,IAAI,GAAA,IAAO,IAAI,OAAO,MAAA;AACtB,IAAA,IAAI,GAAA,IAAO,IAAI,OAAO,OAAA;AACtB,IAAA,OAAO,OAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA;AACT;AAUO,SAAS,iBAAA,CACd,OAAA,EACA,OAAA,GAAkF,EAAC,EAClE;AACjB,EAAA,MAAM,SAAA,GACJ,OAAA,CAAQ,UAAA,KAAe,CAAA,GACnB;AAAA,IACE,OAAA,EAAS,QAAQ,aAAA,IAAiB;AAAA;AAAA,GAEpC,GACA,MAAA;AACN,EAAA,OAAO;AAAA,IACL,IAAI,OAAA,CAAQ,MAAA;AAAA,IACZ,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,MAAMA,sBAAAA,CAAS,OAAA;AAAA,IACf,cAAc,OAAA,CAAQ,YAAA;AAAA,IACtB,UAAA,EAAY,CAAC,OAAA,CAAQ,YAAA;AAAA,IACrB,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,OAAA,EAAS,KAAA;AAAA,IACT,GAAI,SAAA,GAAY,EAAE,SAAA,KAAgC;AAAC,GACrD;AACF;AAEO,SAAS,iBAAiB,OAAA,EAAsC;AACrE,EAAA,OAAO;AAAA,IACL,OAAO,sBAAA,EAAuB;AAAA,IAC9B,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,KAAA,EAAO,sBAAA,CAAuB,OAAA,CAAQ,YAAA,EAAc,QAAQ,cAAc,CAAA;AAAA,IAC1E,OAAA,EAAS,OAAO,OAAA,CAAQ,IAAA,KAAS,QAAA,GAAW,OAAA,CAAQ,IAAA,GAAO,OAAA,CAAQ,IAAA,KAAS,MAAA,GAAY,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,GAAI,EAAA;AAAA,IAC/G,MAAM,OAAA,CAAQ;AAAA,GAChB;AACF;;;AChPA,IAAM,cAAA,GAAiB,6DAAA;AAahB,SAAS,iBAAiB,KAAA,EAAoD;AACnF,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,MAAM,CAAA,GAAI,cAAA,CAAe,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAC1C,EAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,EAAA,IAAI,CAAA,CAAE,CAAC,CAAA,KAAM,IAAA,EAAM,OAAO,IAAA;AAC1B,EAAA,IAAI,CAAA,CAAE,CAAC,CAAA,KAAM,kCAAA,EAAoC,OAAO,IAAA;AACxD,EAAA,IAAI,CAAA,CAAE,CAAC,CAAA,KAAM,kBAAA,EAAoB,OAAO,IAAA;AACxC,EAAA,OAAO,EAAE,OAAA,EAAS,CAAA,CAAE,CAAC,CAAA,EAAI,SAAS,CAAA,CAAE,CAAC,CAAA,EAAI,MAAA,EAAQ,EAAE,CAAC,CAAA,EAAI,KAAA,EAAO,CAAA,CAAE,CAAC,CAAA,EAAG;AACvE;AAEO,SAAS,iBAAA,CAAkB,OAAA,EAAiB,MAAA,EAAgB,OAAA,EAA0B;AAC3F,EAAA,OAAO,MAAM,OAAO,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,EAAI,OAAA,GAAU,OAAO,IAAI,CAAA,CAAA;AACzD;AASO,SAAS,aAAa,KAAA,EAAgD;AAC3E,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAoB;AACpC,EAAA,IAAI,CAAC,OAAO,OAAO,GAAA;AACnB,EAAA,KAAA,MAAW,KAAA,IAAS,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,EAAG;AACpC,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AAChC,IAAA,MAAM,OAAO,IAAA,KAAS,EAAA,GAAK,UAAU,OAAA,CAAQ,KAAA,CAAM,GAAG,IAAI,CAAA;AAC1D,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC3B,IAAA,IAAI,OAAO,EAAA,EAAI;AACf,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AACnC,IAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,CAAC,EAAE,IAAA,EAAK;AACzC,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,mBAAmB,QAAQ,CAAA;AAAA,IACvC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAA,GAAU,QAAA;AAAA,IACZ;AACA,IAAA,GAAA,CAAI,GAAA,CAAI,KAAK,OAAO,CAAA;AAAA,EACtB;AACA,EAAA,OAAO,GAAA;AACT;AAMO,SAAS,cAAc,OAAA,EAA+D;AAC3F,EAAA,MAAM,IAAA,GAAO,mBAAmB,GAAA,GAAM,OAAA,CAAQ,SAAQ,GAAI,MAAA,CAAO,QAAQ,OAAO,CAAA;AAChF,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,IAAA,EAAM;AAC/B,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,KAAA,CAAM,KAAK,CAAA,EAAG,GAAG,IAAI,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,EAClD;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AACvB;;;ACjCO,IAAM,cAAA,GAAiD;AAAA,EAC5D,QAAA,EAAU,EAAA;AAAA,EACV,OAAA,EAAS,EAAA;AAAA,EACT,iBAAiB,IAAA,GAAO;AAC1B;AAeA,IAAM,+BAAN,MAAuE;AAAA,EAC5D,gBAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EAET,YAAY,OAAA,EAAgD;AAC1D,IAAA,IAAA,CAAK,mBAAmB,OAAA,CAAQ,eAAA;AAChC,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,MAAA;AACvB,IAAA,IAAA,CAAK,UAAU,EAAE,GAAG,cAAA,EAAgB,GAAG,QAAQ,MAAA,EAAO;AAAA,EACxD;AAAA,EAEA,OAAO,UAAA,EAAiD;AACtD,IAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKL,aAAa,iBAAA,CAAkB,UAAA,CAAW,OAAA,EAAS,UAAA,CAAW,IAAI,IAAI;AAAA,KACxE;AAAA,EACF;AAAA,EAEA,OAAA,CAAQ,SAAqC,aAAA,EAAiD;AAC5F,IAAA,IAAI,CAAC,OAAA,IAAY,CAAC,OAAA,CAAQ,KAAA,IAAS,CAAC,OAAA,CAAQ,IAAA,IAAQ,OAAA,CAAQ,mBAAA,KAAwB,MAAA,EAAY;AAC9F,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,IAAI;AACF,MAAA,YAAA,GAAe,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA,CAAE,MAAA;AAAA,IACzC,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,MAAM,kEAAkE,CAAA;AAC7E,MAAA;AAAA,IACF;AACA,IAAA,IAAI,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,eAAA,EAAiB;AAC/C,MAAA,IAAA,CAAK,MAAM,4DAAA,EAA8D;AAAA,QACvE,KAAA,EAAO,YAAA;AAAA,QACP,KAAA,EAAO,KAAK,OAAA,CAAQ;AAAA,OACrB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,aAAA,CAAc,WAAW,CAAA;AACzD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,IAAA,CAAK,MAAM,gFAAgF,CAAA;AAC3F,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,KAAK,gBAAA,EAAiB;AACvC,IAAA,IAAI,CAAC,QAAA,IAAY,EAAE,QAAA,YAAoB,yBAAA,CAAA,EAA4B;AAGjE,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,eAAe,OAAA,CAAQ,KAAA,GAAQ,oBAAoB,OAAA,CAAQ,KAAK,IAAI,EAAC;AAC3E,IAAA,MAAM,cAAc,OAAA,CAAQ,IAAA,GAAO,mBAAmB,OAAA,CAAQ,IAAI,IAAI,EAAC;AAEvE,IAAA,IAAI,YAAA,CAAa,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU;AAC/C,MAAA,IAAA,CAAK,MAAM,kEAAA,EAAoE;AAAA,QAC7E,OAAO,YAAA,CAAa,MAAA;AAAA,QACpB,KAAA,EAAO,KAAK,OAAA,CAAQ;AAAA,OACrB,CAAA;AACD,MAAA;AAAA,IACF;AACA,IAAA,IAAI,WAAA,CAAY,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS;AAC7C,MAAA,IAAA,CAAK,MAAM,iEAAA,EAAmE;AAAA,QAC5E,MAAM,WAAA,CAAY,MAAA;AAAA,QAClB,KAAA,EAAO,KAAK,OAAA,CAAQ;AAAA,OACrB,CAAA;AACD,MAAA;AAAA,IACF;AAKA,IAAA,IAAI,CAAC,gBAAA,CAAiB,YAAA,EAAc,WAAA,EAAa,MAAA,CAAO,OAAO,CAAA,EAAG;AAChE,MAAA,IAAA,CAAK,MAAM,qFAAqF,CAAA;AAChG,MAAA;AAAA,IACF;AAMA,IAAA,IAAI,CAAC,mBAAA,CAAoB,YAAA,EAAc,MAAA,CAAO,MAAM,CAAA,EAAG;AACrD,MAAA,IAAA,CAAK,MAAM,4EAA4E,CAAA;AACvF,MAAA;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,WAAW,YAAA,EAAc;AAClC,MAAA,MAAM,QAAA,GAAW,kBAAkB,OAAO,CAAA;AAC1C,MAAA,MAAM,eAA6B,EAAE,IAAA,EAAMN,8BAAAA,CAAiB,YAAA,EAAc,cAAc,QAAA,EAAS;AACjG,MAAA,QAAA,CAAS,uBAAuB,YAAY,CAAA;AAG5C,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,MAAM,aAA2B,EAAE,IAAA,EAAMA,8BAAAA,CAAiB,UAAA,EAAY,cAAc,QAAA,EAAS;AAC7F,QAAA,QAAA,CAAS,uBAAuB,UAAU,CAAA;AAAA,MAC5C;AAAA,IACF;AACA,IAAA,KAAA,MAAW,WAAW,WAAA,EAAa;AACjC,MAAA,MAAM,GAAA,GAAM,iBAAiB,OAAO,CAAA;AACpC,MAAA,MAAM,KAAA,GAAkB,EAAE,IAAA,EAAM,KAAA,EAAO,GAAA,EAAI;AAC3C,MAAA,QAAA,CAAS,uBAAuB,KAAK,CAAA;AAAA,IACvC;AAKA,IAAA,IAAI,OAAO,OAAA,CAAQ,mBAAA,KAAwB,QAAA,EAAU;AACnD,MAAA,MAAM,WAAW,YAAA,CAAa,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,eAAe,CAAC,CAAA;AAC1D,MAAA,MAAM,WAAA,GAA2B;AAAA,QAC/B,IAAA,EAAM,QAAA;AAAA,QACN,MAAA,EAAQ;AAAA,UACN,UAAU,sBAAA,EAAuB;AAAA,UACjC,SAAA,sBAAe,IAAA,EAAK;AAAA,UACpB,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,IAAA,EAAM,yBAAA;AAAA,UACN,OAAO,OAAA,CAAQ,mBAAA;AAAA,UACf,QAAQ,EAAE,MAAA,EAAQ,WAAW,OAAA,GAAU,IAAA,EAAM,UAAU,QAAA,EAAS;AAAA,UAChE,kBAAA,EAAoB;AAAA,YAClB,SAAS,MAAA,CAAO,OAAA;AAAA,YAChB,QAAQ,MAAA,CAAO,MAAA;AAAA,YACf,YAAYqB,wBAAA,CAAW,IAAA;AAAA,YACvB,GAAI,QAAQ,QAAA,GAAW,EAAE,YAAY,OAAA,CAAQ,QAAA,KAAa;AAAC;AAC7D;AACF,OACF;AACA,MAAA,QAAA,CAAS,uBAAuB,WAAW,CAAA;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,KAAA,CAAM,SAAiB,IAAA,EAAsC;AAC3D,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,CAAA,2BAAA,EAA8B,OAAO,IAAI,IAAI,CAAA;AAAA,IACjE;AAAA,EACF;AACF,CAAA;AAEA,SAAS,gBAAA,CAAiB,KAAA,EAA0B,IAAA,EAAwB,QAAA,EAA2B;AACrG,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO,IAAI,CAAA,CAAE,OAAA,KAAY,UAAU,OAAO,KAAA;AAC1D,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM,IAAI,CAAA,CAAE,OAAA,KAAY,UAAU,OAAO,KAAA;AACzD,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,mBAAA,CAAoB,OAA0B,UAAA,EAA6B;AAClF,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC/B,EAAA,MAAM,KAAA,mBAAQ,IAAI,GAAA,CAAY,CAAC,UAAU,CAAC,CAAA;AAC1C,EAAA,KAAA,MAAW,CAAA,IAAK,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,EAAE,MAAM,CAAA;AACzC,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,CAAC,EAAE,YAAA,EAAc;AACnB,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,CAAC,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,YAAY,CAAA,EAAG;AAC9B,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,+BACd,OAAA,EAC0B;AAC1B,EAAA,OAAO,IAAI,6BAA6B,OAAO,CAAA;AACjD;ACvJO,IAAe,eAAf,MAA6D;AAAA;AAAA,EAKxD,MAAA;AAAA;AAAA,EAGS,UAAA;AAAA;AAAA,EAGnB,SAAA,GAAqB,KAAA;AAAA;AAAA,EAGrB,IAAI,UAAA,GAAsB;AACxB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CAAY,MAAA,GAA6B,EAAC,EAAG;AAC3C,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAElB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,QAAQ,CAAA;AAErD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,MAAA,IAAU,IAAIC,oBAAA,CAAc,EAAE,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,CAAA;AAAA,EACnG;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,MAAA,EAA6B;AACvC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAEd,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,kCAAA,EAAqC,IAAA,CAAK,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,QAAA,EAAqE;AAC3F,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAOC,eAAA,CAAS,IAAA;AAAA,IAClB;AAGA,IAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,MAAA,OAAO,QAAA;AAAA,IACT;AAGA,IAAA,MAAM,WAAA,GAAwC;AAAA,MAC5C,OAAOA,eAAA,CAAS,KAAA;AAAA,MAChB,MAAMA,eAAA,CAAS,IAAA;AAAA,MACf,MAAMA,eAAA,CAAS,IAAA;AAAA,MACf,OAAOA,eAAA,CAAS;AAAA,KAClB;AAEA,IAAA,OAAO,WAAA,CAAY,QAAQ,CAAA,IAAKA,eAAA,CAAS,IAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOU,WAAA,CAAY,MAAA,EAAgB,KAAA,GAA0B,MAAA,EAAc;AAC5E,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,CAAE,CAAA,EAAG,KAAK,IAAI,CAAA,WAAA,EAAc,MAAM,CAAA,CAAE,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAgB,mBAAmB,KAAA,EAA4C;AAC7E,IAAA,IAAI,IAAA,CAAK,WAAW,mBAAA,EAAqB;AACvC,MAAA,IAAI;AACF,QAAA,MAAM,gBAAgB,MAAM,IAAA,CAAK,UAAA,CAAW,mBAAA,CAAoB,MAAM,YAAY,CAAA;AAClF,QAAA,OAAO;AAAA,UACL,GAAG,KAAA;AAAA,UACH,YAAA,EAAc;AAAA,SAChB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,8BAAA,CAAA,EAAkC;AAAA,UAC9D,KAAA;AAAA,UACA,MAAA,EAAQ,MAAM,YAAA,CAAa,EAAA;AAAA,UAC3B,OAAA,EAAS,MAAM,YAAA,CAAa;AAAA,SAC7B,CAAA;AAAA,MAEH;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,eAAe,KAAA,EAA2C;AACxD,IAAA,OAAO,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,mBAAmB,KAAA,EAAoC;AAC3D,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,kBAAA,CAAmB,KAAK,CAAA;AAC1D,IAAA,MAAM,IAAA,CAAK,oBAAoB,cAAc,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmCA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,mCAAA,CAAqC,CAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAA,GAA0B;AAC9B,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,kBAAA,CAAoB,CAAA;AAAA,EACnD;AACF;AC5LO,IAAM,YAAN,MAA6D;AAAA;AAAA,EAElE,SAAA;AAAA;AAAA,EAEA,WAAA;AAAA;AAAA,EAEA,kBAAA;AAAA;AAAA,EAEA,OAAA;AAAA;AAAA,EAEA,MAAA;AAAA;AAAA,EAEA,KAAA;AAAA;AAAA,EAEA,cAAA;AAAA;AAAA,EAEA,SAAA;AAAA;AAAA,EAEA,UAAA;AAAA;AAAA,EAEA,eAAA;AAAA;AAAA,EAEA,iBAAA;AAAA;AAAA,EAGS,SAAA;AAAA,EAET,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,OAAA,uBAAc,GAAA,EAAI;AACvB,IAAA,IAAA,CAAK,MAAA,uBAAa,GAAA,EAAI;AACtB,IAAA,IAAA,CAAK,cAAA,uBAAqB,GAAA,EAAI;AAC9B,IAAA,IAAA,CAAK,KAAA,uBAAY,GAAA,EAAI;AACrB,IAAA,IAAA,CAAK,SAAA,uBAAgB,GAAA,EAAI;AACzB,IAAA,IAAA,CAAK,UAAA,uBAAiB,GAAA,EAAI;AAC1B,IAAA,IAAA,CAAK,kBAAA,GAAqB,KAAA;AAC1B,IAAA,IAAA,CAAK,kBAAkB,EAAC;AACxB,IAAA,IAAA,CAAK,iBAAA,uBAAwB,GAAA,EAAI;AACjC,IAAA,IAAA,CAAK,SAAA,uBAAgB,IAAA,EAAK;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAA,GAAmB;AACjB,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,WAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,IAAA,EAAqD;AAC3D,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,MAAA;AACxB,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,QAAA;AACtB,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAA,GAAiC;AAC/B,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAA,GAA2B;AACzB,IAAA,OAAO,IAAA,CAAK,kBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,qBAAA,GAA8B;AAC5B,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAA,CAAc,KAAa,KAAA,EAAsB;AAC/C,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,GAAA,EAAsB;AAClC,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,GAAA,EAAsB;AAClC,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,kBAAkB,IAAA,EAKT;AACP,IAAA,MAAM,WAAA,GAA2B;AAAA,MAC/B,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,QAAA,EAAU,KAAK,QAAA,IAAY,CAAA;AAAA,MAC3B,QAAA,EAAU,IAAA,CAAK,QAAA,oBAAY,IAAI,IAAA;AAAK,KACtC;AAEA,IAAA,IAAI,IAAA,CAAK,eAAe,MAAA,EAAQ;AAC9B,MAAA,IAAA,CAAK,eAAA,CAAgB,KAAK,WAAW,CAAA;AAAA,IACvC,CAAA,MAAO;AACL,MAAA,MAAM,QAAQ,IAAA,CAAK,iBAAA,CAAkB,IAAI,IAAA,CAAK,UAAU,KAAK,EAAC;AAC9D,MAAA,KAAA,CAAM,KAAK,WAAW,CAAA;AACtB,MAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,IAAA,CAAK,UAAA,EAAY,KAAK,CAAA;AAAA,IACnD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,uBAAA,GAAyC;AACvC,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,eAAe,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,oBAAoB,IAAA,EAAyC;AAC3D,IAAA,OAAO,CAAC,GAAI,IAAA,CAAK,iBAAA,CAAkB,IAAI,IAAA,CAAK,MAAM,CAAA,IAAK,EAAG,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAA,GAA4B;AAC1B,IAAA,IAAA,CAAK,kBAAkB,EAAC;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,IAAA,EAAgC;AAC9C,IAAA,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,GAA2B;AACzB,IAAA,IAAI,KAAA,GAAQ,KAAK,eAAA,CAAgB,MAAA;AACjC,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,iBAAA,CAAkB,MAAA,EAAO,EAAG;AACnD,MAAA,KAAA,IAAS,KAAA,CAAM,MAAA;AAAA,IACjB;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAA,GAAoC;AAClC,IAAA,MAAM,GAAA,GAAqB,CAAC,GAAG,IAAA,CAAK,eAAe,CAAA;AACnD,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,iBAAA,CAAkB,MAAA,EAAO,EAAG;AACnD,MAAA,GAAA,CAAI,IAAA,CAAK,GAAG,KAAK,CAAA;AAAA,IACnB;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,UAAU,IAAA,EAAkE;AAC1E,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,KAAK,YAAY,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,IAAA,EAA8C;AACxD,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,QAAQ,IAAA,EAAqD;AAC3D,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,KAAK,QAAQ,CAAA;AAC1C,IAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,IAAA,EAAmC;AACzC,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,IAAA,EAAiD;AACvD,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,IAAA,EAAgC;AACtC,IAAA,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,IAAA,EAAmC;AAC9C,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAA,GAA0B;AACxB,IAAA,OAAO,KAAK,cAAA,CAAe,IAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,aAAA,GAA0B;AAC5B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,cAAc,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,SAAS,IAAA,EAAwD;AAC/D,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,KAAK,SAAS,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,YAAY,IAAA,EAAqD;AAC/D,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,KAAK,QAAQ,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,IAAA,EAAiD;AAC3D,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,UAAU,IAAA,EAAqE;AAC7E,IAAA,MAAM,QAAA,GAAW,KAAK,IAAA,CAAK,YAAA;AAC3B,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC7B,QAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA;AAAA,MACjC;AACA,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC9B,QAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AAAA,MAClC;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,gBAAgB,IAAA,EAAiF;AAC/F,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,IAAK,KAAK,OAAA,EAAQ;AAAA,EAC9C;AACF;AAGA,IAAM,gCAAA,GAAmC,CAAA;AACzC,IAAM,0BAAA,GAA6B,GAAA;AACnC,IAAM,8BAAA,GAAiC,GAAA;AACvC,IAAM,kCAAA,GAAqC,GAAA;AAC3C,IAAM,wBAAA,GAA2B,GAAA;AAoC1B,IAAe,gBAAA,GAAf,cAMG,YAAA,CAAa;AAAA;AAAA,EAErB,SAAA,uBAAgB,GAAA,EAAoE;AAAA;AAAA,EAEpF,gBAAA,GAAmB,KAAA;AAAA;AAAA,EAEnB,6BAAA,GAAgC,KAAA;AAAA;AAAA,EAEhC,gBAAA,uBAAuB,GAAA,EAA2C;AAAA;AAAA;AAAA;AAAA,EAK/C,MAAA;AAAA;AAAA,EAGV,sBAAA;AAAA;AAAA,EAEA,gBAAA;AAAA;AAAA,EAEA,oBAAA;AAAA;AAAA,EAEA,wBAAA;AAAA;AAAA,EAEA,eAAA;AAAA,EAET,YAAY,MAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,MAAM,CAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAEd,IAAA,IAAA,CAAK,sBAAA,GAAyB,OAAO,qBAAA,IAAyB,gCAAA;AAC9D,IAAA,IAAA,CAAK,gBAAA,GAAmB,OAAO,eAAA,IAAmB,0BAAA;AAClD,IAAA,IAAA,CAAK,oBAAA,GAAuB,OAAO,mBAAA,IAAuB,8BAAA;AAC1D,IAAA,IAAA,CAAK,wBAAA,GAA2B,OAAO,uBAAA,IAA2B,kCAAA;AAClE,IAAA,IAAA,CAAK,eAAA,GAAkB,OAAO,cAAA,IAAkB,wBAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,+BAA+B,OAAA,EAAuB;AACpD,IAAA,YAAA,CAAa,MAAM;AACjB,MAAA,IAAA,CAAK,sBAAA,CAAuB,OAAO,CAAA,CAAE,KAAA,CAAM,CAAA,KAAA,KAAS;AAClD,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,yCAAA,CAAA,EAA6C,EAAE,KAAA,EAAO,OAAA,EAAS,CAAA;AAAA,MAC/F,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,0BAAA,CAA2B,SAAiB,MAAA,EAAsB;AAChE,IAAA,YAAA,CAAa,MAAM;AACjB,MAAA,IAAA,CAAK,kBAAA,CAAmB,OAAA,EAAS,MAAM,CAAA,CAAE,MAAM,CAAA,KAAA,KAAS;AACtD,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,IAAI,oCAAoC,EAAE,KAAA,EAAO,OAAA,EAAS,MAAA,EAAQ,CAAA;AAAA,MAC9F,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBAAuB,OAAA,EAAgC;AAC3D,IAAA,IAAI,KAAK,gBAAA,EAAkB;AAE3B,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AAC5C,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,MAAM,KAAA,GAAQ,UAAU,uBAAA,EAAwB;AAChD,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAExB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,aAAA,EAAgB,KAAA,CAAM,MAAM,CAAA,wBAAA,CAAA,EAA4B,EAAE,OAAA,EAAS,CAAA;AAGjG,IAAA,MAAM,SAAwB,EAAC;AAC/B,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,KAAA,MAAW,eAAe,KAAA,EAAO;AAE/B,MAAA,IAAI,MAAM,WAAA,CAAY,QAAA,CAAS,OAAA,EAAQ,GAAI,KAAK,gBAAA,EAAkB;AAChE,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,kCAAA,CAAA,EAAsC;AAAA,UACjE,OAAA;AAAA,UACA,MAAA,EAAQ,WAAA,CAAY,KAAA,CAAM,YAAA,CAAa,EAAA;AAAA,UACvC,YAAY,WAAA,CAAY,UAAA;AAAA,UACxB,UAAU,WAAA,CAAY,QAAA;AAAA,UACtB,UAAU,WAAA,CAAY;AAAA,SACvB,CAAA;AACD,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,WAAA,CAAY,QAAA,IAAY,IAAA,CAAK,sBAAA,EAAwB;AACvD,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,oCAAA,CAAA,EAAwC;AAAA,UACnE,OAAA;AAAA,UACA,MAAA,EAAQ,WAAA,CAAY,KAAA,CAAM,YAAA,CAAa,EAAA;AAAA,UACvC,YAAY,WAAA,CAAY,UAAA;AAAA,UACxB,UAAU,WAAA,CAAY;AAAA,SACvB,CAAA;AACD,QAAA;AAAA,MACF;AAGA,MAAA,WAAA,CAAY,QAAA,EAAA;AACZ,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,sBAAA,CAAuB,aAAa,SAAS,CAAA;AAE1E,MAAA,IAAI,CAAC,SAAA,EAAW;AAEd,QAAA,MAAM,QAAA,GAAW,WAAA,CAAY,KAAA,CAAM,YAAA,CAAa,YAAA;AAChD,QAAA,IAAI,QAAA,IAAY,SAAA,CAAU,eAAA,EAAgB,EAAG;AAE3C,UAAA,SAAA,CAAU,iBAAA,CAAkB;AAAA,YAC1B,OAAO,WAAA,CAAY,KAAA;AAAA,YACnB,UAAA,EAAY,QAAA;AAAA,YACZ,UAAU,WAAA,CAAY,QAAA;AAAA,YACtB,UAAU,WAAA,CAAY;AAAA,WACvB,CAAA;AAAA,QACH,CAAA,MAAO;AACL,UAAA,MAAA,CAAO,KAAK,WAAW,CAAA;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAGA,IAAA,SAAA,CAAU,mBAAA,EAAoB;AAC9B,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAE1B,MAAA,SAAA,CAAU,iBAAA,CAAkB;AAAA,QAC1B,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,UAAA,EAAY,MAAA;AAAA,QACZ,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,UAAU,KAAA,CAAM;AAAA,OACjB,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,CAAmB,OAAA,EAAiB,MAAA,EAA+B;AACvE,IAAA,IAAI,KAAK,gBAAA,EAAkB;AAE3B,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AAC5C,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,mBAAA,CAAoB,EAAE,QAAQ,CAAA;AACtD,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAExB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,aAAA,EAAgB,KAAA,CAAM,MAAM,CAAA,wBAAA,CAAA,EAA4B,EAAE,OAAA,EAAS,MAAA,EAAQ,CAAA;AAEzG,IAAA,MAAM,SAAwB,EAAC;AAC/B,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,KAAA,MAAW,eAAe,KAAA,EAAO;AAE/B,MAAA,IAAI,MAAM,WAAA,CAAY,QAAA,CAAS,OAAA,EAAQ,GAAI,KAAK,gBAAA,EAAkB;AAChE,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,kCAAA,CAAA,EAAsC;AAAA,UACjE,OAAA;AAAA,UACA,MAAA,EAAQ,WAAA,CAAY,KAAA,CAAM,YAAA,CAAa,EAAA;AAAA,UACvC,YAAY,WAAA,CAAY,UAAA;AAAA,UACxB,UAAU,WAAA,CAAY,QAAA;AAAA,UACtB,UAAU,WAAA,CAAY;AAAA,SACvB,CAAA;AACD,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,WAAA,CAAY,QAAA,IAAY,IAAA,CAAK,sBAAA,EAAwB;AACvD,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,oCAAA,CAAA,EAAwC;AAAA,UACnE,OAAA;AAAA,UACA,MAAA,EAAQ,WAAA,CAAY,KAAA,CAAM,YAAA,CAAa,EAAA;AAAA,UACvC,YAAY,WAAA,CAAY,UAAA;AAAA,UACxB,UAAU,WAAA,CAAY;AAAA,SACvB,CAAA;AACD,QAAA;AAAA,MACF;AAGA,MAAA,WAAA,CAAY,QAAA,EAAA;AACZ,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,sBAAA,CAAuB,aAAa,SAAS,CAAA;AAE1E,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,MAAA,CAAO,KAAK,WAAW,CAAA;AAAA,MACzB;AAAA,IACF;AAGA,IAAA,SAAA,CAAU,eAAA,CAAgB,EAAE,MAAA,EAAQ,CAAA;AACpC,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAE1B,MAAA,SAAA,CAAU,iBAAA,CAAkB;AAAA,QAC1B,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,UAAA,EAAY,MAAA;AAAA,QACZ,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,UAAU,KAAA,CAAM;AAAA,OACjB,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,sBAAA,CACJ,WAAA,EACA,SAAA,EACkB;AAClB,IAAA,MAAM,EAAE,OAAM,GAAI,WAAA;AAClB,IAAA,MAAM,EAAE,cAAa,GAAI,KAAA;AAGzB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AAEnC,IAAA,IAAI;AACF,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,iBAAA,EAAmB;AACtB,UAAA,SAAA,CAAU,SAAA,CAAU,EAAE,MAAA,EAAQ,YAAA,CAAa,IAAI,YAAA,EAAc,YAAA,CAAa,cAAc,CAAA;AACxF,UAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,WAAA,CAAY,EAAE,IAAA,EAAM,YAAA,EAAc,WAAW,CAAA;AAC1E,UAAA,IAAI,SAAA,EAAW;AACb,YAAA,IAAI,CAAC,KAAK,qBAAA,EAAuB;AAC/B,cAAA,SAAA,CAAU,SAAS,EAAE,OAAA,EAAS,YAAA,CAAa,EAAA,EAAI,WAAW,CAAA;AAAA,YAC5D;AAEA,YAAA,IAAA,CAAK,0BAAA,CAA2B,YAAA,CAAa,OAAA,EAAS,YAAA,CAAa,EAAE,CAAA;AACrE,YAAA,OAAO,IAAA;AAAA,UACT;AACA,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,QAEA,KAAK,iBAAA,EAAmB;AACtB,UAAA,SAAA,CAAU,SAAA,CAAU,EAAE,MAAA,EAAQ,YAAA,CAAa,IAAI,YAAA,EAAc,YAAA,CAAa,cAAc,CAAA;AACxF,UAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,EAAE,IAAA,EAAM,YAAA,EAAc,WAAW,CAAA;AACxE,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,SAAA,CAAU,QAAQ,EAAE,MAAA,EAAQ,YAAA,CAAa,EAAA,EAAI,UAAU,CAAA;AAEvD,YAAA,IAAI,aAAa,UAAA,EAAY;AAC3B,cAAA,SAAA,CAAU,qBAAA,EAAsB;AAAA,YAClC;AAEA,YAAA,IAAA,CAAK,0BAAA,CAA2B,YAAA,CAAa,OAAA,EAAS,YAAA,CAAa,EAAE,CAAA;AACrE,YAAA,OAAO,IAAA;AAAA,UACT;AACA,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,QAEA,KAAK,kBAAA,EAAoB;AACvB,UAAA,MAAM,KAAK,WAAA,CAAY,EAAE,IAAA,EAAM,YAAA,EAAc,WAAW,CAAA;AACxD,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,QAEA,KAAK,eAAA,EAAiB;AACpB,UAAA,SAAA,CAAU,OAAA,CAAQ,EAAE,MAAA,EAAQ,YAAA,CAAa,IAAI,CAAA;AAC7C,UAAA,MAAM,KAAK,WAAA,CAAY,EAAE,IAAA,EAAM,YAAA,EAAc,WAAW,CAAA;AAExD,UAAA,IAAI,SAAA,CAAU,eAAA,EAAgB,KAAM,CAAA,EAAG;AACrC,YAAA,IAAA,CAAK,gBAAA,CAAiB,aAAa,OAAO,CAAA;AAAA,UAC5C;AACA,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,QACA;AAEE,UAAA,OAAO,KAAA;AAAA;AACX,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,IAAI,mCAAmC,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,CAAA;AACzF,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,iBAAiB,OAAA,EAAuB;AAEtC,IAAA,IAAA,CAAK,wBAAwB,OAAO,CAAA;AAEpC,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,wBAAA,EAA2B,IAAA,CAAK,oBAAoB,CAAA,EAAA,CAAA,EAAM,EAAE,OAAA,EAAS,CAAA;AAEnG,IAAA,MAAM,OAAA,GAAU,WAAW,MAAM;AAC/B,MAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,OAAO,CAAA;AACpC,MAAA,IAAA,CAAK,gBAAgB,OAAO,CAAA;AAAA,IAC9B,CAAA,EAAG,KAAK,oBAAoB,CAAA;AAE5B,IAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,OAAA,EAAS,OAAO,CAAA;AAG1C,IAAA,IAAA,CAAK,yBAAA,EAA0B;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAwB,OAAA,EAAuB;AAC7C,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,OAAO,CAAA;AACzD,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,YAAA,CAAa,eAAe,CAAA;AAC5B,MAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,OAAO,CAAA;AACpC,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,6BAAA,CAAA,EAAiC,EAAE,SAAS,CAAA;AAAA,IAC5E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,OAAA,EAAuB;AACrC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AAC5C,IAAA,IAAI,CAAC,SAAA,EAAW;AAGhB,IAAA,MAAM,cAAA,GAAiB,UAAU,kBAAA,EAAmB;AACpD,IAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,WAAA,EAAc,cAAA,CAAe,MAAM,CAAA,2BAAA,CAAA,EAA+B;AAAA,QAC7F,OAAA;AAAA,QACA,cAAA,EAAgB,cAAA,CAAe,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,UACvC,MAAA,EAAQ,CAAA,CAAE,KAAA,CAAM,YAAA,CAAa,EAAA;AAAA,UAC7B,YAAY,CAAA,CAAE,UAAA;AAAA,UACd,UAAU,CAAA,CAAE,QAAA;AAAA,UACZ,UAAU,CAAA,CAAE;AAAA,SACd,CAAE;AAAA,OACH,CAAA;AAAA,IACH;AAGA,IAAA,IAAA,CAAK,SAAA,CAAU,OAAO,OAAO,CAAA;AAE7B,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,uBAAA,CAAA,EAA2B,EAAE,SAAS,CAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,yBAAA,GAAkC;AAChC,IAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,IAAA,IAAQ,IAAA,CAAK,wBAAA,EAA0B;AAC/D,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CAAiB,IAAA,GAAO,IAAA,CAAK,wBAAA;AACnD,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,CAAA,EAAG,KAAK,IAAI,CAAA,+CAAA,EAAkD,QAAQ,CAAA,OAAA,CAAA,EAAW;AAAA,MAChG,YAAA,EAAc,KAAK,gBAAA,CAAiB,IAAA;AAAA,MACpC,KAAK,IAAA,CAAK;AAAA,KACX,CAAA;AAGD,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,SAAA,CAAU,IAAA,EAAK,EAAG;AAC3C,MAAA,IAAI,WAAW,QAAA,EAAU;AAEzB,MAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,OAAO,CAAA,EAAG;AACtC,QAAA,IAAA,CAAK,wBAAwB,OAAO,CAAA;AACpC,QAAA,IAAA,CAAK,gBAAgB,OAAO,CAAA;AAC5B,QAAA,OAAA,EAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eAAA,GAAiC;AAErC,IAAA,IAAI,KAAK,SAAA,CAAU,IAAA,IAAQ,IAAA,CAAK,eAAA,IAAmB,KAAK,6BAAA,EAA+B;AACrF,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,6BAAA,GAAgC,IAAA;AACrC,IAAA,IAAI;AAEF,MAAA,IAAI,IAAA,CAAK,SAAA,CAAU,IAAA,IAAQ,IAAA,CAAK,eAAA,EAAiB;AAC/C,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,IAAA,GAAO,IAAA,CAAK,eAAA;AAC5C,MAAA,IAAA,CAAK,OAAO,IAAA,CAAK,CAAA,EAAG,KAAK,IAAI,CAAA,oCAAA,EAAuC,QAAQ,CAAA,cAAA,CAAA,EAAkB;AAAA,QAC5F,UAAA,EAAY,KAAK,SAAA,CAAU,IAAA;AAAA,QAC3B,KAAK,IAAA,CAAK;AAAA,OACX,CAAA;AAED,MAAA,MAAM,MAAA,GAAwB;AAAA,QAC5B,EAAA,EAAI,oBAAA;AAAA,QACJ,OAAA,EAAS,6CAAA;AAAA,QACT,MAAA,EAAQ,sBAAA;AAAA,QACR,QAAA,EAAU;AAAA,OACZ;AAEA,MAAA,IAAI,OAAA,GAAU,CAAA;AAEd,MAAA,KAAA,MAAW,WAAW,CAAC,GAAG,KAAK,SAAA,CAAU,IAAA,EAAM,CAAA,EAAG;AAChD,QAAA,IAAI,WAAW,QAAA,EAAU;AAEzB,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AAC5C,QAAA,IAAI,SAAA,EAAW;AAEb,UAAA,KAAA,MAAW,MAAA,IAAU,UAAU,aAAA,EAAe;AAC5C,YAAA,MAAM,IAAA,GAAO,SAAA,CAAU,OAAA,CAAQ,EAAE,QAAQ,CAAA;AACzC,YAAA,IAAI,IAAA,EAAM;AACR,cAAA,MAAM,KAAK,UAAA,CAAW,EAAE,IAAA,EAAM,SAAA,EAAW,QAAQ,CAAA;AAAA,YACnD;AAAA,UACF;AAGA,UAAA,IAAA,CAAK,wBAAwB,OAAO,CAAA;AACpC,UAAA,IAAA,CAAK,gBAAgB,OAAO,CAAA;AAC5B,UAAA,OAAA,EAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,6BAAA,GAAgC,KAAA;AAAA,IACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAgB,uBAAuB,KAAA,EAA4C;AACjF,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAgB,uBAAA,GAAyC;AAAA,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4FhD,iBAAA,GAAoB,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOpB,oBAAA,GAAuB,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOvB,qBAAA,GAAwB,KAAA;AAAA,EAE1B,UAAU,KAAA,EAAmG;AACnH,IAAA,IAAI,KAAA,CAAM,aAAa,OAAA,EAAS;AAC9B,MAAA,OAAO,iBAAA;AAAA,IACT;AACA,IAAA,MAAM,YAAY,KAAA,CAAM,IAAA;AACxB,IAAA,QAAQ,SAAA;AAAW,MACjB,KAAKvB,8BAAAA,CAAiB,YAAA;AACpB,QAAA,OAAO,iBAAA;AAAA,MACT,KAAKA,8BAAAA,CAAiB,YAAA;AACpB,QAAA,OAAO,kBAAA;AAAA,MACT,KAAKA,8BAAAA,CAAiB,UAAA;AACpB,QAAA,OAAO,eAAA;AAAA,MACT,SAAS;AAEP,QAAA,MAAM,gBAAA,GAA0B,SAAA;AAChC,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,gBAAgB,CAAA,CAAE,CAAA;AAAA,MAC7D;AAAA;AACF,EACF;AAAA,EAEA,MAAgB,oBAAoB,KAAA,EAAoC;AACtE,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AACnC,IAAA,IAAI,MAAA,IAAU,kBAAA,IAAsB,IAAA,CAAK,oBAAA,EAAsB;AAC7D,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa,OAAA;AACnC,IAAA,MAAM,YAAY,IAAA,CAAK,YAAA,CAAa,EAAE,OAAA,EAAS,QAAQ,CAAA;AAEvD,IAAA,MAAM,EAAE,YAAA,EAAa,GAAI,MAAM,IAAA,CAAK,uBAAuB,KAAK,CAAA;AAGhE,IAAA,IAAI,CAAC,IAAA,CAAK,iBAAA,IAAqB,CAAC,SAAA,CAAU,SAAQ,EAAG;AACnD,MAAA,IAAI,aAAa,UAAA,EAAY;AAC3B,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,eAAA,CAAA,EAAmB;AAAA,UAC/C,SAAS,YAAA,CAAa,OAAA;AAAA,UACtB,QAAQ,YAAA,CAAa;AAAA,SACtB,CAAA;AACD,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,EAAE,IAAA,EAAM,YAAA,EAAc,WAAW,CAAA;AACxE,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,aAAA,CAAA,EAAiB;AAAA,YAC7C,SAAS,YAAA,CAAa,OAAA;AAAA,YACtB,QAAQ,YAAA,CAAa;AAAA,WACtB,CAAA;AACD,UAAA,SAAA,CAAU,QAAQ,EAAE,MAAA,EAAQ,YAAA,CAAa,EAAA,EAAI,UAAU,CAAA;AAEvD,UAAA,IAAA,CAAK,+BAA+B,OAAO,CAAA;AAAA,QAC7C;AAAA,MAGF,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,oDAAA,CAAA,EAAwD;AAAA,UACpF,SAAS,YAAA,CAAa,OAAA;AAAA,UACtB,QAAQ,YAAA,CAAa;AAAA,SACtB,CAAA;AACD,QAAA,SAAA,CAAU,iBAAA,CAAkB,EAAE,KAAA,EAAO,UAAA,EAAY,QAAQ,CAAA;AACzD,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,YAAA,CAAa,QAAA,IAAY,IAAA,CAAK,IAAA,IAAQ,aAAa,QAAA,EAAU;AAC/D,MAAA,MAAM,QAAA,GAAW,YAAA,CAAa,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAChD,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,iCAAA,CAAA,EAAqC;AAAA,QACjE,SAAS,YAAA,CAAa,OAAA;AAAA,QACtB,QAAQ,YAAA,CAAa,EAAA;AAAA,QACrB;AAAA,OACD,CAAA;AACD,MAAA,SAAA,CAAU,YAAY,EAAE,MAAA,EAAQ,YAAA,CAAa,EAAA,EAAI,UAAU,CAAA;AAAA,IAC7D;AAEA,IAAA,IAAI;AACF,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,iBAAA,EAAmB;AACtB,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,gBAAA,CAAA,EAAoB;AAAA,YAChD,SAAS,YAAA,CAAa,OAAA;AAAA,YACtB,QAAQ,YAAA,CAAa;AAAA,WACtB,CAAA;AACD,UAAA,SAAA,CAAU,SAAA,CAAU,EAAE,MAAA,EAAQ,YAAA,CAAa,IAAI,YAAA,EAAc,YAAA,CAAa,cAAc,CAAA;AACxF,UAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,WAAA,CAAY,EAAE,IAAA,EAAM,YAAA,EAAc,WAAW,CAAA;AAC1E,UAAA,IAAI,SAAA,EAAW;AACb,YAAA,IAAI,CAAC,KAAK,qBAAA,EAAuB;AAC/B,cAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,2BAAA,CAAA,EAA+B;AAAA,gBAC3D,SAAS,YAAA,CAAa,OAAA;AAAA,gBACtB,QAAQ,YAAA,CAAa;AAAA,eACtB,CAAA;AACD,cAAA,SAAA,CAAU,SAAS,EAAE,OAAA,EAAS,YAAA,CAAa,EAAA,EAAI,WAAW,CAAA;AAAA,YAC5D;AAEA,YAAA,IAAA,CAAK,0BAAA,CAA2B,OAAA,EAAS,YAAA,CAAa,EAAE,CAAA;AAAA,UAC1D,CAAA,MAAO;AAEL,YAAA,MAAM,WAAW,YAAA,CAAa,YAAA;AAC9B,YAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,+BAAA,CAAA,EAAmC;AAAA,cAC/D,SAAS,YAAA,CAAa,OAAA;AAAA,cACtB,QAAQ,YAAA,CAAa,EAAA;AAAA,cACrB,YAAY,QAAA,IAAY;AAAA,aACzB,CAAA;AACD,YAAA,SAAA,CAAU,kBAAkB,EAAE,KAAA,EAAO,UAAA,EAAY,QAAA,IAAY,QAAQ,CAAA;AAAA,UACvE;AACA,UAAA;AAAA,QACF;AAAA,QACA,KAAK,iBAAA,EAAmB;AACtB,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,qBAAA,CAAA,EAAyB;AAAA,YACrD,SAAS,YAAA,CAAa,OAAA;AAAA,YACtB,QAAQ,YAAA,CAAa;AAAA,WACtB,CAAA;AACD,UAAA,SAAA,CAAU,SAAA,CAAU,EAAE,MAAA,EAAQ,YAAA,CAAa,IAAI,YAAA,EAAc,YAAA,CAAa,cAAc,CAAA;AACxF,UAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,EAAE,IAAA,EAAM,YAAA,EAAc,WAAW,CAAA;AACxE,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,0BAAA,CAAA,EAA8B;AAAA,cAC1D,SAAS,YAAA,CAAa,OAAA;AAAA,cACtB,QAAQ,YAAA,CAAa;AAAA,aACtB,CAAA;AACD,YAAA,SAAA,CAAU,QAAQ,EAAE,MAAA,EAAQ,YAAA,CAAa,EAAA,EAAI,UAAU,CAAA;AAEvD,YAAA,IAAI,aAAa,UAAA,EAAY;AAC3B,cAAA,SAAA,CAAU,qBAAA,EAAsB;AAChC,cAAA,IAAA,CAAK,+BAA+B,OAAO,CAAA;AAAA,YAC7C;AAEA,YAAA,IAAA,CAAK,0BAAA,CAA2B,OAAA,EAAS,YAAA,CAAa,EAAE,CAAA;AAAA,UAC1D,CAAA,MAAO;AAEL,YAAA,MAAM,WAAW,YAAA,CAAa,YAAA;AAC9B,YAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,8BAAA,CAAA,EAAkC;AAAA,cAC9D,SAAS,YAAA,CAAa,OAAA;AAAA,cACtB,YAAY,QAAA,IAAY;AAAA,aACzB,CAAA;AACD,YAAA,SAAA,CAAU,kBAAkB,EAAE,KAAA,EAAO,UAAA,EAAY,QAAA,IAAY,QAAQ,CAAA;AAAA,UACvE;AACA,UAAA;AAAA,QACF;AAAA,QACA,KAAK,kBAAA;AACH,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,sBAAA,CAAA,EAA0B;AAAA,YACtD,SAAS,YAAA,CAAa,OAAA;AAAA,YACtB,QAAQ,YAAA,CAAa;AAAA,WACtB,CAAA;AACD,UAAA,MAAM,KAAK,WAAA,CAAY,EAAE,IAAA,EAAM,YAAA,EAAc,WAAW,CAAA;AACxD,UAAA;AAAA,QACF,KAAK,eAAA;AACH,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,mBAAA,CAAA,EAAuB;AAAA,YACnD,SAAS,YAAA,CAAa,OAAA;AAAA,YACtB,QAAQ,YAAA,CAAa;AAAA,WACtB,CAAA;AACD,UAAA,SAAA,CAAU,OAAA,CAAQ,EAAE,MAAA,EAAQ,YAAA,CAAa,IAAI,CAAA;AAC7C,UAAA,MAAM,KAAK,WAAA,CAAY,EAAE,IAAA,EAAM,YAAA,EAAc,WAAW,CAAA;AAExD,UAAA,IAAI,SAAA,CAAU,eAAA,EAAgB,KAAM,CAAA,EAAG;AACrC,YAAA,IAAA,CAAK,iBAAiB,OAAO,CAAA;AAAA,UAC/B;AACA,UAAA;AAAA;AACJ,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,IAAI,oBAAoB,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,IAC5E;AAKA,IAAA,IAAI,SAAA,CAAU,eAAA,EAAgB,KAAM,CAAA,EAAG;AACrC,MAAA,IAAA,CAAK,iBAAiB,OAAO,CAAA;AAAA,IAC/B;AAEA,IAAA,MAAM,KAAK,uBAAA,EAAwB;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcU,aAAa,IAAA,EAGoC;AACzD,IAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,IAAA;AAG5B,IAAA,IAAA,CAAK,wBAAwB,OAAO,CAAA;AAEpC,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA,EAAG;AAChC,MAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAA,EAAS,IAAI,WAAW,CAAA;AAE3C,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,8BAAA,CAAA,EAAkC;AAAA,QAC9D,OAAA;AAAA,QACA;AAAA,OACD,CAAA;AAGD,MAAA,IAAA,CAAK,eAAA,EAAgB,CAAE,KAAA,CAAM,CAAA,KAAA,KAAS;AACpC,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,0BAAA,CAAA,EAA8B,EAAE,OAAO,CAAA;AAAA,MACvE,CAAC,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,YAAA,GAAuB;AAC/B,IAAA,OAAO,KAAK,SAAA,CAAU,IAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAgB,MAAA,GAAwB;AAAA,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASzC,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,UAAA,CAAY,CAAA;AAC1C,IAAA,MAAM,KAAK,MAAA,EAAO;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAgB,YAAA,GAA8B;AAAA,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAM/C,MAAgB,aAAA,GAA+B;AAAA,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMhD,MAAM,QAAA,GAA0B;AAC9B,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,IAAA,MAAM,KAAK,YAAA,EAAa;AAGxB,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,OAAO,CAAA,IAAK,KAAK,gBAAA,EAAkB;AACtD,MAAA,YAAA,CAAa,OAAO,CAAA;AACpB,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,uCAAA,CAAA,EAA2C,EAAE,SAAS,CAAA;AAAA,IACtF;AACA,IAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAG5B,IAAA,MAAM,MAAA,GAAwB;AAAA,MAC5B,EAAA,EAAI,UAAA;AAAA,MACJ,OAAA,EAAS,iCAAA;AAAA,MACT,MAAA,EAAQ,sBAAA;AAAA,MACR,QAAA,EAAU;AAAA,KACZ;AAEA,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,SAAS,CAAA,IAAK,KAAK,SAAA,EAAW;AAEjD,MAAA,MAAM,cAAA,GAAiB,UAAU,kBAAA,EAAmB;AACpD,MAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,QAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,WAAA,EAAc,cAAA,CAAe,MAAM,CAAA,4BAAA,CAAA,EAAgC;AAAA,UAC9F,OAAA;AAAA,UACA,cAAA,EAAgB,cAAA,CAAe,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,YACvC,MAAA,EAAQ,CAAA,CAAE,KAAA,CAAM,YAAA,CAAa,EAAA;AAAA,YAC7B,YAAY,CAAA,CAAE,UAAA;AAAA,YACd,UAAU,CAAA,CAAE;AAAA,WACd,CAAE;AAAA,SACH,CAAA;AAAA,MACH;AAGA,MAAA,KAAA,MAAW,MAAA,IAAU,UAAU,aAAA,EAAe;AAC5C,QAAA,MAAM,IAAA,GAAO,SAAA,CAAU,OAAA,CAAQ,EAAE,QAAQ,CAAA;AACzC,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,MAAM,KAAK,UAAA,CAAW,EAAE,IAAA,EAAM,SAAA,EAAW,QAAQ,CAAA;AAAA,QACnD;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,MAAM,KAAK,aAAA,EAAc;AACzB,IAAA,MAAM,MAAM,QAAA,EAAS;AAAA,EACvB;AACF;;;AC1xCO,SAAS,gBAAgB,UAAA,EAAwD;AACtF,EAAA,OAAO,OAAO,IAAA,KAAoD;AAChE,IAAA,IAAI,WAAA,GAAc,IAAA;AAClB,IAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,MAAA,WAAA,GAAc,MAAM,UAAU,WAAW,CAAA;AAAA,IAC3C;AACA,IAAA,OAAO,WAAA;AAAA,EACT,CAAA;AACF;ACxCA,IAAM,wCAAwB,IAAI,GAAA,CAAI,CAAC,GAAA,EAAK,GAAG,CAAC,CAAA;AAChD,IAAM,qBAAA,GAAwB,GAAA;AAE9B,IAAM,uBAAuB,EAAA,GAAK,GAAA;AAClC,IAAM,0BAAA,GAA6B,GAAA;AAE5B,IAAM,gBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,EACjC,MAAA;AAAA,EAET,WAAA,CAAY,QAAgB,KAAA,EAAiB;AAC3C,IAAA,KAAA,CAAM,CAAA,2CAAA,EAA8C,MAAM,CAAA,CAAA,EAAI,EAAE,OAAO,CAAA;AACvE,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AACF,CAAA;AAEO,SAAS,mBAAmB,KAAA,EAA2C;AAC5E,EAAA,OAAO,KAAA,YAAiB,gBAAA;AAC1B;AAEA,SAAS,oBAAoB,MAAA,EAAyB;AACpD,EAAA,OAAO,qBAAA,CAAsB,IAAI,MAAM,CAAA;AACzC;AAEA,eAAsB,4BAAA,CACpB,GAAA,EACA,OAAA,EACA,UAAA,EACe;AACf,EAAA,IAAI,iBAAA;AAEJ,EAAA,IAAI;AACF,IAAA,MAAMwB,oBAAA,CAAe,GAAA,EAAK,OAAA,EAAS,UAAA,EAAY;AAAA,MAC7C,qBAAqB,CAAA,QAAA,KAAY;AAC/B,QAAA,IAAI,mBAAA,CAAoB,QAAA,CAAS,MAAM,CAAA,EAAG;AACxC,UAAA,iBAAA,GAAoB,QAAA,CAAS,MAAA;AAC7B,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACD,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,sBAAsB,MAAA,EAAW;AACnC,MAAA,MAAM,IAAI,gBAAA,CAAiB,iBAAA,EAAmB,KAAK,CAAA;AAAA,IACrD;AAEA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAEO,IAAM,sBAAN,MAA0B;AAAA,EAK/B,WAAA,CACmB,cACA,SAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAChB;AAAA,EAFgB,YAAA;AAAA,EACA,SAAA;AAAA,EANX,YAAA,GAAe,CAAA;AAAA,EACf,eAAA,GAAkB,CAAA;AAAA,EAClB,2BAAA,GAA8B,CAAA;AAAA,EAO9B,gBAAA,GAA4B;AAClC,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,eAAA;AAAA,EAC3B;AAAA,EAEA,sBAAA,GAAkC;AAChC,IAAA,OAAO,IAAA,CAAK,wBAAwB,CAAC,CAAA;AAAA,EACvC;AAAA,EAEA,wBAAwB,KAAA,EAAwB;AAC9C,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,EAAiB,EAAG;AAC5B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,2BAAA,IAA+B,KAAA;AACpC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,KAAA,GAAgB;AACd,IAAA,MAAM,8BAA8B,IAAA,CAAK,2BAAA;AAEzC,IAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AACpB,IAAA,IAAA,CAAK,eAAA,GAAkB,CAAA;AACvB,IAAA,IAAA,CAAK,2BAAA,GAA8B,CAAA;AAEnC,IAAA,OAAO,2BAAA;AAAA,EACT;AAAA,EAEA,cAAc,IAAA,EAAmF;AAC/F,IAAA,IAAA,CAAK,YAAA,EAAA;AACL,IAAA,MAAM,8BAA8B,IAAA,CAAK,2BAAA;AACzC,IAAA,IAAA,CAAK,2BAAA,GAA8B,CAAA;AAEnC,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,GAAA,CAAI,qBAAA,GAAwB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,YAAA,GAAe,CAAC,CAAA,EAAG,oBAAoB,CAAA;AAClH,IAAA,MAAM,QAAA,GAAW,KAAK,KAAA,CAAM,gBAAA,GAAmB,8BAA8B,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA,CAAA,GAAO,CAAC,CAAA;AACrG,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,qBAAA,EAAuB,mBAAmB,QAAQ,CAAA;AAC9E,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,IAAA,CAAK,UAAA,GAAa,GAAI,CAAA;AAEnD,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA,CAAK,GAAA,EAAI,GAAI,UAAA;AAEpC,IAAA,IAAA,CAAK,WAAU,CAAE,IAAA;AAAA,MACf,CAAA,EAAG,IAAA,CAAK,YAAY,CAAA,yDAAA,EAA4D,eAAe,CAAA,CAAA,CAAA;AAAA,MAC/F;AAAA,QACE,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,eAAe,IAAA,CAAK,aAAA;AAAA,QACpB,kBAAkB,IAAA,CAAK,gBAAA;AAAA,QACvB,2BAAA;AAAA,QACA,kBAAkB,IAAA,CAAK,YAAA;AAAA,QACvB;AAAA;AACF,KACF;AAAA,EACF;AACF,CAAA;;;AC7EA,IAAM,uBAAA,GAAuD;AAAA,EAC3D,MAAA,EAAQ,gBAAA;AAAA,EACR,IAAA,EAAM,eAAA;AAAA,EACN,OAAA,EAAS,kBAAA;AAAA,EACT,MAAA,EAAQ,iBAAA;AAAA,EACR,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,yBAAA,GAA4B,CAAC,IAAA,KAAmC,IAAA,CAAK,SAASlB,sBAAAA,CAAS,WAAA;AAE7F,IAAM,uBAAA,GAAuD;AAAA,EAC3D,MAAA,EAAQ,OAAA;AAAA,EACR,IAAA,EAAM,MAAA;AAAA,EACN,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ,QAAA;AAAA,EACR,QAAA,EAAU;AACZ,CAAA;AAEA,SAAS,oBAAoB,KAAA,EAAuB;AAClD,EAAA,IAAI,MAAM,KAAA,CAAM,MAAA;AAChB,EAAA,OAAO,MAAM,CAAA,IAAK,KAAA,CAAM,WAAW,GAAA,GAAM,CAAC,MAAM,EAAA,EAAI;AAClD,IAAA,GAAA,EAAA;AAAA,EACF;AACA,EAAA,OAAO,QAAQ,KAAA,CAAM,MAAA,GAAS,QAAQ,KAAA,CAAM,KAAA,CAAM,GAAG,GAAG,CAAA;AAC1D;AAEA,SAAS,0BAAA,CAA2B,QAAA,EAAkB,IAAA,EAAc,KAAA,EAA8B;AAChG,EAAA,OAAO,IAAIW,iBAAAA;AAAA,IACT;AAAA,MACE,EAAA,EAAI,CAAA,+BAAA,CAAA;AAAA,MACJ,IAAA;AAAA,MACA,QAAQQ,iBAAA,CAAY,oBAAA;AAAA,MACpB,UAAUC,mBAAA,CAAc,IAAA;AAAA,MACxB,OAAA,EAAS;AAAA,QACP;AAAA;AACF,KACF;AAAA,IACA;AAAA,GACF;AACF;AAEA,IAAM,gBAAA,GAAmB,kBAAA;AAEzB,SAAS,4BAA4B,SAAA,EAAgC;AACnE,EAAA,OAAO,IAAIT,iBAAAA,CAAY;AAAA,IACrB,EAAA,EAAI,CAAA,iCAAA,CAAA;AAAA,IACJ,IAAA,EAAM,uFAAA;AAAA,IACN,QAAQQ,iBAAA,CAAY,oBAAA;AAAA,IACpB,UAAUC,mBAAA,CAAc,IAAA;AAAA,IACxB,OAAA,EAAS;AAAA,MACP;AAAA;AACF,GACD,CAAA;AACH;AAEA,SAAS,oBAAoB,YAAA,EAA8B;AACzD,EAAA,MAAM,kBAAA,GAAqB,oBAAoB,YAAY,CAAA;AAC3D,EAAA,MAAM,WAAA,GACJ,kHAAA;AAEF,EAAA,IAAI;AACF,IAAA,MAAM,cAAA,GAAiB,IAAI,GAAA,CAAI,kBAAkB,CAAA;AACjD,IAAA,IAAI,eAAe,QAAA,KAAa,GAAA,IAAO,cAAA,CAAe,MAAA,IAAU,eAAe,IAAA,EAAM;AACnF,MAAA,MAAM,0BAAA,CAA2B,cAAc,WAAW,CAAA;AAAA,IAC5D;AACA,IAAA,OAAO,mBAAA,CAAoB,eAAe,MAAM,CAAA;AAAA,EAClD,SAASV,OAAA,EAAO;AACd,IAAA,IAAIA,mBAAiBC,iBAAAA,EAAa;AAChC,MAAA,MAAMD,OAAA;AAAA,IACR;AAEA,IAAA,MAAM,0BAAA,CAA2B,YAAA,EAAc,WAAA,EAAaA,OAAK,CAAA;AAAA,EACnE;AACF;AAEA,SAAS,eAAA,CAAgB,QAAqB,SAAA,EAA4B;AACxE,EAAA,MAAM,aAAA,GAAgB,wBAAwB,MAAM,CAAA;AACpD,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,OAAO,aAAa,CAAA,QAAA,CAAA;AAAA,EAC7B;AAEA,EAAA,OAAO,CAAA,UAAA,EAAa,SAAS,CAAA,IAAA,EAAO,aAAa,CAAA,QAAA,CAAA;AACnD;AAEA,SAAS,mBAAA,CAAoB,YAAA,EAAsB,MAAA,EAAqB,SAAA,EAA4B;AAClG,EAAA,OAAO,GAAG,YAAY,CAAA,EAAG,eAAA,CAAgB,MAAA,EAAQ,SAAS,CAAC,CAAA,CAAA;AAC7D;AAEA,SAAS,6BAAA,CAA8B,MAAA,EAAqB,QAAA,EAAkB,SAAA,EAA4B;AACxG,EAAA,MAAM,kBAAA,GAAqB,oBAAoB,QAAQ,CAAA;AACvD,EAAA,MAAM,WAAA,GAAc,iBAAiB,MAAM,CAAA,8EAAA,EAAiF,MAAM,CAAA,wBAAA,EAA2B,uBAAA,CAAwB,MAAM,CAAC,CAAA,EAAA,CAAA;AAE5L,EAAA,IAAI;AACF,IAAA,MAAM,cAAA,GAAiB,IAAI,GAAA,CAAI,kBAAkB,CAAA;AACjD,IAAA,IAAI,cAAA,CAAe,MAAA,IAAU,cAAA,CAAe,IAAA,EAAM;AAChD,MAAA,MAAM,0BAAA,CAA2B,UAAU,WAAW,CAAA;AAAA,IACxD;AAEA,IAAA,MAAM,gBAAA,GAAmB,mBAAA,CAAoB,cAAA,CAAe,MAAM,CAAA;AAClE,IAAA,MAAM,kBAAA,GAAqB,mBAAA,CAAoB,cAAA,CAAe,QAAQ,CAAA;AAEtE,IAAA,IAAI,CAAC,kBAAA,IAAsB,kBAAA,KAAuB,GAAA,EAAK;AACrD,MAAA,OAAO,mBAAA,CAAoB,gBAAA,EAAkB,MAAA,EAAQ,SAAS,CAAA;AAAA,IAChE;AAEA,IAAA,IAAI,kBAAA,CAAmB,QAAA,CAAS,uBAAA,CAAwB,MAAM,CAAC,CAAA,EAAG;AAChE,MAAA,OAAO,CAAA,EAAG,gBAAgB,CAAA,EAAG,kBAAkB,CAAA,CAAA;AAAA,IACjD;AAEA,IAAA,MAAM,0BAAA,CAA2B,UAAU,WAAW,CAAA;AAAA,EACxD,SAASA,OAAA,EAAO;AACd,IAAA,IAAIA,mBAAiBC,iBAAAA,EAAa;AAChC,MAAA,MAAMD,OAAA;AAAA,IACR;AAEA,IAAA,MAAM,0BAAA,CAA2B,QAAA,EAAU,WAAA,EAAaA,OAAK,CAAA;AAAA,EAC/D;AACF;AAEA,SAAS,sCAAA,CAAuC,QAAqB,cAAA,EAAgC;AACnG,EAAA,IAAI,WAAW,QAAA,EAAU;AACvB,IAAA,OAAO,cAAA;AAAA,EACT;AAEA,EAAA,MAAM,wBAAA,GAA2B,oBAAoB,cAAc,CAAA;AACnE,EAAA,MAAM,WAAA,GACJ,kJAAA;AAEF,EAAA,IAAI;AACF,IAAA,MAAM,cAAA,GAAiB,IAAI,GAAA,CAAI,wBAAwB,CAAA;AACvD,IAAA,MAAM,gBAAA,GAAmB,mBAAA,CAAoB,cAAA,CAAe,MAAM,CAAA;AAClE,IAAA,MAAM,kBAAA,GAAqB,mBAAA,CAAoB,cAAA,CAAe,QAAQ,CAAA;AAEtE,IAAA,IAAI,CAAC,kBAAA,CAAmB,QAAA,CAAS,uBAAA,CAAwB,MAAM,CAAA,EAAG;AAChE,MAAA,MAAM,0BAAA,CAA2B,gBAAgB,WAAW,CAAA;AAAA,IAC9D;AAEA,IAAA,MAAM,WAAW,kBAAA,CAAmB,KAAA,CAAM,GAAG,CAAC,uBAAA,CAAwB,OAAO,MAAM,CAAA;AACnF,IAAA,OAAO,GAAG,gBAAgB,CAAA,EAAG,QAAQ,CAAA,EAAG,uBAAA,CAAwB,MAAM,CAAC,CAAA,CAAA;AAAA,EACzE,SAASA,OAAA,EAAO;AACd,IAAA,IAAIA,mBAAiBC,iBAAAA,EAAa;AAChC,MAAA,MAAMD,OAAA;AAAA,IACR;AAEA,IAAA,MAAM,0BAAA,CAA2B,cAAA,EAAgB,WAAA,EAAaA,OAAK,CAAA;AAAA,EACrE;AACF;AAgDO,IAAM,aAAA,GAAN,cAA4B,YAAA,CAAa;AAAA,EAC9C,IAAA,GAAO,qCAAA;AAAA,EAEU,WAAA;AAAA,EACA,mBAAA;AAAA,EACT,MAAA;AAAA,EACA,UAAA,GAAoC,IAAA;AAAA,EACpC,eAAA,uBAAsB,GAAA,EAAmB;AAAA,EAEjD,WAAA,CAAY,MAAA,GAA8B,EAAC,EAAG;AAC5C,IAAA,KAAA,CAAM,MAAM,CAAA;AAEZ,IAAA,IAAI,MAAA,CAAO,cAAc,MAAA,IAAa,CAAC,iBAAiB,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,EAAG;AAC9E,MAAA,MAAM,2BAAA,CAA4B,OAAO,SAAS,CAAA;AAAA,IACpD;AAEA,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,WAAA,IAAe,OAAA,CAAQ,GAAA,CAAI,yBAAA;AACtD,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,SAAA,IAAa,OAAA,CAAQ,GAAA,CAAI,iBAAA;AACrD,IAAA,MAAM,YAAY,YAAA,IAAgB,gBAAA,CAAiB,IAAA,CAAK,YAAY,IAAI,YAAA,GAAe,MAAA;AACvF,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,IAAA,CAAK,WAAA,CAAY,2DAA2D,OAAO,CAAA;AAAA,IACrF;AAEA,IAAA,MAAM,sBAAA,GAAyB,MAAA,CAAO,cAAA,IAAkB,OAAA,CAAQ,GAAA,CAAI,4BAAA;AACpE,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI,cAAA;AAEJ,IAAA,IAAI,sBAAA,EAAwB;AAC1B,MAAA,cAAA,GAAiB,6BAAA,CAA8B,QAAA,EAAU,sBAAA,EAAwB,SAAS,CAAA;AAAA,IAC5F,CAAA,MAAO;AACL,MAAA,YAAA,GAAe,mBAAA,CAAoB,MAAA,CAAO,QAAA,IAAY,iCAAiC,CAAA;AACvF,MAAA,cAAA,GAAiB,mBAAA,CAAoB,YAAA,EAAc,QAAA,EAAU,SAAS,CAAA;AAAA,IACxE;AAEA,IAAA,MAAM,+BAAA,GAAkC,CACtC,MAAA,EACA,gBAAA,KACW;AACX,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,OAAO,6BAAA,CAA8B,MAAA,EAAQ,gBAAA,EAAkB,SAAS,CAAA;AAAA,MAC1E;AAEA,MAAA,IAAI,sBAAA,EAAwB;AAC1B,QAAA,OAAO,sCAAA,CAAuC,QAAQ,cAAc,CAAA;AAAA,MACtE;AAEA,MAAA,OAAO,mBAAA,CAAoB,YAAA,EAAe,MAAA,EAAQ,SAAS,CAAA;AAAA,IAC7D,CAAA;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc;AAAA,MACjB,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,QAAA,EAAU,MAAA,CAAO,QAAA,IAAYO,eAAAA,CAAS,IAAA;AAAA,MACtC,YAAA,EAAc,OAAO,YAAA,IAAgB,GAAA;AAAA,MACrC,cAAA,EAAgB,OAAO,cAAA,IAAkB,GAAA;AAAA,MACzC,UAAA,EAAY,OAAO,UAAA,IAAc,CAAA;AAAA,MACjC,aAAa,WAAA,IAAe,EAAA;AAAA,MAC5B,cAAA;AAAA,MACA,YAAA,EAAc,+BAAA,CAAgC,MAAA,EAAQ,MAAA,CAAO,YAAY,CAAA;AAAA,MACzE,eAAA,EAAiB,+BAAA,CAAgC,SAAA,EAAW,MAAA,CAAO,eAAe,CAAA;AAAA,MAClF,cAAA,EAAgB,+BAAA,CAAgC,QAAA,EAAU,MAAA,CAAO,cAAc,CAAA;AAAA,MAC/E,gBAAA,EAAkB,+BAAA,CAAgC,UAAA,EAAY,MAAA,CAAO,gBAAgB;AAAA,KACvF;AAEA,IAAA,IAAA,CAAK,sBAAsB,IAAI,mBAAA,CAAoB,eAAA,EAAiB,MAAM,KAAK,MAAM,CAAA;AAErF,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,OAAO,EAAC;AAAA,MACR,MAAM,EAAC;AAAA,MACP,SAAS,EAAC;AAAA,MACV,QAAQ,EAAC;AAAA,MACT,UAAU,EAAC;AAAA,MACX,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AAAA,EAEA,MAAgB,oBAAoB,KAAA,EAAoC;AAEtE,IAAA,IAAI,KAAA,CAAM,IAAA,KAASvB,8BAAAA,CAAiB,UAAA,EAAY;AAC9C,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,yBAAA,CAA0B,KAAA,CAAM,YAAY,CAAA,EAAG;AAClD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,sBAAA,EAAuB,EAAG;AACrD,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AAEtB,IAAA,MAAM,KAAK,mBAAA,EAAoB;AAAA,EACjC;AAAA,EAEA,MAAM,WAAW,KAAA,EAAgC;AAC/C,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,sBAAA,EAAuB,EAAG;AACrD,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,eAAe,KAAK,CAAA;AACzB,IAAA,MAAM,KAAK,mBAAA,EAAoB;AAAA,EACjC;AAAA,EAEA,MAAM,cAAc,KAAA,EAAmC;AACrD,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,sBAAA,EAAuB,EAAG;AACrD,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAC5B,IAAA,MAAM,KAAK,mBAAA,EAAoB;AAAA,EACjC;AAAA,EAEA,MAAM,aAAa,KAAA,EAAkC;AACnD,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,sBAAA,EAAuB,EAAG;AACrD,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,iBAAiB,KAAK,CAAA;AAC3B,IAAA,MAAM,KAAK,mBAAA,EAAoB;AAAA,EACjC;AAAA,EAEA,MAAM,gBAAgB,KAAA,EAAqC;AACzD,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,sBAAA,EAAuB,EAAG;AACrD,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,oBAAoB,KAAK,CAAA;AAC9B,IAAA,MAAM,KAAK,mBAAA,EAAoB;AAAA,EACjC;AAAA,EAEQ,YAAY,KAAA,EAA2B;AAC7C,IAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,YAAY,CAAA;AACrD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA;AACjC,IAAA,IAAA,CAAK,MAAA,CAAO,SAAA,EAAA;AAAA,EACd;AAAA,EAEQ,eAAe,KAAA,EAAuB;AAC5C,IAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA,CAAK,KAAK,SAAA,CAAU,KAAA,CAAM,GAAG,CAAC,CAAA;AAC/C,IAAA,IAAA,CAAK,MAAA,CAAO,SAAA,EAAA;AAAA,EACd;AAAA,EAEQ,kBAAkB,KAAA,EAA0B;AAClD,IAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,IAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,YAAA,CAAa,KAAA,CAAM,MAAM,CAAC,CAAA;AACxD,IAAA,IAAA,CAAK,MAAA,CAAO,SAAA,EAAA;AAAA,EACd;AAAA,EAEQ,iBAAiB,KAAA,EAAyB;AAChD,IAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,IAAA,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA,CAAK,KAAK,WAAA,CAAY,KAAA,CAAM,KAAK,CAAC,CAAA;AACrD,IAAA,IAAA,CAAK,MAAA,CAAO,SAAA,EAAA;AAAA,EACd;AAAA,EAEQ,oBAAoB,KAAA,EAA4B;AACtD,IAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,IAAA,IAAA,CAAK,OAAO,QAAA,CAAS,IAAA,CAAK,KAAK,cAAA,CAAe,KAAA,CAAM,QAAQ,CAAC,CAAA;AAC7D,IAAA,IAAA,CAAK,MAAA,CAAO,SAAA,EAAA;AAAA,EACd;AAAA,EAEQ,eAAA,GAAwB;AAC9B,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,SAAA,KAAc,CAAA,EAAG;AAC/B,MAAA,IAAA,CAAK,MAAA,CAAO,cAAA,mBAAiB,IAAI,IAAA,EAAK;AAAA,IACxC;AAAA,EACF;AAAA,EAEQ,WAAW,IAAA,EAA8C;AAC/D,IAAA,MAAM,UAAA,GAAoC;AAAA,MACxC,GAAG,IAAA;AAAA,MACH,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,UAAU,IAAA,CAAK,IAAA;AAAA,MACf,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,OAAA,EAAS,KAAK,OAAA,IAAW,IAAA;AAAA,MACzB,KAAA,EAAO,KAAK,SAAA,IAAa,IAAA;AAAA,MACzB,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,SAAA,EAAW;AAAA,KACb;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEQ,UAAU,GAAA,EAA4C;AAC5D,IAAA,OAAO;AAAA,MACL,GAAG;AAAA,KACL;AAAA,EACF;AAAA,EAEQ,aAAa,MAAA,EAAwD;AAC3E,IAAA,OAAO;AAAA,MACL,GAAG;AAAA,KACL;AAAA,EACF;AAAA,EAEQ,YAAY,KAAA,EAAoD;AACtE,IAAA,OAAO;AAAA,MACL,GAAG;AAAA,KACL;AAAA,EACF;AAAA,EAEQ,eAAe,QAAA,EAAgE;AACrF,IAAA,OAAO;AAAA,MACL,GAAG;AAAA,KACL;AAAA,EACF;AAAA,EAEA,MAAc,mBAAA,GAAqC;AACjD,IAAA,IAAI,IAAA,CAAK,aAAY,EAAG;AACtB,MAAA,KAAK,IAAA,CAAK,KAAA,EAAM,CAAE,KAAA,CAAM,CAAA,KAAA,KAAS;AAC/B,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,oBAAA,EAAsB;AAAA,UACtC,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SAC7D,CAAA;AAAA,MACH,CAAC,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,IAAA,CAAK,MAAA,CAAO,SAAA,KAAc,CAAA,EAAG;AACtC,MAAA,IAAA,CAAK,aAAA,EAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAEQ,WAAA,GAAuB;AAE7B,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,IAAA,CAAK,YAAY,YAAA,EAAc;AAC1D,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,KAAK,MAAA,CAAO,cAAA,IAAkB,IAAA,CAAK,MAAA,CAAO,YAAY,CAAA,EAAG;AAC3D,MAAA,MAAM,UAAU,IAAA,CAAK,GAAA,KAAQ,IAAA,CAAK,MAAA,CAAO,eAAe,OAAA,EAAQ;AAChE,MAAA,IAAI,OAAA,IAAW,IAAA,CAAK,WAAA,CAAY,cAAA,EAAgB;AAC9C,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,YAAA,CAAa,KAAK,UAAU,CAAA;AAAA,IAC9B;AACA,IAAA,IAAA,CAAK,UAAA,GAAa,WAAW,MAAM;AACjC,MAAA,KAAK,IAAA,CAAK,KAAA,EAAM,CAAE,KAAA,CAAM,CAAAgB,OAAA,KAAS;AAC/B,QAAA,MAAM,cAAc,IAAIC,iBAAAA;AAAA,UACtB;AAAA,YACE,EAAA,EAAI,CAAA,uCAAA,CAAA;AAAA,YACJ,QAAQQ,iBAAA,CAAY,oBAAA;AAAA,YACpB,UAAUC,mBAAA,CAAc;AAAA,WAC1B;AAAA,UACAV;AAAA,SACF;AACA,QAAA,IAAA,CAAK,MAAA,CAAO,eAAe,WAAW,CAAA;AACtC,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,wBAAA,EAA0B,WAAW,CAAA;AAAA,MACzD,CAAC,CAAA;AAAA,IACH,CAAA,EAAG,IAAA,CAAK,WAAA,CAAY,cAAc,CAAA;AAAA,EACpC;AAAA,EAEA,MAAc,WAAA,GAA6B;AAEzC,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,YAAA,CAAa,KAAK,UAAU,CAAA;AAC5B,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,IACpB;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,SAAA,KAAc,CAAA,EAAG;AAC/B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAK,mBAAA,CAAoB,uBAAA,CAAwB,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,EAAG;AAC3E,MAAA,IAAA,CAAK,WAAA,EAAY;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,SAAA,GAAY,CAAC,GAAG,IAAA,CAAK,OAAO,KAAK,CAAA;AACvC,IAAA,MAAM,QAAA,GAAW,CAAC,GAAG,IAAA,CAAK,OAAO,IAAI,CAAA;AACrC,IAAA,MAAM,WAAA,GAAc,CAAC,GAAG,IAAA,CAAK,OAAO,OAAO,CAAA;AAC3C,IAAA,MAAM,UAAA,GAAa,CAAC,GAAG,IAAA,CAAK,OAAO,MAAM,CAAA;AACzC,IAAA,MAAM,YAAA,GAAe,CAAC,GAAG,IAAA,CAAK,OAAO,QAAQ,CAAA;AAC7C,IAAA,MAAM,SAAA,GAAY,KAAK,MAAA,CAAO,SAAA;AAC9B,IAAA,MAAM,cAAc,IAAA,CAAK,MAAA,CAAO,aAAa,IAAA,CAAK,WAAA,CAAY,eAAe,MAAA,GAAS,MAAA;AAGtF,IAAA,IAAA,CAAK,WAAA,EAAY;AAEjB,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,MAChC,IAAA,CAAK,gBAAA,CAAiB,QAAA,EAAU,SAAS,CAAA;AAAA,MACzC,IAAA,CAAK,gBAAA,CAAiB,MAAA,EAAQ,QAAQ,CAAA;AAAA,MACtC,IAAA,CAAK,gBAAA,CAAiB,SAAA,EAAW,WAAW,CAAA;AAAA,MAC5C,IAAA,CAAK,gBAAA,CAAiB,QAAA,EAAU,UAAU,CAAA;AAAA,MAC1C,IAAA,CAAK,gBAAA,CAAiB,UAAA,EAAY,YAAY;AAAA,KAC/C,CAAA;AAED,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,MAAA,CAAO,CAAA,MAAA,KAAU,CAAC,MAAA,CAAO,SAAS,CAAA,CAAE,GAAA,CAAI,CAAA,MAAA,KAAU,MAAA,CAAO,MAAM,CAAA;AAC7F,IAAA,MAAM,cAAc,OAAA,CAAQ,IAAA,CAAK,CAAA,MAAA,KAAU,MAAA,CAAO,sBAAsB,MAAS,CAAA;AAEjF,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAE7B,IAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,MAAA,MAAM,+BAAA,GAAkC,IAAA,CAAK,mBAAA,CAAoB,KAAA,EAAM;AACvE,MAAA,MAAM,OAAA,GAA2C;AAAA,QAC/C,SAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA,EAAY;AAAA,OACd;AAEA,MAAA,IAAI,kCAAkC,CAAA,EAAG;AACvC,QAAA,OAAA,CAAQ,+BAAA,GAAkC,+BAAA;AAAA,MAC5C;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,4BAAA,EAA8B,OAAO,CAAA;AACvD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,WAAA,EAAa,sBAAsB,MAAA,EAAW;AAChD,MAAA,IAAA,CAAK,oBAAoB,aAAA,CAAc;AAAA,QACrC,QAAQ,WAAA,CAAY,iBAAA;AAAA,QACpB,aAAA;AAAA,QACA,gBAAA,EAAkB;AAAA,OACnB,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,mDAAA,EAAqD;AAAA,MACpE,SAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA,EAAY,OAAA;AAAA,MACZ;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAA,CAAe,MAAA,EAAqB,OAAA,EAA6B;AAC7E,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,WAAA,CAAY,WAAW,CAAA,CAAA;AAAA,MACrD,cAAA,EAAgB;AAAA,KAClB;AAEA,IAAA,MAAM,WAAA,GAA2C;AAAA,MAC/C,MAAA,EAAQ,KAAK,WAAA,CAAY,cAAA;AAAA,MACzB,IAAA,EAAM,KAAK,WAAA,CAAY,YAAA;AAAA,MACvB,OAAA,EAAS,KAAK,WAAA,CAAY,eAAA;AAAA,MAC1B,MAAA,EAAQ,KAAK,WAAA,CAAY,cAAA;AAAA,MACzB,QAAA,EAAU,KAAK,WAAA,CAAY;AAAA,KAC7B;AAEA,IAAA,MAAM,OAAA,GAAuB;AAAA,MAC3B,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,CAAC,wBAAwB,MAAM,CAAC,GAAG,OAAA,EAAS;AAAA,KACrE;AAEA,IAAA,MAAM,6BAA6B,WAAA,CAAY,MAAM,GAAG,OAAA,EAAS,IAAA,CAAK,YAAY,UAAU,CAAA;AAAA,EAC9F;AAAA,EAEA,MAAc,gBAAA,CACZ,MAAA,EACA,OAAA,EACkF;AAClF,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,IAAA,EAAK;AAAA,IACnC;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,OAAO,CAAA;AACtC,MAAA,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,IAAA,EAAK;AAAA,IACnC,SAASA,OAAA,EAAO;AACd,MAAA,IAAI,kBAAA,CAAmBA,OAAK,CAAA,EAAG;AAC7B,QAAA,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAO,iBAAA,EAAmBA,QAAM,MAAA,EAAO;AAAA,MACrE;AAEA,MAAA,MAAM,OAAA,GAAU,CAAA,sCAAA,EAAyC,MAAA,CAAO,WAAA,EAAa,CAAA,CAAA;AAC7E,MAAA,MAAM,cAAc,IAAIC,iBAAAA;AAAA,QACtB;AAAA,UACE,EAAA,EAAI,OAAA;AAAA,UACJ,QAAQQ,iBAAA,CAAY,oBAAA;AAAA,UACpB,UAAUC,mBAAA,CAAc,IAAA;AAAA,UACxB,OAAA,EAAS;AAAA,YACP,MAAA;AAAA,YACA,kBAAkB,OAAA,CAAQ;AAAA;AAC5B,SACF;AAAA,QACAV;AAAA,OACF;AACA,MAAA,IAAA,CAAK,MAAA,CAAO,eAAe,WAAW,CAAA;AACtC,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,uDAAA,EAAyD,WAAW,CAAA;AACtF,MAAA,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAM;AAAA,IACpC;AAAA,EACF;AAAA,EAEQ,WAAA,GAAoB;AAC1B,IAAA,IAAA,CAAK,MAAA,CAAO,QAAQ,EAAC;AACrB,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,EAAC;AACpB,IAAA,IAAA,CAAK,MAAA,CAAO,UAAU,EAAC;AACvB,IAAA,IAAA,CAAK,MAAA,CAAO,SAAS,EAAC;AACtB,IAAA,IAAA,CAAK,MAAA,CAAO,WAAW,EAAC;AACxB,IAAA,IAAA,CAAK,OAAO,cAAA,GAAiB,MAAA;AAC7B,IAAA,IAAA,CAAK,OAAO,SAAA,GAAY,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAA,GAAuB;AAE3B,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,OAAO,KAAK,MAAA,CAAO,SAAA,GAAY,KAAK,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA,EAAG;AACjE,MAAA,IAAI,IAAA,CAAK,MAAA,CAAO,SAAA,GAAY,CAAA,EAAG;AAC7B,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,0BAAA,EAA4B;AAAA,UAC5C,cAAA,EAAgB,KAAK,MAAA,CAAO;AAAA,SAC7B,CAAA;AAED,QAAA,MAAM,YAAA,GAAe,KAAK,WAAA,EAAY;AACtC,QAAA,IAAA,CAAK,eAAA,CAAgB,IAAI,YAAY,CAAA;AAErC,QAAA,IAAI;AACF,UAAA,MAAM,YAAA;AAAA,QACR,CAAA,SAAE;AACA,UAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,YAAY,CAAA;AAAA,QAC1C;AAEA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,QAAQ,UAAA,CAAW,CAAC,GAAG,IAAA,CAAK,eAAe,CAAC,CAAA;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,GAA0B;AAE9B,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,YAAA,CAAa,KAAK,UAAU,CAAA;AAC5B,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,IACpB;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,KAAA,EAAM;AAAA,IACnB,SAASA,OAAA,EAAO;AACd,MAAA,MAAM,cAAc,IAAIC,iBAAAA;AAAA,QACtB;AAAA,UACE,EAAA,EAAI,CAAA,+DAAA,CAAA;AAAA,UACJ,QAAQQ,iBAAA,CAAY,oBAAA;AAAA,UACpB,UAAUC,mBAAA,CAAc,IAAA;AAAA,UACxB,OAAA,EAAS;AAAA,YACP,eAAA,EAAiB,KAAK,MAAA,CAAO;AAAA;AAC/B,SACF;AAAA,QACAV;AAAA,OACF;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,eAAe,WAAW,CAAA;AACtC,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,kDAAA,EAAoD,WAAW,CAAA;AAAA,IACnF;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,iCAAiC,CAAA;AAAA,EACpD;AACF;ACzsBO,IAAM,eAAA,GAAN,cAA8B,YAAA,CAAa;AAAA,EAChD,IAAA,GAAO,0BAAA;AAAA,EAEP,WAAA,CAAY,MAAA,GAA6B,EAAC,EAAG;AAC3C,IAAA,KAAA,CAAM,MAAM,CAAA;AAAA,EACd;AAAA,EAEA,MAAgB,oBAAoB,KAAA,EAAoC;AACtE,IAAA,MAAM,OAAO,KAAA,CAAM,YAAA;AAGnB,IAAA,MAAM,gBAAA,GAAmB,CAAC,UAAA,KAAoB;AAC5C,MAAA,IAAI;AACF,QAAA,OAAO,IAAA,CAAK,SAAA,CAAU,UAAA,EAAY,IAAA,EAAM,CAAC,CAAA;AAAA,MAC3C,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,MAAA,GAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,0BAAA;AACxD,QAAA,OAAO,oCAAoC,MAAM,CAAA,CAAA,CAAA;AAAA,MACnD;AAAA,IACF,CAAA;AAGA,IAAA,MAAM,cAAA,GAAiB,CAAC,SAAA,EAAiB,OAAA,KAAmB;AAC1D,MAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,OAAA,EAAQ,GAAI,UAAU,OAAA,EAAQ;AACvD,MAAA,OAAO,GAAG,QAAQ,CAAA,EAAA,CAAA;AAAA,IACpB,CAAA;AAEA,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAKhB,8BAAAA,CAAiB,YAAA;AACpB,QAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,sBAAA,CAAiB,CAAA;AAClC,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,SAAA,EAAY,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AACxC,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,SAAA,EAAY,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AACxC,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,OAAA,EAAU,IAAA,CAAK,EAAE,CAAA,CAAE,CAAA;AACpC,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,aAAA,EAAgB,IAAA,CAAK,OAAO,CAAA,CAAE,CAAA;AAC/C,QAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC5B,UAAA,IAAA,CAAK,OAAO,IAAA,CAAK,CAAA,UAAA,EAAa,iBAAiB,IAAA,CAAK,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,QAC9D;AACA,QAAA,IAAA,CAAK,OAAO,IAAA,CAAK,CAAA,eAAA,EAAkB,iBAAiB,IAAA,CAAK,UAAU,CAAC,CAAA,CAAE,CAAA;AACtE,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAC/B,QAAA;AAAA,MAEF,KAAKA,8BAAAA,CAAiB,UAAA;AACpB,QAAA,MAAM,QAAA,GAAW,cAAA,CAAe,IAAA,CAAK,SAAA,EAAW,KAAK,OAAO,CAAA;AAC5D,QAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,iBAAA,CAAc,CAAA;AAC/B,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,SAAA,EAAY,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AACxC,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,SAAA,EAAY,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AACxC,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,OAAA,EAAU,IAAA,CAAK,EAAE,CAAA,CAAE,CAAA;AACpC,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,aAAA,EAAgB,QAAQ,CAAA,CAAE,CAAA;AAC3C,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,aAAA,EAAgB,IAAA,CAAK,OAAO,CAAA,CAAE,CAAA;AAC/C,QAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC5B,UAAA,IAAA,CAAK,OAAO,IAAA,CAAK,CAAA,UAAA,EAAa,iBAAiB,IAAA,CAAK,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,QAC9D;AACA,QAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAW;AAC7B,UAAA,IAAA,CAAK,OAAO,IAAA,CAAK,CAAA,WAAA,EAAc,iBAAiB,IAAA,CAAK,MAAM,CAAC,CAAA,CAAE,CAAA;AAAA,QAChE;AACA,QAAA,IAAI,KAAK,SAAA,EAAW;AAClB,UAAA,IAAA,CAAK,OAAO,IAAA,CAAK,CAAA,UAAA,EAAa,iBAAiB,IAAA,CAAK,SAAS,CAAC,CAAA,CAAE,CAAA;AAAA,QAClE;AACA,QAAA,IAAA,CAAK,OAAO,IAAA,CAAK,CAAA,eAAA,EAAkB,iBAAiB,IAAA,CAAK,UAAU,CAAC,CAAA,CAAE,CAAA;AACtE,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAC/B,QAAA;AAAA,MAEF,KAAKA,8BAAAA,CAAiB,YAAA;AACpB,QAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,sBAAA,CAAiB,CAAA;AAClC,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,SAAA,EAAY,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AACxC,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,SAAA,EAAY,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AACxC,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,OAAA,EAAU,IAAA,CAAK,EAAE,CAAA,CAAE,CAAA;AACpC,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,aAAA,EAAgB,IAAA,CAAK,OAAO,CAAA,CAAE,CAAA;AAC/C,QAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC5B,UAAA,IAAA,CAAK,OAAO,IAAA,CAAK,CAAA,UAAA,EAAa,iBAAiB,IAAA,CAAK,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,QAC9D;AACA,QAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAW;AAC7B,UAAA,IAAA,CAAK,OAAO,IAAA,CAAK,CAAA,WAAA,EAAc,iBAAiB,IAAA,CAAK,MAAM,CAAC,CAAA,CAAE,CAAA;AAAA,QAChE;AACA,QAAA,IAAI,KAAK,SAAA,EAAW;AAClB,UAAA,IAAA,CAAK,OAAO,IAAA,CAAK,CAAA,UAAA,EAAa,iBAAiB,IAAA,CAAK,SAAS,CAAC,CAAA,CAAE,CAAA;AAAA,QAClE;AACA,QAAA,IAAA,CAAK,OAAO,IAAA,CAAK,CAAA,uBAAA,EAA0B,iBAAiB,IAAA,CAAK,UAAU,CAAC,CAAA,CAAE,CAAA;AAC9E,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAC/B,QAAA;AAAA,MAEF;AACE,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,oCAAA,EAAwC,KAAA,CAAc,IAAI,CAAA,CAAE,CAAA;AAAA;AACjF,EACF;AAAA,EAEA,MAAM,QAAA,GAA0B;AAC9B,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,0BAA0B,CAAA;AAAA,EAC7C;AACF;ACtEO,IAAM,cAAN,MAAkB;AAAA,EACvB,WAA4B,EAAC;AAAA,EAC7B,WAA4B,EAAC;AAAA,EAC7B,WAA4B,EAAC;AAAA,EAC7B,gBAAA,uBAAoC,GAAA,EAAI;AAAA,EACxC,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA;AAAA,EAEA,YAAY,IAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,UAAA;AAAA,EAC1B;AAAA;AAAA,EAGA,KAAK,IAAA,EAAwD;AAC3D,IAAA,IAAI,CAAC,KAAK,gBAAA,EAAkB;AAC1B,MAAA,IAAA,CAAK,mBAAmB,IAAA,CAAK,QAAA;AAC7B,MAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,QAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,MACrB;AACA,MAAA,IAAA,CAAK,WAAW,EAAC;AAAA,IACnB;AAAA,EACF;AAAA;AAAA,EAGA,KAAA,GAAQ;AACN,IAAA,IAAA,CAAK,WAAW,EAAC;AACjB,IAAA,IAAA,CAAK,WAAW,EAAC;AACjB,IAAA,IAAA,CAAK,eAAA,GAAkB,MAAA;AAAA,EACzB;AAAA,EAEQ,iBAAA,GAA0B;AAChC,IAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AACzB,MAAA,IAAA,CAAK,eAAA,uBAAsB,IAAA,EAAK;AAAA,IAClC;AAAA,EACF;AAAA,EAEQ,WAAW,KAAA,EAAiC;AAClD,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,EAAE,GAAG,KAAA,EAAO,UAAA,EAAY,GAAG,CAAA;AAAA,EAChD;AAAA,EAEQ,WAAW,KAAA,EAAiC;AAClD,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,EAAE,GAAG,KAAA,EAAO,UAAA,EAAY,GAAG,CAAA;AAAA,EAChD;AAAA;AAAA,EAGA,SAAS,KAAA,EAA2B;AAClC,IAAA,IAAI,CAAC,KAAK,gBAAA,EAAkB;AAC1B,MAAA,IAAA,CAAK,SAAS,IAAA,CAAK,EAAE,GAAG,KAAA,EAAO,UAAA,EAAY,GAAG,CAAA;AAC9C,MAAA;AAAA,IACF;AAEA,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAKA,8BAAAA,CAAiB,YAAA;AAEpB,QAAA,QAAQ,KAAK,gBAAA;AAAkB,UAC7B,KAAK,UAAA;AAAA,UACL,KAAK,eAAA;AAAA,UACL,KAAK,oBAAA;AACH,YAAA,IAAA,CAAK,WAAW,KAAK,CAAA;AACrB,YAAA;AAAA;AAEJ,QAAA;AAAA,MAEF,KAAKA,8BAAAA,CAAiB,YAAA;AAEpB,QAAA,QAAQ,KAAK,gBAAA;AAAkB,UAC7B,KAAK,UAAA;AAAA,UACL,KAAK,oBAAA;AACH,YAAA,IAAA,CAAK,WAAW,KAAK,CAAA;AACrB,YAAA;AAAA;AAEJ,QAAA;AAAA,MAEF,KAAKA,8BAAAA,CAAiB,UAAA;AACpB,QAAA,IAAI,KAAA,CAAM,aAAa,OAAA,EAAS;AAC9B,UAAA,IAAA,CAAK,WAAW,KAAK,CAAA;AAAA,QACvB,CAAA,MAAO;AACL,UAAA,QAAQ,KAAK,gBAAA;AAAkB,YAC7B,KAAK,UAAA;AAAA,YACL,KAAK,oBAAA;AACH,cAAA,IAAA,CAAK,WAAW,KAAK,CAAA;AACrB,cAAA;AAAA,YACF;AACE,cAAA,IAAA,CAAK,WAAW,KAAK,CAAA;AACrB,cAAA;AAAA;AACJ,QACF;AACA,QAAA;AAAA,MAEF;AAEE,QAAA,IAAA,CAAK,WAAW,KAAK,CAAA;AACrB,QAAA;AAAA;AACJ,EACF;AAAA;AAAA,EAGA,aAAa,MAAA,EAA0C;AACrD,IAAA,MAAM,YAA6B,EAAC;AACpC,IAAA,MAAM,UAA2B,EAAC;AAElC,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,IAAI,EAAE,CAAA,CAAE,UAAA,IAAc,IAAA,CAAK,WAAA,EAAa;AACtC,QAAA,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,MAClB,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,MAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,GAAG,SAAS,CAAA;AAAA,IACjC;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA,EAGA,aAAa,MAAA,EAA0C;AACrD,IAAA,MAAM,YAA6B,EAAC;AACpC,IAAA,MAAM,UAA2B,EAAC;AAElC,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,IAAI,EAAE,CAAA,CAAE,UAAA,IAAc,IAAA,CAAK,WAAA,EAAa;AACtC,QAAA,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,MAClB,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,MAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,GAAG,SAAS,CAAA;AAAA,IACjC;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA,EAGA,IAAI,OAAA,GAA2B;AAC7B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,QAAQ,CAAA;AAAA,EAC1B;AAAA;AAAA,EAGA,IAAI,OAAA,GAA2B;AAC7B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,QAAQ,CAAA;AAAA,EAC1B;AAAA;AAAA,EAGA,IAAI,SAAA,GAAoB;AACtB,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,MAAA;AAAA,EAC9C;AAAA;AAAA,EAGA,IAAI,OAAA,GAAkB;AACpB,IAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AACzB,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,gBAAgB,OAAA,EAAQ;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,IAAA,EAA0F;AAC7G,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,CAAA,EAAI,KAAK,MAAM,CAAA,CAAA;AAAA,EACvC;AAAA;AAAA,EAGA,gBAAgB,IAAA,EAA6C;AAC3D,IAAA,IAAI,IAAA,CAAK,gBAAA,KAAqB,eAAA,IAAmB,IAAA,CAAK,qBAAqB,aAAA,EAAe;AAExF,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,YAAA,IAAgB,KAAK,OAAA,EAAS;AAEvC,MAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AACzB,QAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,IAAA,CAAK,YAAA,CAAa,YAAY,CAAC,CAAA;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,WAAW,IAAA,EAAgC;AACzC,IAAA,OAAO,IAAA,CAAK,gBAAA,EAAkB,GAAA,CAAI,IAAA,CAAK,YAAA,CAAa,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,MAAA,EAAQ,IAAA,CAAK,EAAA,EAAI,CAAC,CAAA;AAAA,EACjG;AAAA;AAAA,EAGA,iBAAiB,IAAA,EAA8C;AAC7D,IAAA,IAAI,IAAA,CAAK,gBAAA,KAAqB,eAAA,IAAmB,IAAA,CAAK,qBAAqB,aAAA,EAAe;AAExF,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,CAAA,KAAK;AACxB,MAAA,IAAA,CAAK,gBAAA,CAAiB,MAAA,CAAO,IAAA,CAAK,YAAA,CAAa,CAAC,CAAC,CAAA;AAAA,IACnD,CAAC,CAAA;AAAA,EACH;AACF,CAAA;;;AChLA,SAAS,6BAAA,CACP,MAAA,EACA,oBAAA,EACA,WAAA,EACA,MAAA,EACwB;AACxB,EAAA,MAAM,wBAAwB,oBAAA,CAAqB,qBAAA;AACnD,EAAA,IAAI,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,QAAA,KAAa,MAAA,EAAQ;AACjD,IAAA,IAAI,qBAAA,CAAsB,SAAA,CAAU,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA,EAAG;AAC7D,MAAA,OAAO,MAAA,CAAO,QAAA;AAAA,IAChB;AAEA,IAAA,MAAA,CAAO,KAAK,kGAAA,EAAoG;AAAA,MAC9G,cAAc,MAAA,CAAO,QAAA;AAAA,MACrB,cAAA,EAAgB,WAAA;AAAA,MAChB,qBAAqB,qBAAA,CAAsB,SAAA;AAAA,MAC3C,kBAAkB,qBAAA,CAAsB;AAAA,KACzC,CAAA;AAAA,EACH;AACA,EAAA,OAAO,qBAAA,CAAsB,SAAA;AAC/B;AAaO,IAAM,eAAA,GAAN,cAA8B,YAAA,CAAa;AAAA,EAChD,IAAA,GAAO,uCAAA;AAAA,EAEP,OAAA;AAAA,EACA,eAAA,GAAkB,KAAA;AAAA,EAClB,aAAA,uBAAkC,GAAA,EAAI;AAAA,EACtC,YAAA;AAAA,EAEA,QAAA;AAAA,EACA,qBAAA;AAAA,EACA,iBAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA;AAAA,EAGA,mBAAA,uBAAwD,GAAA,EAAI;AAAA,EAE5D,WAAA,CAAY,MAAA,GAAgC,EAAC,EAAG;AAC9C,IAAA,KAAA,CAAM,MAAM,CAAA;AAGZ,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,GAAG,MAAA;AAAA,MACH,YAAA,EAAc,OAAO,YAAA,IAAgB,GAAA;AAAA,MACrC,aAAA,EAAe,OAAO,aAAA,IAAiB,GAAA;AAAA,MACvC,cAAA,EAAgB,OAAO,cAAA,IAAkB,GAAA;AAAA,MACzC,UAAA,EAAY,OAAO,UAAA,IAAc,CAAA;AAAA,MACjC,YAAA,EAAc,OAAO,YAAA,IAAgB,GAAA;AAAA,MACrC,QAAA,EAAU,OAAO,QAAA,IAAY;AAAA,KAC/B;AAEA,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,WAAA,CAAY,EAAE,YAAY,IAAA,CAAK,OAAA,CAAQ,UAAA,IAAc,CAAA,EAAG,CAAA;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,OAAA,EAA6C;AACtD,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,MAAA,IAAA,CAAK,iBAAiB,OAAA,CAAQ,aAAA;AAE9B,MAAA,IAAA,CAAK,QAAA,GAAW,OAAA,CAAQ,MAAA,EAAQ,UAAA,EAAW;AAC3C,MAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,QAAA,IAAA,CAAK,MAAA,CAAO,KAAK,gFAAgF,CAAA;AACjG,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,qBAAA,GAAwB,MAAM,IAAA,CAAK,QAAA,CAAS,SAAS,eAAe,CAAA;AACzE,MAAA,IAAI,CAAC,KAAK,qBAAA,EAAuB;AAC/B,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,UACV;AAAA,SACF;AACA,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,CAAC,KAAK,iBAAA,EAAmB;AAC3B,QAAA,IAAA,CAAK,iBAAA,GAAoB,6BAAA;AAAA,UACvB,IAAA,CAAK,OAAA;AAAA,UACL,IAAA,CAAK,qBAAA;AAAA,UACL,IAAA,CAAK,SAAS,WAAA,CAAY,IAAA;AAAA,UAC1B,IAAA,CAAK;AAAA,SACP;AAEA,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,sCAAA,EAAwC;AAAA,UACxD,UAAU,IAAA,CAAK,iBAAA;AAAA,UACf,MAAA,EAAQ,IAAA,CAAK,OAAA,CAAQ,QAAA,KAAa,SAAS,MAAA,GAAS,MAAA;AAAA,UACpD,cAAA,EAAgB,IAAA,CAAK,QAAA,CAAS,WAAA,CAAY,IAAA;AAAA,UAC1C,YAAA,EAAc,KAAK,OAAA,CAAQ,YAAA;AAAA,UAC3B,cAAA,EAAgB,KAAK,OAAA,CAAQ;AAAA,SAC9B,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,QAAA,IAAA,CAAK,aAAa,IAAA,CAAK,EAAE,QAAA,EAAU,IAAA,CAAK,mBAAmB,CAAA;AAAA,MAC7D;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AAKvB,MAAA,IAAA,CAAK,aAAA,CAAc,QAAQ,CAAA,OAAA,KAAW;AACpC,QAAA,OAAA,EAAQ;AAAA,MACV,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,GAAuB;AAC7B,IAAA,IAAI,IAAA,CAAK,sBAAsB,UAAA,EAAY;AACzC,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,SAAA,IAAa,IAAA,CAAK,QAAQ,aAAA,EAAgB;AAC9D,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,SAAA,IAAa,IAAA,CAAK,QAAQ,YAAA,EAAe;AAC7D,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,SAAA,GAAY,CAAA,EAAG;AACnC,MAAA,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,IAAW,IAAA,CAAK,QAAQ,cAAA,EAAiB;AAC7D,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAA,GAAsB;AAC5B,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,YAAA,CAAa,KAAK,WAAW,CAAA;AAAA,IAC/B;AACA,IAAA,IAAA,CAAK,WAAA,GAAc,WAAW,MAAM;AAClC,MAAA,IAAA,CAAK,WAAA,EAAY,CAAE,KAAA,CAAM,CAAA,KAAA,KAAS;AAChC,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,wBAAA,EAA0B;AAAA,UAC1C,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SAC7D,CAAA;AAAA,MACH,CAAC,CAAA;AAAA,IACH,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,cAAc,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,kBAAA,GAAoC;AAChD,IAAA,IAAI,IAAA,CAAK,aAAY,EAAG;AACtB,MAAA,MAAM,KAAK,WAAA,EAAY;AAAA,IACzB,CAAA,MAAA,IAAW,IAAA,CAAK,YAAA,CAAa,SAAA,KAAc,CAAA,EAAG;AAC5C,MAAA,IAAA,CAAK,aAAA,EAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAEQ,kBAAkBgB,OAAA,EAAiD;AACzE,IAAA,IAAIA,mBAAiBC,iBAAAA,EAAa;AAChC,MAAA,OAAO;AAAA,QACL,IAAID,OAAA,CAAM,EAAA;AAAA,QACV,MAAA,EAAQ,MAAA,CAAOA,OAAA,CAAM,MAAM,CAAA;AAAA,QAC3B,SAASA,OAAA,CAAM;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,IAAIA,mBAAiB,KAAA,EAAO;AAC1B,MAAA,OAAO,EAAE,OAAA,EAASA,OAAA,CAAM,OAAA,EAAQ;AAAA,IAClC;AAEA,IAAA,OAAO,EAAE,OAAA,EAAS,MAAA,CAAOA,OAAK,CAAA,EAAE;AAAA,EAClC;AAAA,EAEQ,QAAA,CACN,MAAA,EACA,MAAA,EACA,KAAA,EACA,KAAA,EACM;AACN,IAAA,IAAI,UAAU,CAAA,EAAG;AAEjB,IAAA,MAAM,SAAA,GAAoC;AAAA,MACxC,IAAA,EAAM,MAAA;AAAA,MACN,MAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,cAAc,IAAA,CAAK,IAAA;AAAA,MACnB,GAAI,IAAA,CAAK,qBAAA,GAAwB,EAAE,WAAA,EAAa,KAAK,qBAAA,CAAsB,WAAA,CAAY,IAAA,EAAK,GAAI,EAAC;AAAA,MACjG,GAAI,KAAA,KAAU,MAAA,GAAY,EAAC,GAAI,EAAE,KAAA,EAAO,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAA;AAAE,KACxE;AAEA,IAAA,IAAA,CAAK,iBAAiB,SAAS,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,YAAA,CACZ,MAAA,EACA,MAAA,EACA,WAAA,EACe;AACf,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACzB,IAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,MAAM,CAAA,EAAG;AACxC,MAAA,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,qBAAA,EAAuB,MAAA,CAAO,MAAM,CAAA;AAC1D,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,YAAY,MAAM,CAAA;AAAA,IAC1B,SAASA,OAAA,EAAO;AACd,MAAA,IACEA,OAAA,YAAiBC,iBAAAA,IACjBD,OAAA,CAAM,MAAA,KAAWS,iBAAAA,CAAY,wBAC7BT,OAAA,CAAM,EAAA,CAAG,QAAA,CAAS,kBAAkB,CAAA,EACpC;AACA,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAKA,OAAA,CAAM,OAAO,CAAA;AAC9B,QAAA,IAAA,CAAK,mBAAA,CAAoB,IAAI,MAAM,CAAA;AACnC,QAAA,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,qBAAA,EAAuB,MAAA,CAAO,QAAQA,OAAK,CAAA;AAAA,MACnE,CAAA,MAAO;AACL,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,MAAM,CAAA;AACrD,QAAA,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,iBAAA,EAAmB,OAAA,CAAQ,QAAQA,OAAK,CAAA;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,gBAAA,CACZ,MAAA,EACA,eAAA,EACA,KAAA,EACe;AACf,IAAA,MAAM,uBAAuB,eAAA,CAAgB,MAAA;AAC7C,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACzB,IAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,SAAS,CAAA,EAAG;AAC3C,MAAA,IAAA,CAAK,QAAA,CAAS,SAAA,EAAW,qBAAA,EAAuB,MAAA,CAAO,MAAM,CAAA;AAC7D,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,WAAgC,EAAC;AACvC,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,OAAO,KAAA,CAAM,YAAA;AACnB,MAAA,IAAI,IAAA,CAAK,YAAA,CAAa,UAAA,CAAW,IAAI,CAAA,EAAG;AACtC,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,SAAS,IAAA,CAAK,OAAA;AAAA,UACd,QAAQ,IAAA,CAAK,EAAA;AAAA,UACb,OAAA,EAASW,8BAAsB,IAAI;AAAA,SACpC,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,eAAA,CAAgB,KAAK,KAAK,CAAA;AAAA,MAC5B;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAE3B,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,qBAAA,CAAuB,gBAAA,CAAiB,EAAE,OAAA,EAAS,UAAU,CAAA;AACxE,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,IAAA,CAAK,YAAA,CAAa,gBAAA,CAAiB,EAAE,OAAA,EAAS,UAAU,CAAA;AAAA,MAC1D;AAAA,IACF,SAASX,OAAA,EAAO;AACd,MAAA,IACEA,OAAA,YAAiBC,iBAAAA,IACjBD,OAAA,CAAM,MAAA,KAAWS,iBAAAA,CAAY,wBAC7BT,OAAA,CAAM,EAAA,CAAG,QAAA,CAAS,kBAAkB,CAAA,EACpC;AACA,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAKA,OAAA,CAAM,OAAO,CAAA;AAC9B,QAAA,IAAA,CAAK,mBAAA,CAAoB,IAAI,SAAS,CAAA;AACtC,QAAA,eAAA,CAAgB,MAAA,GAAS,CAAA;AACzB,QAAA,IAAA,CAAK,SAAS,SAAA,EAAW,qBAAA,EAAuB,MAAA,CAAO,MAAA,GAAS,sBAAsBA,OAAK,CAAA;AAAA,MAC7F,CAAA,MAAO;AAKL,QAAA,MAAM,aAAA,GAAgB,gBAAgB,MAAA,GAAS,oBAAA;AAC/C,QAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,UAAA,eAAA,CAAgB,MAAA,CAAO,eAAA,CAAgB,MAAA,GAAS,aAAA,EAAe,aAAa,CAAA;AAAA,QAC9E;AACA,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,MAAM,CAAA;AACrD,QAAA,IAAA,CAAK,QAAA,CAAS,SAAA,EAAW,iBAAA,EAAmB,OAAA,CAAQ,QAAQA,OAAK,CAAA;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAc,WAAA,GAA6B;AACzC,IAAA,IAAI,CAAC,KAAK,qBAAA,EAAuB;AAC/B,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,wDAAwD,CAAA;AAC1E,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,KAAK,iBAAA,EAAmB;AAC3B,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,sDAAsD,CAAA;AACxE,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,YAAA,CAAa,KAAK,WAAW,CAAA;AAC7B,MAAA,IAAA,CAAK,WAAA,GAAc,MAAA;AAAA,IACrB;AAEA,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,SAAA,KAAc,CAAA,EAAG;AACrC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,SAAA,GAAY,KAAK,YAAA,CAAa,SAAA;AAGpC,IAAA,MAAM,OAAA,GAAU,KAAK,YAAA,CAAa,OAAA;AAClC,IAAA,MAAM,OAAA,GAAU,KAAK,YAAA,CAAa,OAAA;AAClC,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AAExB,IAAA,MAAM,uBAAuD,EAAC;AAC9D,IAAA,MAAM,kBAA6C,EAAC;AACpD,IAAA,MAAM,qBAAmD,EAAC;AAC1D,IAAA,MAAM,oBAAiD,EAAC;AACxD,IAAA,MAAM,mBAAkD,EAAC;AAEzD,IAAA,MAAM,mBAAkD,EAAC;AACzD,IAAA,MAAM,gBAA+C,EAAC;AAEtD,IAAA,KAAA,MAAW,eAAe,OAAA,EAAS;AACjC,MAAA,QAAQ,YAAY,IAAA;AAAM,QACxB,KAAK,UAAA;AACH,UAAA,oBAAA,CAAqB,KAAK,WAAW,CAAA;AACrC,UAAA;AAAA,QACF,KAAK,KAAA;AACH,UAAA,eAAA,CAAgB,KAAK,WAAW,CAAA;AAChC,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,kBAAA,CAAmB,KAAK,WAAW,CAAA;AACnC,UAAA;AAAA,QACF,KAAK,OAAA;AACH,UAAA,iBAAA,CAAkB,KAAK,WAAW,CAAA;AAClC,UAAA;AAAA,QACF;AACE,UAAA,gBAAA,CAAiB,KAAK,WAAW,CAAA;AACjC,UAAA;AAAA;AACJ,IACF;AAEA,IAAA,KAAA,MAAW,eAAe,OAAA,EAAS;AACjC,MAAA,QAAQ,YAAY,IAAA;AAAM,QACxB,KAAKhB,8BAAAA,CAAiB,YAAA;AACpB,UAAA,gBAAA,CAAiB,KAAK,WAAW,CAAA;AACjC,UAAA;AAAA,QACF,KAAKA,8BAAAA,CAAiB,UAAA;AACpB,UAAA,aAAA,CAAc,KAAK,WAAW,CAAA;AAC9B,UAAA;AAAA;AACJ,IACF;AAGA,IAAA,MAAM,QAAQ,GAAA,CAAI;AAAA,MAChB,IAAA,CAAK,YAAA;AAAA,QAAa,UAAA;AAAA,QAAY,oBAAA;AAAA,QAAsB,CAAA,MAAA,KAClD,IAAA,CAAK,qBAAA,CAAuB,mBAAA,CAAoB,EAAE,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK4B,2BAAA,CAAoB,CAAC,CAAC,GAAG;AAAA,OACxG;AAAA,MACA,IAAA,CAAK,YAAA;AAAA,QAAa,KAAA;AAAA,QAAO,eAAA;AAAA,QAAiB,CAAA,MAAA,KACxC,IAAA,CAAK,qBAAA,CAAuB,eAAA,CAAgB,EAAE,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAKC,sBAAA,CAAe,CAAC,CAAC,GAAG;AAAA,OAC1F;AAAA,MACA,IAAA,CAAK,YAAA;AAAA,QAAa,QAAA;AAAA,QAAU,kBAAA;AAAA,QAAoB,CAAA,MAAA,KAC9C,IAAA,CAAK,qBAAA,CAAuB,kBAAA,CAAmB,EAAE,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAKC,yBAAA,CAAkB,CAAC,CAAC,GAAG;AAAA,OACnG;AAAA,MACA,IAAA,CAAK,YAAA;AAAA,QAAa,OAAA;AAAA,QAAS,iBAAA;AAAA,QAAmB,CAAA,MAAA,KAC5C,IAAA,CAAK,qBAAA,CAAuB,iBAAA,CAAkB,EAAE,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAKC,wBAAA,CAAiB,CAAC,CAAC,GAAG;AAAA,OAChG;AAAA,MACA,IAAA,CAAK,YAAA,CAAa,SAAA,EAAW,gBAAA,EAAkB,OAAM,MAAA,KAAU;AAC7D,QAAA,MAAM,UAAU,MAAA,CAAO,GAAA,CAAI,OAAKC,6BAAA,CAAsB,CAAA,CAAE,YAAY,CAAC,CAAA;AACrE,QAAA,MAAM,IAAA,CAAK,qBAAA,CAAuB,gBAAA,CAAiB,EAAE,SAAS,CAAA;AAC9D,QAAA,IAAA,CAAK,YAAA,CAAa,eAAA,CAAgB,EAAE,OAAA,EAAS,CAAA;AAAA,MAC/C,CAAC;AAAA,KACF,CAAA;AAGD,IAAA,MAAM,kBAAmC,EAAC;AAE1C,IAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,gBAAA,EAAkB,eAAA,EAAiB,KAAK,CAAA;AACpE,IAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,aAAA,EAAe,eAAA,EAAiB,IAAI,CAAA;AAEhE,IAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,MAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,SAAS,CAAA,EAAG;AAC3C,QAAA,IAAA,CAAK,QAAA,CAAS,SAAA,EAAW,qBAAA,EAAuB,eAAA,CAAgB,MAAM,CAAA;AACtE,QAAA,eAAA,CAAgB,MAAA,GAAS,CAAA;AAAA,MAC3B,CAAA,MAAO;AACL,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,eAAe,CAAA;AAC9D,QAAA,IAAA,CAAK,QAAA,CAAS,SAAA,EAAW,iBAAA,EAAmB,OAAA,CAAQ,MAAM,CAAA;AAAA,MAC5D;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC7B,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,eAAA,EAAiB;AAAA,MACjC,UAAU,IAAA,CAAK,iBAAA;AAAA,MACf,SAAA;AAAA,MACA,UAAA,EAAY,OAAA;AAAA,MACZ,eAAA,EAAiB,eAAA,CAAgB,MAAA,GAAS,CAAA,GAAI,gBAAgB,MAAA,GAAS;AAAA,KACxE,CAAA;AACD,IAAA;AAAA,EACF;AAAA,EAEA,MAAM,oBAAoB,KAAA,EAAoC;AAC5D,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,IAAI,CAAC,KAAK,qBAAA,EAAuB;AAC/B,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,+DAA+D,CAAA;AACjF,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,YAAA,CAAa,SAAS,KAAK,CAAA;AAChC,IAAA,MAAM,KAAK,kBAAA,EAAmB;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,WAAA,GAA6B;AACzC,IAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AAC3B,IAAA,OAAO,IAAI,QAAQ,CAAA,OAAA,KAAW;AAC5B,MAAA,IAAA,CAAK,aAAA,CAAc,IAAI,OAAO,CAAA;AAAA,IAChC,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,KAAA,EAAmC;AACrD,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,IAAI,CAAC,KAAK,qBAAA,EAAuB;AAEjC,IAAA,IAAA,CAAK,YAAA,CAAa,SAAS,KAAK,CAAA;AAChC,IAAA,MAAM,KAAK,kBAAA,EAAmB;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,KAAA,EAAgC;AAC/C,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,IAAI,CAAC,KAAK,qBAAA,EAAuB;AAEjC,IAAA,IAAA,CAAK,YAAA,CAAa,SAAS,KAAK,CAAA;AAChC,IAAA,MAAM,KAAK,kBAAA,EAAmB;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,KAAA,EAAkC;AACnD,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,IAAI,CAAC,KAAK,qBAAA,EAAuB;AAEjC,IAAA,IAAA,CAAK,YAAA,CAAa,SAAS,KAAK,CAAA;AAChC,IAAA,MAAM,KAAK,kBAAA,EAAmB;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,KAAA,EAAqC;AACzD,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,IAAI,CAAC,KAAK,qBAAA,EAAuB;AAEjC,IAAA,IAAA,CAAK,YAAA,CAAa,SAAS,KAAK,CAAA;AAChC,IAAA,MAAM,KAAK,kBAAA,EAAmB;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,SAAA,GAAY,CAAA,EAAG;AACnC,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,0BAAA,EAA4B;AAAA,QAC5C,cAAA,EAAgB,KAAK,YAAA,CAAa;AAAA,OACnC,CAAA;AACD,MAAA,MAAM,KAAK,WAAA,EAAY;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,GAA0B;AAE9B,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,YAAA,CAAa,KAAK,WAAW,CAAA;AAC7B,MAAA,IAAA,CAAK,WAAA,GAAc,MAAA;AAAA,IACrB;AAGA,IAAA,MAAM,KAAK,KAAA,EAAM;AAEjB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,mCAAmC,CAAA;AAAA,EACtD;AACF;ACniBA,IAAMC,wBAAAA,GAA0D;AAAA,EAC9D,MAAA,EAAQ,gBAAA;AAAA,EACR,IAAA,EAAM,eAAA;AAAA,EACN,OAAA,EAAS,kBAAA;AAAA,EACT,MAAA,EAAQ,iBAAA;AAAA,EACR,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,4BAAA,GAA+B,CAAC,IAAA,KAAmC,IAAA,CAAK,SAAS3B,sBAAAA,CAAS,WAAA;AAEhG,IAAM4B,wBAAAA,GAA0D;AAAA,EAC9D,MAAA,EAAQ,OAAA;AAAA,EACR,IAAA,EAAM,MAAA;AAAA,EACN,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ,QAAA;AAAA,EACR,QAAA,EAAU;AACZ,CAAA;AAEA,SAASC,qBAAoB,KAAA,EAAuB;AAClD,EAAA,IAAI,MAAM,KAAA,CAAM,MAAA;AAChB,EAAA,OAAO,MAAM,CAAA,IAAK,KAAA,CAAM,WAAW,GAAA,GAAM,CAAC,MAAM,EAAA,EAAI;AAClD,IAAA,GAAA,EAAA;AAAA,EACF;AACA,EAAA,OAAO,QAAQ,KAAA,CAAM,MAAA,GAAS,QAAQ,KAAA,CAAM,KAAA,CAAM,GAAG,GAAG,CAAA;AAC1D;AAEA,SAASC,2BAAAA,CAA2B,QAAA,EAAkB,IAAA,EAAc,KAAA,EAA8B;AAChG,EAAA,OAAO,IAAInB,iBAAAA;AAAA,IACT;AAAA,MACE,EAAA,EAAI,CAAA,yCAAA,CAAA;AAAA,MACJ,IAAA;AAAA,MACA,QAAQQ,iBAAAA,CAAY,oBAAA;AAAA,MACpB,UAAUC,mBAAAA,CAAc,IAAA;AAAA,MACxB,OAAA,EAAS;AAAA,QACP;AAAA;AACF,KACF;AAAA,IACA;AAAA,GACF;AACF;AAEA,IAAMW,iBAAAA,GAAmB,kBAAA;AAEzB,SAASC,6BAA4B,SAAA,EAAgC;AACnE,EAAA,OAAO,IAAIrB,iBAAAA,CAAY;AAAA,IACrB,EAAA,EAAI,CAAA,2CAAA,CAAA;AAAA,IACJ,IAAA,EAAM,gGAAA;AAAA,IACN,QAAQQ,iBAAAA,CAAY,oBAAA;AAAA,IACpB,UAAUC,mBAAAA,CAAc,IAAA;AAAA,IACxB,OAAA,EAAS;AAAA,MACP;AAAA;AACF,GACD,CAAA;AACH;AAEA,SAASa,qBAAoB,YAAA,EAA8B;AACzD,EAAA,MAAM,kBAAA,GAAqBJ,qBAAoB,YAAY,CAAA;AAC3D,EAAA,MAAM,WAAA,GACJ,2HAAA;AAEF,EAAA,IAAI;AACF,IAAA,MAAM,cAAA,GAAiB,IAAI,GAAA,CAAI,kBAAkB,CAAA;AACjD,IAAA,IAAI,eAAe,QAAA,KAAa,GAAA,IAAO,cAAA,CAAe,MAAA,IAAU,eAAe,IAAA,EAAM;AACnF,MAAA,MAAMC,2BAAAA,CAA2B,cAAc,WAAW,CAAA;AAAA,IAC5D;AACA,IAAA,OAAOD,oBAAAA,CAAoB,eAAe,MAAM,CAAA;AAAA,EAClD,SAASnB,OAAA,EAAO;AACd,IAAA,IAAIA,mBAAiBC,iBAAAA,EAAa;AAChC,MAAA,MAAMD,OAAA;AAAA,IACR;AAEA,IAAA,MAAMoB,2BAAAA,CAA2B,YAAA,EAAc,WAAA,EAAapB,OAAK,CAAA;AAAA,EACnE;AACF;AAEA,SAASwB,gBAAAA,CAAgB,QAAwB,SAAA,EAA4B;AAC3E,EAAA,MAAM,aAAA,GAAgBN,yBAAwB,MAAM,CAAA;AACpD,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,OAAO,aAAa,CAAA,QAAA,CAAA;AAAA,EAC7B;AAEA,EAAA,OAAO,CAAA,UAAA,EAAa,SAAS,CAAA,IAAA,EAAO,aAAa,CAAA,QAAA,CAAA;AACnD;AAEA,SAASO,oBAAAA,CAAoB,YAAA,EAAsB,MAAA,EAAwB,SAAA,EAA4B;AACrG,EAAA,OAAO,GAAG,YAAY,CAAA,EAAGD,gBAAAA,CAAgB,MAAA,EAAQ,SAAS,CAAC,CAAA,CAAA;AAC7D;AAEA,SAASE,8BAAAA,CAA8B,MAAA,EAAwB,QAAA,EAAkB,SAAA,EAA4B;AAC3G,EAAA,MAAM,kBAAA,GAAqBP,qBAAoB,QAAQ,CAAA;AACvD,EAAA,MAAM,WAAA,GAAc,0BAA0B,MAAM,CAAA,8EAAA,EAAiF,MAAM,CAAA,wBAAA,EAA2BF,wBAAAA,CAAwB,MAAM,CAAC,CAAA,EAAA,CAAA;AAErM,EAAA,IAAI;AACF,IAAA,MAAM,cAAA,GAAiB,IAAI,GAAA,CAAI,kBAAkB,CAAA;AACjD,IAAA,IAAI,cAAA,CAAe,MAAA,IAAU,cAAA,CAAe,IAAA,EAAM;AAChD,MAAA,MAAMG,2BAAAA,CAA2B,UAAU,WAAW,CAAA;AAAA,IACxD;AAEA,IAAA,MAAM,gBAAA,GAAmBD,oBAAAA,CAAoB,cAAA,CAAe,MAAM,CAAA;AAClE,IAAA,MAAM,kBAAA,GAAqBA,oBAAAA,CAAoB,cAAA,CAAe,QAAQ,CAAA;AAEtE,IAAA,IAAI,CAAC,kBAAA,IAAsB,kBAAA,KAAuB,GAAA,EAAK;AACrD,MAAA,OAAOM,oBAAAA,CAAoB,gBAAA,EAAkB,MAAA,EAAQ,SAAS,CAAA;AAAA,IAChE;AAEA,IAAA,IAAI,kBAAA,CAAmB,QAAA,CAASR,wBAAAA,CAAwB,MAAM,CAAC,CAAA,EAAG;AAChE,MAAA,OAAO,CAAA,EAAG,gBAAgB,CAAA,EAAG,kBAAkB,CAAA,CAAA;AAAA,IACjD;AAEA,IAAA,MAAMG,2BAAAA,CAA2B,UAAU,WAAW,CAAA;AAAA,EACxD,SAASpB,OAAA,EAAO;AACd,IAAA,IAAIA,mBAAiBC,iBAAAA,EAAa;AAChC,MAAA,MAAMD,OAAA;AAAA,IACR;AAEA,IAAA,MAAMoB,2BAAAA,CAA2B,QAAA,EAAU,WAAA,EAAapB,OAAK,CAAA;AAAA,EAC/D;AACF;AAEA,SAAS2B,uCAAAA,CAAuC,QAAwB,cAAA,EAAgC;AACtG,EAAA,IAAI,WAAW,QAAA,EAAU;AACvB,IAAA,OAAO,cAAA;AAAA,EACT;AAEA,EAAA,MAAM,wBAAA,GAA2BR,qBAAoB,cAAc,CAAA;AACnE,EAAA,MAAM,WAAA,GACJ,2JAAA;AAEF,EAAA,IAAI;AACF,IAAA,MAAM,cAAA,GAAiB,IAAI,GAAA,CAAI,wBAAwB,CAAA;AACvD,IAAA,MAAM,gBAAA,GAAmBA,oBAAAA,CAAoB,cAAA,CAAe,MAAM,CAAA;AAClE,IAAA,MAAM,kBAAA,GAAqBA,oBAAAA,CAAoB,cAAA,CAAe,QAAQ,CAAA;AAEtE,IAAA,IAAI,CAAC,kBAAA,CAAmB,QAAA,CAASF,wBAAAA,CAAwB,MAAM,CAAA,EAAG;AAChE,MAAA,MAAMG,2BAAAA,CAA2B,gBAAgB,WAAW,CAAA;AAAA,IAC9D;AAEA,IAAA,MAAM,WAAW,kBAAA,CAAmB,KAAA,CAAM,GAAG,CAACH,wBAAAA,CAAwB,OAAO,MAAM,CAAA;AACnF,IAAA,OAAO,GAAG,gBAAgB,CAAA,EAAG,QAAQ,CAAA,EAAGA,wBAAAA,CAAwB,MAAM,CAAC,CAAA,CAAA;AAAA,EACzE,SAASjB,OAAA,EAAO;AACd,IAAA,IAAIA,mBAAiBC,iBAAAA,EAAa;AAChC,MAAA,MAAMD,OAAA;AAAA,IACR;AAEA,IAAA,MAAMoB,2BAAAA,CAA2B,cAAA,EAAgB,WAAA,EAAapB,OAAK,CAAA;AAAA,EACrE;AACF;AAyCO,IAAM,sBAAA,GAAN,cAAqC,YAAA,CAAa;AAAA,EACvD,IAAA,GAAO,0BAAA;AAAA,EAEU,cAAA;AAAA,EACA,mBAAA;AAAA,EACT,MAAA;AAAA,EACA,UAAA,GAAoC,IAAA;AAAA,EACpC,eAAA,uBAAsB,GAAA,EAAmB;AAAA,EAEjD,WAAA,CAAY,MAAA,GAAuC,EAAC,EAAG;AACrD,IAAA,KAAA,CAAM,MAAM,CAAA;AAEZ,IAAA,IAAI,MAAA,CAAO,cAAc,MAAA,IAAa,CAACqB,kBAAiB,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,EAAG;AAC9E,MAAA,MAAMC,4BAAAA,CAA4B,OAAO,SAAS,CAAA;AAAA,IACpD;AAEA,IAAA,MAAM,cACJ,MAAA,CAAO,WAAA,IAAe,QAAQ,GAAA,CAAI,4BAAA,IAAgC,QAAQ,GAAA,CAAI,yBAAA;AAGhF,IAAA,MAAM,eAAe,OAAA,CAAQ,GAAA,CAAI,sBAAsB,EAAA,GAAK,MAAA,GAAY,QAAQ,GAAA,CAAI,iBAAA;AACpF,IAAA,MAAM,YAAA,GAAe,OAAO,SAAA,IAAa,YAAA;AACzC,IAAA,IAAI,iBAAiB,MAAA,IAAa,CAACD,iBAAAA,CAAiB,IAAA,CAAK,YAAY,CAAA,EAAG;AACtE,MAAA,MAAMC,6BAA4B,YAAY,CAAA;AAAA,IAChD;AACA,IAAA,MAAM,SAAA,GAAY,YAAA;AAClB,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,IAAA,CAAK,WAAA,CAAY,8DAA8D,OAAO,CAAA;AAAA,IACxF;AAEA,IAAA,MAAM,sBAAA,GAAyB,MAAA,CAAO,cAAA,IAAkB,OAAA,CAAQ,GAAA,CAAI,4BAAA;AACpE,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI,cAAA;AAEJ,IAAA,IAAI,sBAAA,EAAwB;AAC1B,MAAA,cAAA,GAAiBI,8BAAAA,CAA8B,QAAA,EAAU,sBAAA,EAAwB,SAAS,CAAA;AAAA,IAC5F,CAAA,MAAO;AACL,MAAA,YAAA,GAAeH,oBAAAA,CAAoB,MAAA,CAAO,QAAA,IAAY,iCAAiC,CAAA;AACvF,MAAA,cAAA,GAAiBE,oBAAAA,CAAoB,YAAA,EAAc,QAAA,EAAU,SAAS,CAAA;AAAA,IACxE;AAEA,IAAA,MAAM,+BAAA,GAAkC,CACtC,MAAA,EACA,gBAAA,KACW;AACX,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,OAAOC,8BAAAA,CAA8B,MAAA,EAAQ,gBAAA,EAAkB,SAAS,CAAA;AAAA,MAC1E;AAEA,MAAA,IAAI,sBAAA,EAAwB;AAC1B,QAAA,OAAOC,uCAAAA,CAAuC,QAAQ,cAAc,CAAA;AAAA,MACtE;AAEA,MAAA,OAAOF,oBAAAA,CAAoB,YAAA,EAAe,MAAA,EAAQ,SAAS,CAAA;AAAA,IAC7D,CAAA;AAEA,IAAA,IAAA,CAAK,cAAA,GAAiB;AAAA,MACpB,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,QAAA,EAAU,MAAA,CAAO,QAAA,IAAYlB,eAAAA,CAAS,IAAA;AAAA,MACtC,YAAA,EAAc,OAAO,YAAA,IAAgB,GAAA;AAAA,MACrC,cAAA,EAAgB,OAAO,cAAA,IAAkB,GAAA;AAAA,MACzC,UAAA,EAAY,OAAO,UAAA,IAAc,CAAA;AAAA,MACjC,aAAa,WAAA,IAAe,EAAA;AAAA,MAC5B,cAAA;AAAA,MACA,YAAA,EAAc,+BAAA,CAAgC,MAAA,EAAQ,MAAA,CAAO,YAAY,CAAA;AAAA,MACzE,eAAA,EAAiB,+BAAA,CAAgC,SAAA,EAAW,MAAA,CAAO,eAAe,CAAA;AAAA,MAClF,cAAA,EAAgB,+BAAA,CAAgC,QAAA,EAAU,MAAA,CAAO,cAAc,CAAA;AAAA,MAC/E,gBAAA,EAAkB,+BAAA,CAAgC,UAAA,EAAY,MAAA,CAAO,gBAAgB;AAAA,KACvF;AAEA,IAAA,IAAA,CAAK,sBAAsB,IAAI,mBAAA,CAAoB,wBAAA,EAA0B,MAAM,KAAK,MAAM,CAAA;AAE9F,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,OAAO,EAAC;AAAA,MACR,MAAM,EAAC;AAAA,MACP,SAAS,EAAC;AAAA,MACV,QAAQ,EAAC;AAAA,MACT,UAAU,EAAC;AAAA,MACX,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AAAA,EAEA,MAAgB,oBAAoB,KAAA,EAAoC;AACtE,IAAA,IAAI,KAAA,CAAM,IAAA,KAASvB,8BAAAA,CAAiB,UAAA,EAAY;AAC9C,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,4BAAA,CAA6B,KAAA,CAAM,YAAY,CAAA,EAAG;AACrD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,sBAAA,EAAuB,EAAG;AACrD,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AAEtB,IAAA,MAAM,KAAK,mBAAA,EAAoB;AAAA,EACjC;AAAA,EAEA,MAAM,WAAW,KAAA,EAAgC;AAC/C,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,sBAAA,EAAuB,EAAG;AACrD,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,eAAe,KAAK,CAAA;AACzB,IAAA,MAAM,KAAK,mBAAA,EAAoB;AAAA,EACjC;AAAA,EAEA,MAAM,cAAc,KAAA,EAAmC;AACrD,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,sBAAA,EAAuB,EAAG;AACrD,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAC5B,IAAA,MAAM,KAAK,mBAAA,EAAoB;AAAA,EACjC;AAAA,EAEA,MAAM,aAAa,KAAA,EAAkC;AACnD,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,sBAAA,EAAuB,EAAG;AACrD,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,iBAAiB,KAAK,CAAA;AAC3B,IAAA,MAAM,KAAK,mBAAA,EAAoB;AAAA,EACjC;AAAA,EAEA,MAAM,gBAAgB,KAAA,EAAqC;AACzD,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,sBAAA,EAAuB,EAAG;AACrD,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,oBAAoB,KAAK,CAAA;AAC9B,IAAA,MAAM,KAAK,mBAAA,EAAoB;AAAA,EACjC;AAAA,EAEQ,YAAY,KAAA,EAA2B;AAC7C,IAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,YAAY,CAAA;AACrD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA;AACjC,IAAA,IAAA,CAAK,MAAA,CAAO,SAAA,EAAA;AAAA,EACd;AAAA,EAEQ,eAAe,KAAA,EAAuB;AAC5C,IAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA,CAAK,KAAK,SAAA,CAAU,KAAA,CAAM,GAAG,CAAC,CAAA;AAC/C,IAAA,IAAA,CAAK,MAAA,CAAO,SAAA,EAAA;AAAA,EACd;AAAA,EAEQ,kBAAkB,KAAA,EAA0B;AAClD,IAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,IAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,YAAA,CAAa,KAAA,CAAM,MAAM,CAAC,CAAA;AACxD,IAAA,IAAA,CAAK,MAAA,CAAO,SAAA,EAAA;AAAA,EACd;AAAA,EAEQ,iBAAiB,KAAA,EAAyB;AAChD,IAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,IAAA,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA,CAAK,KAAK,WAAA,CAAY,KAAA,CAAM,KAAK,CAAC,CAAA;AACrD,IAAA,IAAA,CAAK,MAAA,CAAO,SAAA,EAAA;AAAA,EACd;AAAA,EAEQ,oBAAoB,KAAA,EAA4B;AACtD,IAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,IAAA,IAAA,CAAK,OAAO,QAAA,CAAS,IAAA,CAAK,KAAK,cAAA,CAAe,KAAA,CAAM,QAAQ,CAAC,CAAA;AAC7D,IAAA,IAAA,CAAK,MAAA,CAAO,SAAA,EAAA;AAAA,EACd;AAAA,EAEQ,eAAA,GAAwB;AAC9B,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,SAAA,KAAc,CAAA,EAAG;AAC/B,MAAA,IAAA,CAAK,MAAA,CAAO,cAAA,mBAAiB,IAAI,IAAA,EAAK;AAAA,IACxC;AAAA,EACF;AAAA,EAEQ,WAAW,IAAA,EAAiD;AAClE,IAAA,MAAM,UAAA,GAAuC;AAAA,MAC3C,GAAG,IAAA;AAAA,MACH,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,UAAU,IAAA,CAAK,IAAA;AAAA,MACf,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,OAAA,EAAS,KAAK,OAAA,IAAW,IAAA;AAAA,MACzB,KAAA,EAAO,KAAK,SAAA,IAAa,IAAA;AAAA,MACzB,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,SAAA,EAAW;AAAA,KACb;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEQ,UAAU,GAAA,EAA+C;AAC/D,IAAA,OAAO;AAAA,MACL,GAAG;AAAA,KACL;AAAA,EACF;AAAA,EAEQ,aAAa,MAAA,EAA2D;AAC9E,IAAA,OAAO;AAAA,MACL,GAAG;AAAA,KACL;AAAA,EACF;AAAA,EAEQ,YAAY,KAAA,EAAuD;AACzE,IAAA,OAAO;AAAA,MACL,GAAG;AAAA,KACL;AAAA,EACF;AAAA,EAEQ,eAAe,QAAA,EAAmE;AACxF,IAAA,OAAO;AAAA,MACL,GAAG;AAAA,KACL;AAAA,EACF;AAAA,EAEA,MAAc,mBAAA,GAAqC;AACjD,IAAA,IAAI,IAAA,CAAK,aAAY,EAAG;AACtB,MAAA,KAAK,IAAA,CAAK,KAAA,EAAM,CAAE,KAAA,CAAM,CAAA,KAAA,KAAS;AAC/B,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,oBAAA,EAAsB;AAAA,UACtC,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SAC7D,CAAA;AAAA,MACH,CAAC,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,IAAA,CAAK,MAAA,CAAO,SAAA,KAAc,CAAA,EAAG;AACtC,MAAA,IAAA,CAAK,aAAA,EAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAEQ,WAAA,GAAuB;AAC7B,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,IAAA,CAAK,eAAe,YAAA,EAAc;AAC7D,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,KAAK,MAAA,CAAO,cAAA,IAAkB,IAAA,CAAK,MAAA,CAAO,YAAY,CAAA,EAAG;AAC3D,MAAA,MAAM,UAAU,IAAA,CAAK,GAAA,KAAQ,IAAA,CAAK,MAAA,CAAO,eAAe,OAAA,EAAQ;AAChE,MAAA,IAAI,OAAA,IAAW,IAAA,CAAK,cAAA,CAAe,cAAA,EAAgB;AACjD,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,YAAA,CAAa,KAAK,UAAU,CAAA;AAAA,IAC9B;AACA,IAAA,IAAA,CAAK,UAAA,GAAa,WAAW,MAAM;AACjC,MAAA,KAAK,IAAA,CAAK,KAAA,EAAM,CAAE,KAAA,CAAM,CAAAgB,OAAA,KAAS;AAC/B,QAAA,MAAM,cAAc,IAAIC,iBAAAA;AAAA,UACtB;AAAA,YACE,EAAA,EAAI,CAAA,iDAAA,CAAA;AAAA,YACJ,QAAQQ,iBAAAA,CAAY,oBAAA;AAAA,YACpB,UAAUC,mBAAAA,CAAc;AAAA,WAC1B;AAAA,UACAV;AAAA,SACF;AACA,QAAA,IAAA,CAAK,MAAA,CAAO,eAAe,WAAW,CAAA;AACtC,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,wBAAA,EAA0B,WAAW,CAAA;AAAA,MACzD,CAAC,CAAA;AAAA,IACH,CAAA,EAAG,IAAA,CAAK,cAAA,CAAe,cAAc,CAAA;AAAA,EACvC;AAAA,EAEA,MAAc,WAAA,GAA6B;AACzC,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,YAAA,CAAa,KAAK,UAAU,CAAA;AAC5B,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,IACpB;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,SAAA,KAAc,CAAA,EAAG;AAC/B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAK,mBAAA,CAAoB,uBAAA,CAAwB,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,EAAG;AAC3E,MAAA,IAAA,CAAK,WAAA,EAAY;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,SAAA,GAAY,CAAC,GAAG,IAAA,CAAK,OAAO,KAAK,CAAA;AACvC,IAAA,MAAM,QAAA,GAAW,CAAC,GAAG,IAAA,CAAK,OAAO,IAAI,CAAA;AACrC,IAAA,MAAM,WAAA,GAAc,CAAC,GAAG,IAAA,CAAK,OAAO,OAAO,CAAA;AAC3C,IAAA,MAAM,UAAA,GAAa,CAAC,GAAG,IAAA,CAAK,OAAO,MAAM,CAAA;AACzC,IAAA,MAAM,YAAA,GAAe,CAAC,GAAG,IAAA,CAAK,OAAO,QAAQ,CAAA;AAC7C,IAAA,MAAM,SAAA,GAAY,KAAK,MAAA,CAAO,SAAA;AAC9B,IAAA,MAAM,cAAc,IAAA,CAAK,MAAA,CAAO,aAAa,IAAA,CAAK,cAAA,CAAe,eAAe,MAAA,GAAS,MAAA;AAEzF,IAAA,IAAA,CAAK,WAAA,EAAY;AAEjB,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,MAChC,IAAA,CAAK,gBAAA,CAAiB,QAAA,EAAU,SAAS,CAAA;AAAA,MACzC,IAAA,CAAK,gBAAA,CAAiB,MAAA,EAAQ,QAAQ,CAAA;AAAA,MACtC,IAAA,CAAK,gBAAA,CAAiB,SAAA,EAAW,WAAW,CAAA;AAAA,MAC5C,IAAA,CAAK,gBAAA,CAAiB,QAAA,EAAU,UAAU,CAAA;AAAA,MAC1C,IAAA,CAAK,gBAAA,CAAiB,UAAA,EAAY,YAAY;AAAA,KAC/C,CAAA;AAED,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,MAAA,CAAO,CAAA,MAAA,KAAU,CAAC,MAAA,CAAO,SAAS,CAAA,CAAE,GAAA,CAAI,CAAA,MAAA,KAAU,MAAA,CAAO,MAAM,CAAA;AAC7F,IAAA,MAAM,cAAc,OAAA,CAAQ,IAAA,CAAK,CAAA,MAAA,KAAU,MAAA,CAAO,sBAAsB,MAAS,CAAA;AAEjF,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAE7B,IAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,MAAA,MAAM,+BAAA,GAAkC,IAAA,CAAK,mBAAA,CAAoB,KAAA,EAAM;AACvE,MAAA,MAAM,OAAA,GAA2C;AAAA,QAC/C,SAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA,EAAY;AAAA,OACd;AAEA,MAAA,IAAI,kCAAkC,CAAA,EAAG;AACvC,QAAA,OAAA,CAAQ,+BAAA,GAAkC,+BAAA;AAAA,MAC5C;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,4BAAA,EAA8B,OAAO,CAAA;AACvD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,WAAA,EAAa,sBAAsB,MAAA,EAAW;AAChD,MAAA,IAAA,CAAK,oBAAoB,aAAA,CAAc;AAAA,QACrC,QAAQ,WAAA,CAAY,iBAAA;AAAA,QACpB,aAAA;AAAA,QACA,gBAAA,EAAkB;AAAA,OACnB,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,mDAAA,EAAqD;AAAA,MACpE,SAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA,EAAY,OAAA;AAAA,MACZ;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAA,CAAe,MAAA,EAAwB,OAAA,EAA6B;AAChF,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,cAAA,CAAe,WAAW,CAAA,CAAA;AAAA,MACxD,cAAA,EAAgB;AAAA,KAClB;AAEA,IAAA,MAAM,WAAA,GAA8C;AAAA,MAClD,MAAA,EAAQ,KAAK,cAAA,CAAe,cAAA;AAAA,MAC5B,IAAA,EAAM,KAAK,cAAA,CAAe,YAAA;AAAA,MAC1B,OAAA,EAAS,KAAK,cAAA,CAAe,eAAA;AAAA,MAC7B,MAAA,EAAQ,KAAK,cAAA,CAAe,cAAA;AAAA,MAC5B,QAAA,EAAU,KAAK,cAAA,CAAe;AAAA,KAChC;AAEA,IAAA,MAAM,OAAA,GAAuB;AAAA,MAC3B,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,CAACkB,yBAAwB,MAAM,CAAC,GAAG,OAAA,EAAS;AAAA,KACrE;AAEA,IAAA,MAAM,6BAA6B,WAAA,CAAY,MAAM,GAAG,OAAA,EAAS,IAAA,CAAK,eAAe,UAAU,CAAA;AAAA,EACjG;AAAA,EAEA,MAAc,gBAAA,CACZ,MAAA,EACA,OAAA,EACqF;AACrF,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,IAAA,EAAK;AAAA,IACnC;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,OAAO,CAAA;AACtC,MAAA,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,IAAA,EAAK;AAAA,IACnC,SAASlB,OAAA,EAAO;AACd,MAAA,IAAI,kBAAA,CAAmBA,OAAK,CAAA,EAAG;AAC7B,QAAA,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAO,iBAAA,EAAmBA,QAAM,MAAA,EAAO;AAAA,MACrE;AAEA,MAAA,MAAM,OAAA,GAAU,CAAA,gDAAA,EAAmD,MAAA,CAAO,WAAA,EAAa,CAAA,CAAA;AACvF,MAAA,MAAM,cAAc,IAAIC,iBAAAA;AAAA,QACtB;AAAA,UACE,EAAA,EAAI,OAAA;AAAA,UACJ,QAAQQ,iBAAAA,CAAY,oBAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,IAAA;AAAA,UACxB,OAAA,EAAS;AAAA,YACP,MAAA;AAAA,YACA,kBAAkB,OAAA,CAAQ;AAAA;AAC5B,SACF;AAAA,QACAV;AAAA,OACF;AACA,MAAA,IAAA,CAAK,MAAA,CAAO,eAAe,WAAW,CAAA;AACtC,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,uDAAA,EAAyD,WAAW,CAAA;AACtF,MAAA,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAM;AAAA,IACpC;AAAA,EACF;AAAA,EAEQ,WAAA,GAAoB;AAC1B,IAAA,IAAA,CAAK,MAAA,CAAO,QAAQ,EAAC;AACrB,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,EAAC;AACpB,IAAA,IAAA,CAAK,MAAA,CAAO,UAAU,EAAC;AACvB,IAAA,IAAA,CAAK,MAAA,CAAO,SAAS,EAAC;AACtB,IAAA,IAAA,CAAK,MAAA,CAAO,WAAW,EAAC;AACxB,IAAA,IAAA,CAAK,OAAO,cAAA,GAAiB,MAAA;AAC7B,IAAA,IAAA,CAAK,OAAO,SAAA,GAAY,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,OAAO,KAAK,MAAA,CAAO,SAAA,GAAY,KAAK,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA,EAAG;AACjE,MAAA,IAAI,IAAA,CAAK,MAAA,CAAO,SAAA,GAAY,CAAA,EAAG;AAC7B,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,0BAAA,EAA4B;AAAA,UAC5C,cAAA,EAAgB,KAAK,MAAA,CAAO;AAAA,SAC7B,CAAA;AAED,QAAA,MAAM,YAAA,GAAe,KAAK,WAAA,EAAY;AACtC,QAAA,IAAA,CAAK,eAAA,CAAgB,IAAI,YAAY,CAAA;AAErC,QAAA,IAAI;AACF,UAAA,MAAM,YAAA;AAAA,QACR,CAAA,SAAE;AACA,UAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,YAAY,CAAA;AAAA,QAC1C;AAEA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,QAAQ,UAAA,CAAW,CAAC,GAAG,IAAA,CAAK,eAAe,CAAC,CAAA;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,GAA0B;AAC9B,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,YAAA,CAAa,KAAK,UAAU,CAAA;AAC5B,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,IACpB;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,KAAA,EAAM;AAAA,IACnB,SAASA,OAAA,EAAO;AACd,MAAA,MAAM,cAAc,IAAIC,iBAAAA;AAAA,QACtB;AAAA,UACE,EAAA,EAAI,CAAA,yEAAA,CAAA;AAAA,UACJ,QAAQQ,iBAAAA,CAAY,oBAAA;AAAA,UACpB,UAAUC,mBAAAA,CAAc,IAAA;AAAA,UACxB,OAAA,EAAS;AAAA,YACP,eAAA,EAAiB,KAAK,MAAA,CAAO;AAAA;AAC/B,SACF;AAAA,QACAV;AAAA,OACF;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,eAAe,WAAW,CAAA;AACtC,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,kDAAA,EAAoD,WAAW,CAAA;AAAA,IACnF;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,0CAA0C,CAAA;AAAA,EAC7D;AACF;ACrpBA,SAAS4B,8BAAAA,CACP,MAAA,EACA,oBAAA,EACA,WAAA,EACA,MAAA,EACwB;AACxB,EAAA,MAAM,wBAAwB,oBAAA,CAAqB,qBAAA;AACnD,EAAA,IAAI,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,QAAA,KAAa,MAAA,EAAQ;AACjD,IAAA,IAAI,qBAAA,CAAsB,SAAA,CAAU,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA,EAAG;AAC7D,MAAA,OAAO,MAAA,CAAO,QAAA;AAAA,IAChB;AAEA,IAAA,MAAA,CAAO,KAAK,kGAAA,EAAoG;AAAA,MAC9G,cAAc,MAAA,CAAO,QAAA;AAAA,MACrB,cAAA,EAAgB,WAAA;AAAA,MAChB,qBAAqB,qBAAA,CAAsB,SAAA;AAAA,MAC3C,kBAAkB,qBAAA,CAAsB;AAAA,KACzC,CAAA;AAAA,EACH;AACA,EAAA,OAAO,qBAAA,CAAsB,SAAA;AAC/B;AAQO,IAAM,qBAAA,GAAN,cAAoC,YAAA,CAAa;AAAA,EACtD,IAAA,GAAO,yBAAA;AAAA,EAEP,OAAA;AAAA,EACA,eAAA,GAAkB,KAAA;AAAA,EAClB,aAAA,uBAAkC,GAAA,EAAI;AAAA,EACtC,YAAA;AAAA,EAEA,QAAA;AAAA,EACA,qBAAA;AAAA,EACA,iBAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA;AAAA,EAGA,mBAAA,uBAAwD,GAAA,EAAI;AAAA,EAE5D,WAAA,CAAY,MAAA,GAAsC,EAAC,EAAG;AACpD,IAAA,KAAA,CAAM,MAAM,CAAA;AAGZ,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,GAAG,MAAA;AAAA,MACH,YAAA,EAAc,OAAO,YAAA,IAAgB,GAAA;AAAA,MACrC,aAAA,EAAe,OAAO,aAAA,IAAiB,GAAA;AAAA,MACvC,cAAA,EAAgB,OAAO,cAAA,IAAkB,GAAA;AAAA,MACzC,UAAA,EAAY,OAAO,UAAA,IAAc,CAAA;AAAA,MACjC,YAAA,EAAc,OAAO,YAAA,IAAgB,GAAA;AAAA,MACrC,QAAA,EAAU,OAAO,QAAA,IAAY;AAAA,KAC/B;AAEA,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,WAAA,CAAY,EAAE,YAAY,IAAA,CAAK,OAAA,CAAQ,UAAA,IAAc,CAAA,EAAG,CAAA;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,OAAA,EAA6C;AACtD,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,MAAA,IAAA,CAAK,iBAAiB,OAAA,CAAQ,aAAA;AAE9B,MAAA,IAAA,CAAK,QAAA,GAAW,OAAA,CAAQ,MAAA,EAAQ,UAAA,EAAW;AAC3C,MAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,QAAA,IAAA,CAAK,MAAA,CAAO,KAAK,sFAAsF,CAAA;AACvG,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,qBAAA,GAAwB,MAAM,IAAA,CAAK,QAAA,CAAS,SAAS,eAAe,CAAA;AACzE,MAAA,IAAI,CAAC,KAAK,qBAAA,EAAuB;AAC/B,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,UACV;AAAA,SACF;AACA,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,CAAC,KAAK,iBAAA,EAAmB;AAC3B,QAAA,IAAA,CAAK,iBAAA,GAAoBA,8BAAAA;AAAA,UACvB,IAAA,CAAK,OAAA;AAAA,UACL,IAAA,CAAK,qBAAA;AAAA,UACL,IAAA,CAAK,SAAS,WAAA,CAAY,IAAA;AAAA,UAC1B,IAAA,CAAK;AAAA,SACP;AAEA,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,sCAAA,EAAwC;AAAA,UACxD,UAAU,IAAA,CAAK,iBAAA;AAAA,UACf,MAAA,EAAQ,IAAA,CAAK,OAAA,CAAQ,QAAA,KAAa,SAAS,MAAA,GAAS,MAAA;AAAA,UACpD,cAAA,EAAgB,IAAA,CAAK,QAAA,CAAS,WAAA,CAAY,IAAA;AAAA,UAC1C,YAAA,EAAc,KAAK,OAAA,CAAQ,YAAA;AAAA,UAC3B,cAAA,EAAgB,KAAK,OAAA,CAAQ;AAAA,SAC9B,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,QAAA,IAAA,CAAK,aAAa,IAAA,CAAK,EAAE,QAAA,EAAU,IAAA,CAAK,mBAAmB,CAAA;AAAA,MAC7D;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AAKvB,MAAA,IAAA,CAAK,aAAA,CAAc,QAAQ,CAAA,OAAA,KAAW;AACpC,QAAA,OAAA,EAAQ;AAAA,MACV,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,GAAuB;AAC7B,IAAA,IAAI,IAAA,CAAK,sBAAsB,UAAA,EAAY;AACzC,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,SAAA,IAAa,IAAA,CAAK,QAAQ,aAAA,EAAgB;AAC9D,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,SAAA,IAAa,IAAA,CAAK,QAAQ,YAAA,EAAe;AAC7D,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,SAAA,GAAY,CAAA,EAAG;AACnC,MAAA,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,IAAW,IAAA,CAAK,QAAQ,cAAA,EAAiB;AAC7D,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAA,GAAsB;AAC5B,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,YAAA,CAAa,KAAK,WAAW,CAAA;AAAA,IAC/B;AACA,IAAA,IAAA,CAAK,WAAA,GAAc,WAAW,MAAM;AAClC,MAAA,IAAA,CAAK,WAAA,EAAY,CAAE,KAAA,CAAM,CAAA,KAAA,KAAS;AAChC,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,wBAAA,EAA0B;AAAA,UAC1C,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SAC7D,CAAA;AAAA,MACH,CAAC,CAAA;AAAA,IACH,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,cAAc,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,kBAAA,GAAoC;AAChD,IAAA,IAAI,IAAA,CAAK,aAAY,EAAG;AACtB,MAAA,MAAM,KAAK,WAAA,EAAY;AAAA,IACzB,CAAA,MAAA,IAAW,IAAA,CAAK,YAAA,CAAa,SAAA,KAAc,CAAA,EAAG;AAC5C,MAAA,IAAA,CAAK,aAAA,EAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAEQ,kBAAkB5B,OAAA,EAAiD;AACzE,IAAA,IAAIA,mBAAiBC,iBAAAA,EAAa;AAChC,MAAA,OAAO;AAAA,QACL,IAAID,OAAA,CAAM,EAAA;AAAA,QACV,MAAA,EAAQ,MAAA,CAAOA,OAAA,CAAM,MAAM,CAAA;AAAA,QAC3B,SAASA,OAAA,CAAM;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,IAAIA,mBAAiB,KAAA,EAAO;AAC1B,MAAA,OAAO,EAAE,OAAA,EAASA,OAAA,CAAM,OAAA,EAAQ;AAAA,IAClC;AAEA,IAAA,OAAO,EAAE,OAAA,EAAS,MAAA,CAAOA,OAAK,CAAA,EAAE;AAAA,EAClC;AAAA,EAEQ,QAAA,CACN,MAAA,EACA,MAAA,EACA,KAAA,EACA,KAAA,EACM;AACN,IAAA,IAAI,UAAU,CAAA,EAAG;AAEjB,IAAA,MAAM,SAAA,GAAoC;AAAA,MACxC,IAAA,EAAM,MAAA;AAAA,MACN,MAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,cAAc,IAAA,CAAK,IAAA;AAAA,MACnB,GAAI,IAAA,CAAK,qBAAA,GAAwB,EAAE,WAAA,EAAa,KAAK,qBAAA,CAAsB,WAAA,CAAY,IAAA,EAAK,GAAI,EAAC;AAAA,MACjG,GAAI,KAAA,KAAU,MAAA,GAAY,EAAC,GAAI,EAAE,KAAA,EAAO,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAA;AAAE,KACxE;AAEA,IAAA,IAAA,CAAK,iBAAiB,SAAS,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,YAAA,CACZ,MAAA,EACA,MAAA,EACA,WAAA,EACe;AACf,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACzB,IAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,MAAM,CAAA,EAAG;AACxC,MAAA,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,qBAAA,EAAuB,MAAA,CAAO,MAAM,CAAA;AAC1D,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,YAAY,MAAM,CAAA;AAAA,IAC1B,SAASA,OAAA,EAAO;AACd,MAAA,IACEA,OAAA,YAAiBC,iBAAAA,IACjBD,OAAA,CAAM,MAAA,KAAWS,iBAAAA,CAAY,wBAC7BT,OAAA,CAAM,EAAA,CAAG,QAAA,CAAS,kBAAkB,CAAA,EACpC;AACA,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAKA,OAAA,CAAM,OAAO,CAAA;AAC9B,QAAA,IAAA,CAAK,mBAAA,CAAoB,IAAI,MAAM,CAAA;AACnC,QAAA,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,qBAAA,EAAuB,MAAA,CAAO,QAAQA,OAAK,CAAA;AAAA,MACnE,CAAA,MAAO;AACL,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,MAAM,CAAA;AACrD,QAAA,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,iBAAA,EAAmB,OAAA,CAAQ,QAAQA,OAAK,CAAA;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,gBAAA,CACZ,MAAA,EACA,eAAA,EACA,KAAA,EACe;AACf,IAAA,MAAM,uBAAuB,eAAA,CAAgB,MAAA;AAC7C,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACzB,IAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,SAAS,CAAA,EAAG;AAC3C,MAAA,IAAA,CAAK,QAAA,CAAS,SAAA,EAAW,qBAAA,EAAuB,MAAA,CAAO,MAAM,CAAA;AAC7D,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,WAAgC,EAAC;AACvC,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,OAAO,KAAA,CAAM,YAAA;AACnB,MAAA,IAAI,IAAA,CAAK,YAAA,CAAa,UAAA,CAAW,IAAI,CAAA,EAAG;AACtC,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,SAAS,IAAA,CAAK,OAAA;AAAA,UACd,QAAQ,IAAA,CAAK,EAAA;AAAA,UACb,OAAA,EAASW,8BAAsB,IAAI;AAAA,SACpC,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,eAAA,CAAgB,KAAK,KAAK,CAAA;AAAA,MAC5B;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAE3B,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,qBAAA,CAAuB,gBAAA,CAAiB,EAAE,OAAA,EAAS,UAAU,CAAA;AACxE,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,IAAA,CAAK,YAAA,CAAa,gBAAA,CAAiB,EAAE,OAAA,EAAS,UAAU,CAAA;AAAA,MAC1D;AAAA,IACF,SAASX,OAAA,EAAO;AACd,MAAA,IACEA,OAAA,YAAiBC,iBAAAA,IACjBD,OAAA,CAAM,MAAA,KAAWS,iBAAAA,CAAY,wBAC7BT,OAAA,CAAM,EAAA,CAAG,QAAA,CAAS,kBAAkB,CAAA,EACpC;AACA,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAKA,OAAA,CAAM,OAAO,CAAA;AAC9B,QAAA,IAAA,CAAK,mBAAA,CAAoB,IAAI,SAAS,CAAA;AACtC,QAAA,eAAA,CAAgB,MAAA,GAAS,CAAA;AACzB,QAAA,IAAA,CAAK,SAAS,SAAA,EAAW,qBAAA,EAAuB,MAAA,CAAO,MAAA,GAAS,sBAAsBA,OAAK,CAAA;AAAA,MAC7F,CAAA,MAAO;AAKL,QAAA,MAAM,aAAA,GAAgB,gBAAgB,MAAA,GAAS,oBAAA;AAC/C,QAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,UAAA,eAAA,CAAgB,MAAA,CAAO,eAAA,CAAgB,MAAA,GAAS,aAAA,EAAe,aAAa,CAAA;AAAA,QAC9E;AACA,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,MAAM,CAAA;AACrD,QAAA,IAAA,CAAK,QAAA,CAAS,SAAA,EAAW,iBAAA,EAAmB,OAAA,CAAQ,QAAQA,OAAK,CAAA;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAc,WAAA,GAA6B;AACzC,IAAA,IAAI,CAAC,KAAK,qBAAA,EAAuB;AAC/B,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,wDAAwD,CAAA;AAC1E,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,KAAK,iBAAA,EAAmB;AAC3B,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,sDAAsD,CAAA;AACxE,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,YAAA,CAAa,KAAK,WAAW,CAAA;AAC7B,MAAA,IAAA,CAAK,WAAA,GAAc,MAAA;AAAA,IACrB;AAEA,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,SAAA,KAAc,CAAA,EAAG;AACrC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,SAAA,GAAY,KAAK,YAAA,CAAa,SAAA;AAGpC,IAAA,MAAM,OAAA,GAAU,KAAK,YAAA,CAAa,OAAA;AAClC,IAAA,MAAM,OAAA,GAAU,KAAK,YAAA,CAAa,OAAA;AAClC,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AAExB,IAAA,MAAM,uBAAuD,EAAC;AAC9D,IAAA,MAAM,kBAA6C,EAAC;AACpD,IAAA,MAAM,qBAAmD,EAAC;AAC1D,IAAA,MAAM,oBAAiD,EAAC;AACxD,IAAA,MAAM,mBAAkD,EAAC;AAEzD,IAAA,MAAM,mBAAkD,EAAC;AACzD,IAAA,MAAM,gBAA+C,EAAC;AAEtD,IAAA,KAAA,MAAW,eAAe,OAAA,EAAS;AACjC,MAAA,QAAQ,YAAY,IAAA;AAAM,QACxB,KAAK,UAAA;AACH,UAAA,oBAAA,CAAqB,KAAK,WAAW,CAAA;AACrC,UAAA;AAAA,QACF,KAAK,KAAA;AACH,UAAA,eAAA,CAAgB,KAAK,WAAW,CAAA;AAChC,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,kBAAA,CAAmB,KAAK,WAAW,CAAA;AACnC,UAAA;AAAA,QACF,KAAK,OAAA;AACH,UAAA,iBAAA,CAAkB,KAAK,WAAW,CAAA;AAClC,UAAA;AAAA,QACF;AACE,UAAA,gBAAA,CAAiB,KAAK,WAAW,CAAA;AACjC,UAAA;AAAA;AACJ,IACF;AAEA,IAAA,KAAA,MAAW,eAAe,OAAA,EAAS;AACjC,MAAA,QAAQ,YAAY,IAAA;AAAM,QACxB,KAAKhB,8BAAAA,CAAiB,YAAA;AACpB,UAAA,gBAAA,CAAiB,KAAK,WAAW,CAAA;AACjC,UAAA;AAAA,QACF,KAAKA,8BAAAA,CAAiB,UAAA;AACpB,UAAA,aAAA,CAAc,KAAK,WAAW,CAAA;AAC9B,UAAA;AAAA;AACJ,IACF;AAGA,IAAA,MAAM,QAAQ,GAAA,CAAI;AAAA,MAChB,IAAA,CAAK,YAAA;AAAA,QAAa,UAAA;AAAA,QAAY,oBAAA;AAAA,QAAsB,CAAA,MAAA,KAClD,IAAA,CAAK,qBAAA,CAAuB,mBAAA,CAAoB,EAAE,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK4B,2BAAAA,CAAoB,CAAC,CAAC,GAAG;AAAA,OACxG;AAAA,MACA,IAAA,CAAK,YAAA;AAAA,QAAa,KAAA;AAAA,QAAO,eAAA;AAAA,QAAiB,CAAA,MAAA,KACxC,IAAA,CAAK,qBAAA,CAAuB,eAAA,CAAgB,EAAE,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAKC,sBAAAA,CAAe,CAAC,CAAC,GAAG;AAAA,OAC1F;AAAA,MACA,IAAA,CAAK,YAAA;AAAA,QAAa,QAAA;AAAA,QAAU,kBAAA;AAAA,QAAoB,CAAA,MAAA,KAC9C,IAAA,CAAK,qBAAA,CAAuB,kBAAA,CAAmB,EAAE,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAKC,yBAAAA,CAAkB,CAAC,CAAC,GAAG;AAAA,OACnG;AAAA,MACA,IAAA,CAAK,YAAA;AAAA,QAAa,OAAA;AAAA,QAAS,iBAAA;AAAA,QAAmB,CAAA,MAAA,KAC5C,IAAA,CAAK,qBAAA,CAAuB,iBAAA,CAAkB,EAAE,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAKC,wBAAAA,CAAiB,CAAC,CAAC,GAAG;AAAA,OAChG;AAAA,MACA,IAAA,CAAK,YAAA,CAAa,SAAA,EAAW,gBAAA,EAAkB,OAAM,MAAA,KAAU;AAC7D,QAAA,MAAM,UAAU,MAAA,CAAO,GAAA,CAAI,OAAKC,6BAAAA,CAAsB,CAAA,CAAE,YAAY,CAAC,CAAA;AACrE,QAAA,MAAM,IAAA,CAAK,qBAAA,CAAuB,gBAAA,CAAiB,EAAE,SAAS,CAAA;AAC9D,QAAA,IAAA,CAAK,YAAA,CAAa,eAAA,CAAgB,EAAE,OAAA,EAAS,CAAA;AAAA,MAC/C,CAAC;AAAA,KACF,CAAA;AAGD,IAAA,MAAM,kBAAmC,EAAC;AAE1C,IAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,gBAAA,EAAkB,eAAA,EAAiB,KAAK,CAAA;AACpE,IAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,aAAA,EAAe,eAAA,EAAiB,IAAI,CAAA;AAEhE,IAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,MAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,SAAS,CAAA,EAAG;AAC3C,QAAA,IAAA,CAAK,QAAA,CAAS,SAAA,EAAW,qBAAA,EAAuB,eAAA,CAAgB,MAAM,CAAA;AACtE,QAAA,eAAA,CAAgB,MAAA,GAAS,CAAA;AAAA,MAC3B,CAAA,MAAO;AACL,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,eAAe,CAAA;AAC9D,QAAA,IAAA,CAAK,QAAA,CAAS,SAAA,EAAW,iBAAA,EAAmB,OAAA,CAAQ,MAAM,CAAA;AAAA,MAC5D;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC7B,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,eAAA,EAAiB;AAAA,MACjC,UAAU,IAAA,CAAK,iBAAA;AAAA,MACf,SAAA;AAAA,MACA,UAAA,EAAY,OAAA;AAAA,MACZ,eAAA,EAAiB,eAAA,CAAgB,MAAA,GAAS,CAAA,GAAI,gBAAgB,MAAA,GAAS;AAAA,KACxE,CAAA;AACD,IAAA;AAAA,EACF;AAAA,EAEA,MAAM,oBAAoB,KAAA,EAAoC;AAC5D,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,IAAI,CAAC,KAAK,qBAAA,EAAuB;AAC/B,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,+DAA+D,CAAA;AACjF,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,YAAA,CAAa,SAAS,KAAK,CAAA;AAChC,IAAA,MAAM,KAAK,kBAAA,EAAmB;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,WAAA,GAA6B;AACzC,IAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AAC3B,IAAA,OAAO,IAAI,QAAQ,CAAA,OAAA,KAAW;AAC5B,MAAA,IAAA,CAAK,aAAA,CAAc,IAAI,OAAO,CAAA;AAAA,IAChC,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,KAAA,EAAmC;AACrD,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,IAAI,CAAC,KAAK,qBAAA,EAAuB;AAEjC,IAAA,IAAA,CAAK,YAAA,CAAa,SAAS,KAAK,CAAA;AAChC,IAAA,MAAM,KAAK,kBAAA,EAAmB;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,KAAA,EAAgC;AAC/C,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,IAAI,CAAC,KAAK,qBAAA,EAAuB;AAEjC,IAAA,IAAA,CAAK,YAAA,CAAa,SAAS,KAAK,CAAA;AAChC,IAAA,MAAM,KAAK,kBAAA,EAAmB;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,KAAA,EAAkC;AACnD,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,IAAI,CAAC,KAAK,qBAAA,EAAuB;AAEjC,IAAA,IAAA,CAAK,YAAA,CAAa,SAAS,KAAK,CAAA;AAChC,IAAA,MAAM,KAAK,kBAAA,EAAmB;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,KAAA,EAAqC;AACzD,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,IAAI,CAAC,KAAK,qBAAA,EAAuB;AAEjC,IAAA,IAAA,CAAK,YAAA,CAAa,SAAS,KAAK,CAAA;AAChC,IAAA,MAAM,KAAK,kBAAA,EAAmB;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,SAAA,GAAY,CAAA,EAAG;AACnC,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,0BAAA,EAA4B;AAAA,QAC5C,cAAA,EAAgB,KAAK,YAAA,CAAa;AAAA,OACnC,CAAA;AACD,MAAA,MAAM,KAAK,WAAA,EAAY;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,GAA0B;AAE9B,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,YAAA,CAAa,KAAK,WAAW,CAAA;AAC7B,MAAA,IAAA,CAAK,WAAA,GAAc,MAAA;AAAA,IACrB;AAGA,IAAA,MAAM,KAAK,KAAA,EAAM;AAEjB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,yCAAyC,CAAA;AAAA,EAC5D;AACF;ACtiBA,IAAI,aAAA;AACJ,eAAe,eAAA,GAAmC;AAChD,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,IAAI,OAAO,2PAAY,KAAQ,QAAA,EAAU;AACvC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM,OAAO,KAAU,CAAA;AACjD,IAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAK,GAAI,MAAM,OAAO,MAAW,CAAA;AAClD,IAAA,MAAM,UAAA,GAAa,aAAA,CAAc,2PAAe,CAAA;AAChD,IAAA,MAAM,SAAA,GAAY,QAAQ,UAAU,CAAA;AACpC,IAAA,aAAA,GAAgB,IAAA,CAAK,SAAA,EAAW,IAAA,EAAM,eAAe,CAAA;AAAA,EACvD;AACA,EAAA,OAAO,aAAA;AACT;AAiPO,IAAM,YAAA,GAAN,cAA2B,YAAA,CAAa;AAAA,EAC7C,IAAA,GAAO,eAAA;AAAA;AAAA,EAGP,iBAAiC,EAAC;AAAA;AAAA,EAGlC,WAAA,uBAAkB,GAAA,EAAuB;AAAA;AAAA,EAGzC,aAAyB,EAAC;AAAA;AAAA,EAG1B,gBAA+B,EAAC;AAAA;AAAA,EAGhC,eAA6B,EAAC;AAAA;AAAA,EAG9B,kBAAmC,EAAC;AAAA;AAAA,EAGpC,aAAuB,EAAC;AAAA;AAAA,EAGf,OAAA;AAAA;AAAA,EAGT,gBAAA;AAAA,EAQA,WAAA,CAAY,MAAA,GAA6B,EAAC,EAAG;AAC3C,IAAA,KAAA,CAAM,MAAM,CAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,iBAAA,EAAmB,IAAA;AAAA,MACnB,SAAA,EAAW,IAAA;AAAA,MACX,UAAA,EAAY,CAAA;AAAA,MACZ,iBAAA,EAAmB,IAAA;AAAA,MACnB,GAAG;AAAA,KACL;AACA,IAAA,IAAA,CAAK,gBAAA,GAAmB;AAAA,MACtB,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,WAAA,EAAa,IAAA;AAAA,MACb,mBAAA,EAAqB,CAAA;AAAA,MACrB,QAAA,EAAU,EAAE,OAAA,EAAS,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,QAAA,EAAU,CAAA,EAAE;AAAA,MACjE,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,oBAAoB,KAAA,EAAoC;AACtE,IAAA,MAAM,OAAO,KAAA,CAAM,YAAA;AACnB,IAAA,MAAM,SAAS,IAAA,CAAK,EAAA;AAGpB,IAAA,IAAA,CAAK,YAAY,SAAS,CAAA;AAG1B,IAAA,MAAM,UAAA,GAAa,CAAA,eAAA,EAAkB,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI,CAAA,WAAA,EAAc,IAAA,CAAK,UAAA,IAAc,KAAK,QAAA,IAAY,SAAS,CAAA,SAAA,EAAY,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,EAAE,CAAC,CAAA,QAAA,EAAW,MAAA,CAAO,KAAA,CAAM,EAAE,CAAC,CAAA,CAAA,CAAA;AAEnM,IAAA,IAAI,IAAA,CAAK,QAAQ,SAAA,EAAW;AAC1B,MAAA,IAAA,CAAK,UAAA,CAAW,KAAK,UAAU,CAAA;AAAA,IACjC;AAGA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,MAAM,CAAA,IAAK;AAAA,MAC5C,QAAA,EAAU,KAAA;AAAA,MACV,MAAA,EAAQ,KAAA;AAAA,MACR,SAAA,EAAW,KAAA;AAAA,MACX,QAAQ;AAAC,KACX;AAGA,IAAA,IAAI,IAAA,CAAK,QAAQ,iBAAA,EAAmB;AAClC,MAAA,IAAA,CAAK,kBAAA,CAAmB,KAAA,EAAO,KAAA,EAAO,MAAM,CAAA;AAAA,IAC9C;AAGA,IAAA,IAAI,KAAA,CAAM,IAAA,KAASa,8BAAA,CAAU,YAAA,EAAc;AACzC,MAAA,KAAA,CAAM,QAAA,GAAW,IAAA;AAAA,IACnB,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAASA,8BAAA,CAAU,UAAA,EAAY;AAC9C,MAAA,KAAA,CAAM,MAAA,GAAS,IAAA;AACf,MAAA,IAAI,KAAK,OAAA,EAAS;AAChB,QAAA,KAAA,CAAM,WAAA,GAAc,IAAA;AAAA,MACtB;AAAA,IACF,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAASA,8BAAA,CAAU,YAAA,EAAc;AAChD,MAAA,KAAA,CAAM,SAAA,GAAY,IAAA;AAAA,IACpB;AAEA,IAAA,KAAA,CAAM,MAAA,CAAO,KAAK,KAAK,CAAA;AACvB,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAA;AAClC,IAAA,IAAA,CAAK,cAAA,CAAe,KAAK,KAAK,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,WAAW,KAAA,EAAgC;AAC/C,IAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AAEtB,IAAA,IAAI,IAAA,CAAK,QAAQ,SAAA,EAAW;AAC1B,MAAA,MAAM,MAAM,KAAA,CAAM,GAAA;AAClB,MAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AACpB,MAAA,MAAM,UAAA,GAAa,CAAA,mBAAA,EAAsB,GAAA,CAAI,KAAK,MAAM,GAAA,CAAI,OAAO,CAAA,CAAA,EAAI,OAAA,GAAU,YAAY,OAAA,CAAQ,KAAA,CAAM,EAAE,CAAC,MAAM,EAAE,CAAA,CAAA;AACtH,MAAA,IAAA,CAAK,UAAA,CAAW,KAAK,UAAU,CAAA;AAAA,IACjC;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,KAAK,KAAK,CAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,KAAA,EAAmC;AACrD,IAAA,IAAA,CAAK,YAAY,QAAQ,CAAA;AAEzB,IAAA,IAAI,IAAA,CAAK,QAAQ,SAAA,EAAW;AAC1B,MAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,MAAA,MAAM,YAAY,MAAA,CAAO,OAAA,CAAQ,OAAO,MAAM,CAAA,CAC3C,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA,KAAM,GAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAA,CAC3B,KAAK,IAAI,CAAA;AACZ,MAAA,MAAM,UAAA,GAAa,CAAA,uBAAA,EAA0B,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,KAAK,CAAA,EAAG,SAAA,GAAY,CAAA,EAAA,EAAK,SAAS,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,CAAA;AAC7G,MAAA,IAAA,CAAK,UAAA,CAAW,KAAK,UAAU,CAAA;AAAA,IACjC;AAEA,IAAA,IAAA,CAAK,aAAA,CAAc,KAAK,KAAK,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,KAAA,EAAkC;AACnD,IAAA,IAAA,CAAK,YAAY,OAAO,CAAA;AAExB,IAAA,IAAI,IAAA,CAAK,QAAQ,SAAA,EAAW;AAC1B,MAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,MAAA,MAAM,aAAa,KAAA,CAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,KAAA,CAAM,EAAE,CAAA,GAAI,YAAA;AAC7D,MAAA,MAAM,aAAa,CAAA,sBAAA,EAAyB,KAAA,CAAM,QAAQ,CAAA,CAAA,EAAI,KAAA,CAAM,KAAK,CAAA,SAAA,EAAY,UAAU,GAAG,KAAA,CAAM,MAAA,GAAS,WAAW,KAAA,CAAM,MAAA,CAAO,MAAM,EAAE,CAAC,KAAK,EAAE,CAAA,CAAA,CAAA;AACzJ,MAAA,IAAA,CAAK,UAAA,CAAW,KAAK,UAAU,CAAA;AAAA,IACjC;AAEA,IAAA,IAAA,CAAK,YAAA,CAAa,KAAK,KAAK,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,KAAA,EAAqC;AACzD,IAAA,IAAA,CAAK,YAAY,UAAU,CAAA;AAE3B,IAAA,IAAI,IAAA,CAAK,QAAQ,SAAA,EAAW;AAC1B,MAAA,MAAM,KAAK,KAAA,CAAM,QAAA;AACjB,MAAA,MAAM,aAAa,EAAA,CAAG,OAAA,GAAU,GAAG,OAAA,CAAQ,KAAA,CAAM,EAAE,CAAA,GAAI,YAAA;AACvD,MAAA,MAAM,cAAA,GAAiB,EAAA,CAAG,cAAA,IAAkB,EAAA,CAAG,MAAA;AAC/C,MAAA,MAAM,UAAA,GAAa,4BAA4B,EAAA,CAAG,YAAY,SAAS,cAAc,CAAA,CAAA,EAAI,GAAG,KAAK,CAAA,SAAA,EAAY,UAAU,CAAA,EAAG,EAAA,CAAG,SAAS,CAAA,QAAA,EAAW,EAAA,CAAG,OAAO,KAAA,CAAM,EAAE,CAAC,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,CAAA;AAC3K,MAAA,IAAA,CAAK,UAAA,CAAW,KAAK,UAAU,CAAA;AAAA,IACjC;AAEA,IAAA,IAAA,CAAK,eAAA,CAAgB,KAAK,KAAK,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,MAAA,EAAmE;AAC7E,IAAA,IAAA,CAAK,gBAAA,CAAiB,WAAA,mBAAc,IAAI,IAAA,EAAK;AAC7C,IAAA,IAAA,CAAK,gBAAA,CAAiB,mBAAA,EAAA;AACtB,IAAA,IAAA,CAAK,gBAAA,CAAiB,SAAS,MAAM,CAAA,EAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,CAAmB,KAAA,EAAqB,KAAA,EAAkB,MAAA,EAAsB;AAC9E,IAAA,MAAM,OAAO,KAAA,CAAM,YAAA;AAEnB,IAAA,IAAI,KAAA,CAAM,IAAA,KAASA,8BAAA,CAAU,YAAA,EAAc;AACzC,MAAA,IAAI,MAAM,QAAA,EAAU;AAClB,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,KAAA,EAAQ,MAAM,CAAA,EAAA,EAAK,KAAK,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI,CAAA,gBAAA,CAAkB,CAAA;AAAA,MAC/E;AAAA,IACF,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAASA,8BAAA,CAAU,UAAA,EAAY;AAC9C,MAAA,IAAI,KAAK,OAAA,EAAS;AAEhB,QAAA,IAAI,MAAM,QAAA,EAAU;AAClB,UAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,WAAA,EAAc,MAAM,CAAA,EAAA,EAAK,KAAK,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI,CAAA,oCAAA,CAAsC,CAAA;AAAA,QACzG;AACA,QAAA,IAAI,MAAM,SAAA,EAAW;AACnB,UAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,WAAA,EAAc,MAAM,CAAA,EAAA,EAAK,KAAK,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI,CAAA,oCAAA,CAAsC,CAAA;AAAA,QACzG;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,IAAI,CAAC,MAAM,QAAA,EAAU;AACnB,UAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,YAAA,EAAe,MAAM,CAAA,EAAA,EAAK,KAAK,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI,CAAA,yBAAA,CAA2B,CAAA;AAAA,QAC/F;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAI,MAAA,GAAyB;AAC3B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,cAAc,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,eAAmC,IAAA,EAA4B;AAC7D,IAAA,OAAO,KAAA,CAAM,KAAK,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA,CACxC,OAAO,CAAA,KAAA,KAAS;AACf,MAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAQ,OAAO,KAAA;AAC1B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAASA,+BAAU,UAAU,CAAA;AACvE,MAAA,OAAO,QAAA,EAAU,aAAa,IAAA,KAAS,IAAA;AAAA,IACzC,CAAC,CAAA,CACA,GAAA,CAAI,CAAA,KAAA,KAAS;AACZ,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAASA,+BAAU,UAAU,CAAA;AACvE,MAAA,OAAO,QAAA,EAAU,YAAA;AAAA,IACnB,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,IAAA,KAAkC,SAAS,MAAS,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,eAAe,IAAA,EAAwC;AACrD,IAAA,OAAO,KAAK,cAAA,CAAe,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,IAAI,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAa,OAAA,EAMX;AACA,IAAA,MAAM,MAAA,GAAS,KAAK,cAAA,CAAe,MAAA,CAAO,OAAK,CAAA,CAAE,YAAA,CAAa,YAAY,OAAO,CAAA;AACjF,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,yBAAA,CAA0B,MAAM,CAAA;AACnD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,GAAA,CAAI,OAAA,KAAY,OAAO,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,GAAG,CAAA;AAClF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,KAAA,CAAM,OAAA,KAAY,OAAO,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,KAAK,CAAA;AAC1F,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,QAAA,CAAS,OAAA,KAAY,OAAO,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,QAAQ,CAAA;AACrG,IAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,QAAQ,QAAA,EAAS;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAY,MAAA,EAIV;AACA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,MAAM,CAAA;AACzC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,EAAE,MAAA,EAAQ,IAAI,IAAA,EAAM,MAAA,EAAW,OAAO,MAAA,EAAU;AAAA,IACzD;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAASA,+BAAU,UAAU,CAAA;AACvE,IAAA,MAAM,IAAA,GAAO,UAAU,YAAA,IAAgB,KAAA,CAAM,OAAO,KAAA,CAAM,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,EAAG,YAAA;AAE9E,IAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,MAAM,KAAA,EAAM;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAiC;AAC/B,IAAA,OAAO,KAAA,CAAM,KAAK,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA,CACxC,IAAI,CAAA,KAAA,KAAS;AACZ,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAASA,+BAAU,UAAU,CAAA;AACvE,MAAA,OAAO,QAAA,EAAU,gBAAgB,KAAA,CAAM,MAAA,CAAO,MAAM,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,EAAG,YAAA;AAAA,IAC1E,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,IAAA,KAAkC,SAAS,MAAS,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,GAAuC;AACrC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,CAAA,CACxC,MAAA,CAAO,CAAA,KAAA,KAAS,KAAA,CAAM,MAAM,CAAA,CAC5B,IAAI,CAAA,KAAA,KAAS;AACZ,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAASA,+BAAU,UAAU,CAAA;AACvE,MAAA,OAAO,QAAA,CAAU,YAAA;AAAA,IACnB,CAAC,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAkC;AAChC,IAAA,OAAO,KAAK,WAAA,EAAY,CAAE,MAAA,CAAO,CAAA,IAAA,KAAQ,KAAK,UAAU,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,GAA2C;AACzC,IAAA,OAAO,KAAA,CAAM,KAAK,IAAA,CAAK,WAAA,CAAY,SAAS,CAAA,CACzC,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,CAAC,MAAM,MAAM,CAAA,CACpC,IAAI,CAAC,CAAC,MAAA,EAAQ,KAAK,CAAA,MAAO;AAAA,MACzB,MAAA;AAAA,MACA,IAAA,EAAM,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,YAAA;AAAA,MACvB,KAAA,EAAO;AAAA,QACL,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,QAAQ,KAAA,CAAM;AAAA;AAChB,KACF,CAAE,CAAA;AAAA,EACN;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAwB;AACtB,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,cAAA,EAAgB;AACvC,MAAA,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,YAAA,CAAa,OAAO,CAAA;AAAA,IACzC;AACA,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,UAAA,EAAY;AACnC,MAAA,IAAI,MAAM,GAAA,CAAI,OAAA,WAAkB,GAAA,CAAI,KAAA,CAAM,IAAI,OAAO,CAAA;AAAA,IACvD;AACA,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,YAAA,EAAc;AACrC,MAAA,IAAI,KAAA,CAAM,MAAM,OAAA,EAAS;AACvB,QAAA,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,KAAA,CAAM,OAAO,CAAA;AAAA,MAClC;AAAA,IACF;AACA,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,eAAA,EAAiB;AACxC,MAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS;AAC1B,QAAA,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA;AAAA,MACrC;AAAA,IACF;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,YAAA,GAA2B;AACzB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,UAAU,CAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAA4B;AAC1B,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,GAAG,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,KAAA,EAAgC;AAC7C,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,GAAA,CAAI,KAAA,KAAU,KAAK,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,GAAG,CAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,OAAA,EAAgC;AAC/C,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,GAAA,CAAI,OAAA,KAAY,OAAO,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,GAAG,CAAA;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eAAA,GAAiC;AAC/B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,aAAa,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAkC;AAChC,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,MAAM,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,IAAA,EAAgC;AAC/C,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,CAAO,IAAA,KAAS,IAAI,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,CAAA;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,WAAA,EAAuC;AACtD,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,cAAA,GAA+B;AAC7B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,YAAY,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAgC;AAC9B,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,KAAK,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,QAAA,EAAmC;AACnD,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,KAAA,CAAM,QAAA,KAAa,QAAQ,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,CAAA;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,OAAA,EAAkC;AACnD,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,KAAA,CAAM,OAAA,KAAY,OAAO,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,CAAA;AAAA,EACpF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,iBAAA,GAAqC;AACnC,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,eAAe,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAAqC;AACnC,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,QAAQ,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,YAAA,EAA0C;AAC1D,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,QAAA,CAAS,YAAA,KAAiB,YAAY,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,QAAQ,CAAA;AAAA,EACvG;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,OAAA,EAAqC;AACxD,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,QAAA,CAAS,OAAA,KAAY,OAAO,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,QAAQ,CAAA;AAAA,EAC7F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,aAAA,GAAmC;AACjC,IAAA,MAAM,aAAqC,EAAC;AAC5C,IAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,IAAA,IAAI,eAAA,GAAkB,CAAA;AAEtB,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,WAAA,CAAY,MAAA,EAAO,EAAG;AAC7C,MAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,QAAA,cAAA,EAAA;AACA,QAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAASA,+BAAU,UAAU,CAAA;AACvE,QAAA,MAAM,QAAA,GAAW,UAAU,YAAA,CAAa,IAAA;AACxC,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,UAAA,CAAW,QAAQ,CAAA,GAAA,CAAK,UAAA,CAAW,QAAQ,KAAK,CAAA,IAAK,CAAA;AAAA,QACvD;AAAA,MACF,CAAA,MAAO;AACL,QAAA,eAAA,EAAA;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,cAAsC,EAAC;AAC7C,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,UAAA,EAAY;AACnC,MAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,CAAI,KAAA;AACxB,MAAA,WAAA,CAAY,KAAK,CAAA,GAAA,CAAK,WAAA,CAAY,KAAK,KAAK,CAAA,IAAK,CAAA;AAAA,IACnD;AAGA,IAAA,MAAM,gBAAwC,EAAC;AAC/C,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,aAAA,EAAe;AACtC,MAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,IAAA;AAC3B,MAAA,aAAA,CAAc,KAAK,CAAA,GAAA,CAAK,aAAA,CAAc,KAAK,KAAK,CAAA,IAAK,CAAA;AAAA,IACvD;AAGA,IAAA,MAAM,iBAAyC,EAAC;AAChD,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,YAAA,EAAc;AACrC,MAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,QAAA;AAC3B,MAAA,cAAA,CAAe,MAAM,CAAA,GAAA,CAAK,cAAA,CAAe,MAAM,KAAK,CAAA,IAAK,CAAA;AAAA,IAC3D;AAGA,IAAA,MAAM,iBAAyC,EAAC;AAChD,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,eAAA,EAAiB;AACxC,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,YAAA;AAC9B,MAAA,cAAA,CAAe,MAAM,CAAA,GAAA,CAAK,cAAA,CAAe,MAAM,KAAK,CAAA,IAAK,CAAA;AAAA,IAC3D;AAEA,IAAA,OAAO;AAAA,MACL,kBAAA,EAAoB,KAAK,cAAA,CAAe,MAAA;AAAA,MACxC,WAAA,EAAa,KAAK,cAAA,CAAe,MAAA;AAAA;AAAA,MACjC,UAAA,EAAY,KAAK,WAAA,CAAY,IAAA;AAAA,MAC7B,WAAA,EAAa,IAAA,CAAK,WAAA,EAAY,CAAE,MAAA;AAAA,MAChC,cAAA;AAAA,MACA,eAAA;AAAA,MACA,WAAA,EAAa;AAAA,QACX,OAAA,EAAS,KAAK,cAAA,CAAe,MAAA,CAAO,OAAK,CAAA,CAAE,IAAA,KAASA,8BAAA,CAAU,YAAY,CAAA,CAAE,MAAA;AAAA,QAC5E,OAAA,EAAS,KAAK,cAAA,CAAe,MAAA,CAAO,OAAK,CAAA,CAAE,IAAA,KAASA,8BAAA,CAAU,YAAY,CAAA,CAAE,MAAA;AAAA,QAC5E,KAAA,EAAO,KAAK,cAAA,CAAe,MAAA,CAAO,OAAK,CAAA,CAAE,IAAA,KAASA,8BAAA,CAAU,UAAU,CAAA,CAAE;AAAA,OAC1E;AAAA,MACA,UAAA;AAAA,MACA,SAAA,EAAW,KAAK,UAAA,CAAW,MAAA;AAAA,MAC3B,WAAA;AAAA,MACA,YAAA,EAAc,KAAK,aAAA,CAAc,MAAA;AAAA,MACjC,aAAA;AAAA,MACA,WAAA,EAAa,KAAK,YAAA,CAAa,MAAA;AAAA,MAC/B,cAAA;AAAA,MACA,aAAA,EAAe,KAAK,eAAA,CAAgB,MAAA;AAAA,MACpC;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAO,OAAA,EAAwF;AAC7F,IAAA,MAAM,MAAA,GAAS,OAAA,EAAS,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,UAAA;AAC/C,IAAA,MAAM,aAAA,GAAgB,SAAS,aAAA,IAAiB,IAAA;AAChD,IAAA,MAAM,YAAA,GAAe,SAAS,YAAA,IAAgB,IAAA;AAE9C,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,KAAA,EAAO,KAAK,WAAA;AAAY,KAC1B;AAGA,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AAC9B,MAAA,IAAA,CAAK,IAAA,GAAO,KAAK,UAAA,EAAW;AAAA,IAC9B;AACA,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,MAAA,GAAS,CAAA,EAAG;AACjC,MAAA,IAAA,CAAK,OAAA,GAAU,KAAK,aAAA,EAAc;AAAA,IACpC;AACA,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AAChC,MAAA,IAAA,CAAK,MAAA,GAAS,KAAK,YAAA,EAAa;AAAA,IAClC;AACA,IAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,MAAA,GAAS,CAAA,EAAG;AACnC,MAAA,IAAA,CAAK,QAAA,GAAW,KAAK,cAAA,EAAe;AAAA,IACtC;AAEA,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,IAAA,CAAK,SAAS,IAAA,CAAK,cAAA;AAAA,IACrB;AAEA,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,IAAA,CAAK,UAAA,GAAa,KAAK,aAAA,EAAc;AAAA,IACvC;AAEA,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,CAAK,eAAe,MAAM,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAA,GAAgC;AAC9B,IAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,EAAY;AAC/B,IAAA,MAAM,OAAA,uBAAc,GAAA,EAA0B;AAC9C,IAAA,MAAM,QAAwB,EAAC;AAG/B,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,EAAA,EAAI,EAAE,MAAM,QAAA,EAAU,IAAI,CAAA;AAAA,IAC7C;AAGA,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AAChC,MAAA,IAAI,KAAK,YAAA,IAAgB,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,YAAY,CAAA,EAAG;AAEvD,QAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,YAAY,CAAA,CAAG,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,MACpD,CAAA,MAAO;AAEL,QAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,MACjB;AAAA,IACF;AAGA,IAAA,MAAM,YAAA,GAAe,CAAC,IAAA,KAAuB;AAC3C,MAAA,IAAA,CAAK,QAAA,CAAS,KAAK,CAAC,CAAA,EAAG,MAAM,IAAI,IAAA,CAAK,EAAE,IAAA,CAAK,SAAS,EAAE,OAAA,EAAQ,GAAI,IAAI,IAAA,CAAK,CAAA,CAAE,KAAK,SAAS,CAAA,CAAE,SAAS,CAAA;AACxG,MAAA,IAAA,CAAK,QAAA,CAAS,QAAQ,YAAY,CAAA;AAAA,IACpC,CAAA;AACA,IAAA,KAAA,CAAM,QAAQ,YAAY,CAAA;AAE1B,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW,OAAA,EAA+D;AACxE,IAAA,MAAM,MAAA,GAAS,OAAA,EAAS,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,UAAA;AAC/C,IAAA,MAAM,YAAA,GAAe,SAAS,YAAA,IAAgB,IAAA;AAE9C,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,IAAA,EAAM,KAAK,aAAA;AAAc,KAC3B;AAEA,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,IAAA,CAAK,UAAA,GAAa,KAAK,aAAA,EAAc;AAAA,IACvC;AAEA,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,CAAK,eAAe,MAAM,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,mBAAA,GAA4C;AAC1C,IAAA,MAAM,IAAA,GAAO,KAAK,aAAA,EAAc;AAChC,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAC1C,IAAA,MAAM,UAAA,uBAAiB,GAAA,EAAoB;AAE3C,IAAA,MAAM,aAAA,uBAAoB,GAAA,EAAiC;AAE3D,IAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAoB;AAClD,IAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,IAAA,IAAI,cAAA,GAAiB,CAAA;AAGrB,IAAA,MAAM,SAAA,GAAY,iEAAA;AAElB,IAAA,MAAM,YAAA,GAAe,iBAAA;AAErB,IAAA,MAAM,iBAAA,GAAoB,6EAAA;AAE1B,IAAA,MAAM,wBAAA,GAA2B,2EAAA;AACjC,IAAA,MAAM,yBAAA,GAA4B,4EAAA;AAGlC,IAAA,MAAM,aAAA,GAAgB,CAAC,IAAA,EAAc,GAAA,KAAwB;AAC3D,MAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA,EAAG;AAC3B,QAAA,aAAA,CAAc,GAAA,CAAI,GAAA,kBAAK,IAAI,GAAA,EAAK,CAAA;AAChC,QAAA,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,MAC9B;AACA,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AACpC,MAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,EAAG;AACrB,QAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,GAAA,CAAI,GAAG,CAAA;AACzC,QAAA,MAAA,CAAO,IAAI,IAAA,EAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,CAAG,CAAA;AACtC,QAAA,iBAAA,CAAkB,GAAA,CAAI,GAAA,EAAK,OAAA,GAAU,CAAC,CAAA;AAAA,MACxC;AACA,MAAA,OAAO,MAAA,CAAO,IAAI,IAAI,CAAA;AAAA,IACxB,CAAA;AAIA,IAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,EAAgB,GAAA,KAA0B;AAEhE,MAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,QAAA,OAAO,QAAA;AAAA,MACT;AACA,MAAA,IAAI,GAAA,KAAQ,WAAA,IAAe,OAAO,KAAA,KAAU,QAAA,EAAU;AACpD,QAAA,OAAO,QAAA;AAAA,MACT;AACA,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAE7B,QAAA,IAAI,GAAA,KAAQ,cAAc,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA,IAAK,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI;AAC5E,UAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA,EAAG;AAC1B,YAAA,UAAA,CAAW,GAAA,CAAI,KAAA,EAAO,CAAA,OAAA,EAAU,cAAA,EAAgB,CAAA,CAAA,CAAG,CAAA;AAAA,UACrD;AACA,UAAA,OAAO,UAAA,CAAW,IAAI,KAAK,CAAA;AAAA,QAC7B;AAEA,QAAA,IAAI,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA,EAAG;AAEzB,UAAA,OAAO,aAAA,CAAc,KAAA,EAAO,GAAA,IAAO,MAAM,CAAA;AAAA,QAC3C;AAEA,QAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,IAAA,CAAK,KAAK,CAAA;AAChD,QAAA,IAAI,eAAe,WAAA,CAAY,CAAC,CAAA,IAAK,WAAA,CAAY,CAAC,CAAA,EAAG;AACnD,UAAA,MAAM,MAAA,GAAS,YAAY,CAAC,CAAA;AAC5B,UAAA,MAAM,IAAA,GAAO,YAAY,CAAC,CAAA;AAC1B,UAAA,OAAO,GAAG,MAAM,CAAA,CAAA,EAAI,aAAA,CAAc,IAAA,EAAM,MAAM,CAAC,CAAA,CAAA;AAAA,QACjD;AAEA,QAAA,IAAI,wBAAA,CAAyB,IAAA,CAAK,KAAK,CAAA,EAAG;AACxC,UAAA,OAAO,MAAM,OAAA,CAAQ,yBAAA,EAA2B,CAAC,MAAA,EAAQ,QAAQ,IAAA,KAAS;AACxE,YAAA,OAAO,GAAG,MAAM,CAAA,CAAA,EAAI,aAAA,CAAc,IAAA,EAAM,MAAM,CAAC,CAAA,CAAA;AAAA,UACjD,CAAC,CAAA;AAAA,QACH;AAAA,MACF;AACA,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,QAAA,OAAO,MAAM,GAAA,CAAI,CAAA,CAAA,KAAK,cAAA,CAAe,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,MAC9C;AACA,MAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACtC,QAAA,MAAM,aAAsC,EAAC;AAC7C,QAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC1C,UAAA,IAAI,QAAQ,iBAAA,IAAqB,CAAA,KAAM,YAAY,CAAA,IAAK,OAAO,MAAM,QAAA,EAAU;AAC7E,YAAA,MAAM,aAAA,GAAgB,CAAA;AACtB,YAAA,MAAM,yBAAyB,MAAA,CAAO,WAAA;AAAA,cACpC,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,SAAS,CAAA,KAAM,SAAA,KAAc,WAAW;AAAA,aACjF;AACA,YAAA,IAAI,MAAA,CAAO,IAAA,CAAK,sBAAsB,CAAA,CAAE,SAAS,CAAA,EAAG;AAClD,cAAA,UAAA,CAAW,CAAC,CAAA,GAAI,cAAA,CAAe,sBAAA,EAAwB,CAAC,CAAA;AAAA,YAC1D;AACA,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,CAAA,EAAG,CAAC,CAAA;AAC3C,UAAA,IAAI,oBAAoB,MAAA,EAAW;AACjC,YAAA,UAAA,CAAW,CAAC,CAAA,GAAI,eAAA;AAAA,UAClB;AAAA,QACF;AAEA,QAAA,IAAI,QAAQ,iBAAA,IAAqB,MAAA,CAAO,KAAK,UAAU,CAAA,CAAE,WAAW,CAAA,EAAG;AACrE,UAAA,OAAO,MAAA;AAAA,QACT;AAEA,QAAA,OAAO,UAAA;AAAA,MACT;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAGA,IAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAA0B;AAC3C,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,SAAA,CAAU,IAAI,IAAA,CAAK,IAAA,CAAK,EAAA,EAAI,CAAA,MAAA,EAAS,eAAe,CAAA,CAAA,CAAG,CAAA;AAEvD,QAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA,EAAG;AACtC,UAAA,UAAA,CAAW,IAAI,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,CAAA,OAAA,EAAU,gBAAgB,CAAA,CAAA,CAAG,CAAA;AAAA,QACjE;AACA,QAAA,SAAA,CAAU,KAAK,QAAQ,CAAA;AAAA,MACzB;AAAA,IACF,CAAA;AACA,IAAA,SAAA,CAAU,IAAI,CAAA;AAGd,IAAA,MAAM,aAAA,GAAgB,CAAC,IAAA,KAA2C;AAChE,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,KAAY,MAAA,IAAa,KAAK,OAAA,KAAY,IAAA;AAEjE,MAAA,MAAM,cAAA,GAAiC;AAAA,QACrC,EAAA,EAAI,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AAAA,QACzB,OAAA,EAAS,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA;AAAA,QACpC,IAAA,EAAM,cAAA,CAAe,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA;AAAA,QACtC,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,SAAA;AAAA,QACA,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,YAAY,IAAA,CAAK;AAAA,OACnB;AAGA,MAAA,IAAI,KAAK,YAAA,IAAgB,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,YAAY,CAAA,EAAG;AACzD,QAAA,cAAA,CAAe,QAAA,GAAW,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,YAAY,CAAA;AAAA,MAC3D;AACA,MAAA,IAAI,KAAK,UAAA,EAAY;AACnB,QAAA,cAAA,CAAe,aAAa,IAAA,CAAK,UAAA;AAAA,MACnC;AACA,MAAA,IAAI,KAAK,QAAA,EAAU;AACjB,QAAA,cAAA,CAAe,QAAA,GAAW,cAAA,CAAe,IAAA,CAAK,QAAA,EAAU,UAAU,CAAA;AAAA,MACpE;AACA,MAAA,IAAI,IAAA,CAAK,cAAc,MAAA,CAAO,IAAA,CAAK,KAAK,UAAU,CAAA,CAAE,SAAS,CAAA,EAAG;AAC9D,QAAA,cAAA,CAAe,UAAA,GAAa,cAAA,CAAe,IAAA,CAAK,UAAU,CAAA;AAAA,MAC5D;AACA,MAAA,IAAI,IAAA,CAAK,YAAY,MAAA,CAAO,IAAA,CAAK,KAAK,QAAQ,CAAA,CAAE,SAAS,CAAA,EAAG;AAC1D,QAAA,cAAA,CAAe,QAAA,GAAW,cAAA,CAAe,IAAA,CAAK,QAAQ,CAAA;AAAA,MACxD;AACA,MAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC5B,QAAA,cAAA,CAAe,KAAA,GAAQ,cAAA,CAAe,IAAA,CAAK,KAAK,CAAA;AAAA,MAClD;AACA,MAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAW;AAC7B,QAAA,cAAA,CAAe,MAAA,GAAS,cAAA,CAAe,IAAA,CAAK,MAAM,CAAA;AAAA,MACpD;AACA,MAAA,IAAI,KAAK,SAAA,EAAW;AAClB,QAAA,cAAA,CAAe,SAAA,GAAY,cAAA,CAAe,IAAA,CAAK,SAAS,CAAA;AAAA,MAC1D;AACA,MAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA,EAAG;AACrC,QAAA,cAAA,CAAe,OAAO,IAAA,CAAK,IAAA;AAAA,MAC7B;AAEA,MAAA,MAAM,MAAA,GAA6B,EAAE,IAAA,EAAM,cAAA,EAAe;AAG1D,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAC5B,QAAA,MAAA,CAAO,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,aAAa,CAAA;AAAA,MACnD;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAEA,IAAA,OAAO,IAAA,CAAK,IAAI,aAAa,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,uBAAuB,KAAA,EAAwC;AAC7D,IAAA,MAAM,IAAA,GAAO,KAAA,IAAS,IAAA,CAAK,mBAAA,EAAoB;AAC/C,IAAA,MAAM,QAAkB,EAAC;AAEzB,IAAA,MAAM,UAAA,GAAa,CAAC,IAAA,EAA0B,MAAA,EAAgB,QAAiB,MAAA,KAA0B;AAEvG,MAAA,MAAM,SAAA,GAAY,MAAA,GAAS,EAAA,GAAK,MAAA,GAAS,qBAAA,GAAS,qBAAA;AAClD,MAAA,MAAM,IAAA,GAAO,CAAA,EAAG,MAAM,CAAA,EAAG,SAAS,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,GAAA,EAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,CAAA,CAAA;AACvE,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAGf,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,EAAC;AACnC,MAAA,MAAM,WAAA,GAAc,MAAA,GAAS,EAAA,GAAK,MAAA,IAAU,SAAS,MAAA,GAAS,WAAA,CAAA;AAC9D,MAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,KAAU;AACjC,QAAA,MAAM,WAAA,GAAc,KAAA,KAAU,QAAA,CAAS,MAAA,GAAS,CAAA;AAChD,QAAA,UAAA,CAAW,KAAA,EAAO,WAAA,EAAa,WAAA,EAAa,KAAK,CAAA;AAAA,MACnD,CAAC,CAAA;AAAA,IACH,CAAA;AAGA,IAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,QAAA,EAAU,KAAA,KAAU;AAChC,MAAA,IAAI,QAAQ,CAAA,EAAG;AACb,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,MACf;AACA,MAAA,UAAA,CAAW,QAAA,EAAU,EAAA,EAAI,IAAA,EAAM,IAAI,CAAA;AAAA,IACrC,CAAC,CAAA;AAED,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,qBAAqB,OAAA,EAAmE;AACtF,IAAA,MAAM,MAAA,GAAS,OAAA,EAAS,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,UAAA;AAC/C,IAAA,MAAM,gBAAA,GAAmB,SAAS,gBAAA,IAAoB,IAAA;AACtD,IAAA,MAAM,cAAA,GAAiB,KAAK,mBAAA,EAAoB;AAEhD,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,sBAAA,CAAuB,cAAc,CAAA;AACjE,MAAA,MAAM,IAAA,GAAO;AAAA,QACX,aAAA,EAAe,cAAA;AAAA,QACf,KAAA,EAAO;AAAA,OACT;AACA,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AAAA,IAC1C;AAEA,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,cAAA,EAAgB,IAAA,EAAM,MAAM,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,WAAA,CACJ,QAAA,EACA,OAAA,EAMe;AACf,IAAA,MAAM,MAAA,GAAS,SAAS,MAAA,IAAU,MAAA;AAClC,IAAA,IAAI,IAAA;AAEJ,IAAA,IAAI,WAAW,YAAA,EAAc;AAC3B,MAAA,IAAA,GAAO,KAAK,oBAAA,CAAqB,EAAE,MAAA,EAAQ,OAAA,EAAS,QAAQ,CAAA;AAAA,IAC9D,CAAA,MAAA,IAAW,WAAW,MAAA,EAAQ;AAC5B,MAAA,IAAA,GAAO,IAAA,CAAK,WAAW,EAAE,MAAA,EAAQ,SAAS,MAAA,EAAQ,YAAA,EAAc,OAAA,EAAS,YAAA,EAAc,CAAA;AAAA,IACzF,CAAA,MAAO;AACL,MAAA,IAAA,GAAO,IAAA,CAAK,OAAO,OAAO,CAAA;AAAA,IAC5B;AAEA,IAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,OAAO,aAAkB,CAAA;AACrD,IAAA,MAAM,SAAA,CAAU,QAAA,EAAU,IAAA,EAAM,OAAO,CAAA;AACvC,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,oBAAA,EAAuB,IAAA,CAAK,eAAe,MAAM,CAAA,mBAAA,EAAsB,QAAQ,CAAA,CAAE,CAAA;AAAA,EACpG;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,EA2BA,MAAM,qBAAA,CAAsB,YAAA,EAAsB,OAAA,EAAuD;AAEvG,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,OAAO,MAAW,CAAA;AACzC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,MAAM,eAAA,IAAmB,YAAY,CAAA;AAC/D,IAAA,MAAM,cAAA,GAAiB,KAAK,mBAAA,EAAoB;AAChD,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,sBAAA,CAAuB,cAAc,CAAA;AAGjE,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,aAAA,EAAe,cAAA;AAAA,MACf,KAAA,EAAO;AAAA,KACT;AACA,IAAA,MAAM,cAAc,IAAA,CAAK,SAAA,CAAU,aAAa,IAAA,EAAM,IAAA,CAAK,QAAQ,UAAU,CAAA;AAG7E,IAAA,MAAM,eAAe,OAAA,EAAS,cAAA;AAG9B,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,OAAO,aAAkB,CAAA;AACrD,MAAA,MAAM,SAAA,CAAU,YAAA,EAAc,WAAA,EAAa,OAAO,CAAA;AAClD,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,+BAAA,EAAkC,YAAY,CAAA,CAAE,CAAA;AACjE,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI,eAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,OAAO,aAAkB,CAAA;AACpD,MAAA,eAAA,GAAkB,MAAM,QAAA,CAAS,YAAA,EAAc,OAAO,CAAA;AAAA,IACxD,SAAS,GAAA,EAAc;AACrB,MAAA,IAAI,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,UAAU,GAAA,IAAQ,GAAA,CAA8B,SAAS,QAAA,EAAU;AACvG,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,4BAA4B,YAAY;AAAA,+CAAA;AAAA,SAC1C;AAAA,MACF;AACA,MAAA,MAAM,GAAA;AAAA,IACR;AACA,IAAA,IAAI;AACF,MAAA,YAAA,GAAe,IAAA,CAAK,MAAM,eAAe,CAAA;AAAA,IAC3C,SAAS,GAAA,EAAc;AACrB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,YAAY,CAAA,EAAA,EAAK,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,IACjH;AAGA,IAAA,IAAI,aAAA;AACJ,IAAA,IAAI,iBAAA;AAEJ,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,EAAG;AAE/B,MAAA,aAAA,GAAgB,YAAA;AAAA,IAClB,WAAW,YAAA,IAAgB,OAAO,YAAA,KAAiB,QAAA,IAAY,WAAW,YAAA,EAAc;AAEtF,MAAA,aAAA,GAAgB,YAAA,CAAa,KAAA;AAC7B,MAAA,iBAAA,GAAoB,YAAA,CAAa,aAAA;AAAA,IACnC,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,8BAA8B,YAAY,CAAA;AAAA,kDAAA;AAAA,OAC5C;AAAA,IACF;AAGA,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,MAAM,mBAAA,GAAsB,IAAA,CAAK,iBAAA,CAAkB,cAAA,EAAgB,iBAAiB,CAAA;AACpF,MAAA,IAAI,mBAAA,CAAoB,SAAS,CAAA,EAAG;AAClC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA;;AAAA;AAAA,EACgB,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAC;;AAAA;AAAA,EAC9B,cAAA,CAAe,IAAA,CAAK,IAAI,CAAC;;AAAA;AAAA,EACpB,mBAAA,CAAoB,IAAA,CAAK,IAAI,CAAC;;AAAA,UAAA,EAClC,YAAY;AAAA,4CAAA;AAAA,SAE7B;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,aAAqE,EAAC;AAC5E,IAAA,IAAA,CAAK,uBAAA,CAAwB,cAAA,EAAgB,aAAA,EAAe,SAAA,EAAW,UAAU,CAAA;AAEjF,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,MAAM,kBAAkB,UAAA,CACrB,GAAA;AAAA,QACC,CAAC,GAAG,CAAA,KACF,CAAA,EAAG,IAAI,CAAC,CAAA,EAAA,EAAK,EAAE,IAAI;AAAA,aAAA,EAAkB,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,QAAQ,CAAC;AAAA,aAAA,EAAkB,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,OAC7G,CACC,KAAK,MAAM,CAAA;AACd,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,aAAA,EAAgB,WAAW,MAAM,CAAA,SAAA,EAAY,WAAW,MAAA,GAAS,CAAA,GAAI,OAAO,EAAE,CAAA;;AAAA,EACzE,eAAe;;AAAA,UAAA,EACL,YAAY;AAAA,4CAAA;AAAA,OAE7B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,CAAkB,QAAkB,QAAA,EAA8B;AAChE,IAAA,MAAM,QAAkB,EAAC;AAEzB,IAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,MAAA,EAAQ,SAAS,MAAM,CAAA;AACtD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,UAAA,GAAa,OAAO,CAAC,CAAA;AAC3B,MAAA,MAAM,YAAA,GAAe,SAAS,CAAC,CAAA;AAE/B,MAAA,IAAI,eAAe,YAAA,EAAc;AAC/B,QAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,UAAA,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,CAAA,GAAI,CAAC,CAAA,mBAAA,CAAqB,CAAA;AAC7C,UAAA,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,YAAY,CAAA,CAAE,CAAA;AAAA,QAC1C,CAAA,MAAA,IAAW,iBAAiB,MAAA,EAAW;AACrC,UAAA,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,CAAA,GAAI,CAAC,CAAA,iBAAA,CAAmB,CAAA;AAC3C,UAAA,KAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa,UAAU,CAAA,CAAE,CAAA;AAAA,QACtC,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,CAAA,GAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAC3B,UAAA,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,YAAY,CAAA,CAAE,CAAA;AACxC,UAAA,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,UAAU,CAAA,CAAE,CAAA;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,uBAAA,CACE,MAAA,EACA,QAAA,EACApC,KAAAA,EACA,UAAA,EACM;AAEN,IAAA,IAAI,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA,EAAG;AAC9B,MAAA,MAAM,gBAAiB,QAAA,CAAmC,MAAA;AAC1D,MAAA,MAAM,OAAA,GAAU,aAAA,CAAc,IAAA,CAAK,CAAA,OAAA,KAAW;AAC5C,QAAA,MAAM,iBAAyE,EAAC;AAChF,QAAA,IAAA,CAAK,uBAAA,CAAwB,MAAA,EAAQ,OAAA,EAASA,KAAAA,EAAM,cAAc,CAAA;AAClE,QAAA,OAAO,eAAe,MAAA,KAAW,CAAA;AAAA,MACnC,CAAC,CAAA;AACD,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,UAAA,CAAW,IAAA,CAAK,EAAE,IAAA,EAAAA,KAAAA,EAAM,QAAA,EAAU,EAAE,MAAA,EAAQ,aAAA,EAAc,EAAG,MAAA,EAAQ,CAAA;AAAA,MACvE;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,QAAQ,CAAA,EAAG;AAC/B,MAAA,MAAM,iBAAkB,QAAA,CAA2C,OAAA;AAGnE,MAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,MAAA,KAAW,MAAA,EAAW;AAC3C,QAAA,UAAA,CAAW,IAAA,CAAK,EAAE,IAAA,EAAAA,KAAAA,EAAM,QAAA,EAAU,EAAE,OAAA,EAAS,cAAA,EAAe,EAAG,MAAA,EAAQ,CAAA;AACvE,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,mBAAmB,IAAA,EAAM;AAC3B,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,aAAa,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,UAAU,OAAO,MAAA;AAC5D,MAAA,IAAI,eAAe,cAAA,EAAgB;AACjC,QAAA,UAAA,CAAW,IAAA,CAAK;AAAA,UACd,IAAA,EAAAA,KAAAA;AAAA,UACA,QAAA,EAAU,EAAE,OAAA,EAAS,cAAA,EAAe;AAAA,UACpC,MAAA,EAAQ,CAAA,CAAA,EAAI,UAAU,CAAA,EAAA,EAAK,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,GAAA;AAAA,SAC/D,CAAA;AAAA,MACH;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC3B,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC1B,QAAA,UAAA,CAAW,KAAK,EAAE,IAAA,EAAAA,KAAAA,EAAM,QAAA,EAAU,QAAQ,CAAA;AAC1C,QAAA;AAAA,MACF;AACA,MAAA,IAAI,MAAA,CAAO,MAAA,KAAW,QAAA,CAAS,MAAA,EAAQ;AACrC,QAAA,UAAA,CAAW,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,EAAGA,KAAI,CAAA,OAAA,CAAA,EAAW,QAAA,EAAU,QAAA,CAAS,MAAA,EAAQ,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,CAAA;AAC5F,QAAA;AAAA,MACF;AACA,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,QAAA,IAAA,CAAK,uBAAA,CAAwB,MAAA,CAAO,CAAC,CAAA,EAAG,QAAA,CAAS,CAAC,CAAA,EAAG,CAAA,EAAGA,KAAI,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAA,EAAK,UAAU,CAAA;AAAA,MAClF;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,OAAO,QAAA,KAAa,QAAA,EAAU;AACrD,MAAA,IAAI,MAAA,KAAW,QAAQ,OAAO,MAAA,KAAW,YAAY,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC1E,QAAA,UAAA,CAAW,KAAK,EAAE,IAAA,EAAAA,KAAAA,EAAM,QAAA,EAAU,QAAQ,CAAA;AAC1C,QAAA;AAAA,MACF;AACA,MAAA,MAAM,WAAA,GAAc,QAAA;AACpB,MAAA,MAAM,SAAA,GAAY,MAAA;AAGlB,MAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,EAAG;AAE1C,QAAA,IAAI,IAAA,CAAK,cAAA,CAAe,GAAG,CAAA,EAAG;AAC5B,UAAA;AAAA,QACF;AACA,QAAA,IAAI,EAAE,OAAO,SAAA,CAAA,EAAY;AAEvB,UAAA,IAAI,WAAA,CAAY,GAAG,CAAA,KAAM,MAAA,EAAW;AAClC,YAAA,UAAA,CAAW,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,EAAGA,KAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,QAAA,EAAU,WAAA,CAAY,GAAG,CAAA,EAAG,MAAA,EAAQ,QAAW,CAAA;AAAA,UAC3F;AACA,UAAA;AAAA,QACF;AACA,QAAA,IAAA,CAAK,uBAAA,CAAwB,SAAA,CAAU,GAAG,CAAA,EAAG,WAAA,CAAY,GAAG,CAAA,EAAG,CAAA,EAAGA,KAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,UAAU,CAAA;AAAA,MAC7F;AAGA,MAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,EAAG;AACxC,QAAA,IAAI,IAAA,CAAK,cAAA,CAAe,GAAG,CAAA,EAAG;AAC5B,UAAA;AAAA,QACF;AACA,QAAA,IAAI,EAAE,OAAO,WAAA,CAAA,EAAc;AAEzB,UAAA,IAAI,SAAA,CAAU,GAAG,CAAA,KAAM,MAAA,EAAW;AAChC,YAAA,UAAA,CAAW,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,EAAGA,KAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,QAAA,EAAU,MAAA,EAAW,MAAA,EAAQ,SAAA,CAAU,GAAG,GAAG,CAAA;AAAA,UACzF;AAAA,QACF;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,WAAW,QAAA,EAAU;AACvB,MAAA,UAAA,CAAW,KAAK,EAAE,IAAA,EAAAA,KAAAA,EAAM,QAAA,EAAU,QAAQ,CAAA;AAAA,IAC5C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,KAAA,EAAyB;AACnC,IAAA,OACE,KAAA,KAAU,IAAA,IACV,OAAO,KAAA,KAAU,YACjB,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,KACpB,QAAA,IAAY,KAAA,IACZ,KAAA,CAAM,OAAA,CAAS,MAA8B,MAAM,CAAA;AAAA,EAEvD;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,KAAA,EAAyB;AACpC,IAAA,IAAI,KAAA,KAAU,QAAQ,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACvE,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,EAAE,aAAa,KAAA,CAAA,EAAQ;AACzB,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,MAAM,aAAc,KAAA,CAA+B,OAAA;AAEnD,IAAA,OAAO,UAAA,KAAe,IAAA,IAAQ,CAAC,QAAA,EAAU,QAAA,EAAU,WAAW,QAAA,EAAU,OAAO,CAAA,CAAE,QAAA,CAAS,UAAoB,CAAA;AAAA,EAChH;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,GAAA,EAAsB;AACnC,IAAA,OAAO,IAAI,UAAA,CAAW,IAAI,CAAA,IAAK,GAAA,CAAI,SAAS,IAAI,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAgB,CAAC,IAAA,EAAc,KAAA,KAA4B;AACzD,IAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,MAAA,OAAO,MAAM,WAAA,EAAY;AAAA,IAC3B;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAA,GAAoB;AAClB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,UAAU,CAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAiB;AACf,IAAA,OAAA,CAAQ,MAAM,6BAA6B,CAAA;AAC3C,IAAA,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,GAAA,KAAO;AAC7B,MAAA,OAAA,CAAQ,MAAM,GAAG,CAAA;AAAA,IACnB,CAAC,CAAA;AACD,IAAA,OAAA,CAAQ,MAAM,oBAAoB,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAA,GAME;AACA,IAAA,MAAM,QAAA,GAAW,KAAK,WAAA,EAAY;AAClC,IAAA,MAAM,eAAA,GAAkB,KAAK,kBAAA,EAAmB;AAEhD,IAAA,MAAM,aAAA,GAAgB,SAAS,MAAA,KAAW,CAAA;AAC1C,IAAA,MAAM,gBAAA,GAAmB,gBAAgB,MAAA,KAAW,CAAA;AAEpD,IAAA,OAAO;AAAA,MACL,OAAO,aAAA,IAAiB,gBAAA;AAAA,MACxB,aAAA;AAAA,MACA,gBAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAA,GAAoB;AAClB,IAAA,IAAA,CAAK,iBAAiB,EAAC;AACvB,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,IAAA,IAAA,CAAK,aAAa,EAAC;AACnB,IAAA,IAAA,CAAK,gBAAgB,EAAC;AACtB,IAAA,IAAA,CAAK,eAAe,EAAC;AACrB,IAAA,IAAA,CAAK,kBAAkB,EAAC;AACxB,IAAA,IAAA,CAAK,aAAa,EAAC;AAAA,EAGrB;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,WAAA,EAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,GAAkD;AAChD,IAAA,MAAM,IAAA,GAAO,KAAK,MAAA,CAAO,EAAE,eAAe,KAAA,EAAO,YAAA,EAAc,OAAO,CAAA;AACtE,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,KAAK,gBAAA,CAAiB,SAAA;AAAA,MACjC,WAAA,EAAa,KAAK,gBAAA,CAAiB,WAAA;AAAA,MACnC,mBAAA,EAAqB,KAAK,gBAAA,CAAiB,mBAAA;AAAA,MAC3C,QAAA,EAAU,EAAE,GAAG,IAAA,CAAK,iBAAiB,QAAA,EAAS;AAAA,MAC9C,UAAA,EAAY,KAAK,gBAAA,CAAiB,UAAA;AAAA,MAClC,oBAAoB,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,IAAI,CAAA,CAAE;AAAA,KACrD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,gBAAA,CAAiB,UAAA,EAAA;AAEtB,IAAA,IAAI,IAAA,CAAK,QAAQ,iBAAA,EAAmB;AAClC,MAAA,MAAM,OAAA,GAAU,KAAK,kBAAA,EAAmB;AACxC,MAAA,MAAM,WAAW,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA,CAAQ,UAAU,OAAA,EAAQ;AACxD,MAAA,MAAM,OAAA,GAAU;AAAA,QACd,CAAA,sBAAA,EAAyB,QAAQ,UAAU,CAAA,SAAA,CAAA;AAAA,QAC3C,CAAA,UAAA,EAAA,CAAc,QAAA,GAAW,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,QACzC,CAAA,yBAAA,EAA4B,QAAQ,mBAAmB,CAAA,CAAA;AAAA,QACvD,wBAAwB,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,MAAA,EAAS,OAAA,CAAQ,SAAS,GAAG,CAAA,SAAA,EAAY,QAAQ,QAAA,CAAS,MAAM,WAAW,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,WAAA,EAAc,OAAA,CAAQ,SAAS,QAAQ,CAAA,CAAA;AAAA,QACxL,qBAAqB,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,OAAA,EAAU,IAAA,CAAK,WAAW,MAAM,CAAA,UAAA,EAAa,KAAK,aAAA,CAAc,MAAM,YAAY,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA,WAAA,EAAc,IAAA,CAAK,gBAAgB,MAAM,CAAA,CAAA;AAAA,QAC7L,2BAA2B,OAAA,CAAQ,kBAAA,GAAqB,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA;AAAA,OAC1E,CAAE,KAAK,IAAI,CAAA;AACX,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,GAA0B;AAC9B,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,uBAAuB,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,0BAA0B,MAAA,EAA2C;AACnE,IAAA,MAAM,OAAA,uBAAc,GAAA,EAA6B;AAEjD,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,OAAO,KAAA,CAAM,YAAA;AAEnB,MAAA,IAAI,KAAA,CAAM,SAASoC,8BAAA,CAAU,UAAA,IAAc,CAAC,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG;AAChE,QAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,IAAI,CAAA;AAAA,MAC3B;AAAA,IACF;AAEA,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA;AAAA,EACpC;AACF;AASO,IAAM,YAAA,GAAe;;;ACppDrB,IAAM,4BAAA,GAAN,cAA2C,yBAAA,CAA0B;AAAA,EAC1E,YAAY,MAAA,EAAqC;AAC/C,IAAA,KAAA,CAAM,MAAM,CAAA;AAAA,EACd;AAAA,EAEU,WAAmC,OAAA,EAAgD;AAE3F,IAAA,OAAO,IAAI,WAAA,CAAmB,OAAA,EAAS,IAAI,CAAA;AAAA,EAC7C;AACF;ACYA,SAAS,gBAAmB,KAAA,EAA4C;AACtE,EAAA,OAAO,KAAA,IAAS,MAAA;AAClB;AAEA,SAAS,aAAA,CACP,MACA,KAAA,EACqC;AACrC,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,KAAA,EAAO,OAAO,MAAA;AAC5B,EAAA,OAAO;AAAA,IACL,GAAI,QAAQ,EAAC;AAAA,IACb,GAAI,SAAS;AAAC,GAChB;AACF;AAEA,SAAS,mBAAmB,KAAA,EAA+C;AACzE,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,EAAE,SAAA,IAAa,KAAA,CAAA,IAAU,OAAO,KAAA,CAAM,OAAA,KAAY,QAAA,EAAU;AACrG,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,EAAA,EAAI,QAAQ,KAAA,IAAS,OAAO,MAAM,EAAA,KAAO,QAAA,GAAW,MAAM,EAAA,GAAK,MAAA;AAAA,IAC/D,IAAA,EAAM,UAAU,KAAA,IAAS,OAAO,MAAM,IAAA,KAAS,QAAA,GAAW,MAAM,IAAA,GAAO,MAAA;AAAA,IACvE,KAAA,EAAO,WAAW,KAAA,IAAS,OAAO,MAAM,KAAA,KAAU,QAAA,GAAW,MAAM,KAAA,GAAQ,MAAA;AAAA,IAC3E,MAAA,EAAQ,YAAY,KAAA,IAAS,OAAO,MAAM,MAAA,KAAW,QAAA,GAAW,MAAM,MAAA,GAAS,MAAA;AAAA,IAC/E,QAAA,EAAU,cAAc,KAAA,IAAS,OAAO,MAAM,QAAA,KAAa,QAAA,GAAW,MAAM,QAAA,GAAW,MAAA;AAAA,IACvF,OAAA,EACE,SAAA,IAAa,KAAA,IAAS,KAAA,CAAM,OAAA,IAAW,OAAO,KAAA,CAAM,OAAA,KAAY,QAAA,GAC3D,KAAA,CAAM,OAAA,GACP;AAAA,GACR;AACF;AAEA,SAAS,uBAAA,CACP,IAAA,EACA,QAAA,EACA,MAAA,EACoB;AACpB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,SAAS,IAAA,IAAQ,MAAA;AAAA,IACvB,UAAA,EAAY,eAAA,CAAgB,IAAA,CAAK,UAAU,CAAA;AAAA,IAC3C,QAAA,EAAU,eAAA,CAAgB,IAAA,CAAK,QAAQ,CAAA;AAAA,IACvC,UAAA,EAAY,eAAA,CAAgB,IAAA,CAAK,UAAU,CAAA;AAAA,IAC3C,gBAAA,EAAkB,QAAQ,UAAA,IAAc,MAAA;AAAA,IACxC,cAAA,EAAgB,QAAQ,QAAA,IAAY,MAAA;AAAA,IACpC,gBAAA,EAAkB,QAAQ,UAAA,IAAc,MAAA;AAAA,IACxC,cAAA,EAAgB,eAAA,CAAgB,QAAA,CAAS,UAAU,CAAA;AAAA,IACnD,YAAA,EAAc,eAAA,CAAgB,QAAA,CAAS,QAAQ,CAAA;AAAA,IAC/C,cAAA,EAAgB,eAAA,CAAgB,QAAA,CAAS,UAAU,CAAA;AAAA,IACnD,MAAA,EAAQ,eAAA,CAAgB,IAAA,CAAK,MAAM,CAAA;AAAA,IACnC,cAAA,EAAgB,eAAA,CAAgB,IAAA,CAAK,cAAc,CAAA;AAAA,IACnD,UAAA,EAAY,eAAA,CAAgB,IAAA,CAAK,UAAU,CAAA;AAAA,IAC3C,KAAA,EAAO,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA;AAAA,IACjC,SAAA,EAAW,eAAA,CAAgB,IAAA,CAAK,SAAS,CAAA;AAAA,IACzC,QAAA,EAAU,eAAA,CAAgB,IAAA,CAAK,QAAQ,CAAA;AAAA,IACvC,SAAA,EAAW,eAAA,CAAgB,IAAA,CAAK,SAAS,CAAA;AAAA,IACzC,WAAA,EAAa,eAAA,CAAgB,IAAA,CAAK,WAAW,CAAA;AAAA,IAC7C,MAAA,EAAQ,eAAA,CAAgB,IAAA,CAAK,MAAM,CAAA;AAAA,IACnC,WAAA,EAAa,eAAA,CAAgB,IAAA,CAAK,WAAW,CAAA;AAAA,IAC7C,YAAA,EAAc,eAAA,CAAgB,IAAA,CAAK,YAAY;AAAA,GACjD;AACF;AAEO,SAAS,gBAAgB,IAAA,EAMjB;AACb,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAQ,kBAAA,EAAoB,KAAA,EAAO,mBAAkB,GAAI,IAAA;AAE1E,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,OAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,SAAStC,8BAAAA,EAAiB;AAAA,MAC1B,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,OAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,YAAY,KAAA,CAAM,UAAA;AAAA,MAClB,eAAe,KAAA,CAAM,aAAA;AAAA,MACrB,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,cAAc,KAAA,CAAM,YAAA;AAAA,MACpB,cAAc,KAAA,CAAM,YAAA;AAAA,MACpB,kBAAkB,KAAA,CAAM,gBAAA;AAAA,MACxB,kBAAA;AAAA,MACA,QAAA,EAAU,aAAA,CAAc,iBAAA,EAAmB,KAAA,CAAM,QAAQ;AAAA;AAC3D,GACF;AACF;AAEO,SAAS,mBAAmB,IAAA,EAMjB;AAChB,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAQ,kBAAA,EAAoB,QAAA,EAAU,mBAAkB,GAAI,IAAA;AAE7E,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,QAAA,EAAU;AAAA,MACR,YAAYA,8BAAAA,EAAiB;AAAA,MAC7B,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,OAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,gBAAgB,QAAA,CAAS,cAAA;AAAA,MACzB,cAAc,QAAA,CAAS,YAAA;AAAA,MACvB,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,gBAAgB,QAAA,CAAS,cAAA;AAAA,MACzB,SAAS,QAAA,CAAS,OAAA;AAAA,MAClB,UAAU,QAAA,CAAS,QAAA;AAAA,MACnB,cAAc,QAAA,CAAS,YAAA;AAAA,MACvB,kBAAA;AAAA,MACA,QAAA,EAAU,aAAA,CAAc,iBAAA,EAAmB,QAAA,CAAS,QAAQ;AAAA;AAC9D,GACF;AACF;AAEA,SAAS,YAAA,CAAa,OAAqB,MAAA,EAAoD;AAC7F,EAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AACpB,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,KAAQ,IAAA,CAAK,WAAW,MAAM,CAAA;AAClD;AAEO,SAAS,iCAAiC,IAAA,EAI3B;AACpB,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC9C,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,MAAM,IAAA,GAAO,KAAK,MAAA,GAAS,YAAA,CAAa,KAAK,KAAA,CAAM,KAAA,EAAO,IAAA,CAAK,MAAM,CAAA,GAAI,QAAA;AACzE,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,MAAM,MAAA,GAAS,KAAK,YAAA,GAAe,YAAA,CAAa,KAAK,KAAA,CAAM,KAAA,EAAO,IAAA,CAAK,YAAY,CAAA,GAAI,MAAA;AAEvF,EAAA,OAAO,eAAA,CAAgB;AAAA,IACrB,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,kBAAA,EAAoB,uBAAA,CAAwB,IAAA,EAAM,QAAA,EAAU,MAAM,CAAA;AAAA,IAClE,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,mBAAmB,IAAA,CAAK;AAAA,GACzB,CAAA;AACH;AAEO,SAAS,oCAAoC,IAAA,EAI3B;AACvB,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC9C,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,MAAM,IAAA,GAAO,KAAK,MAAA,GAAS,YAAA,CAAa,KAAK,KAAA,CAAM,KAAA,EAAO,IAAA,CAAK,MAAM,CAAA,GAAI,QAAA;AACzE,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,MAAM,MAAA,GAAS,KAAK,YAAA,GAAe,YAAA,CAAa,KAAK,KAAA,CAAM,KAAA,EAAO,IAAA,CAAK,YAAY,CAAA,GAAI,MAAA;AAEvF,EAAA,OAAO,kBAAA,CAAmB;AAAA,IACxB,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,kBAAA,EAAoB,uBAAA,CAAwB,IAAA,EAAM,QAAA,EAAU,MAAM,CAAA;AAAA,IAClE,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,mBAAmB,IAAA,CAAK;AAAA,GACzB,CAAA;AACH;AAEA,IAAM,mBAAN,MAAyF;AAAA,EACvE,EAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EASA,cAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACT,MAAA;AAAA,EACS,WAA+B,EAAC;AAAA,EAEvC,IAAA;AAAA,EACA,SAAA;AAAA,EACA,kBAAA;AAAA,EACA,qBAAA;AAAA,EACA,mCAAA;AAAA,EAET,YAAY,IAAA,EAMT;AACD,IAAA,MAAM,EAAE,GAAA,EAAK,QAAA,EAAU,iBAAA,EAAmB,oBAAA,EAAsB,oCAAmC,GAAI,IAAA;AAEvG,IAAA,IAAA,CAAK,IAAA,GAAO,GAAA;AACZ,IAAA,IAAA,CAAK,SAAA,GAAY,QAAA;AACjB,IAAA,IAAA,CAAK,kBAAA,GAAqB,iBAAA;AAC1B,IAAA,IAAA,CAAK,qBAAA,GAAwB,oBAAA;AAC7B,IAAA,IAAA,CAAK,mCAAA,GAAsC,kCAAA;AAE3C,IAAA,IAAA,CAAK,KAAK,GAAA,CAAI,MAAA;AACd,IAAA,IAAA,CAAK,UAAU,GAAA,CAAI,OAAA;AACnB,IAAA,IAAA,CAAK,OAAO,GAAA,CAAI,IAAA;AAChB,IAAA,IAAA,CAAK,OAAO,GAAA,CAAI,QAAA;AAChB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,UAAA,IAAc,MAAA;AACpC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,QAAA,IAAY,MAAA;AAChC,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,UAAA,IAAc,MAAA;AACpC,IAAA,IAAA,CAAK,YAAY,GAAA,CAAI,SAAA;AACrB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,OAAA,IAAW,MAAA;AAC9B,IAAA,IAAA,CAAK,UAAA,GAAc,IAAI,UAAA,IAAc,MAAA;AACrC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,QAAA,IAAY,MAAA;AAChC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,IAAA,IAAQ,MAAA;AACxB,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,KAAA,IAAS,MAAA;AAC1B,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,MAAA,IAAU,MAAA;AAC5B,IAAA,IAAA,CAAK,SAAA,GAAY,kBAAA,CAAmB,GAAA,CAAI,KAAK,CAAA;AAC7C,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,cAAA,IAAkB,MAAA;AAC5C,IAAA,IAAA,CAAK,UAAU,GAAA,CAAI,OAAA;AACnB,IAAA,IAAA,CAAK,UAAA,GAAa,CAAC,GAAA,CAAI,YAAA;AACvB,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,YAAA,IAAgB,MAAA;AAAA,EAC1C;AAAA,EAEA,MAAM,SAAS,KAAA,EAAkC;AAC/C,IAAA,IAAI,CAAC,IAAA,CAAK,qBAAA,EAAsB,EAAG;AACjC,MAAA,IAAA,CAAK,mCAAA,CAAoC,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,KAAK,OAAA,EAAS,MAAA,EAAQ,IAAA,CAAK,EAAA,EAAI,CAAA;AAClG,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,CAAK,kBAAA;AAAA,MACT,eAAA,CAAgB;AAAA,QACd,OAAA,EAAS,KAAK,IAAA,CAAK,OAAA;AAAA,QACnB,QAAQ,IAAA,CAAK,EAAA;AAAA,QACb,oBAAoB,uBAAA,CAAwB,IAAA,CAAK,MAAM,IAAA,CAAK,SAAA,EAAW,KAAK,MAAM,CAAA;AAAA,QAClF,KAAA;AAAA,QACA,iBAAA,EAAmB,KAAK,IAAA,CAAK;AAAA,OAC9B;AAAA,KACH;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,QAAA,EAAwC;AACxD,IAAA,IAAI,CAAC,IAAA,CAAK,qBAAA,EAAsB,EAAG;AACjC,MAAA,IAAA,CAAK,mCAAA,CAAoC,EAAE,IAAA,EAAM,UAAA,EAAY,OAAA,EAAS,KAAK,OAAA,EAAS,MAAA,EAAQ,IAAA,CAAK,EAAA,EAAI,CAAA;AACrG,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,CAAK,kBAAA;AAAA,MACT,kBAAA,CAAmB;AAAA,QACjB,OAAA,EAAS,KAAK,IAAA,CAAK,OAAA;AAAA,QACnB,QAAQ,IAAA,CAAK,EAAA;AAAA,QACb,oBAAoB,uBAAA,CAAwB,IAAA,CAAK,MAAM,IAAA,CAAK,SAAA,EAAW,KAAK,MAAM,CAAA;AAAA,QAClF,QAAA;AAAA,QACA,iBAAA,EAAmB,KAAK,IAAA,CAAK;AAAA,OAC9B;AAAA,KACH;AAAA,EACF;AACF,CAAA;AAEA,IAAM,oBAAN,MAAiD;AAAA,EAC/B,OAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EAEP,WAAA;AAAA,EACA,kBAAA;AAAA,EACA,QAAA;AAAA,EACA,qBAAA;AAAA,EACA,mCAAA;AAAA,EAET,YAAY,IAAA,EAQT;AACD,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AACpB,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AACrB,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,UAAA;AACxB,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAClB,IAAA,IAAA,CAAK,qBAAqB,IAAA,CAAK,iBAAA;AAC/B,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAA,IAAA,KAAQ,CAAC,IAAA,CAAK,EAAA,EAAI,IAAI,CAAC,CAAC,CAAA;AAC/D,IAAA,IAAA,CAAK,wBAAwB,IAAA,CAAK,oBAAA;AAClC,IAAA,IAAA,CAAK,sCAAsC,IAAA,CAAK,kCAAA;AAAA,EAClD;AAAA,EAEA,QAAQ,MAAA,EAAwC;AAC9C,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,IAAK,IAAA;AAAA,EACtC;AAAA,EAEA,MAAM,SAAS,KAAA,EAAkC;AAC/C,IAAA,IAAI,CAAC,IAAA,CAAK,qBAAA,EAAsB,EAAG;AACjC,MAAA,IAAA,CAAK,oCAAoC,EAAE,IAAA,EAAM,SAAS,OAAA,EAAS,IAAA,CAAK,SAAS,CAAA;AACjF,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,CAAK,kBAAA;AAAA,MACT,eAAA,CAAgB;AAAA,QACd,OAAA,EAAS,KAAK,WAAA,CAAY,OAAA;AAAA,QAC1B,kBAAA,EAAoB,uBAAA,CAAwB,IAAA,CAAK,WAAA,EAAa,KAAK,WAAW,CAAA;AAAA,QAC9E,KAAA;AAAA,QACA,iBAAA,EAAmB,KAAK,WAAA,CAAY;AAAA,OACrC;AAAA,KACH;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,QAAA,EAAwC;AACxD,IAAA,IAAI,CAAC,IAAA,CAAK,qBAAA,EAAsB,EAAG;AACjC,MAAA,IAAA,CAAK,oCAAoC,EAAE,IAAA,EAAM,YAAY,OAAA,EAAS,IAAA,CAAK,SAAS,CAAA;AACpF,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,CAAK,kBAAA;AAAA,MACT,kBAAA,CAAmB;AAAA,QACjB,OAAA,EAAS,KAAK,WAAA,CAAY,OAAA;AAAA,QAC1B,kBAAA,EAAoB,uBAAA,CAAwB,IAAA,CAAK,WAAA,EAAa,KAAK,WAAW,CAAA;AAAA,QAC9E,QAAA;AAAA,QACA,iBAAA,EAAmB,KAAK,WAAA,CAAY;AAAA,OACrC;AAAA,KACH;AAAA,EACF;AACF,CAAA;AAEA,SAAS,aAAa,KAAA,EAA6C;AACjE,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AACtD,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,KAAQ,CAAC,KAAK,YAAA,IAAgB,CAAC,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,YAAY,CAAC,CAAA,IAAK,MAAM,CAAC,CAAA;AAC7F;AAEO,SAAS,qBAAqB,IAAA,EAKZ;AACvB,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA,iBAAA;AAAA,IACA,uBAAuB,MAAM,IAAA;AAAA,IAC7B,qCAAqC,MAAM;AAAA,IAAC;AAAA,GAC9C,GAAI,IAAA;AACJ,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,KAAA,CAAM,KAAK,CAAA;AAEzC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,aAAA,GAAgB,MAAM,KAAA,CAAM,GAAA;AAAA,IAChC,CAAA,GAAA,KACE,IAAI,gBAAA,CAAiB;AAAA,MACnB,GAAA;AAAA,MACA,QAAA;AAAA,MACA,iBAAA;AAAA,MACA,oBAAA;AAAA,MACA;AAAA,KACD;AAAA,GACL;AACA,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,CAAA,IAAA,KAAQ,CAAC,IAAA,CAAK,EAAA,EAAI,IAAI,CAAC,CAAC,CAAA;AAElE,EAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACxB,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,YAAY,CAAA;AAC5C,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,MAAA,CAAO,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,EAC3B;AAEA,EAAA,MAAM,gBAAA,GAAmB,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA;AACpD,EAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAI,iBAAA,CAAkB;AAAA,IAC3B,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,QAAA,EAAU,gBAAA;AAAA,IACV,UAAA,EAAY,QAAA;AAAA,IACZ,KAAA,EAAO,aAAA;AAAA,IACP,iBAAA;AAAA,IACA,oBAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH;;;ACpaO,IAAM,wBAAN,MAA4B;AAAA,EACjC,UAAA,uBAAiB,GAAA,EAAmC;AAAA,EACpD,gBAAA;AAAA,EACA,eAAA;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,CAAS,IAAA,EAAc,QAAA,EAAiC,SAAA,GAAY,KAAA,EAAa;AAC/E,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,IAAI,CAAA,oBAAA,CAAsB,CAAA;AAAA,IACjE;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAA,EAAM,QAAQ,CAAA;AAGlC,IAAA,IAAI,SAAA,IAAa,CAAC,IAAA,CAAK,gBAAA,EAAkB;AACvC,MAAA,IAAA,CAAK,gBAAA,GAAmB,QAAA;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAA,EAAiD;AACnD,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAgD;AAC9C,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,QAAA,EAAgC;AAC1C,IAAA,IAAA,CAAK,eAAA,GAAkB,QAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,OAAA,EAAmE;AAE7E,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,OAAA,EAAS,KAAK,UAAU,CAAA;AAC9D,MAAA,IAAI,QAAA,IAAY,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC7C,QAAA,OAAO,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA;AAAA,MACrC;AAAA,IACF;AAGA,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,IAAA,EAAuB;AAChC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA;AACzC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,IAAI,CAAA;AAE3C,IAAA,IAAI,OAAA,IAAW,QAAA,KAAa,IAAA,CAAK,gBAAA,EAAkB;AACjD,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,IAAA,EAAK;AAC3C,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA,CAAK,IAAA,GAAO,MAAA,GAAY,IAAA,CAAK,KAAA;AAAA,IACvD;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,GAA0B;AAC9B,IAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,CAAA,QAAA,KAAY,QAAA,CAAS,QAAA,EAAU,CAAA;AAEjG,IAAA,MAAM,OAAA,CAAQ,WAAW,gBAAgB,CAAA;AACzC,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,IAAA,IAAA,CAAK,gBAAA,GAAmB,MAAA;AACxB,IAAA,IAAA,CAAK,eAAA,GAAkB,MAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,IAAA,IAAA,CAAK,gBAAA,GAAmB,MAAA;AACxB,IAAA,IAAA,CAAK,eAAA,GAAkB,MAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAAmD;AACjD,IAAA,OAAO,IAAI,GAAA,CAAI,IAAA,CAAK,UAAU,CAAA;AAAA,EAChC;AACF,CAAA;;;ACvEO,IAAM,sBAAN,MAAyD;AAAA,EAC9D,IAAA,GAAO,uBAAA;AAAA,EACC,eAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EAER,WAAA,CAAY,OAAA,GAAsC,EAAC,EAAG;AACpD,IAAA,IAAA,CAAK,eAAA,GAAA,CACH,QAAQ,eAAA,IAAmB;AAAA,MACzB,UAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA;AAAA,MACA,eAAA;AAAA,MACA,QAAA;AAAA,MACA,aAAA;AAAA,MACA,KAAA;AAAA,MACA,YAAA;AAAA,MACA,cAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,OAEF,GAAA,CAAI,CAAA,CAAA,KAAK,IAAA,CAAK,YAAA,CAAa,CAAC,CAAC,CAAA;AAE/B,IAAA,IAAA,CAAK,cAAA,GAAiB,QAAQ,cAAA,IAAkB,YAAA;AAChD,IAAA,IAAA,CAAK,cAAA,GAAiB,QAAQ,cAAA,IAAkB,MAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QAAQ,IAAA,EAAwB;AAC9B,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,UAAU,CAAA;AAChD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,QAAQ,CAAA;AAC5C,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA;AACtC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,MAAM,CAAA;AACxC,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,SAAS,CAAA;AAC9C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,UAAA,CAAW,GAAA,EAAU,IAAA,mBAAO,IAAI,SAAQ,EAAQ;AACtD,IAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,OAAO,GAAA,KAAQ,QAAA,EAAU;AAE3C,MAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAE3B,QAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AACzB,QAAA,IAAI,QAAQ,UAAA,CAAW,GAAG,KAAK,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AACtD,UAAA,OAAO,IAAA,CAAK,iBAAiB,GAAG,CAAA;AAAA,QAClC;AAAA,MACF;AACA,MAAA,OAAO,GAAA;AAAA,IACT;AAEA,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACjB,MAAA,OAAO,sBAAA;AAAA,IACT;AACA,IAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AAIZ,IAAA,IAAI,eAAe,IAAA,EAAM;AACvB,MAAA,OAAO,GAAA;AAAA,IACT;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,MAAA,OAAO,IAAI,GAAA,CAAI,CAAA,IAAA,KAAQ,KAAK,UAAA,CAAW,IAAA,EAAM,IAAI,CAAC,CAAA;AAAA,IACpD;AAEA,IAAA,MAAM,WAAgB,EAAC;AACvB,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AAClC,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,GAAG,CAAA;AAErC,MAAA,IAAI,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA,EAAG;AAC7B,QAAA,IAAI,IAAI,GAAG,CAAA,IAAK,OAAO,GAAA,CAAI,GAAG,MAAM,QAAA,EAAU;AAC5C,UAAA,QAAA,CAAS,GAAG,CAAA,GAAI,IAAA,CAAK,WAAW,GAAA,CAAI,GAAG,GAAG,IAAI,CAAA;AAAA,QAChD,CAAA,MAAO;AACL,UAAA,QAAA,CAAS,GAAG,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,QAC3C;AAAA,MACF,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,GAAG,CAAA,GAAI,IAAA,CAAK,WAAW,GAAA,CAAI,GAAG,GAAG,IAAI,CAAA;AAAA,MAChD;AAAA,IACF;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,UAAU,KAAA,EAAiB;AACjC,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,WAAW,KAAK,CAAA;AAAA,IAC9B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAE,KAAA,EAAO,EAAE,SAAA,EAAW,IAAA,CAAK,MAAK,EAAE;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,aAAa,GAAA,EAAqB;AACxC,IAAA,OAAO,GAAA,CAAI,WAAA,EAAY,CAAE,OAAA,CAAQ,cAAc,EAAE,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWQ,YAAY,aAAA,EAAgC;AAClD,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,CAAA,cAAA,KAAkB;AAEjD,MAAA,OAAO,aAAA,KAAkB,cAAA;AAAA,IAC3B,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAAiB,GAAA,EAAqB;AAC5C,IAAA,IAAI;AAEF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAG7B,MAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACxC,QAAA,MAAM,WAAW,IAAA,CAAK,UAAA,CAAW,MAAA,kBAAQ,IAAI,SAAS,CAAA;AACtD,QAAA,OAAO,IAAA,CAAK,UAAU,QAAQ,CAAA;AAAA,MAChC;AAGA,MAAA,OAAO,GAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AAEN,MAAA,OAAO,GAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,YAAY,KAAA,EAAoB;AACtC,IAAA,IAAI,IAAA,CAAK,mBAAmB,MAAA,EAAQ;AAClC,MAAA,OAAO,IAAA,CAAK,cAAA;AAAA,IACd;AAEA,IAAA,MAAM,GAAA,GAAM,OAAO,KAAK,CAAA;AACxB,IAAA,MAAM,MAAM,GAAA,CAAI,MAAA;AAChB,IAAA,IAAI,OAAO,CAAA,EAAG;AACZ,MAAA,OAAO,IAAA,CAAK,cAAA;AAAA,IACd;AACA,IAAA,OAAO,GAAA,CAAI,MAAM,CAAA,EAAG,CAAC,IAAI,QAAA,GAAM,GAAA,CAAI,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA;AAAA,EAClD;AAAA,EAEA,MAAM,QAAA,GAA0B;AAAA,EAEhC;AACF;;;ACrLA,SAAS,WACP,GAAA,EAC8B;AAC9B,EAAA,OAAO,GAAA,YAAe,yBAAA;AACxB;AAMO,IAAM,aAAA,GAAN,cAA4BN,eAAAA,CAA8C;AAAA,EAC/E,SAAA,GAAY,IAAI,qBAAA,EAAsB;AAAA,EACtC,OAAA;AAAA,EACA,yBAAA;AAAA,EAEA,YAAY,MAAA,EAAqC;AAC/C,IAAA,KAAA,CAAM;AAAA,MACJ,WAAWC,uBAAAA,CAAiB,aAAA;AAAA,MAC5B,IAAA,EAAM;AAAA,KACP,CAAA;AAED,IAAA,IAAI,WAAW,MAAA,EAAW;AACxB,MAAA,MAAA,GAAS,EAAC;AAAA,IACZ;AAGA,IAAA,MAAM,gBAAA,GAAmB,iCAAA,CAAkC,SAAA,CAAU,MAAM,CAAA;AAC3E,IAAA,IAAI,CAAC,iBAAiB,OAAA,EAAS;AAC7B,MAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,KAAA,CAAM,MAAA,CAC1C,GAAA;AAAA,QACC,CAAC,GAAA,KACC,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,IAAK,QAAQ,CAAA,EAAA,EAAK,GAAA,CAAI,OAAO,CAAA;AAAA,OACrD,CACC,KAAK,IAAI,CAAA;AACZ,MAAA,MAAM,IAAIe,iBAAAA,CAAY;AAAA,QACpB,EAAA,EAAI,8BAAA;AAAA,QACJ,IAAA,EAAM,wCAAwC,aAAa,CAAA,CAAA;AAAA,QAC3D,QAAQQ,iBAAAA,CAAY,oBAAA;AAAA,QACpB,UAAUC,mBAAAA,CAAc,IAAA;AAAA,QACxB,OAAA,EAAS;AAAA,UACP,gBAAA,EAAkB;AAAA;AACpB,OACD,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,KAAA,MAAW,CAAC,MAAM,WAAW,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,EAAG;AAChE,QAAA,IAAI,CAAC,UAAA,CAAW,WAAW,CAAA,EAAG;AAC5B,UAAA,MAAM,gBAAA,GAAmB,8BAAA,CAA+B,SAAA,CAAU,WAAW,CAAA;AAC7E,UAAA,IAAI,CAAC,iBAAiB,OAAA,EAAS;AAC7B,YAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,KAAA,CAAM,MAAA,CAC1C,GAAA;AAAA,cACC,CAAC,GAAA,KACC,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,KAAK,GAAG,CAAC,CAAA,EAAA,EAAK,GAAA,CAAI,OAAO,CAAA;AAAA,aACzC,CACC,KAAK,IAAI,CAAA;AACZ,YAAA,MAAM,IAAIT,iBAAAA,CAAY;AAAA,cACpB,EAAA,EAAI,uCAAA;AAAA,cACJ,IAAA,EAAM,CAAA,kDAAA,EAAqD,IAAI,CAAA,GAAA,EAAM,aAAa,CAAA,CAAA;AAAA,cAClF,QAAQQ,iBAAAA,CAAY,oBAAA;AAAA,cACpB,UAAUC,mBAAAA,CAAc,IAAA;AAAA,cACxB,OAAA,EAAS;AAAA,gBACP,YAAA,EAAc,IAAA;AAAA,gBACd,gBAAA,EAAkB;AAAA;AACpB,aACD,CAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,0BAAA,GAA6B,OAAO,mBAAA,IAAuB,IAAA;AACjE,IAAA,MAAM,iCAAiC,0BAAA,KAA+B,KAAA;AACtE,IAAA,MAAM,6BACJ,OAAO,0BAAA,KAA+B,QAAA,IAAY,0BAAA,KAA+B,OAC7E,0BAAA,GACA,MAAA;AAEN,IAAA,MAAM,2BAA2B,MAAuC;AACtE,MAAA,IAAI,CAAC,8BAAA,EAAgC;AACnC,QAAA,OAAO,MAAA;AAAA,MACT;AACA,MAAA,OAAO,IAAI,oBAAoB,0BAA0B,CAAA;AAAA,IAC3D,CAAA;AAGA,IAAA,IAAI,MAAA,CAAO,SAAS,OAAA,EAAS;AAC3B,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN;AAAA,OAIF;AAEA,MAAA,MAAM,aAAa,wBAAA,EAAyB;AAC5C,MAAA,MAAM,eAAA,GAAkB,IAAI,4BAAA,CAA6B;AAAA,QACvD,WAAA,EAAa,QAAA;AAAA,QACb,IAAA,EAAM,SAAA;AAAA,QACN,QAAA,EAAU,EAAE,IAAA,EAAA,QAAA,eAAkC;AAAA,QAC9C,WAAW,CAAC,IAAI,uBAAsB,EAAG,IAAI,wBAAwB,CAAA;AAAA,QACrE,oBAAA,EAAsB,UAAA,GAAa,CAAC,UAAU,IAAI;AAAC,OACpD,CAAA;AAGD,MAAA,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,SAAA,EAAW,eAAA,EAAiB,IAAI,CAAA;AAAA,IAC1D;AAEA,IAAA,IAAI,OAAO,OAAA,EAAS;AAElB,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA;AAE/C,MAAA,SAAA,CAAU,QAAQ,CAAC,CAAC,IAAA,EAAM,UAAU,GAAG,KAAA,KAAU;AAC/C,QAAA,IAAI,QAAA;AACJ,QAAA,IAAI,UAAA,CAAW,UAAU,CAAA,EAAG;AAI1B,UAAA,QAAA,GAAW,UAAA;AACX,UAAA,IAAI,8BAAA,EAAgC;AAClC,YAAA,MAAM,UAAA,GAAa,QAAA,CAAS,uBAAA,IAA0B,IAAK,EAAC;AAC5D,YAAA,MAAM,SAAA,GAAY,UAAA,CAAW,IAAA,CAAK,CAAA,CAAA,KAAK,aAAa,mBAAmB,CAAA;AACvE,YAAA,IAAI,CAAC,SAAA,EAAW;AACd,cAAA,IAAA,CAAK,MAAA,EAAQ,IAAA;AAAA,gBACX,qRAAA;AAAA,gBAGA,EAAE,cAAc,IAAA;AAAK,eACvB;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAA,MAAO;AACL,UAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,oBAAA,IAAwB,EAAC;AAC3D,UAAA,MAAM,SAAA,GAAY,cAAA,CAAe,IAAA,CAAK,CAAA,CAAA,KAAK,aAAa,mBAAmB,CAAA;AAC3E,UAAA,MAAM,UAAA,GAAa,CAAC,SAAA,GAAY,wBAAA,EAAyB,GAAI,MAAA;AAI7D,UAAA,MAAM,uBAAuB,UAAA,GAAa,CAAC,GAAG,cAAA,EAAgB,UAAU,CAAA,GAAI,cAAA;AAC5E,UAAA,QAAA,GAAW,IAAI,4BAAA,CAA6B;AAAA,YAC1C,GAAG,UAAA;AAAA,YACH,IAAA;AAAA,YACA;AAAA,WACD,CAAA;AAAA,QACH;AAGA,QAAA,MAAM,SAAA,GAAY,CAAC,MAAA,CAAO,OAAA,EAAS,WAAW,KAAA,KAAU,CAAA;AACxD,QAAA,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,IAAA,EAAM,QAAA,EAAU,SAAS,CAAA;AAAA,MACnD,CAAC,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,MAAA,IAAA,CAAK,SAAA,CAAU,WAAA,CAAY,MAAA,CAAO,cAAc,CAAA;AAAA,IAClD;AAAA,EACF;AAAA;AAAA,EAGA,iBAAiB,OAAA,EAAmC;AAClD,IAAA,MAAM,SAAA,GAAY,KAAK,aAAA,EAAc;AACrC,IAAA,MAAM,EAAE,QAAO,GAAI,OAAA;AACnB,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAEf,IAAA,MAAM,iBAAA,GAAoB,OAAO,cAAA,IAAiB;AAElD,IAAA,SAAA,CAAU,QAAQ,CAAA,QAAA,KAAY;AAG5B,MAAA,QAAA,CAAS,yBAAyB,iBAAiB,CAAA;AAEnD,MAAA,MAAM,MAAA,GAAS,SAAS,SAAA,EAAU;AAClC,MAAA,MAAM,SAAA,GAAY,SAAS,YAAA,EAAa;AACxC,MAAA,MAAM,aAAA,GACJ,QAAA,YAAoB,yBAAA,GAChB,CAAC,KAAA,KAAkC,SAAS,mBAAA,EAAoB,CAAE,aAAA,CAAc,KAAK,CAAA,GACrF,MAAA;AACN,MAAA,SAAA,CAAU,QAAQ,CAAA,QAAA,KAAY;AAE5B,QAAA,IAAI,MAAA,IAAU,QAAA,IAAY,OAAO,QAAA,CAAS,SAAS,UAAA,EAAY;AAC7D,UAAA,IAAI;AACF,YAAA,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAA,EAAQ,eAAe,CAAA;AAAA,UACjD,SAAS,KAAA,EAAO;AACd,YAAA,IAAA,CAAK,MAAA,EAAQ,KAAK,6CAAA,EAA+C;AAAA,cAC/D,cAAc,QAAA,CAAS,IAAA;AAAA,cACvB,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,aAC7D,CAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,UAAU,OAAA,EAA0C;AAClD,IAAA,KAAA,CAAM,WAAA,CAAY,QAAQ,MAAM,CAAA;AAChC,IAAA,IAAA,CAAK,aAAA,EAAc,CAAE,OAAA,CAAQ,CAAA,QAAA,KAAY;AACvC,MAAA,QAAA,CAAS,WAAA,CAAY,QAAQ,MAAM,CAAA;AAAA,IACrC,CAAC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,oBAAoB,OAAA,EAAmE;AACrF,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,WAAA,CAAY,OAAO,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,iBAAiB,IAAA,EAA0D;AAC/E,IAAA,MAAM,oBAAA,GAAuB,MAAM,IAAA,CAAK,wBAAA,EAAyB;AACjE,IAAA,IAAI,CAAC,oBAAA,EAAsB;AACzB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAM,oBAAA,CAAqB,QAAA,CAAS,EAAE,OAAA,EAAS,IAAA,CAAK,SAAS,CAAA;AAC3E,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,oBAAA,CAAqB;AAAA,MAC1B,KAAA;AAAA,MACA,iBAAA,EAAmB,CAAA,KAAA,KAAS,IAAA,CAAK,kBAAA,CAAmB,KAAK,CAAA;AAAA,MACzD,oBAAA,EAAsB,MAAM,CAAC,CAAC,KAAK,yBAAA,EAA0B;AAAA,MAC7D,oCAAoC,CAAC,EAAE,IAAA,EAAM,OAAA,EAAS,QAAO,KAAM;AACjE,QAAA,IAAA,CAAK,MAAA,EAAQ,KAAA;AAAA,UACX,IAAA,KAAS,UACL,0EAAA,GACA,gFAAA;AAAA,UACJ;AAAA,YACE,OAAA;AAAA,YACA;AAAA;AACF,SACF;AAAA,MACF;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,SAAS,IAAA,EAKG;AAChB,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,kBAAA,EAAoB,OAAA;AAC/D,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,kBAAA,EAAoB,MAAA;AAE7D,IAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,MAAA,MAAM,IAAA,CAAK,kBAAA;AAAA,QACT,eAAA,CAAgB;AAAA,UACd,GAAI,aAAA,GAAgB,EAAE,OAAA,EAAS,aAAA,KAAkB,EAAC;AAAA,UAClD,GAAI,YAAA,GAAe,EAAE,MAAA,EAAQ,YAAA,KAAiB,EAAC;AAAA,UAC/C,oBAAoB,IAAA,CAAK,kBAAA;AAAA,UACzB,OAAO,IAAA,CAAK;AAAA,SACb;AAAA,OACH;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,eAAA,CAAgB,KAAK,OAAO,CAAA;AACrD,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAQ,gCAAA,CAAiC;AAAA,MAC7C,KAAA;AAAA,MACA,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AAED,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,YAAY,IAAA,EAKA;AAChB,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,kBAAA,EAAoB,OAAA;AAC/D,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,kBAAA,EAAoB,MAAA;AAE7D,IAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,MAAA,MAAM,IAAA,CAAK,kBAAA;AAAA,QACT,kBAAA,CAAmB;AAAA,UACjB,GAAI,aAAA,GAAgB,EAAE,OAAA,EAAS,aAAA,KAAkB,EAAC;AAAA,UAClD,GAAI,YAAA,GAAe,EAAE,MAAA,EAAQ,YAAA,KAAiB,EAAC;AAAA,UAC/C,oBAAoB,IAAA,CAAK,kBAAA;AAAA,UACzB,UAAU,IAAA,CAAK;AAAA,SAChB;AAAA,OACH;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,eAAA,CAAgB,KAAK,OAAO,CAAA;AACrD,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAQ,mCAAA,CAAoC;AAAA,MAChD,KAAA;AAAA,MACA,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,UAAU,IAAA,CAAK;AAAA,KAChB,CAAA;AAED,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAAA,EACrC;AAAA;AAAA,EAGA,gBAAA,CAAiB,IAAA,EAAc,QAAA,EAAiC,SAAA,GAAY,KAAA,EAAa;AACvF,IAAA,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,IAAA,EAAM,QAAA,EAAU,SAAS,CAAA;AAKjD,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,QAAA,CAAS,sBAAA,GAAyB,IAAA,CAAK,OAAA,CAAQ,cAAA,IAAkB,CAAA;AAAA,IACnE;AAAA,EACF;AAAA;AAAA,EAGA,YAAY,IAAA,EAAiD;AAC3D,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA;AAAA,EAChC;AAAA;AAAA,EAGA,kBAAA,GAAwD;AACtD,IAAA,OAAO,IAAA,CAAK,UAAU,UAAA,EAAW;AAAA,EACnC;AAAA;AAAA,EAGA,aAAA,GAA4D;AAC1D,IAAA,OAAO,IAAA,CAAK,UAAU,IAAA,EAAK;AAAA,EAC7B;AAAA;AAAA,EAGA,mBAAmB,IAAA,EAAuB;AACxC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,UAAA,CAAW,IAAI,CAAA;AAAA,EACvC;AAAA;AAAA,EAGA,YAAY,IAAA,EAAuB;AACjC,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,SAAA,CAAU,IAAI,IAAI,CAAA;AAAA,EAClC;AAAA;AAAA,EAGA,kBAAkB,QAAA,EAAgC;AAChD,IAAA,IAAA,CAAK,SAAA,CAAU,YAAY,QAAQ,CAAA;AAAA,EACrC;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,EACvB;AAAA;AAAA,EAGA,MAAM,QAAA,GAA0B;AAC9B,IAAA,MAAM,IAAA,CAAK,UAAU,QAAA,EAAS;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,2BAAA,GAAoE;AAClE,IAAA,IAAI,CAAC,KAAK,yBAAA,EAA2B;AACnC,MAAA,IAAA,CAAK,4BAA4B,8BAAA,CAA+B;AAAA,QAC9D,eAAA,EAAiB,MAAM,IAAA,CAAK,kBAAA,EAAmB;AAAA,QAC/C,QAAQ,IAAA,CAAK;AAAA,OACd,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA,CAAK,yBAAA;AAAA,EACd;AAAA,EAEA,MAAM,wBAAA,GAAiE;AACrE,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,EAAS,UAAA,EAAW;AACzC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAQ,MAAM,OAAA,CAAQ,QAAA,CAAS,eAAe,CAAA,IAAM,IAAA;AAAA,EACtD;AAAA,EAEA,MAAM,gBAAgB,OAAA,EAAiB;AACrC,IAAA,MAAM,oBAAA,GAAuB,MAAM,IAAA,CAAK,wBAAA,EAAyB;AACjE,IAAA,IAAI,CAAC,oBAAA,EAAsB;AACzB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,oBAAA,CAAqB,QAAA,CAAS,EAAE,OAAA,EAAS,CAAA;AAAA,EAClD;AAAA,EAEA,yBAAA,GAA+D;AAC7D,IAAA,OAAO,IAAA,CAAK,kBAAA,EAAmB,IAAK,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,aAAA,EAAc,CAAE,MAAA,EAAQ,CAAA,CAAE,CAAC,CAAA;AAAA,EACjF;AAAA,EAEA,MAAM,mBAAmB,KAAA,EAAkD;AACzE,IAAA,MAAM,QAAA,GAAW,KAAK,yBAAA,EAA0B;AAChD,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,IAAA,CAAK,MAAA,EAAQ,KAAA;AAAA,QACX,KAAA,CAAM,IAAA,KAAS,OAAA,GACX,yEAAA,GACA,4EAAA;AAAA,QACJ,EAAE,SAAA,EAAW,KAAA,CAAM,IAAA;AAAK,OAC1B;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,oBAAoB,yBAAA,EAA2B;AACjD,MAAA,QAAA,CAAS,oBAAoB,KAAK,CAAA;AAClC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,SAAS,SAAA,EAAU;AAClC,IAAA,MAAM,cAAA,GAAiB;AAAA,MACrB,GAAG,QAAA,CAAS,YAAA,EAAa,CAAE,GAAA,CAAI,CAAA,QAAA,KAAY,cAAA,CAAe,QAAA,EAAU,KAAA,EAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,MACvF,GAAI,MAAA,GAAS,CAAC,cAAA,CAAe,MAAA,EAAQ,OAAO,IAAA,CAAK,MAAM,CAAC,CAAA,GAAI;AAAC,KAC/D,CAAE,MAAA,CAAO,CAAC,MAAA,KAAoC,CAAC,CAAC,MAAA,IAAU,OAAO,MAAA,CAAO,IAAA,KAAS,UAAU,CAAA;AAE3F,IAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,MAAA,MAAM,OAAA,CAAQ,WAAW,cAAc,CAAA;AAAA,IACzC;AAAA,EACF;AACF;;;AC5bO,IAAM,wCAA6C,IAAI,GAAA,CAAI,CAAC,sBAAA,EAAwB,uBAAuB,CAAC;;;ACV5G,SAAS,uBAAuB,QAAA,EAAmD;AACxF,EAAA,OAAO,QAAA,CAAS,OAAO,CAAC,IAAA,EAAM,YAAY,OAAA,CAAQ,IAAI,CAAA,EAAG,EAAoB,CAAA;AAC/E","file":"index.cjs","sourcesContent":["/**\n * Shared event routing logic for observability handlers (exporters and bridges).\n *\n * Both ObservabilityExporter and ObservabilityBridge implement the same optional\n * signal handlers (onTracingEvent, onLogEvent, onMetricEvent, onScoreEvent,\n * onFeedbackEvent). This module provides a single routing function used by both\n * the ObservabilityBus (for exporters) and BaseObservabilityInstance (for bridges).\n */\n\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport type {\n ObservabilityEvents,\n TracingEvent,\n LogEvent,\n MetricEvent,\n ScoreEvent,\n FeedbackEvent,\n ObservabilityEvent,\n ObservabilityDropEvent,\n} from '@mastra/core/observability';\nimport { TracingEventType } from '@mastra/core/observability';\n\n/**\n * Any handler that can receive routed observability events.\n * Both ObservabilityExporter and ObservabilityBridge extend\n * ObservabilityEvents, so this matches either.\n */\nexport type ObservabilityHandler = ObservabilityEvents & { name: string };\n\ntype LegacyScoreHandler = ObservabilityHandler & {\n addScoreToTrace?: (args: {\n traceId: string;\n spanId?: string;\n score: number;\n reason?: string;\n scorerName: string;\n metadata?: Record;\n }) => void | Promise;\n};\n\n/**\n * Route a single event to the appropriate method on a handler.\n *\n * For tracing events, prefers onTracingEvent when present and falls back\n * to exportTracingEvent. For all other signals, calls the corresponding\n * optional handler method if the handler implements it.\n *\n * Returns the handler promise (if async) so callers can track it for flush().\n * Async rejections are caught to prevent unhandled rejections.\n * Sync throws are caught so one failing handler doesn't break others.\n */\nexport function routeToHandler(\n handler: ObservabilityHandler,\n event: ObservabilityEvent,\n logger: IMastraLogger,\n): void | Promise {\n try {\n switch (event.type) {\n case TracingEventType.SPAN_STARTED:\n case TracingEventType.SPAN_UPDATED:\n case TracingEventType.SPAN_ENDED: {\n const fn = handler.onTracingEvent\n ? handler.onTracingEvent.bind(handler)\n : handler.exportTracingEvent.bind(handler);\n return catchAsyncResult(fn(event as TracingEvent), handler.name, 'tracing', logger);\n }\n\n case 'log':\n if (handler.onLogEvent) {\n return catchAsyncResult(handler.onLogEvent(event as LogEvent), handler.name, 'log', logger);\n }\n break;\n\n case 'metric':\n if (handler.onMetricEvent) {\n return catchAsyncResult(handler.onMetricEvent(event as MetricEvent), handler.name, 'metric', logger);\n }\n break;\n\n case 'score':\n if (handler.onScoreEvent) {\n return catchAsyncResult(handler.onScoreEvent(event as ScoreEvent), handler.name, 'score', logger);\n }\n if ((handler as LegacyScoreHandler).addScoreToTrace) {\n const score = (event as ScoreEvent).score;\n if (!score.traceId) break;\n return catchAsyncResult(\n (handler as LegacyScoreHandler).addScoreToTrace!({\n traceId: score.traceId,\n ...(score.spanId ? { spanId: score.spanId } : {}),\n score: score.score,\n ...(score.reason ? { reason: score.reason } : {}),\n scorerName: score.scorerName ?? score.scorerId,\n ...(score.metadata ? { metadata: score.metadata as Record } : {}),\n }),\n handler.name,\n 'score',\n logger,\n );\n }\n break;\n\n case 'feedback':\n if (handler.onFeedbackEvent) {\n return catchAsyncResult(handler.onFeedbackEvent(event as FeedbackEvent), handler.name, 'feedback', logger);\n }\n break;\n }\n } catch (err) {\n logger.error(`[Observability] Handler error [handler=${handler.name}]:`, err);\n }\n}\n\n/**\n * Route exporter pipeline drop events to a handler.\n *\n * Drop events are meta-events for alerting and health reporting, so they use a\n * dedicated hook instead of the normal observability signal router.\n */\nexport function routeDropToHandler(\n handler: ObservabilityHandler,\n event: ObservabilityDropEvent,\n logger: IMastraLogger,\n): void | Promise {\n try {\n if (handler.onDroppedEvent) {\n return catchAsyncResult(handler.onDroppedEvent(event), handler.name, 'drop', logger);\n }\n } catch (err) {\n logger.error(`[Observability] Handler error [handler=${handler.name}]:`, err);\n }\n}\n\n/**\n * Catch rejected promises from async handlers and return the tracked promise.\n * The returned promise always resolves (never rejects) — errors are logged.\n */\nfunction catchAsyncResult(\n result: void | Promise,\n handlerName: string,\n signal: string,\n logger: IMastraLogger,\n): void | Promise {\n if (result && typeof (result as Promise).then === 'function') {\n return (result as Promise).catch(err => {\n logger.error(`[Observability] ${signal} handler error [handler=${handlerName}]:`, err);\n });\n }\n}\n","/**\n * BaseObservabilityEventBus - Generic event bus for observability events.\n *\n * Provides a synchronous pub/sub mechanism:\n * - Events are dispatched to subscribers immediately on emit()\n * - Graceful error handling (handler errors don't break other handlers)\n * - flush() awaits any in-flight async subscriber promises\n * - Clean shutdown flushes then clears subscribers\n *\n * Buffering/batching is intentionally NOT done here — individual exporters\n * own their own batching strategy.\n */\n\nimport { MastraBase } from '@mastra/core/base';\nimport { RegisteredLogger } from '@mastra/core/logger';\nimport type { ObservabilityEventBus } from '@mastra/core/observability';\n\nexport class BaseObservabilityEventBus extends MastraBase implements ObservabilityEventBus {\n private subscribers: Set<(event: TEvent) => void> = new Set();\n\n /** In-flight async subscriber promises. Self-cleaning via .finally(). */\n private pendingSubscribers: Set> = new Set();\n\n constructor({ name }: { name?: string } = {}) {\n super({ component: RegisteredLogger.OBSERVABILITY, name: name ?? 'EventBus' });\n }\n\n /**\n * Dispatch an event to all subscribers synchronously.\n * Async handler promises are tracked internally and drained by {@link flush}.\n *\n * @param event - The event to broadcast to subscribers.\n */\n emit(event: TEvent): void {\n for (const handler of this.subscribers) {\n try {\n // Handler is typed as () => void, but at runtime an async fn returns a Promise.\n // Defensively catch rejected promises so they don't become unhandled rejections.\n const result: unknown = handler(event);\n if (result && typeof (result as Promise).then === 'function') {\n const promise = (result as Promise).catch(err => {\n this.logger.error('[ObservabilityEventBus] Handler error:', err);\n });\n this.pendingSubscribers.add(promise);\n void promise.finally(() => this.pendingSubscribers.delete(promise));\n }\n } catch (err) {\n this.logger.error('[ObservabilityEventBus] Handler error:', err);\n }\n }\n }\n\n /**\n * Register a handler to receive future events.\n *\n * @param handler - Callback invoked synchronously on each {@link emit}.\n * @returns An unsubscribe function that removes the handler.\n */\n subscribe(handler: (event: TEvent) => void): () => void {\n this.subscribers.add(handler);\n return () => {\n this.subscribers.delete(handler);\n };\n }\n\n /** Max flush drain iterations before bailing — prevents infinite loops when handlers re-emit. */\n private static readonly MAX_FLUSH_ITERATIONS = 3;\n\n /** Await all in-flight async subscriber promises, draining until empty. */\n async flush(): Promise {\n let iterations = 0;\n while (this.pendingSubscribers.size > 0) {\n await Promise.allSettled([...this.pendingSubscribers]);\n iterations++;\n if (iterations >= BaseObservabilityEventBus.MAX_FLUSH_ITERATIONS) {\n this.logger.error(\n `[ObservabilityEventBus] flush() exceeded ${BaseObservabilityEventBus.MAX_FLUSH_ITERATIONS} drain iterations — ` +\n `${this.pendingSubscribers.size} promises still pending. Handlers may be re-emitting during flush.`,\n );\n break;\n }\n }\n }\n\n /** Flush pending promises, then clear all subscribers. */\n async shutdown(): Promise {\n await this.flush();\n this.subscribers.clear();\n }\n}\n","/**\n * Bounded serialization utilities for AI tracing.\n *\n * These utilities prevent memory issues by enforcing strict limits on\n * string lengths, array sizes, object depths, and total output size.\n * They are designed to be used across all tracing/telemetry systems.\n *\n * ## Custom Span Serialization\n *\n * Classes can implement a `serializeForSpan()` method to provide a custom\n * representation when serialized for tracing spans. This is useful for:\n * - Excluding internal state and implementation details\n * - Removing functions and circular references\n * - Providing a clean, readable representation for observability\n *\n * @example\n * ```typescript\n * class MyClass {\n * private internalState = new Map();\n * public data: string[];\n *\n * serializeForSpan() {\n * return { data: this.data };\n * }\n * }\n * ```\n */\n\n/**\n * Default keys to strip from objects during deep cleaning.\n * These are typically internal/sensitive fields that shouldn't be traced.\n */\nexport const DEFAULT_KEYS_TO_STRIP = new Set([\n 'logger',\n 'experimental_providerMetadata',\n 'providerMetadata',\n 'steps',\n 'tracingContext',\n 'execute', // Tool execute functions\n 'validate', // Schema validate functions\n]);\n\nexport interface DeepCleanOptions {\n keysToStrip: Set | string[] | Record;\n maxDepth: number;\n maxStringLength: number;\n maxArrayLength: number;\n maxObjectKeys: number;\n}\n\nexport const DEFAULT_DEEP_CLEAN_OPTIONS: DeepCleanOptions = Object.freeze({\n keysToStrip: DEFAULT_KEYS_TO_STRIP,\n maxDepth: 8,\n maxStringLength: 128 * 1024, // 128KB - sufficient for large LLM prompts/responses\n maxArrayLength: 50,\n maxObjectKeys: 50,\n});\n\n/**\n * Merge user-provided serialization options with defaults.\n * Returns a complete DeepCleanOptions object.\n */\nexport function mergeSerializationOptions(userOptions?: {\n maxStringLength?: number;\n maxDepth?: number;\n maxArrayLength?: number;\n maxObjectKeys?: number;\n}): DeepCleanOptions {\n if (!userOptions) {\n return DEFAULT_DEEP_CLEAN_OPTIONS;\n }\n return {\n keysToStrip: DEFAULT_KEYS_TO_STRIP,\n maxDepth: userOptions.maxDepth ?? DEFAULT_DEEP_CLEAN_OPTIONS.maxDepth,\n maxStringLength: userOptions.maxStringLength ?? DEFAULT_DEEP_CLEAN_OPTIONS.maxStringLength,\n maxArrayLength: userOptions.maxArrayLength ?? DEFAULT_DEEP_CLEAN_OPTIONS.maxArrayLength,\n maxObjectKeys: userOptions.maxObjectKeys ?? DEFAULT_DEEP_CLEAN_OPTIONS.maxObjectKeys,\n };\n}\n\n/**\n * Hard-cap any string to prevent unbounded growth.\n */\nexport function truncateString(s: string, maxChars: number): string {\n if (s.length <= maxChars) {\n return s;\n }\n\n return s.slice(0, maxChars) + '…[truncated]';\n}\n\nexport type SerializedMapEntry = [keyType: string, key: any, value: any];\n\nexport interface SerializedMap {\n __type: 'Map';\n __map_entries: SerializedMapEntry[];\n __truncated?: string;\n}\n\nfunction formatSerializationError(error: unknown): string {\n return `[${error instanceof Error ? truncateString(error.message, 256) : 'unknown error'}]`;\n}\n\nfunction getMapKeyType(key: unknown): string {\n if (key === null) {\n return 'null';\n }\n if (key instanceof Date) {\n return 'date';\n }\n if (Array.isArray(key)) {\n return 'array';\n }\n if (key instanceof Map) {\n return 'map';\n }\n if (key instanceof Set) {\n return 'set';\n }\n if (key instanceof Error) {\n return 'error';\n }\n\n return typeof key;\n}\n\nfunction restoreSerializedMapKey(keyType: string, key: any): unknown {\n switch (keyType) {\n case 'undefined':\n return undefined;\n case 'null':\n return null;\n case 'bigint':\n return typeof key === 'string' && key.endsWith('n') ? BigInt(key.slice(0, -1)) : key;\n case 'date':\n return typeof key === 'string' ? new Date(key) : key;\n default:\n return key;\n }\n}\n\nexport function isSerializedMap(value: unknown): value is SerializedMap {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as SerializedMap).__type === 'Map' &&\n Array.isArray((value as SerializedMap).__map_entries)\n );\n}\n\nexport function reconstructSerializedMap(value: SerializedMap): Map {\n return new Map(\n value.__map_entries.map(([keyType, key, mapValue]) => [restoreSerializedMapKey(keyType, key), mapValue]),\n );\n}\n\n/**\n * Detect if an object is a JSON Schema.\n * Looks for typical JSON Schema markers like $schema, type with properties, etc.\n */\nfunction isJsonSchema(val: any): boolean {\n if (typeof val !== 'object' || val === null) return false;\n\n // Has explicit $schema property\n if (val.$schema && typeof val.$schema === 'string' && val.$schema.includes('json-schema')) {\n return true;\n }\n\n // Has type: \"object\" with properties (common pattern)\n if (val.type === 'object' && val.properties && typeof val.properties === 'object') {\n return true;\n }\n\n return false;\n}\n\n/**\n * Recursively cleans a value by removing circular references, stripping problematic keys,\n * and enforcing size limits on strings, arrays, and objects.\n *\n * This is used by AI tracing spans to sanitize input/output data before storing.\n *\n * @param value - The value to clean (object, array, primitive, etc.)\n * @param options - Optional configuration for cleaning behavior\n * @returns A cleaned version of the input with size limits enforced\n */\nexport function deepClean(value: any, options: DeepCleanOptions = DEFAULT_DEEP_CLEAN_OPTIONS): any {\n const { keysToStrip, maxDepth, maxStringLength, maxArrayLength, maxObjectKeys } = options;\n\n // Normalize to a Set once so lookups are always O(1).\n // Bundlers can transform `new Set([...])` into a plain object or array,\n // so we accept all three forms and coerce up front.\n const stripSet =\n keysToStrip instanceof Set\n ? keysToStrip\n : new Set(Array.isArray(keysToStrip) ? keysToStrip : Object.keys(keysToStrip));\n\n // Track objects on the current ancestor path to detect true circular\n // references (A → B → A) without false-flagging shared references\n // (A → X, B → X). A shared (non-circular) reference is simply\n // serialized again in each location where it appears.\n const ancestors = new WeakSet();\n\n function helper(val: any, depth: number): any {\n if (depth > maxDepth) {\n return '[MaxDepth]';\n }\n\n // Handle primitives\n if (val === null || val === undefined) {\n return val;\n }\n\n // Handle strings - enforce length limit\n if (typeof val === 'string') {\n return truncateString(val, maxStringLength);\n }\n\n // Handle other non-object primitives explicitly\n if (typeof val === 'number' || typeof val === 'boolean') {\n return val;\n }\n if (typeof val === 'bigint') {\n return `${val}n`;\n }\n if (typeof val === 'function') {\n return '[Function]';\n }\n if (typeof val === 'symbol') {\n return val.description ? `[Symbol(${val.description})]` : '[Symbol]';\n }\n\n // Handle Date objects - preserve as-is\n if (val instanceof Date) {\n return val;\n }\n\n // Handle circular references — only flag when the same object is an\n // ancestor of the current node (true cycle), not merely seen elsewhere.\n if (typeof val === 'object') {\n if (ancestors.has(val)) {\n return '[Circular]';\n }\n ancestors.add(val);\n }\n\n try {\n // Handle Errors specially - preserve name, message, stack, and cause.\n // Done inside the try so the ancestor set is cleaned up in finally,\n // which also means cycles via `cause` are caught.\n if (val instanceof Error) {\n let errorName: unknown;\n let errorMessage: unknown;\n let errorStack: unknown;\n let rawCause: unknown;\n let causeReadFailed = false;\n\n try {\n errorName = val.name;\n } catch (error) {\n errorName = formatSerializationError(error);\n }\n\n try {\n errorMessage = val.message;\n } catch (error) {\n errorMessage = formatSerializationError(error);\n }\n\n try {\n errorStack = val.stack;\n } catch (error) {\n errorStack = formatSerializationError(error);\n }\n\n try {\n rawCause = (val as any).cause;\n } catch (error) {\n causeReadFailed = true;\n rawCause = formatSerializationError(error);\n }\n\n const cleanedError: Record = {\n name: typeof errorName === 'string' ? truncateString(errorName, maxStringLength) : errorName,\n message: typeof errorMessage === 'string' ? truncateString(errorMessage, maxStringLength) : errorMessage,\n };\n if (typeof errorStack === 'string') {\n cleanedError.stack = truncateString(errorStack, maxStringLength);\n } else if (errorStack !== undefined) {\n cleanedError.stack = errorStack;\n }\n if (causeReadFailed) {\n cleanedError.cause = rawCause;\n } else if (rawCause !== undefined) {\n try {\n cleanedError.cause = helper(rawCause, depth + 1);\n } catch (error) {\n cleanedError.cause = formatSerializationError(error);\n }\n }\n return cleanedError;\n }\n\n // Handle Map - emit a tagged wrapper so key type/value identity is preserved.\n if (val instanceof Map) {\n const cleanedMap: SerializedMap = { __type: 'Map', __map_entries: [] };\n let mapKeyCount = 0;\n let omittedMapEntries = 0;\n for (const [mapKey, mapVal] of val) {\n if (typeof mapKey === 'string' && stripSet.has(mapKey)) {\n continue;\n }\n\n if (mapKeyCount >= maxObjectKeys) {\n omittedMapEntries++;\n continue;\n }\n\n const mapKeyType = getMapKeyType(mapKey);\n let cleanedMapKey: any;\n let cleanedMapValue: any;\n\n try {\n cleanedMapKey = helper(mapKey, depth + 1);\n } catch (error) {\n cleanedMapKey = formatSerializationError(error);\n }\n\n try {\n cleanedMapValue = helper(mapVal, depth + 1);\n } catch (error) {\n cleanedMapValue = formatSerializationError(error);\n }\n\n cleanedMap.__map_entries.push([mapKeyType, cleanedMapKey, cleanedMapValue]);\n mapKeyCount++;\n }\n if (omittedMapEntries > 0) {\n cleanedMap.__truncated = `${omittedMapEntries} more keys omitted`;\n }\n return cleanedMap;\n }\n\n // Handle Set - convert to an array.\n if (val instanceof Set) {\n const cleanedSet: any[] = [];\n let i = 0;\n const totalSetSize = val.size;\n for (const item of val) {\n if (i >= maxArrayLength) break;\n try {\n cleanedSet.push(helper(item, depth + 1));\n } catch (error) {\n cleanedSet.push(formatSerializationError(error));\n }\n i++;\n }\n if (totalSetSize > maxArrayLength) {\n cleanedSet.push(`[…${totalSetSize - maxArrayLength} more items]`);\n }\n return cleanedSet;\n }\n\n // Handle arrays - enforce length limit\n if (Array.isArray(val)) {\n const cleaned = [];\n\n for (let i = 0; i < Math.min(val.length, maxArrayLength); i++) {\n try {\n cleaned.push(helper(val[i], depth + 1));\n } catch (error) {\n cleaned.push(formatSerializationError(error));\n }\n }\n\n if (val.length > maxArrayLength) {\n cleaned.push(`[…${val.length - maxArrayLength} more items]`);\n }\n return cleaned;\n }\n\n // Handle Buffer and typed arrays - don't serialize large binary data\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(val)) {\n return `[Buffer length=${val.length}]`;\n }\n\n if (ArrayBuffer.isView(val)) {\n const ctor = (val as any).constructor?.name ?? 'TypedArray';\n const byteLength = (val as any).byteLength ?? '?';\n return `[${ctor} byteLength=${byteLength}]`;\n }\n\n if (val instanceof ArrayBuffer) {\n return `[ArrayBuffer byteLength=${val.byteLength}]`;\n }\n\n // Handle objects with serializeForSpan() method - use their custom trace serialization\n let serializeForSpan;\n try {\n serializeForSpan = val.serializeForSpan;\n } catch (error) {\n return `[serializeForSpan failed: ${error instanceof Error ? truncateString(error.message, 256) : 'unknown error'}]`;\n }\n\n if (typeof serializeForSpan === 'function') {\n try {\n return helper(serializeForSpan.call(val), depth);\n } catch (error) {\n return `[serializeForSpan failed: ${error instanceof Error ? truncateString(error.message, 256) : 'unknown error'}]`;\n }\n }\n\n // Handle JSON Schema objects - return as-is to preserve raw schemas for debugging.\n // JSON schemas are plain serializable objects (no circular refs, functions, etc.)\n // so we skip recursive traversal for performance.\n let looksLikeJsonSchema = false;\n try {\n looksLikeJsonSchema = isJsonSchema(val);\n } catch {\n looksLikeJsonSchema = false;\n }\n\n if (looksLikeJsonSchema) {\n return val;\n }\n\n // Handle objects - enforce key limit\n const cleaned: Record = {};\n const keys = Object.keys(val).filter(key => !stripSet.has(key));\n let keyCount = 0;\n\n for (const key of keys) {\n if (keyCount >= maxObjectKeys) {\n cleaned['__truncated'] = `${keys.length - keyCount} more keys omitted`;\n break;\n }\n\n try {\n cleaned[key] = helper((val as Record)[key], depth + 1);\n keyCount++;\n } catch (error) {\n cleaned[key] = formatSerializationError(error);\n keyCount++;\n }\n }\n\n return cleaned;\n } finally {\n // Remove from ancestor set when leaving this node so parallel\n // branches can serialize the same shared reference independently.\n if (typeof val === 'object' && val !== null) {\n ancestors.delete(val);\n }\n }\n }\n\n return helper(value, 0);\n}\n","/**\n * ObservabilityBus - Unified event bus for all observability signals.\n *\n * Routes events to registered exporters and an optional bridge based on event\n * type. Each handler declares which signals it supports by implementing the\n * corresponding method (onTracingEvent, onLogEvent, onMetricEvent,\n * onScoreEvent, onFeedbackEvent).\n *\n * Handler presence = signal support. If a handler does not implement a method,\n * events of that type are silently skipped for that handler.\n */\n\nimport type {\n ObservabilityExporter,\n ObservabilityBridge,\n ObservabilityEvent,\n ObservabilityDropEvent,\n SerializationOptions,\n} from '@mastra/core/observability';\n\nimport type { DeepCleanOptions } from '../spans/serialization';\nimport { deepClean, mergeSerializationOptions } from '../spans/serialization';\nimport { BaseObservabilityEventBus } from './base';\nimport { routeDropToHandler, routeToHandler } from './route-event';\n\n/**\n * Apply deepClean() to non-tracing observability events. Tracing events are\n * already deep-cleaned at span construction time (see spans/base.ts and\n * spans/default.ts), so they pass through unchanged.\n *\n * For log/metric/score/feedback we clean the entire exported payload object\n * (not just the freeform sub-fields) so every user-supplied field — top-level\n * strings like `message`/`reason`/`comment`, arrays like `tags`, nested\n * `metadata`/`data`/`costMetadata`, and any future fields — is bounded,\n * stripped of circular refs/functions/symbols, and safe for JSON.stringify\n * before exporters or bridges see it.\n *\n * Identity scalars (timestamps, numeric score/value, IDs) are passed through\n * by deepClean unchanged, so the cleaned object is structurally identical to\n * the input for well-formed events.\n */\nfunction cleanEvent(event: ObservabilityEvent, options: DeepCleanOptions): ObservabilityEvent {\n switch (event.type) {\n case 'log':\n return { type: 'log', log: deepClean(event.log, options) };\n case 'metric':\n return { type: 'metric', metric: deepClean(event.metric, options) };\n case 'score':\n return { type: 'score', score: deepClean(event.score, options) };\n case 'feedback':\n return { type: 'feedback', feedback: deepClean(event.feedback, options) };\n default:\n // Tracing events are already cleaned at span construction.\n return event;\n }\n}\n\n/** Max flush drain iterations before bailing — prevents infinite loops when handlers re-emit. */\nconst MAX_FLUSH_ITERATIONS = 3;\n\n/**\n * Unified event bus for all observability signals (tracing, logs, metrics, scores, feedback).\n * Routes events to registered exporters and an optional bridge.\n */\nexport class ObservabilityBus extends BaseObservabilityEventBus {\n private exporters: ObservabilityExporter[] = [];\n private bridge?: ObservabilityBridge;\n\n /** In-flight handler promises from routeToHandler. Self-cleaning via .finally(). */\n private pendingHandlers: Set> = new Set();\n\n private handlerBufferFlushDepth = 0;\n private dropEventsEmittedDuringHandlerFlush = 0;\n\n /** Resolved deepClean options applied to non-tracing events before fan-out. */\n private deepCleanOptions: DeepCleanOptions;\n\n constructor(opts?: { serializationOptions?: SerializationOptions }) {\n super({ name: 'ObservabilityBus' });\n this.deepCleanOptions = mergeSerializationOptions(opts?.serializationOptions);\n }\n\n /**\n * Register an exporter to receive routed events.\n * Duplicate registrations (same instance) are silently ignored.\n *\n * @param exporter - The exporter to register.\n */\n registerExporter(exporter: ObservabilityExporter): void {\n if (this.exporters.includes(exporter)) {\n return;\n }\n this.exporters.push(exporter);\n }\n\n /**\n * Unregister an exporter.\n *\n * @param exporter - The exporter instance to remove.\n * @returns `true` if the exporter was found and removed, `false` otherwise.\n */\n unregisterExporter(exporter: ObservabilityExporter): boolean {\n const index = this.exporters.indexOf(exporter);\n if (index !== -1) {\n this.exporters.splice(index, 1);\n return true;\n }\n return false;\n }\n\n /**\n * Get registered exporters (read-only snapshot).\n */\n getExporters(): readonly ObservabilityExporter[] {\n return [...this.exporters];\n }\n\n /**\n * Register a bridge to receive all routed events alongside exporters.\n * Only one bridge can be registered at a time; replacing an existing bridge\n * logs a warning.\n *\n * @param bridge - The bridge to register.\n */\n registerBridge(bridge: ObservabilityBridge): void {\n if (this.bridge) {\n this.logger.warn(`[ObservabilityBus] Replacing existing bridge with new bridge`);\n }\n this.bridge = bridge;\n }\n\n /**\n * Unregister the bridge.\n *\n * @returns `true` if a bridge was registered and removed, `false` otherwise.\n */\n unregisterBridge(): boolean {\n if (this.bridge) {\n this.bridge = undefined;\n return true;\n }\n return false;\n }\n\n /**\n * Get the registered bridge, if any.\n */\n getBridge(): ObservabilityBridge | undefined {\n return this.bridge;\n }\n\n /**\n * Emit an event: route to exporter/bridge handlers, then forward to base\n * class for subscriber delivery.\n *\n * emit() is synchronous — async handler promises are tracked internally\n * and can be drained via flush().\n */\n emit(event: ObservabilityEvent): void {\n // Sanitize free-form payload fields on non-tracing signals before\n // fanning out. Tracing events are already deep-cleaned at span\n // construction, so cleanEvent() returns them unchanged.\n const cleaned = cleanEvent(event, this.deepCleanOptions);\n\n // Route to appropriate handler on each registered exporter\n for (const exporter of this.exporters) {\n this.trackPromise(routeToHandler(exporter, cleaned, this.logger));\n }\n\n // Route to bridge (same routing logic as exporters)\n if (this.bridge) {\n this.trackPromise(routeToHandler(this.bridge, cleaned, this.logger));\n }\n\n // Deliver to subscribers (base class tracks its own pending promises)\n super.emit(cleaned);\n }\n\n /**\n * Emit exporter pipeline drop events to exporters and the bridge.\n *\n * Drop events describe exporter health, not user observability data, so they\n * are intentionally not delivered to generic event-bus subscribers.\n */\n emitDropEvent(event: ObservabilityDropEvent): void {\n if (this.handlerBufferFlushDepth > 0) {\n this.dropEventsEmittedDuringHandlerFlush++;\n }\n\n for (const exporter of this.exporters) {\n this.trackPromise(routeDropToHandler(exporter, event, this.logger));\n }\n\n if (this.bridge) {\n this.trackPromise(routeDropToHandler(this.bridge, event, this.logger));\n }\n }\n\n /**\n * Track an async handler promise so flush() can await it.\n * No-ops for sync (void) results.\n */\n private trackPromise(result: void | Promise): void {\n if (result && typeof (result as Promise).then === 'function') {\n const promise = result as Promise;\n this.pendingHandlers.add(promise);\n void promise.finally(() => this.pendingHandlers.delete(promise));\n }\n }\n\n /** Await in-flight routed handler promises, draining until empty. */\n private async drainPendingHandlers(): Promise {\n let iterations = 0;\n while (this.pendingHandlers.size > 0) {\n await Promise.allSettled([...this.pendingHandlers]);\n iterations++;\n if (iterations >= MAX_FLUSH_ITERATIONS) {\n this.logger.error(\n `[ObservabilityBus] flush() exceeded ${MAX_FLUSH_ITERATIONS} drain iterations — ` +\n `${this.pendingHandlers.size} promises still pending. Handlers may be re-emitting during flush.`,\n );\n // Final settlement pass: ensure every remaining promise has settled\n // before moving on, even if new promises keep appearing.\n if (this.pendingHandlers.size > 0) {\n await Promise.allSettled([...this.pendingHandlers]);\n }\n break;\n }\n }\n }\n\n /** Drain exporter and bridge SDK-internal buffers. */\n private async flushHandlerBuffers(): Promise {\n const initialDropCount = this.dropEventsEmittedDuringHandlerFlush;\n this.handlerBufferFlushDepth++;\n try {\n const bufferFlushPromises: Promise[] = this.exporters.map(e => e.flush());\n if (this.bridge) {\n bufferFlushPromises.push(this.bridge.flush());\n }\n if (bufferFlushPromises.length > 0) {\n await Promise.allSettled(bufferFlushPromises);\n }\n return this.dropEventsEmittedDuringHandlerFlush > initialDropCount;\n } finally {\n this.handlerBufferFlushDepth--;\n }\n }\n\n /**\n * Multi-phase flush to ensure all observability data is fully exported.\n *\n * **Phase 1 — Delivery:** Await all in-flight handler promises (exporters,\n * bridge, and base-class subscribers). After this resolves, all event data\n * has been delivered to handler methods.\n *\n * **Phase 2 — Buffer drain:** Call flush() on each exporter and bridge to\n * drain their SDK-internal buffers (e.g., OTEL BatchSpanProcessor, Langfuse\n * client queue). Phases are sequential — buffer drains must not start until\n * delivery completes, otherwise exporters would flush empty buffers.\n *\n * Exporter flushes can emit drop events. When that happens, flush loops\n * through delivery and buffer drain again so alerting integrations that buffer\n * drop notifications are drained before returning.\n */\n async flush(): Promise {\n // Phase 1: Await in-flight handler delivery promises, draining until empty.\n await this.drainPendingHandlers();\n await super.flush();\n\n for (let iterations = 0; iterations < MAX_FLUSH_ITERATIONS; iterations++) {\n const emittedDropEvents = await this.flushHandlerBuffers();\n if (!emittedDropEvents && this.pendingHandlers.size === 0) {\n return;\n }\n\n await this.drainPendingHandlers();\n await super.flush();\n }\n\n this.logger.error(\n `[ObservabilityBus] flush() exceeded ${MAX_FLUSH_ITERATIONS} buffer drain iterations. ` +\n `Handlers may be emitting drop events during every flush.`,\n );\n }\n\n /** Flush all pending events and exporter buffers, then clear subscribers. */\n async shutdown(): Promise {\n await this.flush();\n await super.shutdown();\n }\n}\n","/**\n * Configuration types for Mastra Observability\n *\n * These types define the configuration structure for observability,\n * including tracing configs, sampling strategies, and registry setup.\n */\n\nimport type { RequestContext } from '@mastra/core/di';\nimport type {\n ObservabilityInstance,\n ObservabilityExporter,\n ObservabilityBridge,\n SpanOutputProcessor,\n ConfigSelector,\n SerializationOptions,\n CardinalityConfig,\n LogLevel,\n AnyExportedSpan,\n} from '@mastra/core/observability';\nimport { SpanType } from '@mastra/core/observability';\nimport { z } from 'zod/v4';\nimport type { SensitiveDataFilterOptions } from './span_processors';\n\n// ============================================================================\n// Sampling Strategy Types\n// ============================================================================\n\n/**\n * Sampling strategy types\n */\nexport enum SamplingStrategyType {\n ALWAYS = 'always',\n NEVER = 'never',\n RATIO = 'ratio',\n CUSTOM = 'custom',\n}\n\nconst functionSchema = z.custom<(...args: any[]) => unknown>(value => typeof value === 'function', {\n message: 'Expected function',\n});\n\n/**\n * Options passed when using a custom sampler strategy\n */\nexport interface CustomSamplerOptions {\n requestContext?: RequestContext;\n metadata?: Record;\n}\n\n/**\n * Sampling strategy configuration\n */\nexport type SamplingStrategy =\n | { type: SamplingStrategyType.ALWAYS }\n | { type: SamplingStrategyType.NEVER }\n | { type: SamplingStrategyType.RATIO; probability: number }\n | { type: SamplingStrategyType.CUSTOM; sampler: (options?: CustomSamplerOptions) => boolean };\n\n// ============================================================================\n// Observability Configuration Types\n// ============================================================================\n\n/**\n * Configuration for a single observability instance\n */\nexport interface ObservabilityInstanceConfig {\n /** Unique identifier for this config in the tracing registry */\n name: string;\n /** Service name for tracing */\n serviceName: string;\n /** Sampling strategy - controls whether tracing is collected (defaults to ALWAYS) */\n sampling?: SamplingStrategy;\n /** Custom exporters */\n exporters?: ObservabilityExporter[];\n /** Observability bridge (e.g., OpenTelemetry bridge for context extraction) */\n bridge?: ObservabilityBridge;\n /** Custom span output processors */\n spanOutputProcessors?: SpanOutputProcessor[];\n /** Set to `true` if you want to see spans internal to the operation of mastra */\n includeInternalSpans?: boolean;\n /**\n * Span types to exclude from export. Spans of these types are silently dropped\n * before reaching exporters. This is useful for reducing noise and costs in\n * observability platforms that charge per-span (e.g., Langfuse).\n *\n * @example\n * ```typescript\n * excludeSpanTypes: [SpanType.MODEL_CHUNK, SpanType.MODEL_STEP]\n * ```\n */\n excludeSpanTypes?: SpanType[];\n /**\n * Filter function to control which spans are exported. Return `true` to keep\n * the span, `false` to drop it. This runs after `excludeSpanTypes` and\n * `spanOutputProcessors`, giving you access to the final exported span data\n * for fine-grained filtering by type, attributes, entity, metadata, or any\n * combination.\n *\n * @example\n * ```typescript\n * spanFilter: (span) => {\n * // Drop all model chunks\n * if (span.type === SpanType.MODEL_CHUNK) return false;\n * // Only keep tool calls that failed\n * if (span.type === SpanType.TOOL_CALL && span.attributes?.success) return false;\n * return true;\n * }\n * ```\n */\n spanFilter?: (span: AnyExportedSpan) => boolean;\n /**\n * RequestContext keys to automatically extract as metadata for all spans\n * created with this tracing configuration.\n * Supports dot notation for nested values.\n */\n requestContextKeys?: string[];\n /**\n * Options for controlling serialization of span data (input/output/attributes).\n * Use these to customize truncation limits for large payloads.\n */\n serializationOptions?: SerializationOptions;\n /**\n * Cardinality protection settings for metrics.\n * Controls which labels are blocked and whether UUID-like values are filtered.\n * Applied to all metrics (auto-extracted and user-defined).\n */\n cardinality?: CardinalityConfig;\n /**\n * Configuration for the observability logger (loggerVNext).\n * Controls log level filtering and whether dual-write logging is enabled.\n */\n logging?: {\n /** Set to `false` to disable dual-write logging to observability storage. Defaults to `true`. */\n enabled?: boolean;\n /** Minimum log level to write to observability storage. Defaults to `'warn'`. */\n level?: LogLevel;\n };\n}\n\n/**\n * Complete Observability registry configuration\n */\nexport interface ObservabilityRegistryConfig {\n /**\n * Enables default exporters, with sampling: always, and sensitive data filtering\n * @deprecated Use explicit `configs` with MastraStorageExporter, MastraPlatformExporter, and SensitiveDataFilter instead.\n * This option will be removed in a future version.\n */\n default?: {\n enabled?: boolean;\n };\n /** Map of tracing instance names to their configurations or pre-instantiated instances */\n configs?: Record | ObservabilityInstance>;\n /** Optional selector function to choose which tracing instance to use */\n configSelector?: ConfigSelector;\n /**\n * Controls whether a `SensitiveDataFilter` span output processor is automatically\n * applied to every configured observability instance. This protects against\n * accidentally exporting secrets (API keys, tokens, passwords, etc.) to\n * exporters such as the Mastra cloud exporter.\n *\n * - `true` (default): apply `SensitiveDataFilter` with default options.\n * - `false`: do not auto-apply the filter. You can still add it manually via\n * `spanOutputProcessors` on a specific config.\n * - an object: apply `SensitiveDataFilter` with the provided options.\n *\n * If a config already includes a `SensitiveDataFilter` in\n * `spanOutputProcessors`, the auto-applied filter is skipped to avoid\n * double redaction. The auto-applied filter runs last (after any\n * user-provided processors) so that sensitive data introduced or\n * surfaced by upstream processors is still redacted before export.\n * Pre-instantiated `ObservabilityInstance` values are not modified.\n */\n sensitiveDataFilter?: boolean | SensitiveDataFilterOptions;\n}\n\n// ============================================================================\n// Zod Schemas for Validation\n// ============================================================================\n\n/**\n * Zod schema for SamplingStrategy\n */\nexport const samplingStrategySchema = z.discriminatedUnion('type', [\n z.object({\n type: z.literal(SamplingStrategyType.ALWAYS),\n }),\n z.object({\n type: z.literal(SamplingStrategyType.NEVER),\n }),\n z.object({\n type: z.literal(SamplingStrategyType.RATIO),\n probability: z.number().min(0, 'Probability must be between 0 and 1').max(1, 'Probability must be between 0 and 1'),\n }),\n z.object({\n type: z.literal(SamplingStrategyType.CUSTOM),\n sampler: functionSchema,\n }),\n]);\n\n/**\n * Zod schema for SerializationOptions\n */\nexport const serializationOptionsSchema = z\n .object({\n maxStringLength: z.number().int().positive().optional(),\n maxDepth: z.number().int().positive().optional(),\n maxArrayLength: z.number().int().positive().optional(),\n maxObjectKeys: z.number().int().positive().optional(),\n })\n .optional();\n\nconst LOG_LEVELS = ['debug', 'info', 'warn', 'error', 'fatal'] as const;\n\nconst cardinalityConfigSchema = z\n .object({\n blockedLabels: z.array(z.string()).optional(),\n blockUUIDs: z.boolean().optional(),\n })\n .optional();\n\nconst loggingConfigSchema = z\n .object({\n enabled: z.boolean().optional(),\n level: z.enum(LOG_LEVELS).optional(),\n })\n .optional();\n\nconst spanFilterSchema = functionSchema.optional();\n\nconst observabilityInstanceConfigFields = {\n serviceName: z.string().min(1, 'Service name is required'),\n sampling: samplingStrategySchema.optional(),\n exporters: z.array(z.any()).optional(),\n bridge: z.any().optional(),\n spanOutputProcessors: z.array(z.any()).optional(),\n includeInternalSpans: z.boolean().optional(),\n excludeSpanTypes: z.array(z.nativeEnum(SpanType)).optional(),\n spanFilter: spanFilterSchema,\n requestContextKeys: z.array(z.string()).optional(),\n serializationOptions: serializationOptionsSchema,\n cardinality: cardinalityConfigSchema,\n logging: loggingConfigSchema,\n};\n\n/**\n * Zod schema for ObservabilityInstanceConfig\n * Note: exporters, spanOutputProcessors, bridge, and configSelector are validated as any\n * since they're complex runtime objects\n */\nexport const observabilityInstanceConfigSchema = z\n .object({\n name: z.string().min(1, 'Name is required'),\n ...observabilityInstanceConfigFields,\n })\n .refine(\n data => {\n // At least one exporter or a bridge must be provided\n const hasExporters = data.exporters && data.exporters.length > 0;\n const hasBridge = !!data.bridge;\n return hasExporters || hasBridge;\n },\n {\n message: 'At least one exporter or a bridge is required',\n },\n );\n\n/**\n * Zod schema for config values in the configs map\n * This is the config object without the name field\n */\nexport const observabilityConfigValueSchema = z.object(observabilityInstanceConfigFields).refine(\n data => {\n // At least one exporter or a bridge must be provided\n const hasExporters = data.exporters && data.exporters.length > 0;\n const hasBridge = !!data.bridge;\n return hasExporters || hasBridge;\n },\n {\n message: 'At least one exporter or a bridge is required',\n },\n);\n\n/**\n * Zod schema for ObservabilityRegistryConfig\n * Note: Individual configs are validated separately in the constructor to allow for\n * both plain config objects and pre-instantiated ObservabilityInstance objects.\n * The schema is permissive to handle edge cases gracefully (arrays, null values).\n */\nconst sensitiveDataFilterOptionsSchema = z\n .object({\n sensitiveFields: z.array(z.string()).optional(),\n redactionToken: z.string().optional(),\n redactionStyle: z.enum(['full', 'partial']).optional(),\n })\n .strict();\n\nexport const observabilityRegistryConfigSchema = z\n .object({\n default: z\n .object({\n enabled: z.boolean().optional(),\n })\n .optional()\n .nullable(),\n configs: z.union([z.record(z.string(), z.any()), z.array(z.any()), z.null()]).optional(),\n configSelector: functionSchema.optional(),\n sensitiveDataFilter: z.union([z.boolean(), sensitiveDataFilterOptionsSchema]).optional(),\n })\n .passthrough() // Allow additional properties\n .refine(\n data => {\n // Validate that default (when enabled) and configs are mutually exclusive\n const isDefaultEnabled = data.default?.enabled === true;\n // Check if configs has any entries (only if it's actually an object)\n const hasConfigs =\n data.configs && typeof data.configs === 'object' && !Array.isArray(data.configs)\n ? Object.keys(data.configs).length > 0\n : false;\n\n // Cannot have both default enabled and any configs\n return !(isDefaultEnabled && hasConfigs);\n },\n {\n message:\n 'Cannot specify both \"default\" (when enabled) and \"configs\". Use either default observability or custom configs, but not both.',\n },\n )\n .refine(\n data => {\n // Validate that configSelector is required when there are multiple configs\n const configCount =\n data.configs && typeof data.configs === 'object' && !Array.isArray(data.configs)\n ? Object.keys(data.configs).length\n : 0;\n\n // If there are 2 or more configs, configSelector must be provided\n if (configCount > 1 && !data.configSelector) {\n return false;\n }\n\n return true;\n },\n {\n message:\n 'A \"configSelector\" function is required when multiple configs are specified to determine which config to use.',\n },\n )\n .refine(\n data => {\n // Validate that if configSelector is provided, there must be configs or default\n if (data.configSelector) {\n const isDefaultEnabled = data.default?.enabled === true;\n const hasConfigs =\n data.configs && typeof data.configs === 'object' && !Array.isArray(data.configs)\n ? Object.keys(data.configs).length > 0\n : false;\n\n // If configSelector is provided, must have either default enabled or configs\n return isDefaultEnabled || hasConfigs;\n }\n\n return true;\n },\n {\n message: 'A \"configSelector\" requires at least one config or default observability to be configured.',\n },\n );\n","/**\n * LoggerContextImpl - Structured logging with automatic trace correlation.\n *\n * Emits LogEvent to the ObservabilityBus. All context (correlationContext,\n * metadata) is snapshotted at construction time.\n */\n\nimport { generateSignalId } from '@mastra/core/observability';\nimport type { LogLevel, LoggerContext, ExportedLog, LogEvent, CorrelationContext } from '@mastra/core/observability';\n\nimport type { ObservabilityBus } from '../bus';\n\nexport interface LoggerContextConfig {\n /** Top-level trace identity for emitted log events */\n traceId?: string;\n\n /** Top-level span identity for emitted log events */\n spanId?: string;\n\n /** Canonical correlation context for log correlation */\n correlationContext?: CorrelationContext;\n\n /** Metadata (entity context, runId, environment, serviceName, etc.) */\n metadata?: Record;\n\n /** Bus for event emission */\n observabilityBus: ObservabilityBus;\n\n /** Minimum log level (logs below this are discarded) */\n minLevel?: LogLevel;\n}\n\n/** Numeric priority used to compare log levels against the configured minimum. */\nconst LOG_LEVEL_PRIORITY: Record = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n fatal: 4,\n};\n\nexport class LoggerContextImpl implements LoggerContext {\n private config: LoggerContextConfig;\n\n /**\n * Create a logger context. Context and metadata are defensively copied so\n * mutations after construction do not affect emitted logs.\n */\n constructor(config: LoggerContextConfig) {\n const correlationContext = config.correlationContext ? { ...config.correlationContext } : undefined;\n\n this.config = {\n ...config,\n traceId: config.traceId ?? correlationContext?.traceId,\n spanId: config.spanId ?? correlationContext?.spanId,\n correlationContext,\n metadata: config.metadata ? structuredClone(config.metadata) : undefined,\n };\n }\n\n /** Log at DEBUG level. */\n debug(message: string, data?: Record): void {\n this.log('debug', message, data);\n }\n\n /** Log at INFO level. */\n info(message: string, data?: Record): void {\n this.log('info', message, data);\n }\n\n /** Log at WARN level. */\n warn(message: string, data?: Record): void {\n this.log('warn', message, data);\n }\n\n /** Log at ERROR level. */\n error(message: string, data?: Record): void {\n this.log('error', message, data);\n }\n\n /** Log at FATAL level. */\n fatal(message: string, data?: Record): void {\n this.log('fatal', message, data);\n }\n\n /**\n * Build an ExportedLog, check against the minimum level, and emit it through the bus.\n */\n private log(level: LogLevel, message: string, data?: Record): void {\n const minLevel = this.config.minLevel ?? 'warn';\n if (LOG_LEVEL_PRIORITY[level] < LOG_LEVEL_PRIORITY[minLevel]) {\n return;\n }\n\n const exportedLog: ExportedLog = {\n logId: generateSignalId(),\n timestamp: new Date(),\n level,\n message,\n data,\n traceId: this.config.traceId,\n spanId: this.config.spanId,\n correlationContext: this.config.correlationContext,\n metadata: this.config.metadata,\n };\n\n const event: LogEvent = { type: 'log', log: exportedLog };\n this.config.observabilityBus.emit(event);\n }\n}\n","/**\n * MetricsContextImpl - User-facing metric emission API.\n *\n * All metrics are validated, cardinality-filtered, and constructed here\n * before being routed through ObservabilityBus.emit().\n * CorrelationContext and metadata are snapshotted at construction time.\n */\n\nimport { generateSignalId } from '@mastra/core/observability';\nimport type {\n MetricsContext,\n Counter,\n Gauge,\n Histogram,\n CorrelationContext,\n CostContext,\n ExportedMetric,\n MetricEvent,\n MetricEmitOptions,\n} from '@mastra/core/observability';\n\nimport type { ObservabilityBus } from '../bus';\nimport type { CardinalityFilter } from '../metrics/cardinality';\n\n/** Configuration for creating a MetricsContextImpl. */\nexport interface MetricsContextConfig {\n /** Top-level trace identity for emitted metric events */\n traceId?: string;\n\n /** Top-level span identity for emitted metric events */\n spanId?: string;\n\n /** Canonical correlation context derived from the current span */\n correlationContext?: CorrelationContext;\n\n /** Non-canonical metadata to attach to emitted metric events */\n metadata?: Record;\n\n /** Cardinality filter applied to emitted metric labels */\n cardinalityFilter: CardinalityFilter;\n\n /** Bus for event emission */\n observabilityBus: ObservabilityBus;\n}\n\n/**\n * User-facing metric emission API. All metrics are routed through\n * ObservabilityBus.emit() after validation and cardinality filtering.\n */\nexport class MetricsContextImpl implements MetricsContext {\n private traceId?: string;\n private spanId?: string;\n private correlationContext?: CorrelationContext;\n private metadata?: Record;\n private cardinalityFilter: CardinalityFilter;\n private observabilityBus: ObservabilityBus;\n\n /**\n * Create a metrics context. Correlation context and metadata are defensively\n * copied so mutations after construction do not affect emitted metrics.\n */\n constructor(config: MetricsContextConfig) {\n this.correlationContext = config.correlationContext ? { ...config.correlationContext } : undefined;\n this.traceId = config.traceId ?? this.correlationContext?.traceId;\n this.spanId = config.spanId ?? this.correlationContext?.spanId;\n this.metadata = config.metadata ? structuredClone(config.metadata) : undefined;\n this.cardinalityFilter = config.cardinalityFilter;\n this.observabilityBus = config.observabilityBus;\n }\n\n /** Emit a metric observation. */\n emit(name: string, value: number, labels?: Record, options?: MetricEmitOptions): void {\n if (!Number.isFinite(value) || value < 0) {\n return;\n }\n\n const filteredLabels = labels ? this.cardinalityFilter.filterLabels(labels) : {};\n const costContext = options?.costContext ? cloneCostContext(options.costContext) : undefined;\n\n const exportedMetric: ExportedMetric = {\n metricId: generateSignalId(),\n timestamp: new Date(),\n traceId: this.traceId,\n spanId: this.spanId,\n name,\n value,\n labels: filteredLabels,\n correlationContext: this.correlationContext,\n costContext,\n metadata: this.metadata,\n };\n\n const event: MetricEvent = { type: 'metric', metric: exportedMetric };\n this.observabilityBus.emit(event);\n }\n\n /** @deprecated Use `emit()` instead. */\n counter(name: string): Counter {\n return {\n add: (value: number, additionalLabels?: Record) => {\n this.emit(name, value, additionalLabels);\n },\n };\n }\n\n /** @deprecated Use `emit()` instead. */\n gauge(name: string): Gauge {\n return {\n set: (value: number, additionalLabels?: Record) => {\n this.emit(name, value, additionalLabels);\n },\n };\n }\n\n /** @deprecated Use `emit()` instead. */\n histogram(name: string): Histogram {\n return {\n record: (value: number, additionalLabels?: Record) => {\n this.emit(name, value, additionalLabels);\n },\n };\n }\n}\n\nfunction cloneCostContext(costContext: CostContext): CostContext {\n return {\n provider: costContext.provider,\n model: costContext.model,\n estimatedCost: costContext.estimatedCost,\n costUnit: costContext.costUnit,\n costMetadata: costContext.costMetadata ? structuredClone(costContext.costMetadata) : undefined,\n };\n}\n","import type { UsageStats } from '@mastra/core/observability';\nimport type { PricingMeter, PricingConditionOperator, PricingConditionField } from './types';\n\nexport class PricingTier {\n readonly index: number;\n readonly when?: Array<{ field: PricingConditionField; op: PricingConditionOperator; value: number }>;\n readonly rates: Partial>;\n\n constructor(args: {\n index: number;\n when?: Array<{ field: PricingConditionField; op: PricingConditionOperator; value: number }>;\n rates: Partial>;\n }) {\n this.index = args.index;\n this.when = args.when;\n this.rates = args.rates;\n }\n\n matchesUsage(usage: UsageStats): boolean {\n if (!this.when || this.when.length === 0) {\n return true;\n }\n\n return this.when.every(condition => this.matchesCondition(condition, usage));\n }\n\n hasMatchingMeterForUsage(meter: PricingMeter): boolean {\n return Boolean(meter && typeof this.rates[meter] === 'number');\n }\n\n private matchesCondition(\n condition: { field: PricingConditionField; op: PricingConditionOperator; value: number },\n usage: UsageStats,\n ): boolean {\n const left = this.getConditionFieldValue(condition.field, usage);\n if (left == null) {\n return false;\n }\n\n switch (condition.op) {\n case 'gt':\n return left > condition.value;\n case 'gte':\n return left >= condition.value;\n case 'lt':\n return left < condition.value;\n case 'lte':\n return left <= condition.value;\n case 'eq':\n return left === condition.value;\n case 'neq':\n return left !== condition.value;\n default:\n return false;\n }\n }\n\n private getConditionFieldValue(field: PricingConditionField, usage: UsageStats): number | null {\n switch (field) {\n case 'total_input_tokens':\n return typeof usage.inputTokens === 'number' ? usage.inputTokens : null;\n default:\n return null;\n }\n }\n}\n\nexport class PricingModel {\n readonly id: string;\n readonly provider: string;\n readonly model: string;\n readonly schema: string;\n readonly currency: string;\n readonly tiers: PricingTier[];\n\n constructor(args: {\n id: string;\n provider: string;\n model: string;\n schema: string;\n currency: string;\n tiers: PricingTier[];\n }) {\n this.id = args.id;\n this.provider = args.provider;\n this.model = args.model;\n this.schema = args.schema;\n this.currency = args.currency;\n this.tiers = args.tiers;\n }\n\n getPricingTierForUsage(usage: UsageStats): PricingTier | null {\n for (const tier of this.tiers) {\n if (tier.when && tier.when.length > 0 && tier.matchesUsage(usage)) {\n return tier;\n }\n }\n\n return this.getBasePricingTier();\n }\n\n getBasePricingTier(): PricingTier | null {\n return this.tiers[0] ?? null;\n }\n}\n","import fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\nimport { PricingModel, PricingTier } from './pricing-model';\nimport type { PricingMeter, PricingConditionOperator, PricingConditionField } from './types';\n\nconst DATA_FILE_NAME = 'pricing-data.jsonl';\n\ntype MinifiedMeterKey = 'it' | 'ot' | 'icrt' | 'icwt' | 'iat' | 'oat' | 'ort';\ntype MinifiedConditionFieldKey = 'tit';\n\ninterface MinifiedCondition {\n f: MinifiedConditionFieldKey;\n op: PricingConditionOperator;\n value: number;\n}\n\ninterface MinifiedTier {\n w?: MinifiedCondition[];\n r: Partial>;\n}\n\ninterface MinifiedPricingModelRow {\n i: string;\n p: string;\n m: string;\n s: {\n v: string;\n d: {\n u: string;\n t: MinifiedTier[];\n };\n };\n}\n\nconst MINIFIED_METER_TO_CANONICAL: Record = {\n it: 'input_tokens',\n ot: 'output_tokens',\n icrt: 'input_cache_read_tokens',\n icwt: 'input_cache_write_tokens',\n iat: 'input_audio_tokens',\n oat: 'output_audio_tokens',\n ort: 'output_reasoning_tokens',\n};\n\nconst MINIFIED_CONDITION_FIELD_TO_CANONICAL: Record = {\n tit: 'total_input_tokens',\n};\n\nlet cachedLoadError: string | null = null;\n\nexport class PricingRegistry {\n private static globalRegistry: PricingRegistry | null = null;\n\n constructor(private readonly pricingModels: Map) {}\n\n static fromText(pricingModelText: string): PricingRegistry {\n return new PricingRegistry(parsePricingModelText(pricingModelText));\n }\n\n static getGlobal(): PricingRegistry | null {\n if (PricingRegistry.globalRegistry) {\n return PricingRegistry.globalRegistry;\n }\n\n const pricingModels = loadPricingModels();\n if (!pricingModels) {\n return null;\n }\n\n PricingRegistry.globalRegistry = new PricingRegistry(pricingModels);\n return PricingRegistry.globalRegistry;\n }\n\n get(args: { provider: string; model: string }): PricingModel | null {\n // Try all model name variants in order of preference\n const variants = getModelVariants(args.model);\n for (const variant of variants) {\n const key = makePricingKey({ provider: args.provider, model: variant });\n const match = this.pricingModels.get(key);\n if (match) return match;\n }\n return null;\n }\n}\n\nfunction loadPricingModels(): Map | null {\n if (cachedLoadError) {\n return null;\n }\n\n try {\n const content = fs.readFileSync(resolvePricingModelPath(), 'utf-8');\n return parsePricingModelText(content);\n } catch (error) {\n cachedLoadError = error instanceof Error ? error.message : String(error);\n return null;\n }\n}\n\nfunction parsePricingModelText(content: string): Map {\n const pricingModels = new Map();\n\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed) {\n continue;\n }\n\n const parsed = JSON.parse(trimmed) as MinifiedPricingModelRow;\n const pricingModel = expandPricingModelRow(parsed);\n pricingModels.set(makePricingKey(pricingModel), pricingModel);\n }\n\n return pricingModels;\n}\n\nfunction expandPricingModelRow(row: MinifiedPricingModelRow): PricingModel {\n return new PricingModel({\n id: row.i,\n provider: row.p,\n model: row.m,\n schema: row.s.v,\n currency: row.s.d.u,\n tiers: row.s.d.t.map(\n (tier, index) =>\n new PricingTier({\n index,\n when: tier.w?.map(condition => ({\n field: MINIFIED_CONDITION_FIELD_TO_CANONICAL[condition.f],\n op: condition.op,\n value: condition.value,\n })),\n rates: Object.fromEntries(\n Object.entries(tier.r).map(([meter, value]) => [\n MINIFIED_METER_TO_CANONICAL[meter as MinifiedMeterKey],\n value!.c,\n ]),\n ) as Partial>,\n }),\n ),\n });\n}\n\nfunction resolvePricingModelPath(): string {\n const packageRoot = getPackageRoot();\n const candidates = [\n path.join(packageRoot, 'dist', 'metrics', DATA_FILE_NAME),\n path.join(packageRoot, 'src', 'metrics', DATA_FILE_NAME),\n path.join(process.cwd(), 'observability', 'mastra', 'src', 'metrics', DATA_FILE_NAME),\n path.join(process.cwd(), 'src', 'metrics', DATA_FILE_NAME),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n throw new Error(`Unable to locate pricing data JSONL at any known path: ${candidates.join(', ')}`);\n}\n\nfunction getPackageRoot(): string {\n try {\n const require = createRequire(import.meta.url || 'file://');\n const packageJsonPath = require.resolve('@mastra/observability/package.json');\n return path.dirname(packageJsonPath);\n } catch {\n return process.cwd();\n }\n}\n\nfunction makePricingKey(args: { provider: string; model: string }): string {\n return `${normalizeProvider(args.provider)}::${normalizeKeyPart(args.model)}`;\n}\n\nfunction normalizeKeyPart(value: string): string {\n return value.trim().toLowerCase();\n}\n\n/**\n * Normalize a provider string by stripping AI SDK capability suffixes\n * (e.g. \"openai.chat\" → \"openai\", \"anthropic.messages\" → \"anthropic\").\n * The pricing data uses bare provider names without these suffixes.\n */\nfunction normalizeProvider(provider: string): string {\n const normalized = provider.trim().toLowerCase();\n const dotIndex = normalized.indexOf('.');\n return dotIndex !== -1 ? normalized.substring(0, dotIndex) : normalized;\n}\n\n/**\n * Generate model name variants to try during lookup, in priority order:\n * 1. Original (and date-stripped original)\n * 2. Dots → dashes, e.g. \"gpt-5.4\" → \"gpt-5-4\" (and date-stripped)\n * 3. Dots and slashes → dashes, e.g. \"xiaomi/mimo-v2-pro\" → \"xiaomi-mimo-v2-pro\"\n * (covers OpenRouter entries that keep the vendor prefix flattened with a dash)\n * 4. Vendor prefix dropped, e.g. \"openai/gpt-5-mini\" → \"gpt-5-mini\", and the\n * same with dots flattened, e.g. \"google/gemini-2.5-flash\" → \"gemini-2-5-flash\"\n * (covers OpenRouter entries stored without the vendor prefix, including\n * dotted versions)\n *\n * Each variant is also tried with its date suffix stripped.\n * The Set dedupes so non-prefixed inputs do not pay for redundant lookups.\n */\nfunction getModelVariants(model: string): string[] {\n const variants = new Set();\n const add = (v: string) => {\n variants.add(v);\n variants.add(stripDateSuffix(v));\n };\n\n add(model);\n add(model.replace(/\\./g, '-'));\n add(model.replace(/[./]/g, '-'));\n\n const slashIndex = model.indexOf('/');\n if (slashIndex !== -1) {\n // Vendor-prefixed routes (e.g. OpenRouter's `google/gemini-2.5-flash`) need the\n // same dot-flattening as the full id; otherwise the stripped suffix keeps its dots\n // (`gemini-2.5-flash`) and never matches a flattened pricing key (`gemini-2-5-flash`).\n const withoutVendor = model.substring(slashIndex + 1);\n add(withoutVendor);\n add(withoutVendor.replace(/\\./g, '-'));\n }\n\n return [...variants];\n}\n\n/**\n * Strip date suffix from model names.\n * Handles multiple date formats used by different providers:\n * - OpenAI: YYYY-MM-DD at end (e.g., \"gpt-5-4-mini-2026-03-17\" → \"gpt-5-4-mini\")\n * - Anthropic: YYYYMMDD with optional suffix (e.g., \"claude-sonnet-4-5-20250929-thinking\" → \"claude-sonnet-4-5-thinking\")\n * - Cohere/Gemini: MM-YYYY at end (e.g., \"command-r-08-2024\" → \"command-r\")\n */\nfunction stripDateSuffix(model: string): string {\n // OpenAI format: -YYYY-MM-DD at end\n let stripped = model.replace(/-20\\d{2}-\\d{2}-\\d{2}$/, '');\n if (stripped !== model) return stripped;\n\n // Anthropic format: -YYYYMMDD, possibly followed by suffix like -thinking\n stripped = model.replace(/-20\\d{6}(-[a-z]+)?$/, '$1');\n if (stripped !== model) return stripped;\n\n // Cohere/Gemini format: -MM-YYYY at end\n stripped = model.replace(/-\\d{2}-20\\d{2}$/, '');\n return stripped;\n}\n","export type PricingConditionField = 'total_input_tokens';\nexport type PricingConditionOperator = 'gt' | 'gte' | 'lt' | 'lte' | 'eq' | 'neq';\n\nexport const PricingMeter = {\n INPUT_TOKENS: 'input_tokens',\n INPUT_AUDIO_TOKENS: 'input_audio_tokens',\n INPUT_CACHE_READ_TOKENS: 'input_cache_read_tokens',\n INPUT_CACHE_WRITE_TOKENS: 'input_cache_write_tokens',\n INPUT_IMAGE_TOKENS: 'input_image_tokens',\n\n OUTPUT_TOKENS: 'output_tokens',\n OUTPUT_AUDIO_TOKENS: 'output_audio_tokens',\n OUTPUT_IMAGE_TOKENS: 'output_image_tokens',\n OUTPUT_REASONING_TOKENS: 'output_reasoning_tokens',\n} as const;\n\nexport type PricingMeter = (typeof PricingMeter)[keyof typeof PricingMeter];\n\nexport const TokenMetrics = {\n TOTAL_INPUT: 'mastra_model_total_input_tokens',\n TOTAL_OUTPUT: 'mastra_model_total_output_tokens',\n INPUT_TEXT: 'mastra_model_input_text_tokens',\n INPUT_CACHE_READ: 'mastra_model_input_cache_read_tokens',\n INPUT_CACHE_WRITE: 'mastra_model_input_cache_write_tokens',\n INPUT_AUDIO: 'mastra_model_input_audio_tokens',\n INPUT_IMAGE: 'mastra_model_input_image_tokens',\n OUTPUT_TEXT: 'mastra_model_output_text_tokens',\n OUTPUT_REASONING: 'mastra_model_output_reasoning_tokens',\n OUTPUT_AUDIO: 'mastra_model_output_audio_tokens',\n OUTPUT_IMAGE: 'mastra_model_output_image_tokens',\n} as const;\n\nexport type TokenMetrics = (typeof TokenMetrics)[keyof typeof TokenMetrics];\n","import type { UsageStats } from '@mastra/core/observability';\nimport { TokenMetrics } from './types';\n\nexport interface TokenMetricSample {\n name: TokenMetrics;\n value: number;\n}\n\nexport function getTokenMetricSamples(usage: UsageStats): TokenMetricSample[] {\n const samples: TokenMetricSample[] = [];\n const pushIfDefined = (name: TokenMetrics, value: number | undefined) => {\n if (value != null) {\n samples.push({ name, value });\n }\n };\n const pushIfPositive = (name: TokenMetrics, value: number | undefined) => {\n if (value != null && value > 0) {\n samples.push({ name, value });\n }\n };\n\n pushIfDefined(TokenMetrics.TOTAL_INPUT, usage.inputTokens);\n pushIfDefined(TokenMetrics.TOTAL_OUTPUT, usage.outputTokens);\n\n if (usage.inputDetails) {\n pushIfPositive(TokenMetrics.INPUT_TEXT, usage.inputDetails.text);\n pushIfPositive(TokenMetrics.INPUT_CACHE_READ, usage.inputDetails.cacheRead);\n pushIfPositive(TokenMetrics.INPUT_CACHE_WRITE, usage.inputDetails.cacheWrite);\n pushIfPositive(TokenMetrics.INPUT_AUDIO, usage.inputDetails.audio);\n pushIfPositive(TokenMetrics.INPUT_IMAGE, usage.inputDetails.image);\n }\n\n if (usage.outputDetails) {\n pushIfPositive(TokenMetrics.OUTPUT_TEXT, usage.outputDetails.text);\n pushIfPositive(TokenMetrics.OUTPUT_REASONING, usage.outputDetails.reasoning);\n pushIfPositive(TokenMetrics.OUTPUT_AUDIO, usage.outputDetails.audio);\n pushIfPositive(TokenMetrics.OUTPUT_IMAGE, usage.outputDetails.image);\n }\n\n return samples;\n}\n","import type { CostContext, UsageStats } from '@mastra/core/observability';\nimport type { PricingTier, PricingModel } from './pricing-model';\nimport { PricingRegistry } from './pricing-registry';\nimport { TokenMetrics, PricingMeter } from './types';\nimport { getTokenMetricSamples } from './usage-metrics';\n\nexport function estimateCosts(\n args: {\n provider: string;\n model: string;\n usage: UsageStats;\n },\n pricingRegistry: PricingRegistry | null = PricingRegistry.getGlobal(),\n): Map {\n const { provider, model, usage } = args;\n const results = new Map();\n\n const pricingModel = pricingRegistry?.get({ provider, model });\n if (!pricingModel) {\n const errorContext: CostContext = { costMetadata: { error: 'no_matching_model' }, provider, model };\n applyErrorContextForUsage(results, usage, errorContext);\n return results;\n }\n const costMetadata: Record = { pricing_id: pricingModel.id };\n\n const pricingTier = pricingModel.getPricingTierForUsage(usage);\n if (!pricingTier) {\n const errorContext: CostContext = { costMetadata: { ...costMetadata, error: 'no_matching_tier' }, provider, model };\n applyErrorContextForUsage(results, usage, errorContext);\n return results;\n }\n costMetadata['tier_index'] = pricingTier.index;\n\n const estimateFields = {\n pricingModel,\n pricingTier,\n costMetadata,\n };\n\n const inputDetailResults: Array<{ success: boolean; costContext: CostContext }> = [];\n if (usage.inputDetails?.audio) {\n const result = estimateCostForMeter({\n meter: PricingMeter.INPUT_AUDIO_TOKENS,\n tokenCount: usage.inputDetails.audio,\n ...estimateFields,\n });\n results.set(TokenMetrics.INPUT_AUDIO, result.costContext);\n inputDetailResults.push(result);\n }\n\n if (usage.inputDetails?.cacheRead) {\n const result = estimateCostForMeter({\n meter: PricingMeter.INPUT_CACHE_READ_TOKENS,\n tokenCount: usage.inputDetails.cacheRead,\n ...estimateFields,\n });\n results.set(TokenMetrics.INPUT_CACHE_READ, result.costContext);\n inputDetailResults.push(result);\n }\n\n if (usage.inputDetails?.cacheWrite) {\n const result = estimateCostForMeter({\n meter: PricingMeter.INPUT_CACHE_WRITE_TOKENS,\n tokenCount: usage.inputDetails.cacheWrite,\n ...estimateFields,\n });\n results.set(TokenMetrics.INPUT_CACHE_WRITE, result.costContext);\n inputDetailResults.push(result);\n }\n\n if (usage.inputDetails?.image) {\n const result = estimateCostForMeter({\n meter: PricingMeter.INPUT_IMAGE_TOKENS,\n tokenCount: usage.inputDetails.image,\n ...estimateFields,\n });\n results.set(TokenMetrics.INPUT_IMAGE, result.costContext);\n inputDetailResults.push(result);\n }\n\n if (usage.inputDetails?.text) {\n const result = estimateCostForMeter({\n meter: PricingMeter.INPUT_TOKENS,\n tokenCount: usage.inputDetails.text,\n ...estimateFields,\n });\n results.set(TokenMetrics.INPUT_TEXT, result.costContext);\n inputDetailResults.push(result);\n }\n\n setAggregateCostContext({\n results,\n totalMetric: TokenMetrics.TOTAL_INPUT,\n fallbackMeter: PricingMeter.INPUT_TOKENS,\n totalTokenCount: usage.inputTokens,\n detailResults: inputDetailResults,\n ...estimateFields,\n });\n\n const outputDetailResults: Array<{ success: boolean; costContext: CostContext }> = [];\n if (usage.outputDetails?.audio) {\n const result = estimateCostForMeter({\n meter: PricingMeter.OUTPUT_AUDIO_TOKENS,\n tokenCount: usage.outputDetails.audio,\n ...estimateFields,\n });\n results.set(TokenMetrics.OUTPUT_AUDIO, result.costContext);\n outputDetailResults.push(result);\n }\n\n if (usage.outputDetails?.image) {\n const result = estimateCostForMeter({\n meter: PricingMeter.OUTPUT_IMAGE_TOKENS,\n tokenCount: usage.outputDetails.image,\n ...estimateFields,\n });\n results.set(TokenMetrics.OUTPUT_IMAGE, result.costContext);\n outputDetailResults.push(result);\n }\n\n if (usage.outputDetails?.reasoning) {\n const result = estimateCostForMeter({\n meter: PricingMeter.OUTPUT_REASONING_TOKENS,\n tokenCount: usage.outputDetails.reasoning,\n ...estimateFields,\n });\n results.set(TokenMetrics.OUTPUT_REASONING, result.costContext);\n outputDetailResults.push(result);\n }\n\n if (usage.outputDetails?.text) {\n const result = estimateCostForMeter({\n meter: PricingMeter.OUTPUT_TOKENS,\n tokenCount: usage.outputDetails.text,\n ...estimateFields,\n });\n results.set(TokenMetrics.OUTPUT_TEXT, result.costContext);\n outputDetailResults.push(result);\n }\n\n setAggregateCostContext({\n results,\n totalMetric: TokenMetrics.TOTAL_OUTPUT,\n fallbackMeter: PricingMeter.OUTPUT_TOKENS,\n totalTokenCount: usage.outputTokens,\n detailResults: outputDetailResults,\n ...estimateFields,\n });\n\n return results;\n}\n\nfunction applyErrorContextForUsage(\n results: Map,\n usage: UsageStats,\n errorContext: CostContext,\n): void {\n for (const sample of getTokenMetricSamples(usage)) {\n results.set(sample.name, errorContext);\n }\n}\n\nfunction setAggregateCostContext(args: {\n results: Map;\n totalMetric: TokenMetrics;\n fallbackMeter: PricingMeter;\n totalTokenCount: number | undefined;\n detailResults: Array<{ success: boolean; costContext: CostContext }>;\n pricingModel: PricingModel;\n pricingTier: PricingTier;\n costMetadata: Record;\n}): void {\n const {\n results,\n totalMetric,\n fallbackMeter,\n totalTokenCount,\n detailResults,\n pricingModel,\n pricingTier,\n costMetadata,\n } = args;\n if (totalTokenCount == null) {\n return;\n }\n\n const successfulDetailCosts = detailResults\n .filter(result => result.success)\n .map(result => result.costContext.estimatedCost)\n .filter((value): value is number => typeof value === 'number');\n\n if (successfulDetailCosts.length > 0) {\n const hasFailedDetailCost = detailResults.some(result => !result.success);\n results.set(totalMetric, {\n provider: pricingModel.provider,\n model: pricingModel.model,\n estimatedCost: successfulDetailCosts.reduce((sum, value) => sum + value, 0),\n costUnit: pricingModel.currency,\n costMetadata: hasFailedDetailCost ? { ...costMetadata, error: 'partial_cost' } : { ...costMetadata },\n });\n return;\n }\n\n const fallbackResult = estimateCostForMeter({\n meter: fallbackMeter,\n tokenCount: totalTokenCount,\n pricingModel,\n pricingTier,\n costMetadata,\n });\n results.set(totalMetric, fallbackResult.costContext);\n}\n\nfunction estimateCostForMeter(args: {\n pricingModel: PricingModel;\n pricingTier: PricingTier;\n meter: PricingMeter;\n tokenCount: number;\n costMetadata: Record;\n}): {\n success: boolean;\n costContext: CostContext;\n} {\n const { pricingModel, pricingTier, meter, tokenCount, costMetadata } = args;\n const costContext: CostContext = {\n provider: pricingModel.provider,\n model: pricingModel.model,\n };\n const pricePerUnit = pricingTier.rates[meter];\n if (typeof pricePerUnit !== 'number') {\n return {\n success: false,\n costContext: {\n ...costContext,\n costMetadata: { ...costMetadata, error: 'no_pricing_for_usage_type' },\n },\n };\n }\n\n return {\n success: true,\n costContext: {\n ...costContext,\n estimatedCost: tokenCount * pricePerUnit,\n costUnit: pricingModel.currency,\n costMetadata: { ...costMetadata },\n },\n };\n}\n","/**\n * Emits metrics derived from live spans.\n */\n\nimport { SpanType } from '@mastra/core/observability';\nimport type {\n AnySpan,\n CostContext,\n MetricsContext,\n ModelGenerationAttributes,\n UsageStats,\n} from '@mastra/core/observability';\nimport { estimateCosts } from './estimator';\nimport { TokenMetrics } from './types';\nimport { getTokenMetricSamples } from './usage-metrics';\n\n/** Emit duration metrics for a live span. */\nexport function emitDurationMetrics(span: AnySpan, metrics: MetricsContext): void {\n const durationMetricName = getDurationMetricName(span);\n if (!durationMetricName || !span.startTime || !span.endTime) {\n return;\n }\n\n const durationMs = span.endTime.getTime() - span.startTime.getTime();\n metrics.emit(durationMetricName, durationMs, {\n status: span.errorInfo ? 'error' : 'ok',\n });\n}\n\n/** Emit token usage metrics for a model-generation span. */\nexport function emitTokenMetrics(span: AnySpan, metrics: MetricsContext): void {\n if (span.type !== SpanType.MODEL_GENERATION) {\n return;\n }\n\n const attrs = span.attributes as ModelGenerationAttributes | undefined;\n if (!attrs?.usage) {\n return;\n }\n\n emitUsageMetrics(attrs, attrs.usage, metrics);\n}\n\n/**\n * Emit token usage metrics from an explicit usage payload, using the supplied\n * metrics context (which carries entity / parent / root labels) and the\n * supplied provider+model for cost lookup.\n *\n * Used when an internal MODEL_GENERATION's usage is rolled up to a visible\n * ancestor span: the metric labels come from the ancestor's context, the\n * cost calculation still uses the original model that incurred the tokens.\n */\nexport function emitTokenMetricsForUsage(\n usage: UsageStats,\n provider: string | undefined,\n model: string | undefined,\n metrics: MetricsContext,\n): void {\n emitUsageMetrics({ provider, model } as ModelGenerationAttributes, usage, metrics);\n}\n\n/** Emit all auto-extracted metrics for a live span end. */\nexport function emitAutoExtractedMetrics(span: AnySpan, metrics: MetricsContext): void {\n emitDurationMetrics(span, metrics);\n emitTokenMetrics(span, metrics);\n}\n\nfunction emitUsageMetrics(\n attrs: ModelGenerationAttributes,\n usage: NonNullable,\n metrics: MetricsContext,\n): void {\n let metricCosts = new Map();\n const providedCostContext = getProvidedCostContext(attrs, usage);\n if (providedCostContext) {\n metricCosts = providedCostContext;\n } else {\n try {\n const provider = attrs.provider;\n const model = attrs.responseModel ?? attrs.model;\n\n if (provider && model) {\n metricCosts = estimateCosts({\n provider,\n model,\n usage,\n });\n }\n } catch {\n metricCosts = new Map();\n }\n }\n\n const emit = (name: TokenMetrics, value: number) => {\n const costContext = metricCosts.get(name);\n if (!costContext) {\n metrics.emit(name, value);\n return;\n }\n\n metrics.emit(name, value, undefined, { costContext });\n };\n\n for (const sample of getTokenMetricSamples(usage)) {\n emit(sample.name, sample.value);\n }\n}\n\nfunction getProvidedCostContext(\n attrs: ModelGenerationAttributes,\n usage: NonNullable,\n): Map | undefined {\n const costContext = attrs.costContext;\n if (typeof costContext?.estimatedCost !== 'number') {\n return undefined;\n }\n\n const carrierMetric = usage.inputTokens !== undefined ? TokenMetrics.TOTAL_INPUT : TokenMetrics.TOTAL_OUTPUT;\n const provider = costContext.provider ?? attrs.provider;\n const model = costContext.model ?? attrs.responseModel ?? attrs.model;\n const contexts = new Map();\n\n for (const sample of getTokenMetricSamples(usage)) {\n contexts.set(sample.name, {\n provider,\n model,\n });\n }\n\n contexts.set(carrierMetric, {\n ...costContext,\n provider,\n model,\n costMetadata: {\n ...costContext.costMetadata,\n allocation: 'query_total',\n },\n });\n\n return contexts;\n}\n\nfunction getDurationMetricName(span: AnySpan): string | null {\n switch (span.type) {\n case SpanType.AGENT_RUN:\n return 'mastra_agent_duration_ms';\n case SpanType.TOOL_CALL:\n case SpanType.MCP_TOOL_CALL:\n return 'mastra_tool_duration_ms';\n case SpanType.CLIENT_TOOL_CALL:\n // The CLIENT_TOOL_CALL server span measures only carrier emission\n // and args capture. The actual client execution duration is\n // emitted by the client observability proxy using the wall-clock\n // duration measured in @mastra/client-js.\n return null;\n case SpanType.WORKFLOW_RUN:\n return 'mastra_workflow_duration_ms';\n case SpanType.MODEL_GENERATION:\n return 'mastra_model_duration_ms';\n case SpanType.PROCESSOR_RUN:\n return 'mastra_processor_duration_ms';\n default:\n return null;\n }\n}\n","/**\n * CardinalityFilter - Prevents metric cardinality explosion.\n *\n * Filters out high-cardinality labels (like trace_id, user_id) and\n * optionally blocks UUID-like values in labels.\n */\n\nimport type { CardinalityConfig } from '@mastra/core/observability';\nimport { DEFAULT_BLOCKED_LABELS } from '@mastra/core/observability';\n\n/** Matches standard UUID v4 strings (case-insensitive). */\nconst UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nexport class CardinalityFilter {\n private blockedLabels: Set;\n private blockUUIDs: boolean;\n\n /**\n * @param config - Optional configuration. When omitted, uses\n * {@link DEFAULT_BLOCKED_LABELS} and blocks UUID-valued labels.\n */\n constructor(config?: CardinalityConfig) {\n const blocked = config?.blockedLabels ?? [...DEFAULT_BLOCKED_LABELS];\n this.blockedLabels = new Set(blocked.map(l => l.toLowerCase()));\n this.blockUUIDs = config?.blockUUIDs ?? true;\n }\n\n /**\n * Return a copy of `labels` with blocked keys and UUID values removed.\n *\n * @param labels - Raw metric labels to filter.\n * @returns A new object containing only the allowed labels.\n */\n filterLabels(labels: Record): Record {\n const filtered: Record = {};\n\n for (const [key, value] of Object.entries(labels)) {\n if (this.blockedLabels.has(key.toLowerCase())) {\n continue;\n }\n\n if (this.blockUUIDs && UUID_REGEX.test(value)) {\n continue;\n }\n\n filtered[key] = value;\n }\n\n return filtered;\n }\n}\n","/**\n * Usage extraction utilities for converting AI SDK usage to Mastra UsageStats\n */\n\nimport type { InputTokenDetails, OutputTokenDetails, UsageStats } from '@mastra/core/observability';\nimport type { LanguageModelUsage, ProviderMetadata } from '@mastra/core/stream';\n\n/**\n * Provider-specific metadata shapes for type-safe access.\n * These match the actual shapes from AI SDK providers.\n */\ninterface AnthropicMetadata {\n cacheReadInputTokens?: number;\n cacheCreationInputTokens?: number;\n}\n\ninterface GoogleUsageMetadata {\n cachedContentTokenCount?: number;\n thoughtsTokenCount?: number;\n}\n\ninterface GoogleMetadata {\n usageMetadata?: GoogleUsageMetadata;\n}\n\ninterface V3InputUsage {\n total?: number;\n noCache?: number;\n cacheRead?: number;\n cacheWrite?: number;\n}\n\ninterface V3RawUsage {\n inputTokens?: V3InputUsage;\n}\n\nfunction isV3RawUsage(raw: unknown): raw is V3RawUsage {\n return typeof raw === 'object' && raw !== null && 'inputTokens' in raw;\n}\n\n/**\n * AI SDK aggregated input token details.\n * Available on totalUsage in multi-step runs - properly summed across all steps.\n */\ninterface AISdkInputTokenDetails {\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n}\n\n/**\n * Null-safe check: returns true if value is a number (including 0).\n */\nfunction isDefined(value: unknown): value is number {\n return value != null;\n}\n\n/**\n * Extracts and normalizes token usage from AI SDK response, including\n * provider-specific cache tokens from providerMetadata.\n *\n * Cache token extraction priority (highest to lowest):\n * 1. AI SDK aggregated inputTokenDetails (properly summed across all steps in multi-step runs)\n * 2. Mastra-aggregated top-level usage fields (usage.cachedInputTokens, usage.cacheCreationInputTokens) -\n * summed across steps by RunOutput, so they are correct for multi-step runs.\n * 3. Provider-specific providerMetadata (accurate for single-step, LAST STEP ONLY in multi-step).\n *\n * Handles:\n * - OpenAI: cachedInputTokens in usage object\n * - Anthropic: cacheCreationInputTokens, cacheReadInputTokens in providerMetadata.anthropic\n * - Google/Gemini: cachedContentTokenCount, thoughtsTokenCount in providerMetadata.google.usageMetadata\n * - OpenRouter: Uses OpenAI-compatible structure (cache tokens in usage)\n *\n * @param usage - The LanguageModelV2Usage from AI SDK response\n * @param providerMetadata - Optional provider-specific metadata\n * @returns UsageStats with inputDetails and outputDetails\n */\nexport function extractUsageMetrics(usage?: LanguageModelUsage, providerMetadata?: ProviderMetadata): UsageStats {\n if (!usage) {\n return {};\n }\n\n const inputDetails: InputTokenDetails = {};\n const outputDetails: OutputTokenDetails = {};\n\n let inputTokens = usage.inputTokens;\n const outputTokens = usage.outputTokens;\n\n // ===== AI SDK aggregated format (inputTokenDetails) =====\n // In multi-step runs, providerMetadata only reflects the LAST step.\n // AI SDK's inputTokenDetails is properly aggregated across all steps,\n // so we prefer it as the primary source for cache tokens.\n const aiSdkDetails = (usage as { inputTokenDetails?: AISdkInputTokenDetails }).inputTokenDetails;\n\n if (isDefined(aiSdkDetails?.cacheReadTokens)) {\n inputDetails.cacheRead = aiSdkDetails.cacheReadTokens;\n }\n if (isDefined(aiSdkDetails?.cacheWriteTokens)) {\n inputDetails.cacheWrite = aiSdkDetails.cacheWriteTokens;\n }\n\n // Mastra-aggregated fields — summed across steps by RunOutput; prefer over per-step providerMetadata.\n if (!isDefined(inputDetails.cacheRead) && isDefined(usage.cachedInputTokens)) {\n inputDetails.cacheRead = usage.cachedInputTokens;\n }\n if (!isDefined(inputDetails.cacheWrite) && isDefined(usage.cacheCreationInputTokens)) {\n inputDetails.cacheWrite = usage.cacheCreationInputTokens;\n }\n\n // reasoningTokens from usage (OpenAI o1 models)\n if (isDefined(usage.reasoningTokens)) {\n outputDetails.reasoning = usage.reasoningTokens;\n }\n\n // ===== Anthropic =====\n // Cache tokens are in providerMetadata.anthropic\n // inputTokens does NOT include cache tokens - need to sum them\n const anthropic = providerMetadata?.anthropic as AnthropicMetadata | undefined;\n\n if (anthropic) {\n const rawV3InputUsage = isV3RawUsage(usage.raw) ? usage.raw.inputTokens : undefined;\n const hasV3CachedTotals =\n rawV3InputUsage?.total !== undefined &&\n (rawV3InputUsage.cacheRead !== undefined || rawV3InputUsage.cacheWrite !== undefined);\n\n if (!isDefined(inputDetails.cacheRead) && isDefined(anthropic.cacheReadInputTokens)) {\n inputDetails.cacheRead = anthropic.cacheReadInputTokens;\n }\n if (!isDefined(inputDetails.cacheWrite) && isDefined(anthropic.cacheCreationInputTokens)) {\n inputDetails.cacheWrite = anthropic.cacheCreationInputTokens;\n }\n\n // Skip adjustment when inputTokens already includes cache tokens (V3 raw or any positive Mastra-aggregated cache field).\n const inputAlreadyIncludesCache =\n hasV3CachedTotals ||\n (isDefined(usage.cachedInputTokens) && usage.cachedInputTokens > 0) ||\n (isDefined(usage.cacheCreationInputTokens) && usage.cacheCreationInputTokens > 0);\n\n if (!inputAlreadyIncludesCache && (isDefined(inputDetails.cacheRead) || isDefined(inputDetails.cacheWrite))) {\n inputTokens = (usage.inputTokens ?? 0) + (inputDetails.cacheRead ?? 0) + (inputDetails.cacheWrite ?? 0);\n }\n }\n\n // ===== Google/Gemini =====\n // Cache tokens and thoughts are in providerMetadata.google.usageMetadata\n const google = providerMetadata?.google as GoogleMetadata | undefined;\n\n if (google?.usageMetadata) {\n if (!isDefined(inputDetails.cacheRead) && isDefined(google.usageMetadata.cachedContentTokenCount)) {\n inputDetails.cacheRead = google.usageMetadata.cachedContentTokenCount;\n }\n // Gemini \"thoughts\" are similar to reasoning tokens\n if (isDefined(google.usageMetadata.thoughtsTokenCount)) {\n outputDetails.reasoning = google.usageMetadata.thoughtsTokenCount;\n }\n }\n\n if (isDefined(inputTokens)) {\n inputDetails.text = Math.max(\n 0,\n inputTokens - sumDefinedValues(inputDetails, ['cacheRead', 'cacheWrite', 'audio', 'image']),\n );\n }\n\n if (isDefined(outputTokens)) {\n outputDetails.text = Math.max(0, outputTokens - sumDefinedValues(outputDetails, ['reasoning', 'audio', 'image']));\n }\n\n // Build the final UsageStats object\n const result: UsageStats = {\n inputTokens,\n outputTokens,\n };\n\n // Only include details if there's data\n if (Object.keys(inputDetails).length > 0) {\n result.inputDetails = inputDetails;\n }\n if (Object.keys(outputDetails).length > 0) {\n result.outputDetails = outputDetails;\n }\n\n return result;\n}\n\nfunction sumDefinedValues(obj: T, keys: K[]): number {\n return keys.reduce((sum, key) => sum + ((obj[key] as number | undefined) ?? 0), 0);\n}\n\nfunction addOptional(a: number | undefined, b: number | undefined): number | undefined {\n if (a === undefined && b === undefined) return undefined;\n return (a ?? 0) + (b ?? 0);\n}\n\nfunction mergeInputDetails(\n a: InputTokenDetails | undefined,\n b: InputTokenDetails | undefined,\n): InputTokenDetails | undefined {\n if (!a) return b ? { ...b } : undefined;\n if (!b) return { ...a };\n return {\n text: addOptional(a.text, b.text),\n cacheRead: addOptional(a.cacheRead, b.cacheRead),\n cacheWrite: addOptional(a.cacheWrite, b.cacheWrite),\n audio: addOptional(a.audio, b.audio),\n image: addOptional(a.image, b.image),\n };\n}\n\nfunction mergeOutputDetails(\n a: OutputTokenDetails | undefined,\n b: OutputTokenDetails | undefined,\n): OutputTokenDetails | undefined {\n if (!a) return b ? { ...b } : undefined;\n if (!b) return { ...a };\n return {\n text: addOptional(a.text, b.text),\n reasoning: addOptional(a.reasoning, b.reasoning),\n audio: addOptional(a.audio, b.audio),\n image: addOptional(a.image, b.image),\n };\n}\n\n/**\n * Sum two UsageStats into a new one. Treats undefined fields as zero when\n * the other side has a value, and preserves undefined when both are absent.\n * Used to roll up internal model-generation usage onto a visible ancestor\n * span so cost / token attribution survives internal-span filtering.\n */\nexport function addUsageStats(a: UsageStats | undefined, b: UsageStats): UsageStats {\n if (!a) {\n return {\n ...b,\n inputDetails: b.inputDetails ? { ...b.inputDetails } : undefined,\n outputDetails: b.outputDetails ? { ...b.outputDetails } : undefined,\n };\n }\n return {\n inputTokens: addOptional(a.inputTokens, b.inputTokens),\n outputTokens: addOptional(a.outputTokens, b.outputTokens),\n inputDetails: mergeInputDetails(a.inputDetails, b.inputDetails),\n outputDetails: mergeOutputDetails(a.outputDetails, b.outputDetails),\n };\n}\n","/**\n * Model Span Tracing\n *\n * Provides span tracking for Model generations, including:\n * - MODEL_STEP spans (one per Model API call - includes processors and tool executions)\n * - MODEL_INFERENCE spans (the provider call itself - model latency only)\n * - MODEL_CHUNK spans (individual streaming chunks within an inference)\n *\n * Hierarchy: MODEL_GENERATION -> MODEL_STEP -> MODEL_INFERENCE -> MODEL_CHUNK\n *\n * Processors and tool executions remain children of MODEL_STEP (siblings of\n * MODEL_INFERENCE), so MODEL_INFERENCE measures pure model time.\n */\n\nimport { TransformStream } from 'node:stream/web';\nimport { coreFeatures } from '@mastra/core/features';\nimport { SpanType } from '@mastra/core/observability';\nimport type {\n Span,\n EndGenerationOptions,\n ErrorSpanOptions,\n ModelInferenceContext,\n TracingContext,\n UpdateSpanOptions,\n} from '@mastra/core/observability';\nimport type { ChunkType, StepStartPayload, StepFinishPayload } from '@mastra/core/stream';\n\n/**\n * Feature gate for MODEL_INFERENCE spans. When the installed @mastra/core\n * predates the feature flag, `SpanType.MODEL_INFERENCE` resolves to undefined\n * at runtime; in that case the tracker falls back to parenting MODEL_CHUNK\n * spans directly under MODEL_STEP (the pre-MODEL_INFERENCE behavior).\n *\n * Read at every call so tests can toggle the flag between cases. The set\n * lookup is O(1) and not on a hot path.\n */\nfunction supportsModelInference(): boolean {\n return coreFeatures.has('model-inference-span');\n}\n\nimport { extractUsageMetrics } from './usage';\n\ntype StepInputPreview = Array<{ role: string; content: string }> | Record | string | undefined;\n\nfunction formatPreviewLabel(label: unknown, fallback: string): string {\n return typeof label === 'string' && label.length > 0 ? label : fallback;\n}\n\nfunction summarizePart(part: unknown): string {\n if (typeof part === 'string') {\n return part;\n }\n\n if (!part || typeof part !== 'object') {\n return '';\n }\n\n if ('text' in part && typeof part.text === 'string') {\n return part.text;\n }\n\n if ('parts' in part && Array.isArray(part.parts)) {\n return part.parts.map(summarizePart).filter(Boolean).join('');\n }\n\n if ('inlineData' in part && part.inlineData && typeof part.inlineData === 'object') {\n return `[${formatPreviewLabel((part.inlineData as { mimeType?: unknown }).mimeType, 'binary')}]`;\n }\n\n if ('image_url' in part) {\n return '[image]';\n }\n\n if ('functionCall' in part && part.functionCall && typeof part.functionCall === 'object') {\n return `[tool: ${formatPreviewLabel((part.functionCall as { name?: unknown }).name, 'unknown')}]`;\n }\n\n if ('function_call' in part && part.function_call && typeof part.function_call === 'object') {\n return `[tool: ${formatPreviewLabel((part.function_call as { name?: unknown }).name, 'unknown')}]`;\n }\n\n if ('function' in part && part.function && typeof part.function === 'object') {\n return `[tool: ${formatPreviewLabel((part.function as { name?: unknown }).name, 'unknown')}]`;\n }\n\n if ('toolName' in part) {\n return `[tool: ${formatPreviewLabel((part as { toolName?: unknown }).toolName, 'unknown')}]`;\n }\n\n if ('type' in part && typeof part.type === 'string') {\n switch (part.type) {\n case 'image':\n return '[image]';\n case 'file':\n return '[file]';\n case 'reasoning':\n return '[reasoning]';\n case 'tool-call':\n return `[tool: ${formatPreviewLabel((part as { toolName?: unknown }).toolName, 'unknown')}]`;\n case 'tool-result':\n return '[tool-result]';\n default:\n return `[${part.type}]`;\n }\n }\n\n if ('content' in part && typeof part.content === 'string') {\n return part.content;\n }\n\n return '[object]';\n}\n\nfunction summarizeMessageContent(content: unknown): string {\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content)) {\n return content.map(summarizePart).filter(Boolean).join('');\n }\n\n if (content && typeof content === 'object') {\n if ('parts' in content && Array.isArray(content.parts)) {\n return content.parts.map(summarizePart).filter(Boolean).join('');\n }\n\n return summarizePart(content);\n }\n\n if (content == null) {\n return '';\n }\n\n return String(content);\n}\n\nfunction appendToolPreview(preview: string, toolCalls: unknown): string {\n if (!Array.isArray(toolCalls) || toolCalls.length === 0) {\n return preview;\n }\n\n const toolPreview = toolCalls\n .map(toolCall => summarizePart(toolCall))\n .filter(Boolean)\n .join(' ');\n\n if (!toolPreview) {\n return preview;\n }\n\n return preview ? `${preview} ${toolPreview}` : toolPreview;\n}\n\nfunction appendPreview(preview: string, addition: string): string {\n if (!addition) {\n return preview;\n }\n\n return preview ? `${preview} ${addition}` : addition;\n}\n\nfunction normalizeMessages(messages: unknown[]): Array<{ role: string; content: string }> {\n return messages.map(message => {\n if (!message || typeof message !== 'object') {\n return { role: 'user', content: summarizeMessageContent(message) };\n }\n\n const role = typeof (message as { role?: unknown }).role === 'string' ? (message as { role: string }).role : 'user';\n\n const baseContent = summarizeMessageContent((message as { content?: unknown }).content);\n const contentWithToolArrays = appendToolPreview(\n appendToolPreview(baseContent, (message as { toolCalls?: unknown }).toolCalls),\n (message as { tool_calls?: unknown }).tool_calls,\n );\n const functionCall = (message as { functionCall?: unknown }).functionCall;\n const functionCallPreview = functionCall === undefined ? '' : summarizePart({ functionCall });\n const functionCallSnakeCase = (message as { function_call?: unknown }).function_call;\n const functionCallSnakeCasePreview =\n functionCallSnakeCase === undefined ? '' : summarizePart({ function_call: functionCallSnakeCase });\n const contentWithFunctionCall = appendPreview(\n appendPreview(contentWithToolArrays, functionCallPreview),\n functionCallSnakeCasePreview,\n );\n\n return { role, content: contentWithFunctionCall };\n });\n}\n\nfunction summarizeRequestBody(body: unknown): StepInputPreview {\n if (body == null) {\n return undefined;\n }\n\n if (typeof body !== 'object') {\n return typeof body === 'string' ? body : String(body);\n }\n\n if (Array.isArray((body as { messages?: unknown }).messages)) {\n return normalizeMessages((body as { messages: unknown[] }).messages);\n }\n\n if (Array.isArray((body as { input?: unknown }).input)) {\n return normalizeMessages((body as { input: unknown[] }).input);\n }\n\n if (Array.isArray((body as { contents?: unknown }).contents)) {\n return (body as { contents: Array<{ role?: unknown; parts?: unknown[] }> }).contents.map(item => ({\n role: typeof item?.role === 'string' ? item.role : 'user',\n content: Array.isArray(item?.parts) ? item.parts.map(summarizePart).filter(Boolean).join('') : '',\n }));\n }\n\n const summary: Record = {};\n\n if (typeof (body as { model?: unknown }).model === 'string') {\n summary.model = (body as { model: string }).model;\n }\n\n const bodyKeys = Object.keys(body as Record).filter(key => key !== 'body');\n if (bodyKeys.length > 0) {\n summary.keys = bodyKeys;\n }\n\n return Object.keys(summary).length > 0 ? summary : '[request body]';\n}\n\n/**\n * Extract a shallow conversation preview for model_step span input.\n */\nfunction extractStepInput(payload?: StepStartPayload): StepInputPreview {\n if (Array.isArray(payload?.inputMessages)) {\n return normalizeMessages(payload.inputMessages);\n }\n\n const request = payload?.request;\n if (!request) return undefined;\n\n const { body } = request;\n if (body == null) return request;\n\n try {\n const parsed = typeof body === 'string' ? JSON.parse(body) : body;\n return summarizeRequestBody(parsed);\n } catch {\n // body was not valid JSON; return as-is\n return request;\n }\n}\n\n/**\n * Manages MODEL_STEP and MODEL_CHUNK span tracking for streaming Model responses.\n *\n * Should be instantiated once per MODEL_GENERATION span and shared across\n * all streaming steps (including after tool calls).\n */\nexport class ModelSpanTracker {\n #modelSpan?: Span;\n #currentStepSpan?: Span;\n #currentInferenceSpan?: Span;\n #currentChunkSpan?: Span;\n #currentChunkType?: string;\n #accumulator: Record = {};\n #stepIndex: number = 0;\n #chunkSequence: number = 0;\n #completionStartTime?: Date;\n #currentStepInputIsFinal: boolean = false;\n /** When true, step-finish chunks don't auto-close the step span (for durable execution) */\n #deferStepClose: boolean = false;\n /** Stored step-finish payload when defer mode is enabled */\n #pendingStepFinishPayload?: StepFinishPayload;\n /** Static request-side context applied to every MODEL_INFERENCE span */\n #inferenceContext?: ModelInferenceContext;\n\n constructor(modelSpan?: Span) {\n this.#modelSpan = modelSpan;\n }\n\n /**\n * Set request-side context applied to subsequent MODEL_INFERENCE spans.\n * No-op when paired with an older @mastra/core that lacks the feature flag.\n */\n setInferenceContext(context: ModelInferenceContext): void {\n this.#inferenceContext = context;\n }\n\n /**\n * Capture the completion start time (time to first token) when the first content chunk arrives.\n */\n #captureCompletionStartTime(): void {\n if (this.#completionStartTime) {\n return;\n }\n this.#completionStartTime = new Date();\n }\n\n /**\n * Get the tracing context for creating child spans.\n * Returns the current step span if active, otherwise the model span.\n */\n getTracingContext(): TracingContext {\n return {\n currentSpan: this.#currentStepSpan ?? this.#modelSpan,\n };\n }\n\n /**\n * Report an error on the generation span, also closing any still-open\n * MODEL_INFERENCE / MODEL_STEP children so a fatal error before step-finish\n * doesn't leave them dangling. No-op if they were already closed.\n */\n reportGenerationError(options: ErrorSpanOptions): void {\n if (this.#currentInferenceSpan) {\n this.#currentInferenceSpan.error({ error: options.error, endSpan: true });\n this.#currentInferenceSpan = undefined;\n }\n if (this.#currentStepSpan) {\n this.#currentStepSpan.error({ error: options.error, endSpan: true });\n this.#currentStepSpan = undefined;\n }\n this.#modelSpan?.error(options);\n }\n\n /**\n * End the generation span with optional raw usage data.\n * If usage is provided, it will be converted to UsageStats with cache token details.\n */\n endGeneration(options?: EndGenerationOptions): void {\n const { usage, providerMetadata, ...spanOptions } = options ?? {};\n\n if (spanOptions.attributes) {\n spanOptions.attributes.completionStartTime = this.#completionStartTime;\n spanOptions.attributes.usage = extractUsageMetrics(usage, providerMetadata);\n }\n\n this.#modelSpan?.end(spanOptions);\n }\n\n /**\n * Update the generation span\n */\n updateGeneration(options: UpdateSpanOptions): void {\n this.#modelSpan?.update(options);\n }\n\n /**\n * Enable or disable deferred step closing for durable execution.\n * When enabled, step-finish chunks won't automatically close the step span.\n * Use exportCurrentStep() to get the span data, then close it manually later.\n */\n setDeferStepClose(defer: boolean): void {\n this.#deferStepClose = defer;\n }\n\n /**\n * Export the current step span for later rebuilding (durable execution).\n * Returns undefined if no step span is active.\n */\n exportCurrentStep(): ReturnType['exportSpan']> | undefined {\n return this.#currentStepSpan?.exportSpan();\n }\n\n /**\n * Get the pending step finish payload (captured when defer mode is enabled).\n * This contains usage, finishReason, etc. for closing the step later.\n */\n getPendingStepFinishPayload(): StepFinishPayload | undefined {\n return this.#pendingStepFinishPayload;\n }\n\n /**\n * Set the starting step index for durable execution.\n * Used when resuming across agentic loop iterations to maintain step continuity.\n */\n setStepIndex(index: number): void {\n this.#stepIndex = index;\n }\n\n /**\n * Get the current step index.\n */\n getStepIndex(): number {\n return this.#stepIndex;\n }\n\n /**\n * Start a new Model execution step.\n * This should be called at the beginning of LLM execution to capture accurate startTime.\n * The step-start chunk payload can be passed later via updateStep() if needed.\n *\n * Note: this only opens MODEL_STEP. The MODEL_INFERENCE child span is opened\n * separately via startInference() so its duration excludes input processor work.\n * Callers that don't call startInference() explicitly will get one auto-created\n * when the first model chunk arrives.\n */\n startStep(payload?: StepStartPayload): void {\n // Don't create duplicate step spans\n if (this.#currentStepSpan) {\n return;\n }\n\n const input = extractStepInput(payload);\n this.#currentStepSpan = this.#modelSpan?.createChildSpan({\n name: `step: ${this.#stepIndex}`,\n type: SpanType.MODEL_STEP,\n attributes: {\n stepIndex: this.#stepIndex,\n ...(payload?.messageId ? { messageId: payload.messageId } : {}),\n ...(payload?.warnings?.length ? { warnings: payload.warnings } : {}),\n },\n input,\n tracingPolicy: this.#modelSpan?.tracingPolicy,\n });\n this.#currentStepInputIsFinal = Array.isArray(payload?.inputMessages);\n // Reset chunk sequence for new step\n this.#chunkSequence = 0;\n }\n\n /**\n * End the current MODEL_INFERENCE span when the provider stream finishes.\n * Fields are duplicated onto MODEL_STEP (in #endStepSpan) so existing\n * integrations that read usage/finishReason from the step span continue\n * to work unchanged.\n *\n * Safe to call multiple times - no-ops if the span is already closed.\n */\n #endInferenceSpan(payload: StepFinishPayload): void {\n if (!this.#currentInferenceSpan) return;\n\n const { usage: rawUsage, ...otherOutput } = payload.output;\n const usage = extractUsageMetrics(rawUsage, payload.metadata?.providerMetadata);\n\n this.#currentInferenceSpan.end({\n output: otherOutput,\n attributes: {\n usage,\n finishReason: payload.stepResult.reason,\n warnings: payload.stepResult.warnings,\n completionStartTime: this.#completionStartTime,\n },\n });\n this.#currentInferenceSpan = undefined;\n }\n\n /**\n * Open the MODEL_INFERENCE span for the current step. Chunks (including tool-call\n * chunks emitted by the model) parent under this span so its duration reflects\n * pure model latency.\n *\n * Should be called immediately before invoking the model — after any input\n * processors / `prepareStep` work has completed — so the span's startTime\n * does not include processor time. The latest `#inferenceContext` (set via\n * setInferenceContext) is snapshotted onto the span at creation.\n *\n * No-ops when the installed @mastra/core lacks the `model-inference-span`\n * feature flag, or when called without an active step span. Auto-invoked from\n * chunk handlers as a safety net; explicit callers get the most accurate\n * start time.\n */\n startInference(payload?: StepStartPayload): void {\n if (!supportsModelInference()) {\n return;\n }\n if (!this.#currentStepSpan || this.#currentInferenceSpan) {\n return;\n }\n\n const input = extractStepInput(payload);\n const generationAttrs = this.#modelSpan?.attributes;\n const ctx = this.#inferenceContext;\n this.#currentInferenceSpan = this.#currentStepSpan.createChildSpan({\n name: `inference: ${this.#stepIndex}`,\n type: SpanType.MODEL_INFERENCE,\n attributes: {\n stepIndex: this.#stepIndex,\n model: generationAttrs?.model,\n provider: generationAttrs?.provider,\n streaming: generationAttrs?.streaming,\n ...(ctx?.parameters !== undefined ? { parameters: ctx.parameters } : {}),\n ...(ctx?.providerOptions !== undefined ? { providerOptions: ctx.providerOptions } : {}),\n ...(ctx?.availableTools !== undefined ? { availableTools: ctx.availableTools } : {}),\n ...(ctx?.toolChoice !== undefined ? { toolChoice: ctx.toolChoice } : {}),\n ...(ctx?.responseFormat !== undefined ? { responseFormat: ctx.responseFormat } : {}),\n },\n input,\n tracingPolicy: this.#modelSpan?.tracingPolicy,\n });\n }\n\n /**\n * Update the current step span with additional payload data.\n * Called when step-start chunk arrives with request/warnings info.\n */\n updateStep(payload?: StepStartPayload): void {\n if (!this.#currentStepSpan || !payload) {\n return;\n }\n\n const hasFinalInput = Array.isArray(payload.inputMessages);\n const input = hasFinalInput || !this.#currentStepInputIsFinal ? extractStepInput(payload) : undefined;\n\n // Update span with request/warnings from the step-start chunk\n this.#currentStepSpan.update({\n ...(input !== undefined ? { input } : {}),\n attributes: {\n ...(payload.messageId ? { messageId: payload.messageId } : {}),\n ...(payload.warnings?.length ? { warnings: payload.warnings } : {}),\n },\n });\n if (hasFinalInput) {\n this.#currentStepInputIsFinal = true;\n }\n }\n\n /**\n * End the current Model execution step with token usage, finish reason, output, and metadata\n */\n #endStepSpan(payload: StepFinishPayload) {\n // Flush any pending chunk span before ending the step\n // (handles case where text-delta arrives without text-end)\n this.#endChunkSpan();\n\n if (!this.#currentStepSpan) return;\n\n // Extract all data from step-finish chunk\n const output = payload.output;\n const { usage: rawUsage, ...otherOutput } = output;\n const stepResult = payload.stepResult;\n const metadata = payload.metadata;\n\n // Convert raw usage to UsageStats with cache token details\n const usage = extractUsageMetrics(rawUsage, metadata?.providerMetadata);\n\n // Remove verbose/redundant fields from metadata:\n // - request: too verbose\n // - id/timestamp: chunk-level data, not step-related\n // - modelId/modelVersion/modelProvider: duplicates of modelMetadata\n const cleanMetadata = metadata ? { ...metadata } : undefined;\n if (cleanMetadata) {\n for (const key of ['request', 'id', 'timestamp', 'modelId', 'modelVersion', 'modelProvider']) {\n delete cleanMetadata[key];\n }\n }\n\n // Inference may already be closed (closed eagerly on step-finish in defer\n // mode so its duration reflects pure model latency, not subsequent tool\n // execution). Close it here for the non-deferred path.\n this.#endInferenceSpan(payload);\n\n this.#currentStepSpan.end({\n output: otherOutput,\n attributes: {\n usage,\n isContinued: stepResult.isContinued,\n finishReason: stepResult.reason,\n warnings: stepResult.warnings,\n },\n metadata: {\n ...cleanMetadata,\n },\n });\n this.#currentStepSpan = undefined;\n this.#currentStepInputIsFinal = false;\n this.#stepIndex++;\n }\n\n /**\n * Returns the parent span for chunks. Chunks parent under MODEL_INFERENCE\n * (the provider call) when available, falling back to MODEL_STEP only if\n * startStep() was bypassed.\n */\n #chunkParent(): Span | Span | undefined {\n return this.#currentInferenceSpan ?? this.#currentStepSpan;\n }\n\n /**\n * Safety-net invoked from chunk handlers: auto-create MODEL_STEP and\n * MODEL_INFERENCE if a chunk arrives before the loop has explicitly opened\n * them, so chunks parent under MODEL_INFERENCE rather than falling through\n * to MODEL_STEP. Idempotent — each public start* method is itself a no-op\n * when its span is already live.\n */\n #ensureStepAndInference(): void {\n if (!this.#currentStepSpan) {\n this.startStep();\n }\n if (!this.#currentInferenceSpan) {\n this.startInference();\n }\n }\n\n /**\n * Create a new chunk span (for multi-part chunks like text-start/delta/end)\n */\n #startChunkSpan(chunkType: string, initialData?: Record) {\n // End any existing chunk span before starting a new one\n // (handles transitions like text-delta → tool-call without text-end)\n this.#endChunkSpan();\n\n this.#ensureStepAndInference();\n\n this.#currentChunkSpan = this.#chunkParent()?.createChildSpan({\n name: `chunk: '${chunkType}'`,\n type: SpanType.MODEL_CHUNK,\n attributes: {\n chunkType,\n sequenceNumber: this.#chunkSequence,\n },\n tracingPolicy: this.#modelSpan?.tracingPolicy,\n });\n this.#currentChunkType = chunkType;\n this.#accumulator = initialData || {};\n }\n\n /**\n * Append string content to a specific field in the accumulator\n */\n #appendToAccumulator(field: string, text: string) {\n if (this.#accumulator[field] === undefined) {\n this.#accumulator[field] = text;\n } else {\n this.#accumulator[field] += text;\n }\n }\n\n /**\n * End the current chunk span.\n * Safe to call multiple times - will no-op if span already ended.\n */\n #endChunkSpan(output?: any) {\n if (!this.#currentChunkSpan) return;\n\n this.#currentChunkSpan.end({\n output: output !== undefined ? output : this.#accumulator,\n });\n this.#currentChunkSpan = undefined;\n this.#currentChunkType = undefined;\n this.#accumulator = {};\n this.#chunkSequence++;\n }\n\n /**\n * Create an event span (for single chunks like tool-call)\n */\n #createEventSpan(\n chunkType: string,\n output: any,\n options?: { attributes?: Record; metadata?: Record },\n ) {\n this.#ensureStepAndInference();\n\n const span = this.#chunkParent()?.createEventSpan({\n name: `chunk: '${chunkType}'`,\n type: SpanType.MODEL_CHUNK,\n attributes: {\n chunkType,\n sequenceNumber: this.#chunkSequence,\n ...options?.attributes,\n },\n metadata: options?.metadata,\n output,\n tracingPolicy: this.#modelSpan?.tracingPolicy,\n });\n\n if (span) {\n this.#chunkSequence++;\n }\n }\n\n /**\n * Check if there is currently an active chunk span\n */\n #hasActiveChunkSpan(): boolean {\n return !!this.#currentChunkSpan;\n }\n\n /**\n * Get the current accumulator value\n */\n #getAccumulator(): Record {\n return this.#accumulator;\n }\n\n /**\n * Handle text chunk spans (text-start/delta/end)\n */\n #handleTextChunk(chunk: ChunkType) {\n switch (chunk.type) {\n case 'text-start':\n this.#startChunkSpan('text');\n break;\n\n case 'text-delta':\n // Auto-create span if we receive text-delta without text-start\n // (AI SDK streaming doesn't always emit wrapper events)\n // Allow transition from any other chunk type\n if (this.#currentChunkType !== 'text') {\n this.#startChunkSpan('text');\n }\n this.#appendToAccumulator('text', chunk.payload.text);\n break;\n\n case 'text-end': {\n this.#endChunkSpan();\n break;\n }\n }\n }\n\n /**\n * Handle reasoning chunk spans (reasoning-start/delta/end)\n */\n #handleReasoningChunk(chunk: ChunkType) {\n switch (chunk.type) {\n case 'reasoning-start':\n this.#startChunkSpan('reasoning');\n break;\n\n case 'reasoning-delta':\n // Auto-create span if we receive reasoning-delta without reasoning-start\n // (AI SDK streaming doesn't always emit wrapper events)\n // Allow transition from any other chunk type\n if (this.#currentChunkType !== 'reasoning') {\n this.#startChunkSpan('reasoning');\n }\n this.#appendToAccumulator('text', chunk.payload.text);\n break;\n\n case 'reasoning-end': {\n this.#endChunkSpan();\n break;\n }\n }\n }\n\n /**\n * Handle tool call chunk spans (tool-call-input-streaming-start/delta/end, tool-call)\n */\n #handleToolCallChunk(chunk: ChunkType) {\n switch (chunk.type) {\n case 'tool-call-input-streaming-start':\n this.#startChunkSpan('tool-call', {\n toolName: chunk.payload.toolName,\n toolCallId: chunk.payload.toolCallId,\n });\n break;\n\n case 'tool-call-delta':\n this.#appendToAccumulator('toolInput', chunk.payload.argsTextDelta);\n break;\n\n case 'tool-call-input-streaming-end':\n case 'tool-call': {\n // Build output with toolName, toolCallId, and parsed toolInput\n const acc = this.#getAccumulator();\n let toolInput;\n try {\n toolInput = acc.toolInput ? JSON.parse(acc.toolInput) : {};\n } catch {\n toolInput = acc.toolInput; // Keep as string if parsing fails\n }\n this.#endChunkSpan({\n toolName: acc.toolName,\n toolCallId: acc.toolCallId,\n toolInput,\n });\n break;\n }\n }\n }\n\n /**\n * Handle object chunk spans (object, object-result)\n */\n #handleObjectChunk(chunk: ChunkType) {\n switch (chunk.type) {\n case 'object':\n // Start span on first partial object chunk (only if not already started)\n // Multiple object chunks may arrive as the object is being generated\n // Check specifically for object chunk type to allow transitioning from other types\n if (this.#currentChunkType !== 'object') {\n this.#startChunkSpan('object');\n }\n break;\n\n case 'object-result':\n // End the span with the final complete object as output\n this.#endChunkSpan(chunk.object);\n break;\n }\n }\n\n /**\n * Handle tool-call-approval chunks.\n * Creates a span for approval requests so they can be seen in traces for debugging.\n */\n #handleToolApprovalChunk(chunk: ChunkType) {\n if (chunk.type !== 'tool-call-approval') return;\n const payload = chunk.payload;\n\n this.#ensureStepAndInference();\n\n // Create an event span for the approval request\n // Using createEventSpan since approvals are point-in-time events (not time ranges)\n const span = this.#chunkParent()?.createEventSpan({\n name: `chunk: 'tool-call-approval'`,\n type: SpanType.MODEL_CHUNK,\n attributes: {\n chunkType: 'tool-call-approval',\n sequenceNumber: this.#chunkSequence,\n },\n output: payload,\n tracingPolicy: this.#modelSpan?.tracingPolicy,\n });\n\n if (span) {\n this.#chunkSequence++;\n }\n }\n /**\n * Wraps a stream with model tracing transform to track MODEL_STEP and MODEL_CHUNK spans.\n *\n * This should be added to the stream pipeline to automatically\n * create MODEL_STEP and MODEL_CHUNK spans for each semantic unit in the stream.\n */\n wrapStream(stream: T): T {\n return stream.pipeThrough(\n new TransformStream({\n transform: (chunk, controller) => {\n // Capture completion start time on first actual content (for time-to-first-token)\n switch (chunk.type) {\n case 'text-delta':\n case 'tool-call-delta':\n case 'reasoning-delta':\n this.#captureCompletionStartTime();\n break;\n }\n\n controller.enqueue(chunk);\n\n // Handle chunk span tracking based on chunk type\n switch (chunk.type) {\n case 'text-start':\n case 'text-delta':\n case 'text-end':\n this.#handleTextChunk(chunk);\n break;\n\n case 'tool-call-input-streaming-start':\n case 'tool-call-delta':\n case 'tool-call-input-streaming-end':\n case 'tool-call':\n this.#handleToolCallChunk(chunk);\n break;\n\n case 'reasoning-start':\n case 'reasoning-delta':\n case 'reasoning-end':\n this.#handleReasoningChunk(chunk);\n break;\n\n case 'object':\n case 'object-result':\n this.#handleObjectChunk(chunk);\n break;\n\n case 'step-start':\n // If step already started (via startStep()), just update with payload data\n // Otherwise start a new step (for backwards compatibility)\n if (this.#currentStepSpan) {\n this.updateStep(chunk.payload);\n } else {\n this.startStep(chunk.payload);\n }\n // step-start fires when the provider stream has begun. Open the\n // inference span here as a safety net for callers that don't\n // explicitly call startInference() before invoking the model —\n // chunks that follow will parent under MODEL_INFERENCE.\n if (!this.#currentInferenceSpan) {\n this.startInference(chunk.payload);\n }\n break;\n\n case 'step-finish':\n if (this.#deferStepClose) {\n // Durable mode: save payload for later, don't close the step.\n // Close MODEL_INFERENCE eagerly though - the provider stream is\n // done, and any subsequent tool execution under the step should\n // not inflate inference duration.\n this.#pendingStepFinishPayload = chunk.payload;\n this.#endChunkSpan();\n this.#endInferenceSpan(chunk.payload);\n } else {\n // Normal mode: close the step immediately\n this.#endStepSpan(chunk.payload);\n }\n break;\n\n // Infrastructure chunks - skip creating spans for these\n // They are either redundant, metadata-only, or error/control flow\n case 'raw': // Redundant raw data\n case 'start': // Stream start marker\n case 'finish': // Stream finish marker (step-finish already captures this)\n case 'response-metadata': // Response metadata (not semantic content)\n case 'source': // Source references (metadata)\n case 'file': // Binary file data (too large/not semantic)\n case 'error': // Error handling\n case 'abort': // Abort signal\n case 'tripwire': // Processor rejection\n case 'watch': // Internal watch event\n case 'tool-error': // Tool error handling\n case 'tool-call-suspended': // Suspension (not content)\n case 'reasoning-signature': // Signature metadata\n case 'redacted-reasoning': // Redacted content metadata\n case 'step-output': // Step output wrapper (content is nested)\n // Don't create spans for these chunks\n break;\n\n case 'tool-call-approval': // Approval request - create span for debugging\n this.#handleToolApprovalChunk(chunk);\n break;\n\n case 'tool-output':\n // tool-output chunks are streaming progress from tools (e.g., sub-agents)\n // No span created - the final tool-result event captures the result\n break;\n\n case 'tool-result': {\n // tool-result is always a point-in-time event span\n // (tool execution duration is captured by the parent tool_call span)\n const {\n // Metadata - tool call context (unique to tool-result chunks)\n toolCallId,\n toolName,\n isError,\n dynamic,\n providerExecuted,\n providerMetadata,\n // Keep provider-executed results on MODEL_CHUNK because they come\n // from the model/provider stream and may not have a sibling TOOL_CALL span.\n // For locally executed tools, the canonical payload lives on TOOL_CALL.\n result,\n // Stripped - redundant (already on TOOL_CALL span input)\n args: _args,\n } = (chunk.payload as Record) || {};\n\n // All tool-result specific fields go in metadata\n const metadata: Record = { toolCallId, toolName };\n if (isError !== undefined) metadata.isError = isError;\n if (dynamic !== undefined) metadata.dynamic = dynamic;\n if (providerExecuted !== undefined) metadata.providerExecuted = providerExecuted;\n if (providerMetadata !== undefined) metadata.providerMetadata = providerMetadata;\n\n this.#createEventSpan(chunk.type, providerExecuted ? result : undefined, { metadata });\n break;\n }\n\n // Default: skip creating spans for unrecognized chunk types\n // All semantic content chunks should be explicitly handled above\n // Unknown chunks are likely infrastructure or custom chunks that don't need tracing\n default:\n // No span created - reduces trace noise\n break;\n }\n },\n }),\n ) as T;\n }\n}\n","import { SpanType, InternalSpans } from '@mastra/core/observability';\nimport type {\n Span,\n SpanTypeMap,\n AnySpan,\n ChildSpanOptions,\n ChildEventOptions,\n EndSpanOptions,\n ErrorSpanOptions,\n UpdateSpanOptions,\n CreateSpanOptions,\n ObservabilityInstance,\n ExportedSpan,\n TraceState,\n IModelSpanTracker,\n AIModelGenerationSpan,\n EntityType,\n TracingPolicy,\n CorrelationContext,\n} from '@mastra/core/observability';\n\nimport { ModelSpanTracker } from '../model-tracing';\nimport { deepClean, mergeSerializationOptions } from './serialization';\nimport type { DeepCleanOptions } from './serialization';\n\n/** Extended span type that includes getParentSpan method available on BaseSpan instances */\ntype AnyBaseSpan = AnySpan & { getParentSpan(includeInternalSpans?: boolean): AnySpan | undefined };\n\n/**\n * Determines if a span type should be considered internal based on flags.\n * Returns false if flags are undefined.\n */\nfunction isSpanInternal(spanType: SpanType, flags?: InternalSpans): boolean {\n if (flags === undefined || flags === InternalSpans.NONE) {\n return false;\n }\n\n switch (spanType) {\n // Workflow-related spans\n case SpanType.WORKFLOW_RUN:\n case SpanType.WORKFLOW_STEP:\n case SpanType.WORKFLOW_CONDITIONAL:\n case SpanType.WORKFLOW_CONDITIONAL_EVAL:\n case SpanType.WORKFLOW_PARALLEL:\n case SpanType.WORKFLOW_LOOP:\n case SpanType.WORKFLOW_SLEEP:\n case SpanType.WORKFLOW_WAIT_EVENT:\n return (flags & InternalSpans.WORKFLOW) !== 0;\n\n // Agent-related spans\n case SpanType.AGENT_RUN:\n return (flags & InternalSpans.AGENT) !== 0;\n\n // Tool-related spans\n case SpanType.TOOL_CALL:\n case SpanType.MCP_TOOL_CALL:\n return (flags & InternalSpans.TOOL) !== 0;\n\n // Model-related spans\n case SpanType.MODEL_GENERATION:\n case SpanType.MODEL_STEP:\n case SpanType.MODEL_INFERENCE:\n case SpanType.MODEL_CHUNK:\n return (flags & InternalSpans.MODEL) !== 0;\n\n // Default: never internal\n default:\n return false;\n }\n}\n\n/**\n * Get the external parent span ID from CreateSpanOptions.\n *\n * If the parent is internal, walks up the parent chain to find\n * the closest external ancestor. If the parent is already external,\n * returns its ID directly.\n *\n * This is useful when exporting spans to external observability systems\n * that shouldn't include internal framework spans.\n *\n * @param options - Span creation options\n * @returns The external parent span ID, or undefined if no external parent exists\n *\n * @example\n * ```typescript\n * // Parent is external - returns parent.id\n * const externalParent = { id: 'span-123', isInternal: false };\n * const options = { parent: externalParent, ... };\n * getExternalParentId(options); // 'span-123'\n *\n * // Parent is internal - walks up to find external ancestor\n * const externalGrandparent = { id: 'span-456', isInternal: false };\n * const internalParent = { id: 'span-123', isInternal: true, parent: externalGrandparent };\n * const options = { parent: internalParent, ... };\n * getExternalParentId(options); // 'span-456'\n * ```\n */\nexport function getExternalParentId(options: CreateSpanOptions): string | undefined {\n if (!options.parent) {\n return undefined;\n }\n\n if (options.parent.isInternal) {\n // Parent is internal, find its external ancestor\n return options.parent.getParentSpanId(false);\n } else {\n // Parent is already external, use it directly\n return options.parent.id;\n }\n}\n\nexport abstract class BaseSpan implements Span {\n public abstract id: string;\n public abstract traceId: string;\n\n public name: string;\n public type: TType;\n public attributes: SpanTypeMap[TType];\n public parent?: AnySpan;\n public startTime: Date;\n public endTime?: Date;\n public isEvent: boolean;\n public isInternal: boolean;\n public tracingPolicy?: TracingPolicy;\n public observabilityInstance: ObservabilityInstance;\n public input?: any;\n public output?: any;\n public errorInfo?: {\n message: string;\n id?: string;\n name?: string;\n stack?: string;\n domain?: string;\n category?: string;\n details?: Record;\n };\n public metadata?: Record;\n public requestContext?: Record;\n public tags?: string[];\n public traceState?: TraceState;\n /** Entity type that created the span (e.g., agent, workflow) */\n public entityType?: EntityType;\n /** Entity ID that created the span */\n public entityId?: string;\n /** Entity name that created the span */\n public entityName?: string;\n /** Parent span ID (for root spans that are children of external spans) */\n protected parentSpanId?: string;\n /** Deep clean options for serialization */\n protected deepCleanOptions: DeepCleanOptions;\n /**\n * Whether this span is filtered out before export. When true, BaseSpan/\n * DefaultSpan skip attaching attributes/input/output/errorInfo/requestContext\n * entirely -- they are never read on excluded spans, and skipping avoids\n * both the deepClean cost and holding references to large payloads for\n * the lifetime of the span. Set when excludeSpanTypes drops the type,\n * when the span is internal and includeInternalSpans is false, or when\n * the subclass is always excluded (e.g., NoOpSpan).\n *\n * Note: metadata is still attached and deepCleaned because it is read in\n * process by getCorrelationContext() and by getLoggerContext() /\n * getMetricsContext() (which structuredClone it).\n */\n protected isExcluded: boolean;\n /** Cached canonical correlation context for this live span */\n protected correlationContext?: CorrelationContext;\n\n /**\n * Subclasses can override to unconditionally mark the span as excluded.\n * NoOpSpan uses this because it is never exported regardless of config.\n */\n protected get alwaysExcluded(): boolean {\n return false;\n }\n\n constructor(options: CreateSpanOptions, observabilityInstance: ObservabilityInstance) {\n // Get serialization options from observability instance config\n const observabilityConfig = observabilityInstance.getConfig();\n this.deepCleanOptions = mergeSerializationOptions(observabilityConfig.serializationOptions);\n\n this.name = options.name;\n this.type = options.type;\n this.isInternal = isSpanInternal(this.type, options.tracingPolicy?.internal);\n\n // Determine up front whether this span will ever reach exporters.\n // getSpanForExport() drops these same spans before export, so we can\n // skip both the deepClean cost and the retention of large payload\n // references for the lifetime of the span (notably per-chunk\n // MODEL_CHUNK spans when excludeSpanTypes: [MODEL_CHUNK] is set).\n this.isExcluded =\n this.alwaysExcluded ||\n observabilityConfig.excludeSpanTypes?.includes(this.type) === true ||\n (this.isInternal && !observabilityConfig.includeInternalSpans);\n\n // Metadata is always attached and deepCleaned: it is read in-process\n // by getCorrelationContext() and by getLoggerContext() /\n // getMetricsContext() (which structuredClone it), and non-filtered\n // child spans inherit it via options.parent?.metadata.\n this.metadata = deepClean(\n options.parent?.metadata || options.metadata ? { ...options.parent?.metadata, ...options.metadata } : undefined,\n this.deepCleanOptions,\n );\n\n if (options.requestContext && options.requestContext.size() > 0) {\n this.requestContext = deepClean(options.requestContext.all, this.deepCleanOptions);\n }\n\n this.parent = options.parent;\n this.startTime = options.startTime ?? new Date();\n this.observabilityInstance = observabilityInstance;\n this.isEvent = options.isEvent ?? false;\n this.tracingPolicy = options.tracingPolicy;\n this.traceState = options.traceState;\n // Tags are only set for root spans (spans without a parent)\n this.tags = !options.parent && options.tags?.length ? options.tags : undefined;\n // Entity identification - inherit from closest non-internal parent if not explicitly provided\n const entityParent = this.getParentSpan(false);\n this.entityType = options.entityType ?? entityParent?.entityType;\n this.entityId = options.entityId ?? entityParent?.entityId;\n this.entityName = options.entityName ?? entityParent?.entityName;\n\n if (this.isExcluded) {\n // Keep the shape of attributes stable for any live-span reader.\n // input/output/errorInfo/requestContext stay undefined.\n this.attributes = {} as SpanTypeMap[TType];\n return;\n }\n\n this.attributes = deepClean(options.attributes, this.deepCleanOptions) || ({} as SpanTypeMap[TType]);\n if (options.requestContext && options.requestContext.size() > 0) {\n this.requestContext = deepClean(options.requestContext.all, this.deepCleanOptions);\n }\n\n if (this.isEvent) {\n // Event spans don't have endTime or input.\n // Event spans are immediately emitted by the BaseObservability class via the end() event.\n this.output = deepClean(options.output, this.deepCleanOptions);\n } else {\n this.input = deepClean(options.input, this.deepCleanOptions);\n }\n }\n\n // Methods for span lifecycle\n /** End the span */\n abstract end(options?: EndSpanOptions): void;\n\n /** Record an error for the span, optionally end the span as well */\n abstract error(options: ErrorSpanOptions): void;\n\n /** Update span attributes */\n abstract update(options: UpdateSpanOptions): void;\n\n createChildSpan(options: ChildSpanOptions): AIModelGenerationSpan;\n createChildSpan(options: ChildSpanOptions): Span {\n return this.observabilityInstance.startSpan({ ...options, parent: this, isEvent: false });\n }\n\n createEventSpan(options: ChildEventOptions): Span {\n return this.observabilityInstance.startSpan({ ...options, parent: this, isEvent: true });\n }\n\n /**\n * Create a ModelSpanTracker for this span (only works if this is a MODEL_GENERATION span)\n * Returns undefined for non-MODEL_GENERATION spans\n */\n createTracker(): IModelSpanTracker | undefined {\n // Only create tracker for MODEL_GENERATION spans\n if (this.type !== SpanType.MODEL_GENERATION) {\n return undefined;\n }\n\n return new ModelSpanTracker(this as Span);\n }\n\n /** Returns `TRUE` if the span is the root span of a trace */\n get isRootSpan(): boolean {\n return !this.parent;\n }\n\n /** Returns `TRUE` if the span is a valid span (not a NO-OP Span) */\n abstract get isValid(): boolean;\n\n /** Get the closest parent span, optionally skipping internal spans */\n public getParentSpan(includeInternalSpans?: boolean): AnySpan | undefined {\n if (!this.parent) {\n return undefined;\n }\n if (includeInternalSpans) return this.parent;\n if (this.parent.isInternal) return (this.parent as AnyBaseSpan).getParentSpan(includeInternalSpans);\n return this.parent;\n }\n\n /** Get the closest parent spanId that isn't an internal span */\n public getParentSpanId(includeInternalSpans?: boolean): string | undefined {\n if (!this.parent) {\n // Return parent span ID if available (for root spans with external parent)\n return this.parentSpanId;\n }\n const parentSpan = this.getParentSpan(includeInternalSpans);\n if (parentSpan) {\n return parentSpan.id;\n }\n // All ancestors are internal, recurse to get root's parentSpanId\n return this.parent.getParentSpanId(includeInternalSpans);\n }\n\n /** Find the closest parent span of a specific type by walking up the parent chain */\n public findParent(spanType: T): Span | undefined {\n let current: AnySpan | undefined = this.parent;\n\n while (current) {\n if (current.type === spanType) {\n return current as Span;\n }\n current = current.parent;\n }\n\n return undefined;\n }\n\n /** Build and cache the canonical correlation context for this live span. */\n public getCorrelationContext(): CorrelationContext {\n if (this.correlationContext) {\n return this.correlationContext;\n }\n\n const metadata = this.metadata ?? {};\n const getMetadataString = (key: string): string | undefined =>\n typeof metadata[key] === 'string' ? metadata[key] : undefined;\n const getSpanMetadataString = (span: AnySpan | null | undefined, key: string): string | undefined => {\n const m = span?.metadata;\n return m && typeof m[key] === 'string' ? m[key] : undefined;\n };\n const parentSpan = this.getParentSpan(false);\n\n let rootSpan: AnySpan = this;\n while (rootSpan.parent) {\n rootSpan = rootSpan.parent;\n }\n\n const rootTags = rootSpan.tags?.length ? [...rootSpan.tags] : undefined;\n\n this.correlationContext = {\n traceId: this.traceId,\n spanId: this.id,\n tags: rootTags,\n entityType: this.entityType,\n entityId: this.entityId,\n entityName: this.entityName,\n entityVersionId: getMetadataString('entityVersionId'),\n parentEntityType: parentSpan?.entityType,\n parentEntityId: parentSpan?.entityId,\n parentEntityName: parentSpan?.entityName,\n parentEntityVersionId: getSpanMetadataString(parentSpan, 'entityVersionId'),\n rootEntityType: rootSpan.entityType,\n rootEntityId: rootSpan.entityId,\n rootEntityName: rootSpan.entityName,\n rootEntityVersionId: getSpanMetadataString(rootSpan, 'entityVersionId'),\n userId: getMetadataString('userId'),\n organizationId: getMetadataString('organizationId'),\n resourceId: getMetadataString('resourceId'),\n runId: getMetadataString('runId'),\n sessionId: getMetadataString('sessionId'),\n threadId: getMetadataString('threadId'),\n requestId: getMetadataString('requestId'),\n environment: getMetadataString('environment') ?? this.observabilityInstance.getMastraEnvironment?.(),\n source: getMetadataString('source'),\n serviceName: getMetadataString('serviceName') ?? this.observabilityInstance.getConfig().serviceName,\n experimentId: getMetadataString('experimentId'),\n };\n\n return this.correlationContext;\n }\n\n /** Returns a lightweight span ready for export */\n public exportSpan(includeInternalSpans?: boolean): ExportedSpan {\n // Check if input/output should be hidden based on traceState\n const hideInput = this.traceState?.hideInput ?? false;\n const hideOutput = this.traceState?.hideOutput ?? false;\n\n return {\n id: this.id,\n traceId: this.traceId,\n name: this.name,\n type: this.type,\n entityType: this.entityType,\n entityId: this.entityId,\n entityName: this.entityName,\n attributes: this.attributes,\n metadata: this.metadata,\n startTime: this.startTime,\n endTime: this.endTime,\n input: hideInput ? undefined : this.input,\n output: hideOutput ? undefined : this.output,\n errorInfo: this.errorInfo,\n requestContext: this.requestContext,\n isEvent: this.isEvent,\n isRootSpan: this.isRootSpan,\n parentSpanId: this.getParentSpanId(includeInternalSpans),\n // Tags are only included for root spans\n ...(this.isRootSpan && this.tags?.length ? { tags: this.tags } : {}),\n };\n }\n\n get externalTraceId(): string | undefined {\n return this.isValid ? this.traceId : undefined;\n }\n\n /**\n * Execute an async function within this span's tracing context.\n * Delegates to the bridge if available.\n */\n async executeInContext(fn: () => Promise): Promise {\n const bridge = this.observabilityInstance.getBridge();\n\n if (bridge?.executeInContext) {\n const bridgeContextSpan = this.isInternal ? this.getParentSpan(false) : this;\n return bridge.executeInContext(bridgeContextSpan?.id ?? this.id, fn);\n }\n\n return fn();\n }\n\n /**\n * Execute a synchronous function within this span's tracing context.\n * Delegates to the bridge if available.\n */\n executeInContextSync(fn: () => T): T {\n const bridge = this.observabilityInstance.getBridge();\n\n if (bridge?.executeInContextSync) {\n const bridgeContextSpan = this.isInternal ? this.getParentSpan(false) : this;\n return bridge.executeInContextSync(bridgeContextSpan?.id ?? this.id, fn);\n }\n\n return fn();\n }\n}\n","import { MastraError } from '@mastra/core/error';\nimport type {\n SpanType,\n ObservabilityInstance,\n EndSpanOptions,\n ErrorSpanOptions,\n UpdateSpanOptions,\n CreateSpanOptions,\n} from '@mastra/core/observability';\nimport { BaseSpan } from './base';\nimport { deepClean } from './serialization';\n\nexport class DefaultSpan extends BaseSpan {\n public id: string;\n public traceId: string;\n\n constructor(options: CreateSpanOptions, observabilityInstance: ObservabilityInstance) {\n super(options, observabilityInstance);\n\n // If spanId and traceId are provided, this is a rebuilt span - use provided IDs directly\n if (options.spanId && options.traceId) {\n this.id = options.spanId;\n this.traceId = options.traceId;\n if (options.parentSpanId) {\n this.parentSpanId = options.parentSpanId;\n }\n return;\n }\n\n // If bridge and not internal span, use bridge to init span\n const bridge = observabilityInstance.getBridge();\n if (bridge && !this.isInternal) {\n const bridgeIds = bridge.createSpan(options);\n if (bridgeIds) {\n this.id = bridgeIds.spanId;\n this.traceId = bridgeIds.traceId;\n this.parentSpanId = bridgeIds.parentSpanId;\n return;\n }\n }\n\n // No bridge or bridge failed - generate IDs ourselves\n if (options.parent) {\n this.traceId = options.parent.traceId;\n this.parentSpanId = options.parent.id;\n this.id = generateSpanId();\n return;\n }\n\n this.traceId = getOrCreateTraceId(options);\n this.id = generateSpanId();\n\n if (options.parentSpanId) {\n if (isValidSpanId(options.parentSpanId)) {\n this.parentSpanId = options.parentSpanId;\n } else {\n console.error(\n `[Mastra Tracing] Invalid parentSpanId: must be 1-16 hexadecimal characters, got \"${options.parentSpanId}\". Ignoring.`,\n );\n }\n }\n }\n\n end(options?: EndSpanOptions): void {\n if (this.isEvent) {\n return;\n }\n this.endTime = new Date();\n // Metadata is always updated (read by correlation/logger/metrics contexts).\n if (options?.metadata) {\n this.metadata = { ...this.metadata, ...deepClean(options.metadata, this.deepCleanOptions) };\n }\n if (this.isExcluded) {\n // Span is filtered before export; skip attaching heavy fields.\n return;\n }\n if (options?.output !== undefined) {\n this.output = deepClean(options.output, this.deepCleanOptions);\n }\n if (options?.attributes) {\n this.attributes = { ...this.attributes, ...deepClean(options.attributes, this.deepCleanOptions) };\n }\n // Tracing events automatically handled by base class\n }\n\n error(options: ErrorSpanOptions): void {\n if (this.isEvent) {\n return;\n }\n\n const { error, endSpan = true, attributes, metadata } = options;\n\n if (metadata) {\n this.metadata = { ...this.metadata, ...deepClean(metadata, this.deepCleanOptions) };\n }\n\n if (!this.isExcluded) {\n this.errorInfo = deepClean(\n error instanceof MastraError\n ? {\n id: error.id,\n details: error.details,\n category: error.category,\n domain: error.domain,\n message: error.message,\n name: error.name,\n // Prefer the original cause's stack when available. MastraError wraps\n // thrown errors, so its own stack points to the wrapping site rather\n // than where the underlying error was thrown.\n stack: (error.cause instanceof Error && error.cause.stack) || error.stack,\n }\n : {\n message: error.message,\n name: error.name,\n stack: error.stack,\n },\n this.deepCleanOptions,\n );\n\n if (attributes) {\n this.attributes = { ...this.attributes, ...deepClean(attributes, this.deepCleanOptions) };\n }\n }\n\n if (endSpan) {\n this.end();\n } else {\n // Trigger span update event when not ending the span\n this.update({});\n }\n }\n\n update(options: UpdateSpanOptions): void {\n if (this.isEvent) {\n return;\n }\n\n if (options.name !== undefined) {\n this.name = options.name;\n }\n // Metadata is always updated (read by correlation/logger/metrics contexts).\n if (options.metadata) {\n this.metadata = { ...this.metadata, ...deepClean(options.metadata, this.deepCleanOptions) };\n }\n if (this.isExcluded) {\n return;\n }\n if (options.input !== undefined) {\n this.input = deepClean(options.input, this.deepCleanOptions);\n }\n if (options.output !== undefined) {\n this.output = deepClean(options.output, this.deepCleanOptions);\n }\n if (options.attributes) {\n this.attributes = { ...this.attributes, ...deepClean(options.attributes, this.deepCleanOptions) };\n }\n // Tracing events automatically handled by base class\n }\n\n get isValid(): boolean {\n return true;\n }\n\n async export(): Promise {\n return JSON.stringify({\n spanId: this.id,\n traceId: this.traceId,\n startTime: this.startTime,\n endTime: this.endTime,\n attributes: this.attributes,\n metadata: this.metadata,\n });\n }\n}\n\n/**\n * Generate OpenTelemetry-compatible span ID (64-bit, 16 hex chars)\n */\nfunction fillRandomBytes(bytes: Uint8Array): void {\n try {\n // Use Web Crypto API with proper this binding\n const webCrypto = globalThis.crypto;\n if (webCrypto?.getRandomValues) {\n webCrypto.getRandomValues.call(webCrypto, bytes);\n return;\n }\n } catch {\n // Fall through to fallback\n }\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n}\n\nfunction generateSpanId(): string {\n const bytes = new Uint8Array(8);\n fillRandomBytes(bytes);\n return Array.from(bytes, byte => byte.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Generate OpenTelemetry-compatible trace ID (128-bit, 32 hex chars)\n */\nfunction generateTraceId(): string {\n const bytes = new Uint8Array(16);\n fillRandomBytes(bytes);\n return Array.from(bytes, byte => byte.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Validate OpenTelemetry-compatible trace ID (1-32 hex characters)\n */\nfunction isValidTraceId(traceId: string): boolean {\n return /^[0-9a-f]{1,32}$/i.test(traceId);\n}\n\n/**\n * Validate OpenTelemetry-compatible span ID (1-16 hex characters)\n */\nfunction isValidSpanId(spanId: string): boolean {\n return /^[0-9a-f]{1,16}$/i.test(spanId);\n}\n\nfunction getOrCreateTraceId(options: CreateSpanOptions): string {\n if (options.traceId) {\n if (isValidTraceId(options.traceId)) {\n return options.traceId;\n } else {\n console.error(\n `[Mastra Tracing] Invalid traceId: must be 1-32 hexadecimal characters, got \"${options.traceId}\". Generating new trace ID.`,\n );\n }\n }\n return generateTraceId();\n}\n","/**\n * NoOpSpan Implementation for Mastra Observability\n */\n\nimport type {\n ObservabilityInstance,\n SpanType,\n CreateSpanOptions,\n EndSpanOptions,\n UpdateSpanOptions,\n ErrorSpanOptions,\n} from '@mastra/core/observability';\nimport { BaseSpan } from './base';\n\nexport class NoOpSpan extends BaseSpan {\n public id: string;\n public traceId: string;\n\n constructor(options: CreateSpanOptions, observabilityInstance: ObservabilityInstance) {\n super(options, observabilityInstance);\n this.id = 'no-op';\n this.traceId = 'no-op-trace';\n }\n\n end(_options?: EndSpanOptions): void {}\n\n error(_options: ErrorSpanOptions): void {}\n\n update(_options: UpdateSpanOptions): void {}\n\n get isValid(): boolean {\n return false;\n }\n\n // NoOpSpan is never exported, so treat it as always excluded.\n protected override get alwaysExcluded(): boolean {\n return true;\n }\n}\n","/**\n * BaseObservability - Abstract base class for Observability implementations\n */\n\nimport { MastraBase } from '@mastra/core/base';\nimport type { RequestContext } from '@mastra/core/di';\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport { RegisteredLogger } from '@mastra/core/logger';\nimport { SpanType, TracingEventType, noOpLoggerContext } from '@mastra/core/observability';\nimport type {\n Span,\n ObservabilityExporter,\n ObservabilityBridge,\n SpanOutputProcessor,\n TracingEvent,\n AnySpan,\n EndSpanOptions,\n UpdateSpanOptions,\n StartSpanOptions,\n CreateSpanOptions,\n ObservabilityInstance,\n CustomSamplerOptions,\n ExportedSpan,\n AnyExportedSpan,\n TraceState,\n TracingOptions,\n LoggerContext,\n MetricsContext,\n ObservabilityEvent,\n ModelGenerationAttributes,\n UsageStats,\n} from '@mastra/core/observability';\nimport { getNestedValue, setNestedValue } from '@mastra/core/utils';\nimport { ObservabilityBus } from '../bus';\nimport type { ObservabilityInstanceConfig } from '../config';\nimport { SamplingStrategyType } from '../config';\nimport { LoggerContextImpl } from '../context/logger';\nimport { MetricsContextImpl } from '../context/metrics';\nimport { emitAutoExtractedMetrics, emitTokenMetricsForUsage } from '../metrics/auto-extract';\nimport { CardinalityFilter } from '../metrics/cardinality';\nimport { NoOpSpan } from '../spans';\nimport { addUsageStats } from '../usage';\n\n// ============================================================================\n// Abstract Base Class\n// ============================================================================\n\n/**\n * Abstract base class for all Observability implementations in Mastra.\n */\nexport abstract class BaseObservabilityInstance extends MastraBase implements ObservabilityInstance {\n protected config: ObservabilityInstanceConfig;\n\n /**\n * Unified event bus for all observability signals.\n * Routes events to registered exporters based on event type.\n */\n protected observabilityBus: ObservabilityBus;\n\n /**\n * Cardinality filter for metrics label protection.\n */\n protected cardinalityFilter: CardinalityFilter;\n\n /**\n * Deployment environment propagated from the parent Mastra instance.\n * Set by `Observability.setMastraContext`, read by spans as a fallback when\n * a span's `metadata.environment` isn't set.\n */\n #mastraEnvironment?: string;\n\n constructor(config: ObservabilityInstanceConfig) {\n super({ component: RegisteredLogger.OBSERVABILITY, name: config.serviceName });\n\n // Apply defaults for optional fields\n this.config = {\n serviceName: config.serviceName,\n name: config.name,\n sampling: config.sampling ?? { type: SamplingStrategyType.ALWAYS },\n exporters: config.exporters ?? [],\n spanOutputProcessors: config.spanOutputProcessors ?? [],\n bridge: config.bridge ?? undefined,\n includeInternalSpans: config.includeInternalSpans ?? false,\n excludeSpanTypes: config.excludeSpanTypes,\n spanFilter: config.spanFilter,\n requestContextKeys: config.requestContextKeys ?? [],\n serializationOptions: config.serializationOptions,\n logging: config.logging,\n };\n\n // Initialize cardinality filter for metrics (uses user config or defaults)\n this.cardinalityFilter = new CardinalityFilter(config.cardinality);\n\n // Initialize the unified ObservabilityBus\n this.observabilityBus = new ObservabilityBus({\n serializationOptions: this.config.serializationOptions,\n });\n\n for (const exporter of this.exporters) {\n this.observabilityBus.registerExporter(exporter);\n }\n\n // Register bridge on the bus so it receives all signals (tracing + non-tracing)\n if (this.config.bridge) {\n this.observabilityBus.registerBridge(this.config.bridge);\n }\n\n // Initialize bridge if present\n if (this.config.bridge?.init) {\n this.config.bridge.init({ config: this.config });\n }\n }\n\n /**\n * Override setLogger to add Observability specific initialization log\n * and propagate logger to exporters and bridge\n */\n __setLogger(logger: IMastraLogger) {\n super.__setLogger(logger);\n\n // Propagate logger to all exporters that support it\n this.exporters.forEach(exporter => {\n if (typeof exporter.__setLogger === 'function') {\n exporter.__setLogger(logger);\n }\n });\n\n // Propagate logger to bridge if present\n if (this.config.bridge?.__setLogger) {\n this.config.bridge.__setLogger(logger);\n }\n\n // Log Observability initialization details after logger is properly set\n this.logger.debug(\n `[Observability] Initialized [service=${this.config.serviceName}] [instance=${this.config.name}] [sampling=${this.config.sampling?.type}] [bridge=${!!this.config.bridge}]`,\n );\n }\n\n // ============================================================================\n // Protected getters for clean config access\n // ============================================================================\n\n protected get exporters(): ObservabilityExporter[] {\n return this.config.exporters || [];\n }\n\n protected get spanOutputProcessors(): SpanOutputProcessor[] {\n return this.config.spanOutputProcessors || [];\n }\n\n // ============================================================================\n // Public API - Single type-safe span creation method\n // ============================================================================\n\n /**\n * Start a new span of a specific SpanType\n *\n * Sampling Decision:\n * - For root spans (no parent): Perform sampling check using the configured strategy\n * - For child spans: Inherit the sampling decision from the parent\n * - If parent is a NoOpSpan (not sampled), child is also a NoOpSpan\n * - If parent is a valid span (sampled), child is also sampled\n *\n * This ensures trace-level sampling: either all spans in a trace are sampled or none are.\n * See: https://github.com/mastra-ai/mastra/issues/11504\n */\n startSpan(options: StartSpanOptions): Span {\n const { customSamplerOptions, requestContext, metadata, tracingOptions, ...rest } = options;\n\n // Determine sampling: inherit from parent or make new decision for root spans\n if (options.parent) {\n // Child span: inherit sampling decision from parent\n // If parent is a NoOpSpan (not sampled), child should also be a NoOpSpan\n if (!options.parent.isValid) {\n return new NoOpSpan({ ...rest, metadata }, this);\n }\n // Parent is valid (sampled), so child will also be sampled - continue to create actual span\n } else {\n // Root span: perform sampling check\n if (!this.shouldSample(customSamplerOptions)) {\n return new NoOpSpan({ ...rest, metadata }, this);\n }\n }\n\n // Compute or inherit TraceState\n let traceState: TraceState | undefined;\n\n if (options.parent) {\n // Child span: inherit from parent\n traceState = options.parent.traceState;\n } else {\n // Root span: compute new TraceState\n traceState = this.computeTraceState(tracingOptions);\n }\n\n // Merge tracingOptions.metadata with span metadata (tracingOptions.metadata takes precedence for root spans)\n const tracingMetadata = !options.parent ? tracingOptions?.metadata : undefined;\n const mergedMetadata = metadata || tracingMetadata ? { ...metadata, ...tracingMetadata } : undefined;\n\n // Extract metadata from RequestContext\n const enrichedMetadata = this.extractMetadataFromRequestContext(requestContext, mergedMetadata, traceState);\n\n // Inject the Mastra-level environment into root-span metadata when nothing\n // upstream provided one. Root-only is sufficient because BaseSpan inherits\n // parent metadata, so descendants pick the value up automatically.\n // Persisting it on metadata (rather than only computing it in\n // getCorrelationContext) is what lets the storage record-builders populate\n // the `environment` column on SpanRecord, which is then read by stored\n // score/feedback events via RecordedSpan / RecordedTrace.addScore.\n const finalMetadata =\n !options.parent &&\n this.#mastraEnvironment !== undefined &&\n (enrichedMetadata === undefined || enrichedMetadata.environment === undefined)\n ? { ...(enrichedMetadata ?? {}), environment: this.#mastraEnvironment }\n : enrichedMetadata;\n\n // Tags are only passed for root spans (no parent)\n const tags = !options.parent ? tracingOptions?.tags : undefined;\n\n // Extract traceId and parentSpanId from tracingOptions for root spans (no parent)\n // These allow nested workflows to join the parent workflow's trace\n const traceId = !options.parent ? (options.traceId ?? tracingOptions?.traceId) : options.traceId;\n const parentSpanId = !options.parent\n ? (options.parentSpanId ?? tracingOptions?.parentSpanId)\n : options.parentSpanId;\n\n const span = this.createSpan({\n ...rest,\n traceId,\n parentSpanId,\n metadata: finalMetadata,\n traceState,\n tags,\n requestContext,\n });\n\n if (span.isEvent) {\n this.emitSpanEnded(span);\n } else {\n // Automatically wire up tracing lifecycle\n this.wireSpanLifecycle(span);\n\n // Emit span started event\n this.emitSpanStarted(span);\n }\n\n return span;\n }\n\n /**\n * Rebuild a span from exported data for lifecycle operations.\n * Used by durable execution engines (e.g., Inngest) to end/update spans\n * that were created in a previous durable operation.\n *\n * The rebuilt span:\n * - Does NOT emit SPAN_STARTED (assumes original span already did)\n * - Can have end(), update(), error() called on it\n * - Will emit SPAN_ENDED or SPAN_UPDATED when those methods are called\n *\n * @param cached - The exported span data to rebuild from\n * @returns A span that can have lifecycle methods called on it\n */\n rebuildSpan(cached: ExportedSpan): Span {\n // Create span with existing IDs from cached data\n const span = this.createSpan({\n name: cached.name,\n type: cached.type,\n traceId: cached.traceId,\n spanId: cached.id,\n parentSpanId: cached.parentSpanId,\n startTime: cached.startTime instanceof Date ? cached.startTime : new Date(cached.startTime),\n input: cached.input,\n attributes: cached.attributes,\n metadata: cached.metadata,\n entityType: cached.entityType,\n entityId: cached.entityId,\n entityName: cached.entityName,\n });\n\n // Wire up lifecycle events (but skip SPAN_STARTED since it was already emitted)\n this.wireSpanLifecycle(span);\n\n return span;\n }\n\n // ============================================================================\n // Abstract Methods - Must be implemented by concrete classes\n // ============================================================================\n\n /**\n * Create a new span (called after sampling)\n *\n * Implementations should:\n * 1. Create a plain span with the provided attributes\n * 2. Return the span - base class handles all tracing lifecycle automatically\n *\n * The base class will automatically:\n * - Set trace relationships\n * - Wire span lifecycle callbacks\n * - Emit span_started event\n */\n protected abstract createSpan(options: CreateSpanOptions): Span;\n\n // ============================================================================\n // Configuration Management\n // ============================================================================\n\n /**\n * Get current configuration\n */\n getConfig(): Readonly {\n return { ...this.config };\n }\n\n /**\n * Returns the deployment environment propagated from the parent Mastra instance.\n * Spans use this as a fallback when `metadata.environment` isn't set.\n */\n getMastraEnvironment(): string | undefined {\n return this.#mastraEnvironment;\n }\n\n /**\n * Internal hook used by `Observability.setMastraContext` to push the\n * resolved Mastra-level environment into this instance.\n */\n __setMastraEnvironment(environment: string | undefined): void {\n this.#mastraEnvironment = environment;\n }\n\n // ============================================================================\n // Plugin Access\n // ============================================================================\n\n /**\n * Get all exporters\n */\n getExporters(): readonly ObservabilityExporter[] {\n return [...this.exporters];\n }\n\n /**\n * Register an additional exporter at runtime.\n * Adds to both the bus (for event routing) and the config (for getExporters).\n */\n registerExporter(exporter: ObservabilityExporter): void {\n this.observabilityBus.registerExporter(exporter);\n this.config.exporters ??= [];\n if (this.config.exporters.includes(exporter)) {\n return;\n }\n this.config.exporters.push(exporter);\n\n if (typeof exporter.__setLogger === 'function') {\n exporter.__setLogger(this.logger);\n }\n }\n\n /**\n * Get all span output processors\n */\n getSpanOutputProcessors(): readonly SpanOutputProcessor[] {\n return [...this.spanOutputProcessors];\n }\n\n /**\n * Get the bridge instance if configured\n */\n getBridge(): ObservabilityBridge | undefined {\n return this.config.bridge;\n }\n\n /**\n * Get the logger instance (for exporters and other components)\n */\n getLogger() {\n return this.logger;\n }\n\n /**\n * Get the ObservabilityBus for this instance.\n * The bus routes all observability events (tracing, logs, metrics, scores, feedback)\n * to registered exporters based on event type.\n */\n getObservabilityBus(): ObservabilityBus {\n return this.observabilityBus;\n }\n\n // ============================================================================\n // Context-factory bridge methods\n // ============================================================================\n\n /**\n * Get a LoggerContext correlated to a span.\n * Called by the context-factory in core (deriveLoggerContext) so that\n * `observabilityContext.loggerVNext` is a real logger instead of no-op.\n */\n getLoggerContext(span?: AnySpan): LoggerContext {\n if (this.config.logging?.enabled === false) {\n return noOpLoggerContext;\n }\n\n const correlationContext = span?.getCorrelationContext?.();\n const metadata: Record | undefined = span?.metadata ? structuredClone(span.metadata) : undefined;\n\n return new LoggerContextImpl({\n traceId: span?.traceId,\n spanId: span?.id,\n correlationContext,\n metadata,\n observabilityBus: this.observabilityBus,\n minLevel: this.config.logging?.level,\n });\n }\n\n /**\n * Get a MetricsContext correlated to a span.\n * Called by the context-factory in core (deriveMetricsContext) so that\n * `observabilityContext.metrics` is a real metrics context instead of no-op.\n */\n getMetricsContext(span?: AnySpan): MetricsContext {\n const correlationContext = span?.getCorrelationContext?.();\n const metadata: Record | undefined = span?.metadata ? structuredClone(span.metadata) : undefined;\n\n return new MetricsContextImpl({\n traceId: span?.traceId,\n spanId: span?.id,\n correlationContext,\n metadata,\n cardinalityFilter: this.cardinalityFilter,\n observabilityBus: this.observabilityBus,\n });\n }\n\n /**\n * Emit any observability event through the bus.\n * The bus routes the event to the appropriate handler on each registered exporter,\n * and for tracing events triggers auto-extracted metrics.\n */\n protected emitObservabilityEvent(event: ObservabilityEvent): void {\n this.observabilityBus.emit(event);\n }\n\n /**\n * Internal hook used by RecordedTrace/RecordedSpan hydration to route\n * non-tracing annotation events back through the normal exporter pipeline.\n */\n __emitRecordedEvent(event: ObservabilityEvent): void {\n this.emitObservabilityEvent(event);\n }\n\n /**\n * Internal hook used by the client observability proxy (`client/`)\n * to route already-validated events through the normal bus without\n * going through the live span lifecycle. The caller is responsible\n * for constructing well-formed `ExportedSpan`s/`ExportedLog`s and\n * for any validation needed.\n */\n __receiveExternalEvent(event: ObservabilityEvent): void {\n this.emitObservabilityEvent(event);\n }\n\n // ============================================================================\n // Span Lifecycle Management\n // ============================================================================\n\n /**\n * Automatically wires up Observability lifecycle events for any span\n * This ensures all spans emit events regardless of implementation\n */\n private wireSpanLifecycle(span: Span): void {\n // Skip wiring for filtered internal spans, except MODEL_GENERATION —\n // those need the wrap so captureModelUsageRollup can intercept usage\n // before originalEnd discards it. Other internal types (AGENT_RUN,\n // WORKFLOW_RUN, MODEL_STEP, MODEL_CHUNK, …) carry nothing to roll up,\n // and skipping the closure-per-span cost matters in streaming hot\n // paths like per-chunk MODEL_CHUNK spans.\n if (!this.config.includeInternalSpans && span.isInternal && span.type !== SpanType.MODEL_GENERATION) {\n return;\n }\n\n // Store original methods\n const originalEnd = span.end.bind(span);\n const originalUpdate = span.update.bind(span);\n\n // Wrap methods to automatically emit tracing events\n span.end = (options?: EndSpanOptions) => {\n if (span.isEvent) {\n this.logger.warn(`End event is not available on event spans`);\n return;\n }\n\n // Capture rollup usage BEFORE originalEnd runs: excluded spans\n // drop end-time attributes (see DefaultSpan#end), so the only\n // place to read MODEL_GENERATION usage for a filtered span is the\n // end() options being passed in right now.\n const rollupTarget = this.captureModelUsageRollup(span, options);\n\n originalEnd(options);\n\n if (rollupTarget) {\n this.applyUsageRollup(rollupTarget);\n }\n\n this.emitSpanEnded(span);\n };\n\n span.update = (options: UpdateSpanOptions) => {\n if (span.isEvent) {\n this.logger.warn(`Update() is not available on event spans`);\n return;\n }\n originalUpdate(options);\n this.emitSpanUpdated(span);\n };\n }\n\n // ============================================================================\n // Utility Methods\n // ============================================================================\n\n /**\n * Check if a trace should be sampled\n */\n protected shouldSample(options?: CustomSamplerOptions): boolean {\n // Check built-in sampling strategy\n const { sampling } = this.config;\n\n switch (sampling?.type) {\n case undefined:\n return true;\n case SamplingStrategyType.ALWAYS:\n return true;\n case SamplingStrategyType.NEVER:\n return false;\n case SamplingStrategyType.RATIO:\n if (sampling.probability === undefined || sampling.probability < 0 || sampling.probability > 1) {\n this.logger.warn(\n `Invalid sampling probability: ${sampling.probability}. Expected value between 0 and 1. Defaulting to no sampling.`,\n );\n return false;\n }\n return Math.random() < sampling.probability;\n case SamplingStrategyType.CUSTOM:\n return sampling.sampler(options);\n default:\n throw new Error(`Sampling strategy type not implemented: ${(sampling as any).type}`);\n }\n }\n\n /**\n * Compute TraceState for a new trace based on configured and per-request keys\n */\n protected computeTraceState(tracingOptions?: TracingOptions): TraceState | undefined {\n const configuredKeys = this.config.requestContextKeys ?? [];\n const additionalKeys = tracingOptions?.requestContextKeys ?? [];\n\n // Merge: configured + additional\n const allKeys = [...configuredKeys, ...additionalKeys];\n\n const hideInput = tracingOptions?.hideInput;\n const hideOutput = tracingOptions?.hideOutput;\n\n // Return undefined if no TraceState properties are needed\n if (allKeys.length === 0 && !hideInput && !hideOutput) {\n return undefined;\n }\n\n return {\n requestContextKeys: allKeys,\n ...(hideInput !== undefined && { hideInput }),\n ...(hideOutput !== undefined && { hideOutput }),\n };\n }\n\n /**\n * Extract metadata from RequestContext using TraceState\n */\n protected extractMetadataFromRequestContext(\n requestContext: RequestContext | undefined,\n explicitMetadata: Record | undefined,\n traceState: TraceState | undefined,\n ): Record | undefined {\n if (!requestContext || !traceState || traceState.requestContextKeys.length === 0) {\n return explicitMetadata;\n }\n\n const extracted = this.extractKeys(requestContext, traceState.requestContextKeys);\n\n // Only return an object if we have extracted or explicit metadata\n if (Object.keys(extracted).length === 0 && !explicitMetadata) {\n return undefined;\n }\n\n return {\n ...extracted,\n ...explicitMetadata, // Explicit metadata always wins\n };\n }\n\n /**\n * Extract specific keys from RequestContext\n */\n protected extractKeys(requestContext: RequestContext, keys: string[]): Record {\n const result: Record = {};\n\n for (const key of keys) {\n // Handle dot notation: get first part from RequestContext, then navigate nested properties\n const parts = key.split('.');\n const rootKey = parts[0]!; // parts[0] always exists since key is a non-empty string\n const value = requestContext.get(rootKey);\n\n if (value !== undefined) {\n // If there are nested parts, extract them from the value\n if (parts.length > 1) {\n const nestedPath = parts.slice(1).join('.');\n const nestedValue = getNestedValue(value, nestedPath);\n if (nestedValue !== undefined) {\n setNestedValue(result, key, nestedValue);\n }\n } else {\n // Simple key, set directly\n setNestedValue(result, key, value);\n }\n }\n }\n\n return result;\n }\n\n /**\n * Process a span through all output processors\n */\n private processSpan(span?: AnySpan): AnySpan | undefined {\n for (const processor of this.spanOutputProcessors) {\n if (!span) {\n break;\n }\n\n try {\n span = processor.process(span);\n } catch (error) {\n this.logger.error(`[Observability] Processor error [name=${processor.name}]`, error);\n // Continue with other processors\n }\n }\n\n return span;\n }\n\n // ============================================================================\n // Event-driven Export Methods\n // ============================================================================\n\n /** Process a span through output processors and export it, returning undefined if filtered out. */\n getSpanForExport(span: AnySpan): AnyExportedSpan | undefined {\n if (!span.isValid) return undefined;\n if (span.isInternal && !this.config.includeInternalSpans) return undefined;\n\n // Check excludeSpanTypes before processing\n if (this.config.excludeSpanTypes?.includes(span.type)) return undefined;\n\n const processedSpan = this.processSpan(span);\n const exportedSpan = processedSpan?.exportSpan(this.config.includeInternalSpans);\n if (!exportedSpan) return undefined;\n\n // Apply spanFilter on the exported span data\n if (this.config.spanFilter) {\n try {\n if (!this.config.spanFilter(exportedSpan)) return undefined;\n } catch (error) {\n this.logger.error(`[Observability] spanFilter error`, error);\n // On filter error, keep the span to avoid silent data loss\n }\n }\n\n return exportedSpan;\n }\n\n /**\n * Emit a span started event.\n * Routes through the ObservabilityBus so exporters receive it via onTracingEvent.\n */\n protected emitSpanStarted(span: AnySpan): void {\n const exportedSpan = this.getSpanForExport(span);\n if (exportedSpan) {\n const event: TracingEvent = { type: TracingEventType.SPAN_STARTED, exportedSpan };\n this.emitTracingEvent(event);\n }\n }\n\n /**\n * Emit a span ended event (called automatically when spans end).\n * Emits any auto-extracted metrics while the live span tree is still available,\n * then routes the exported tracing event through the ObservabilityBus.\n */\n protected emitSpanEnded(span: AnySpan): void {\n const exportedSpan = this.getSpanForExport(span);\n\n if (exportedSpan) {\n try {\n // TODO: We intentionally export first so auto-extracted metrics are skipped\n // when the span is filtered out by processors. Metrics still use the live\n // span for correlation and parent traversal, but current span processors\n // mutate spans in place during export, so those mutations can still affect\n // the live span before metrics run. Future options to explore:\n // 1. Make span processors pure/non-mutating.\n // 2. Split trace processors from metric-specific processors/enrichers.\n // 3. Revisit whether auto-extracted metrics should run before export.\n emitAutoExtractedMetrics(span, this.getMetricsContext(span));\n } catch (err) {\n this.logger.error('[Observability] Auto-extraction error:', err);\n }\n\n const event: TracingEvent = { type: TracingEventType.SPAN_ENDED, exportedSpan };\n this.emitTracingEvent(event);\n }\n }\n\n /**\n * Emit a span updated event.\n * Routes through the ObservabilityBus so exporters receive it via onTracingEvent.\n */\n protected emitSpanUpdated(span: AnySpan): void {\n const exportedSpan = this.getSpanForExport(span);\n if (exportedSpan) {\n const event: TracingEvent = { type: TracingEventType.SPAN_UPDATED, exportedSpan };\n this.emitTracingEvent(event);\n }\n }\n\n /**\n * When an internal MODEL_GENERATION span ends, capture the rollup payload\n * (usage, provider, model, target ancestor) needed to attribute its cost\n * to the closest exported ancestor span. Returns undefined when no rollup\n * applies — non-MODEL_GENERATION spans, spans that will be exported, or\n * spans whose usage isn't available at end time.\n */\n private captureModelUsageRollup(\n span: Span,\n endOptions: EndSpanOptions | undefined,\n ): { ancestor: AnySpan; usage: UsageStats; provider?: string; model?: string } | undefined {\n if (span.type !== SpanType.MODEL_GENERATION) return undefined;\n // If the span itself will be exported, the existing auto-extract pipeline\n // emits its metrics; nothing to roll up.\n if (!span.isInternal || this.config.includeInternalSpans) return undefined;\n\n // For excluded spans, end() options carry the only copy of attributes —\n // the live span discards them in DefaultSpan#end. The liveAttrs fallback\n // is dead for the default implementation but kept for non-DefaultSpan\n // Span implementations that might preserve attributes on excluded spans.\n const endAttrs = (endOptions?.attributes as ModelGenerationAttributes | undefined) ?? undefined;\n const liveAttrs = span.attributes as ModelGenerationAttributes | undefined;\n const usage = endAttrs?.usage ?? liveAttrs?.usage;\n if (!usage) return undefined;\n\n const ancestor = this.findExportedAncestor(span);\n if (!ancestor) return undefined;\n\n const provider = endAttrs?.provider ?? liveAttrs?.provider;\n const model = endAttrs?.responseModel ?? endAttrs?.model ?? liveAttrs?.responseModel ?? liveAttrs?.model;\n\n return { ancestor, usage, provider, model };\n }\n\n /**\n * Accumulate usage onto the ancestor's `internalUsage` attribute (for trace\n * UI visibility) and emit auto-extracted token metrics now, using the\n * ancestor's metrics context so cost / token labels point at the visible\n * span instead of the hidden agent that incurred them.\n */\n private applyUsageRollup(target: { ancestor: AnySpan; usage: UsageStats; provider?: string; model?: string }): void {\n const { ancestor, usage, provider, model } = target;\n\n // Mutate the live ancestor's attributes directly. BaseSpan's constructor\n // guarantees `attributes` is always at least `{}` (see spans/base.ts),\n // and the ancestor hasn't ended yet (we're inside a descendant's end()),\n // so the export will pick up the mutated field.\n const attrs = ancestor.attributes as { internalUsage?: UsageStats };\n attrs.internalUsage = addUsageStats(attrs.internalUsage, usage);\n\n try {\n emitTokenMetricsForUsage(usage, provider, model, this.getMetricsContext(ancestor));\n } catch (err) {\n this.logger.error('[Observability] Usage rollup metric emission error:', err);\n }\n }\n\n /**\n * Walk up the parent chain to find the closest ancestor that will actually\n * reach exporters. Skips both internal-filtered ancestors and ancestors\n * whose type matches `excludeSpanTypes`, so the rollup target is one whose\n * mutated `internalUsage` attribute is visible in exported traces.\n *\n * Note: this does not preemptively run `spanFilter` — that filter can be\n * async and have side effects, so the rare case of a `spanFilter`-dropped\n * ancestor falls through.\n */\n private findExportedAncestor(span: AnySpan): AnySpan | undefined {\n let ancestor: AnySpan | undefined = span.parent;\n while (ancestor && this.isFilteredFromExport(ancestor)) {\n ancestor = ancestor.parent;\n }\n return ancestor;\n }\n\n /**\n * Returns true when a span would be dropped by `getSpanForExport` for a\n * reason cheap to check up-front (internal-span filtering or\n * `excludeSpanTypes`). Used by `findExportedAncestor` to skip rollup\n * targets that would silently lose their `internalUsage` attribute.\n */\n private isFilteredFromExport(span: AnySpan): boolean {\n if (span.isInternal && !this.config.includeInternalSpans) return true;\n if (this.config.excludeSpanTypes?.includes(span.type)) return true;\n return false;\n }\n\n /**\n * Emit a tracing event through the bus.\n *\n * The bus routes the event to each registered exporter's and bridge's\n * onTracingEvent handler.\n */\n private emitTracingEvent(event: TracingEvent): void {\n this.observabilityBus.emit(event);\n }\n\n /**\n * Export tracing event through all exporters and bridge.\n *\n * @deprecated Prefer emitTracingEvent() which routes through the bus.\n * Kept for backward compatibility with subclasses that may override it.\n */\n protected async exportTracingEvent(event: TracingEvent): Promise {\n // Collect all export targets\n const targets: Array<{ name: string; exportTracingEvent: (event: TracingEvent) => Promise }> = [\n ...this.exporters,\n ];\n\n // Add bridge if present\n if (this.config.bridge) {\n targets.push(this.config.bridge);\n }\n\n // Export to all targets\n const exportPromises = targets.map(async target => {\n try {\n await target.exportTracingEvent(event);\n this.logger.debug(`[Observability] Event exported [target=${target.name}] [type=${event.type}]`);\n } catch (error) {\n this.logger.error(`[Observability] Export error [target=${target.name}]`, error);\n // Don't rethrow - continue with other targets\n }\n });\n\n await Promise.allSettled(exportPromises);\n }\n\n // ============================================================================\n // Lifecycle Management\n // ============================================================================\n\n /**\n * Initialize Observability (called by Mastra during component registration)\n */\n init(): void {\n this.logger.debug(`[Observability] Initialization started [name=${this.name}]`);\n\n // Any initialization logic for the Observability system\n // This could include setting up queues, starting background processes, etc.\n\n this.logger.info(`[Observability] Initialized successfully [name=${this.name}]`);\n }\n\n /**\n * Flush all observability data: awaits in-flight handler promises, then\n * drains exporter and bridge SDK-internal buffers.\n *\n * Delegates to ObservabilityBus.flush() which owns the two-phase logic.\n *\n * This is critical for durable execution engines (e.g., Inngest) where\n * the process may be interrupted after a step completes. Calling flush()\n * outside the durable step ensures all span data reaches external systems.\n */\n async flush(): Promise {\n this.logger.debug(`[Observability] Flush started [name=${this.name}]`);\n await this.observabilityBus.flush();\n this.logger.debug(`[Observability] Flush completed [name=${this.name}]`);\n }\n\n /**\n * Shutdown Observability and clean up resources\n */\n async shutdown(): Promise {\n this.logger.debug(`[Observability] Shutdown started [name=${this.name}]`);\n\n // Phase 1: Shutdown the ObservabilityBus first (flushes remaining events, clears subscribers)\n await this.observabilityBus.shutdown();\n\n // Phase 2: Shutdown exporters, processors, and bridge after bus has flushed\n const shutdownPromises: Promise[] = [\n ...this.exporters.map(e => e.shutdown()),\n ...this.spanOutputProcessors.map(p => p.shutdown()),\n ];\n if (this.config.bridge) {\n shutdownPromises.push(this.config.bridge.shutdown());\n }\n if (shutdownPromises.length > 0) {\n const results = await Promise.allSettled(shutdownPromises);\n for (const result of results) {\n if (result.status === 'rejected') {\n this.logger.error(`[Observability] Component shutdown failed [name=${this.name}]:`, result.reason);\n }\n }\n }\n\n this.logger.info(`[Observability] Shutdown completed [name=${this.name}]`);\n }\n}\n","export function generateClientSignalId(): string {\n return globalThis.crypto.randomUUID();\n}\n","/**\n * Hand-rolled OTLP/JSON decoder for the subset we need to ingest from\n * client-side tool execution.\n *\n * The full OTLP/JSON spec is defined in\n * https://opentelemetry.io/docs/specs/otlp/#otlphttp and the\n * opentelemetry-proto repo. We only consume `ResourceSpans` (for spans)\n * and `ResourceLogs` (for logs). The full message types are large and\n * include backwards-compat fields we never need; this walker reads the\n * fields we care about and ignores the rest.\n *\n * Using `@opentelemetry/otlp-transformer` would pull in the full proto\n * dependency tree (~hundreds of KB) for what amounts to a 100-line walker.\n */\n\nimport { SpanType } from '@mastra/core/observability';\nimport type { AnyExportedSpan, EntityType, ExportedLog, LogLevel } from '@mastra/core/observability';\n\nimport { generateClientSignalId } from './id';\n\n/**\n * Convert an OTLP nanosecond timestamp (string or number) to a JS Date.\n *\n * OTLP timestamps are uint64 nanoseconds since Unix epoch. JSON\n * marshalers serialize them as either decimal strings (recommended for\n * uint64 to avoid JS number precision loss) or numbers.\n */\nfunction nanosToDate(value: unknown): Date {\n if (typeof value === 'number') {\n return new Date(Math.round(value / 1e6));\n }\n if (typeof value === 'string') {\n // Avoid BigInt in hot path; just take the millisecond portion of the\n // decimal string. ns=19 chars max, ms=last 6 chars before the cut.\n if (value.length <= 6) return new Date(0);\n const ms = Number(value.slice(0, -6));\n return Number.isFinite(ms) ? new Date(ms) : new Date(0);\n }\n return new Date(0);\n}\n\n/**\n * OTLP attribute values are tagged unions:\n * `{ stringValue: \"...\" } | { intValue: 1 } | { boolValue: true } | ...`\n * Flatten to a plain `Record` for our internal shape.\n */\nfunction flattenAttributes(otlpAttrs: unknown): Record | undefined {\n if (!Array.isArray(otlpAttrs)) return undefined;\n const out: Record = {};\n for (const attr of otlpAttrs) {\n if (!attr || typeof attr !== 'object') continue;\n const key = (attr as { key?: unknown }).key;\n if (typeof key !== 'string') continue;\n const v = (attr as { value?: unknown }).value;\n if (!v || typeof v !== 'object') continue;\n const value = v as Record;\n if ('stringValue' in value) out[key] = value.stringValue;\n else if ('intValue' in value) out[key] = Number(value.intValue);\n else if ('doubleValue' in value) out[key] = value.doubleValue;\n else if ('boolValue' in value) out[key] = value.boolValue;\n else if ('arrayValue' in value || 'kvlistValue' in value) {\n // Nested values are uncommon for our use case; preserve raw shape.\n out[key] = value;\n }\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\n/**\n * Decoded shape of one span pulled out of an OTLP/JSON ResourceSpans\n * payload. Just enough fields to construct an ExportedSpan and forward\n * it through the bus.\n */\nexport interface DecodedOtlpSpan {\n traceId: string;\n spanId: string;\n parentSpanId?: string;\n name: string;\n startTime: Date;\n endTime?: Date;\n attributes?: Record;\n /** OTLP status code: 0 unset, 1 ok, 2 error */\n statusCode?: number;\n statusMessage?: string;\n}\n\nexport interface DecodedOtlpLog {\n traceId: string;\n spanId?: string;\n timestamp: Date;\n /** OTLP severityText: \"INFO\", \"WARN\", etc. */\n severityText?: string;\n /** OTLP severityNumber: 1-24 */\n severityNumber?: number;\n body?: unknown;\n attributes?: Record;\n}\n\n/**\n * Walk an OTLP/JSON ResourceSpans payload and return a flat list of\n * decoded spans. Returns an empty array (and never throws) if the\n * payload is malformed.\n */\nexport function decodeResourceSpans(payload: unknown): DecodedOtlpSpan[] {\n const out: DecodedOtlpSpan[] = [];\n const resourceSpans = (payload as { resourceSpans?: unknown[] } | undefined)?.resourceSpans;\n if (!Array.isArray(resourceSpans)) return out;\n\n for (const rs of resourceSpans) {\n const scopeSpans = (rs as { scopeSpans?: unknown[] } | undefined)?.scopeSpans;\n if (!Array.isArray(scopeSpans)) continue;\n for (const ss of scopeSpans) {\n const spans = (ss as { spans?: unknown[] } | undefined)?.spans;\n if (!Array.isArray(spans)) continue;\n for (const span of spans) {\n if (!span || typeof span !== 'object') continue;\n const s = span as Record;\n const traceId = typeof s.traceId === 'string' ? s.traceId : undefined;\n const spanId = typeof s.spanId === 'string' ? s.spanId : undefined;\n const name = typeof s.name === 'string' ? s.name : undefined;\n if (!traceId || !spanId || !name) continue;\n const decoded: DecodedOtlpSpan = {\n traceId,\n spanId,\n parentSpanId: typeof s.parentSpanId === 'string' && s.parentSpanId ? s.parentSpanId : undefined,\n name,\n startTime: nanosToDate(s.startTimeUnixNano),\n endTime: s.endTimeUnixNano !== undefined ? nanosToDate(s.endTimeUnixNano) : undefined,\n attributes: flattenAttributes(s.attributes),\n };\n const status = s.status as Record | undefined;\n if (status && typeof status === 'object') {\n if (typeof status.code === 'number') decoded.statusCode = status.code;\n if (typeof status.message === 'string') decoded.statusMessage = status.message;\n }\n out.push(decoded);\n }\n }\n }\n return out;\n}\n\nexport function decodeResourceLogs(payload: unknown): DecodedOtlpLog[] {\n const out: DecodedOtlpLog[] = [];\n const resourceLogs = (payload as { resourceLogs?: unknown[] } | undefined)?.resourceLogs;\n if (!Array.isArray(resourceLogs)) return out;\n\n for (const rl of resourceLogs) {\n const scopeLogs = (rl as { scopeLogs?: unknown[] } | undefined)?.scopeLogs;\n if (!Array.isArray(scopeLogs)) continue;\n for (const sl of scopeLogs) {\n const logRecords = (sl as { logRecords?: unknown[] } | undefined)?.logRecords;\n if (!Array.isArray(logRecords)) continue;\n for (const record of logRecords) {\n if (!record || typeof record !== 'object') continue;\n const r = record as Record;\n const traceId = typeof r.traceId === 'string' ? r.traceId : undefined;\n if (!traceId) continue;\n // OTLP log body is a tagged union like attributes; we accept the\n // common stringValue case and otherwise pass through.\n let body: unknown = r.body;\n if (body && typeof body === 'object' && 'stringValue' in (body as Record)) {\n body = (body as Record).stringValue;\n }\n out.push({\n traceId,\n spanId: typeof r.spanId === 'string' && r.spanId ? r.spanId : undefined,\n timestamp: r.timeUnixNano !== undefined ? nanosToDate(r.timeUnixNano) : nanosToDate(r.observedTimeUnixNano),\n severityText: typeof r.severityText === 'string' ? r.severityText : undefined,\n severityNumber: typeof r.severityNumber === 'number' ? r.severityNumber : undefined,\n body,\n attributes: flattenAttributes(r.attributes),\n });\n }\n }\n }\n return out;\n}\n\n/**\n * Translate an OTLP severity (text or number) to a Mastra LogLevel.\n *\n * OTEL severity numbers per spec:\n * 1-4 trace, 5-8 debug, 9-12 info, 13-16 warn, 17-20 error, 21-24 fatal.\n */\nexport function otlpSeverityToLogLevel(text: string | undefined, num: number | undefined): LogLevel {\n if (text) {\n const lc = text.toLowerCase();\n if (lc.startsWith('trace') || lc.startsWith('debug')) return 'debug';\n if (lc.startsWith('info')) return 'info';\n if (lc.startsWith('warn')) return 'warn';\n if (lc.startsWith('error')) return 'error';\n if (lc.startsWith('fatal')) return 'fatal';\n }\n if (typeof num === 'number') {\n if (num <= 8) return 'debug';\n if (num <= 12) return 'info';\n if (num <= 16) return 'warn';\n if (num <= 20) return 'error';\n return 'fatal';\n }\n return 'info';\n}\n\n/**\n * Convert a decoded OTLP span into the Mastra ExportedSpan shape so it\n * can be emitted via the observability bus.\n *\n * All ingested spans use SpanType.GENERIC because we don't know what\n * the user instrumented inside their client tool. The original span\n * name and attributes are preserved.\n */\nexport function buildExportedSpan(\n decoded: DecodedOtlpSpan,\n options: { entityType?: EntityType; entityName?: string; isInternal?: boolean } = {},\n): AnyExportedSpan {\n const errorInfo =\n decoded.statusCode === 2\n ? {\n message: decoded.statusMessage ?? 'Client tool span reported error status',\n // SpanErrorInfo allows extra fields; keep the minimum.\n }\n : undefined;\n return {\n id: decoded.spanId,\n traceId: decoded.traceId,\n name: decoded.name,\n type: SpanType.GENERIC,\n parentSpanId: decoded.parentSpanId,\n isRootSpan: !decoded.parentSpanId,\n startTime: decoded.startTime,\n endTime: decoded.endTime,\n attributes: decoded.attributes,\n entityType: options.entityType,\n entityName: options.entityName,\n isEvent: false,\n ...(errorInfo ? { errorInfo: errorInfo as any } : {}),\n } as AnyExportedSpan;\n}\n\nexport function buildExportedLog(decoded: DecodedOtlpLog): ExportedLog {\n return {\n logId: generateClientSignalId(),\n timestamp: decoded.timestamp,\n traceId: decoded.traceId,\n spanId: decoded.spanId,\n level: otlpSeverityToLogLevel(decoded.severityText, decoded.severityNumber),\n message: typeof decoded.body === 'string' ? decoded.body : decoded.body !== undefined ? String(decoded.body) : '',\n data: decoded.attributes,\n };\n}\n","/**\n * Hand-rolled W3C Trace Context and Baggage propagation.\n *\n * The full propagators in `@opentelemetry/core` weigh ~27KB gzipped.\n * The W3C specs (https://www.w3.org/TR/trace-context/, https://www.w3.org/TR/baggage/)\n * are simple text formats; for the small subset we need (parse and\n * format `traceparent`, parse and format `baggage`), hand-rolling is\n * cheaper and avoids adding an OTEL dependency to @mastra/observability.\n */\n\nconst TRACEPARENT_RE = /^([0-9a-f]{2})-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/;\n\nexport interface TraceparentParts {\n /** Version, currently always \"00\". */\n version: string;\n /** 32 hex chars. */\n traceId: string;\n /** 16 hex chars. Refers to the parent span this carrier identifies. */\n spanId: string;\n /** 2 hex chars. Bit 0 is the sampled flag. */\n flags: string;\n}\n\nexport function parseTraceparent(value: string | undefined): TraceparentParts | null {\n if (!value) return null;\n const m = TRACEPARENT_RE.exec(value.trim());\n if (!m) return null;\n if (m[1] === 'ff') return null;\n if (m[2] === '00000000000000000000000000000000') return null;\n if (m[3] === '0000000000000000') return null;\n return { version: m[1]!, traceId: m[2]!, spanId: m[3]!, flags: m[4]! };\n}\n\nexport function formatTraceparent(traceId: string, spanId: string, sampled: boolean): string {\n return `00-${traceId}-${spanId}-${sampled ? '01' : '00'}`;\n}\n\n/**\n * Parse a W3C Baggage header value into a Map.\n *\n * Format: `key=value,key2=value2;property=...`\n * Properties (after `;`) are ignored — we don't use them.\n * Values are percent-decoded per the spec.\n */\nexport function parseBaggage(value: string | undefined): Map {\n const out = new Map();\n if (!value) return out;\n for (const entry of value.split(',')) {\n const trimmed = entry.trim();\n if (!trimmed) continue;\n // Strip optional `;property=...` suffix\n const semi = trimmed.indexOf(';');\n const head = semi === -1 ? trimmed : trimmed.slice(0, semi);\n const eq = head.indexOf('=');\n if (eq === -1) continue;\n const key = head.slice(0, eq).trim();\n const rawValue = head.slice(eq + 1).trim();\n if (!key) continue;\n let decoded: string;\n try {\n decoded = decodeURIComponent(rawValue);\n } catch {\n decoded = rawValue;\n }\n out.set(key, decoded);\n }\n return out;\n}\n\n/**\n * Format a Map into a W3C Baggage header value.\n * Values are percent-encoded.\n */\nexport function formatBaggage(entries: Map | Record): string {\n const iter = entries instanceof Map ? entries.entries() : Object.entries(entries);\n const parts: string[] = [];\n for (const [key, value] of iter) {\n if (!key) continue;\n parts.push(`${key}=${encodeURIComponent(value)}`);\n }\n return parts.join(',');\n}\n","/**\n * ClientObservabilityProxy implementation for @mastra/observability.\n *\n * Handles the two halves of the client observability flow:\n *\n * - `inject(parentSpan)` (called from request 1) — produces the W3C\n * carrier the server attaches to the outgoing chunk so the client\n * SDK can extract it and parent its child spans/logs correctly.\n *\n * - `receive(payload, parentContext)` (called from request 2 when the\n * client returns) — decodes the OTLP/JSON payload the client sent\n * back, validates that it actually belongs to the parent trace\n * identified by `parentContext`, and forwards each span/log into\n * the observability bus so existing exporters pick them up.\n */\n\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport { EntityType, TracingEventType } from '@mastra/core/observability';\nimport type {\n AnySpan,\n ClientObservabilityCarrier,\n ClientObservabilityProxy,\n ClientObservabilityPayload,\n LogEvent,\n MetricEvent,\n ObservabilityInstance,\n TracingEvent,\n} from '@mastra/core/observability';\n\nimport { BaseObservabilityInstance } from '../instances/base';\nimport { generateClientSignalId } from './id';\nimport { buildExportedLog, buildExportedSpan, decodeResourceLogs, decodeResourceSpans } from './otlp';\nimport type { DecodedOtlpLog, DecodedOtlpSpan } from './otlp';\nimport { formatTraceparent, parseTraceparent } from './w3c';\n\n/**\n * Hard caps. A misbehaving client could ship arbitrary OTLP; reject\n * payloads that blow past these limits to keep the server safe.\n */\nexport interface ClientObservabilityProxyLimits {\n /** Maximum number of spans accepted per receive call. */\n maxSpans: number;\n /** Maximum number of log records accepted per receive call. */\n maxLogs: number;\n /** Maximum total payload size in bytes (JSON.stringify length). */\n maxPayloadBytes: number;\n}\n\nexport const DEFAULT_LIMITS: ClientObservabilityProxyLimits = {\n maxSpans: 10,\n maxLogs: 10,\n maxPayloadBytes: 1024 * 1024,\n};\n\nexport interface CreateClientObservabilityProxyOptions {\n /**\n * Resolves the observability instance to forward into. Called per\n * `receive()` so config selection works the same way as for\n * server-side spans. Returning `undefined` causes the payload to be\n * dropped silently.\n */\n resolveInstance: () => ObservabilityInstance | undefined;\n /** Logger for warnings about dropped/rejected payloads. */\n logger?: IMastraLogger;\n limits?: Partial;\n}\n\nclass ClientObservabilityProxyImpl implements ClientObservabilityProxy {\n readonly #resolveInstance: () => ObservabilityInstance | undefined;\n readonly #logger?: IMastraLogger;\n readonly #limits: ClientObservabilityProxyLimits;\n\n constructor(options: CreateClientObservabilityProxyOptions) {\n this.#resolveInstance = options.resolveInstance;\n this.#logger = options.logger;\n this.#limits = { ...DEFAULT_LIMITS, ...options.limits };\n }\n\n inject(parentSpan: AnySpan): ClientObservabilityCarrier {\n return {\n // Mastra spans use OTel-compatible 32-hex traceIds and 16-hex\n // spanIds, so they drop straight into the W3C format. Sampled\n // flag is always 1: if the parent span exists at all, the trace\n // is being recorded server-side, so the client should record too.\n traceparent: formatTraceparent(parentSpan.traceId, parentSpan.id, true),\n };\n }\n\n receive(payload: ClientObservabilityPayload, parentContext: ClientObservabilityCarrier): void {\n if (!payload || (!payload.spans && !payload.logs && payload.executionDurationMs === undefined)) {\n return;\n }\n\n // Size cap before decoding so a hostile payload can't OOM us.\n let payloadBytes = 0;\n try {\n payloadBytes = JSON.stringify(payload).length;\n } catch {\n this.#warn('Client observability payload is not JSON-serializable; dropping.');\n return;\n }\n if (payloadBytes > this.#limits.maxPayloadBytes) {\n this.#warn('Client observability payload exceeds size limit; dropping.', {\n bytes: payloadBytes,\n limit: this.#limits.maxPayloadBytes,\n });\n return;\n }\n\n const parent = parseTraceparent(parentContext.traceparent);\n if (!parent) {\n this.#warn('Client observability parentContext.traceparent is malformed; dropping payload.');\n return;\n }\n\n const instance = this.#resolveInstance();\n if (!instance || !(instance instanceof BaseObservabilityInstance)) {\n // No instance to forward into; silently drop. This is normal in\n // tests and in setups without a default instance configured.\n return;\n }\n\n const decodedSpans = payload.spans ? decodeResourceSpans(payload.spans) : [];\n const decodedLogs = payload.logs ? decodeResourceLogs(payload.logs) : [];\n\n if (decodedSpans.length > this.#limits.maxSpans) {\n this.#warn('Client observability payload exceeds span count limit; dropping.', {\n spans: decodedSpans.length,\n limit: this.#limits.maxSpans,\n });\n return;\n }\n if (decodedLogs.length > this.#limits.maxLogs) {\n this.#warn('Client observability payload exceeds log count limit; dropping.', {\n logs: decodedLogs.length,\n limit: this.#limits.maxLogs,\n });\n return;\n }\n\n // Validation: every span/log traceId must match the parent\n // traceparent. This prevents a hostile client from injecting spans\n // into traces it doesn't own.\n if (!validateTraceIds(decodedSpans, decodedLogs, parent.traceId)) {\n this.#warn('Client observability payload contains spans or logs from a foreign trace; dropping.');\n return;\n }\n\n // Validation: every span's parentSpanId must resolve to the parent\n // span identified by parentContext, or to another span present in\n // this payload. Forbidding orphans prevents broken trees and bounds\n // the trust we place in client input.\n if (!validateParentLinks(decodedSpans, parent.spanId)) {\n this.#warn('Client observability payload contains spans with orphan parents; dropping.');\n return;\n }\n\n // All validation passed; emit through the bus.\n for (const decoded of decodedSpans) {\n const exported = buildExportedSpan(decoded);\n const startedEvent: TracingEvent = { type: TracingEventType.SPAN_STARTED, exportedSpan: exported };\n instance.__receiveExternalEvent(startedEvent);\n // If the span has an end time, also emit the ended event so\n // exporters that only care about completed spans see it.\n if (exported.endTime) {\n const endedEvent: TracingEvent = { type: TracingEventType.SPAN_ENDED, exportedSpan: exported };\n instance.__receiveExternalEvent(endedEvent);\n }\n }\n for (const decoded of decodedLogs) {\n const log = buildExportedLog(decoded);\n const event: LogEvent = { type: 'log', log };\n instance.__receiveExternalEvent(event);\n }\n\n // Emit the actual client-side execution duration. The server-side\n // CLIENT_TOOL_CALL span only measures carrier emission and args\n // capture, not the browser work performed inside execute().\n if (typeof payload.executionDurationMs === 'number') {\n const hasError = decodedSpans.some(s => s.statusCode === 2);\n const metricEvent: MetricEvent = {\n type: 'metric',\n metric: {\n metricId: generateClientSignalId(),\n timestamp: new Date(),\n traceId: parent.traceId,\n spanId: parent.spanId,\n name: 'mastra_tool_duration_ms',\n value: payload.executionDurationMs,\n labels: { status: hasError ? 'error' : 'ok', toolType: 'client' },\n correlationContext: {\n traceId: parent.traceId,\n spanId: parent.spanId,\n entityType: EntityType.TOOL,\n ...(payload.toolName ? { entityName: payload.toolName } : {}),\n },\n },\n };\n instance.__receiveExternalEvent(metricEvent);\n }\n }\n\n #warn(message: string, data?: Record): void {\n if (this.#logger) {\n this.#logger.warn(`[ClientObservabilityProxy] ${message}`, data);\n }\n }\n}\n\nfunction validateTraceIds(spans: DecodedOtlpSpan[], logs: DecodedOtlpLog[], expected: string): boolean {\n for (const s of spans) if (s.traceId !== expected) return false;\n for (const l of logs) if (l.traceId !== expected) return false;\n return true;\n}\n\nfunction validateParentLinks(spans: DecodedOtlpSpan[], rootParent: string): boolean {\n if (spans.length === 0) return true;\n const known = new Set([rootParent]);\n for (const s of spans) known.add(s.spanId);\n for (const s of spans) {\n if (!s.parentSpanId) {\n return false;\n }\n if (!known.has(s.parentSpanId)) {\n return false;\n }\n }\n return true;\n}\n\nexport function createClientObservabilityProxy(\n options: CreateClientObservabilityProxyOptions,\n): ClientObservabilityProxy {\n return new ClientObservabilityProxyImpl(options);\n}\n","/**\n * Base Exporter for Observability\n *\n * Provides common functionality shared by all observability exporters:\n * - Logger initialization with proper Mastra logger support\n * - Disabled state management\n * - Graceful shutdown lifecycle\n */\n\nimport { ConsoleLogger, LogLevel } from '@mastra/core/logger';\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport type {\n TracingEvent,\n ObservabilityExporter,\n InitExporterOptions,\n CustomSpanFormatter,\n} from '@mastra/core/observability';\n\n/**\n * Base configuration that all exporters should support\n */\nexport interface BaseExporterConfig {\n /** Optional Mastra logger instance */\n logger?: IMastraLogger;\n /** Log level for the exporter (defaults to INFO) - accepts both enum and string */\n logLevel?: LogLevel | 'debug' | 'info' | 'warn' | 'error';\n /**\n * Custom span formatter function to transform exported spans before they are\n * processed by the exporter. This allows customization of how spans appear\n * in vendor-specific observability platforms.\n *\n * Use cases:\n * - Extract plain text from structured AI SDK messages for better readability\n * - Transform input/output format for specific vendor requirements\n * - Add or remove fields based on the target platform\n *\n * @example\n * ```typescript\n * const exporter = new BraintrustExporter({\n * customSpanFormatter: (span) => {\n * // Extract plain text user message for AGENT_RUN spans\n * if (span.type === SpanType.AGENT_RUN && Array.isArray(span.input)) {\n * const userMsg = span.input.find(m => m.role === 'user');\n * return { ...span, input: userMsg?.content ?? span.input };\n * }\n * return span;\n * },\n * });\n * ```\n */\n customSpanFormatter?: CustomSpanFormatter;\n}\n\n/**\n * Abstract base class for observability exporters\n *\n * Handles common concerns:\n * - Logger setup with proper Mastra logger\n * - Disabled state management\n * - Basic lifecycle methods\n *\n * @example\n * ```typescript\n * class MyExporter extends BaseExporter {\n * name = 'my-exporter';\n *\n * constructor(config: MyExporterConfig) {\n * super(config);\n *\n * if (!config.apiKey) {\n * this.setDisabled('Missing API key');\n * return;\n * }\n *\n * // Initialize exporter-specific logic\n * }\n *\n * async _exportEvent(event: TracingEvent): Promise {\n * // Export logic\n * }\n * }\n * ```\n */\nexport abstract class BaseExporter implements ObservabilityExporter {\n /** Exporter name - must be implemented by subclasses */\n abstract name: string;\n\n /** Mastra logger instance */\n protected logger: IMastraLogger;\n\n /** Base configuration (accessible by subclasses) */\n protected readonly baseConfig: BaseExporterConfig;\n\n /** Whether this exporter is disabled */\n #disabled: boolean = false;\n\n /** Public getter for disabled state */\n get isDisabled(): boolean {\n return this.#disabled;\n }\n\n /**\n * Initialize the base exporter with logger\n */\n constructor(config: BaseExporterConfig = {}) {\n this.baseConfig = config;\n // Map string log level to LogLevel enum if needed\n const logLevel = this.resolveLogLevel(config.logLevel);\n // Use constructor name as fallback since this.name isn't set yet (subclass initializes it)\n this.logger = config.logger ?? new ConsoleLogger({ level: logLevel, name: this.constructor.name });\n }\n\n /**\n * Set the logger for the exporter (called by Mastra/ObservabilityInstance during initialization)\n */\n __setLogger(logger: IMastraLogger): void {\n this.logger = logger;\n // Use this.name here since it's guaranteed to be set by the subclass at this point\n this.logger.debug(`Logger updated for exporter [name=${this.name}]`);\n }\n\n /**\n * Convert string log level to LogLevel enum\n */\n private resolveLogLevel(logLevel?: LogLevel | 'debug' | 'info' | 'warn' | 'error'): LogLevel {\n if (!logLevel) {\n return LogLevel.INFO;\n }\n\n // If already a LogLevel enum, return as-is\n if (typeof logLevel === 'number') {\n return logLevel;\n }\n\n // Map string to enum\n const logLevelMap: Record = {\n debug: LogLevel.DEBUG,\n info: LogLevel.INFO,\n warn: LogLevel.WARN,\n error: LogLevel.ERROR,\n };\n\n return logLevelMap[logLevel] ?? LogLevel.INFO;\n }\n\n /**\n * Mark the exporter as disabled and log a message\n *\n * @param reason - Reason why the exporter is disabled\n */\n protected setDisabled(reason: string, level: 'warn' | 'debug' = 'warn'): void {\n this.#disabled = true;\n this.logger[level](`${this.name} disabled: ${reason}`);\n }\n\n /**\n * Apply the customSpanFormatter if configured.\n * This is called automatically by exportTracingEvent before _exportTracingEvent.\n *\n * Supports both synchronous and asynchronous formatters. If the formatter\n * returns a Promise, it will be awaited.\n *\n * @param event - The incoming tracing event\n * @returns The (possibly modified) event to process\n */\n protected async applySpanFormatter(event: TracingEvent): Promise {\n if (this.baseConfig.customSpanFormatter) {\n try {\n const formattedSpan = await this.baseConfig.customSpanFormatter(event.exportedSpan);\n return {\n ...event,\n exportedSpan: formattedSpan,\n };\n } catch (error) {\n this.logger.error(`${this.name}: Error in customSpanFormatter`, {\n error,\n spanId: event.exportedSpan.id,\n traceId: event.exportedSpan.traceId,\n });\n // Fall through to return original event if formatter fails\n }\n }\n return event;\n }\n\n /**\n * Default onTracingEvent handler that delegates to exportTracingEvent.\n *\n * This provides backward compatibility: existing exporters that only implement\n * _exportTracingEvent will automatically receive tracing events routed through\n * the ObservabilityBus. Subclasses can override this if they need different\n * routing behavior for bus-delivered events.\n *\n * Handler presence on ObservabilityExporter = signal support.\n */\n onTracingEvent(event: TracingEvent): void | Promise {\n return this.exportTracingEvent(event);\n }\n\n /**\n * Export a tracing event\n *\n * This method checks if the exporter is disabled, applies the customSpanFormatter,\n * then calls _exportTracingEvent.\n * Subclasses should implement _exportTracingEvent instead of overriding this method.\n */\n async exportTracingEvent(event: TracingEvent): Promise {\n if (this.isDisabled) {\n return;\n }\n const processedEvent = await this.applySpanFormatter(event);\n await this._exportTracingEvent(processedEvent);\n }\n\n /**\n * Export a tracing event - must be implemented by subclasses\n *\n * This method is called by exportTracingEvent after checking if the exporter is disabled.\n */\n protected abstract _exportTracingEvent(event: TracingEvent): Promise;\n\n /**\n * Optional initialization hook called after Mastra is fully configured\n */\n init?(_options: InitExporterOptions): void;\n\n /**\n * Optional method to add scores to traces\n */\n addScoreToTrace?(_args: {\n traceId: string;\n spanId?: string;\n score: number;\n reason?: string;\n scorerName: string;\n metadata?: Record;\n }): Promise;\n\n /**\n * Force flush any buffered/queued spans without shutting down the exporter.\n *\n * This is useful in serverless environments where you need to ensure spans\n * are exported before the runtime instance is terminated, while keeping\n * the exporter active for future requests.\n *\n * Default implementation is a no-op. Override to add flush logic.\n */\n async flush(): Promise {\n this.logger.debug(`${this.name} flush called (no-op in base class)`);\n }\n\n /**\n * Shutdown the exporter and clean up resources\n *\n * Default implementation just logs. Override to add custom cleanup.\n */\n async shutdown(): Promise {\n this.logger.info(`${this.name} shutdown complete`);\n }\n}\n","/**\n * TrackingExporter base class for vendor-specific observability exporters.\n *\n * Provides common functionality for caching trace data in memory, handling\n * out-of-order span arrival via queuing, delayed cleanup, and memory management.\n */\n\nimport { TracingEventType } from '@mastra/core/observability';\nimport type { TracingEvent, AnyExportedSpan, SpanErrorInfo } from '@mastra/core/observability';\nimport type { BaseExporterConfig } from './base';\nimport { BaseExporter } from './base';\n\n/**\n * Represents an event waiting in the early queue for its dependencies.\n */\nexport interface QueuedEvent {\n /** The original tracing event */\n event: TracingEvent;\n /** What this event is waiting for: 'root' or a specific parentSpanId */\n waitingFor: 'root' | string;\n /** Number of times we've attempted to process this event */\n attempts: number;\n /** When this event was queued */\n queuedAt: Date;\n}\n\nexport interface TrackingExporterConfig extends BaseExporterConfig {\n /**\n * Maximum number of attempts to process a queued event before dropping it.\n * @default 5\n */\n earlyQueueMaxAttempts?: number;\n\n /**\n * Time-to-live in milliseconds for queued events. Events older than this are dropped.\n * @default 30000 (30 seconds)\n */\n earlyQueueTTLMs?: number;\n\n /**\n * Delay in milliseconds before cleaning up trace data after all spans have ended.\n * This allows late-arriving data to still be processed.\n * @default 30000 (30 seconds)\n */\n traceCleanupDelayMs?: number;\n\n /**\n * Soft cap on number of traces with activeSpanCount == 0 awaiting cleanup.\n * When exceeded, oldest pending traces are force-cleaned.\n * @default 100\n */\n maxPendingCleanupTraces?: number;\n\n /**\n * Hard cap on total number of traces (including active ones).\n * When exceeded, oldest traces are killed (active spans aborted).\n * Safety valve for memory leaks.\n * @default 500\n */\n maxTotalTraces?: number;\n}\n\n/**\n * Per-trace data container that stores vendor-specific span/event objects and\n * manages the waiting queue for out-of-order event processing.\n *\n * @typeParam TRootData - Vendor-specific root/trace object type (e.g., Langfuse trace, Braintrust logger)\n * @typeParam TSpanData - Vendor-specific span object type (e.g., LangSmith RunTree, Braintrust Span)\n * @typeParam TEventData - Vendor-specific event object type\n * @typeParam TMetadata - Vendor-specific metadata type for spans\n */\nexport class TraceData {\n /** The vendor-specific root/trace object */\n #rootSpan?: TRootData;\n /** The span ID of the root span */\n #rootSpanId?: string;\n /** Whether a span with isRootSpan=true has been successfully processed */\n #rootSpanProcessed: boolean;\n /** Maps eventId to vendor-specific event objects */\n #events: Map;\n /** Maps spanId to vendor-specific span objects */\n #spans: Map;\n /** Maps spanId to parentSpanId, representing the span hierarchy */\n #tree: Map;\n /** Set of span IDs that have started but not yet ended */\n #activeSpanIds: Set;\n /** Maps spanId to vendor-specific metadata */\n #metadata: Map;\n /** Arbitrary key-value storage for per-trace data */\n #extraData: Map;\n /** Events waiting for the root span to be processed */\n #waitingForRoot: QueuedEvent[];\n /** Events waiting for specific parent spans, keyed by parentSpanId */\n #waitingForParent: Map;\n\n /** When this trace data was created, used for cap enforcement */\n readonly createdAt: Date;\n\n constructor() {\n this.#events = new Map();\n this.#spans = new Map();\n this.#activeSpanIds = new Set();\n this.#tree = new Map();\n this.#metadata = new Map();\n this.#extraData = new Map();\n this.#rootSpanProcessed = false;\n this.#waitingForRoot = [];\n this.#waitingForParent = new Map();\n this.createdAt = new Date();\n }\n\n /**\n * Check if this trace has a root span registered.\n * @returns True if addRoot() has been called\n */\n hasRoot(): boolean {\n return !!this.#rootSpanId;\n }\n\n /**\n * Register the root span for this trace.\n * @param args.rootId - The span ID of the root span\n * @param args.rootData - The vendor-specific root object\n */\n addRoot(args: { rootId: string; rootData: TRootData }): void {\n this.#rootSpanId = args.rootId;\n this.#rootSpan = args.rootData;\n this.#rootSpanProcessed = true;\n }\n\n /**\n * Get the vendor-specific root object.\n * @returns The root object, or undefined if not yet set\n */\n getRoot(): TRootData | undefined {\n return this.#rootSpan;\n }\n\n /**\n * Check if a span with isRootSpan=true has been successfully processed.\n * Set via addRoot() or markRootSpanProcessed().\n * @returns True if the root span has been processed\n */\n isRootProcessed(): boolean {\n return this.#rootSpanProcessed;\n }\n\n /**\n * Mark that the root span has been processed.\n * Used by exporters with skipBuildRootTask=true where root goes through _buildSpan\n * instead of _buildRoot.\n */\n markRootSpanProcessed(): void {\n this.#rootSpanProcessed = true;\n }\n\n /**\n * Store an arbitrary value in per-trace storage.\n * @param key - Storage key\n * @param value - Value to store\n */\n setExtraValue(key: string, value: unknown): void {\n this.#extraData.set(key, value);\n }\n\n /**\n * Check if a key exists in per-trace storage.\n * @param key - Storage key\n * @returns True if the key exists\n */\n hasExtraValue(key: string): boolean {\n return this.#extraData.has(key);\n }\n\n /**\n * Get a value from per-trace storage.\n * @param key - Storage key\n * @returns The stored value, or undefined if not found\n */\n getExtraValue(key: string): unknown {\n return this.#extraData.get(key);\n }\n\n // ============================================================================\n // Early Queue Methods\n // ============================================================================\n\n /**\n * Add an event to the waiting queue.\n * @param args.event - The tracing event to queue\n * @param args.waitingFor - 'root' or a specific parentSpanId\n * @param args.attempts - Optional: preserve attempts count when re-queuing\n * @param args.queuedAt - Optional: preserve original queue time when re-queuing\n */\n addToWaitingQueue(args: {\n event: TracingEvent;\n waitingFor: 'root' | string;\n attempts?: number;\n queuedAt?: Date;\n }): void {\n const queuedEvent: QueuedEvent = {\n event: args.event,\n waitingFor: args.waitingFor,\n attempts: args.attempts ?? 0,\n queuedAt: args.queuedAt ?? new Date(),\n };\n\n if (args.waitingFor === 'root') {\n this.#waitingForRoot.push(queuedEvent);\n } else {\n const queue = this.#waitingForParent.get(args.waitingFor) ?? [];\n queue.push(queuedEvent);\n this.#waitingForParent.set(args.waitingFor, queue);\n }\n }\n\n /**\n * Get all events waiting for the root span.\n * Returns a copy of the internal array.\n */\n getEventsWaitingForRoot(): QueuedEvent[] {\n return [...this.#waitingForRoot];\n }\n\n /**\n * Get all events waiting for a specific parent span.\n * Returns a copy of the internal array.\n */\n getEventsWaitingFor(args: { spanId: string }): QueuedEvent[] {\n return [...(this.#waitingForParent.get(args.spanId) ?? [])];\n }\n\n /**\n * Clear the waiting-for-root queue.\n */\n clearWaitingForRoot(): void {\n this.#waitingForRoot = [];\n }\n\n /**\n * Clear the waiting queue for a specific parent span.\n */\n clearWaitingFor(args: { spanId: string }): void {\n this.#waitingForParent.delete(args.spanId);\n }\n\n /**\n * Get total count of events in all waiting queues.\n */\n waitingQueueSize(): number {\n let count = this.#waitingForRoot.length;\n for (const queue of this.#waitingForParent.values()) {\n count += queue.length;\n }\n return count;\n }\n\n /**\n * Get all queued events across all waiting queues.\n * Used for cleanup and logging orphaned events.\n * @returns Array of all queued events\n */\n getAllQueuedEvents(): QueuedEvent[] {\n const all: QueuedEvent[] = [...this.#waitingForRoot];\n for (const queue of this.#waitingForParent.values()) {\n all.push(...queue);\n }\n return all;\n }\n\n // ============================================================================\n // Span Tree Methods\n // ============================================================================\n\n /**\n * Record the parent-child relationship for a span.\n * @param args.spanId - The child span ID\n * @param args.parentSpanId - The parent span ID, or undefined for root spans\n */\n addBranch(args: { spanId: string; parentSpanId: string | undefined }): void {\n this.#tree.set(args.spanId, args.parentSpanId);\n }\n\n /**\n * Get the parent span ID for a given span.\n * @param args.spanId - The span ID to look up\n * @returns The parent span ID, or undefined if root or not found\n */\n getParentId(args: { spanId: string }): string | undefined {\n return this.#tree.get(args.spanId);\n }\n\n // ============================================================================\n // Span Management Methods\n // ============================================================================\n\n /**\n * Register a span and mark it as active.\n * @param args.spanId - The span ID\n * @param args.spanData - The vendor-specific span object\n */\n addSpan(args: { spanId: string; spanData: TSpanData }): void {\n this.#spans.set(args.spanId, args.spanData);\n this.#activeSpanIds.add(args.spanId);\n }\n\n /**\n * Check if a span exists (regardless of active state).\n * @param args.spanId - The span ID to check\n * @returns True if the span exists\n */\n hasSpan(args: { spanId: string }): boolean {\n return this.#spans.has(args.spanId);\n }\n\n /**\n * Get a span by ID.\n * @param args.spanId - The span ID to look up\n * @returns The vendor-specific span object, or undefined if not found\n */\n getSpan(args: { spanId: string }): TSpanData | undefined {\n return this.#spans.get(args.spanId);\n }\n\n /**\n * Mark a span as ended (no longer active).\n * @param args.spanId - The span ID to mark as ended\n */\n endSpan(args: { spanId: string }): void {\n this.#activeSpanIds.delete(args.spanId);\n }\n\n /**\n * Check if a span is currently active (started but not ended).\n * @param args.spanId - The span ID to check\n * @returns True if the span is active\n */\n isActiveSpan(args: { spanId: string }): boolean {\n return this.#activeSpanIds.has(args.spanId);\n }\n\n /**\n * Get the count of currently active spans.\n * @returns Number of active spans\n */\n activeSpanCount(): number {\n return this.#activeSpanIds.size;\n }\n\n /**\n * Get all active span IDs.\n * @returns Array of active span IDs\n */\n get activeSpanIds(): string[] {\n return [...this.#activeSpanIds];\n }\n\n // ============================================================================\n // Event Management Methods\n // ============================================================================\n\n /**\n * Register an event.\n * @param args.eventId - The event ID\n * @param args.eventData - The vendor-specific event object\n */\n addEvent(args: { eventId: string; eventData: TEventData }): void {\n this.#events.set(args.eventId, args.eventData);\n }\n\n // ============================================================================\n // Metadata Methods\n // ============================================================================\n\n /**\n * Store vendor-specific metadata for a span.\n * Note: This overwrites any existing metadata for the span.\n * @param args.spanId - The span ID\n * @param args.metadata - The vendor-specific metadata\n */\n addMetadata(args: { spanId: string; metadata: TMetadata }): void {\n this.#metadata.set(args.spanId, args.metadata);\n }\n\n /**\n * Get vendor-specific metadata for a span.\n * @param args.spanId - The span ID\n * @returns The metadata, or undefined if not found\n */\n getMetadata(args: { spanId: string }): TMetadata | undefined {\n return this.#metadata.get(args.spanId);\n }\n\n // ============================================================================\n // Parent Lookup Methods\n // ============================================================================\n\n /**\n * Get the parent span or event for a given span.\n * Looks up in both spans and events maps.\n * @param args.span - The span to find the parent for\n * @returns The parent span/event object, or undefined if root or not found\n */\n getParent(args: { span: AnyExportedSpan }): TSpanData | TEventData | undefined {\n const parentId = args.span.parentSpanId;\n if (parentId) {\n if (this.#spans.has(parentId)) {\n return this.#spans.get(parentId);\n }\n if (this.#events.has(parentId)) {\n return this.#events.get(parentId);\n }\n }\n return undefined;\n }\n\n /**\n * Get the parent span/event or fall back to the root object.\n * Useful for vendors that attach child spans to either parent spans or the trace root.\n * @param args.span - The span to find the parent for\n * @returns The parent span/event, the root object, or undefined\n */\n getParentOrRoot(args: { span: AnyExportedSpan }): TRootData | TSpanData | TEventData | undefined {\n return this.getParent(args) ?? this.getRoot();\n }\n}\n\n// Default configuration values\nconst DEFAULT_EARLY_QUEUE_MAX_ATTEMPTS = 5;\nconst DEFAULT_EARLY_QUEUE_TTL_MS = 30000; // 30 seconds\nconst DEFAULT_TRACE_CLEANUP_DELAY_MS = 30000; // 30 seconds\nconst DEFAULT_MAX_PENDING_CLEANUP_TRACES = 100;\nconst DEFAULT_MAX_TOTAL_TRACES = 500;\n\n/**\n * Abstract base class for vendor-specific observability exporters that need to\n * track trace and span state in memory.\n *\n * This class provides:\n * - Per-trace data caching via TraceData instances\n * - Out-of-order span handling via waiting queues (for when children arrive before parents)\n * - Delayed cleanup to handle late-arriving data\n * - Memory management via configurable soft/hard caps on trace count\n * - Graceful shutdown with span abortion\n *\n * Subclasses must implement the abstract methods to handle vendor-specific\n * span/event creation and lifecycle.\n *\n * @typeParam TRootData - Vendor-specific root/trace object type\n * @typeParam TSpanData - Vendor-specific span object type\n * @typeParam TEventData - Vendor-specific event object type\n * @typeParam TMetadata - Vendor-specific metadata type\n * @typeParam TConfig - Configuration type (must extend TrackingExporterConfig)\n *\n * @example\n * ```typescript\n * class MyExporter extends TrackingExporter {\n * name = 'my-exporter';\n *\n * protected async _buildRoot(args) { ... }\n * protected async _buildSpan(args) { ... }\n * protected async _buildEvent(args) { ... }\n * protected async _updateSpan(args) { ... }\n * protected async _finishSpan(args) { ... }\n * protected async _abortSpan(args) { ... }\n * }\n * ```\n */\nexport abstract class TrackingExporter<\n TRootData,\n TSpanData,\n TEventData,\n TMetadata,\n TConfig extends TrackingExporterConfig,\n> extends BaseExporter {\n /** Map of traceId to per-trace data container */\n #traceMap = new Map>();\n /** Flag to prevent processing during shutdown */\n #shutdownStarted = false;\n /** Flag to prevent concurrent hard cap enforcement */\n #hardCapEnforcementInProgress = false;\n /** Map of traceId to scheduled cleanup timeout */\n #pendingCleanups = new Map>();\n // Note: #traceMap maintains insertion order (JS Map spec), so we use\n // #traceMap.keys() to iterate traces oldest-first for cap enforcement.\n\n /** Subclass configuration with resolved values */\n protected readonly config: TConfig;\n\n /** Maximum attempts to process a queued event before dropping */\n readonly #earlyQueueMaxAttempts: number;\n /** TTL in milliseconds for queued events */\n readonly #earlyQueueTTLMs: number;\n /** Delay before cleaning up completed traces */\n readonly #traceCleanupDelayMs: number;\n /** Soft cap on traces awaiting cleanup */\n readonly #maxPendingCleanupTraces: number;\n /** Hard cap on total traces (will abort active spans if exceeded) */\n readonly #maxTotalTraces: number;\n\n constructor(config: TConfig) {\n super(config);\n this.config = config;\n\n this.#earlyQueueMaxAttempts = config.earlyQueueMaxAttempts ?? DEFAULT_EARLY_QUEUE_MAX_ATTEMPTS;\n this.#earlyQueueTTLMs = config.earlyQueueTTLMs ?? DEFAULT_EARLY_QUEUE_TTL_MS;\n this.#traceCleanupDelayMs = config.traceCleanupDelayMs ?? DEFAULT_TRACE_CLEANUP_DELAY_MS;\n this.#maxPendingCleanupTraces = config.maxPendingCleanupTraces ?? DEFAULT_MAX_PENDING_CLEANUP_TRACES;\n this.#maxTotalTraces = config.maxTotalTraces ?? DEFAULT_MAX_TOTAL_TRACES;\n }\n\n // ============================================================================\n // Early Queue Processing\n // ============================================================================\n\n /**\n * Schedule async processing of events waiting for root span.\n * Called after root span is successfully processed.\n */\n #scheduleProcessWaitingForRoot(traceId: string): void {\n setImmediate(() => {\n this.#processWaitingForRoot(traceId).catch(error => {\n this.logger.error(`${this.name}: Error processing waiting-for-root queue`, { error, traceId });\n });\n });\n }\n\n /**\n * Schedule async processing of events waiting for a specific parent span.\n * Called after a span/event is successfully created.\n */\n #scheduleProcessWaitingFor(traceId: string, spanId: string): void {\n setImmediate(() => {\n this.#processWaitingFor(traceId, spanId).catch(error => {\n this.logger.error(`${this.name}: Error processing waiting queue`, { error, traceId, spanId });\n });\n });\n }\n\n /**\n * Process all events waiting for root span.\n */\n async #processWaitingForRoot(traceId: string): Promise {\n if (this.#shutdownStarted) return;\n\n const traceData = this.#traceMap.get(traceId);\n if (!traceData) return;\n\n const queue = traceData.getEventsWaitingForRoot();\n if (queue.length === 0) return;\n\n this.logger.debug(`${this.name}: Processing ${queue.length} events waiting for root`, { traceId });\n\n // Process events, collecting ones to keep\n const toKeep: QueuedEvent[] = [];\n const now = Date.now();\n\n for (const queuedEvent of queue) {\n // Check TTL\n if (now - queuedEvent.queuedAt.getTime() > this.#earlyQueueTTLMs) {\n this.logger.warn(`${this.name}: Dropping event due to TTL expiry`, {\n traceId,\n spanId: queuedEvent.event.exportedSpan.id,\n waitingFor: queuedEvent.waitingFor,\n queuedAt: queuedEvent.queuedAt,\n attempts: queuedEvent.attempts,\n });\n continue;\n }\n\n // Check max attempts\n if (queuedEvent.attempts >= this.#earlyQueueMaxAttempts) {\n this.logger.warn(`${this.name}: Dropping event due to max attempts`, {\n traceId,\n spanId: queuedEvent.event.exportedSpan.id,\n waitingFor: queuedEvent.waitingFor,\n attempts: queuedEvent.attempts,\n });\n continue;\n }\n\n // Try to process\n queuedEvent.attempts++;\n const processed = await this.#tryProcessQueuedEvent(queuedEvent, traceData);\n\n if (!processed) {\n // Move to waiting-for-parent if we now know the parent\n const parentId = queuedEvent.event.exportedSpan.parentSpanId;\n if (parentId && traceData.isRootProcessed()) {\n // Preserve attempts and queuedAt when moving between queues\n traceData.addToWaitingQueue({\n event: queuedEvent.event,\n waitingFor: parentId,\n attempts: queuedEvent.attempts,\n queuedAt: queuedEvent.queuedAt,\n });\n } else {\n toKeep.push(queuedEvent);\n }\n }\n }\n\n // Update the queue with remaining events\n traceData.clearWaitingForRoot();\n for (const event of toKeep) {\n // Preserve attempts and queuedAt when re-adding to queue\n traceData.addToWaitingQueue({\n event: event.event,\n waitingFor: 'root',\n attempts: event.attempts,\n queuedAt: event.queuedAt,\n });\n }\n }\n\n /**\n * Process events waiting for a specific parent span.\n */\n async #processWaitingFor(traceId: string, spanId: string): Promise {\n if (this.#shutdownStarted) return;\n\n const traceData = this.#traceMap.get(traceId);\n if (!traceData) return;\n\n const queue = traceData.getEventsWaitingFor({ spanId });\n if (queue.length === 0) return;\n\n this.logger.debug(`${this.name}: Processing ${queue.length} events waiting for span`, { traceId, spanId });\n\n const toKeep: QueuedEvent[] = [];\n const now = Date.now();\n\n for (const queuedEvent of queue) {\n // Check TTL\n if (now - queuedEvent.queuedAt.getTime() > this.#earlyQueueTTLMs) {\n this.logger.warn(`${this.name}: Dropping event due to TTL expiry`, {\n traceId,\n spanId: queuedEvent.event.exportedSpan.id,\n waitingFor: queuedEvent.waitingFor,\n queuedAt: queuedEvent.queuedAt,\n attempts: queuedEvent.attempts,\n });\n continue;\n }\n\n // Check max attempts\n if (queuedEvent.attempts >= this.#earlyQueueMaxAttempts) {\n this.logger.warn(`${this.name}: Dropping event due to max attempts`, {\n traceId,\n spanId: queuedEvent.event.exportedSpan.id,\n waitingFor: queuedEvent.waitingFor,\n attempts: queuedEvent.attempts,\n });\n continue;\n }\n\n // Try to process\n queuedEvent.attempts++;\n const processed = await this.#tryProcessQueuedEvent(queuedEvent, traceData);\n\n if (!processed) {\n toKeep.push(queuedEvent);\n }\n }\n\n // Update the queue\n traceData.clearWaitingFor({ spanId });\n for (const event of toKeep) {\n // Preserve attempts and queuedAt when re-adding to queue\n traceData.addToWaitingQueue({\n event: event.event,\n waitingFor: spanId,\n attempts: event.attempts,\n queuedAt: event.queuedAt,\n });\n }\n }\n\n /**\n * Try to process a queued event.\n * Returns true if successfully processed, false if still waiting for dependencies.\n */\n async #tryProcessQueuedEvent(\n queuedEvent: QueuedEvent,\n traceData: TraceData,\n ): Promise {\n const { event } = queuedEvent;\n const { exportedSpan } = event;\n\n // Determine method\n const method = this.getMethod(event);\n\n try {\n switch (method) {\n case 'handleEventSpan': {\n traceData.addBranch({ spanId: exportedSpan.id, parentSpanId: exportedSpan.parentSpanId });\n const eventData = await this._buildEvent({ span: exportedSpan, traceData });\n if (eventData) {\n if (!this.skipCachingEventSpans) {\n traceData.addEvent({ eventId: exportedSpan.id, eventData });\n }\n // Successfully processed - schedule processing of events waiting for this one\n this.#scheduleProcessWaitingFor(exportedSpan.traceId, exportedSpan.id);\n return true;\n }\n return false;\n }\n\n case 'handleSpanStart': {\n traceData.addBranch({ spanId: exportedSpan.id, parentSpanId: exportedSpan.parentSpanId });\n const spanData = await this._buildSpan({ span: exportedSpan, traceData });\n if (spanData) {\n traceData.addSpan({ spanId: exportedSpan.id, spanData });\n // Mark root as processed if this is the root span\n if (exportedSpan.isRootSpan) {\n traceData.markRootSpanProcessed();\n }\n // Successfully processed - schedule processing of events waiting for this one\n this.#scheduleProcessWaitingFor(exportedSpan.traceId, exportedSpan.id);\n return true;\n }\n return false;\n }\n\n case 'handleSpanUpdate': {\n await this._updateSpan({ span: exportedSpan, traceData });\n return true;\n }\n\n case 'handleSpanEnd': {\n traceData.endSpan({ spanId: exportedSpan.id });\n await this._finishSpan({ span: exportedSpan, traceData });\n // Check if we should schedule cleanup\n if (traceData.activeSpanCount() === 0) {\n this.#scheduleCleanup(exportedSpan.traceId);\n }\n return true;\n }\n default:\n // Should never happen - exhaustive switch\n return false;\n }\n } catch (error) {\n this.logger.error(`${this.name}: Error processing queued event`, { error, event, method });\n return false;\n }\n }\n\n // ============================================================================\n // Delayed Cleanup\n // ============================================================================\n\n /**\n * Schedule cleanup of trace data after a delay.\n * Allows late-arriving data to still be processed.\n */\n #scheduleCleanup(traceId: string): void {\n // Cancel any existing scheduled cleanup for this trace\n this.#cancelScheduledCleanup(traceId);\n\n this.logger.debug(`${this.name}: Scheduling cleanup in ${this.#traceCleanupDelayMs}ms`, { traceId });\n\n const timeout = setTimeout(() => {\n this.#pendingCleanups.delete(traceId);\n this.#performCleanup(traceId);\n }, this.#traceCleanupDelayMs);\n\n this.#pendingCleanups.set(traceId, timeout);\n\n // Enforce soft cap on pending cleanups\n this.#enforcePendingCleanupCap();\n }\n\n /**\n * Cancel a scheduled cleanup for a trace.\n */\n #cancelScheduledCleanup(traceId: string): void {\n const existingTimeout = this.#pendingCleanups.get(traceId);\n if (existingTimeout) {\n clearTimeout(existingTimeout);\n this.#pendingCleanups.delete(traceId);\n this.logger.debug(`${this.name}: Cancelled scheduled cleanup`, { traceId });\n }\n }\n\n /**\n * Perform the actual cleanup of trace data.\n */\n #performCleanup(traceId: string): void {\n const traceData = this.#traceMap.get(traceId);\n if (!traceData) return;\n\n // Log any orphaned events in the queue\n const orphanedEvents = traceData.getAllQueuedEvents();\n if (orphanedEvents.length > 0) {\n this.logger.warn(`${this.name}: Dropping ${orphanedEvents.length} orphaned events on cleanup`, {\n traceId,\n orphanedEvents: orphanedEvents.map(e => ({\n spanId: e.event.exportedSpan.id,\n waitingFor: e.waitingFor,\n attempts: e.attempts,\n queuedAt: e.queuedAt,\n })),\n });\n }\n\n // Remove from trace map (O(1) - Map maintains insertion order automatically)\n this.#traceMap.delete(traceId);\n\n this.logger.debug(`${this.name}: Cleaned up trace data`, { traceId });\n }\n\n // ============================================================================\n // Cap Enforcement\n // ============================================================================\n\n /**\n * Enforce soft cap on pending cleanup traces.\n * Only removes traces with activeSpanCount == 0.\n */\n #enforcePendingCleanupCap(): void {\n if (this.#pendingCleanups.size <= this.#maxPendingCleanupTraces) {\n return;\n }\n\n const toRemove = this.#pendingCleanups.size - this.#maxPendingCleanupTraces;\n this.logger.warn(`${this.name}: Pending cleanup cap exceeded, force-cleaning ${toRemove} traces`, {\n pendingCount: this.#pendingCleanups.size,\n cap: this.#maxPendingCleanupTraces,\n });\n\n // Remove oldest pending cleanups (Map.keys() iterates in insertion order)\n let removed = 0;\n for (const traceId of this.#traceMap.keys()) {\n if (removed >= toRemove) break;\n\n if (this.#pendingCleanups.has(traceId)) {\n this.#cancelScheduledCleanup(traceId);\n this.#performCleanup(traceId);\n removed++;\n }\n }\n }\n\n /**\n * Enforce hard cap on total traces.\n * Will kill even active traces if necessary.\n * Uses a flag to prevent concurrent executions when called fire-and-forget.\n */\n async #enforceHardCap(): Promise {\n // Skip if already under cap or enforcement already in progress\n if (this.#traceMap.size <= this.#maxTotalTraces || this.#hardCapEnforcementInProgress) {\n return;\n }\n\n this.#hardCapEnforcementInProgress = true;\n try {\n // Re-check after acquiring the flag (another call may have just finished)\n if (this.#traceMap.size <= this.#maxTotalTraces) {\n return;\n }\n\n const toRemove = this.#traceMap.size - this.#maxTotalTraces;\n this.logger.warn(`${this.name}: Total trace cap exceeded, killing ${toRemove} oldest traces`, {\n traceCount: this.#traceMap.size,\n cap: this.#maxTotalTraces,\n });\n\n const reason: SpanErrorInfo = {\n id: 'TRACE_CAP_EXCEEDED',\n message: 'Trace killed due to memory cap enforcement.',\n domain: 'MASTRA_OBSERVABILITY',\n category: 'SYSTEM',\n };\n\n let removed = 0;\n // Use a copy of keys since we're modifying the map during iteration\n for (const traceId of [...this.#traceMap.keys()]) {\n if (removed >= toRemove) break;\n\n const traceData = this.#traceMap.get(traceId);\n if (traceData) {\n // Abort any active spans\n for (const spanId of traceData.activeSpanIds) {\n const span = traceData.getSpan({ spanId });\n if (span) {\n await this._abortSpan({ span, traceData, reason });\n }\n }\n\n // Cancel any pending cleanup and remove\n this.#cancelScheduledCleanup(traceId);\n this.#performCleanup(traceId);\n removed++;\n }\n }\n } finally {\n this.#hardCapEnforcementInProgress = false;\n }\n }\n\n // ============================================================================\n // Lifecycle Hooks (Override in subclass)\n // ============================================================================\n\n /**\n * Hook called before processing each tracing event.\n * Override to transform or enrich the event before processing.\n *\n * Note: The customSpanFormatter is applied at the BaseExporter level before this hook.\n * Subclasses can override this to add additional pre-processing logic.\n *\n * @param event - The incoming tracing event\n * @returns The (possibly modified) event to process\n */\n protected async _preExportTracingEvent(event: TracingEvent): Promise {\n return event;\n }\n\n /**\n * Hook called after processing each tracing event.\n * Override to perform post-processing actions like flushing.\n */\n protected async _postExportTracingEvent(): Promise {}\n\n // ============================================================================\n // Abstract Methods (Must implement in subclass)\n // ============================================================================\n\n /**\n * Build the vendor-specific root/trace object for a new trace.\n * Called when the first span of a trace arrives (if skipBuildRootTask is false).\n *\n * @param args.span - The root span data\n * @param args.traceData - The trace data container\n * @returns The vendor-specific root object, or undefined if unable to create\n */\n protected abstract _buildRoot(args: {\n span: AnyExportedSpan;\n traceData: TraceData;\n }): Promise;\n\n /**\n * Build a vendor-specific event object.\n * Events are zero-duration spans used for logging discrete occurrences.\n *\n * @param args.span - The event span data\n * @param args.traceData - The trace data container\n * @returns The vendor-specific event object, or undefined if parent not ready\n */\n protected abstract _buildEvent(args: {\n span: AnyExportedSpan;\n traceData: TraceData;\n }): Promise;\n\n /**\n * Build a vendor-specific span object when a span starts.\n * Should create the span in the vendor system and return the SDK object.\n *\n * @param args.span - The span data\n * @param args.traceData - The trace data container\n * @returns The vendor-specific span object, or undefined if parent not ready\n */\n protected abstract _buildSpan(args: {\n span: AnyExportedSpan;\n traceData: TraceData;\n }): Promise;\n\n /**\n * Update a span with new data (called on span_updated events).\n * Should update the vendor span with any new attributes, metrics, etc.\n *\n * @param args.span - The updated span data\n * @param args.traceData - The trace data container\n */\n protected abstract _updateSpan(args: {\n span: AnyExportedSpan;\n traceData: TraceData;\n }): Promise;\n\n /**\n * Finish a span (called on span_ended events).\n * Should close/end the span in the vendor system with final data.\n *\n * @param args.span - The ended span data\n * @param args.traceData - The trace data container\n */\n protected abstract _finishSpan(args: {\n span: AnyExportedSpan;\n traceData: TraceData;\n }): Promise;\n\n /**\n * Abort a span due to shutdown or memory cap enforcement.\n * Should mark the span as failed/aborted in the vendor system.\n *\n * @param args.span - The vendor-specific span object to abort\n * @param args.traceData - The trace data container\n * @param args.reason - Error info describing why the span was aborted\n */\n protected abstract _abortSpan(args: {\n span: TSpanData;\n traceData: TraceData;\n reason: SpanErrorInfo;\n }): Promise;\n\n // ============================================================================\n // Behavior Flags (Override in subclass as needed)\n // ============================================================================\n\n /**\n * If true, skip calling _buildRoot and let root spans go through _buildSpan.\n * Use when the vendor doesn't have a separate trace/root concept.\n * @default false\n */\n protected skipBuildRootTask = false;\n\n /**\n * If true, skip processing span_updated events entirely.\n * Use when the vendor doesn't support incremental span updates.\n * @default false\n */\n protected skipSpanUpdateEvents = false;\n\n /**\n * If true, don't cache event spans in TraceData.\n * Use when events can't be parents of other spans.\n * @default false\n */\n protected skipCachingEventSpans = false;\n\n private getMethod(event: TracingEvent): 'handleEventSpan' | 'handleSpanStart' | 'handleSpanUpdate' | 'handleSpanEnd' {\n if (event.exportedSpan.isEvent) {\n return 'handleEventSpan';\n }\n const eventType = event.type;\n switch (eventType) {\n case TracingEventType.SPAN_STARTED:\n return 'handleSpanStart';\n case TracingEventType.SPAN_UPDATED:\n return 'handleSpanUpdate';\n case TracingEventType.SPAN_ENDED:\n return 'handleSpanEnd';\n default: {\n // Exhaustive check - TypeScript will error if new TracingEventType values are added\n const _exhaustiveCheck: never = eventType;\n throw new Error(`Unhandled event type: ${_exhaustiveCheck}`);\n }\n }\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise {\n if (this.#shutdownStarted) {\n return;\n }\n\n const method = this.getMethod(event);\n if (method == 'handleSpanUpdate' && this.skipSpanUpdateEvents) {\n return;\n }\n\n const traceId = event.exportedSpan.traceId;\n const traceData = this.getTraceData({ traceId, method });\n\n const { exportedSpan } = await this._preExportTracingEvent(event);\n\n // Handle root span building for exporters that need it\n if (!this.skipBuildRootTask && !traceData.hasRoot()) {\n if (exportedSpan.isRootSpan) {\n this.logger.debug(`${this.name}: Building root`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n });\n const rootData = await this._buildRoot({ span: exportedSpan, traceData });\n if (rootData) {\n this.logger.debug(`${this.name}: Adding root`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n });\n traceData.addRoot({ rootId: exportedSpan.id, rootData });\n // Root is now processed, trigger async processing of waiting events\n this.#scheduleProcessWaitingForRoot(traceId);\n }\n // Note: Root span still continues to handleSpanStart below to track\n // the span as active and call _buildSpan for vendor-specific handling\n } else {\n this.logger.debug(`${this.name}: Root does not exist, adding span to waiting queue.`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n });\n traceData.addToWaitingQueue({ event, waitingFor: 'root' });\n return;\n }\n }\n\n if (exportedSpan.metadata && this.name in exportedSpan.metadata) {\n const metadata = exportedSpan.metadata[this.name] as TMetadata;\n this.logger.debug(`${this.name}: Found provider metadata in span`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n metadata,\n });\n traceData.addMetadata({ spanId: exportedSpan.id, metadata });\n }\n\n try {\n switch (method) {\n case 'handleEventSpan': {\n this.logger.debug(`${this.name}: handling event`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n });\n traceData.addBranch({ spanId: exportedSpan.id, parentSpanId: exportedSpan.parentSpanId });\n const eventData = await this._buildEvent({ span: exportedSpan, traceData });\n if (eventData) {\n if (!this.skipCachingEventSpans) {\n this.logger.debug(`${this.name}: adding event to traceData`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n });\n traceData.addEvent({ eventId: exportedSpan.id, eventData });\n }\n // Event created successfully, trigger processing of any waiting events\n this.#scheduleProcessWaitingFor(traceId, exportedSpan.id);\n } else {\n // Parent doesn't exist, queue for later\n const parentId = exportedSpan.parentSpanId;\n this.logger.debug(`${this.name}: adding event to waiting queue`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n waitingFor: parentId ?? 'root',\n });\n traceData.addToWaitingQueue({ event, waitingFor: parentId ?? 'root' });\n }\n break;\n }\n case 'handleSpanStart': {\n this.logger.debug(`${this.name}: handling span start`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n });\n traceData.addBranch({ spanId: exportedSpan.id, parentSpanId: exportedSpan.parentSpanId });\n const spanData = await this._buildSpan({ span: exportedSpan, traceData });\n if (spanData) {\n this.logger.debug(`${this.name}: adding span to traceData`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n });\n traceData.addSpan({ spanId: exportedSpan.id, spanData });\n // Mark root as processed for skipBuildRootTask exporters\n if (exportedSpan.isRootSpan) {\n traceData.markRootSpanProcessed();\n this.#scheduleProcessWaitingForRoot(traceId);\n }\n // Span created successfully, trigger processing of any waiting events\n this.#scheduleProcessWaitingFor(traceId, exportedSpan.id);\n } else {\n // Parent doesn't exist, queue for later\n const parentId = exportedSpan.parentSpanId;\n this.logger.debug(`${this.name}: adding span to waiting queue`, {\n traceId: exportedSpan.traceId,\n waitingFor: parentId ?? 'root',\n });\n traceData.addToWaitingQueue({ event, waitingFor: parentId ?? 'root' });\n }\n break;\n }\n case 'handleSpanUpdate':\n this.logger.debug(`${this.name}: handling span update`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n });\n await this._updateSpan({ span: exportedSpan, traceData });\n break;\n case 'handleSpanEnd':\n this.logger.debug(`${this.name}: handling span end`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n });\n traceData.endSpan({ spanId: exportedSpan.id });\n await this._finishSpan({ span: exportedSpan, traceData });\n // Schedule cleanup when all spans have ended\n if (traceData.activeSpanCount() === 0) {\n this.#scheduleCleanup(traceId);\n }\n break;\n }\n } catch (error) {\n this.logger.error(`${this.name}: exporter error`, { error, event, method });\n }\n\n // Reschedule cleanup if all spans have ended\n // This handles the case where late data arrives after all spans ended\n // (getTraceData cancels any existing cleanup, so we need to reschedule)\n if (traceData.activeSpanCount() === 0) {\n this.#scheduleCleanup(traceId);\n }\n\n await this._postExportTracingEvent();\n }\n\n // ============================================================================\n // Protected Helpers\n // ============================================================================\n\n /**\n * Get or create the TraceData container for a trace.\n * Also cancels any pending cleanup since new data has arrived.\n *\n * @param args.traceId - The trace ID\n * @param args.method - The calling method name (for logging)\n * @returns The TraceData container for this trace\n */\n protected getTraceData(args: {\n traceId: string;\n method: string;\n }): TraceData {\n const { traceId, method } = args;\n\n // Cancel any scheduled cleanup - new data has arrived\n this.#cancelScheduledCleanup(traceId);\n\n if (!this.#traceMap.has(traceId)) {\n this.#traceMap.set(traceId, new TraceData());\n // Note: Map.set() maintains insertion order automatically\n this.logger.debug(`${this.name}: Created new trace data cache`, {\n traceId,\n method,\n });\n\n // Enforce hard cap on total traces\n this.#enforceHardCap().catch(error => {\n this.logger.error(`${this.name}: Error enforcing hard cap`, { error });\n });\n }\n return this.#traceMap.get(traceId)!;\n }\n\n /**\n * Get the current number of traces being tracked.\n * @returns The trace count\n */\n protected traceMapSize(): number {\n return this.#traceMap.size;\n }\n\n // ============================================================================\n // Flush and Shutdown Hooks (Override in subclass as needed)\n // ============================================================================\n\n /**\n * Hook called by flush() to perform vendor-specific flush logic.\n * Override to send buffered data to the vendor's API.\n *\n * Unlike _postShutdown(), this method should NOT release resources,\n * as the exporter will continue to be used after flushing.\n */\n protected async _flush(): Promise {}\n\n /**\n * Force flush any buffered data without shutting down the exporter.\n * This is useful in serverless environments where you need to ensure spans\n * are exported before the runtime instance is terminated.\n *\n * Subclasses should override _flush() to implement vendor-specific flush logic.\n */\n async flush(): Promise {\n if (this.isDisabled) {\n return;\n }\n\n this.logger.debug(`${this.name}: Flushing`);\n await this._flush();\n }\n\n /**\n * Hook called at the start of shutdown, before cancelling timers and aborting spans.\n * Override to perform vendor-specific pre-shutdown tasks.\n */\n protected async _preShutdown(): Promise {}\n\n /**\n * Hook called at the end of shutdown, after all spans are aborted.\n * Override to perform vendor-specific cleanup (e.g., flushing).\n */\n protected async _postShutdown(): Promise {}\n\n /**\n * Gracefully shut down the exporter.\n * Cancels all pending cleanup timers, aborts all active spans, and clears state.\n */\n async shutdown(): Promise {\n if (this.isDisabled) {\n return;\n }\n\n this.#shutdownStarted = true;\n await this._preShutdown();\n\n // Cancel all pending cleanup timers\n for (const [traceId, timeout] of this.#pendingCleanups) {\n clearTimeout(timeout);\n this.logger.debug(`${this.name}: Cancelled pending cleanup on shutdown`, { traceId });\n }\n this.#pendingCleanups.clear();\n\n // End all active spans\n const reason: SpanErrorInfo = {\n id: 'SHUTDOWN',\n message: 'Observability is shutting down.',\n domain: 'MASTRA_OBSERVABILITY',\n category: 'SYSTEM',\n };\n\n for (const [traceId, traceData] of this.#traceMap) {\n // Log any orphaned events\n const orphanedEvents = traceData.getAllQueuedEvents();\n if (orphanedEvents.length > 0) {\n this.logger.warn(`${this.name}: Dropping ${orphanedEvents.length} orphaned events on shutdown`, {\n traceId,\n orphanedEvents: orphanedEvents.map(e => ({\n spanId: e.event.exportedSpan.id,\n waitingFor: e.waitingFor,\n attempts: e.attempts,\n })),\n });\n }\n\n // Abort active spans\n for (const spanId of traceData.activeSpanIds) {\n const span = traceData.getSpan({ spanId });\n if (span) {\n await this._abortSpan({ span, traceData, reason });\n }\n }\n }\n\n this.#traceMap.clear();\n await this._postShutdown();\n await super.shutdown();\n }\n}\n","/**\n * Utility functions for working with custom span formatters.\n */\n\nimport type { AnyExportedSpan, CustomSpanFormatter } from '@mastra/core/observability';\n\n/**\n * Chains multiple span formatters into a single formatter.\n *\n * Formatters are applied in order, with each receiving the output of the previous.\n * Supports both synchronous and asynchronous formatters - if any formatter returns\n * a Promise, the entire chain will return a Promise.\n *\n * @param formatters - Array of formatters to chain (can be sync or async)\n * @returns A single formatter that applies all formatters in sequence\n *\n * @example\n * ```typescript\n * // Chain sync formatters\n * const chainedFormatter = chainFormatters([\n * myPlainTextFormatter,\n * myRedactionFormatter,\n * ]);\n *\n * // Chain mixed sync and async formatters\n * const asyncChainedFormatter = chainFormatters([\n * myPlainTextFormatter, // sync\n * myAsyncEnrichmentFormatter, // async\n * ]);\n *\n * const exporter = new BraintrustExporter({\n * customSpanFormatter: chainedFormatter,\n * });\n * ```\n */\nexport function chainFormatters(formatters: CustomSpanFormatter[]): CustomSpanFormatter {\n return async (span: AnyExportedSpan): Promise => {\n let currentSpan = span;\n for (const formatter of formatters) {\n currentSpan = await formatter(currentSpan);\n }\n return currentSpan;\n };\n}\n","import type { IMastraLogger } from '@mastra/core/logger';\nimport { fetchWithRetry } from '@mastra/core/utils';\n\nconst AUTH_FAILURE_STATUSES = new Set([401, 403]);\nconst AUTH_COOLDOWN_BASE_MS = 60_000;\n// Target cap before jitter; positive jitter can exceed this to avoid synchronized retry probes.\nconst AUTH_COOLDOWN_MAX_MS = 15 * 60_000;\nconst AUTH_COOLDOWN_JITTER_RATIO = 0.1;\n\nexport class AuthFailureError extends Error {\n readonly status: number;\n\n constructor(status: number, cause?: unknown) {\n super(`Request failed with authentication status: ${status}`, { cause });\n this.name = 'AuthFailureError';\n this.status = status;\n }\n}\n\nexport function isAuthFailureError(error: unknown): error is AuthFailureError {\n return error instanceof AuthFailureError;\n}\n\nfunction isAuthFailureStatus(status: number): boolean {\n return AUTH_FAILURE_STATUSES.has(status);\n}\n\nexport async function fetchWithAuthFailureHandling(\n url: string,\n options: RequestInit,\n maxRetries: number,\n): Promise {\n let authFailureStatus: number | undefined;\n\n try {\n await fetchWithRetry(url, options, maxRetries, {\n shouldRetryResponse: response => {\n if (isAuthFailureStatus(response.status)) {\n authFailureStatus = response.status;\n return false;\n }\n\n return true;\n },\n });\n } catch (error) {\n if (authFailureStatus !== undefined) {\n throw new AuthFailureError(authFailureStatus, error);\n }\n\n throw error;\n }\n}\n\nexport class AuthFailureCooldown {\n private failureCount = 0;\n private cooldownUntilMs = 0;\n private droppedEventsDuringCooldown = 0;\n\n constructor(\n private readonly exporterName: string,\n private readonly getLogger: () => IMastraLogger,\n ) {}\n\n private shouldDropEvents(): boolean {\n return Date.now() < this.cooldownUntilMs;\n }\n\n dropEventIfCoolingDown(): boolean {\n return this.dropEventsIfCoolingDown(1);\n }\n\n dropEventsIfCoolingDown(count: number): boolean {\n if (!this.shouldDropEvents()) {\n return false;\n }\n\n this.droppedEventsDuringCooldown += count;\n return true;\n }\n\n reset(): number {\n const droppedEventsDuringCooldown = this.droppedEventsDuringCooldown;\n\n this.failureCount = 0;\n this.cooldownUntilMs = 0;\n this.droppedEventsDuringCooldown = 0;\n\n return droppedEventsDuringCooldown;\n }\n\n recordFailure(args: { status: number; failedSignals: string[]; droppedBatchSize: number }): void {\n this.failureCount++;\n const droppedEventsDuringCooldown = this.droppedEventsDuringCooldown;\n this.droppedEventsDuringCooldown = 0;\n\n const targetCooldownMs = Math.min(AUTH_COOLDOWN_BASE_MS * Math.pow(2, this.failureCount - 1), AUTH_COOLDOWN_MAX_MS);\n const jitterMs = Math.floor(targetCooldownMs * AUTH_COOLDOWN_JITTER_RATIO * (Math.random() - 0.5) * 2);\n const cooldownMs = Math.max(AUTH_COOLDOWN_BASE_MS, targetCooldownMs + jitterMs);\n const cooldownSeconds = Math.ceil(cooldownMs / 1000);\n\n this.cooldownUntilMs = Date.now() + cooldownMs;\n\n this.getLogger().warn(\n `${this.exporterName} received an authentication failure; pausing uploads for ${cooldownSeconds}s`,\n {\n status: args.status,\n failedSignals: args.failedSignals,\n droppedBatchSize: args.droppedBatchSize,\n droppedEventsDuringCooldown,\n authFailureCount: this.failureCount,\n cooldownMs,\n },\n );\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { LogLevel } from '@mastra/core/logger';\nimport { SpanType, TracingEventType } from '@mastra/core/observability';\nimport type {\n TracingEvent,\n AnyExportedSpan,\n LogEvent,\n MetricEvent,\n ScoreEvent,\n FeedbackEvent,\n} from '@mastra/core/observability';\nimport { AuthFailureCooldown, fetchWithAuthFailureHandling, isAuthFailureError } from './auth-failure-cooldown';\nimport { BaseExporter } from './base';\nimport type { BaseExporterConfig } from './base';\n\n/**\n * @deprecated Use `MastraPlatformExporterConfig` from `@mastra/observability`\n * instead. This type is kept for backward compatibility and will be removed in\n * a future major version.\n */\nexport interface CloudExporterConfig extends BaseExporterConfig {\n maxBatchSize?: number; // Default: 1000 spans\n maxBatchWaitMs?: number; // Default: 5000ms\n maxRetries?: number; // Default: 3\n\n // Cloud-specific configuration\n accessToken?: string; // Cloud access token (from env or config)\n projectId?: string; // Project ID for project-scoped collector routes\n endpoint?: string; // Base cloud endpoint\n tracesEndpoint?: string; // Explicit cloud traces endpoint override\n logsEndpoint?: string; // Explicit cloud logs endpoint override\n metricsEndpoint?: string; // Explicit cloud metrics endpoint override\n scoresEndpoint?: string; // Explicit cloud scores endpoint override\n feedbackEndpoint?: string; // Explicit cloud feedback endpoint override\n}\n\ntype CloudSignal = 'traces' | 'logs' | 'metrics' | 'scores' | 'feedback';\n\nconst SIGNAL_PUBLISH_SUFFIXES: Record = {\n traces: '/spans/publish',\n logs: '/logs/publish',\n metrics: '/metrics/publish',\n scores: '/scores/publish',\n feedback: '/feedback/publish',\n};\n\nconst DEFAULT_CLOUD_SPAN_FILTER = (span: AnyExportedSpan): boolean => span.type !== SpanType.MODEL_CHUNK;\n\nconst SIGNAL_PUBLISH_SEGMENTS: Record = {\n traces: 'spans',\n logs: 'logs',\n metrics: 'metrics',\n scores: 'scores',\n feedback: 'feedback',\n};\n\nfunction trimTrailingSlashes(value: string): string {\n let end = value.length;\n while (end > 0 && value.charCodeAt(end - 1) === 47) {\n end--;\n }\n return end === value.length ? value : value.slice(0, end);\n}\n\nfunction createInvalidEndpointError(endpoint: string, text: string, cause?: unknown): MastraError {\n return new MastraError(\n {\n id: `CLOUD_EXPORTER_INVALID_ENDPOINT`,\n text,\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n details: {\n endpoint,\n },\n },\n cause,\n );\n}\n\nconst VALID_PROJECT_ID = /^[a-zA-Z0-9_-]+$/;\n\nfunction createInvalidProjectIdError(projectId: string): MastraError {\n return new MastraError({\n id: `CLOUD_EXPORTER_INVALID_PROJECT_ID`,\n text: 'CloudExporter projectId must only contain letters, numbers, hyphens, and underscores.',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n details: {\n projectId,\n },\n });\n}\n\nfunction resolveBaseEndpoint(baseEndpoint: string): string {\n const normalizedEndpoint = trimTrailingSlashes(baseEndpoint);\n const invalidText =\n 'CloudExporter endpoint must be a base origin like \"https://collector.example.com\" with no path, search, or hash.';\n\n try {\n const parsedEndpoint = new URL(normalizedEndpoint);\n if (parsedEndpoint.pathname !== '/' || parsedEndpoint.search || parsedEndpoint.hash) {\n throw createInvalidEndpointError(baseEndpoint, invalidText);\n }\n return trimTrailingSlashes(parsedEndpoint.origin);\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n\n throw createInvalidEndpointError(baseEndpoint, invalidText, error);\n }\n}\n\nfunction buildSignalPath(signal: CloudSignal, projectId?: string): string {\n const signalSegment = SIGNAL_PUBLISH_SEGMENTS[signal];\n if (!projectId) {\n return `/ai/${signalSegment}/publish`;\n }\n\n return `/projects/${projectId}/ai/${signalSegment}/publish`;\n}\n\nfunction buildSignalEndpoint(baseEndpoint: string, signal: CloudSignal, projectId?: string): string {\n return `${baseEndpoint}${buildSignalPath(signal, projectId)}`;\n}\n\nfunction resolveExplicitSignalEndpoint(signal: CloudSignal, endpoint: string, projectId?: string): string {\n const normalizedEndpoint = trimTrailingSlashes(endpoint);\n const invalidText = `CloudExporter ${signal}Endpoint must be a base origin like \"https://collector.example.com\" or a full ${signal} publish URL ending in \"${SIGNAL_PUBLISH_SUFFIXES[signal]}\".`;\n\n try {\n const parsedEndpoint = new URL(normalizedEndpoint);\n if (parsedEndpoint.search || parsedEndpoint.hash) {\n throw createInvalidEndpointError(endpoint, invalidText);\n }\n\n const normalizedOrigin = trimTrailingSlashes(parsedEndpoint.origin);\n const normalizedPathname = trimTrailingSlashes(parsedEndpoint.pathname);\n\n if (!normalizedPathname || normalizedPathname === '/') {\n return buildSignalEndpoint(normalizedOrigin, signal, projectId);\n }\n\n if (normalizedPathname.endsWith(SIGNAL_PUBLISH_SUFFIXES[signal])) {\n return `${normalizedOrigin}${normalizedPathname}`;\n }\n\n throw createInvalidEndpointError(endpoint, invalidText);\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n\n throw createInvalidEndpointError(endpoint, invalidText, error);\n }\n}\n\nfunction deriveSignalEndpointFromTracesEndpoint(signal: CloudSignal, tracesEndpoint: string): string {\n if (signal === 'traces') {\n return tracesEndpoint;\n }\n\n const normalizedTracesEndpoint = trimTrailingSlashes(tracesEndpoint);\n const invalidText =\n 'CloudExporter tracesEndpoint must be a base origin like \"https://collector.example.com\" or a full traces publish URL ending in \"/spans/publish\".';\n\n try {\n const parsedEndpoint = new URL(normalizedTracesEndpoint);\n const normalizedOrigin = trimTrailingSlashes(parsedEndpoint.origin);\n const normalizedPathname = trimTrailingSlashes(parsedEndpoint.pathname);\n\n if (!normalizedPathname.endsWith(SIGNAL_PUBLISH_SUFFIXES.traces)) {\n throw createInvalidEndpointError(tracesEndpoint, invalidText);\n }\n\n const basePath = normalizedPathname.slice(0, -SIGNAL_PUBLISH_SUFFIXES.traces.length);\n return `${normalizedOrigin}${basePath}${SIGNAL_PUBLISH_SUFFIXES[signal]}`;\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n\n throw createInvalidEndpointError(tracesEndpoint, invalidText, error);\n }\n}\n\ninterface MastraCloudBuffer {\n spans: MastraCloudSpanRecord[];\n logs: MastraCloudLogRecord[];\n metrics: MastraCloudMetricRecord[];\n scores: MastraCloudScoreRecord[];\n feedback: MastraCloudFeedbackRecord[];\n firstEventTime?: Date;\n totalSize: number;\n}\n\ntype MastraCloudSpanRecord = AnyExportedSpan & {\n spanId: string;\n spanType: string;\n startedAt: Date;\n endedAt: Date | null;\n error: AnyExportedSpan['errorInfo'] | null;\n createdAt: Date;\n updatedAt: Date | null;\n};\n\ntype MastraCloudLogRecord = LogEvent['log'];\ntype MastraCloudMetricRecord = MetricEvent['metric'];\ntype MastraCloudScoreRecord = ScoreEvent['score'];\ntype MastraCloudFeedbackRecord = FeedbackEvent['feedback'];\n\ntype ResolvedCloudConfig = {\n logger: BaseExporterConfig['logger'];\n logLevel: NonNullable;\n maxBatchSize: number;\n maxBatchWaitMs: number;\n maxRetries: number;\n accessToken: string;\n tracesEndpoint: string;\n logsEndpoint: string;\n metricsEndpoint: string;\n scoresEndpoint: string;\n feedbackEndpoint: string;\n};\n\n/**\n * @deprecated Use `MastraPlatformExporter` from `@mastra/observability` instead.\n * This class is preserved unchanged so existing integrations (including code\n * that matches on the `CLOUD_EXPORTER_*` error IDs or the\n * `mastra-cloud-observability-exporter` exporter name) keep working. It will\n * be removed in a future major version.\n */\nexport class CloudExporter extends BaseExporter {\n name = 'mastra-cloud-observability-exporter';\n\n private readonly cloudConfig: Readonly;\n private readonly authFailureCooldown: AuthFailureCooldown;\n private buffer: MastraCloudBuffer;\n private flushTimer: NodeJS.Timeout | null = null;\n private inFlightFlushes = new Set>();\n\n constructor(config: CloudExporterConfig = {}) {\n super(config);\n\n if (config.projectId !== undefined && !VALID_PROJECT_ID.test(config.projectId)) {\n throw createInvalidProjectIdError(config.projectId);\n }\n\n const accessToken = config.accessToken ?? process.env.MASTRA_CLOUD_ACCESS_TOKEN;\n const rawProjectId = config.projectId ?? process.env.MASTRA_PROJECT_ID;\n const projectId = rawProjectId && VALID_PROJECT_ID.test(rawProjectId) ? rawProjectId : undefined;\n if (!accessToken) {\n this.setDisabled('MASTRA_CLOUD_ACCESS_TOKEN environment variable not set.', 'debug');\n }\n\n const tracesEndpointOverride = config.tracesEndpoint ?? process.env.MASTRA_CLOUD_TRACES_ENDPOINT;\n let baseEndpoint: string | undefined;\n let tracesEndpoint: string;\n\n if (tracesEndpointOverride) {\n tracesEndpoint = resolveExplicitSignalEndpoint('traces', tracesEndpointOverride, projectId);\n } else {\n baseEndpoint = resolveBaseEndpoint(config.endpoint ?? 'https://observability.mastra.ai');\n tracesEndpoint = buildSignalEndpoint(baseEndpoint, 'traces', projectId);\n }\n\n const resolveConfiguredSignalEndpoint = (\n signal: Exclude,\n explicitEndpoint?: string,\n ): string => {\n if (explicitEndpoint) {\n return resolveExplicitSignalEndpoint(signal, explicitEndpoint, projectId);\n }\n\n if (tracesEndpointOverride) {\n return deriveSignalEndpointFromTracesEndpoint(signal, tracesEndpoint);\n }\n\n return buildSignalEndpoint(baseEndpoint!, signal, projectId);\n };\n\n this.cloudConfig = {\n logger: this.logger,\n logLevel: config.logLevel ?? LogLevel.INFO,\n maxBatchSize: config.maxBatchSize ?? 1000,\n maxBatchWaitMs: config.maxBatchWaitMs ?? 5000,\n maxRetries: config.maxRetries ?? 3,\n accessToken: accessToken || '',\n tracesEndpoint,\n logsEndpoint: resolveConfiguredSignalEndpoint('logs', config.logsEndpoint),\n metricsEndpoint: resolveConfiguredSignalEndpoint('metrics', config.metricsEndpoint),\n scoresEndpoint: resolveConfiguredSignalEndpoint('scores', config.scoresEndpoint),\n feedbackEndpoint: resolveConfiguredSignalEndpoint('feedback', config.feedbackEndpoint),\n };\n\n this.authFailureCooldown = new AuthFailureCooldown('CloudExporter', () => this.logger);\n\n this.buffer = {\n spans: [],\n logs: [],\n metrics: [],\n scores: [],\n feedback: [],\n totalSize: 0,\n };\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise {\n // Cloud Observability only process SPAN_ENDED events\n if (event.type !== TracingEventType.SPAN_ENDED) {\n return;\n }\n\n if (!DEFAULT_CLOUD_SPAN_FILTER(event.exportedSpan)) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventIfCoolingDown()) {\n return;\n }\n\n this.addToBuffer(event);\n\n await this.handleBufferedEvent();\n }\n\n async onLogEvent(event: LogEvent): Promise {\n if (this.isDisabled) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventIfCoolingDown()) {\n return;\n }\n\n this.addLogToBuffer(event);\n await this.handleBufferedEvent();\n }\n\n async onMetricEvent(event: MetricEvent): Promise {\n if (this.isDisabled) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventIfCoolingDown()) {\n return;\n }\n\n this.addMetricToBuffer(event);\n await this.handleBufferedEvent();\n }\n\n async onScoreEvent(event: ScoreEvent): Promise {\n if (this.isDisabled) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventIfCoolingDown()) {\n return;\n }\n\n this.addScoreToBuffer(event);\n await this.handleBufferedEvent();\n }\n\n async onFeedbackEvent(event: FeedbackEvent): Promise {\n if (this.isDisabled) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventIfCoolingDown()) {\n return;\n }\n\n this.addFeedbackToBuffer(event);\n await this.handleBufferedEvent();\n }\n\n private addToBuffer(event: TracingEvent): void {\n this.markBufferStart();\n\n const spanRecord = this.formatSpan(event.exportedSpan);\n this.buffer.spans.push(spanRecord);\n this.buffer.totalSize++;\n }\n\n private addLogToBuffer(event: LogEvent): void {\n this.markBufferStart();\n\n this.buffer.logs.push(this.formatLog(event.log));\n this.buffer.totalSize++;\n }\n\n private addMetricToBuffer(event: MetricEvent): void {\n this.markBufferStart();\n\n this.buffer.metrics.push(this.formatMetric(event.metric));\n this.buffer.totalSize++;\n }\n\n private addScoreToBuffer(event: ScoreEvent): void {\n this.markBufferStart();\n\n this.buffer.scores.push(this.formatScore(event.score));\n this.buffer.totalSize++;\n }\n\n private addFeedbackToBuffer(event: FeedbackEvent): void {\n this.markBufferStart();\n\n this.buffer.feedback.push(this.formatFeedback(event.feedback));\n this.buffer.totalSize++;\n }\n\n private markBufferStart(): void {\n if (this.buffer.totalSize === 0) {\n this.buffer.firstEventTime = new Date();\n }\n }\n\n private formatSpan(span: AnyExportedSpan): MastraCloudSpanRecord {\n const spanRecord: MastraCloudSpanRecord = {\n ...span,\n spanId: span.id,\n spanType: span.type,\n startedAt: span.startTime,\n endedAt: span.endTime ?? null,\n error: span.errorInfo ?? null,\n createdAt: new Date(),\n updatedAt: null,\n };\n\n return spanRecord;\n }\n\n private formatLog(log: LogEvent['log']): MastraCloudLogRecord {\n return {\n ...log,\n };\n }\n\n private formatMetric(metric: MetricEvent['metric']): MastraCloudMetricRecord {\n return {\n ...metric,\n };\n }\n\n private formatScore(score: ScoreEvent['score']): MastraCloudScoreRecord {\n return {\n ...score,\n };\n }\n\n private formatFeedback(feedback: FeedbackEvent['feedback']): MastraCloudFeedbackRecord {\n return {\n ...feedback,\n };\n }\n\n private async handleBufferedEvent(): Promise {\n if (this.shouldFlush()) {\n void this.flush().catch(error => {\n this.logger.error('Batch flush failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n });\n } else if (this.buffer.totalSize === 1) {\n this.scheduleFlush();\n }\n }\n\n private shouldFlush(): boolean {\n // Size-based flush\n if (this.buffer.totalSize >= this.cloudConfig.maxBatchSize) {\n return true;\n }\n\n // Time-based flush\n if (this.buffer.firstEventTime && this.buffer.totalSize > 0) {\n const elapsed = Date.now() - this.buffer.firstEventTime.getTime();\n if (elapsed >= this.cloudConfig.maxBatchWaitMs) {\n return true;\n }\n }\n\n return false;\n }\n\n private scheduleFlush(): void {\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n }\n this.flushTimer = setTimeout(() => {\n void this.flush().catch(error => {\n const mastraError = new MastraError(\n {\n id: `CLOUD_EXPORTER_FAILED_TO_SCHEDULE_FLUSH`,\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n },\n error,\n );\n this.logger.trackException(mastraError);\n this.logger.error('Scheduled flush failed', mastraError);\n });\n }, this.cloudConfig.maxBatchWaitMs);\n }\n\n private async flushBuffer(): Promise {\n // Clear timer since we're flushing\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n\n if (this.buffer.totalSize === 0) {\n return; // Nothing to flush\n }\n\n if (this.authFailureCooldown.dropEventsIfCoolingDown(this.buffer.totalSize)) {\n this.resetBuffer();\n return;\n }\n\n const startTime = Date.now();\n const spansCopy = [...this.buffer.spans];\n const logsCopy = [...this.buffer.logs];\n const metricsCopy = [...this.buffer.metrics];\n const scoresCopy = [...this.buffer.scores];\n const feedbackCopy = [...this.buffer.feedback];\n const batchSize = this.buffer.totalSize;\n const flushReason = this.buffer.totalSize >= this.cloudConfig.maxBatchSize ? 'size' : 'time';\n\n // Reset buffer immediately to prevent blocking new events\n this.resetBuffer();\n\n const results = await Promise.all([\n this.flushSignalBatch('traces', spansCopy),\n this.flushSignalBatch('logs', logsCopy),\n this.flushSignalBatch('metrics', metricsCopy),\n this.flushSignalBatch('scores', scoresCopy),\n this.flushSignalBatch('feedback', feedbackCopy),\n ]);\n\n const failedSignals = results.filter(result => !result.succeeded).map(result => result.signal);\n const authFailure = results.find(result => result.authFailureStatus !== undefined);\n\n const elapsed = Date.now() - startTime;\n\n if (failedSignals.length === 0) {\n const droppedEventsDuringAuthCooldown = this.authFailureCooldown.reset();\n const logData: Record = {\n batchSize,\n flushReason,\n durationMs: elapsed,\n };\n\n if (droppedEventsDuringAuthCooldown > 0) {\n logData.droppedEventsDuringAuthCooldown = droppedEventsDuringAuthCooldown;\n }\n\n this.logger.debug('Batch flushed successfully', logData);\n return;\n }\n\n if (authFailure?.authFailureStatus !== undefined) {\n this.authFailureCooldown.recordFailure({\n status: authFailure.authFailureStatus,\n failedSignals,\n droppedBatchSize: batchSize,\n });\n }\n\n this.logger.warn('Batch flush completed with dropped signal batches', {\n batchSize,\n flushReason,\n durationMs: elapsed,\n failedSignals,\n });\n }\n\n /**\n * Uploads a signal batch to the configured cloud API using fetchWithRetry.\n */\n private async batchUpload(signal: CloudSignal, records: T[]): Promise {\n const headers = {\n Authorization: `Bearer ${this.cloudConfig.accessToken}`,\n 'Content-Type': 'application/json',\n };\n\n const endpointMap: Record = {\n traces: this.cloudConfig.tracesEndpoint,\n logs: this.cloudConfig.logsEndpoint,\n metrics: this.cloudConfig.metricsEndpoint,\n scores: this.cloudConfig.scoresEndpoint,\n feedback: this.cloudConfig.feedbackEndpoint,\n };\n\n const options: RequestInit = {\n method: 'POST',\n headers,\n body: JSON.stringify({ [SIGNAL_PUBLISH_SEGMENTS[signal]]: records }),\n };\n\n await fetchWithAuthFailureHandling(endpointMap[signal], options, this.cloudConfig.maxRetries);\n }\n\n private async flushSignalBatch(\n signal: CloudSignal,\n records: T[],\n ): Promise<{ signal: CloudSignal; succeeded: boolean; authFailureStatus?: number }> {\n if (records.length === 0) {\n return { signal, succeeded: true };\n }\n\n try {\n await this.batchUpload(signal, records);\n return { signal, succeeded: true };\n } catch (error) {\n if (isAuthFailureError(error)) {\n return { signal, succeeded: false, authFailureStatus: error.status };\n }\n\n const errorId = `CLOUD_EXPORTER_FAILED_TO_BATCH_UPLOAD_${signal.toUpperCase()}` as Uppercase;\n const mastraError = new MastraError(\n {\n id: errorId,\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n details: {\n signal,\n droppedBatchSize: records.length,\n },\n },\n error,\n );\n this.logger.trackException(mastraError);\n this.logger.error('Batch upload failed after all retries, dropping batch', mastraError);\n return { signal, succeeded: false };\n }\n }\n\n private resetBuffer(): void {\n this.buffer.spans = [];\n this.buffer.logs = [];\n this.buffer.metrics = [];\n this.buffer.scores = [];\n this.buffer.feedback = [];\n this.buffer.firstEventTime = undefined;\n this.buffer.totalSize = 0;\n }\n\n /**\n * Force flush any buffered spans without shutting down the exporter.\n * This is useful in serverless environments where you need to ensure spans\n * are exported before the runtime instance is terminated.\n */\n async flush(): Promise {\n // Skip if disabled\n if (this.isDisabled) {\n return;\n }\n\n while (this.buffer.totalSize > 0 || this.inFlightFlushes.size > 0) {\n if (this.buffer.totalSize > 0) {\n this.logger.debug('Flushing buffered events', {\n bufferedEvents: this.buffer.totalSize,\n });\n\n const flushPromise = this.flushBuffer();\n this.inFlightFlushes.add(flushPromise);\n\n try {\n await flushPromise;\n } finally {\n this.inFlightFlushes.delete(flushPromise);\n }\n\n continue;\n }\n\n await Promise.allSettled([...this.inFlightFlushes]);\n }\n }\n\n async shutdown(): Promise {\n // Skip if disabled\n if (this.isDisabled) {\n return;\n }\n\n // Clear any pending timer\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n\n try {\n await this.flush();\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: `CLOUD_EXPORTER_FAILED_TO_FLUSH_REMAINING_EVENTS_DURING_SHUTDOWN`,\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n details: {\n remainingEvents: this.buffer.totalSize,\n },\n },\n error,\n );\n\n this.logger.trackException(mastraError);\n this.logger.error('Failed to flush remaining events during shutdown', mastraError);\n }\n\n this.logger.info('CloudExporter shutdown complete');\n }\n}\n","import { TracingEventType } from '@mastra/core/observability';\nimport type { TracingEvent } from '@mastra/core/observability';\nimport { BaseExporter } from './base';\nimport type { BaseExporterConfig } from './base';\n\nexport class ConsoleExporter extends BaseExporter {\n name = 'tracing-console-exporter';\n\n constructor(config: BaseExporterConfig = {}) {\n super(config);\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise {\n const span = event.exportedSpan;\n\n // Helper to safely stringify attributes (filtering already done by processor)\n const formatAttributes = (attributes: any) => {\n try {\n return JSON.stringify(attributes, null, 2);\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : 'Unknown formatting error';\n return `[Unable to serialize attributes: ${errMsg}]`;\n }\n };\n\n // Helper to format duration\n const formatDuration = (startTime: Date, endTime?: Date) => {\n if (!endTime) return 'N/A';\n const duration = endTime.getTime() - startTime.getTime();\n return `${duration}ms`;\n };\n\n switch (event.type) {\n case TracingEventType.SPAN_STARTED:\n this.logger.info(`🚀 SPAN_STARTED`);\n this.logger.info(` Type: ${span.type}`);\n this.logger.info(` Name: ${span.name}`);\n this.logger.info(` ID: ${span.id}`);\n this.logger.info(` Trace ID: ${span.traceId}`);\n if (span.input !== undefined) {\n this.logger.info(` Input: ${formatAttributes(span.input)}`);\n }\n this.logger.info(` Attributes: ${formatAttributes(span.attributes)}`);\n this.logger.info('─'.repeat(80));\n break;\n\n case TracingEventType.SPAN_ENDED:\n const duration = formatDuration(span.startTime, span.endTime);\n this.logger.info(`✅ SPAN_ENDED`);\n this.logger.info(` Type: ${span.type}`);\n this.logger.info(` Name: ${span.name}`);\n this.logger.info(` ID: ${span.id}`);\n this.logger.info(` Duration: ${duration}`);\n this.logger.info(` Trace ID: ${span.traceId}`);\n if (span.input !== undefined) {\n this.logger.info(` Input: ${formatAttributes(span.input)}`);\n }\n if (span.output !== undefined) {\n this.logger.info(` Output: ${formatAttributes(span.output)}`);\n }\n if (span.errorInfo) {\n this.logger.info(` Error: ${formatAttributes(span.errorInfo)}`);\n }\n this.logger.info(` Attributes: ${formatAttributes(span.attributes)}`);\n this.logger.info('─'.repeat(80));\n break;\n\n case TracingEventType.SPAN_UPDATED:\n this.logger.info(`📝 SPAN_UPDATED`);\n this.logger.info(` Type: ${span.type}`);\n this.logger.info(` Name: ${span.name}`);\n this.logger.info(` ID: ${span.id}`);\n this.logger.info(` Trace ID: ${span.traceId}`);\n if (span.input !== undefined) {\n this.logger.info(` Input: ${formatAttributes(span.input)}`);\n }\n if (span.output !== undefined) {\n this.logger.info(` Output: ${formatAttributes(span.output)}`);\n }\n if (span.errorInfo) {\n this.logger.info(` Error: ${formatAttributes(span.errorInfo)}`);\n }\n this.logger.info(` Updated Attributes: ${formatAttributes(span.attributes)}`);\n this.logger.info('─'.repeat(80));\n break;\n\n default:\n this.logger.warn(`Tracing event type not implemented: ${(event as any).type}`);\n }\n }\n\n async shutdown(): Promise {\n this.logger.info('ConsoleExporter shutdown');\n }\n}\n","import { TracingEventType } from '@mastra/core/observability';\nimport type { AnyExportedSpan, ObservabilityEvent } from '@mastra/core/observability';\nimport type { CreateSpanRecord, ObservabilityStorageStrategy, UpdateSpanRecord } from '@mastra/core/storage';\n\n/** Mixin interface that tracks how many times a buffered event has been retried. */\nexport interface RetryCount {\n retryCount: number;\n}\n\n/** A partial span update record keyed by trace and span ID. */\nexport interface UpdateSpanPartial {\n traceId: string;\n spanId: string;\n updates: Partial;\n}\n\n/** An observability event augmented with retry tracking for the buffer. */\nexport type BufferedEvent = ObservabilityEvent & RetryCount;\n\n/**\n * Buffers observability events (creates and updates) for batch flushing.\n * Handles strategy-aware routing of tracing events and tracks created spans\n * so updates can be deferred until their parent create has been flushed.\n */\nexport class EventBuffer {\n #preInit: BufferedEvent[] = [];\n #creates: BufferedEvent[] = [];\n #updates: BufferedEvent[] = [];\n #allCreatedSpans: Set = new Set();\n #firstEventTime?: Date;\n #storageStrategy?: ObservabilityStorageStrategy;\n #maxRetries: number;\n\n constructor(args: { maxRetries: number }) {\n this.#maxRetries = args.maxRetries;\n }\n\n /** Initialize with a storage strategy and replay any pre-init events. */\n init(args: { strategy: ObservabilityStorageStrategy }): void {\n if (!this.#storageStrategy) {\n this.#storageStrategy = args.strategy;\n for (const event of this.#preInit) {\n this.addEvent(event);\n }\n this.#preInit = [];\n }\n }\n\n /** Clear the create and update buffers and reset the event timer. */\n reset() {\n this.#creates = [];\n this.#updates = [];\n this.#firstEventTime = undefined;\n }\n\n private setFirstEventTime(): void {\n if (!this.#firstEventTime) {\n this.#firstEventTime = new Date();\n }\n }\n\n private pushCreate(event: ObservabilityEvent): void {\n this.setFirstEventTime();\n this.#creates.push({ ...event, retryCount: 0 });\n }\n\n private pushUpdate(event: ObservabilityEvent): void {\n this.setFirstEventTime();\n this.#updates.push({ ...event, retryCount: 0 });\n }\n\n /** Route an event to the create or update buffer based on its type and the storage strategy. */\n addEvent(event: ObservabilityEvent) {\n if (!this.#storageStrategy) {\n this.#preInit.push({ ...event, retryCount: 0 });\n return;\n }\n\n switch (event.type) {\n case TracingEventType.SPAN_STARTED:\n // Strategy 'insert-only' ignores SPAN_STARTED events\n switch (this.#storageStrategy) {\n case 'realtime':\n case 'event-sourced':\n case 'batch-with-updates':\n this.pushCreate(event);\n break;\n }\n break;\n\n case TracingEventType.SPAN_UPDATED:\n // Strategies 'insert-only' and 'event-sourced' ignore SPAN_UPDATED events\n switch (this.#storageStrategy) {\n case 'realtime':\n case 'batch-with-updates':\n this.pushUpdate(event);\n break;\n }\n break;\n\n case TracingEventType.SPAN_ENDED:\n if (event.exportedSpan.isEvent) {\n this.pushCreate(event);\n } else {\n switch (this.#storageStrategy) {\n case 'realtime':\n case 'batch-with-updates':\n this.pushUpdate(event);\n break;\n default:\n this.pushCreate(event);\n break;\n }\n }\n break;\n\n default:\n // Non-tracing signals (metric, log, score, feedback) → creates\n this.pushCreate(event);\n break;\n }\n }\n\n /** Re-add failed create events to the buffer, returning events that exceed max retries. */\n reAddCreates(events: BufferedEvent[]): BufferedEvent[] {\n const retryable: BufferedEvent[] = [];\n const dropped: BufferedEvent[] = [];\n\n for (const e of events) {\n if (++e.retryCount <= this.#maxRetries) {\n retryable.push(e);\n } else {\n dropped.push(e);\n }\n }\n\n if (retryable.length > 0) {\n this.setFirstEventTime();\n this.#creates.push(...retryable);\n }\n\n return dropped;\n }\n\n /** Re-add failed update events to the buffer, returning events that exceed max retries. */\n reAddUpdates(events: BufferedEvent[]): BufferedEvent[] {\n const retryable: BufferedEvent[] = [];\n const dropped: BufferedEvent[] = [];\n\n for (const e of events) {\n if (++e.retryCount <= this.#maxRetries) {\n retryable.push(e);\n } else {\n dropped.push(e);\n }\n }\n\n if (retryable.length > 0) {\n this.setFirstEventTime();\n this.#updates.push(...retryable);\n }\n\n return dropped;\n }\n\n /** Snapshot of buffered create events. */\n get creates(): BufferedEvent[] {\n return [...this.#creates];\n }\n\n /** Snapshot of buffered update events. */\n get updates(): BufferedEvent[] {\n return [...this.#updates];\n }\n\n /** Total number of buffered events (creates + updates). */\n get totalSize(): number {\n return this.#creates.length + this.#updates.length;\n }\n\n /** Milliseconds since the first event was buffered in the current batch. */\n get elapsed(): number {\n if (!this.#firstEventTime) {\n return 0;\n }\n return Date.now() - this.#firstEventTime.getTime();\n }\n\n /**\n * Builds a unique span key for tracking\n */\n private buildSpanKey(span: CreateSpanRecord | UpdateSpanPartial | { traceId: string; spanId: string }): string {\n return `${span.traceId}:${span.spanId}`;\n }\n\n /** Track successfully created spans so updates can verify span existence before flushing. */\n addCreatedSpans(args: { records: CreateSpanRecord[] }): void {\n if (this.#storageStrategy === 'event-sourced' || this.#storageStrategy === 'insert-only') {\n // no need to track spans if strategy is 'insert-only' or 'event-sourced'\n return;\n }\n\n for (const createRecord of args.records) {\n // no need to track event spans\n if (!createRecord.isEvent) {\n this.#allCreatedSpans.add(this.buildSpanKey(createRecord));\n }\n }\n }\n\n /** Check whether a span's create record has already been flushed to storage. */\n spanExists(span: AnyExportedSpan): boolean {\n return this.#allCreatedSpans?.has(this.buildSpanKey({ traceId: span.traceId, spanId: span.id }));\n }\n\n /** Remove completed spans from tracking after their SPAN_ENDED updates are flushed. */\n endFinishedSpans(args: { records: UpdateSpanPartial[] }): void {\n if (this.#storageStrategy === 'event-sourced' || this.#storageStrategy === 'insert-only') {\n // no need to track spans if strategy is 'insert-only' or 'event-sourced'\n return;\n }\n args.records.forEach(r => {\n this.#allCreatedSpans.delete(this.buildSpanKey(r));\n });\n }\n}\n","import { MastraError, ErrorDomain } from '@mastra/core/error';\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport type {\n TracingEvent,\n InitExporterOptions,\n MetricEvent,\n LogEvent,\n ScoreEvent,\n FeedbackEvent,\n ObservabilityDropEvent,\n ObservabilityDropReason,\n ObservabilityDropSignal,\n} from '@mastra/core/observability';\nimport { TracingEventType } from '@mastra/core/observability';\nimport type { ObservabilityStorage, TracingStorageStrategy, MastraCompositeStore } from '@mastra/core/storage';\nimport {\n buildCreateSpanRecord,\n buildUpdateSpanRecord,\n buildMetricRecord,\n buildLogRecord,\n buildScoreRecord,\n buildFeedbackRecord,\n} from '@mastra/core/storage';\nimport type { BaseExporterConfig } from './base';\nimport { BaseExporter } from './base';\nimport { EventBuffer } from './event-buffer';\nimport type { BufferedEvent, RetryCount, UpdateSpanPartial } from './event-buffer';\n\n/**\n * Configuration for the DefaultExporter's batching, retry, and strategy behavior.\n *\n * @deprecated Use `MastraStorageExporterConfig` from `@mastra/observability` instead.\n * This interface is kept for backward compatibility and will be removed in a\n * future major version.\n */\ninterface DefaultExporterConfig extends BaseExporterConfig {\n maxBatchSize?: number; // Default: 1000 spans\n maxBufferSize?: number; // Default: 10000 spans\n maxBatchWaitMs?: number; // Default: 5000ms\n maxRetries?: number; // Default: 4\n retryDelayMs?: number; // Default: 500ms (base delay for exponential backoff)\n\n // Strategy selection (optional)\n strategy?: TracingStorageStrategy | 'auto';\n}\n\n/**\n * Resolves the final tracing storage strategy based on config and observability store hints\n */\nfunction resolveTracingStorageStrategy(\n config: DefaultExporterConfig,\n observabilityStorage: ObservabilityStorage,\n storageName: string,\n logger: IMastraLogger,\n): TracingStorageStrategy {\n const observabilityStrategy = observabilityStorage.observabilityStrategy;\n if (config.strategy && config.strategy !== 'auto') {\n if (observabilityStrategy.supported.includes(config.strategy)) {\n return config.strategy;\n }\n // Log warning and fall through to auto-selection\n logger.warn('User-specified tracing strategy not supported by storage adapter, falling back to auto-selection', {\n userStrategy: config.strategy,\n storageAdapter: storageName,\n supportedStrategies: observabilityStrategy.supported,\n fallbackStrategy: observabilityStrategy.preferred,\n });\n }\n return observabilityStrategy.preferred;\n}\n\ntype Resolve = (value: void | PromiseLike) => void;\n\n/**\n * @deprecated Use `MastraStorageExporter` from `@mastra/observability` instead.\n * This class is preserved unchanged so existing integrations (including code\n * that matches on the `mastra-default-observability-exporter` exporter name)\n * keep working. It will be removed in a future major version.\n *\n * Default storage-backed exporter. Buffers observability events and flushes them\n * in batches to the configured ObservabilityStorage backend with retry support.\n */\nexport class DefaultExporter extends BaseExporter {\n name = 'mastra-default-observability-exporter';\n\n #config: DefaultExporterConfig;\n #isInitializing = false;\n #initPromises: Set = new Set();\n #eventBuffer: EventBuffer;\n\n #storage?: MastraCompositeStore;\n #observabilityStorage?: ObservabilityStorage;\n #resolvedStrategy?: TracingStorageStrategy;\n #flushTimer?: NodeJS.Timeout;\n #emitDropEvent?: (event: ObservabilityDropEvent) => void;\n\n // Signals whose storage methods threw \"not implemented\" — skip on future flushes\n #unsupportedSignals: Set = new Set();\n\n constructor(config: DefaultExporterConfig = {}) {\n super(config);\n\n // Set default configuration\n this.#config = {\n ...config,\n maxBatchSize: config.maxBatchSize ?? 1000,\n maxBufferSize: config.maxBufferSize ?? 10000,\n maxBatchWaitMs: config.maxBatchWaitMs ?? 5000,\n maxRetries: config.maxRetries ?? 4,\n retryDelayMs: config.retryDelayMs ?? 500,\n strategy: config.strategy ?? 'auto',\n };\n\n this.#eventBuffer = new EventBuffer({ maxRetries: this.#config.maxRetries ?? 4 });\n }\n\n /**\n * Initialize the exporter (called after all dependencies are ready)\n */\n async init(options: InitExporterOptions): Promise {\n try {\n this.#isInitializing = true;\n this.#emitDropEvent = options.emitDropEvent;\n\n this.#storage = options.mastra?.getStorage();\n if (!this.#storage) {\n this.logger.warn('DefaultExporter disabled: Storage not available. Traces will not be persisted.');\n return;\n }\n\n this.#observabilityStorage = await this.#storage.getStore('observability');\n if (!this.#observabilityStorage) {\n this.logger.warn(\n 'DefaultExporter disabled: Observability storage not available. Traces will not be persisted.',\n );\n return;\n }\n\n // Initialize the resolved strategy once observability store is available\n if (!this.#resolvedStrategy) {\n this.#resolvedStrategy = resolveTracingStorageStrategy(\n this.#config,\n this.#observabilityStorage,\n this.#storage.constructor.name,\n this.logger,\n );\n\n this.logger.debug('tracing storage exporter initialized', {\n strategy: this.#resolvedStrategy,\n source: this.#config.strategy !== 'auto' ? 'user' : 'auto',\n storageAdapter: this.#storage.constructor.name,\n maxBatchSize: this.#config.maxBatchSize,\n maxBatchWaitMs: this.#config.maxBatchWaitMs,\n });\n }\n\n if (this.#resolvedStrategy) {\n this.#eventBuffer.init({ strategy: this.#resolvedStrategy });\n }\n } finally {\n this.#isInitializing = false;\n /**\n * Assumes caller waits until export of a parent span is completed before calling\n * export for child spans , order is not relevant for resolve\n */\n this.#initPromises.forEach(resolve => {\n resolve();\n });\n this.#initPromises.clear();\n }\n }\n\n /**\n * Checks if buffer should be flushed based on size or time triggers\n */\n private shouldFlush(): boolean {\n if (this.#resolvedStrategy === 'realtime') {\n return true;\n }\n\n // Emergency flush - buffer overflow\n if (this.#eventBuffer.totalSize >= this.#config.maxBufferSize!) {\n return true;\n }\n\n // Size-based flush\n if (this.#eventBuffer.totalSize >= this.#config.maxBatchSize!) {\n return true;\n }\n\n // Time-based flush\n if (this.#eventBuffer.totalSize > 0) {\n if (this.#eventBuffer.elapsed >= this.#config.maxBatchWaitMs!) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Schedules a flush using setTimeout\n */\n private scheduleFlush(): void {\n if (this.#flushTimer) {\n clearTimeout(this.#flushTimer);\n }\n this.#flushTimer = setTimeout(() => {\n this.flushBuffer().catch(error => {\n this.logger.error('Scheduled flush failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n });\n }, this.#config.maxBatchWaitMs);\n }\n\n /**\n * Checks flush triggers and schedules/triggers flush as needed.\n * Called after adding any event to the buffer.\n * Returns the flush promise when flushing so callers can await it.\n */\n private async handleBatchedFlush(): Promise {\n if (this.shouldFlush()) {\n await this.flushBuffer();\n } else if (this.#eventBuffer.totalSize === 1) {\n this.scheduleFlush();\n }\n }\n\n private sanitizeDropError(error: unknown): ObservabilityDropEvent['error'] {\n if (error instanceof MastraError) {\n return {\n id: error.id,\n domain: String(error.domain),\n message: error.message,\n };\n }\n\n if (error instanceof Error) {\n return { message: error.message };\n }\n\n return { message: String(error) };\n }\n\n private emitDrop(\n signal: ObservabilityDropSignal,\n reason: ObservabilityDropReason,\n count: number,\n error?: unknown,\n ): void {\n if (count === 0) return;\n\n const dropEvent: ObservabilityDropEvent = {\n type: 'drop',\n signal,\n reason,\n count,\n timestamp: new Date(),\n exporterName: this.name,\n ...(this.#observabilityStorage ? { storageName: this.#observabilityStorage.constructor.name } : {}),\n ...(error === undefined ? {} : { error: this.sanitizeDropError(error) }),\n };\n\n this.#emitDropEvent?.(dropEvent);\n }\n\n /**\n * Flush a batch of create events for a single signal type.\n * On \"not implemented\" errors, disables the signal for future flushes.\n * On other errors, re-adds events to the buffer for retry.\n */\n private async flushCreates(\n signal: ObservabilityDropSignal,\n events: T[],\n storageCall: (events: T[]) => Promise,\n ): Promise {\n if (events.length === 0) return;\n if (this.#unsupportedSignals.has(signal)) {\n this.emitDrop(signal, 'unsupported-storage', events.length);\n return;\n }\n\n try {\n await storageCall(events);\n } catch (error) {\n if (\n error instanceof MastraError &&\n error.domain === ErrorDomain.MASTRA_OBSERVABILITY &&\n error.id.endsWith('_NOT_IMPLEMENTED')\n ) {\n this.logger.warn(error.message);\n this.#unsupportedSignals.add(signal);\n this.emitDrop(signal, 'unsupported-storage', events.length, error);\n } else {\n const dropped = this.#eventBuffer.reAddCreates(events);\n this.emitDrop(signal, 'retry-exhausted', dropped.length, error);\n }\n }\n }\n\n /**\n * Flush span update/end events, deferring any whose span hasn't been created yet.\n * When `isEnd` is true, successfully flushed spans are removed from tracking.\n */\n private async flushSpanUpdates(\n events: (TracingEvent & RetryCount)[],\n deferredUpdates: BufferedEvent[],\n isEnd: boolean,\n ): Promise {\n const deferredCountAtEntry = deferredUpdates.length;\n if (events.length === 0) return;\n if (this.#unsupportedSignals.has('tracing')) {\n this.emitDrop('tracing', 'unsupported-storage', events.length);\n return;\n }\n\n const partials: UpdateSpanPartial[] = [];\n for (const event of events) {\n const span = event.exportedSpan;\n if (this.#eventBuffer.spanExists(span)) {\n partials.push({\n traceId: span.traceId,\n spanId: span.id,\n updates: buildUpdateSpanRecord(span),\n });\n } else {\n deferredUpdates.push(event);\n }\n }\n\n if (partials.length === 0) return;\n\n try {\n await this.#observabilityStorage!.batchUpdateSpans({ records: partials });\n if (isEnd) {\n this.#eventBuffer.endFinishedSpans({ records: partials });\n }\n } catch (error) {\n if (\n error instanceof MastraError &&\n error.domain === ErrorDomain.MASTRA_OBSERVABILITY &&\n error.id.endsWith('_NOT_IMPLEMENTED')\n ) {\n this.logger.warn(error.message);\n this.#unsupportedSignals.add('tracing');\n deferredUpdates.length = 0;\n this.emitDrop('tracing', 'unsupported-storage', events.length + deferredCountAtEntry, error);\n } else {\n // `events` includes both partials-bound and newly-deferred entries, so\n // re-adding it would double-add the newly-deferred ones if they stayed\n // in deferredUpdates. Splice off only what this call appended — entries\n // from a prior flushSpanUpdates call must survive.\n const newlyDeferred = deferredUpdates.length - deferredCountAtEntry;\n if (newlyDeferred > 0) {\n deferredUpdates.splice(deferredUpdates.length - newlyDeferred, newlyDeferred);\n }\n const dropped = this.#eventBuffer.reAddUpdates(events);\n this.emitDrop('tracing', 'retry-exhausted', dropped.length, error);\n }\n }\n }\n\n /**\n * Flushes the current buffer to storage.\n *\n * Creates are flushed first, then their span keys are added to allCreatedSpans.\n * Updates are checked against allCreatedSpans — those whose span hasn't been\n * created yet are re-inserted into the live buffer for the next flush.\n * Completed spans (SPAN_ENDED) are cleaned up from allCreatedSpans after success.\n */\n private async flushBuffer(): Promise {\n if (!this.#observabilityStorage) {\n this.logger.debug('Cannot flush. Observability storage is not initialized');\n return;\n }\n if (!this.#resolvedStrategy) {\n this.logger.debug('Cannot flush. Observability strategy is not resolved');\n return;\n }\n\n // Clear timer since we're flushing\n if (this.#flushTimer) {\n clearTimeout(this.#flushTimer);\n this.#flushTimer = undefined;\n }\n\n if (this.#eventBuffer.totalSize === 0) {\n return;\n }\n\n const startTime = Date.now();\n const batchSize = this.#eventBuffer.totalSize;\n\n // Snapshot and reset buffer so new events can accumulate during flush\n const creates = this.#eventBuffer.creates;\n const updates = this.#eventBuffer.updates;\n this.#eventBuffer.reset();\n\n const createFeedbackEvents: (FeedbackEvent & RetryCount)[] = [];\n const createLogEvents: (LogEvent & RetryCount)[] = [];\n const createMetricEvents: (MetricEvent & RetryCount)[] = [];\n const createScoreEvents: (ScoreEvent & RetryCount)[] = [];\n const createSpanEvents: (TracingEvent & RetryCount)[] = [];\n\n const updateSpanEvents: (TracingEvent & RetryCount)[] = [];\n const endSpanEvents: (TracingEvent & RetryCount)[] = [];\n\n for (const createEvent of creates) {\n switch (createEvent.type) {\n case 'feedback':\n createFeedbackEvents.push(createEvent);\n break;\n case 'log':\n createLogEvents.push(createEvent);\n break;\n case 'metric':\n createMetricEvents.push(createEvent);\n break;\n case 'score':\n createScoreEvents.push(createEvent);\n break;\n default:\n createSpanEvents.push(createEvent);\n break;\n }\n }\n\n for (const updateEvent of updates) {\n switch (updateEvent.type) {\n case TracingEventType.SPAN_UPDATED:\n updateSpanEvents.push(updateEvent);\n break;\n case TracingEventType.SPAN_ENDED:\n endSpanEvents.push(updateEvent);\n break;\n }\n }\n\n // Flush all creates in parallel — signals are independent\n await Promise.all([\n this.flushCreates('feedback', createFeedbackEvents, events =>\n this.#observabilityStorage!.batchCreateFeedback({ feedbacks: events.map(f => buildFeedbackRecord(f)) }),\n ),\n this.flushCreates('log', createLogEvents, events =>\n this.#observabilityStorage!.batchCreateLogs({ logs: events.map(l => buildLogRecord(l)) }),\n ),\n this.flushCreates('metric', createMetricEvents, events =>\n this.#observabilityStorage!.batchCreateMetrics({ metrics: events.map(m => buildMetricRecord(m)) }),\n ),\n this.flushCreates('score', createScoreEvents, events =>\n this.#observabilityStorage!.batchCreateScores({ scores: events.map(s => buildScoreRecord(s)) }),\n ),\n this.flushCreates('tracing', createSpanEvents, async events => {\n const records = events.map(t => buildCreateSpanRecord(t.exportedSpan));\n await this.#observabilityStorage!.batchCreateSpans({ records });\n this.#eventBuffer.addCreatedSpans({ records });\n }),\n ]);\n\n // Flush span updates and ends — check span existence, defer if not yet created\n const deferredUpdates: BufferedEvent[] = [];\n\n await this.flushSpanUpdates(updateSpanEvents, deferredUpdates, false);\n await this.flushSpanUpdates(endSpanEvents, deferredUpdates, true);\n\n if (deferredUpdates.length > 0) {\n if (this.#unsupportedSignals.has('tracing')) {\n this.emitDrop('tracing', 'unsupported-storage', deferredUpdates.length);\n deferredUpdates.length = 0;\n } else {\n const dropped = this.#eventBuffer.reAddUpdates(deferredUpdates);\n this.emitDrop('tracing', 'retry-exhausted', dropped.length);\n }\n }\n\n const elapsed = Date.now() - startTime;\n this.logger.debug('Batch flushed', {\n strategy: this.#resolvedStrategy,\n batchSize,\n durationMs: elapsed,\n deferredUpdates: deferredUpdates.length > 0 ? deferredUpdates.length : undefined,\n });\n return; // Success\n }\n\n async _exportTracingEvent(event: TracingEvent): Promise {\n await this.waitForInit();\n if (!this.#observabilityStorage) {\n this.logger.debug('Cannot store traces. Observability storage is not initialized');\n return;\n }\n\n this.#eventBuffer.addEvent(event);\n await this.handleBatchedFlush();\n }\n\n /**\n * Resolves when an ongoing init call is finished\n * Doesn't wait for the caller to call init\n * @returns\n */\n private async waitForInit(): Promise {\n if (!this.#isInitializing) return;\n return new Promise(resolve => {\n this.#initPromises.add(resolve);\n });\n }\n\n /**\n * Handle metric events — buffer for batch flush.\n */\n async onMetricEvent(event: MetricEvent): Promise {\n await this.waitForInit();\n if (!this.#observabilityStorage) return;\n\n this.#eventBuffer.addEvent(event);\n await this.handleBatchedFlush();\n }\n\n /**\n * Handle log events — buffer for batch flush.\n */\n async onLogEvent(event: LogEvent): Promise {\n await this.waitForInit();\n if (!this.#observabilityStorage) return;\n\n this.#eventBuffer.addEvent(event);\n await this.handleBatchedFlush();\n }\n\n /**\n * Handle score events — buffer for batch flush.\n */\n async onScoreEvent(event: ScoreEvent): Promise {\n await this.waitForInit();\n if (!this.#observabilityStorage) return;\n\n this.#eventBuffer.addEvent(event);\n await this.handleBatchedFlush();\n }\n\n /**\n * Handle feedback events — buffer for batch flush.\n */\n async onFeedbackEvent(event: FeedbackEvent): Promise {\n await this.waitForInit();\n if (!this.#observabilityStorage) return;\n\n this.#eventBuffer.addEvent(event);\n await this.handleBatchedFlush();\n }\n\n /**\n * Force flush any buffered spans without shutting down the exporter.\n * This is useful in serverless environments where you need to ensure spans\n * are exported before the runtime instance is terminated.\n */\n async flush(): Promise {\n if (this.#eventBuffer.totalSize > 0) {\n this.logger.debug('Flushing buffered events', {\n bufferedEvents: this.#eventBuffer.totalSize,\n });\n await this.flushBuffer();\n }\n }\n\n async shutdown(): Promise {\n // Clear any pending timer\n if (this.#flushTimer) {\n clearTimeout(this.#flushTimer);\n this.#flushTimer = undefined;\n }\n\n // Flush any remaining events\n await this.flush();\n\n this.logger.info('DefaultExporter shutdown complete');\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { LogLevel } from '@mastra/core/logger';\nimport { SpanType, TracingEventType } from '@mastra/core/observability';\nimport type {\n TracingEvent,\n AnyExportedSpan,\n LogEvent,\n MetricEvent,\n ScoreEvent,\n FeedbackEvent,\n} from '@mastra/core/observability';\nimport { AuthFailureCooldown, fetchWithAuthFailureHandling, isAuthFailureError } from './auth-failure-cooldown';\nimport { BaseExporter } from './base';\nimport type { BaseExporterConfig } from './base';\n\nexport interface MastraPlatformExporterConfig extends BaseExporterConfig {\n maxBatchSize?: number; // Default: 1000 spans\n maxBatchWaitMs?: number; // Default: 5000ms\n maxRetries?: number; // Default: 3\n\n accessToken?: string; // Mastra Observability access token (from env or config)\n projectId?: string; // Project ID for project-scoped collector routes\n endpoint?: string; // Base observability endpoint\n tracesEndpoint?: string; // Explicit traces endpoint override\n logsEndpoint?: string; // Explicit logs endpoint override\n metricsEndpoint?: string; // Explicit metrics endpoint override\n scoresEndpoint?: string; // Explicit scores endpoint override\n feedbackEndpoint?: string; // Explicit feedback endpoint override\n}\n\ntype PlatformSignal = 'traces' | 'logs' | 'metrics' | 'scores' | 'feedback';\n\nconst SIGNAL_PUBLISH_SUFFIXES: Record = {\n traces: '/spans/publish',\n logs: '/logs/publish',\n metrics: '/metrics/publish',\n scores: '/scores/publish',\n feedback: '/feedback/publish',\n};\n\nconst DEFAULT_PLATFORM_SPAN_FILTER = (span: AnyExportedSpan): boolean => span.type !== SpanType.MODEL_CHUNK;\n\nconst SIGNAL_PUBLISH_SEGMENTS: Record = {\n traces: 'spans',\n logs: 'logs',\n metrics: 'metrics',\n scores: 'scores',\n feedback: 'feedback',\n};\n\nfunction trimTrailingSlashes(value: string): string {\n let end = value.length;\n while (end > 0 && value.charCodeAt(end - 1) === 47) {\n end--;\n }\n return end === value.length ? value : value.slice(0, end);\n}\n\nfunction createInvalidEndpointError(endpoint: string, text: string, cause?: unknown): MastraError {\n return new MastraError(\n {\n id: `MASTRA_PLATFORM_EXPORTER_INVALID_ENDPOINT`,\n text,\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n details: {\n endpoint,\n },\n },\n cause,\n );\n}\n\nconst VALID_PROJECT_ID = /^[a-zA-Z0-9_-]+$/;\n\nfunction createInvalidProjectIdError(projectId: string): MastraError {\n return new MastraError({\n id: `MASTRA_PLATFORM_EXPORTER_INVALID_PROJECT_ID`,\n text: 'MastraPlatformExporter projectId must only contain letters, numbers, hyphens, and underscores.',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n details: {\n projectId,\n },\n });\n}\n\nfunction resolveBaseEndpoint(baseEndpoint: string): string {\n const normalizedEndpoint = trimTrailingSlashes(baseEndpoint);\n const invalidText =\n 'MastraPlatformExporter endpoint must be a base origin like \"https://collector.example.com\" with no path, search, or hash.';\n\n try {\n const parsedEndpoint = new URL(normalizedEndpoint);\n if (parsedEndpoint.pathname !== '/' || parsedEndpoint.search || parsedEndpoint.hash) {\n throw createInvalidEndpointError(baseEndpoint, invalidText);\n }\n return trimTrailingSlashes(parsedEndpoint.origin);\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n\n throw createInvalidEndpointError(baseEndpoint, invalidText, error);\n }\n}\n\nfunction buildSignalPath(signal: PlatformSignal, projectId?: string): string {\n const signalSegment = SIGNAL_PUBLISH_SEGMENTS[signal];\n if (!projectId) {\n return `/ai/${signalSegment}/publish`;\n }\n\n return `/projects/${projectId}/ai/${signalSegment}/publish`;\n}\n\nfunction buildSignalEndpoint(baseEndpoint: string, signal: PlatformSignal, projectId?: string): string {\n return `${baseEndpoint}${buildSignalPath(signal, projectId)}`;\n}\n\nfunction resolveExplicitSignalEndpoint(signal: PlatformSignal, endpoint: string, projectId?: string): string {\n const normalizedEndpoint = trimTrailingSlashes(endpoint);\n const invalidText = `MastraPlatformExporter ${signal}Endpoint must be a base origin like \"https://collector.example.com\" or a full ${signal} publish URL ending in \"${SIGNAL_PUBLISH_SUFFIXES[signal]}\".`;\n\n try {\n const parsedEndpoint = new URL(normalizedEndpoint);\n if (parsedEndpoint.search || parsedEndpoint.hash) {\n throw createInvalidEndpointError(endpoint, invalidText);\n }\n\n const normalizedOrigin = trimTrailingSlashes(parsedEndpoint.origin);\n const normalizedPathname = trimTrailingSlashes(parsedEndpoint.pathname);\n\n if (!normalizedPathname || normalizedPathname === '/') {\n return buildSignalEndpoint(normalizedOrigin, signal, projectId);\n }\n\n if (normalizedPathname.endsWith(SIGNAL_PUBLISH_SUFFIXES[signal])) {\n return `${normalizedOrigin}${normalizedPathname}`;\n }\n\n throw createInvalidEndpointError(endpoint, invalidText);\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n\n throw createInvalidEndpointError(endpoint, invalidText, error);\n }\n}\n\nfunction deriveSignalEndpointFromTracesEndpoint(signal: PlatformSignal, tracesEndpoint: string): string {\n if (signal === 'traces') {\n return tracesEndpoint;\n }\n\n const normalizedTracesEndpoint = trimTrailingSlashes(tracesEndpoint);\n const invalidText =\n 'MastraPlatformExporter tracesEndpoint must be a base origin like \"https://collector.example.com\" or a full traces publish URL ending in \"/spans/publish\".';\n\n try {\n const parsedEndpoint = new URL(normalizedTracesEndpoint);\n const normalizedOrigin = trimTrailingSlashes(parsedEndpoint.origin);\n const normalizedPathname = trimTrailingSlashes(parsedEndpoint.pathname);\n\n if (!normalizedPathname.endsWith(SIGNAL_PUBLISH_SUFFIXES.traces)) {\n throw createInvalidEndpointError(tracesEndpoint, invalidText);\n }\n\n const basePath = normalizedPathname.slice(0, -SIGNAL_PUBLISH_SUFFIXES.traces.length);\n return `${normalizedOrigin}${basePath}${SIGNAL_PUBLISH_SUFFIXES[signal]}`;\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n\n throw createInvalidEndpointError(tracesEndpoint, invalidText, error);\n }\n}\n\ninterface MastraPlatformBuffer {\n spans: MastraPlatformSpanRecord[];\n logs: MastraPlatformLogRecord[];\n metrics: MastraPlatformMetricRecord[];\n scores: MastraPlatformScoreRecord[];\n feedback: MastraPlatformFeedbackRecord[];\n firstEventTime?: Date;\n totalSize: number;\n}\n\ntype MastraPlatformSpanRecord = AnyExportedSpan & {\n spanId: string;\n spanType: string;\n startedAt: Date;\n endedAt: Date | null;\n error: AnyExportedSpan['errorInfo'] | null;\n createdAt: Date;\n updatedAt: Date | null;\n};\n\ntype MastraPlatformLogRecord = LogEvent['log'];\ntype MastraPlatformMetricRecord = MetricEvent['metric'];\ntype MastraPlatformScoreRecord = ScoreEvent['score'];\ntype MastraPlatformFeedbackRecord = FeedbackEvent['feedback'];\n\ntype ResolvedPlatformConfig = {\n logger: BaseExporterConfig['logger'];\n logLevel: NonNullable;\n maxBatchSize: number;\n maxBatchWaitMs: number;\n maxRetries: number;\n accessToken: string;\n tracesEndpoint: string;\n logsEndpoint: string;\n metricsEndpoint: string;\n scoresEndpoint: string;\n feedbackEndpoint: string;\n};\n\nexport class MastraPlatformExporter extends BaseExporter {\n name = 'mastra-platform-exporter';\n\n private readonly platformConfig: Readonly;\n private readonly authFailureCooldown: AuthFailureCooldown;\n private buffer: MastraPlatformBuffer;\n private flushTimer: NodeJS.Timeout | null = null;\n private inFlightFlushes = new Set>();\n\n constructor(config: MastraPlatformExporterConfig = {}) {\n super(config);\n\n if (config.projectId !== undefined && !VALID_PROJECT_ID.test(config.projectId)) {\n throw createInvalidProjectIdError(config.projectId);\n }\n\n const accessToken =\n config.accessToken || process.env.MASTRA_PLATFORM_ACCESS_TOKEN || process.env.MASTRA_CLOUD_ACCESS_TOKEN;\n // Treat an empty MASTRA_PROJECT_ID as unset so deployments that always\n // export the variable (e.g. CI templates) don't have to special-case it.\n const envProjectId = process.env.MASTRA_PROJECT_ID === '' ? undefined : process.env.MASTRA_PROJECT_ID;\n const rawProjectId = config.projectId ?? envProjectId;\n if (rawProjectId !== undefined && !VALID_PROJECT_ID.test(rawProjectId)) {\n throw createInvalidProjectIdError(rawProjectId);\n }\n const projectId = rawProjectId;\n if (!accessToken) {\n this.setDisabled('MASTRA_PLATFORM_ACCESS_TOKEN environment variable not set.', 'debug');\n }\n\n const tracesEndpointOverride = config.tracesEndpoint ?? process.env.MASTRA_CLOUD_TRACES_ENDPOINT;\n let baseEndpoint: string | undefined;\n let tracesEndpoint: string;\n\n if (tracesEndpointOverride) {\n tracesEndpoint = resolveExplicitSignalEndpoint('traces', tracesEndpointOverride, projectId);\n } else {\n baseEndpoint = resolveBaseEndpoint(config.endpoint ?? 'https://observability.mastra.ai');\n tracesEndpoint = buildSignalEndpoint(baseEndpoint, 'traces', projectId);\n }\n\n const resolveConfiguredSignalEndpoint = (\n signal: Exclude,\n explicitEndpoint?: string,\n ): string => {\n if (explicitEndpoint) {\n return resolveExplicitSignalEndpoint(signal, explicitEndpoint, projectId);\n }\n\n if (tracesEndpointOverride) {\n return deriveSignalEndpointFromTracesEndpoint(signal, tracesEndpoint);\n }\n\n return buildSignalEndpoint(baseEndpoint!, signal, projectId);\n };\n\n this.platformConfig = {\n logger: this.logger,\n logLevel: config.logLevel ?? LogLevel.INFO,\n maxBatchSize: config.maxBatchSize ?? 1000,\n maxBatchWaitMs: config.maxBatchWaitMs ?? 5000,\n maxRetries: config.maxRetries ?? 3,\n accessToken: accessToken || '',\n tracesEndpoint,\n logsEndpoint: resolveConfiguredSignalEndpoint('logs', config.logsEndpoint),\n metricsEndpoint: resolveConfiguredSignalEndpoint('metrics', config.metricsEndpoint),\n scoresEndpoint: resolveConfiguredSignalEndpoint('scores', config.scoresEndpoint),\n feedbackEndpoint: resolveConfiguredSignalEndpoint('feedback', config.feedbackEndpoint),\n };\n\n this.authFailureCooldown = new AuthFailureCooldown('MastraPlatformExporter', () => this.logger);\n\n this.buffer = {\n spans: [],\n logs: [],\n metrics: [],\n scores: [],\n feedback: [],\n totalSize: 0,\n };\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise {\n if (event.type !== TracingEventType.SPAN_ENDED) {\n return;\n }\n\n if (!DEFAULT_PLATFORM_SPAN_FILTER(event.exportedSpan)) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventIfCoolingDown()) {\n return;\n }\n\n this.addToBuffer(event);\n\n await this.handleBufferedEvent();\n }\n\n async onLogEvent(event: LogEvent): Promise {\n if (this.isDisabled) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventIfCoolingDown()) {\n return;\n }\n\n this.addLogToBuffer(event);\n await this.handleBufferedEvent();\n }\n\n async onMetricEvent(event: MetricEvent): Promise {\n if (this.isDisabled) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventIfCoolingDown()) {\n return;\n }\n\n this.addMetricToBuffer(event);\n await this.handleBufferedEvent();\n }\n\n async onScoreEvent(event: ScoreEvent): Promise {\n if (this.isDisabled) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventIfCoolingDown()) {\n return;\n }\n\n this.addScoreToBuffer(event);\n await this.handleBufferedEvent();\n }\n\n async onFeedbackEvent(event: FeedbackEvent): Promise {\n if (this.isDisabled) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventIfCoolingDown()) {\n return;\n }\n\n this.addFeedbackToBuffer(event);\n await this.handleBufferedEvent();\n }\n\n private addToBuffer(event: TracingEvent): void {\n this.markBufferStart();\n\n const spanRecord = this.formatSpan(event.exportedSpan);\n this.buffer.spans.push(spanRecord);\n this.buffer.totalSize++;\n }\n\n private addLogToBuffer(event: LogEvent): void {\n this.markBufferStart();\n\n this.buffer.logs.push(this.formatLog(event.log));\n this.buffer.totalSize++;\n }\n\n private addMetricToBuffer(event: MetricEvent): void {\n this.markBufferStart();\n\n this.buffer.metrics.push(this.formatMetric(event.metric));\n this.buffer.totalSize++;\n }\n\n private addScoreToBuffer(event: ScoreEvent): void {\n this.markBufferStart();\n\n this.buffer.scores.push(this.formatScore(event.score));\n this.buffer.totalSize++;\n }\n\n private addFeedbackToBuffer(event: FeedbackEvent): void {\n this.markBufferStart();\n\n this.buffer.feedback.push(this.formatFeedback(event.feedback));\n this.buffer.totalSize++;\n }\n\n private markBufferStart(): void {\n if (this.buffer.totalSize === 0) {\n this.buffer.firstEventTime = new Date();\n }\n }\n\n private formatSpan(span: AnyExportedSpan): MastraPlatformSpanRecord {\n const spanRecord: MastraPlatformSpanRecord = {\n ...span,\n spanId: span.id,\n spanType: span.type,\n startedAt: span.startTime,\n endedAt: span.endTime ?? null,\n error: span.errorInfo ?? null,\n createdAt: new Date(),\n updatedAt: null,\n };\n\n return spanRecord;\n }\n\n private formatLog(log: LogEvent['log']): MastraPlatformLogRecord {\n return {\n ...log,\n };\n }\n\n private formatMetric(metric: MetricEvent['metric']): MastraPlatformMetricRecord {\n return {\n ...metric,\n };\n }\n\n private formatScore(score: ScoreEvent['score']): MastraPlatformScoreRecord {\n return {\n ...score,\n };\n }\n\n private formatFeedback(feedback: FeedbackEvent['feedback']): MastraPlatformFeedbackRecord {\n return {\n ...feedback,\n };\n }\n\n private async handleBufferedEvent(): Promise {\n if (this.shouldFlush()) {\n void this.flush().catch(error => {\n this.logger.error('Batch flush failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n });\n } else if (this.buffer.totalSize === 1) {\n this.scheduleFlush();\n }\n }\n\n private shouldFlush(): boolean {\n if (this.buffer.totalSize >= this.platformConfig.maxBatchSize) {\n return true;\n }\n\n if (this.buffer.firstEventTime && this.buffer.totalSize > 0) {\n const elapsed = Date.now() - this.buffer.firstEventTime.getTime();\n if (elapsed >= this.platformConfig.maxBatchWaitMs) {\n return true;\n }\n }\n\n return false;\n }\n\n private scheduleFlush(): void {\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n }\n this.flushTimer = setTimeout(() => {\n void this.flush().catch(error => {\n const mastraError = new MastraError(\n {\n id: `MASTRA_PLATFORM_EXPORTER_FAILED_TO_SCHEDULE_FLUSH`,\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n },\n error,\n );\n this.logger.trackException(mastraError);\n this.logger.error('Scheduled flush failed', mastraError);\n });\n }, this.platformConfig.maxBatchWaitMs);\n }\n\n private async flushBuffer(): Promise {\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n\n if (this.buffer.totalSize === 0) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventsIfCoolingDown(this.buffer.totalSize)) {\n this.resetBuffer();\n return;\n }\n\n const startTime = Date.now();\n const spansCopy = [...this.buffer.spans];\n const logsCopy = [...this.buffer.logs];\n const metricsCopy = [...this.buffer.metrics];\n const scoresCopy = [...this.buffer.scores];\n const feedbackCopy = [...this.buffer.feedback];\n const batchSize = this.buffer.totalSize;\n const flushReason = this.buffer.totalSize >= this.platformConfig.maxBatchSize ? 'size' : 'time';\n\n this.resetBuffer();\n\n const results = await Promise.all([\n this.flushSignalBatch('traces', spansCopy),\n this.flushSignalBatch('logs', logsCopy),\n this.flushSignalBatch('metrics', metricsCopy),\n this.flushSignalBatch('scores', scoresCopy),\n this.flushSignalBatch('feedback', feedbackCopy),\n ]);\n\n const failedSignals = results.filter(result => !result.succeeded).map(result => result.signal);\n const authFailure = results.find(result => result.authFailureStatus !== undefined);\n\n const elapsed = Date.now() - startTime;\n\n if (failedSignals.length === 0) {\n const droppedEventsDuringAuthCooldown = this.authFailureCooldown.reset();\n const logData: Record = {\n batchSize,\n flushReason,\n durationMs: elapsed,\n };\n\n if (droppedEventsDuringAuthCooldown > 0) {\n logData.droppedEventsDuringAuthCooldown = droppedEventsDuringAuthCooldown;\n }\n\n this.logger.debug('Batch flushed successfully', logData);\n return;\n }\n\n if (authFailure?.authFailureStatus !== undefined) {\n this.authFailureCooldown.recordFailure({\n status: authFailure.authFailureStatus,\n failedSignals,\n droppedBatchSize: batchSize,\n });\n }\n\n this.logger.warn('Batch flush completed with dropped signal batches', {\n batchSize,\n flushReason,\n durationMs: elapsed,\n failedSignals,\n });\n }\n\n /**\n * Uploads a signal batch to the configured Mastra Observability API using fetchWithRetry.\n */\n private async batchUpload(signal: PlatformSignal, records: T[]): Promise {\n const headers = {\n Authorization: `Bearer ${this.platformConfig.accessToken}`,\n 'Content-Type': 'application/json',\n };\n\n const endpointMap: Record = {\n traces: this.platformConfig.tracesEndpoint,\n logs: this.platformConfig.logsEndpoint,\n metrics: this.platformConfig.metricsEndpoint,\n scores: this.platformConfig.scoresEndpoint,\n feedback: this.platformConfig.feedbackEndpoint,\n };\n\n const options: RequestInit = {\n method: 'POST',\n headers,\n body: JSON.stringify({ [SIGNAL_PUBLISH_SEGMENTS[signal]]: records }),\n };\n\n await fetchWithAuthFailureHandling(endpointMap[signal], options, this.platformConfig.maxRetries);\n }\n\n private async flushSignalBatch(\n signal: PlatformSignal,\n records: T[],\n ): Promise<{ signal: PlatformSignal; succeeded: boolean; authFailureStatus?: number }> {\n if (records.length === 0) {\n return { signal, succeeded: true };\n }\n\n try {\n await this.batchUpload(signal, records);\n return { signal, succeeded: true };\n } catch (error) {\n if (isAuthFailureError(error)) {\n return { signal, succeeded: false, authFailureStatus: error.status };\n }\n\n const errorId = `MASTRA_PLATFORM_EXPORTER_FAILED_TO_BATCH_UPLOAD_${signal.toUpperCase()}` as Uppercase;\n const mastraError = new MastraError(\n {\n id: errorId,\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n details: {\n signal,\n droppedBatchSize: records.length,\n },\n },\n error,\n );\n this.logger.trackException(mastraError);\n this.logger.error('Batch upload failed after all retries, dropping batch', mastraError);\n return { signal, succeeded: false };\n }\n }\n\n private resetBuffer(): void {\n this.buffer.spans = [];\n this.buffer.logs = [];\n this.buffer.metrics = [];\n this.buffer.scores = [];\n this.buffer.feedback = [];\n this.buffer.firstEventTime = undefined;\n this.buffer.totalSize = 0;\n }\n\n /**\n * Force flush any buffered events without shutting down the exporter.\n * This is useful in serverless environments where you need to ensure events\n * are exported before the runtime instance is terminated.\n */\n async flush(): Promise {\n if (this.isDisabled) {\n return;\n }\n\n while (this.buffer.totalSize > 0 || this.inFlightFlushes.size > 0) {\n if (this.buffer.totalSize > 0) {\n this.logger.debug('Flushing buffered events', {\n bufferedEvents: this.buffer.totalSize,\n });\n\n const flushPromise = this.flushBuffer();\n this.inFlightFlushes.add(flushPromise);\n\n try {\n await flushPromise;\n } finally {\n this.inFlightFlushes.delete(flushPromise);\n }\n\n continue;\n }\n\n await Promise.allSettled([...this.inFlightFlushes]);\n }\n }\n\n async shutdown(): Promise {\n if (this.isDisabled) {\n return;\n }\n\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n\n try {\n await this.flush();\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: `MASTRA_PLATFORM_EXPORTER_FAILED_TO_FLUSH_REMAINING_EVENTS_DURING_SHUTDOWN`,\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n details: {\n remainingEvents: this.buffer.totalSize,\n },\n },\n error,\n );\n\n this.logger.trackException(mastraError);\n this.logger.error('Failed to flush remaining events during shutdown', mastraError);\n }\n\n this.logger.info('MastraPlatformExporter shutdown complete');\n }\n}\n","import { MastraError, ErrorDomain } from '@mastra/core/error';\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport type {\n TracingEvent,\n InitExporterOptions,\n MetricEvent,\n LogEvent,\n ScoreEvent,\n FeedbackEvent,\n ObservabilityDropEvent,\n ObservabilityDropReason,\n ObservabilityDropSignal,\n} from '@mastra/core/observability';\nimport { TracingEventType } from '@mastra/core/observability';\nimport type { ObservabilityStorage, TracingStorageStrategy, MastraCompositeStore } from '@mastra/core/storage';\nimport {\n buildCreateSpanRecord,\n buildUpdateSpanRecord,\n buildMetricRecord,\n buildLogRecord,\n buildScoreRecord,\n buildFeedbackRecord,\n} from '@mastra/core/storage';\nimport type { BaseExporterConfig } from './base';\nimport { BaseExporter } from './base';\nimport { EventBuffer } from './event-buffer';\nimport type { BufferedEvent, RetryCount, UpdateSpanPartial } from './event-buffer';\n\n/** Configuration for the MastraStorageExporter's batching, retry, and strategy behavior. */\nexport interface MastraStorageExporterConfig extends BaseExporterConfig {\n maxBatchSize?: number; // Default: 1000 spans\n maxBufferSize?: number; // Default: 10000 spans\n maxBatchWaitMs?: number; // Default: 5000ms\n maxRetries?: number; // Default: 4\n retryDelayMs?: number; // Default: 500ms (base delay for exponential backoff)\n\n // Strategy selection (optional)\n strategy?: TracingStorageStrategy | 'auto';\n}\n\n/**\n * Resolves the final tracing storage strategy based on config and observability store hints\n */\nfunction resolveTracingStorageStrategy(\n config: MastraStorageExporterConfig,\n observabilityStorage: ObservabilityStorage,\n storageName: string,\n logger: IMastraLogger,\n): TracingStorageStrategy {\n const observabilityStrategy = observabilityStorage.observabilityStrategy;\n if (config.strategy && config.strategy !== 'auto') {\n if (observabilityStrategy.supported.includes(config.strategy)) {\n return config.strategy;\n }\n // Log warning and fall through to auto-selection\n logger.warn('User-specified tracing strategy not supported by storage adapter, falling back to auto-selection', {\n userStrategy: config.strategy,\n storageAdapter: storageName,\n supportedStrategies: observabilityStrategy.supported,\n fallbackStrategy: observabilityStrategy.preferred,\n });\n }\n return observabilityStrategy.preferred;\n}\n\ntype Resolve = (value: void | PromiseLike) => void;\n\n/**\n * Storage-backed exporter. Buffers observability events and flushes them in\n * batches to the configured ObservabilityStorage backend with retry support.\n */\nexport class MastraStorageExporter extends BaseExporter {\n name = 'mastra-storage-exporter';\n\n #config: MastraStorageExporterConfig;\n #isInitializing = false;\n #initPromises: Set = new Set();\n #eventBuffer: EventBuffer;\n\n #storage?: MastraCompositeStore;\n #observabilityStorage?: ObservabilityStorage;\n #resolvedStrategy?: TracingStorageStrategy;\n #flushTimer?: NodeJS.Timeout;\n #emitDropEvent?: (event: ObservabilityDropEvent) => void;\n\n // Signals whose storage methods threw \"not implemented\" — skip on future flushes\n #unsupportedSignals: Set = new Set();\n\n constructor(config: MastraStorageExporterConfig = {}) {\n super(config);\n\n // Set default configuration\n this.#config = {\n ...config,\n maxBatchSize: config.maxBatchSize ?? 1000,\n maxBufferSize: config.maxBufferSize ?? 10000,\n maxBatchWaitMs: config.maxBatchWaitMs ?? 5000,\n maxRetries: config.maxRetries ?? 4,\n retryDelayMs: config.retryDelayMs ?? 500,\n strategy: config.strategy ?? 'auto',\n };\n\n this.#eventBuffer = new EventBuffer({ maxRetries: this.#config.maxRetries ?? 4 });\n }\n\n /**\n * Initialize the exporter (called after all dependencies are ready)\n */\n async init(options: InitExporterOptions): Promise {\n try {\n this.#isInitializing = true;\n this.#emitDropEvent = options.emitDropEvent;\n\n this.#storage = options.mastra?.getStorage();\n if (!this.#storage) {\n this.logger.warn('MastraStorageExporter disabled: Storage not available. Traces will not be persisted.');\n return;\n }\n\n this.#observabilityStorage = await this.#storage.getStore('observability');\n if (!this.#observabilityStorage) {\n this.logger.warn(\n 'MastraStorageExporter disabled: Observability storage not available. Traces will not be persisted.',\n );\n return;\n }\n\n // Initialize the resolved strategy once observability store is available\n if (!this.#resolvedStrategy) {\n this.#resolvedStrategy = resolveTracingStorageStrategy(\n this.#config,\n this.#observabilityStorage,\n this.#storage.constructor.name,\n this.logger,\n );\n\n this.logger.debug('tracing storage exporter initialized', {\n strategy: this.#resolvedStrategy,\n source: this.#config.strategy !== 'auto' ? 'user' : 'auto',\n storageAdapter: this.#storage.constructor.name,\n maxBatchSize: this.#config.maxBatchSize,\n maxBatchWaitMs: this.#config.maxBatchWaitMs,\n });\n }\n\n if (this.#resolvedStrategy) {\n this.#eventBuffer.init({ strategy: this.#resolvedStrategy });\n }\n } finally {\n this.#isInitializing = false;\n /**\n * Assumes caller waits until export of a parent span is completed before calling\n * export for child spans , order is not relevant for resolve\n */\n this.#initPromises.forEach(resolve => {\n resolve();\n });\n this.#initPromises.clear();\n }\n }\n\n /**\n * Checks if buffer should be flushed based on size or time triggers\n */\n private shouldFlush(): boolean {\n if (this.#resolvedStrategy === 'realtime') {\n return true;\n }\n\n // Emergency flush - buffer overflow\n if (this.#eventBuffer.totalSize >= this.#config.maxBufferSize!) {\n return true;\n }\n\n // Size-based flush\n if (this.#eventBuffer.totalSize >= this.#config.maxBatchSize!) {\n return true;\n }\n\n // Time-based flush\n if (this.#eventBuffer.totalSize > 0) {\n if (this.#eventBuffer.elapsed >= this.#config.maxBatchWaitMs!) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Schedules a flush using setTimeout\n */\n private scheduleFlush(): void {\n if (this.#flushTimer) {\n clearTimeout(this.#flushTimer);\n }\n this.#flushTimer = setTimeout(() => {\n this.flushBuffer().catch(error => {\n this.logger.error('Scheduled flush failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n });\n }, this.#config.maxBatchWaitMs);\n }\n\n /**\n * Checks flush triggers and schedules/triggers flush as needed.\n * Called after adding any event to the buffer.\n * Returns the flush promise when flushing so callers can await it.\n */\n private async handleBatchedFlush(): Promise {\n if (this.shouldFlush()) {\n await this.flushBuffer();\n } else if (this.#eventBuffer.totalSize === 1) {\n this.scheduleFlush();\n }\n }\n\n private sanitizeDropError(error: unknown): ObservabilityDropEvent['error'] {\n if (error instanceof MastraError) {\n return {\n id: error.id,\n domain: String(error.domain),\n message: error.message,\n };\n }\n\n if (error instanceof Error) {\n return { message: error.message };\n }\n\n return { message: String(error) };\n }\n\n private emitDrop(\n signal: ObservabilityDropSignal,\n reason: ObservabilityDropReason,\n count: number,\n error?: unknown,\n ): void {\n if (count === 0) return;\n\n const dropEvent: ObservabilityDropEvent = {\n type: 'drop',\n signal,\n reason,\n count,\n timestamp: new Date(),\n exporterName: this.name,\n ...(this.#observabilityStorage ? { storageName: this.#observabilityStorage.constructor.name } : {}),\n ...(error === undefined ? {} : { error: this.sanitizeDropError(error) }),\n };\n\n this.#emitDropEvent?.(dropEvent);\n }\n\n /**\n * Flush a batch of create events for a single signal type.\n * On \"not implemented\" errors, disables the signal for future flushes.\n * On other errors, re-adds events to the buffer for retry.\n */\n private async flushCreates(\n signal: ObservabilityDropSignal,\n events: T[],\n storageCall: (events: T[]) => Promise,\n ): Promise {\n if (events.length === 0) return;\n if (this.#unsupportedSignals.has(signal)) {\n this.emitDrop(signal, 'unsupported-storage', events.length);\n return;\n }\n\n try {\n await storageCall(events);\n } catch (error) {\n if (\n error instanceof MastraError &&\n error.domain === ErrorDomain.MASTRA_OBSERVABILITY &&\n error.id.endsWith('_NOT_IMPLEMENTED')\n ) {\n this.logger.warn(error.message);\n this.#unsupportedSignals.add(signal);\n this.emitDrop(signal, 'unsupported-storage', events.length, error);\n } else {\n const dropped = this.#eventBuffer.reAddCreates(events);\n this.emitDrop(signal, 'retry-exhausted', dropped.length, error);\n }\n }\n }\n\n /**\n * Flush span update/end events, deferring any whose span hasn't been created yet.\n * When `isEnd` is true, successfully flushed spans are removed from tracking.\n */\n private async flushSpanUpdates(\n events: (TracingEvent & RetryCount)[],\n deferredUpdates: BufferedEvent[],\n isEnd: boolean,\n ): Promise {\n const deferredCountAtEntry = deferredUpdates.length;\n if (events.length === 0) return;\n if (this.#unsupportedSignals.has('tracing')) {\n this.emitDrop('tracing', 'unsupported-storage', events.length);\n return;\n }\n\n const partials: UpdateSpanPartial[] = [];\n for (const event of events) {\n const span = event.exportedSpan;\n if (this.#eventBuffer.spanExists(span)) {\n partials.push({\n traceId: span.traceId,\n spanId: span.id,\n updates: buildUpdateSpanRecord(span),\n });\n } else {\n deferredUpdates.push(event);\n }\n }\n\n if (partials.length === 0) return;\n\n try {\n await this.#observabilityStorage!.batchUpdateSpans({ records: partials });\n if (isEnd) {\n this.#eventBuffer.endFinishedSpans({ records: partials });\n }\n } catch (error) {\n if (\n error instanceof MastraError &&\n error.domain === ErrorDomain.MASTRA_OBSERVABILITY &&\n error.id.endsWith('_NOT_IMPLEMENTED')\n ) {\n this.logger.warn(error.message);\n this.#unsupportedSignals.add('tracing');\n deferredUpdates.length = 0;\n this.emitDrop('tracing', 'unsupported-storage', events.length + deferredCountAtEntry, error);\n } else {\n // `events` includes both partials-bound and newly-deferred entries, so\n // re-adding it would double-add the newly-deferred ones if they stayed\n // in deferredUpdates. Splice off only what this call appended — entries\n // from a prior flushSpanUpdates call must survive.\n const newlyDeferred = deferredUpdates.length - deferredCountAtEntry;\n if (newlyDeferred > 0) {\n deferredUpdates.splice(deferredUpdates.length - newlyDeferred, newlyDeferred);\n }\n const dropped = this.#eventBuffer.reAddUpdates(events);\n this.emitDrop('tracing', 'retry-exhausted', dropped.length, error);\n }\n }\n }\n\n /**\n * Flushes the current buffer to storage.\n *\n * Creates are flushed first, then their span keys are added to allCreatedSpans.\n * Updates are checked against allCreatedSpans — those whose span hasn't been\n * created yet are re-inserted into the live buffer for the next flush.\n * Completed spans (SPAN_ENDED) are cleaned up from allCreatedSpans after success.\n */\n private async flushBuffer(): Promise {\n if (!this.#observabilityStorage) {\n this.logger.debug('Cannot flush. Observability storage is not initialized');\n return;\n }\n if (!this.#resolvedStrategy) {\n this.logger.debug('Cannot flush. Observability strategy is not resolved');\n return;\n }\n\n // Clear timer since we're flushing\n if (this.#flushTimer) {\n clearTimeout(this.#flushTimer);\n this.#flushTimer = undefined;\n }\n\n if (this.#eventBuffer.totalSize === 0) {\n return;\n }\n\n const startTime = Date.now();\n const batchSize = this.#eventBuffer.totalSize;\n\n // Snapshot and reset buffer so new events can accumulate during flush\n const creates = this.#eventBuffer.creates;\n const updates = this.#eventBuffer.updates;\n this.#eventBuffer.reset();\n\n const createFeedbackEvents: (FeedbackEvent & RetryCount)[] = [];\n const createLogEvents: (LogEvent & RetryCount)[] = [];\n const createMetricEvents: (MetricEvent & RetryCount)[] = [];\n const createScoreEvents: (ScoreEvent & RetryCount)[] = [];\n const createSpanEvents: (TracingEvent & RetryCount)[] = [];\n\n const updateSpanEvents: (TracingEvent & RetryCount)[] = [];\n const endSpanEvents: (TracingEvent & RetryCount)[] = [];\n\n for (const createEvent of creates) {\n switch (createEvent.type) {\n case 'feedback':\n createFeedbackEvents.push(createEvent);\n break;\n case 'log':\n createLogEvents.push(createEvent);\n break;\n case 'metric':\n createMetricEvents.push(createEvent);\n break;\n case 'score':\n createScoreEvents.push(createEvent);\n break;\n default:\n createSpanEvents.push(createEvent);\n break;\n }\n }\n\n for (const updateEvent of updates) {\n switch (updateEvent.type) {\n case TracingEventType.SPAN_UPDATED:\n updateSpanEvents.push(updateEvent);\n break;\n case TracingEventType.SPAN_ENDED:\n endSpanEvents.push(updateEvent);\n break;\n }\n }\n\n // Flush all creates in parallel — signals are independent\n await Promise.all([\n this.flushCreates('feedback', createFeedbackEvents, events =>\n this.#observabilityStorage!.batchCreateFeedback({ feedbacks: events.map(f => buildFeedbackRecord(f)) }),\n ),\n this.flushCreates('log', createLogEvents, events =>\n this.#observabilityStorage!.batchCreateLogs({ logs: events.map(l => buildLogRecord(l)) }),\n ),\n this.flushCreates('metric', createMetricEvents, events =>\n this.#observabilityStorage!.batchCreateMetrics({ metrics: events.map(m => buildMetricRecord(m)) }),\n ),\n this.flushCreates('score', createScoreEvents, events =>\n this.#observabilityStorage!.batchCreateScores({ scores: events.map(s => buildScoreRecord(s)) }),\n ),\n this.flushCreates('tracing', createSpanEvents, async events => {\n const records = events.map(t => buildCreateSpanRecord(t.exportedSpan));\n await this.#observabilityStorage!.batchCreateSpans({ records });\n this.#eventBuffer.addCreatedSpans({ records });\n }),\n ]);\n\n // Flush span updates and ends — check span existence, defer if not yet created\n const deferredUpdates: BufferedEvent[] = [];\n\n await this.flushSpanUpdates(updateSpanEvents, deferredUpdates, false);\n await this.flushSpanUpdates(endSpanEvents, deferredUpdates, true);\n\n if (deferredUpdates.length > 0) {\n if (this.#unsupportedSignals.has('tracing')) {\n this.emitDrop('tracing', 'unsupported-storage', deferredUpdates.length);\n deferredUpdates.length = 0;\n } else {\n const dropped = this.#eventBuffer.reAddUpdates(deferredUpdates);\n this.emitDrop('tracing', 'retry-exhausted', dropped.length);\n }\n }\n\n const elapsed = Date.now() - startTime;\n this.logger.debug('Batch flushed', {\n strategy: this.#resolvedStrategy,\n batchSize,\n durationMs: elapsed,\n deferredUpdates: deferredUpdates.length > 0 ? deferredUpdates.length : undefined,\n });\n return; // Success\n }\n\n async _exportTracingEvent(event: TracingEvent): Promise {\n await this.waitForInit();\n if (!this.#observabilityStorage) {\n this.logger.debug('Cannot store traces. Observability storage is not initialized');\n return;\n }\n\n this.#eventBuffer.addEvent(event);\n await this.handleBatchedFlush();\n }\n\n /**\n * Resolves when an ongoing init call is finished\n * Doesn't wait for the caller to call init\n * @returns\n */\n private async waitForInit(): Promise {\n if (!this.#isInitializing) return;\n return new Promise(resolve => {\n this.#initPromises.add(resolve);\n });\n }\n\n /**\n * Handle metric events — buffer for batch flush.\n */\n async onMetricEvent(event: MetricEvent): Promise {\n await this.waitForInit();\n if (!this.#observabilityStorage) return;\n\n this.#eventBuffer.addEvent(event);\n await this.handleBatchedFlush();\n }\n\n /**\n * Handle log events — buffer for batch flush.\n */\n async onLogEvent(event: LogEvent): Promise {\n await this.waitForInit();\n if (!this.#observabilityStorage) return;\n\n this.#eventBuffer.addEvent(event);\n await this.handleBatchedFlush();\n }\n\n /**\n * Handle score events — buffer for batch flush.\n */\n async onScoreEvent(event: ScoreEvent): Promise {\n await this.waitForInit();\n if (!this.#observabilityStorage) return;\n\n this.#eventBuffer.addEvent(event);\n await this.handleBatchedFlush();\n }\n\n /**\n * Handle feedback events — buffer for batch flush.\n */\n async onFeedbackEvent(event: FeedbackEvent): Promise {\n await this.waitForInit();\n if (!this.#observabilityStorage) return;\n\n this.#eventBuffer.addEvent(event);\n await this.handleBatchedFlush();\n }\n\n /**\n * Force flush any buffered spans without shutting down the exporter.\n * This is useful in serverless environments where you need to ensure spans\n * are exported before the runtime instance is terminated.\n */\n async flush(): Promise {\n if (this.#eventBuffer.totalSize > 0) {\n this.logger.debug('Flushing buffered events', {\n bufferedEvents: this.#eventBuffer.totalSize,\n });\n await this.flushBuffer();\n }\n }\n\n async shutdown(): Promise {\n // Clear any pending timer\n if (this.#flushTimer) {\n clearTimeout(this.#flushTimer);\n this.#flushTimer = undefined;\n }\n\n // Flush any remaining events\n await this.flush();\n\n this.logger.info('MastraStorageExporter shutdown complete');\n }\n}\n","/**\n * Test Exporter for Observability\n *\n * A full-featured exporter primarily designed for testing purposes that provides:\n * - In-memory event collection for ALL signals (Traces, Metrics, Logs, Scores, Feedback)\n * - File output support\n * - Span lifecycle tracking and validation\n * - Query methods for filtering spans by type, trace ID, span ID, etc.\n * - Query methods for filtering logs, metrics, scores, and feedback\n * - Statistics and analytics on all collected signals\n * - Internal metrics collection with summary on flush()\n */\n\n/**\n * Lazily compute the snapshots directory.\n * Node.js-only: uses dynamic imports so the module can be loaded in edge runtimes\n * without failing at import time.\n */\nlet _snapshotsDir: string | undefined;\nasync function getSnapshotsDir(): Promise {\n if (!_snapshotsDir) {\n if (typeof import.meta.url !== 'string') {\n throw new Error(\n 'Snapshot functionality requires a Node.js environment. ' + 'import.meta.url is not available in this runtime.',\n );\n }\n const { fileURLToPath } = await import('node:url');\n const { dirname, join } = await import('node:path');\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n _snapshotsDir = join(__dirname, '..', '__snapshots__');\n }\n return _snapshotsDir;\n}\n\nimport type {\n TracingEvent,\n TracingEventType,\n AnyExportedSpan,\n ExportedSpan,\n SpanType,\n LogEvent,\n MetricEvent,\n ScoreEvent,\n FeedbackEvent,\n ExportedLog,\n ExportedMetric,\n ExportedScore,\n ExportedFeedback,\n LogLevel,\n} from '@mastra/core/observability';\nimport { TracingEventType as EventType } from '@mastra/core/observability';\n\nimport { BaseExporter } from './base';\nimport type { BaseExporterConfig } from './base';\n\n/**\n * Span state tracking for lifecycle validation\n */\ninterface SpanState {\n /** Whether SPAN_STARTED was received */\n hasStart: boolean;\n /** Whether SPAN_ENDED was received */\n hasEnd: boolean;\n /** Whether SPAN_UPDATED was received */\n hasUpdate: boolean;\n /** All events for this span in order */\n events: TracingEvent[];\n /** Whether this is an event span (zero duration) */\n isEventSpan?: boolean;\n}\n\n/**\n * Statistics about all collected signals\n */\nexport interface TestExporterStats {\n /** Total number of tracing events collected */\n totalTracingEvents: number;\n /** Number of unique spans */\n totalSpans: number;\n /** Number of unique traces */\n totalTraces: number;\n /** Number of completed spans */\n completedSpans: number;\n /** Number of incomplete spans (started but not ended) */\n incompleteSpans: number;\n /** Breakdown by tracing event type */\n byEventType: {\n started: number;\n updated: number;\n ended: number;\n };\n /** Breakdown by span type */\n bySpanType: Record;\n /** Total number of log events collected */\n totalLogs: number;\n /** Breakdown of logs by level */\n logsByLevel: Record;\n /** Total number of metric events collected */\n totalMetrics: number;\n /** Breakdown of metrics by name */\n metricsByName: Record;\n /** Total number of score events collected */\n totalScores: number;\n /** Breakdown of scores by scorer name */\n scoresByScorer: Record;\n /** Total number of feedback events collected */\n totalFeedback: number;\n /** Breakdown of feedback by type */\n feedbackByType: Record;\n /** @deprecated Use totalTracingEvents instead */\n totalEvents: number;\n}\n\n/**\n * Internal metrics collected by the TestExporter while running.\n * Dumped as a summary on flush().\n */\nexport interface TestExporterInternalMetrics {\n /** Timestamp when the exporter was created */\n startedAt: Date;\n /** Timestamp of the last event received */\n lastEventAt: Date | null;\n /** Total events received across all signal types */\n totalEventsReceived: number;\n /** Breakdown by signal type */\n bySignal: {\n tracing: number;\n log: number;\n metric: number;\n score: number;\n feedback: number;\n };\n /** Number of flush() calls */\n flushCount: number;\n /** Total bytes of JSON output produced (estimated from toJSON) */\n estimatedJsonBytes: number;\n}\n\n/**\n * Span node in a tree structure with nested children\n */\nexport interface SpanTreeNode {\n /** The span data */\n span: AnyExportedSpan;\n /** Child spans nested under this span */\n children: SpanTreeNode[];\n}\n\n/**\n * Normalized span data for snapshot testing.\n * Dynamic fields (IDs, timestamps) are replaced with stable values.\n */\nexport interface NormalizedSpan {\n /** Stable ID like , */\n id: string;\n /** Normalized trace ID like , */\n traceId: string;\n /** Normalized parent ID, or undefined for root */\n parentId?: string;\n /** Span name */\n name: string;\n /** Span type */\n type: string;\n /** Entity type */\n entityType?: string;\n /** Entity ID */\n entityId?: string;\n /** Whether the span completed (had an endTime) */\n completed: boolean;\n /** Span attributes */\n attributes?: Record;\n /** Span metadata */\n metadata?: Record;\n /** Input data */\n input?: unknown;\n /** Output data */\n output?: unknown;\n /** Error info if span failed */\n errorInfo?: unknown;\n /** Is an event span */\n isEvent: boolean;\n /** Is root span */\n isRootSpan: boolean;\n /** Tags */\n tags?: string[];\n}\n\n/**\n * Normalized tree node for snapshot testing\n */\nexport interface NormalizedTreeNode {\n /** Normalized span data */\n span: NormalizedSpan;\n /** Child nodes (omitted if empty) */\n children?: NormalizedTreeNode[];\n}\n\n/**\n * Incomplete span information for debugging\n */\nexport interface IncompleteSpanInfo {\n spanId: string;\n span: AnyExportedSpan | undefined;\n state: {\n hasStart: boolean;\n hasUpdate: boolean;\n hasEnd: boolean;\n };\n}\n\n/**\n * Configuration for TestExporter\n */\nexport interface TestExporterConfig extends BaseExporterConfig {\n /**\n * Whether to validate span lifecycles in real-time.\n * When true, will log warnings for lifecycle violations.\n * @default true\n */\n validateLifecycle?: boolean;\n /**\n * Whether to store verbose logs for debugging.\n * @default true\n */\n storeLogs?: boolean;\n /**\n * Indentation for JSON output (number of spaces, or undefined for compact).\n * @default 2\n */\n jsonIndent?: number;\n /**\n * Whether to log a summary of internal metrics on flush().\n * @default true\n */\n logMetricsOnFlush?: boolean;\n}\n\n/**\n * Test Exporter for observability testing and debugging.\n *\n * Provides comprehensive in-memory event collection, querying, and JSON output\n * capabilities designed primarily for testing purposes but useful for debugging as well.\n *\n * @example\n * ```typescript\n * const exporter = new TestExporter();\n *\n * // Use with Mastra\n * const mastra = new Mastra({\n * observability: {\n * configs: {\n * test: {\n * serviceName: 'test',\n * exporters: [exporter],\n * },\n * },\n * },\n * });\n *\n * // Run some operations...\n *\n * // Query spans\n * const agentSpans = exporter.getSpansByType('agent_run');\n * const traceSpans = exporter.getByTraceId('abc123');\n *\n * // Get statistics\n * const stats = exporter.getStatistics();\n *\n * // Export to JSON\n * await exporter.writeToFile('./traces.json');\n * const jsonString = exporter.toJSON();\n * ```\n */\nexport class TestExporter extends BaseExporter {\n name = 'test-exporter';\n\n /** All collected tracing events */\n #tracingEvents: TracingEvent[] = [];\n\n /** Per-span state tracking */\n #spanStates = new Map();\n\n /** All collected log events */\n #logEvents: LogEvent[] = [];\n\n /** All collected metric events */\n #metricEvents: MetricEvent[] = [];\n\n /** All collected score events */\n #scoreEvents: ScoreEvent[] = [];\n\n /** All collected feedback events */\n #feedbackEvents: FeedbackEvent[] = [];\n\n /** Debug logs for the exporter itself */\n #debugLogs: string[] = [];\n\n /** Configuration */\n readonly #config: TestExporterConfig;\n\n /** Internal metrics tracking */\n #internalMetrics: {\n startedAt: Date;\n lastEventAt: Date | null;\n totalEventsReceived: number;\n bySignal: { tracing: number; log: number; metric: number; score: number; feedback: number };\n flushCount: number;\n };\n\n constructor(config: TestExporterConfig = {}) {\n super(config);\n this.#config = {\n validateLifecycle: true,\n storeLogs: true,\n jsonIndent: 2,\n logMetricsOnFlush: true,\n ...config,\n };\n this.#internalMetrics = {\n startedAt: new Date(),\n lastEventAt: null,\n totalEventsReceived: 0,\n bySignal: { tracing: 0, log: 0, metric: 0, score: 0, feedback: 0 },\n flushCount: 0,\n };\n }\n\n /**\n * Process incoming tracing events with lifecycle tracking\n */\n protected async _exportTracingEvent(event: TracingEvent): Promise {\n const span = event.exportedSpan;\n const spanId = span.id;\n\n // Track internal metrics\n this.#trackEvent('tracing');\n\n // Generate log message\n const logMessage = `[TestExporter] ${event.type}: ${span.type} \"${span.name}\" (entity: ${span.entityName ?? span.entityId ?? 'unknown'}, trace: ${span.traceId.slice(-8)}, span: ${spanId.slice(-8)})`;\n\n if (this.#config.storeLogs) {\n this.#debugLogs.push(logMessage);\n }\n\n // Get or create span state\n const state = this.#spanStates.get(spanId) || {\n hasStart: false,\n hasEnd: false,\n hasUpdate: false,\n events: [],\n };\n\n // Lifecycle validation\n if (this.#config.validateLifecycle) {\n this.#validateLifecycle(event, state, spanId);\n }\n\n // Update state based on event type\n if (event.type === EventType.SPAN_STARTED) {\n state.hasStart = true;\n } else if (event.type === EventType.SPAN_ENDED) {\n state.hasEnd = true;\n if (span.isEvent) {\n state.isEventSpan = true;\n }\n } else if (event.type === EventType.SPAN_UPDATED) {\n state.hasUpdate = true;\n }\n\n state.events.push(event);\n this.#spanStates.set(spanId, state);\n this.#tracingEvents.push(event);\n }\n\n // ============================================================================\n // Signal Handlers (Logs, Metrics, Scores, Feedback)\n // ============================================================================\n\n /**\n * Process incoming log events\n */\n async onLogEvent(event: LogEvent): Promise {\n this.#trackEvent('log');\n\n if (this.#config.storeLogs) {\n const log = event.log;\n const traceId = log.traceId;\n const logMessage = `[TestExporter] log.${log.level}: \"${log.message}\"${traceId ? ` (trace: ${traceId.slice(-8)})` : ''}`;\n this.#debugLogs.push(logMessage);\n }\n\n this.#logEvents.push(event);\n }\n\n /**\n * Process incoming metric events\n */\n async onMetricEvent(event: MetricEvent): Promise {\n this.#trackEvent('metric');\n\n if (this.#config.storeLogs) {\n const metric = event.metric;\n const labelsStr = Object.entries(metric.labels)\n .map(([k, v]) => `${k}=${v}`)\n .join(', ');\n const logMessage = `[TestExporter] metric: ${metric.name}=${metric.value}${labelsStr ? ` {${labelsStr}}` : ''}`;\n this.#debugLogs.push(logMessage);\n }\n\n this.#metricEvents.push(event);\n }\n\n /**\n * Process incoming score events\n */\n async onScoreEvent(event: ScoreEvent): Promise {\n this.#trackEvent('score');\n\n if (this.#config.storeLogs) {\n const score = event.score;\n const traceLabel = score.traceId ? score.traceId.slice(-8) : 'unanchored';\n const logMessage = `[TestExporter] score: ${score.scorerId}=${score.score} (trace: ${traceLabel}${score.spanId ? `, span: ${score.spanId.slice(-8)}` : ''})`;\n this.#debugLogs.push(logMessage);\n }\n\n this.#scoreEvents.push(event);\n }\n\n /**\n * Process incoming feedback events\n */\n async onFeedbackEvent(event: FeedbackEvent): Promise {\n this.#trackEvent('feedback');\n\n if (this.#config.storeLogs) {\n const fb = event.feedback;\n const traceLabel = fb.traceId ? fb.traceId.slice(-8) : 'unanchored';\n const feedbackSource = fb.feedbackSource ?? fb.source;\n const logMessage = `[TestExporter] feedback: ${fb.feedbackType} from ${feedbackSource}=${fb.value} (trace: ${traceLabel}${fb.spanId ? `, span: ${fb.spanId.slice(-8)}` : ''})`;\n this.#debugLogs.push(logMessage);\n }\n\n this.#feedbackEvents.push(event);\n }\n\n /**\n * Track an event for internal metrics\n */\n #trackEvent(signal: 'tracing' | 'log' | 'metric' | 'score' | 'feedback'): void {\n this.#internalMetrics.lastEventAt = new Date();\n this.#internalMetrics.totalEventsReceived++;\n this.#internalMetrics.bySignal[signal]++;\n }\n\n /**\n * Validate span lifecycle rules\n */\n #validateLifecycle(event: TracingEvent, state: SpanState, spanId: string): void {\n const span = event.exportedSpan;\n\n if (event.type === EventType.SPAN_STARTED) {\n if (state.hasStart) {\n this.logger.warn(`Span ${spanId} (${span.type} \"${span.name}\") started twice`);\n }\n } else if (event.type === EventType.SPAN_ENDED) {\n if (span.isEvent) {\n // Event spans should only emit SPAN_ENDED\n if (state.hasStart) {\n this.logger.warn(`Event span ${spanId} (${span.type} \"${span.name}\") incorrectly received SPAN_STARTED`);\n }\n if (state.hasUpdate) {\n this.logger.warn(`Event span ${spanId} (${span.type} \"${span.name}\") incorrectly received SPAN_UPDATED`);\n }\n } else {\n // Normal spans should have started before ending\n if (!state.hasStart) {\n this.logger.warn(`Normal span ${spanId} (${span.type} \"${span.name}\") ended without starting`);\n }\n }\n }\n }\n\n // ============================================================================\n // Tracing Query Methods\n // ============================================================================\n\n /**\n * Get all collected tracing events\n */\n get events(): TracingEvent[] {\n return [...this.#tracingEvents];\n }\n\n /**\n * Get completed spans by SpanType (e.g., 'agent_run', 'tool_call')\n *\n * @param type - The SpanType to filter by\n * @returns Array of completed exported spans of the specified type\n */\n getSpansByType(type: T): ExportedSpan[] {\n return Array.from(this.#spanStates.values())\n .filter(state => {\n if (!state.hasEnd) return false;\n const endEvent = state.events.find(e => e.type === EventType.SPAN_ENDED);\n return endEvent?.exportedSpan.type === type;\n })\n .map(state => {\n const endEvent = state.events.find(e => e.type === EventType.SPAN_ENDED);\n return endEvent?.exportedSpan;\n })\n .filter((span): span is ExportedSpan => span !== undefined);\n }\n\n /**\n * Get events by TracingEventType (SPAN_STARTED, SPAN_UPDATED, SPAN_ENDED)\n *\n * @param type - The TracingEventType to filter by\n * @returns Array of events of the specified type\n */\n getByEventType(type: TracingEventType): TracingEvent[] {\n return this.#tracingEvents.filter(e => e.type === type);\n }\n\n /**\n * Get all events and spans for a specific trace\n *\n * @param traceId - The trace ID to filter by\n * @returns Object containing tracing events, final spans, plus logs/scores/feedback for the trace\n */\n getByTraceId(traceId: string): {\n events: TracingEvent[];\n spans: AnyExportedSpan[];\n logs: ExportedLog[];\n scores: ExportedScore[];\n feedback: ExportedFeedback[];\n } {\n const events = this.#tracingEvents.filter(e => e.exportedSpan.traceId === traceId);\n const spans = this.#getUniqueSpansFromEvents(events);\n const logs = this.#logEvents.filter(e => e.log.traceId === traceId).map(e => e.log);\n const scores = this.#scoreEvents.filter(e => e.score.traceId === traceId).map(e => e.score);\n const feedback = this.#feedbackEvents.filter(e => e.feedback.traceId === traceId).map(e => e.feedback);\n return { events, spans, logs, scores, feedback };\n }\n\n /**\n * Get all events for a specific span\n *\n * @param spanId - The span ID to filter by\n * @returns Object containing events and final span state\n */\n getBySpanId(spanId: string): {\n events: TracingEvent[];\n span: AnyExportedSpan | undefined;\n state: SpanState | undefined;\n } {\n const state = this.#spanStates.get(spanId);\n if (!state) {\n return { events: [], span: undefined, state: undefined };\n }\n\n const endEvent = state.events.find(e => e.type === EventType.SPAN_ENDED);\n const span = endEvent?.exportedSpan ?? state.events[state.events.length - 1]?.exportedSpan;\n\n return { events: state.events, span, state };\n }\n\n /**\n * Get all unique spans (returns the final state of each span)\n */\n getAllSpans(): AnyExportedSpan[] {\n return Array.from(this.#spanStates.values())\n .map(state => {\n const endEvent = state.events.find(e => e.type === EventType.SPAN_ENDED);\n return endEvent?.exportedSpan ?? state.events[state.events.length - 1]?.exportedSpan;\n })\n .filter((span): span is AnyExportedSpan => span !== undefined);\n }\n\n /**\n * Get only completed spans (those that have received SPAN_ENDED)\n */\n getCompletedSpans(): AnyExportedSpan[] {\n return Array.from(this.#spanStates.values())\n .filter(state => state.hasEnd)\n .map(state => {\n const endEvent = state.events.find(e => e.type === EventType.SPAN_ENDED);\n return endEvent!.exportedSpan;\n });\n }\n\n /**\n * Get root spans only (spans with no parent)\n */\n getRootSpans(): AnyExportedSpan[] {\n return this.getAllSpans().filter(span => span.isRootSpan);\n }\n\n /**\n * Get incomplete spans (started but not yet ended)\n */\n getIncompleteSpans(): IncompleteSpanInfo[] {\n return Array.from(this.#spanStates.entries())\n .filter(([_, state]) => !state.hasEnd)\n .map(([spanId, state]) => ({\n spanId,\n span: state.events[0]?.exportedSpan,\n state: {\n hasStart: state.hasStart,\n hasUpdate: state.hasUpdate,\n hasEnd: state.hasEnd,\n },\n }));\n }\n\n /**\n * Get unique trace IDs from all collected signals\n */\n getTraceIds(): string[] {\n const traceIds = new Set();\n for (const event of this.#tracingEvents) {\n traceIds.add(event.exportedSpan.traceId);\n }\n for (const event of this.#logEvents) {\n if (event.log.traceId) traceIds.add(event.log.traceId);\n }\n for (const event of this.#scoreEvents) {\n if (event.score.traceId) {\n traceIds.add(event.score.traceId);\n }\n }\n for (const event of this.#feedbackEvents) {\n if (event.feedback.traceId) {\n traceIds.add(event.feedback.traceId);\n }\n }\n return Array.from(traceIds);\n }\n\n // ============================================================================\n // Log Query Methods\n // ============================================================================\n\n /**\n * Get all collected log events\n */\n getLogEvents(): LogEvent[] {\n return [...this.#logEvents];\n }\n\n /**\n * Get all collected logs (unwrapped from events)\n */\n getAllLogs(): ExportedLog[] {\n return this.#logEvents.map(e => e.log);\n }\n\n /**\n * Get logs filtered by level\n */\n getLogsByLevel(level: LogLevel): ExportedLog[] {\n return this.#logEvents.filter(e => e.log.level === level).map(e => e.log);\n }\n\n /**\n * Get logs for a specific trace\n */\n getLogsByTraceId(traceId: string): ExportedLog[] {\n return this.#logEvents.filter(e => e.log.traceId === traceId).map(e => e.log);\n }\n\n // ============================================================================\n // Metric Query Methods\n // ============================================================================\n\n /**\n * Get all collected metric events\n */\n getMetricEvents(): MetricEvent[] {\n return [...this.#metricEvents];\n }\n\n /**\n * Get all collected metrics (unwrapped from events)\n */\n getAllMetrics(): ExportedMetric[] {\n return this.#metricEvents.map(e => e.metric);\n }\n\n /**\n * Get metrics filtered by name\n */\n getMetricsByName(name: string): ExportedMetric[] {\n return this.#metricEvents.filter(e => e.metric.name === name).map(e => e.metric);\n }\n\n /**\n * @deprecated MetricType is no longer stored. Use getMetricsByName() instead.\n */\n getMetricsByType(_metricType: string): ExportedMetric[] {\n throw new Error(\n 'getMetricsByType() has been removed: metricType is no longer stored. ' +\n 'Use getMetricsByName(metricName) instead to filter metrics by name.',\n );\n }\n\n // ============================================================================\n // Score Query Methods\n // ============================================================================\n\n /**\n * Get all collected score events\n */\n getScoreEvents(): ScoreEvent[] {\n return [...this.#scoreEvents];\n }\n\n /**\n * Get all collected scores (unwrapped from events)\n */\n getAllScores(): ExportedScore[] {\n return this.#scoreEvents.map(e => e.score);\n }\n\n /**\n * Get scores filtered by scorer id\n */\n getScoresByScorer(scorerId: string): ExportedScore[] {\n return this.#scoreEvents.filter(e => e.score.scorerId === scorerId).map(e => e.score);\n }\n\n /**\n * Get scores for a specific trace\n */\n getScoresByTraceId(traceId: string): ExportedScore[] {\n return this.#scoreEvents.filter(e => e.score.traceId === traceId).map(e => e.score);\n }\n\n // ============================================================================\n // Feedback Query Methods\n // ============================================================================\n\n /**\n * Get all collected feedback events\n */\n getFeedbackEvents(): FeedbackEvent[] {\n return [...this.#feedbackEvents];\n }\n\n /**\n * Get all collected feedback (unwrapped from events)\n */\n getAllFeedback(): ExportedFeedback[] {\n return this.#feedbackEvents.map(e => e.feedback);\n }\n\n /**\n * Get feedback filtered by type\n */\n getFeedbackByType(feedbackType: string): ExportedFeedback[] {\n return this.#feedbackEvents.filter(e => e.feedback.feedbackType === feedbackType).map(e => e.feedback);\n }\n\n /**\n * Get feedback for a specific trace\n */\n getFeedbackByTraceId(traceId: string): ExportedFeedback[] {\n return this.#feedbackEvents.filter(e => e.feedback.traceId === traceId).map(e => e.feedback);\n }\n\n // ============================================================================\n // Statistics\n // ============================================================================\n\n /**\n * Get comprehensive statistics about all collected signals\n */\n getStatistics(): TestExporterStats {\n const bySpanType: Record = {};\n let completedSpans = 0;\n let incompleteSpans = 0;\n\n for (const state of this.#spanStates.values()) {\n if (state.hasEnd) {\n completedSpans++;\n const endEvent = state.events.find(e => e.type === EventType.SPAN_ENDED);\n const spanType = endEvent?.exportedSpan.type;\n if (spanType) {\n bySpanType[spanType] = (bySpanType[spanType] || 0) + 1;\n }\n } else {\n incompleteSpans++;\n }\n }\n\n // Log level breakdown\n const logsByLevel: Record = {};\n for (const event of this.#logEvents) {\n const level = event.log.level;\n logsByLevel[level] = (logsByLevel[level] || 0) + 1;\n }\n\n // Metric breakdowns\n const metricsByName: Record = {};\n for (const event of this.#metricEvents) {\n const mName = event.metric.name;\n metricsByName[mName] = (metricsByName[mName] || 0) + 1;\n }\n\n // Score breakdown by scorer\n const scoresByScorer: Record = {};\n for (const event of this.#scoreEvents) {\n const scorer = event.score.scorerId;\n scoresByScorer[scorer] = (scoresByScorer[scorer] || 0) + 1;\n }\n\n // Feedback breakdown by type\n const feedbackByType: Record = {};\n for (const event of this.#feedbackEvents) {\n const fbType = event.feedback.feedbackType;\n feedbackByType[fbType] = (feedbackByType[fbType] || 0) + 1;\n }\n\n return {\n totalTracingEvents: this.#tracingEvents.length,\n totalEvents: this.#tracingEvents.length, // deprecated alias\n totalSpans: this.#spanStates.size,\n totalTraces: this.getTraceIds().length,\n completedSpans,\n incompleteSpans,\n byEventType: {\n started: this.#tracingEvents.filter(e => e.type === EventType.SPAN_STARTED).length,\n updated: this.#tracingEvents.filter(e => e.type === EventType.SPAN_UPDATED).length,\n ended: this.#tracingEvents.filter(e => e.type === EventType.SPAN_ENDED).length,\n },\n bySpanType,\n totalLogs: this.#logEvents.length,\n logsByLevel,\n totalMetrics: this.#metricEvents.length,\n metricsByName,\n totalScores: this.#scoreEvents.length,\n scoresByScorer,\n totalFeedback: this.#feedbackEvents.length,\n feedbackByType,\n };\n }\n\n // ============================================================================\n // JSON Output\n // ============================================================================\n\n /**\n * Serialize all collected data to JSON string\n *\n * @param options - Serialization options\n * @returns JSON string of all collected data\n */\n toJSON(options?: { indent?: number; includeEvents?: boolean; includeStats?: boolean }): string {\n const indent = options?.indent ?? this.#config.jsonIndent;\n const includeEvents = options?.includeEvents ?? true;\n const includeStats = options?.includeStats ?? true;\n\n const data: Record = {\n spans: this.getAllSpans(),\n };\n\n // Include log/metric/score/feedback data\n if (this.#logEvents.length > 0) {\n data.logs = this.getAllLogs();\n }\n if (this.#metricEvents.length > 0) {\n data.metrics = this.getAllMetrics();\n }\n if (this.#scoreEvents.length > 0) {\n data.scores = this.getAllScores();\n }\n if (this.#feedbackEvents.length > 0) {\n data.feedback = this.getAllFeedback();\n }\n\n if (includeEvents) {\n data.events = this.#tracingEvents;\n }\n\n if (includeStats) {\n data.statistics = this.getStatistics();\n }\n\n return JSON.stringify(data, this.#jsonReplacer, indent);\n }\n\n /**\n * Build a tree structure from spans, nesting children under their parents\n *\n * @returns Array of root span tree nodes (spans with no parent)\n */\n buildSpanTree(): SpanTreeNode[] {\n const spans = this.getAllSpans();\n const nodeMap = new Map();\n const roots: SpanTreeNode[] = [];\n\n // First pass: create nodes for all spans\n for (const span of spans) {\n nodeMap.set(span.id, { span, children: [] });\n }\n\n // Second pass: build parent-child relationships\n for (const span of spans) {\n const node = nodeMap.get(span.id)!;\n if (span.parentSpanId && nodeMap.has(span.parentSpanId)) {\n // Has a parent in our collection - add as child\n nodeMap.get(span.parentSpanId)!.children.push(node);\n } else {\n // No parent or parent not in collection - this is a root\n roots.push(node);\n }\n }\n\n // Sort children by startTime for consistent ordering\n const sortChildren = (node: SpanTreeNode) => {\n node.children.sort((a, b) => new Date(a.span.startTime).getTime() - new Date(b.span.startTime).getTime());\n node.children.forEach(sortChildren);\n };\n roots.forEach(sortChildren);\n\n return roots;\n }\n\n /**\n * Serialize spans as a tree structure to JSON string\n *\n * @param options - Serialization options\n * @returns JSON string with spans nested in tree format\n */\n toTreeJSON(options?: { indent?: number; includeStats?: boolean }): string {\n const indent = options?.indent ?? this.#config.jsonIndent;\n const includeStats = options?.includeStats ?? true;\n\n const data: Record = {\n tree: this.buildSpanTree(),\n };\n\n if (includeStats) {\n data.statistics = this.getStatistics();\n }\n\n return JSON.stringify(data, this.#jsonReplacer, indent);\n }\n\n /**\n * Build a normalized tree structure suitable for snapshot testing.\n *\n * Normalizations applied:\n * - Span IDs replaced with stable placeholders (, , etc.)\n * - Trace IDs replaced with stable placeholders (, , etc.)\n * - parentSpanId replaced with normalized parent ID\n * - Timestamps replaced with durationMs (or null if not ended)\n * - Empty children arrays are omitted\n *\n * @returns Array of normalized root tree nodes\n */\n buildNormalizedTree(): NormalizedTreeNode[] {\n const tree = this.buildSpanTree();\n const spanIdMap = new Map();\n const traceIdMap = new Map();\n // Key-specific UUID maps: key -> (uuid -> placeholder)\n const uuidMapsByKey = new Map>();\n // Key-specific counters\n const uuidCountersByKey = new Map();\n let spanIdCounter = 1;\n let traceIdCounter = 1;\n\n // UUID regex pattern (8-4-4-4-12 hex chars)\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n // 32-character hex string (traceId format without hyphens)\n const hexId32Regex = /^[0-9a-f]{32}$/i;\n // Prefixed UUID pattern (e.g., mapping_, dowhile_) - for exact match\n const prefixedUuidRegex = /^([a-z_]+)_([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/i;\n // Prefixed UUID pattern for embedded matches — non-global for test(), global for replace()\n const embeddedPrefixedUuidTest = /([a-z_]+)_([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/i;\n const embeddedPrefixedUuidRegex = /([a-z_]+)_([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/gi;\n\n // Helper to normalize a UUID with key-specific placeholders\n const normalizeUuid = (uuid: string, key: string): string => {\n if (!uuidMapsByKey.has(key)) {\n uuidMapsByKey.set(key, new Map());\n uuidCountersByKey.set(key, 1);\n }\n const keyMap = uuidMapsByKey.get(key)!;\n if (!keyMap.has(uuid)) {\n const counter = uuidCountersByKey.get(key)!;\n keyMap.set(uuid, `<${key}-${counter}>`);\n uuidCountersByKey.set(key, counter + 1);\n }\n return keyMap.get(uuid)!;\n };\n\n // Helper to normalize a value, replacing UUIDs and Dates with stable placeholders\n // The key parameter is used to create key-specific UUID placeholders\n const normalizeValue = (value: unknown, key?: string): unknown => {\n // Handle Date objects - just indicate a date exists, don't track specific values\n if (value instanceof Date) {\n return '';\n }\n if (key === 'createdAt' && typeof value === 'number') {\n return '';\n }\n if (typeof value === 'string') {\n // Special handling for traceId - use the shared traceIdMap (handles both UUID and 32-char hex formats)\n if (key === 'traceId' && (uuidRegex.test(value) || hexId32Regex.test(value))) {\n if (!traceIdMap.has(value)) {\n traceIdMap.set(value, ``);\n }\n return traceIdMap.get(value)!;\n }\n // Check for pure UUID (exact match)\n if (uuidRegex.test(value)) {\n // Use key-specific placeholder if key is provided, otherwise generic 'uuid'\n return normalizeUuid(value, key ?? 'uuid');\n }\n // Check for prefixed UUID (e.g., mapping_) - exact match\n const prefixMatch = prefixedUuidRegex.exec(value);\n if (prefixMatch && prefixMatch[1] && prefixMatch[2]) {\n const prefix = prefixMatch[1];\n const uuid = prefixMatch[2];\n return `${prefix}_${normalizeUuid(uuid, prefix)}`;\n }\n // Check for embedded prefixed UUIDs (e.g., \"workflow step: 'mapping_'\")\n if (embeddedPrefixedUuidTest.test(value)) {\n return value.replace(embeddedPrefixedUuidRegex, (_match, prefix, uuid) => {\n return `${prefix}_${normalizeUuid(uuid, prefix)}`;\n });\n }\n }\n if (Array.isArray(value)) {\n return value.map(v => normalizeValue(v, key));\n }\n if (value && typeof value === 'object') {\n const normalized: Record = {};\n for (const [k, v] of Object.entries(value)) {\n if (key === 'providerOptions' && k === 'mastra' && v && typeof v === 'object') {\n const mastraOptions = v as Record;\n const remainingMastraOptions = Object.fromEntries(\n Object.entries(mastraOptions).filter(([mastraKey]) => mastraKey !== 'createdAt'),\n );\n if (Object.keys(remainingMastraOptions).length > 0) {\n normalized[k] = normalizeValue(remainingMastraOptions, k);\n }\n continue;\n }\n\n const normalizedValue = normalizeValue(v, k);\n if (normalizedValue !== undefined) {\n normalized[k] = normalizedValue;\n }\n }\n\n if (key === 'providerOptions' && Object.keys(normalized).length === 0) {\n return undefined;\n }\n\n return normalized;\n }\n return value;\n };\n\n // First pass: assign stable IDs in tree traversal order\n const assignIds = (nodes: SpanTreeNode[]) => {\n for (const node of nodes) {\n spanIdMap.set(node.span.id, ``);\n // Assign trace ID if not seen before\n if (!traceIdMap.has(node.span.traceId)) {\n traceIdMap.set(node.span.traceId, ``);\n }\n assignIds(node.children);\n }\n };\n assignIds(tree);\n\n // Second pass: build normalized tree\n const normalizeNode = (node: SpanTreeNode): NormalizedTreeNode => {\n const span = node.span;\n const completed = span.endTime !== undefined && span.endTime !== null;\n\n const normalizedSpan: NormalizedSpan = {\n id: spanIdMap.get(span.id)!,\n traceId: traceIdMap.get(span.traceId)!,\n name: normalizeValue(span.name, 'name') as string,\n type: span.type,\n completed,\n isEvent: span.isEvent,\n isRootSpan: span.isRootSpan,\n };\n\n // Only include optional fields if they have values\n if (span.parentSpanId && spanIdMap.has(span.parentSpanId)) {\n normalizedSpan.parentId = spanIdMap.get(span.parentSpanId);\n }\n if (span.entityType) {\n normalizedSpan.entityType = span.entityType;\n }\n if (span.entityId) {\n normalizedSpan.entityId = normalizeValue(span.entityId, 'entityId') as string;\n }\n if (span.attributes && Object.keys(span.attributes).length > 0) {\n normalizedSpan.attributes = normalizeValue(span.attributes) as Record;\n }\n if (span.metadata && Object.keys(span.metadata).length > 0) {\n normalizedSpan.metadata = normalizeValue(span.metadata) as Record;\n }\n if (span.input !== undefined) {\n normalizedSpan.input = normalizeValue(span.input);\n }\n if (span.output !== undefined) {\n normalizedSpan.output = normalizeValue(span.output);\n }\n if (span.errorInfo) {\n normalizedSpan.errorInfo = normalizeValue(span.errorInfo) as typeof span.errorInfo;\n }\n if (span.tags && span.tags.length > 0) {\n normalizedSpan.tags = span.tags;\n }\n\n const result: NormalizedTreeNode = { span: normalizedSpan };\n\n // Only include children if non-empty\n if (node.children.length > 0) {\n result.children = node.children.map(normalizeNode);\n }\n\n return result;\n };\n\n return tree.map(normalizeNode);\n }\n\n /**\n * Generate an ASCII tree structure graph for debugging.\n * Shows span type and name in a hierarchical format.\n *\n * @param nodes - Normalized tree nodes (defaults to current normalized tree)\n * @returns Array of strings representing the tree structure\n *\n * @example\n * ```\n * agent_run: \"agent run: 'test-agent'\"\n * ├── processor_run: \"input processor: validator\"\n * │ └── agent_run: \"agent run: 'validator-agent'\"\n * └── model_generation: \"llm: 'mock-model-id'\"\n * ```\n */\n generateStructureGraph(nodes?: NormalizedTreeNode[]): string[] {\n const tree = nodes ?? this.buildNormalizedTree();\n const lines: string[] = [];\n\n const buildLines = (node: NormalizedTreeNode, prefix: string, isLast: boolean, isRoot: boolean): void => {\n // Build the current line\n const connector = isRoot ? '' : isLast ? '└── ' : '├── ';\n const line = `${prefix}${connector}${node.span.type}: \"${node.span.name}\"`;\n lines.push(line);\n\n // Build lines for children\n const children = node.children ?? [];\n const childPrefix = isRoot ? '' : prefix + (isLast ? ' ' : '│ ');\n children.forEach((child, index) => {\n const childIsLast = index === children.length - 1;\n buildLines(child, childPrefix, childIsLast, false);\n });\n };\n\n // Process each root node\n tree.forEach((rootNode, index) => {\n if (index > 0) {\n lines.push(''); // Add blank line between multiple roots\n }\n buildLines(rootNode, '', true, true);\n });\n\n return lines;\n }\n\n /**\n * Serialize spans as a normalized tree structure for snapshot testing.\n * Includes a __structure__ field with an ASCII tree graph for readability.\n *\n * @param options - Serialization options\n * @returns JSON string with normalized spans in tree format\n */\n toNormalizedTreeJSON(options?: { indent?: number; includeStructure?: boolean }): string {\n const indent = options?.indent ?? this.#config.jsonIndent;\n const includeStructure = options?.includeStructure ?? true;\n const normalizedTree = this.buildNormalizedTree();\n\n if (includeStructure) {\n const structureGraph = this.generateStructureGraph(normalizedTree);\n const data = {\n __structure__: structureGraph,\n spans: normalizedTree,\n };\n return JSON.stringify(data, null, indent);\n }\n\n return JSON.stringify(normalizedTree, null, indent);\n }\n\n /**\n * Write collected data to a JSON file\n *\n * @param filePath - Path to write the JSON file\n * @param options - Serialization options\n */\n async writeToFile(\n filePath: string,\n options?: {\n indent?: number;\n includeEvents?: boolean;\n includeStats?: boolean;\n format?: 'flat' | 'tree' | 'normalized';\n },\n ): Promise {\n const format = options?.format ?? 'flat';\n let json: string;\n\n if (format === 'normalized') {\n json = this.toNormalizedTreeJSON({ indent: options?.indent });\n } else if (format === 'tree') {\n json = this.toTreeJSON({ indent: options?.indent, includeStats: options?.includeStats });\n } else {\n json = this.toJSON(options);\n }\n\n const { writeFile } = await import('node:fs/promises');\n await writeFile(filePath, json, 'utf-8');\n this.logger.info(`TestExporter: wrote ${this.#tracingEvents.length} tracing events to ${filePath}`);\n }\n\n /**\n * Assert that the current normalized tree matches a snapshot file.\n * Throws an error with a diff if they don't match.\n *\n * The snapshot format includes:\n * - `__structure__`: ASCII tree graph (compared first for quick validation)\n * - `spans`: The normalized span tree (detailed comparison)\n *\n * Supports special markers in the snapshot:\n * - `{\"__or__\": [\"value1\", \"value2\"]}` - matches if actual equals any listed value\n * - `{\"__any__\": \"string\"}` - matches any string value\n * - `{\"__any__\": \"number\"}` - matches any number value\n * - `{\"__any__\": \"boolean\"}` - matches any boolean value\n * - `{\"__any__\": \"object\"}` - matches any object value\n * - `{\"__any__\": \"array\"}` - matches any array value\n * - `{\"__any__\": true}` - matches any non-null/undefined value\n *\n * Environment variables:\n * Use `{ updateSnapshot: true }` option to update the snapshot instead of comparing\n *\n * @param snapshotName - Name of the snapshot file (resolved relative to __snapshots__ directory)\n * @param options - Options for snapshot comparison\n * @param options.updateSnapshot - If true, update the snapshot file instead of comparing\n * @throws Error if the snapshot doesn't match (and updateSnapshot is false)\n */\n async assertMatchesSnapshot(snapshotName: string, options?: { updateSnapshot?: boolean }): Promise {\n // Resolve snapshot path relative to the __snapshots__ directory\n const { join } = await import('node:path');\n const snapshotPath = join(await getSnapshotsDir(), snapshotName);\n const normalizedTree = this.buildNormalizedTree();\n const structureGraph = this.generateStructureGraph(normalizedTree);\n\n // Build current data with structure\n const currentData = {\n __structure__: structureGraph,\n spans: normalizedTree,\n };\n const currentJson = JSON.stringify(currentData, null, this.#config.jsonIndent);\n\n // Check option to update snapshot\n const shouldUpdate = options?.updateSnapshot;\n\n // If updating snapshot, write and return\n if (shouldUpdate) {\n const { writeFile } = await import('node:fs/promises');\n await writeFile(snapshotPath, currentJson, 'utf-8');\n this.logger.info(`TestExporter: updated snapshot ${snapshotPath}`);\n return;\n }\n\n let snapshotData: { __structure__?: string[]; spans?: unknown } | unknown[];\n let snapshotContent: string;\n try {\n const { readFile } = await import('node:fs/promises');\n snapshotContent = await readFile(snapshotPath, 'utf-8');\n } catch (err: unknown) {\n if (err && typeof err === 'object' && 'code' in err && (err as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new Error(\n `Snapshot file not found: ${snapshotPath}\\n` + `Run with { updateSnapshot: true } to create it.`,\n );\n }\n throw err;\n }\n try {\n snapshotData = JSON.parse(snapshotContent);\n } catch (err: unknown) {\n throw new Error(`Failed to parse snapshot ${snapshotPath}: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Handle both old format (array) and new format (object with __structure__ and spans)\n let expectedSpans: unknown;\n let expectedStructure: string[] | undefined;\n\n if (Array.isArray(snapshotData)) {\n // Old format: just the spans array\n expectedSpans = snapshotData;\n } else if (snapshotData && typeof snapshotData === 'object' && 'spans' in snapshotData) {\n // New format: { __structure__, spans }\n expectedSpans = snapshotData.spans;\n expectedStructure = snapshotData.__structure__;\n } else {\n throw new Error(\n `Invalid snapshot format in ${snapshotPath}.\\n` + `Expected an array or object with 'spans' property.`,\n );\n }\n\n // Compare structure first (quick validation)\n if (expectedStructure) {\n const structureMismatches = this.#compareStructure(structureGraph, expectedStructure);\n if (structureMismatches.length > 0) {\n throw new Error(\n `Structure mismatch in snapshot:\\n\\n` +\n `Expected:\\n${expectedStructure.join('\\n')}\\n\\n` +\n `Actual:\\n${structureGraph.join('\\n')}\\n\\n` +\n `Differences:\\n${structureMismatches.join('\\n')}\\n\\n` +\n `Snapshot: ${snapshotPath}\\n` +\n `Run with { updateSnapshot: true } to update.`,\n );\n }\n }\n\n // Deep compare spans\n const mismatches: { path: string; expected: unknown; actual: unknown }[] = [];\n this.#deepCompareWithMarkers(normalizedTree, expectedSpans, '$.spans', mismatches);\n\n if (mismatches.length > 0) {\n const mismatchDetails = mismatches\n .map(\n (m, i) =>\n `${i + 1}. ${m.path}\\n Expected: ${JSON.stringify(m.expected)}\\n Actual: ${JSON.stringify(m.actual)}`,\n )\n .join('\\n\\n');\n throw new Error(\n `Snapshot has ${mismatches.length} mismatch${mismatches.length > 1 ? 'es' : ''}:\\n\\n` +\n `${mismatchDetails}\\n\\n` +\n `Snapshot: ${snapshotPath}\\n` +\n `Run with { updateSnapshot: true } to update.`,\n );\n }\n }\n\n /**\n * Compare two structure graphs and return differences\n */\n #compareStructure(actual: string[], expected: string[]): string[] {\n const diffs: string[] = [];\n\n const maxLen = Math.max(actual.length, expected.length);\n for (let i = 0; i < maxLen; i++) {\n const actualLine = actual[i];\n const expectedLine = expected[i];\n\n if (actualLine !== expectedLine) {\n if (actualLine === undefined) {\n diffs.push(`Line ${i + 1}: Missing in actual`);\n diffs.push(` Expected: ${expectedLine}`);\n } else if (expectedLine === undefined) {\n diffs.push(`Line ${i + 1}: Extra in actual`);\n diffs.push(` Actual: ${actualLine}`);\n } else {\n diffs.push(`Line ${i + 1}:`);\n diffs.push(` Expected: ${expectedLine}`);\n diffs.push(` Actual: ${actualLine}`);\n }\n }\n }\n\n return diffs;\n }\n\n /**\n * Deep compare two values, supporting special markers like __or__ and __any__.\n * Collects all mismatches into the provided array.\n */\n #deepCompareWithMarkers(\n actual: unknown,\n expected: unknown,\n path: string,\n mismatches: { path: string; expected: unknown; actual: unknown }[],\n ): void {\n // Handle __or__ marker\n if (this.#isOrMarker(expected)) {\n const allowedValues = (expected as { __or__: unknown[] }).__or__;\n const matches = allowedValues.some(allowed => {\n const tempMismatches: { path: string; expected: unknown; actual: unknown }[] = [];\n this.#deepCompareWithMarkers(actual, allowed, path, tempMismatches);\n return tempMismatches.length === 0;\n });\n if (!matches) {\n mismatches.push({ path, expected: { __or__: allowedValues }, actual });\n }\n return;\n }\n\n // Handle __any__ marker\n if (this.#isAnyMarker(expected)) {\n const typeConstraint = (expected as { __any__: string | boolean }).__any__;\n\n // Check for null/undefined\n if (actual === null || actual === undefined) {\n mismatches.push({ path, expected: { __any__: typeConstraint }, actual });\n return;\n }\n\n // If typeConstraint is true, any non-null value matches\n if (typeConstraint === true) {\n return;\n }\n\n // Check type constraint\n const actualType = Array.isArray(actual) ? 'array' : typeof actual;\n if (actualType !== typeConstraint) {\n mismatches.push({\n path,\n expected: { __any__: typeConstraint },\n actual: `(${actualType}) ${JSON.stringify(actual).slice(0, 50)}...`,\n });\n }\n return;\n }\n\n // Handle arrays\n if (Array.isArray(expected)) {\n if (!Array.isArray(actual)) {\n mismatches.push({ path, expected, actual });\n return;\n }\n if (actual.length !== expected.length) {\n mismatches.push({ path: `${path}.length`, expected: expected.length, actual: actual.length });\n return;\n }\n for (let i = 0; i < expected.length; i++) {\n this.#deepCompareWithMarkers(actual[i], expected[i], `${path}[${i}]`, mismatches);\n }\n return;\n }\n\n // Handle objects\n if (expected !== null && typeof expected === 'object') {\n if (actual === null || typeof actual !== 'object' || Array.isArray(actual)) {\n mismatches.push({ path, expected, actual });\n return;\n }\n const expectedObj = expected as Record;\n const actualObj = actual as Record;\n\n // Check all expected keys exist and match (skip metadata keys like __placeholder__)\n for (const key of Object.keys(expectedObj)) {\n // Skip metadata keys (e.g., __placeholder__, __structure__)\n if (this.#isMetadataKey(key)) {\n continue;\n }\n if (!(key in actualObj)) {\n // Only report if expected value is not undefined\n if (expectedObj[key] !== undefined) {\n mismatches.push({ path: `${path}.${key}`, expected: expectedObj[key], actual: undefined });\n }\n continue;\n }\n this.#deepCompareWithMarkers(actualObj[key], expectedObj[key], `${path}.${key}`, mismatches);\n }\n\n // Check for extra keys in actual (skip metadata keys)\n for (const key of Object.keys(actualObj)) {\n if (this.#isMetadataKey(key)) {\n continue;\n }\n if (!(key in expectedObj)) {\n // Only report if actual value is not undefined\n if (actualObj[key] !== undefined) {\n mismatches.push({ path: `${path}.${key}`, expected: undefined, actual: actualObj[key] });\n }\n }\n }\n return;\n }\n\n // Handle primitives\n if (actual !== expected) {\n mismatches.push({ path, expected, actual });\n }\n }\n\n /**\n * Check if a value is an __or__ marker object\n */\n #isOrMarker(value: unknown): boolean {\n return (\n value !== null &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n '__or__' in value &&\n Array.isArray((value as { __or__: unknown }).__or__)\n );\n }\n\n /**\n * Check if a value is an __any__ marker object\n */\n #isAnyMarker(value: unknown): boolean {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n return false;\n }\n if (!('__any__' in value)) {\n return false;\n }\n const constraint = (value as { __any__: unknown }).__any__;\n // Valid constraints: true, or type strings\n return constraint === true || ['string', 'number', 'boolean', 'object', 'array'].includes(constraint as string);\n }\n\n /**\n * Check if a key should be skipped during comparison (metadata keys like __structure__)\n */\n #isMetadataKey(key: string): boolean {\n return key.startsWith('__') && key.endsWith('__');\n }\n\n /**\n * Custom JSON replacer to handle Date objects and other special types\n */\n #jsonReplacer = (_key: string, value: unknown): unknown => {\n if (value instanceof Date) {\n return value.toISOString();\n }\n return value;\n };\n\n // ============================================================================\n // Debugging Helpers\n // ============================================================================\n\n /**\n * Get all stored debug logs (internal exporter logging, not signal logs)\n */\n getLogs(): string[] {\n return [...this.#debugLogs];\n }\n\n /**\n * Dump debug logs to console for debugging (uses console.error for visibility in test output)\n */\n dumpLogs(): void {\n console.error('\\n=== TestExporter Logs ===');\n this.#debugLogs.forEach(log => {\n console.error(log);\n });\n console.error('=== End Logs ===\\n');\n }\n\n /**\n * Validate final state - useful for test assertions\n *\n * @returns Object with validation results\n */\n validateFinalState(): {\n valid: boolean;\n singleTraceId: boolean;\n allSpansComplete: boolean;\n traceIds: string[];\n incompleteSpans: IncompleteSpanInfo[];\n } {\n const traceIds = this.getTraceIds();\n const incompleteSpans = this.getIncompleteSpans();\n\n const singleTraceId = traceIds.length === 1;\n const allSpansComplete = incompleteSpans.length === 0;\n\n return {\n valid: singleTraceId && allSpansComplete,\n singleTraceId,\n allSpansComplete,\n traceIds,\n incompleteSpans,\n };\n }\n\n // ============================================================================\n // Reset & Lifecycle\n // ============================================================================\n\n /**\n * Clear all collected events and state across all signals\n */\n clearEvents(): void {\n this.#tracingEvents = [];\n this.#spanStates.clear();\n this.#logEvents = [];\n this.#metricEvents = [];\n this.#scoreEvents = [];\n this.#feedbackEvents = [];\n this.#debugLogs = [];\n // Note: #internalMetrics is intentionally NOT reset here —\n // it tracks cumulative lifetime stats across clearEvents/reset calls.\n }\n\n /**\n * Alias for clearEvents (compatibility with TestExporter)\n */\n reset(): void {\n this.clearEvents();\n }\n\n /**\n * Get internal metrics about the exporter's own activity.\n */\n getInternalMetrics(): TestExporterInternalMetrics {\n const json = this.toJSON({ includeEvents: false, includeStats: false });\n return {\n startedAt: this.#internalMetrics.startedAt,\n lastEventAt: this.#internalMetrics.lastEventAt,\n totalEventsReceived: this.#internalMetrics.totalEventsReceived,\n bySignal: { ...this.#internalMetrics.bySignal },\n flushCount: this.#internalMetrics.flushCount,\n estimatedJsonBytes: new TextEncoder().encode(json).byteLength,\n };\n }\n\n /**\n * Flush buffered data and log internal metrics summary.\n */\n async flush(): Promise {\n this.#internalMetrics.flushCount++;\n\n if (this.#config.logMetricsOnFlush) {\n const metrics = this.getInternalMetrics();\n const uptimeMs = Date.now() - metrics.startedAt.getTime();\n const summary = [\n `[TestExporter] flush #${metrics.flushCount} summary:`,\n ` uptime: ${(uptimeMs / 1000).toFixed(1)}s`,\n ` total events received: ${metrics.totalEventsReceived}`,\n ` by signal: tracing=${metrics.bySignal.tracing}, log=${metrics.bySignal.log}, metric=${metrics.bySignal.metric}, score=${metrics.bySignal.score}, feedback=${metrics.bySignal.feedback}`,\n ` buffered: spans=${this.#spanStates.size}, logs=${this.#logEvents.length}, metrics=${this.#metricEvents.length}, scores=${this.#scoreEvents.length}, feedback=${this.#feedbackEvents.length}`,\n ` estimated JSON size: ${(metrics.estimatedJsonBytes / 1024).toFixed(1)}KB`,\n ].join('\\n');\n this.logger.info(summary);\n }\n }\n\n async shutdown(): Promise {\n await this.flush();\n this.logger.info('TestExporter shutdown');\n }\n\n // ============================================================================\n // Private Helpers\n // ============================================================================\n\n /**\n * Extract unique spans from a list of events\n */\n #getUniqueSpansFromEvents(events: TracingEvent[]): AnyExportedSpan[] {\n const spanMap = new Map();\n\n for (const event of events) {\n const span = event.exportedSpan;\n // Prefer SPAN_ENDED events as they contain the final state\n if (event.type === EventType.SPAN_ENDED || !spanMap.has(span.id)) {\n spanMap.set(span.id, span);\n }\n }\n\n return Array.from(spanMap.values());\n }\n}\n\n// ============================================================================\n// Deprecated Aliases\n// ============================================================================\n\n/**\n * @deprecated Use `TestExporter` instead. This alias will be removed in a future version.\n */\nexport const JsonExporter = TestExporter;\n/**\n * @deprecated Use `TestExporter` instead. This is a type alias for backward compatibility.\n */\nexport type JsonExporter = TestExporter;\n\n/**\n * @deprecated Use `TestExporterConfig` instead.\n */\nexport type JsonExporterConfig = TestExporterConfig;\n\n/**\n * @deprecated Use `TestExporterStats` instead.\n */\nexport type JsonExporterStats = TestExporterStats;\n\n/**\n * @deprecated Use `TestExporterInternalMetrics` instead.\n */\nexport type JsonExporterInternalMetrics = TestExporterInternalMetrics;\n","import type { SpanType, Span, CreateSpanOptions } from '@mastra/core/observability';\nimport type { ObservabilityInstanceConfig } from '../config';\nimport { DefaultSpan } from '../spans';\nimport { BaseObservabilityInstance } from './base';\n\nexport class DefaultObservabilityInstance extends BaseObservabilityInstance {\n constructor(config: ObservabilityInstanceConfig) {\n super(config);\n }\n\n protected createSpan(options: CreateSpanOptions): Span {\n // Simple span creation - base class handles all tracing lifecycle automatically\n return new DefaultSpan(options, this);\n }\n}\n","import { generateSignalId } from '@mastra/core/observability';\nimport type {\n AnyRecordedSpan,\n CorrelationContext,\n FeedbackEvent,\n FeedbackInput,\n RecordedSpan,\n RecordedTrace,\n ScoreEvent,\n ScoreInput,\n SpanType,\n SpanTypeMap,\n} from '@mastra/core/observability';\nimport type { GetTraceResponse, SpanRecord } from '@mastra/core/storage';\n\ntype RecordedAnnotationEvent = ScoreEvent | FeedbackEvent;\ntype EmitRecordedEvent = (event: RecordedAnnotationEvent) => void | Promise;\ntype CanEmitRecordedEvent = () => boolean;\ntype DebugRecordedAnnotationUnavailable = (args: {\n kind: 'score' | 'feedback';\n traceId: string;\n spanId?: string;\n}) => void;\ntype RecordedErrorInfo = AnyRecordedSpan['errorInfo'];\ntype CorrelationParent = Pick | AnyRecordedSpan | undefined;\n\nfunction nullToUndefined(value: T | null | undefined): T | undefined {\n return value ?? undefined;\n}\n\nfunction mergeMetadata(\n base: Record | null | undefined,\n extra: Record | undefined,\n): Record | undefined {\n if (!base && !extra) return undefined;\n return {\n ...(base ?? {}),\n ...(extra ?? {}),\n };\n}\n\nfunction normalizeErrorInfo(error: SpanRecord['error']): RecordedErrorInfo {\n if (!error || typeof error !== 'object' || !('message' in error) || typeof error.message !== 'string') {\n return undefined;\n }\n\n return {\n message: error.message,\n id: 'id' in error && typeof error.id === 'string' ? error.id : undefined,\n name: 'name' in error && typeof error.name === 'string' ? error.name : undefined,\n stack: 'stack' in error && typeof error.stack === 'string' ? error.stack : undefined,\n domain: 'domain' in error && typeof error.domain === 'string' ? error.domain : undefined,\n category: 'category' in error && typeof error.category === 'string' ? error.category : undefined,\n details:\n 'details' in error && error.details && typeof error.details === 'object'\n ? (error.details as Record)\n : undefined,\n };\n}\n\nfunction buildCorrelationContext(\n span: SpanRecord,\n rootSpan: SpanRecord,\n parent?: CorrelationParent,\n): CorrelationContext {\n return {\n tags: rootSpan.tags ?? undefined,\n entityType: nullToUndefined(span.entityType),\n entityId: nullToUndefined(span.entityId),\n entityName: nullToUndefined(span.entityName),\n parentEntityType: parent?.entityType ?? undefined,\n parentEntityId: parent?.entityId ?? undefined,\n parentEntityName: parent?.entityName ?? undefined,\n rootEntityType: nullToUndefined(rootSpan.entityType),\n rootEntityId: nullToUndefined(rootSpan.entityId),\n rootEntityName: nullToUndefined(rootSpan.entityName),\n userId: nullToUndefined(span.userId),\n organizationId: nullToUndefined(span.organizationId),\n resourceId: nullToUndefined(span.resourceId),\n runId: nullToUndefined(span.runId),\n sessionId: nullToUndefined(span.sessionId),\n threadId: nullToUndefined(span.threadId),\n requestId: nullToUndefined(span.requestId),\n environment: nullToUndefined(span.environment),\n source: nullToUndefined(span.source),\n serviceName: nullToUndefined(span.serviceName),\n experimentId: nullToUndefined(span.experimentId),\n };\n}\n\nexport function buildScoreEvent(args: {\n traceId?: string;\n spanId?: string;\n correlationContext?: CorrelationContext;\n score: ScoreInput;\n inheritedMetadata?: Record | null;\n}): ScoreEvent {\n const { traceId, spanId, correlationContext, score, inheritedMetadata } = args;\n\n return {\n type: 'score',\n score: {\n scoreId: generateSignalId(),\n timestamp: new Date(),\n traceId,\n spanId,\n scorerId: score.scorerId,\n scorerName: score.scorerName,\n scorerVersion: score.scorerVersion,\n source: score.source,\n scoreSource: score.scoreSource,\n score: score.score,\n reason: score.reason,\n experimentId: score.experimentId,\n scoreTraceId: score.scoreTraceId,\n targetEntityType: score.targetEntityType,\n correlationContext,\n metadata: mergeMetadata(inheritedMetadata, score.metadata),\n },\n };\n}\n\nexport function buildFeedbackEvent(args: {\n traceId?: string;\n spanId?: string;\n correlationContext?: CorrelationContext;\n feedback: FeedbackInput;\n inheritedMetadata?: Record | null;\n}): FeedbackEvent {\n const { traceId, spanId, correlationContext, feedback, inheritedMetadata } = args;\n\n return {\n type: 'feedback',\n feedback: {\n feedbackId: generateSignalId(),\n timestamp: new Date(),\n traceId,\n spanId,\n source: feedback.source,\n feedbackSource: feedback.feedbackSource,\n feedbackType: feedback.feedbackType,\n value: feedback.value,\n userId: feedback.userId,\n feedbackUserId: feedback.feedbackUserId,\n comment: feedback.comment,\n sourceId: feedback.sourceId,\n experimentId: feedback.experimentId,\n correlationContext,\n metadata: mergeMetadata(inheritedMetadata, feedback.metadata),\n },\n };\n}\n\nfunction findSpanById(spans: SpanRecord[], spanId: string | undefined): SpanRecord | undefined {\n if (!spanId) return undefined;\n return spans.find(span => span.spanId === spanId);\n}\n\nexport function buildRecordedScoreEventFromTrace(args: {\n trace: GetTraceResponse;\n score: ScoreInput;\n spanId?: string;\n}): ScoreEvent | null {\n const rootSpan = findRootSpan(args.trace.spans);\n if (!rootSpan) return null;\n\n const span = args.spanId ? findSpanById(args.trace.spans, args.spanId) : rootSpan;\n if (!span) return null;\n\n const parent = span.parentSpanId ? findSpanById(args.trace.spans, span.parentSpanId) : undefined;\n\n return buildScoreEvent({\n traceId: span.traceId,\n spanId: args.spanId,\n correlationContext: buildCorrelationContext(span, rootSpan, parent),\n score: args.score,\n inheritedMetadata: span.metadata,\n });\n}\n\nexport function buildRecordedFeedbackEventFromTrace(args: {\n trace: GetTraceResponse;\n feedback: FeedbackInput;\n spanId?: string;\n}): FeedbackEvent | null {\n const rootSpan = findRootSpan(args.trace.spans);\n if (!rootSpan) return null;\n\n const span = args.spanId ? findSpanById(args.trace.spans, args.spanId) : rootSpan;\n if (!span) return null;\n\n const parent = span.parentSpanId ? findSpanById(args.trace.spans, span.parentSpanId) : undefined;\n\n return buildFeedbackEvent({\n traceId: span.traceId,\n spanId: args.spanId,\n correlationContext: buildCorrelationContext(span, rootSpan, parent),\n feedback: args.feedback,\n inheritedMetadata: span.metadata,\n });\n}\n\nclass RecordedSpanImpl implements RecordedSpan {\n public readonly id: string;\n public readonly traceId: string;\n public readonly name: string;\n public readonly type: TType;\n public readonly entityType?: RecordedSpan['entityType'];\n public readonly entityId?: string;\n public readonly entityName?: string;\n public readonly startTime: Date;\n public readonly endTime?: Date;\n public readonly attributes?: SpanTypeMap[TType];\n public readonly metadata?: Record;\n public readonly tags?: string[];\n public readonly input?: any;\n public readonly output?: any;\n public readonly errorInfo?: {\n message: string;\n id?: string;\n name?: string;\n stack?: string;\n domain?: string;\n category?: string;\n details?: Record;\n };\n public readonly requestContext?: Record;\n public readonly isEvent: boolean;\n public readonly isRootSpan: boolean;\n public readonly parentSpanId?: string;\n public parent?: RecordedSpanImpl;\n public readonly children: RecordedSpanImpl[] = [];\n\n readonly #raw: SpanRecord;\n readonly #rootSpan: SpanRecord;\n readonly #emitRecordedEvent: EmitRecordedEvent;\n readonly #canEmitRecordedEvent: CanEmitRecordedEvent;\n readonly #debugRecordedAnnotationUnavailable: DebugRecordedAnnotationUnavailable;\n\n constructor(args: {\n raw: SpanRecord;\n rootSpan: SpanRecord;\n emitRecordedEvent: EmitRecordedEvent;\n canEmitRecordedEvent: CanEmitRecordedEvent;\n debugRecordedAnnotationUnavailable: DebugRecordedAnnotationUnavailable;\n }) {\n const { raw, rootSpan, emitRecordedEvent, canEmitRecordedEvent, debugRecordedAnnotationUnavailable } = args;\n\n this.#raw = raw;\n this.#rootSpan = rootSpan;\n this.#emitRecordedEvent = emitRecordedEvent;\n this.#canEmitRecordedEvent = canEmitRecordedEvent;\n this.#debugRecordedAnnotationUnavailable = debugRecordedAnnotationUnavailable;\n\n this.id = raw.spanId;\n this.traceId = raw.traceId;\n this.name = raw.name;\n this.type = raw.spanType as TType;\n this.entityType = raw.entityType ?? undefined;\n this.entityId = raw.entityId ?? undefined;\n this.entityName = raw.entityName ?? undefined;\n this.startTime = raw.startedAt;\n this.endTime = raw.endedAt ?? undefined;\n this.attributes = (raw.attributes ?? undefined) as SpanTypeMap[TType] | undefined;\n this.metadata = raw.metadata ?? undefined;\n this.tags = raw.tags ?? undefined;\n this.input = raw.input ?? undefined;\n this.output = raw.output ?? undefined;\n this.errorInfo = normalizeErrorInfo(raw.error);\n this.requestContext = raw.requestContext ?? undefined;\n this.isEvent = raw.isEvent;\n this.isRootSpan = !raw.parentSpanId;\n this.parentSpanId = raw.parentSpanId ?? undefined;\n }\n\n async addScore(score: ScoreInput): Promise {\n if (!this.#canEmitRecordedEvent()) {\n this.#debugRecordedAnnotationUnavailable({ kind: 'score', traceId: this.traceId, spanId: this.id });\n return;\n }\n\n await this.#emitRecordedEvent(\n buildScoreEvent({\n traceId: this.#raw.traceId,\n spanId: this.id,\n correlationContext: buildCorrelationContext(this.#raw, this.#rootSpan, this.parent),\n score,\n inheritedMetadata: this.#raw.metadata,\n }),\n );\n }\n\n async addFeedback(feedback: FeedbackInput): Promise {\n if (!this.#canEmitRecordedEvent()) {\n this.#debugRecordedAnnotationUnavailable({ kind: 'feedback', traceId: this.traceId, spanId: this.id });\n return;\n }\n\n await this.#emitRecordedEvent(\n buildFeedbackEvent({\n traceId: this.#raw.traceId,\n spanId: this.id,\n correlationContext: buildCorrelationContext(this.#raw, this.#rootSpan, this.parent),\n feedback,\n inheritedMetadata: this.#raw.metadata,\n }),\n );\n }\n}\n\nclass RecordedTraceImpl implements RecordedTrace {\n public readonly traceId: string;\n public readonly rootSpan: AnyRecordedSpan;\n public readonly spans: ReadonlyArray;\n\n readonly #rootRecord: SpanRecord;\n readonly #emitRecordedEvent: EmitRecordedEvent;\n readonly #spanMap: Map;\n readonly #canEmitRecordedEvent: CanEmitRecordedEvent;\n readonly #debugRecordedAnnotationUnavailable: DebugRecordedAnnotationUnavailable;\n\n constructor(args: {\n traceId: string;\n rootSpan: AnyRecordedSpan;\n rootRecord: SpanRecord;\n spans: AnyRecordedSpan[];\n emitRecordedEvent: EmitRecordedEvent;\n canEmitRecordedEvent: CanEmitRecordedEvent;\n debugRecordedAnnotationUnavailable: DebugRecordedAnnotationUnavailable;\n }) {\n this.traceId = args.traceId;\n this.rootSpan = args.rootSpan;\n this.#rootRecord = args.rootRecord;\n this.spans = args.spans;\n this.#emitRecordedEvent = args.emitRecordedEvent;\n this.#spanMap = new Map(args.spans.map(span => [span.id, span]));\n this.#canEmitRecordedEvent = args.canEmitRecordedEvent;\n this.#debugRecordedAnnotationUnavailable = args.debugRecordedAnnotationUnavailable;\n }\n\n getSpan(spanId: string): AnyRecordedSpan | null {\n return this.#spanMap.get(spanId) ?? null;\n }\n\n async addScore(score: ScoreInput): Promise {\n if (!this.#canEmitRecordedEvent()) {\n this.#debugRecordedAnnotationUnavailable({ kind: 'score', traceId: this.traceId });\n return;\n }\n\n await this.#emitRecordedEvent(\n buildScoreEvent({\n traceId: this.#rootRecord.traceId,\n correlationContext: buildCorrelationContext(this.#rootRecord, this.#rootRecord),\n score,\n inheritedMetadata: this.#rootRecord.metadata,\n }),\n );\n }\n\n async addFeedback(feedback: FeedbackInput): Promise {\n if (!this.#canEmitRecordedEvent()) {\n this.#debugRecordedAnnotationUnavailable({ kind: 'feedback', traceId: this.traceId });\n return;\n }\n\n await this.#emitRecordedEvent(\n buildFeedbackEvent({\n traceId: this.#rootRecord.traceId,\n correlationContext: buildCorrelationContext(this.#rootRecord, this.#rootRecord),\n feedback,\n inheritedMetadata: this.#rootRecord.metadata,\n }),\n );\n }\n}\n\nfunction findRootSpan(spans: SpanRecord[]): SpanRecord | undefined {\n const spanIds = new Set(spans.map(span => span.spanId));\n return spans.find(span => !span.parentSpanId || !spanIds.has(span.parentSpanId)) ?? spans[0];\n}\n\nexport function hydrateRecordedTrace(args: {\n trace: GetTraceResponse;\n emitRecordedEvent: EmitRecordedEvent;\n canEmitRecordedEvent?: CanEmitRecordedEvent;\n debugRecordedAnnotationUnavailable?: DebugRecordedAnnotationUnavailable;\n}): RecordedTrace | null {\n const {\n trace,\n emitRecordedEvent,\n canEmitRecordedEvent = () => true,\n debugRecordedAnnotationUnavailable = () => {},\n } = args;\n const rootSpan = findRootSpan(trace.spans);\n\n if (!rootSpan) {\n return null;\n }\n\n const recordedSpans = trace.spans.map(\n raw =>\n new RecordedSpanImpl({\n raw,\n rootSpan,\n emitRecordedEvent,\n canEmitRecordedEvent,\n debugRecordedAnnotationUnavailable,\n }),\n );\n const spanMap = new Map(recordedSpans.map(span => [span.id, span]));\n\n for (const span of recordedSpans) {\n if (!span.parentSpanId) continue;\n const parent = spanMap.get(span.parentSpanId);\n if (!parent) continue;\n\n span.parent = parent;\n parent.children.push(span);\n }\n\n const hydratedRootSpan = spanMap.get(rootSpan.spanId);\n if (!hydratedRootSpan) {\n return null;\n }\n\n return new RecordedTraceImpl({\n traceId: trace.traceId,\n rootSpan: hydratedRootSpan,\n rootRecord: rootSpan,\n spans: recordedSpans,\n emitRecordedEvent,\n canEmitRecordedEvent,\n debugRecordedAnnotationUnavailable,\n });\n}\n","/**\n * Observability Registry for Mastra\n *\n * Provides registry for Observability instances.\n */\n\nimport type { ObservabilityInstance, ConfigSelectorOptions, ConfigSelector } from '@mastra/core/observability';\n\n// ============================================================================\n// Observability Registry\n// ============================================================================\n\n/**\n * Registry for Observability instances.\n */\nexport class ObservabilityRegistry {\n #instances = new Map();\n #defaultInstance?: ObservabilityInstance;\n #configSelector?: ConfigSelector;\n\n /**\n * Register a tracing instance\n */\n register(name: string, instance: ObservabilityInstance, isDefault = false): void {\n if (this.#instances.has(name)) {\n throw new Error(`Tracing instance '${name}' already registered`);\n }\n\n this.#instances.set(name, instance);\n\n // Set as default if explicitly marked or if it's the first instance\n if (isDefault || !this.#defaultInstance) {\n this.#defaultInstance = instance;\n }\n }\n\n /**\n * Get a tracing instance by name\n */\n get(name: string): ObservabilityInstance | undefined {\n return this.#instances.get(name);\n }\n\n /**\n * Get the default tracing instance\n */\n getDefault(): ObservabilityInstance | undefined {\n return this.#defaultInstance;\n }\n\n /**\n * Set the tracing selector function\n */\n setSelector(selector: ConfigSelector): void {\n this.#configSelector = selector;\n }\n\n /**\n * Get the selected tracing instance based on context\n */\n getSelected(options: ConfigSelectorOptions): ObservabilityInstance | undefined {\n // 1. Try selector function if provided\n if (this.#configSelector) {\n const selected = this.#configSelector(options, this.#instances);\n if (selected && this.#instances.has(selected)) {\n return this.#instances.get(selected);\n }\n }\n\n // 2. Fall back to default\n return this.#defaultInstance;\n }\n\n /**\n * Unregister a tracing instance\n */\n unregister(name: string): boolean {\n const instance = this.#instances.get(name);\n const deleted = this.#instances.delete(name);\n\n if (deleted && instance === this.#defaultInstance) {\n const next = this.#instances.values().next();\n this.#defaultInstance = next.done ? undefined : next.value;\n }\n\n return deleted;\n }\n\n /**\n * Shutdown all instances and clear the registry\n */\n async shutdown(): Promise {\n const shutdownPromises = Array.from(this.#instances.values()).map(instance => instance.shutdown());\n\n await Promise.allSettled(shutdownPromises);\n this.#instances.clear();\n this.#instances.clear();\n this.#defaultInstance = undefined;\n this.#configSelector = undefined;\n }\n\n /**\n * Clear all instances without shutdown\n */\n clear(): void {\n this.#instances.clear();\n this.#defaultInstance = undefined;\n this.#configSelector = undefined;\n }\n\n /**\n * list all registered instances\n */\n list(): ReadonlyMap {\n return new Map(this.#instances);\n }\n}\n","import type { SpanOutputProcessor, AnySpan } from '@mastra/core/observability';\n\nexport type RedactionStyle = 'full' | 'partial';\n\n/**\n * Options for configuring the SensitiveDataFilter.\n */\nexport interface SensitiveDataFilterOptions {\n /**\n * List of sensitive field names to redact.\n * Matching is case-insensitive and normalizes separators (`api-key`, `api_key`, `Api Key` → `apikey`).\n *\n * Defaults include: password, token, secret, key, apikey, auth, authorization,\n * bearer, bearertoken, jwt, credential, clientsecret, privatekey, refresh, ssn.\n */\n sensitiveFields?: string[];\n\n /**\n * The token used for full redaction.\n * Default: \"[REDACTED]\"\n */\n redactionToken?: string;\n\n /**\n * Style of redaction to use:\n * - \"full\": always replace with redactionToken.\n * - \"partial\": show 3 characters from the start and end, redact the middle.\n *\n * Default: \"full\"\n */\n redactionStyle?: RedactionStyle;\n}\n\n/**\n * SensitiveDataFilter\n *\n * An SpanOutputProcessor that redacts sensitive information from span fields.\n *\n * - Sensitive keys are matched case-insensitively, normalized to remove separators.\n * - Sensitive values are redacted using either full or partial redaction.\n * - Partial redaction always keeps 3 chars at the start and end.\n * - JSON strings containing sensitive fields are parsed and redacted.\n * - If filtering a field fails, the field is replaced with:\n * `{ error: { processor: \"sensitive-data-filter\" } }`\n */\nexport class SensitiveDataFilter implements SpanOutputProcessor {\n name = 'sensitive-data-filter';\n private sensitiveFields: string[];\n private redactionToken: string;\n private redactionStyle: RedactionStyle;\n\n constructor(options: SensitiveDataFilterOptions = {}) {\n this.sensitiveFields = (\n options.sensitiveFields || [\n 'password',\n 'token',\n 'secret',\n 'key',\n 'apikey',\n 'auth',\n 'authorization',\n 'bearer',\n 'bearertoken',\n 'jwt',\n 'credential',\n 'clientsecret',\n 'privatekey',\n 'refresh',\n 'ssn',\n ]\n ).map(f => this.normalizeKey(f));\n\n this.redactionToken = options.redactionToken ?? '[REDACTED]';\n this.redactionStyle = options.redactionStyle ?? 'full';\n }\n\n /**\n * Process a span by filtering sensitive data across its key fields.\n * Fields processed: attributes, metadata, input, output, errorInfo.\n *\n * @param span - The input span to filter\n * @returns A new span with sensitive values redacted\n */\n process(span: AnySpan): AnySpan {\n span.attributes = this.tryFilter(span.attributes);\n span.metadata = this.tryFilter(span.metadata);\n span.input = this.tryFilter(span.input);\n span.output = this.tryFilter(span.output);\n span.errorInfo = this.tryFilter(span.errorInfo);\n return span;\n }\n\n /**\n * Recursively filter objects/arrays for sensitive keys.\n * Handles circular references by replacing with a marker.\n * Also attempts to parse and redact JSON strings.\n */\n private deepFilter(obj: any, seen = new WeakSet()): any {\n if (obj === null || typeof obj !== 'object') {\n // Handle string values - check if they contain JSON that needs redacting\n if (typeof obj === 'string') {\n // Quick check - JSON objects/arrays start with { or [\n const trimmed = obj.trim();\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n return this.redactJsonString(obj);\n }\n }\n return obj;\n }\n\n if (seen.has(obj)) {\n return '[Circular Reference]';\n }\n seen.add(obj);\n\n // Preserve Date objects - they have no enumerable keys\n // and Object.keys() returns [], which would incorrectly convert them to {}\n if (obj instanceof Date) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => this.deepFilter(item, seen));\n }\n\n const filtered: any = {};\n for (const key of Object.keys(obj)) {\n const normKey = this.normalizeKey(key);\n\n if (this.isSensitive(normKey)) {\n if (obj[key] && typeof obj[key] === 'object') {\n filtered[key] = this.deepFilter(obj[key], seen);\n } else {\n filtered[key] = this.redactValue(obj[key]);\n }\n } else {\n filtered[key] = this.deepFilter(obj[key], seen);\n }\n }\n\n return filtered;\n }\n\n private tryFilter(value: any): any {\n try {\n return this.deepFilter(value);\n } catch {\n return { error: { processor: this.name } };\n }\n }\n\n /**\n * Normalize keys by lowercasing and stripping non-alphanumeric characters.\n * Ensures consistent matching for variants like \"api-key\", \"api_key\", \"Api Key\".\n */\n private normalizeKey(key: string): string {\n return key.toLowerCase().replace(/[^a-z0-9]/g, '');\n }\n\n /**\n * Check whether a normalized key exactly matches any sensitive field.\n * Both key and sensitive fields are normalized by removing all non-alphanumeric\n * characters and converting to lowercase before comparison.\n *\n * Examples:\n * - \"api_key\", \"api-key\", \"ApiKey\" all normalize to \"apikey\" → MATCHES \"apikey\"\n * - \"promptTokens\", \"prompt_tokens\" normalize to \"prompttokens\" → DOES NOT MATCH \"token\"\n */\n private isSensitive(normalizedKey: string): boolean {\n return this.sensitiveFields.some(sensitiveField => {\n // Simple case-insensitive match after normalization\n return normalizedKey === sensitiveField;\n });\n }\n\n /**\n * Attempt to parse a string as JSON and redact sensitive fields within it.\n * If parsing fails or no sensitive data is found, returns the original string.\n */\n private redactJsonString(str: string): string {\n try {\n // Try to parse as JSON\n const parsed = JSON.parse(str);\n\n // If it's an object, filter it and serialize back\n if (parsed && typeof parsed === 'object') {\n const filtered = this.deepFilter(parsed, new WeakSet());\n return JSON.stringify(filtered);\n }\n\n // If not an object, return original\n return str;\n } catch {\n // Not valid JSON, return original string\n return str;\n }\n }\n\n /**\n * Redact a sensitive value.\n * - Full style: replaces with a fixed token.\n * - Partial style: shows 3 chars at start and end, hides the middle.\n *\n * Non-string values are converted to strings before partial redaction.\n */\n private redactValue(value: any): string {\n if (this.redactionStyle === 'full') {\n return this.redactionToken;\n }\n\n const str = String(value);\n const len = str.length;\n if (len <= 6) {\n return this.redactionToken; // too short, redact fully\n }\n return str.slice(0, 3) + '…' + str.slice(len - 3);\n }\n\n async shutdown(): Promise {\n // No cleanup needed\n }\n}\n","import type { Mastra } from '@mastra/core';\nimport { MastraBase } from '@mastra/core/base';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { RegisteredLogger } from '@mastra/core/logger';\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport type {\n ClientObservabilityProxy,\n CorrelationContext,\n ConfigSelector,\n ConfigSelectorOptions,\n FeedbackInput,\n FeedbackEvent,\n ObservabilityEntrypoint,\n ObservabilityDropEvent,\n ObservabilityInstance,\n RecordedTrace,\n ScoreInput,\n ScoreEvent,\n} from '@mastra/core/observability';\nimport type { ObservabilityStorage } from '@mastra/core/storage';\nimport { routeToHandler } from './bus/route-event';\nimport { createClientObservabilityProxy } from './client';\nimport { SamplingStrategyType, observabilityRegistryConfigSchema, observabilityConfigValueSchema } from './config';\nimport type { ObservabilityInstanceConfig, ObservabilityRegistryConfig } from './config';\nimport { MastraPlatformExporter, MastraStorageExporter } from './exporters';\nimport { BaseObservabilityInstance, DefaultObservabilityInstance } from './instances';\nimport {\n buildFeedbackEvent,\n buildScoreEvent,\n buildRecordedFeedbackEventFromTrace,\n buildRecordedScoreEventFromTrace,\n hydrateRecordedTrace,\n} from './recorded';\nimport { ObservabilityRegistry } from './registry';\nimport { SensitiveDataFilter } from './span_processors';\nimport type { SensitiveDataFilterOptions } from './span_processors';\n\n/**\n * Type guard to check if an object is a BaseObservability instance\n */\nfunction isInstance(\n obj: Omit | ObservabilityInstance,\n): obj is ObservabilityInstance {\n return obj instanceof BaseObservabilityInstance;\n}\n\n/**\n * Top-level observability entrypoint. Manages a registry of ObservabilityInstance\n * configurations and provides instance selection via config selectors.\n */\nexport class Observability extends MastraBase implements ObservabilityEntrypoint {\n #registry = new ObservabilityRegistry();\n #mastra?: Mastra;\n #clientObservabilityProxy?: ClientObservabilityProxy;\n\n constructor(config: ObservabilityRegistryConfig) {\n super({\n component: RegisteredLogger.OBSERVABILITY,\n name: 'Observability',\n });\n\n if (config === undefined) {\n config = {};\n }\n\n // Validate config with Zod\n const validationResult = observabilityRegistryConfigSchema.safeParse(config);\n if (!validationResult.success) {\n const errorMessages = validationResult.error.issues\n .map(\n (err: { path: (string | number | symbol)[]; message: string }) =>\n `${err.path.join('.') || 'config'}: ${err.message}`,\n )\n .join('; ');\n throw new MastraError({\n id: 'OBSERVABILITY_INVALID_CONFIG',\n text: `Invalid observability configuration: ${errorMessages}`,\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n details: {\n validationErrors: errorMessages,\n },\n });\n }\n\n // Validate individual configs if they are plain objects (not instances)\n if (config.configs) {\n for (const [name, configValue] of Object.entries(config.configs)) {\n if (!isInstance(configValue)) {\n const configValidation = observabilityConfigValueSchema.safeParse(configValue);\n if (!configValidation.success) {\n const errorMessages = configValidation.error.issues\n .map(\n (err: { path: (string | number | symbol)[]; message: string }) =>\n `${err.path.join('.')}: ${err.message}`,\n )\n .join('; ');\n throw new MastraError({\n id: 'OBSERVABILITY_INVALID_INSTANCE_CONFIG',\n text: `Invalid configuration for observability instance '${name}': ${errorMessages}`,\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n details: {\n instanceName: name,\n validationErrors: errorMessages,\n },\n });\n }\n }\n }\n }\n\n // Resolve sensitive data filter setting (defaults to enabled).\n const sensitiveDataFilterSetting = config.sensitiveDataFilter ?? true;\n const shouldAutoApplySensitiveFilter = sensitiveDataFilterSetting !== false;\n const sensitiveDataFilterOptions: SensitiveDataFilterOptions | undefined =\n typeof sensitiveDataFilterSetting === 'object' && sensitiveDataFilterSetting !== null\n ? sensitiveDataFilterSetting\n : undefined;\n\n const buildAutoSensitiveFilter = (): SensitiveDataFilter | undefined => {\n if (!shouldAutoApplySensitiveFilter) {\n return undefined;\n }\n return new SensitiveDataFilter(sensitiveDataFilterOptions);\n };\n\n // Setup default config if enabled (deprecated)\n if (config.default?.enabled) {\n console.warn(\n '[Mastra Observability] The \"default: { enabled: true }\" configuration is deprecated and will be removed in a future version. ' +\n 'Please use explicit configs with MastraStorageExporter and MastraPlatformExporter instead. ' +\n 'Sensitive data filtering is applied by default and can be controlled via the top-level \"sensitiveDataFilter\" option. ' +\n 'See https://mastra.ai/docs/observability/tracing/overview for the recommended configuration.',\n );\n\n const autoFilter = buildAutoSensitiveFilter();\n const defaultInstance = new DefaultObservabilityInstance({\n serviceName: 'mastra',\n name: 'default',\n sampling: { type: SamplingStrategyType.ALWAYS },\n exporters: [new MastraStorageExporter(), new MastraPlatformExporter()],\n spanOutputProcessors: autoFilter ? [autoFilter] : [],\n });\n\n // Register as default with high priority\n this.#registry.register('default', defaultInstance, true);\n }\n\n if (config.configs) {\n // Process user-provided configs\n const instances = Object.entries(config.configs);\n\n instances.forEach(([name, tracingDef], index) => {\n let instance: ObservabilityInstance;\n if (isInstance(tracingDef)) {\n // Pre-instantiated custom implementation. We don't mutate it since\n // the caller already owns it; warn if no SensitiveDataFilter is\n // present and auto-apply is enabled.\n instance = tracingDef;\n if (shouldAutoApplySensitiveFilter) {\n const processors = instance.getSpanOutputProcessors?.() ?? [];\n const hasFilter = processors.some(p => p instanceof SensitiveDataFilter);\n if (!hasFilter) {\n this.logger?.warn(\n '[Mastra Observability] Pre-instantiated observability instance does not include a SensitiveDataFilter. ' +\n 'Auto-applied filtering is skipped for pre-instantiated instances. ' +\n 'Add a SensitiveDataFilter to spanOutputProcessors when constructing the instance to redact sensitive data.',\n { instanceName: name },\n );\n }\n }\n } else {\n const userProcessors = tracingDef.spanOutputProcessors ?? [];\n const hasFilter = userProcessors.some(p => p instanceof SensitiveDataFilter);\n const autoFilter = !hasFilter ? buildAutoSensitiveFilter() : undefined;\n // Auto-applied filter runs LAST so any sensitive data introduced by\n // user processors (e.g. enrichment that copies headers/config into\n // attributes) is still redacted before export.\n const spanOutputProcessors = autoFilter ? [...userProcessors, autoFilter] : userProcessors;\n instance = new DefaultObservabilityInstance({\n ...tracingDef,\n name,\n spanOutputProcessors,\n });\n }\n\n // First user-provided instance becomes default only if no default config\n const isDefault = !config.default?.enabled && index === 0;\n this.#registry.register(name, instance, isDefault);\n });\n }\n\n // Set selector function if provided\n if (config.configSelector) {\n this.#registry.setSelector(config.configSelector);\n }\n }\n\n /** Initialize all exporter instances with the Mastra context (storage, config, etc.). */\n setMastraContext(options: { mastra: Mastra }): void {\n const instances = this.listInstances();\n const { mastra } = options;\n this.#mastra = mastra;\n\n const mastraEnvironment = mastra.getEnvironment?.();\n\n instances.forEach(instance => {\n // Propagate the Mastra-level environment so spans can fall back to it\n // when `metadata.environment` isn't set on a specific span.\n instance.__setMastraEnvironment?.(mastraEnvironment);\n\n const config = instance.getConfig();\n const exporters = instance.getExporters();\n const emitDropEvent =\n instance instanceof BaseObservabilityInstance\n ? (event: ObservabilityDropEvent) => instance.getObservabilityBus().emitDropEvent(event)\n : undefined;\n exporters.forEach(exporter => {\n // Initialize exporter if it has an init method\n if ('init' in exporter && typeof exporter.init === 'function') {\n try {\n exporter.init({ mastra, config, emitDropEvent });\n } catch (error) {\n this.logger?.warn('Failed to initialize observability exporter', {\n exporterName: exporter.name,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n });\n });\n }\n\n /** Propagate a logger to this instance and all registered observability instances. */\n setLogger(options: { logger: IMastraLogger }): void {\n super.__setLogger(options.logger);\n this.listInstances().forEach(instance => {\n instance.__setLogger(options.logger);\n });\n }\n\n /** Get the observability instance chosen by the config selector for the given options. */\n getSelectedInstance(options: ConfigSelectorOptions): ObservabilityInstance | undefined {\n return this.#registry.getSelected(options);\n }\n\n async getRecordedTrace(args: { traceId: string }): Promise {\n const observabilityStorage = await this.#getObservabilityStorage();\n if (!observabilityStorage) {\n return null;\n }\n\n const trace = await observabilityStorage.getTrace({ traceId: args.traceId });\n if (!trace) {\n return null;\n }\n\n return hydrateRecordedTrace({\n trace,\n emitRecordedEvent: event => this.#emitRecordedEvent(event),\n canEmitRecordedEvent: () => !!this.#getRecordedTraceInstance(),\n debugRecordedAnnotationUnavailable: ({ kind, traceId, spanId }) => {\n this.logger?.debug(\n kind === 'score'\n ? 'addScore() is unavailable; rehydrate the trace before calling addScore()'\n : 'addFeedback() is unavailable; rehydrate the trace before calling addFeedback()',\n {\n traceId,\n spanId,\n },\n );\n },\n });\n }\n\n async addScore(args: {\n traceId?: string;\n spanId?: string;\n correlationContext?: CorrelationContext;\n score: ScoreInput;\n }): Promise {\n const targetTraceId = args.traceId ?? args.correlationContext?.traceId;\n const targetSpanId = args.spanId ?? args.correlationContext?.spanId;\n\n if (args.correlationContext) {\n await this.#emitRecordedEvent(\n buildScoreEvent({\n ...(targetTraceId ? { traceId: targetTraceId } : {}),\n ...(targetSpanId ? { spanId: targetSpanId } : {}),\n correlationContext: args.correlationContext,\n score: args.score,\n }),\n );\n return;\n }\n\n if (!args.traceId) {\n return;\n }\n\n const trace = await this.#getStoredTrace(args.traceId);\n if (!trace) {\n return;\n }\n\n const event = buildRecordedScoreEventFromTrace({\n trace,\n spanId: args.spanId,\n score: args.score,\n });\n\n if (!event) {\n return;\n }\n\n await this.#emitRecordedEvent(event);\n }\n\n async addFeedback(args: {\n traceId?: string;\n spanId?: string;\n correlationContext?: CorrelationContext;\n feedback: FeedbackInput;\n }): Promise {\n const targetTraceId = args.traceId ?? args.correlationContext?.traceId;\n const targetSpanId = args.spanId ?? args.correlationContext?.spanId;\n\n if (args.correlationContext) {\n await this.#emitRecordedEvent(\n buildFeedbackEvent({\n ...(targetTraceId ? { traceId: targetTraceId } : {}),\n ...(targetSpanId ? { spanId: targetSpanId } : {}),\n correlationContext: args.correlationContext,\n feedback: args.feedback,\n }),\n );\n return;\n }\n\n if (!args.traceId) {\n return;\n }\n\n const trace = await this.#getStoredTrace(args.traceId);\n if (!trace) {\n return;\n }\n\n const event = buildRecordedFeedbackEventFromTrace({\n trace,\n spanId: args.spanId,\n feedback: args.feedback,\n });\n\n if (!event) {\n return;\n }\n\n await this.#emitRecordedEvent(event);\n }\n\n /** Register a named observability instance, optionally marking it as default. */\n registerInstance(name: string, instance: ObservabilityInstance, isDefault = false): void {\n this.#registry.register(name, instance, isDefault);\n\n // If Mastra context has already been set, propagate the environment to\n // this late-registered instance so it auto-tags spans like instances\n // registered before setMastraContext.\n if (this.#mastra) {\n instance.__setMastraEnvironment?.(this.#mastra.getEnvironment?.());\n }\n }\n\n /** Get a registered instance by name. */\n getInstance(name: string): ObservabilityInstance | undefined {\n return this.#registry.get(name);\n }\n\n /** Get the default observability instance. */\n getDefaultInstance(): ObservabilityInstance | undefined {\n return this.#registry.getDefault();\n }\n\n /** List all registered observability instances. */\n listInstances(): ReadonlyMap {\n return this.#registry.list();\n }\n\n /** Unregister an instance by name. Returns true if it was found and removed. */\n unregisterInstance(name: string): boolean {\n return this.#registry.unregister(name);\n }\n\n /** Check whether an instance with the given name is registered. */\n hasInstance(name: string): boolean {\n return !!this.#registry.get(name);\n }\n\n /** Set the config selector used to choose an instance at runtime. */\n setConfigSelector(selector: ConfigSelector): void {\n this.#registry.setSelector(selector);\n }\n\n /** Remove all registered instances and reset the registry. */\n clear(): void {\n this.#registry.clear();\n }\n\n /** Shut down all registered instances, flushing any pending data. */\n async shutdown(): Promise {\n await this.#registry.shutdown();\n }\n\n /**\n * Returns the proxy responsible for client observability (W3C trace\n * context injection + OTLP/JSON payload reception for spans/logs\n * returned from client-side execution).\n *\n * Lazily constructed on first call. Resolves the target observability\n * instance per receive call so config selection works the same way\n * as for server-side spans.\n */\n getClientObservabilityProxy(): ClientObservabilityProxy | undefined {\n if (!this.#clientObservabilityProxy) {\n this.#clientObservabilityProxy = createClientObservabilityProxy({\n resolveInstance: () => this.getDefaultInstance(),\n logger: this.logger,\n });\n }\n return this.#clientObservabilityProxy;\n }\n\n async #getObservabilityStorage(): Promise {\n const storage = this.#mastra?.getStorage();\n if (!storage) {\n return null;\n }\n\n return (await storage.getStore('observability')) ?? null;\n }\n\n async #getStoredTrace(traceId: string) {\n const observabilityStorage = await this.#getObservabilityStorage();\n if (!observabilityStorage) {\n return null;\n }\n\n return observabilityStorage.getTrace({ traceId });\n }\n\n #getRecordedTraceInstance(): ObservabilityInstance | undefined {\n return this.getDefaultInstance() ?? Array.from(this.listInstances().values())[0];\n }\n\n async #emitRecordedEvent(event: ScoreEvent | FeedbackEvent): Promise {\n const instance = this.#getRecordedTraceInstance();\n if (!instance) {\n this.logger?.debug(\n event.type === 'score'\n ? 'Score event was dropped because no observability instance is registered'\n : 'Feedback event was dropped because no observability instance is registered',\n { eventType: event.type },\n );\n return;\n }\n\n if (instance instanceof BaseObservabilityInstance) {\n instance.__emitRecordedEvent(event);\n return;\n }\n\n const bridge = instance.getBridge();\n const handlerResults = [\n ...instance.getExporters().map(exporter => routeToHandler(exporter, event, this.logger)),\n ...(bridge ? [routeToHandler(bridge, event, this.logger)] : []),\n ].filter((result): result is Promise => !!result && typeof result.then === 'function');\n\n if (handlerResults.length > 0) {\n await Promise.allSettled(handlerResults);\n }\n }\n}\n","/**\n * Feature flags for @mastra/observability\n *\n * Tracks which features are available in the current version of\n * @mastra/observability. Downstream exporter packages (e.g.\n * @mastra/datadog, @mastra/laminar) can check for feature availability\n * before relying on a span shape, attribute, or hierarchy that this\n * package may not yet emit.\n *\n * Pair these checks with `coreFeatures` from `@mastra/core/features` so a\n * consumer only opts in when BOTH packages support the feature.\n *\n * @example Old-version-safe usage\n *\n * A static named import of `observabilityFeatures` will throw a link-time\n * `SyntaxError` in strict Node ESM when paired with an `@mastra/observability`\n * that predates this export. Use a dynamic import so the exporter degrades\n * gracefully against any version of `@mastra/observability`:\n *\n * ```ts\n * import { coreFeatures } from \"@mastra/core/features\"\n *\n * let observabilityFeatures: Set | undefined\n * try {\n * ({ observabilityFeatures } = await import(\"@mastra/observability\"))\n * } catch {\n * // older @mastra/observability that does not export this symbol\n * }\n *\n * if (\n * observabilityFeatures?.has(\"model-inference-span\") &&\n * coreFeatures.has(\"model-inference-span\")\n * ) {\n * // safe\n * }\n * ```\n */\n// Add feature flags here as new features are introduced\nexport const observabilityFeatures: ReadonlySet = new Set(['model-inference-span', 'internal-usage-rollup']);\n","/**\n * Composable Tracing Options Builder\n */\n\nimport type { TracingOptions } from '@mastra/core/observability';\n\n/**\n * A function that updates TracingOptions.\n */\nexport type TracingOptionsUpdater = (options: TracingOptions) => TracingOptions;\n\n/**\n * Builds TracingOptions by composing one or more updater functions.\n *\n * @example\n * ```typescript\n * import { buildTracingOptions } from '@mastra/observability';\n * import { withLangfusePrompt } from '@mastra/langfuse';\n *\n * const prompt = await langfuse.getPrompt('my-prompt');\n *\n * const agent = new Agent({\n * defaultGenerateOptions: {\n * tracingOptions: buildTracingOptions(withLangfusePrompt(prompt)),\n * },\n * });\n * ```\n */\nexport function buildTracingOptions(...updaters: TracingOptionsUpdater[]): TracingOptions {\n return updaters.reduce((opts, updater) => updater(opts), {} as TracingOptions);\n}\n"]}