{"version":3,"sources":["../src/dedup.ts","../src/runtime.ts","../src/stackTrace.ts","../src/scrubber.ts","../src/uuid.ts","../src/version.ts","../src/events.ts","../src/budget.ts","../src/logBuffer.ts","../src/logLevel.ts","../src/metricEvents.ts","../src/options.ts","../src/pageviews.ts","../src/requestContext.ts","../src/asyncContext.ts","../src/diagnostics.ts","../src/breadcrumbs.ts","../src/scope.ts","../src/stats.ts","../src/traceContext.ts","../src/transport.ts","../src/client.ts","../src/integrations/browser/navigation.ts","../src/integrations/browser/breadcrumbs.ts","../src/integrations/browser/globalHandlers.ts","../src/templatize.ts","../src/integrations/browser/http.ts","../src/integrations/browser/jank.ts","../src/integrations/browser/pageviews.ts","../src/replay.ts","../src/session.ts","../src/integrations/browser/replay.ts","../src/integrations/browser/resourceErrors.ts","../node_modules/.pnpm/web-vitals@6.1.1/node_modules/web-vitals/src/lib/bfcache.ts","../node_modules/.pnpm/web-vitals@6.1.1/node_modules/web-vitals/src/lib/bindReporter.ts","../node_modules/.pnpm/web-vitals@6.1.1/node_modules/web-vitals/src/lib/doubleRAF.ts","../node_modules/.pnpm/web-vitals@6.1.1/node_modules/web-vitals/src/lib/getNavigationEntry.ts","../node_modules/.pnpm/web-vitals@6.1.1/node_modules/web-vitals/src/lib/getActivationStart.ts","../node_modules/.pnpm/web-vitals@6.1.1/node_modules/web-vitals/src/lib/getVisibilityWatcher.ts","../node_modules/.pnpm/web-vitals@6.1.1/node_modules/web-vitals/src/lib/generateUniqueID.ts","../node_modules/.pnpm/web-vitals@6.1.1/node_modules/web-vitals/src/lib/initMetric.ts","../node_modules/.pnpm/web-vitals@6.1.1/node_modules/web-vitals/src/lib/initUnique.ts","../node_modules/.pnpm/web-vitals@6.1.1/node_modules/web-vitals/src/lib/LayoutShiftManager.ts","../node_modules/.pnpm/web-vitals@6.1.1/node_modules/web-vitals/src/lib/observe.ts","../node_modules/.pnpm/web-vitals@6.1.1/node_modules/web-vitals/src/lib/softNavs.ts","../node_modules/.pnpm/web-vitals@6.1.1/node_modules/web-vitals/src/lib/runOnce.ts","../node_modules/.pnpm/web-vitals@6.1.1/node_modules/web-vitals/src/lib/FCPEntryManager.ts","../node_modules/.pnpm/web-vitals@6.1.1/node_modules/web-vitals/src/lib/whenActivated.ts","../node_modules/.pnpm/web-vitals@6.1.1/node_modules/web-vitals/src/onFCP.ts","../node_modules/.pnpm/web-vitals@6.1.1/node_modules/web-vitals/src/onCLS.ts","../node_modules/.pnpm/web-vitals@6.1.1/node_modules/web-vitals/src/lib/polyfills/interactionCountPolyfill.ts","../node_modules/.pnpm/web-vitals@6.1.1/node_modules/web-vitals/src/lib/InteractionManager.ts","../node_modules/.pnpm/web-vitals@6.1.1/node_modules/web-vitals/src/lib/whenIdleOrHidden.ts","../node_modules/.pnpm/web-vitals@6.1.1/node_modules/web-vitals/src/onINP.ts","../node_modules/.pnpm/web-vitals@6.1.1/node_modules/web-vitals/src/lib/LCPEntryManager.ts","../node_modules/.pnpm/web-vitals@6.1.1/node_modules/web-vitals/src/onLCP.ts","../node_modules/.pnpm/web-vitals@6.1.1/node_modules/web-vitals/src/onTTFB.ts","../src/webVitals.ts","../src/integrations/browser/webVitals.ts","../src/integrations/node/lifecycle.ts","../src/integrations/node/processHandlers.ts","../src/logger.ts","../src/index.ts"],"names":["location","log","SDK_INFO","spanId","init","logger","measure","noop","endpointHost","flush","isElement","stripQuery","po","interaction","isEnabled"],"mappings":";;;;;AAQO,IAAM,eAAN,MAAmB;AAAA,EAIxB,YACmB,QAAA,GAAmB,GAAA,EACnB,MAAoB,MAAM,IAAA,CAAK,KAAI,EACpD;AAFiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AALnB,IAAA,IAAA,CAAiB,IAAA,uBAAW,GAAA,EAAoB;AAChD,IAAA,IAAA,CAAiB,QAAA,uBAAe,OAAA,EAAgB;AAAA,EAK7C;AAAA;AAAA;AAAA,EAIH,YAAY,KAAA,EAAyB;AACnC,IAAA,OAAO,SAAS,KAAK,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,IAAI,KAAK,CAAA;AAAA,EACnD;AAAA;AAAA,EAGA,aAAa,KAAA,EAAsB;AACjC,IAAA,IAAI,SAAS,KAAK,CAAA,EAAG,IAAA,CAAK,QAAA,CAAS,IAAI,KAAK,CAAA;AAAA,EAC9C;AAAA;AAAA,EAGA,YAAY,GAAA,EAAsB;AAChC,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,IAAA,IAAA,CAAK,MAAM,OAAO,CAAA;AAClB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAClC,IAAA,IAAI,QAAA,KAAa,MAAA,IAAa,OAAA,GAAU,QAAA,GAAW,KAAK,QAAA,EAAU;AAChE,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA;AAC1B,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,MAAM,OAAA,EAAuB;AACnC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,EAAE,CAAA,IAAK,KAAK,IAAA,EAAM;AACjC,MAAA,IAAI,UAAU,EAAA,IAAM,IAAA,CAAK,UAAU,IAAA,CAAK,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,IACzD;AAAA,EACF;AACF,CAAA;AAEA,SAAS,SAAS,KAAA,EAAiC;AACjD,EAAA,OAAQ,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,IAAS,OAAO,KAAA,KAAU,UAAA;AAC3E;AAGO,SAAS,QAAA,CACd,IAAA,EACA,OAAA,EACA,QAAA,EACQ;AACR,EAAA,OAAO,GAAG,IAAI,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,EAAI,YAAY,EAAE,CAAA,CAAA;AAC7C;;;ACrDO,SAAS,SAAA,GAAqB;AACnC,EAAA,OAAO,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,QAAA,KAAa,WAAA;AAC9D;AAGO,SAAS,MAAA,GAAkB;AAChC,EAAA,OACE,CAAC,WAAU,IACX,OAAO,YAAY,WAAA,IACnB,OAAO,OAAA,CAAQ,QAAA,EAAU,IAAA,KAAS,QAAA;AAEtC;AAIO,SAAS,cAAA,GAA0C;AACxD,EAAA,IAAI,MAAA,IAAU,OAAO,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,QAAQ,OAAA,EAAQ;AAC9D,EAAA,OAAO,EAAE,MAAM,SAAA,EAAU;AAC3B;AAWO,SAAS,UAAA,GAAiC;AAC/C,EAAA,IAAI,CAAC,MAAA,EAAO,EAAG,OAAO,MAAA;AACtB,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAA,EAAO,EAAG,QAAA,IAAW;AAClC,IAAA,OAAO,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,MAAA,GAAS,IAAI,IAAA,GAAO,KAAA,CAAA;AAAA,EAC9D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAMA,IAAM,cAAA,GAAiB,6BAAA;AAYhB,SAAS,aAAA,GAAoC;AAClD,EAAA,IAAI,CAAC,MAAA,EAAO,EAAG,OAAO,MAAA;AACtB,EAAA,MAAM,MAAM,OAAA,CAAQ,GAAA;AACpB,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,WAAA,IAAe,GAAA,CAAI,OAAA;AACnC,EAAA,IAAI,GAAA,IAAO,cAAA,CAAe,IAAA,CAAK,GAAG,GAAG,OAAO,GAAA;AAC5C,EAAA,OAAO,GAAA,CAAI,aAAA,IAAiB,GAAA,CAAI,OAAA,IAAW,MAAA;AAC7C;AAcA,SAAS,MAAA,GAA6B;AACpC,EAAA,MAAM,aAAc,OAAA,CAA+B,gBAAA;AACnD,EAAA,IAAI,OAAO,UAAA,KAAe,UAAA,EAAY,OAAO,MAAA;AAC7C,EAAA,OAAO,WAAW,IAAI,CAAA;AACxB;;;ACnEA,IAAM,UAAA,GAAa,EAAA;AAGZ,SAAS,WAAW,KAAA,EAAyC;AAClE,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AAEpB,EAAA,MAAM,SAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,GAAA,IAAO,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,EAAG;AACnC,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,EAAK;AACtB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,MAAA,GAAS,UAAU,IAAI,CAAA;AAC7B,IAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAAA,EAChC;AAGA,EAAA,MAAA,CAAO,OAAA,EAAQ;AACf,EAAA,IAAI,MAAA,CAAO,SAAS,UAAA,EAAY,OAAO,OAAO,KAAA,CAAM,MAAA,CAAO,SAAS,UAAU,CAAA;AAC9E,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,UAAU,IAAA,EAAiC;AAElD,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA,EAAG;AAC1B,IAAA,IAAI,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AAC9B,IAAA,IAAI,EAAA;AACJ,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC7B,IAAA,IAAI,IAAA,KAAS,EAAA,IAAM,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AACrC,MAAA,EAAA,GAAK,KAAK,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,CAAE,MAAK,IAAK,MAAA;AACnC,MAAA,IAAA,GAAO,KAAK,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AAAA,IACvC;AACA,IAAA,OAAO,SAAA,CAAU,IAAA,EAAM,aAAA,CAAc,EAAE,CAAC,CAAA;AAAA,EAC1C;AAGA,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA;AAC/B,EAAA,IAAI,OAAO,EAAA,EAAI;AACb,IAAA,MAAM,KAAK,IAAA,CAAK,KAAA,CAAM,GAAG,EAAE,CAAA,CAAE,MAAK,IAAK,MAAA;AACvC,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,CAAC,EAAE,IAAA,EAAK;AACpC,IAAA,OAAO,SAAA,CAAU,GAAA,EAAK,aAAA,CAAc,EAAE,CAAC,CAAA;AAAA,EACzC;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,cAAc,EAAA,EAA4C;AACjE,EAAA,IAAI,CAAC,IAAI,OAAO,MAAA;AAEhB,EAAA,MAAM,UAAU,EAAA,CAAG,OAAA,CAAQ,iBAAA,EAAmB,EAAE,EAAE,IAAA,EAAK;AACvD,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,KAAY,aAAA,EAAe,OAAO,MAAA;AAClD,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,SAAA,CAAUA,WAAkB,EAAA,EAAoC;AACvE,EAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAM,GAAA,EAAI,GAAI,cAAcA,SAAQ,CAAA;AACjD,EAAA,MAAM,KAAA,GAAoB;AAAA,IACxB,QAAA,EAAU,WAAW,GAAG,CAAA;AAAA,IACxB,QAAA,EAAU,GAAA;AAAA,IACV,MAAA,EAAQ,QAAQ,GAAG;AAAA,GACrB;AACA,EAAA,IAAI,EAAA,KAAO,MAAA,EAAW,KAAA,CAAM,QAAA,GAAW,EAAA;AACvC,EAAA,IAAI,IAAA,KAAS,MAAA,EAAW,KAAA,CAAM,MAAA,GAAS,IAAA;AACvC,EAAA,IAAI,GAAA,KAAQ,MAAA,EAAW,KAAA,CAAM,KAAA,GAAQ,GAAA;AACrC,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,cAAc,GAAA,EAIrB;AACA,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,KAAA,CAAM,oBAAoB,CAAA;AACjD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,WAAW,CAAC,CAAA;AAAA,MACjB,IAAA,EAAM,MAAA,CAAO,UAAA,CAAW,CAAC,CAAC,CAAA;AAAA,MAC1B,GAAA,EAAK,MAAA,CAAO,UAAA,CAAW,CAAC,CAAC;AAAA,KAC3B;AAAA,EACF;AACA,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,KAAA,CAAM,cAAc,CAAA;AACxC,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAO,EAAE,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAA,EAAI,MAAM,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAE;AAAA,EACtD;AACA,EAAA,OAAO,EAAE,KAAK,GAAA,EAAI;AACpB;AAEA,SAAS,WAAW,GAAA,EAAqB;AACvC,EAAA,MAAM,YAAA,GAAe,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,CAAG,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA;AACpD,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA;AACvC,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AACzC,EAAA,OAAO,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,IAAA,GAAO,GAAA;AAC1C;AAEA,SAAS,QAAQ,GAAA,EAAsB;AACrC,EAAA,IAAI,CAAC,KAAK,OAAO,KAAA;AACjB,EAAA,IAAI,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,aAAA,IAAiB,QAAQ,eAAA,EAAiB;AACxE,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,GAAA,CAAI,QAAA,CAAS,cAAc,CAAA,EAAG,OAAO,KAAA;AACzC,EAAA,OAAO,IAAA;AACT;;;AC1GA,IAAM,aAAA,GACJ,qGAAA;AAGF,IAAM,oBAAA,GACJ,6HAAA;AAEK,IAAM,QAAA,GAAW,YAAA;AAGjB,SAAS,eAAe,GAAA,EAAsB;AACnD,EAAA,OAAO,aAAA,CAAc,KAAK,GAAG,CAAA;AAC/B;AAKO,SAAS,KAAA,CAAS,KAAA,EAAU,IAAA,mBAAwB,IAAI,SAAQ,EAAM;AAC3E,EAAA,OAAO,UAAA,CAAW,OAAO,IAAI,CAAA;AAC/B;AAEA,SAAS,UAAA,CAAW,OAAgB,IAAA,EAAgC;AAClE,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,YAAA;AAC5B,IAAA,IAAA,CAAK,IAAI,KAAK,CAAA;AACd,IAAA,OAAO,MAAM,GAAA,CAAI,CAAC,SAAS,UAAA,CAAW,IAAA,EAAM,IAAI,CAAC,CAAA;AAAA,EACnD;AACA,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,EAAU;AAC/C,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,YAAA;AAC5B,IAAA,IAAA,CAAK,IAAI,KAAK,CAAA;AACd,IAAA,MAAM,KAAA,GAAQ,KAAA;AACd,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AACpC,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,cAAA,CAAe,GAAG,CAAA,GAAI,WAAW,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,EAAG,IAAI,CAAA;AAAA,IAC5E;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAIO,SAAS,aAAa,KAAA,EAAuB;AAClD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,oBAAA,EAAsB,QAAQ,CAAA;AACrD;;;ACnDA,SAAS,YAAY,MAAA,EAA4B;AAC/C,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAM,CAAA;AACnC,EAAA,MAAM,YAAa,UAAA,CAAmC,MAAA;AACtD,EAAA,IAAI,SAAA,IAAa,OAAO,SAAA,CAAU,eAAA,KAAoB,UAAA,EAAY;AAChE,IAAA,SAAA,CAAU,gBAAgB,KAAK,CAAA;AAC/B,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,IAAA,KAAA,CAAM,CAAC,CAAA,GAAI,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,KAAW,GAAG,CAAA;AAAA,EAC3C;AACA,EAAA,OAAO,KAAA;AACT;AAGO,SAAS,MAAA,GAAiB;AAC/B,EAAA,MAAM,CAAA,GAAI,YAAY,EAAE,CAAA;AAExB,EAAA,CAAA,CAAE,CAAC,CAAA,GAAK,CAAA,CAAE,CAAC,IAAK,EAAA,GAAQ,EAAA;AACxB,EAAA,CAAA,CAAE,CAAC,CAAA,GAAK,CAAA,CAAE,CAAC,IAAK,EAAA,GAAQ,GAAA;AACxB,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,MAAS,IAAA,CAAK,CAAA,CAAE,CAAC,CAAA,CAAG,SAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA;AACzE,EAAA,OACE,IAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,GACvB,GAAA,GACA,IAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,GACvB,GAAA,GACA,IAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA,GACvB,MACA,GAAA,CAAI,KAAA,CAAM,GAAG,EAAE,CAAA,CAAE,KAAK,EAAE,CAAA,GACxB,MACA,GAAA,CAAI,KAAA,CAAM,IAAI,EAAE,CAAA,CAAE,KAAK,EAAE,CAAA;AAE7B;AAGO,SAAS,cAAA,GAAyB;AACvC,EAAA,OAAO,MAAA,EAAO,CAAE,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA;AAClC;AAMO,SAAS,MAAA,GAAiB;AAC/B,EAAA,MAAM,CAAA,GAAI,YAAY,CAAC,CAAA;AACvB,EAAA,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAK,CAAA;AACf,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,KAAK,GAAA,IAAO,CAAA,CAAE,CAAC,CAAA,CAAG,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACrE,EAAA,OAAO,GAAA;AACT;;;AClDO,IAAM,QAAA,GAAW;AACjB,IAAM,WAAA,GAAc;AAGpB,IAAM,QAAA,GAAW,YAAA;;;ACKxB,IAAM,QAAA,GAAW,EAAE,IAAA,EAAM,QAAA,EAAU,SAAS,WAAA,EAAY;AAUjD,SAAS,eAAe,KAAA,EAAiC;AAC9D,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAM,IAAA,IAAQ,OAAA;AAAA,MACpB,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,MAAA,CAAO,KAAK,CAAA;AAAA,MACpC,OAAO,KAAA,CAAM;AAAA,KACf;AAAA,EACF;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAO,MAAA,EAAU;AAAA,EACzD;AACA,EAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACtC,IAAA,MAAM,GAAA,GAAM,KAAA;AACZ,IAAA,MAAM,OAAO,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA,GAAW,IAAI,IAAA,GAAO,OAAA;AACvD,IAAA,MAAM,KAAA,GAAQ,OAAO,GAAA,CAAI,OAAA,KAAY,WAAW,GAAA,CAAI,OAAA,GAAU,cAAc,KAAK,CAAA;AACjF,IAAA,MAAM,QAAQ,OAAO,GAAA,CAAI,KAAA,KAAU,QAAA,GAAW,IAAI,KAAA,GAAQ,MAAA;AAC1D,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAM;AAAA,EAC9B;AACA,EAAA,OAAO,EAAE,MAAM,OAAA,EAAS,KAAA,EAAO,OAAO,KAAK,CAAA,EAAG,OAAO,MAAA,EAAU;AACjE;AAEA,SAAS,cAAc,KAAA,EAAwB;AAC7C,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,IAAK,OAAO,KAAK,CAAA;AAAA,EAC9C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,OAAO,KAAK,CAAA;AAAA,EACrB;AACF;AAyBO,SAAS,gBAAgB,KAAA,EAAsC;AACpE,EAAA,MAAM,EAAE,IAAA,EAAM,aAAA,EAAc,GAAI,UAAA,CAAW,MAAM,SAAS,CAAA;AAC1D,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AAE3C,EAAA,MAAM,OAAA,GAAwB;AAAA,IAC5B,UAAU,cAAA,EAAe;AAAA,IACzB,WAAW,MAAA,EAAO;AAAA,IAClB,QAAA,EAAU,QAAA;AAAA,IACV,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,aAAa,KAAA,CAAM,WAAA;AAAA,IACnB,GAAI,MAAM,OAAA,GAAU,EAAE,SAAS,KAAA,CAAM,OAAA,KAAY,EAAC;AAAA,IAClD,GAAI,MAAM,UAAA,GAAa,EAAE,aAAa,KAAA,CAAM,UAAA,KAAe,EAAC;AAAA,IAC5D,SAAA,EAAW;AAAA,MACT,MAAA,EAAQ;AAAA,QACN;AAAA,UACE,IAAA,EAAM,MAAM,KAAA,CAAM,IAAA;AAAA,UAClB,KAAA,EAAO,YAAA,CAAa,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AAAA,UACrC,UAAA,EAAY,EAAE,MAAA,EAAO;AAAA,UACrB,WAAW,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,MAAM,OAAA;AAAQ;AACtD;AACF,KACF;AAAA,IACA,QAAA,EAAU;AAAA,MACR,OAAA,EAAS,KAAA,CAAM,OAAA,IAAW,cAAA,EAAe;AAAA,MACzC,GAAG,aAAA;AAAA,MACH,GAAG,KAAA,CAAM,KAAA,CAAM,QAAA,IAAY,EAAE,CAAA;AAAA,MAC7B,GAAI,KAAA,CAAM,QAAA,GAAW,EAAE,MAAA,EAAQ,EAAE,SAAA,EAAW,KAAA,CAAM,QAAA,EAAS,EAAE,GAAI;AAAC,KACpE;AAAA,IACA,GAAA,EAAK,QAAA;AAAA;AAAA;AAAA,IAGL,GAAI,MAAM,OAAA,GAAU,EAAE,SAAS,KAAA,CAAM,OAAA,KAAY,EAAC;AAAA,IAClD,GAAG,IAAA;AAAA,IACH,GAAI,MAAM,OAAA,GAAU,EAAE,UAAU,KAAA,CAAM,OAAA,KAAY;AAAC,GACrD;AACA,EAAA,OAAO,OAAA;AACT;AAkBO,SAAS,kBAAkB,KAAA,EAAwC;AACxE,EAAA,MAAM,EAAE,IAAA,EAAM,aAAA,EAAc,GAAI,UAAA,CAAW,MAAM,SAAS,CAAA;AAC1D,EAAA,OAAO;AAAA,IACL,UAAU,cAAA,EAAe;AAAA,IACzB,WAAW,MAAA,EAAO;AAAA,IAClB,QAAA,EAAU,QAAA;AAAA,IACV,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,aAAa,KAAA,CAAM,WAAA;AAAA,IACnB,GAAI,MAAM,OAAA,GAAU,EAAE,SAAS,KAAA,CAAM,OAAA,KAAY,EAAC;AAAA,IAClD,GAAI,MAAM,UAAA,GAAa,EAAE,aAAa,KAAA,CAAM,UAAA,KAAe,EAAC;AAAA,IAC5D,SAAS,EAAE,SAAA,EAAW,YAAA,CAAa,KAAA,CAAM,OAAO,CAAA,EAAE;AAAA,IAClD,QAAA,EAAU;AAAA,MACR,OAAA,EAAS,KAAA,CAAM,OAAA,IAAW,cAAA,EAAe;AAAA,MACzC,GAAG,aAAA;AAAA,MACH,GAAI,KAAA,CAAM,QAAA,GAAW,EAAE,MAAA,EAAQ,EAAE,SAAA,EAAW,KAAA,CAAM,QAAA,EAAS,EAAE,GAAI;AAAC,KACpE;AAAA,IACA,GAAA,EAAK,QAAA;AAAA,IACL,GAAI,MAAM,OAAA,GAAU,EAAE,SAAS,KAAA,CAAM,OAAA,KAAY,EAAC;AAAA,IAClD,GAAG,IAAA;AAAA,IACH,GAAI,MAAM,OAAA,GAAU,EAAE,UAAU,KAAA,CAAM,OAAA,KAAY;AAAC,GACrD;AACF;AAaO,SAAS,cAAc,KAAA,EAAoC;AAChE,EAAA,MAAM,UAAA,GACJ,KAAA,CAAM,UAAA,IAAc,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAE,MAAA,GAAS,CAAA,GACvD,KAAA,CAAM,KAAA,CAAM,UAAU,CAAA,GACtB,MAAA;AAEN,EAAA,OAAO;AAAA,IACL,UAAU,cAAA,EAAe;AAAA,IACzB,WAAW,MAAA,EAAO;AAAA,IAClB,OAAO,KAAA,CAAM,KAAA;AAAA;AAAA;AAAA,IAGb,OAAA,EAAS,YAAA,CAAa,KAAA,CAAM,OAAO,CAAA;AAAA,IACnC,GAAI,UAAA,GAAa,EAAE,UAAA,KAAe,EAAC;AAAA,IACnC,GAAI,MAAM,MAAA,GAAS,EAAE,QAAQ,KAAA,CAAM,MAAA,KAAW,EAAC;AAAA,IAC/C,GAAI,MAAM,OAAA,GAAU,EAAE,UAAU,KAAA,CAAM,OAAA,KAAY,EAAC;AAAA,IACnD,aAAa,KAAA,CAAM,WAAA;AAAA,IACnB,GAAI,MAAM,OAAA,GAAU,EAAE,SAAS,KAAA,CAAM,OAAA,KAAY,EAAC;AAAA,IAClD,GAAA,EAAK;AAAA,GACP;AACF;AAIA,SAAS,WAAW,SAAA,EAGlB;AACA,EAAA,MAAM,IAAA,GAAqB,EAAE,GAAG,SAAA,EAAU;AAC1C,EAAA,MAAM,aAAA,GAAiB,IAAA,CAAK,UAAU,CAAA,IAAiC,EAAC;AACxE,EAAA,OAAO,KAAK,UAAU,CAAA;AACtB,EAAA,OAAO,EAAE,MAAM,aAAA,EAAc;AAC/B;AAEA,SAAS,MAAA,GAAiB;AACxB,EAAA,OAAA,iBAAO,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAChC;;;AC7JO,IAAM,oBAAoB,GAAA,GAAM,IAAA;AAIvC,IAAM,cAAA,GAAiB,CAAA;AAKvB,IAAM,aAAA,uBAAoB,GAAA,CAAI,CAAC,WAAW,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU,QAAQ,CAAC,CAAA;AAI1E,IAAM,UAAA,uBAAiB,GAAA,CAAI;AAAA,EACzB,UAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAC,CAAA;AACD,IAAM,QAAA,uBAAe,GAAA,CAAI;AAAA,EACvB,UAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAC,CAAA;AACD,IAAM,WAAA,uBAAkB,GAAA,CAAI;AAAA,EAC1B,mBAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAC,CAAA;AAID,IAAM,YAAA,uBAAmB,GAAA,CAAI;AAAA,EAC3B,MAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAC,CAAA;AAID,IAAI,aAAA;AAGG,SAAS,UAAU,KAAA,EAAuB;AAC/C,EAAA,IAAI,OAAO,gBAAgB,UAAA,EAAY;AACrC,IAAA,aAAA,KAAA,aAAA,GAAkB,IAAI,WAAA,EAAY,CAAA;AAClC,IAAA,OAAO,aAAA,CAAc,MAAA,CAAO,KAAK,CAAA,CAAE,MAAA;AAAA,EACrC;AACA,EAAA,OAAO,gBAAgB,KAAK,CAAA;AAC9B;AAIA,SAAS,gBAAgB,KAAA,EAAuB;AAC9C,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,MAAM,KAAA,EAAO;AACtB,IAAA,MAAM,EAAA,GAAK,EAAA,CAAG,WAAA,CAAY,CAAC,CAAA,IAAK,CAAA;AAChC,IAAA,IAAI,EAAA,IAAM,KAAM,KAAA,IAAS,CAAA;AAAA,SAAA,IAChB,EAAA,IAAM,MAAO,KAAA,IAAS,CAAA;AAAA,SAAA,IACtB,EAAA,IAAM,OAAQ,KAAA,IAAS,CAAA;AAAA,SAC3B,KAAA,IAAS,CAAA;AAAA,EAChB;AACA,EAAA,OAAO,KAAA;AACT;AAGO,SAAS,aAAa,OAAA,EAA0B;AACrD,EAAA,OAAO,SAAA,CAAU,IAAA,CAAK,SAAA,CAAU,OAAO,KAAK,EAAE,CAAA;AAChD;AAOA,SAAS,iBAAiB,GAAA,EAAqB;AAC7C,EAAA,OAAO,SAAA,CAAU,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA,GAAI,CAAA;AAC1C;AAKO,SAAS,gBAAA,CAAiB,KAAa,eAAA,EAAiC;AAC7E,EAAA,IAAI,eAAA,IAAmB,GAAG,OAAO,EAAA;AACjC,EAAA,IAAI,gBAAA,CAAiB,GAAG,CAAA,IAAK,eAAA,EAAiB,OAAO,GAAA;AACrD,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,IAAA,MAAM,OAAO,SAAA,CAAU,IAAA,CAAK,SAAA,CAAU,EAAE,CAAC,CAAA,GAAI,CAAA;AAC7C,IAAA,IAAI,IAAA,GAAO,OAAO,eAAA,EAAiB;AACnC,IAAA,GAAA,IAAO,EAAA;AACP,IAAA,IAAA,IAAQ,IAAA;AAAA,EACV;AACA,EAAA,OAAO,GAAA;AACT;AAWA,SAAS,aAAA,CAAc,OAAA,EAAuB,MAAA,EAAgB,IAAA,EAAyB;AACrF,EAAA,OAAO,YAAA,CAAa,OAAO,CAAA,GAAI,MAAA,EAAQ;AACrC,IAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,OAAA,EAAS,IAAA,EAAM,QAAQ,CAAA;AACnD,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,MAAM,OAAA,GAAU,QAAQ,GAAG,CAAA;AAC3B,IAAA,MAAM,IAAA,GAAO,MAAA,GAAS,YAAA,CAAa,EAAE,GAAG,SAAS,CAAC,GAAG,GAAG,EAAA,EAAI,CAAA;AAC5D,IAAA,MAAM,OAAO,gBAAA,CAAiB,OAAA,EAAS,KAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AACxD,IAAA,IAAI,SAAS,OAAA,EAAS;AACtB,IAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,IAAA;AAAA,EACjB;AACA,EAAA,OAAO,YAAA,CAAa,OAAO,CAAA,GAAI,MAAA,EAAQ;AACrC,IAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,OAAA,EAAS,IAAA,EAAM,OAAO,CAAA;AAClD,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,OAAO,QAAQ,GAAG,CAAA;AAAA,EACpB;AACF;AAIA,SAAS,eAAA,CACP,OAAA,EACA,IAAA,EACA,IAAA,EACoB;AACpB,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,EAAG;AACtC,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACnB,IAAA,MAAM,KAAA,GAAQ,QAAQ,GAAG,CAAA;AACzB,IAAA,MAAM,QAAA,GAAW,OAAO,KAAA,KAAU,QAAA;AAClC,IAAA,IAAI,IAAA,KAAS,QAAA,GAAW,CAAC,QAAA,GAAW,QAAA,EAAU;AAC9C,IAAA,MAAM,KAAA,GAAQ,aAAa,KAAK,CAAA;AAChC,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,SAAA,GAAY,KAAA;AACZ,MAAA,IAAA,GAAO,GAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAIA,SAAS,MAAS,KAAA,EAAa;AAC7B,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AACzC;AAKO,SAAS,QAAA,CAAS,OAAqB,MAAA,EAA8B;AAC1E,EAAA,IAAI,YAAA,CAAa,KAAK,CAAA,IAAK,MAAA,EAAQ,OAAO,KAAA;AAE1C,EAAA,MAAM,OAAA,GAAU,MAAM,KAAK,CAAA;AAG3B,EAAA,OAAA,CAAQ,WAAW,CAAA,GAAI,IAAA;AACvB,EAAA,MAAM,IAAA,GAAO,MAAe,YAAA,CAAa,OAAO,CAAA,IAAK,MAAA;AAIrD,EAAA,qBAAA,CAAsB,SAAS,IAAI,CAAA;AACnC,EAAA,IAAI,IAAA,IAAQ,OAAO,OAAA;AAGnB,EAAA,IAAI,UAAU,OAAA,EAAS,SAAS,CAAA,IAAK,IAAA,IAAQ,OAAO,OAAA;AAGpD,EAAA,IAAI,aAAA,CAAc,OAAO,CAAA,IAAK,IAAA,IAAQ,OAAO,OAAA;AAG7C,EAAA,IAAI,UAAU,OAAA,EAAS,OAAO,CAAA,IAAK,IAAA,IAAQ,OAAO,OAAA;AAClD,EAAA,IAAI,UAAU,OAAA,EAAS,MAAM,CAAA,IAAK,IAAA,IAAQ,OAAO,OAAA;AAIjD,EAAA,IAAI,eAAA,CAAgB,OAAA,EAAS,IAAI,CAAA,EAAG,OAAO,OAAA;AAI3C,EAAA,sBAAA,CAAuB,SAAS,MAAM,CAAA;AAGtC,EAAA,aAAA,CAAc,OAAA,EAAS,QAAQ,UAAU,CAAA;AACzC,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,WAAA,CAAY,OAAqB,MAAA,EAA8B;AAC7E,EAAA,IAAI,YAAA,CAAa,KAAK,CAAA,IAAK,MAAA,EAAQ,OAAO,KAAA;AAE1C,EAAA,MAAM,OAAA,GAAU,MAAM,KAAK,CAAA;AAC3B,EAAA,OAAA,CAAQ,WAAW,CAAA,GAAI,IAAA;AACvB,EAAA,IAAI,UAAU,OAAA,EAAS,YAAY,CAAA,IAAK,YAAA,CAAa,OAAO,CAAA,IAAK,MAAA;AAC/D,IAAA,OAAO,OAAA;AAET,EAAA,IAAI,OAAO,OAAA,CAAQ,SAAS,CAAA,KAAM,QAAA,EAAU;AAG1C,IAAA,MAAM,cAAA,GAAiB,EAAE,GAAG,OAAA,EAAS,SAAS,EAAA,EAAG;AACjD,IAAA,MAAM,IAAA,GAAO,MAAA,GAAS,YAAA,CAAa,cAAc,CAAA;AACjD,IAAA,OAAA,CAAQ,SAAS,CAAA,GAAI,gBAAA,CAAiB,OAAA,CAAQ,SAAS,GAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,EAC7E;AAGA,EAAA,aAAA,CAAc,OAAA,EAAS,QAAQ,QAAQ,CAAA;AACvC,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,aAAA,CACd,KAAA,EACA,MAAA,EACA,QAAA,EACkB;AAClB,EAAA,MAAM,SAA2B,EAAC;AAClC,EAAA,IAAI,UAA0B,EAAC;AAC/B,EAAA,IAAI,YAAA,GAAe,cAAA;AAEnB,EAAA,MAAM,OAAO,MAAY;AACvB,IAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,MAAA,CAAO,KAAK,OAAO,CAAA;AAC3C,IAAA,OAAA,GAAU,EAAC;AACX,IAAA,YAAA,GAAe,cAAA;AAAA,EACjB,CAAA;AAEA,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AAEvB,IAAA,MAAMC,IAAAA,GAAM,WAAA,CAAY,GAAA,EAAK,MAAA,GAAS,cAAc,CAAA;AAGpD,IAAA,MAAM,MAAM,YAAA,CAAaA,IAAG,KAAK,OAAA,CAAQ,MAAA,GAAS,IAAI,CAAA,GAAI,CAAA,CAAA;AAC1D,IAAA,MAAM,SAAA,GAAY,eAAe,GAAA,GAAM,MAAA;AACvC,IAAA,MAAM,SAAA,GAAY,QAAQ,MAAA,IAAU,QAAA;AACpC,IAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,KAAM,SAAA,IAAa,YAAY,IAAA,EAAK;AACzD,IAAA,OAAA,CAAQ,KAAKA,IAAG,CAAA;AAChB,IAAA,YAAA,IAAgB,OAAA,CAAQ,SAAS,CAAA,GAAI,YAAA,CAAaA,IAAG,CAAA,GAAI,CAAA,GAAI,aAAaA,IAAG,CAAA;AAAA,EAC/E;AACA,EAAA,IAAA,EAAK;AACL,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,cAAA,CAAe,OAAqB,MAAA,EAA8B;AAChF,EAAA,IAAI,YAAA,CAAa,KAAK,CAAA,IAAK,MAAA,EAAQ,OAAO,KAAA;AAE1C,EAAA,MAAM,OAAA,GAAU,MAAM,KAAK,CAAA;AAC3B,EAAA,OAAA,CAAQ,WAAW,CAAA,GAAI,IAAA;AACvB,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAC,CAAA,GACzC,OAAA,CAAQ,QAAQ,CAAA,GACjB,EAAC;AAIL,EAAA,MAAM,QAAA,GAAW,aAAa,EAAE,GAAG,SAAS,MAAA,EAAQ,EAAC,EAAG,CAAA,GAAI,cAAA;AAC5D,EAAA,IAAI,OAAO,QAAA,GAAW,cAAA;AACtB,EAAA,MAAM,OAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,IAAA,MAAM,MAAM,YAAA,CAAa,EAAE,KAAK,IAAA,CAAK,MAAA,GAAS,IAAI,CAAA,GAAI,CAAA,CAAA;AACtD,IAAA,IAAI,IAAA,GAAO,MAAM,MAAA,EAAQ;AACzB,IAAA,IAAA,CAAK,KAAK,EAAE,CAAA;AACZ,IAAA,IAAA,IAAQ,GAAA;AAAA,EACV;AACA,EAAA,OAAA,CAAQ,QAAQ,CAAA,GAAI,IAAA;AAGpB,EAAA,aAAA,CAAc,OAAA,EAAS,QAAQ,WAAW,CAAA;AAC1C,EAAA,OAAO,OAAA;AACT;AAMO,SAAS,UAAA,CAAW,OAAqB,MAAA,EAA8B;AAC5E,EAAA,IAAI,YAAA,CAAa,KAAK,CAAA,IAAK,MAAA,EAAQ,OAAO,KAAA;AAC1C,EAAA,MAAM,OAAA,GAAU,MAAM,KAAK,CAAA;AAC3B,EAAA,OAAA,CAAQ,WAAW,CAAA,GAAI,IAAA;AACvB,EAAA,aAAA,CAAc,OAAA,EAAS,QAAQ,YAAY,CAAA;AAC3C,EAAA,OAAO,OAAA;AACT;AAMA,SAAS,qBAAA,CAAsB,SAAuB,IAAA,EAA2B;AAC/E,EAAA,MAAM,SAAA,GAAY,QAAQ,aAAa,CAAA;AACvC,EAAA,MAAM,MAAA,GACJ,SAAA,IACA,OAAO,SAAA,KAAc,QAAA,IACrB,KAAA,CAAM,OAAA,CAAS,SAAA,CAAmC,MAAM,CAAA,GACnD,SAAA,CAAoC,MAAA,GACrC,MAAA;AACN,EAAA,IAAI,CAAC,MAAA,EAAQ;AACb,EAAA,OAAO,OAAO,MAAA,GAAS,CAAA,IAAK,CAAC,IAAA,EAAK,SAAU,KAAA,EAAM;AAClD,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,QAAQ,aAAa,CAAA;AACvD;AAGA,SAAS,SAAA,CAAU,SAAuB,GAAA,EAAsB;AAC9D,EAAA,IAAI,EAAE,GAAA,IAAO,OAAA,CAAA,EAAU,OAAO,KAAA;AAC9B,EAAA,OAAO,QAAQ,GAAG,CAAA;AAClB,EAAA,OAAO,IAAA;AACT;AAIA,SAAS,cAAc,OAAA,EAAgC;AACrD,EAAA,MAAM,QAAA,GAAW,QAAQ,UAAU,CAAA;AACnC,EAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,KAAa,UAAU,OAAO,KAAA;AACtD,EAAA,MAAM,GAAA,GAAM,QAAA;AACZ,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AAClC,IAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA,EAAG;AAC3B,MAAA,OAAO,IAAI,GAAG,CAAA;AACd,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ;AAAA,EACF;AACA,EAAA,IAAI,MAAA,CAAO,KAAK,GAAG,CAAA,CAAE,WAAW,CAAA,EAAG,OAAO,QAAQ,UAAU,CAAA;AAC5D,EAAA,OAAO,OAAA;AACT;AAKA,SAAS,eAAA,CAAgB,SAAuB,IAAA,EAA8B;AAC5E,EAAA,MAAM,MAAA,GAAS,gBAAgB,OAAO,CAAA;AACtC,EAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,MAAA,GAAS,YAAY,KAAK,CAAA;AAChC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,OAAO,OAAO,MAAA,GAAS,CAAA,IAAK,CAAC,IAAA,EAAK,SAAU,KAAA,EAAM;AAAA,EACpD;AACA,EAAA,OAAO,IAAA,EAAK;AACd;AAMA,SAAS,sBAAA,CAAuB,SAAuB,MAAA,EAAsB;AAC3E,EAAA,MAAM,MAAA,GAAS,gBAAgB,OAAO,CAAA;AACtC,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,MAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AACtB,MAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,CAAM,UAAU,QAAA,EAAU;AAC/C,MAAA,MAAM,KAAA,GAAQ,MAAM,OAAO,CAAA;AAC3B,MAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,KAAK,CAAA,GAAI,CAAC,CAAA;AAC7C,MAAA,IAAI,CAAC,UAAA,EAAY;AACjB,MAAA,UAAA,CAAW,KAAA,GAAQ,EAAA;AACnB,MAAA,MAAM,IAAA,GAAO,MAAA,GAAS,YAAA,CAAa,KAAK,CAAA;AACxC,MAAA,KAAA,CAAM,KAAA,GAAQ,iBAAiB,KAAA,CAAM,KAAA,EAAO,KAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,IAC/D;AAAA,EACF;AACA,EAAA,MAAM,OAAA,GAAU,QAAQ,SAAS,CAAA;AACjC,EAAA,IACE,WACA,OAAO,OAAA,KAAY,YACnB,OAAQ,OAAA,CAAoC,cAAc,QAAA,EAC1D;AACA,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAO,CAAA;AAC1B,IAAC,KAAA,CAAM,SAAS,CAAA,CAA4B,SAAA,GAAY,EAAA;AACzD,IAAA,MAAM,IAAA,GAAO,MAAA,GAAS,YAAA,CAAa,KAAK,CAAA;AACvC,IAAC,QAAkC,SAAA,GAAY,gBAAA;AAAA,MAC7C,OAAA,CAAkC,SAAA;AAAA,MACnC,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI;AAAA,KAClB;AAAA,EACF;AACF;AAQA,SAAS,gBAAgB,OAAA,EAAqD;AAC5E,EAAA,MAAM,SAAA,GAAY,QAAQ,WAAW,CAAA;AACrC,EAAA,IAAI,CAAC,SAAA,IAAa,OAAO,SAAA,KAAc,UAAU,OAAO,MAAA;AACxD,EAAA,MAAM,SAAU,SAAA,CAAmC,MAAA;AACnD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAK,MAAA,GAA8B,MAAA;AAChE;AAEA,SAAS,YAAY,KAAA,EAA8C;AACjE,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,EAAY,MAAA;AACjC,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,MAAA,GAAS,MAAA;AAC1C;;;AClcO,IAAM,cAAA,GAAiB,GAAA;AAYvB,IAAM,YAAN,MAAgB;AAAA,EAKrB,WAAA,CACmB,OAAA,EACA,SAAA,GAAoB,EAAA,EACpB,kBAA0B,GAAA,EAC3C;AAHiB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,eAAA,GAAA,eAAA;AAPnB,IAAA,IAAA,CAAQ,SAAyB,EAAC;AAElC,IAAA,IAAA,CAAQ,QAAA,GAAW,KAAA;AAAA,EAMhB;AAAA,EAEH,IAAI,MAAA,GAAiB;AACnB,IAAA,OAAO,KAAK,MAAA,CAAO,MAAA;AAAA,EACrB;AAAA,EAEA,IAAI,KAAA,EAA2B;AAC7B,IAAA,IAAI,KAAK,QAAA,EAAU;AACnB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,KAAK,CAAA;AACtB,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,IAAI,KAAK,MAAA,CAAO,MAAA,IAAU,IAAA,CAAK,SAAA,OAAgB,KAAA,EAAM;AAAA,EACvD;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAC9B,IAAA,MAAM,QAAQ,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,SAAS,EAAC;AACf,IAAA,IAAA,CAAK,QAAQ,KAAK,CAAA;AAAA,EACpB;AAAA,EAEQ,WAAA,GAAoB;AAC1B,IAAA,IAAI,IAAA,CAAK,KAAA,KAAU,MAAA,IAAa,IAAA,CAAK,mBAAmB,CAAA,EAAG;AAC3D,IAAA,IAAA,CAAK,QAAQ,WAAA,CAAY,MAAM,KAAK,KAAA,EAAM,EAAG,KAAK,eAAe,CAAA;AAEjE,IAAA,MAAM,IAAI,IAAA,CAAK,KAAA;AACf,IAAA,IAAI,OAAO,CAAA,CAAE,KAAA,KAAU,UAAA,IAAc,KAAA,EAAM;AAAA,EAC7C;AAAA;AAAA,EAGA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC5B,MAAA,aAAA,CAAc,KAAK,KAAK,CAAA;AACxB,MAAA,IAAA,CAAK,KAAA,GAAQ,MAAA;AAAA,IACf;AACA,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACb;AACF,CAAA;;;AC7DA,IAAM,QAAA,GAAqC;AAAA,EACzC,KAAA,EAAO,CAAA;AAAA,EACP,IAAA,EAAM,CAAA;AAAA,EACN,OAAA,EAAS,CAAA;AAAA,EACT,KAAA,EAAO,CAAA;AAAA,EACP,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,OAAA,GAAoC;AAAA,EACxC,IAAA,EAAM,SAAA;AAAA,EACN,GAAA,EAAK,OAAA;AAAA,EACL,OAAA,EAAS;AACX,CAAA;AAGO,SAAS,kBAAkB,KAAA,EAAyB;AACzD,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AACvC,EAAA,IAAI,KAAA,IAAS,UAAU,OAAO,KAAA;AAC9B,EAAA,OAAO,OAAA,CAAQ,KAAK,CAAA,IAAK,MAAA;AAC3B;AAGO,SAAS,gBAAgB,KAAA,EAAyB;AACvD,EAAA,OAAO,SAAS,KAAK,CAAA;AACvB;AAGO,SAAS,aAAA,CAAc,OAAiB,GAAA,EAAwB;AACrE,EAAA,OAAO,eAAA,CAAgB,KAAK,CAAA,IAAK,eAAA,CAAgB,GAAG,CAAA;AACtD;;;ACxBA,IAAMC,SAAAA,GAAW,EAAE,IAAA,EAAM,QAAA,EAAU,SAAS,WAAA,EAAY;AACxD,IAAM,aAAA,GAAgB,GAAA;AAgBf,SAAS,qBAAqB,KAAA,EAAsC;AACzE,EAAA,IAAI,OAAO,MAAM,KAAA,KAAU,QAAA,IAAY,MAAM,KAAA,CAAM,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA,EAAG;AACtE,IAAA,MAAM,IAAI,SAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,aAAA;AAAA,IACN,WAAW,MAAA,EAAO;AAAA,IAClB,WAAA,EAAa,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAAA,IACpC,WAAA,EAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IACpC,aAAa,KAAA,CAAM,WAAA;AAAA,IACnB,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,GAAI,MAAM,IAAA,GAAO,EAAE,MAAM,KAAA,CAAM,IAAA,KAAS,EAAC;AAAA,IACzC,GAAI,MAAM,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAO,GAAI,EAAC;AAAA,IAC7D,GAAI,KAAA,CAAM,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,MAAM,IAAI,CAAA,CAAE,MAAA,GAAS,CAAA,GAC/C,EAAE,SAAA,EAAW,UAAA,CAAW,MAAM,IAAI,CAAA,KAClC,EAAC;AAAA,IACL,GAAI,MAAM,OAAA,GAAU,EAAE,UAAU,KAAA,CAAM,OAAA,KAAY,EAAC;AAAA,IACnD,GAAA,EAAKA;AAAA,GACP;AACF;AAsBO,SAAS,2BAA2B,KAAA,EAA4C;AACrF,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,mBAAA;AAAA,IACN,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,WAAW,MAAA,EAAO;AAAA,IAClB,GAAI,KAAA,CAAM,UAAA,KAAe,MAAA,GACrB,EAAE,WAAA,EAAa,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA,EAAE,GACxC,EAAC;AAAA,IACL,WAAA,EAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IACpC,aAAa,KAAA,CAAM,WAAA;AAAA,IACnB,GAAI,MAAM,QAAA,GAAW,EAAE,WAAW,KAAA,CAAM,QAAA,KAAa,EAAC;AAAA,IACtD,GAAI,MAAM,OAAA,GAAU,EAAE,UAAU,KAAA,CAAM,OAAA,KAAY,EAAC;AAAA,IACnD,GAAI,MAAM,KAAA,GAAQ,EAAE,OAAO,KAAA,CAAM,KAAA,KAAU,EAAC;AAAA,IAC5C,GAAI,MAAM,UAAA,KAAe,MAAA,GAAY,EAAE,WAAA,EAAa,KAAA,CAAM,UAAA,EAAW,GAAI,EAAC;AAAA,IAC1E,GAAI,MAAM,OAAA,GAAU,EAAE,UAAU,KAAA,CAAM,OAAA,KAAY,EAAC;AAAA,IACnD,GAAA,EAAKA;AAAA,GACP;AACF;AAIA,SAAS,WACP,IAAA,EACwC;AACxC,EAAA,OAAO,MAAA,CAAO,QAAQ,IAAI,CAAA,CAAE,IAAI,CAAC,CAAC,IAAA,EAAM,KAAK,CAAA,MAAO;AAAA,IAClD,IAAA;AAAA,IACA,KAAA,EAAO,eAAe,IAAI,CAAA,GAAI,WAAW,QAAA,CAAS,SAAA,CAAU,KAAK,CAAC;AAAA,GACpE,CAAE,CAAA;AACJ;AAEA,SAAS,UAAU,KAAA,EAAwB;AACzC,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,IAAK,OAAO,KAAK,CAAA;AAAA,EAC9C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,OAAO,KAAK,CAAA;AAAA,EACrB;AACF;AAEA,SAAS,SAAS,KAAA,EAAuB;AACvC,EAAA,OAAO,KAAA,CAAM,SAAS,aAAA,GAAgB,CAAA,EAAG,MAAM,KAAA,CAAM,CAAA,EAAG,aAAa,CAAC,CAAA,MAAA,CAAA,GAAM,KAAA;AAC9E;AAEA,SAAS,OAAO,KAAA,EAAuB;AACrC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,GAAG,CAAA,GAAI,GAAA;AACnC;;;ACrGO,IAAM,kCAAA,GAAqC,GAAA;AAsD3C,SAAS,eAAe,OAAA,EAA8C;AAC3E,EAAA,OAAO;AAAA,IACL,WAAA,EAAA,CAAc,QAAQ,WAAA,IAAe,EAAA,EAAI,MAAK,CAAE,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAAA,IAClE,KAAA,EAAA,CAAQ,OAAA,CAAQ,KAAA,IAAS,EAAA,EAAI,IAAA,EAAK;AAAA,IAClC,SAAA,EAAA,CAAY,OAAA,CAAQ,SAAA,IAAa,EAAA,EAAI,IAAA,EAAK;AAAA,IAC1C,SAAA,EAAA,CAAY,OAAA,CAAQ,SAAA,IAAa,EAAA,EAAI,IAAA,EAAK;AAAA,IAC1C,WAAA,EAAa,QAAQ,WAAA,IAAe,YAAA;AAAA;AAAA;AAAA,IAGpC,OAAA,EAAS,OAAA,CAAQ,OAAA,IAAW,aAAA,EAAc;AAAA,IAC1C,UAAA,EAAY,SAAA,CAAU,OAAA,CAAQ,UAAU,CAAA;AAAA,IACxC,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,cAAc,OAAA,CAAQ,YAAA;AAAA,IACtB,KAAA,EAAO,QAAQ,KAAA,IAAS,KAAA;AAAA,IACxB,WAAA,EAAa,QAAQ,WAAA,IAAe,IAAA;AAAA,IACpC,WAAA,EAAa,QAAQ,WAAA,IAAe,IAAA;AAAA,IACpC,eAAA,EAAiB;AAAA,MACf,KAAA,EAAO,OAAA,CAAQ,eAAA,EAAiB,KAAA,IAAS,IAAA;AAAA,MACzC,UAAA,EAAY,OAAA,CAAQ,eAAA,EAAiB,UAAA,IAAc,IAAA;AAAA,MACnD,OAAA,EAAS,OAAA,CAAQ,eAAA,EAAiB,OAAA,IAAW,IAAA;AAAA,MAC7C,IAAA,EAAM,OAAA,CAAQ,eAAA,EAAiB,IAAA,IAAQ;AAAA,KACzC;AAAA,IACA,cAAA,EAAgB,QAAQ,cAAA,IAAkB,EAAA;AAAA,IAC1C,OAAA,EAAS,QAAQ,OAAA,IAAW,KAAA;AAAA,IAC5B,cAAA,EAAgB,QAAQ,cAAA,IAAkB,IAAA;AAAA,IAC1C,QAAA,EAAU,UAAA,CAAW,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAAA,IACzC,kBAAA,EAAoB,OAAA,CAAQ,kBAAA,IAAsB,EAAC;AAAA,IACnD,cAAA,EAAgB,QAAQ,cAAA,IAAkB,IAAA;AAAA,IAC1C,cAAA,EAAgB,QAAQ,cAAA,IAAkB,KAAA;AAAA,IAC1C,MAAA,EAAQ,QAAQ,MAAA,IAAU,KAAA;AAAA,IAC1B,mBAAA,EAAqB,QAAQ,mBAAA,IAAuB,IAAA;AAAA,IACpD,qBAAqB,OAAA,CAAQ,mBAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAO7B,sBAAA,EAAwB,QAAQ,sBAAA,IAA0B,GAAA;AAAA,IAC1D,qBAAA,EAAuB,UAAA,CAAW,OAAA,CAAQ,qBAAA,EAAuB,GAAI,CAAA;AAAA,IACrE,WAAA,EAAa,QAAQ,WAAA,IAAe,IAAA;AAAA,IACpC,cAAA,EAAgB,SAAA,CAAU,OAAA,CAAQ,cAAc,CAAA;AAAA,IAChD,aAAA,EAAe,UAAA,CAAW,OAAA,CAAQ,aAAA,EAAe,EAAE,CAAA;AAAA,IACnD,mBAAA,EAAqB,QAAQ,mBAAA,IAAuB,GAAA;AAAA,IACpD,YAAA,EAAc,iBAAA,CAAkB,OAAA,CAAQ,YAAA,IAAgB,MAAM,CAAA;AAAA,IAC9D,qBAAA,EAAuB,UAAA,CAAW,OAAA,CAAQ,qBAAA,EAAuB,GAAG,CAAA;AAAA,IACpE,sBAAA,EAAwB,QAAQ,sBAAA,IAA0B,KAAA;AAAA,IAC1D,uBAAA,EAAyB,QAAQ,uBAAA,IAA2B,KAAA;AAAA,IAC5D,mBAAA,EAAqB,QAAQ,mBAAA,IAAuB,IAAA;AAAA,IACpD,uBAAA,EAAyB,cAAA,CAAe,OAAA,CAAQ,uBAAuB,CAAA;AAAA,IACvE,qBAAA,EAAuB,UAAA,CAAW,OAAA,CAAQ,qBAAA,EAAuB,CAAC,CAAA;AAAA,IAClE,oBAAA,EAAsB,UAAA,CAAW,OAAA,CAAQ,oBAAA,EAAsB,GAAI,CAAA;AAAA,IACnE,UAAA,EAAY,QAAQ,UAAA,IAAc,IAAA;AAAA,IAClC,eAAA,EAAiB,UAAA,CAAW,OAAA,CAAQ,eAAA,EAAiB,GAAG,CAAA;AAAA,IACxD,cAAA,EAAgB,QAAQ,cAAA,IAAkB,KAAA;AAAA,IAC1C,mBAAA,EAAqB,SAAA,CAAU,OAAA,CAAQ,mBAAmB,CAAA;AAAA,IAC1D,qBAAA,EAAuB,QAAQ,qBAAA,IAAyB,KAAA;AAAA,IACxD,uBAAA,EAAyB,OAAA,CAAQ,uBAAA,IAA2B,EAAC;AAAA,IAC7D,OAAA,EAAS,QAAQ,OAAA,IAAW;AAAA,GAC9B;AACF;AAEA,SAAS,UAAU,IAAA,EAAkC;AACnD,EAAA,IAAI,SAAS,MAAA,IAAa,MAAA,CAAO,KAAA,CAAM,IAAI,GAAG,OAAO,CAAA;AACrD,EAAA,IAAI,IAAA,GAAO,GAAG,OAAO,CAAA;AACrB,EAAA,IAAI,IAAA,GAAO,GAAG,OAAO,CAAA;AACrB,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,UAAA,CAAW,OAA2B,QAAA,EAA0B;AACvE,EAAA,IAAI,KAAA,KAAU,UAAa,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,IAAK,KAAA,IAAS,GAAG,OAAO,QAAA;AACrE,EAAA,OAAO,KAAA;AACT;AAIA,SAAS,eAAe,KAAA,EAAmC;AACzD,EAAA,IAAI,UAAU,MAAA,IAAa,MAAA,CAAO,MAAM,KAAK,CAAA,IAAK,QAAQ,CAAA,EAAG;AAC3D,IAAA,OAAO,kCAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAOO,SAAS,oBAAA,CAAqB,GAAoB,CAAA,EAA6B;AACpF,EAAA,OAAO,SAAA,CAAU,GAAG,CAAC,CAAA;AACvB;AAEA,SAAS,SAAA,CAAU,GAAY,CAAA,EAAqB;AAClD,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,IAAA;AACpB,EAAA,IAAI,OAAO,MAAM,QAAA,IAAY,CAAA,KAAM,QAAQ,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,IAAA,EAAM;AAC9E,IAAA,OAAO,KAAA;AAAA,EACT;AAIA,EAAA,IAAI,CAAA,YAAa,MAAA,IAAU,CAAA,YAAa,MAAA,EAAQ;AAC9C,IAAA,OACE,CAAA,YAAa,MAAA,IACb,CAAA,YAAa,MAAA,IACb,CAAA,CAAE,WAAW,CAAA,CAAE,MAAA,IACf,CAAA,CAAE,KAAA,KAAU,CAAA,CAAE,KAAA;AAAA,EAElB;AACA,EAAA,IAAI,MAAM,OAAA,CAAQ,CAAC,KAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG;AACxC,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAC,KAAK,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,QAAQ,OAAO,KAAA;AAC5E,IAAA,OAAO,CAAA,CAAE,KAAA,CAAM,CAAC,IAAA,EAAM,KAAA,KAAU,UAAU,IAAA,EAAM,CAAA,CAAE,KAAK,CAAC,CAAC,CAAA;AAAA,EAC3D;AACA,EAAA,MAAM,IAAA,GAAO,CAAA;AACb,EAAA,MAAM,IAAA,GAAO,CAAA;AACb,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAC9B,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,KAAA,CAAM,MAAA,EAAQ,OAAO,KAAA;AAC1C,EAAA,OAAO,KAAA,CAAM,KAAA;AAAA,IACX,CAAC,GAAA,KACC,MAAA,CAAO,SAAA,CAAU,eAAe,IAAA,CAAK,IAAA,EAAM,GAAG,CAAA,IAC9C,UAAU,IAAA,CAAK,GAAG,CAAA,EAAG,IAAA,CAAK,GAAG,CAAC;AAAA,GAClC;AACF;AAIO,IAAM,mBAAA,GAAsB,MAAA;AAG5B,SAAS,cAAc,KAAA,EAAwB;AACpD,EAAA,OAAO,KAAA,CAAM,WAAW,mBAAmB,CAAA;AAC7C;AAYO,SAAS,oBAAA,CACd,SACA,OAAA,EACsB;AACtB,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAO,OAAA,CAAQ,YAAY,EAAE,IAAA,EAAM,OAAO,SAAA,EAAW,OAAA,CAAQ,WAAU,GAAI,IAAA;AAAA,EAC7E;AACA,EAAA,IAAI,OAAA,CAAQ,OAAO,OAAO,EAAE,MAAM,QAAA,EAAU,MAAA,EAAQ,QAAQ,KAAA,EAAM;AAClE,EAAA,IAAI,OAAA,CAAQ,WAAW,OAAO,EAAE,MAAM,KAAA,EAAO,SAAA,EAAW,QAAQ,SAAA,EAAU;AAC1E,EAAA,OAAO,IAAA;AACT;AAIO,SAAS,cAAA,CACd,SACA,OAAA,EACe;AACf,EAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,EAAS,OAAO,iDAAA;AAC7B,EAAA,IAAI,CAAC,OAAA,CAAQ,WAAA,EAAa,OAAO,sBAAA;AACjC,EAAA,IAAI,CAAC,OAAA,CAAQ,SAAA,EAAW,OAAO,oBAAA;AAC/B,EAAA,IAAI,oBAAA,CAAqB,OAAA,EAAS,OAAO,CAAA,KAAM,IAAA,EAAM;AACnD,IAAA,OAAO,UACH,iGAAA,GACA,gBAAA;AAAA,EACN;AACA,EAAA,IACE,QAAQ,WAAA,KAAgB,YAAA,IACxB,QAAQ,WAAA,CAAY,UAAA,CAAW,SAAS,CAAA,EACxC;AACA,IAAA,OAAO,4CAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,SAAA,CAAU,SAA0B,OAAA,EAA2B;AAC7E,EAAA,OAAO,cAAA,CAAe,OAAA,EAAS,OAAO,CAAA,KAAM,IAAA;AAC9C;AAGO,SAAS,UAAU,OAAA,EAAkC;AAC1D,EAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,WAAW,CAAA,iBAAA,EAAoB,QAAQ,SAAS,CAAA,OAAA,CAAA;AACpE;AAKO,SAAS,SAAS,OAAA,EAAkC;AACzD,EAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,WAAW,CAAA,KAAA,EAAQ,QAAQ,SAAS,CAAA,MAAA,CAAA;AACxD;AAGO,SAAS,QAAQ,OAAA,EAAkC;AACxD,EAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,WAAW,CAAA,iBAAA,EAAoB,QAAQ,SAAS,CAAA,KAAA,CAAA;AACpE;AAGO,SAAS,WAAW,OAAA,EAAkC;AAC3D,EAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,WAAW,CAAA,iBAAA,EAAoB,QAAQ,SAAS,CAAA,QAAA,CAAA;AACpE;AAGO,SAAS,aAAa,OAAA,EAAkC;AAC7D,EAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,WAAW,CAAA,iBAAA,EAAoB,QAAQ,SAAS,CAAA,UAAA,CAAA;AACpE;AAGO,SAAS,UAAU,OAAA,EAAkC;AAC1D,EAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,WAAW,CAAA,iBAAA,EAAoB,QAAQ,SAAS,CAAA,QAAA,CAAA;AACpE;AAKO,SAAS,aAAa,OAAA,EAAkC;AAC7D,EAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,WAAW,CAAA,iBAAA,EAAoB,QAAQ,SAAS,CAAA,WAAA,CAAA;AACpE;AAGO,SAAS,aAAa,OAAA,EAA8C;AACzE,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,GAAA,CAAI,OAAA,CAAQ,WAAW,CAAA,CAAE,IAAA;AAAA,EACtC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;;;AC1QA,IAAM,QAAA,GAAW;AAAA,EACf,YAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA;AAKO,SAAS,aAAA,CAAc,SAAA,GAA+B,EAAC,EAAoB;AAChF,EAAA,MAAM,OAAA,GAA2B;AAAA,IAC/B,UAAU,MAAA,EAAO;AAAA,IACjB,UAAU,QAAA,CAAS,QAAA;AAAA,IACnB,IAAA,EAAM,SAAA,CAAU,IAAA,IAAQ,QAAA,CAAS,QAAA;AAAA,IACjC,WAAA,EAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACtC;AAEA,EAAA,IAAI,QAAA,CAAS,QAAA,EAAU,OAAA,CAAQ,QAAA,GAAW,QAAA,CAAS,QAAA;AAInD,EAAA,IAAI,MAAA,CAAO,UAAA,GAAa,CAAA,EAAG,OAAA,CAAQ,eAAe,MAAA,CAAO,UAAA;AAEzD,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,QAAA,CAAS,MAAM,CAAA;AAClD,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAC5B,IAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,GAAG,CAAA,GAAI,KAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,OAAA;AACT;;;AC1DO,SAAS,mBACd,OAAA,EACqC;AACrC,EAAA,IAAI,CAAC,SAAA,EAAU,EAAG,OAAO,MAAA;AAEzB,EAAA,MAAM,OAAA,GAAmC;AAAA,IACvC,KAAK,OAAA,GAAU,QAAA,CAAS,IAAA,GAAO,QAAA,CAAS,SAAS,QAAA,CAAS,QAAA;AAAA,IAC1D,OAAA,EAAS,EAAE,YAAA,EAAc,SAAA,CAAU,SAAA;AAAU,GAC/C;AACA,EAAA,MAAM,QAAA,GAAW,OAAO,QAAA,KAAa,WAAA,GAAc,SAAS,QAAA,GAAW,EAAA;AACvE,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAA,CAAQ,UAAU,CAAA,GAAI,OAAA,GAAU,QAAA,GAAW,WAAW,QAAQ,CAAA;AAAA,EAChE;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,WAAW,IAAA,EAAsB;AACxC,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,IAAI,CAAA;AACxB,IAAA,OAAO,GAAA,CAAI,SAAS,GAAA,CAAI,QAAA;AAAA,EAC1B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,IAAA,EAAM,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,IAAA;AAAA,EACvD;AACF;;;ACKO,SAAS,kBAAA,GAA+C;AAC7D,EAAA,IAAI,CAAC,MAAA,EAAO,EAAG,OAAO,MAAA;AACtB,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,gBAAe,EAAG,iBAAA;AAC/B,IAAA,OAAO,OAAO,IAAA,KAAS,UAAA,GAAa,IAAI,MAAK,GAAI,KAAA,CAAA;AAAA,EACnD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAEA,SAAS,cAAA,GAAyC;AAChD,EAAA,MAAM,aAAc,OAAA,CAA+B,gBAAA;AACnD,EAAA,IAAI,OAAO,UAAA,KAAe,UAAA,EAAY,OAAO,MAAA;AAC7C,EAAA,OAAO,WAAW,aAAa,CAAA;AACjC;;;AC5BA,IAAI,MAAA,GAAS,KAAA;AAKN,SAAS,qBAAA,GAAiC;AAC/C,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,UAAU,KAAA,EAAwB;AAChD,EAAA,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,IAAA,GAAO,OAAA;AAC/C;AAEO,IAAM,cAAN,MAAkB;AAAA,EAGvB,YAAY,IAAA,EAAqB;AAC/B,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,UAAA,GAAsB;AACxB,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,CAAO,KAAA,EAAwB,OAAA,GAA6B,EAAC,EAAS;AACpE,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,IAAQ,MAAA,EAAQ;AAC1B,IAAA,MAAA,GAAS,IAAA;AACT,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,IAAA,CAAK,OAAO,OAAO,CAAA;AAAA,IAC1B,CAAA,CAAA,MAAQ;AAAA,IAER,CAAA,SAAE;AACA,MAAA,MAAA,GAAS,KAAA;AAAA,IACX;AAAA,EACF;AACF,CAAA;;;AC/CO,IAAM,aAAN,MAAiB;AAAA,EAQtB,YAAY,KAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACxC,IAAA,IAAA,CAAK,UAAU,KAAA,CAAM,OAAA;AACrB,IAAA,IAAA,CAAK,WAAW,KAAA,CAAM,QAAA;AACtB,IAAA,IAAA,CAAK,IAAA,GAAO,MAAM,IAAA,IAAQ,SAAA;AAC1B,IAAA,IAAA,CAAK,KAAA,GAAQ,MAAM,KAAA,IAAS,MAAA;AAC5B,IAAA,IAAA,CAAK,IAAA,GACH,KAAA,CAAM,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,GAAI,MAAA;AAAA,EAC3E;AAAA,EAEA,MAAA,GAAuB;AACrB,IAAA,MAAM,IAAA,GAAqB;AAAA,MACzB,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,OAAO,IAAA,CAAK;AAAA,KACd;AACA,IAAA,IAAI,KAAK,QAAA,KAAa,MAAA,EAAW,IAAA,CAAK,UAAU,IAAI,IAAA,CAAK,QAAA;AACzD,IAAA,IAAI,KAAK,OAAA,KAAY,MAAA,EAAW,IAAA,CAAK,SAAS,IAAI,IAAA,CAAK,OAAA;AACvD,IAAA,IAAI,KAAK,IAAA,KAAS,MAAA,EAAW,IAAA,CAAK,MAAM,IAAI,IAAA,CAAK,IAAA;AACjD,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAA;AAGO,IAAM,mBAAN,MAAuB;AAAA,EAG5B,WAAA,CAA6B,WAAmB,EAAA,EAAI;AAAvB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAF7B,IAAA,IAAA,CAAQ,QAAsB,EAAC;AAAA,EAEsB;AAAA;AAAA,EAGrD,IAAI,OAAA,GAAkB;AACpB,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA,EAEA,IAAI,MAAA,GAAiB;AACnB,IAAA,OAAO,KAAK,KAAA,CAAM,MAAA;AAAA,EACpB;AAAA,EAEA,IAAI,KAAA,EAAyB;AAC3B,IAAA,IAAI,IAAA,CAAK,YAAY,CAAA,EAAG;AACxB,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,KAAK,CAAA;AACrB,IAAA,OAAO,KAAK,KAAA,CAAM,MAAA,GAAS,KAAK,QAAA,EAAU,IAAA,CAAK,MAAM,KAAA,EAAM;AAAA,EAC7D;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,QAAQ,EAAC;AAAA,EAChB;AAAA,EAEA,MAAA,GAAuB;AACrB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAK,CAAA;AAAA,EACvB;AAAA;AAAA,EAGA,MAAA,GAA8B;AAC5B,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACpC,IAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,EAAE;AAAA,EACrD;AACF,CAAA;;;ACrEO,IAAM,KAAA,GAAN,MAAM,MAAA,CAAM;AAAA,EA8BjB,WAAA,CAAY,iBAAiB,EAAA,EAAI;AA1BjC,IAAA,IAAA,CAAQ,OAA+B,EAAC;AACxC,IAAA,IAAA,CAAQ,QAAiC,EAAC;AAC1C,IAAA,IAAA,CAAQ,WAAoD,EAAC;AAyB3D,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,gBAAA,CAAiB,cAAc,CAAA;AAAA,EACxD;AAAA,EAEA,QAAQ,IAAA,EAAgC;AACtC,IAAA,IAAA,CAAK,OAAO,IAAA,KAAS,IAAA,GAAO,MAAA,GAAY,EAAE,GAAG,IAAA,EAAK;AAAA,EACpD;AAAA;AAAA;AAAA,EAIA,IAAI,MAAA,GAA6B;AAC/B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,IAAA,GAAO,IAAI,CAAA;AAC3B,IAAA,OAAO,OAAO,MAAA,IAAa,EAAA,KAAO,IAAA,GAAO,MAAA,GAAY,OAAO,EAAE,CAAA;AAAA,EAChE;AAAA,EAEA,MAAA,CAAO,KAAa,KAAA,EAAqB;AACvC,IAAA,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,GAAI,KAAA;AAAA,EACnB;AAAA,EAEA,QAAQ,IAAA,EAAoC;AAC1C,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,EAC/B;AAAA,EAEA,QAAA,CAAS,KAAa,KAAA,EAAsB;AAC1C,IAAA,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA;AAAA,EACpB;AAAA,EAEA,UAAA,CAAW,KAAa,KAAA,EAAsC;AAC5D,IAAA,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,GAAI,KAAA;AAAA,EACvB;AAAA,EAEA,WAAW,EAAA,EAA8B;AACvC,IAAA,IAAA,CAAK,OAAA,GAAU,EAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,GAAA,EAML;AACP,IAAA,IAAA,CAAK,UAAU,GAAA,CAAI,OAAA;AACnB,IAAA,IAAA,CAAK,gBAAgB,GAAA,CAAI,QAAA;AACzB,IAAA,IAAA,CAAK,eAAe,GAAA,CAAI,OAAA;AACxB,IAAA,IAAA,CAAK,aAAa,GAAA,CAAI,UAAA;AACtB,IAAA,IAAA,CAAK,eAAe,GAAA,CAAI,OAAA;AAAA,EAC1B;AAAA,EAEA,mBAAmB,EAAA,EAA8B;AAC/C,IAAA,IAAA,CAAK,eAAA,GAAkB,EAAA;AAAA,EACzB;AAAA;AAAA,EAGA,WAAW,OAAA,EAA+C;AACxD,IAAA,IAAA,CAAK,UAAU,OAAA,KAAY,IAAA,GAAO,MAAA,GAAY,EAAE,GAAG,OAAA,EAAQ;AAAA,EAC7D;AAAA,EAEA,cAAc,KAAA,EAA8B;AAC1C,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,IAAA,CAAK,IAAA,GAAiC,EAAC,EAAU;AAC/C,IAAA,MAAM,MAAA,GAAS,IAAI,MAAA,CAAM,IAAA,CAAK,YAAY,OAAO,CAAA;AACjD,IAAA,MAAA,CAAO,OAAO,IAAA,CAAK,IAAA,GAAO,EAAE,GAAG,IAAA,CAAK,MAAK,GAAI,MAAA;AAC7C,IAAA,MAAA,CAAO,IAAA,GAAO,EAAE,GAAG,IAAA,CAAK,IAAA,EAAK;AAC7B,IAAA,MAAA,CAAO,KAAA,GAAQ,EAAE,GAAG,IAAA,CAAK,KAAA,EAAM;AAC/B,IAAA,MAAA,CAAO,QAAA,GAAW,aAAA,CAAc,IAAA,CAAK,QAAQ,CAAA;AAC7C,IAAA,MAAA,CAAO,UAAU,IAAA,CAAK,OAAA,GAAU,EAAE,GAAG,IAAA,CAAK,SAAQ,GAAI,MAAA;AACtD,IAAA,MAAA,CAAO,kBAAkB,IAAA,CAAK,eAAA;AAC9B,IAAA,IAAI,EAAE,IAAA,CAAK,UAAA,IAAc,KAAA,CAAA,EAAQ;AAC/B,MAAA,MAAA,CAAO,UAAU,IAAA,CAAK,OAAA;AAGtB,MAAA,MAAA,CAAO,gBAAgB,IAAA,CAAK,aAAA;AAC5B,MAAA,MAAA,CAAO,eAAe,IAAA,CAAK,YAAA;AAC3B,MAAA,MAAA,CAAO,aAAa,IAAA,CAAK,UAAA;AACzB,MAAA,MAAA,CAAO,eAAe,IAAA,CAAK,YAAA;AAC3B,MAAA,KAAA,MAAW,KAAA,IAAS,KAAK,WAAA,CAAY,MAAA,IAAU,MAAA,CAAO,WAAA,CAAY,IAAI,KAAK,CAAA;AAAA,IAC7E;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,MAAA;AACZ,IAAA,IAAA,CAAK,OAAO,EAAC;AACb,IAAA,IAAA,CAAK,QAAQ,EAAC;AACd,IAAA,IAAA,CAAK,WAAW,EAAC;AACjB,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAA;AACrB,IAAA,IAAA,CAAK,YAAA,GAAe,MAAA;AACpB,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAClB,IAAA,IAAA,CAAK,YAAA,GAAe,MAAA;AACpB,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAA,CAAY,IAAA,GAA8B,EAAC,EAAiB;AAC1D,IAAA,MAAM,OAAqB,EAAC;AAE5B,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,OAAA,IAAW,KAAA,GAAS,EAAE,GAAG,IAAA,CAAK,IAAA,EAAK,GAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAC1E,MAAA,IAAI,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA,GAAI,IAAA;AAAA,IAC3B;AACA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AACrE,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AACxE,IAAA,IAAI,OAAO,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA,CAAE,SAAS,CAAA,EAAG;AACzC,MAAA,IAAA,CAAK,UAAU,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AAAA,IACxC;AACA,IAAA,IAAI,KAAK,OAAA,EAAS,IAAA,CAAK,SAAS,CAAA,GAAI,KAAA,CAAM,KAAK,OAAO,CAAA;AACtD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,MAAA,EAAO;AACvC,IAAA,IAAI,MAAA,EAAQ,IAAA,CAAK,aAAa,CAAA,GAAI,MAAA;AAElC,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,OAAO,IAAA,EAAoE;AAClF,EAAA,OAAO,QAAQ,IAAA,GAAO,EAAE,IAAI,IAAA,CAAK,IAAI,GAAE,GAAI,MAAA;AAC7C;AAIA,SAAS,cACP,QAAA,EACyC;AACzC,EAAA,MAAM,MAA+C,EAAC;AACtD,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,EAAG,GAAA,CAAI,GAAG,CAAA,GAAI,EAAE,GAAG,QAAA,CAAS,GAAG,CAAA,EAAE;AACvE,EAAA,OAAO,GAAA;AACT;;;AC/KA,IAAM,YAAA,GAA6B;AAAA,EACjC,aAAA;AAAA,EACA,aAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA;AAIA,IAAM,iCAAiB,IAAI,GAAA,CAAgB,CAAC,UAAA,EAAY,SAAS,CAAC,CAAA;AAG3D,SAAS,kBAAA,GAAoC;AAClD,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,CAAA;AAAA,IACV,IAAA,EAAM,CAAA;AAAA,IACN,OAAA,EAAS,CAAA;AAAA,IACT,MAAA,EAAQ,CAAA;AAAA,IACR,OAAA,EAAS,CAAA;AAAA,IACT,SAAS,WAAA;AAAY,GACvB;AACF;AAEA,SAAS,WAAA,GAA0C;AACjD,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,CAAA;AAAA,IACb,WAAA,EAAa,CAAA;AAAA,IACb,KAAA,EAAO,CAAA;AAAA,IACP,UAAA,EAAY,CAAA;AAAA,IACZ,QAAA,EAAU,CAAA;AAAA,IACV,OAAA,EAAS;AAAA,GACX;AACF;AAEO,IAAM,QAAN,MAAY;AAAA,EAAZ,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,MAAA,GAAkC;AAAA,MACxC,QAAA,EAAU,CAAA;AAAA,MACV,IAAA,EAAM,CAAA;AAAA,MACN,OAAA,EAAS,CAAA;AAAA,MACT,MAAA,EAAQ,CAAA;AAAA,MACR,OAAA,EAAS;AAAA,KACX;AAEA,IAAA,IAAA,CAAQ,UAAsC,WAAA,EAAY;AAAA,EAAA;AAAA;AAAA,EAG1D,UAAU,GAAA,EAAoB;AAC5B,IAAA,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA,IAAK,CAAA;AAAA,EACtB;AAAA;AAAA,EAGA,IAAI,GAAA,EAAsB;AACxB,IAAA,OAAO,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,MAAA,EAA0B;AAC/B,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,IAAK,CAAA;AACxB,IAAA,IAAI,eAAe,GAAA,CAAI,MAAM,CAAA,EAAG,IAAA,CAAK,OAAO,MAAA,IAAU,CAAA;AAAA,SACjD,IAAA,CAAK,OAAO,OAAA,IAAW,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA,EAIA,aAAA,GAAsB;AACpB,IAAA,IAAA,CAAK,OAAO,MAAA,IAAU,CAAA;AACtB,IAAA,IAAA,CAAK,OAAO,OAAA,IAAW,CAAA;AAAA,EACzB;AAAA;AAAA,EAGA,QAAA,GAA0B;AACxB,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,SAAS,EAAE,GAAG,IAAA,CAAK,OAAA,EAAQ,EAAE;AAAA,EACxD;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,KAAA,MAAW,GAAA,IAAO,OAAO,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA,EAAgB,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA,GAAI,CAAA;AAC5E,IAAA,KAAA,MAAW,MAAA,IAAU,YAAA,EAAc,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,GAAI,CAAA;AAAA,EAC5D;AACF,CAAA;;;AC7EA,IAAM,IAAA,GAAO,eAAA;AACb,IAAM,KAAA,GAAQ,gBAAA;AACd,IAAM,KAAA,GAAQ,gBAAA;AACd,IAAM,UAAA,GAAa,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA;AAChC,IAAM,WAAA,GAAc,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA;AAO1B,SAAS,iBAAiB,KAAA,EAAsD;AACrF,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,EAAK,CAAE,MAAM,GAAG,CAAA;AACpC,EAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AAE7B,EAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AACvB,EAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AACvB,EAAA,MAAM,QAAA,GAAW,MAAM,CAAC,CAAA;AACxB,EAAA,MAAM,KAAA,GAAQ,MAAM,CAAC,CAAA;AAErB,EAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA,IAAK,OAAA,KAAY,MAAM,OAAO,IAAA;AAGpD,EAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,KAAA,CAAM,MAAA,KAAW,GAAG,OAAO,IAAA;AACnD,EAAA,IAAI,CAAC,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA,IAAK,OAAA,KAAY,YAAY,OAAO,IAAA;AAC3D,EAAA,IAAI,CAAC,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,IAAK,QAAA,KAAa,aAAa,OAAO,IAAA;AAC9D,EAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,KAAK,GAAG,OAAO,IAAA;AAE9B,EAAA,OAAO,EAAE,SAAS,QAAA,EAAU,OAAA,EAAA,CAAU,SAAS,KAAA,EAAO,EAAE,CAAA,GAAI,CAAA,MAAU,CAAA,EAAK;AAC7E;AAIO,SAAS,iBAAA,CACd,OAAA,EACAC,OAAAA,EACA,OAAA,EACQ;AACR,EAAA,OAAO,MAAM,OAAO,CAAA,CAAA,EAAIA,OAAM,CAAA,CAAA,EAAI,OAAA,GAAU,OAAO,IAAI,CAAA,CAAA;AACzD;AAIA,IAAM,cAAA,GAAiB,oDAAA;AAEvB,SAAS,wBAAwB,MAAA,EAAyB;AACxD,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAC7B,EAAA,IAAI,EAAA,IAAM,GAAG,OAAO,KAAA;AACpB,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC9B,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,KAAA,CAAM,EAAA,GAAK,CAAC,CAAA;AAC/B,EAAA,IAAI,CAAC,cAAA,CAAe,IAAA,CAAK,GAAG,GAAG,OAAO,KAAA;AACtC,EAAA,IAAI,IAAI,MAAA,KAAW,CAAA,IAAK,GAAA,CAAI,MAAA,GAAS,KAAK,OAAO,KAAA;AAGjD,EAAA,OAAO,gBAAA,CAAiB,KAAK,GAAG,CAAA;AAClC;AAKO,SAAS,gBAAgB,KAAA,EAAsD;AACpF,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,MAAM,KAAA,GAAQ,KAAA,CACX,KAAA,CAAM,GAAG,CAAA,CACT,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CACnB,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAA,IAAK,uBAAA,CAAwB,CAAC,CAAC,CAAA,CACxD,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACd,EAAA,OAAO,MAAM,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA;AAC9C;AAGA,IAAM,iBAAA,GAAoB,IAAA;AAMnB,SAAS,iBAAiB,KAAA,EAAsD;AACrF,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,EAAA,IAAI,QAAQ,MAAA,KAAW,CAAA,IAAK,OAAA,CAAQ,MAAA,GAAS,mBAAmB,OAAO,MAAA;AACvE,EAAA,OAAO,gBAAA,CAAiB,IAAA,CAAK,OAAO,CAAA,GAAI,OAAA,GAAU,MAAA;AACpD;AAKO,SAAS,wBAAA,CACd,KACA,OAAA,EACS;AACT,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,MAAA,IAAI,OAAO,MAAA,GAAS,CAAA,IAAK,IAAI,QAAA,CAAS,MAAM,GAAG,OAAO,IAAA;AAAA,IACxD,CAAA,MAAA,IAAW,aAAA,CAAc,MAAA,EAAQ,GAAG,CAAA,EAAG;AACrC,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAMA,SAAS,aAAA,CAAc,SAAiB,GAAA,EAAsB;AAC5D,EAAA,IAAI,CAAC,QAAQ,MAAA,IAAU,CAAC,QAAQ,MAAA,EAAQ,OAAO,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA;AAC/D,EAAA,OAAO,IAAI,MAAA,CAAO,OAAA,CAAQ,MAAA,EAAQ,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAChF;AAKO,SAAS,YAAA,CAAa,QAAgB,MAAA,EAAyB;AACpE,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,GAAA,CAAI,MAAA,EAAQ,MAAM,EAAE,MAAA,KAAW,MAAA;AAAA,EAC5C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAKO,SAAS,eAAA,CACd,SACA,IAAA,EACoB;AACpB,EAAA,IAAI,OAAO,OAAA,KAAY,UAAA,SAAmB,WAAA,CAAY,OAAA,CAAQ,IAAI,CAAC,CAAA;AACnE,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,YAAmB,OAAA,EAAS;AAChE,IAAA,OAAO,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,EACtC;AACA,EAAA,MAAM,MAAA,GAAS,KAAK,WAAA,EAAY;AAChC,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,EAAG;AACtC,IAAA,IAAI,GAAA,CAAI,WAAA,EAAY,KAAM,MAAA,EAAQ;AAClC,IAAA,MAAM,KAAA,GAAS,QAAiE,GAAG,CAAA;AACnF,IAAA,IAAI,KAAA,CAAM,QAAQ,KAAK,CAAA;AACrB,MAAA,OAAO,MAAM,MAAA,GAAS,CAAA,GAAI,YAAY,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,MAAA;AACpD,IAAA,OAAO,YAAY,KAAK,CAAA;AAAA,EAC1B;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,YAAY,KAAA,EAAsD;AACzE,EAAA,OAAO,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,GAAY,MAAA,GAAY,KAAA;AAC7D;;;AClHA,IAAM,aAAA,GAAgB,CAAA;AAItB,IAAM,kBAAA,GAAqB,GAAA;AAC3B,IAAM,iBAAA,uBAAwB,GAAA,CAAI,CAAC,KAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC,CAAA;AAI3D,IAAM,mBAAA,GAAsB,0BAAA;AAiBrB,IAAM,YAAN,MAAgB;AAAA,EAgBrB,YAAY,OAAA,EAA2B;AANvC,IAAA,IAAA,CAAQ,QAAA,GAAW,CAAA;AACnB,IAAA,IAAA,CAAiB,OAAA,uBAAc,GAAA,EAAmB;AAGlD;AAAA;AAAA,IAAA,IAAA,CAAQ,UAAA,GAAa,KAAA;AAGnB,IAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AACpB,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,KAAA;AACrB,IAAA,IAAA,CAAK,SAAA,GACH,QAAQ,SAAA,KACP,OAAO,UAAU,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA,GAAI,MAAA,CAAA;AAC1D,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA;AAC1B,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,QAAA,IAAY,EAAA;AACpC,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,SAAA,IAAa,GAAA;AACtC,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,KAAA;AACrB,IAAA,IAAA,CAAK,UAAA,GAAa,OAAA,CAAQ,UAAA,KAAe,MAAM;AAAA,IAAC,CAAA,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,MAAA,EAAuB;AACnC,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,CAAK,SAAkB,GAAA,EAAsB;AAC3C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAMnC,IAAA,IAAI,IAAA,CAAK,gBAAe,IAAK,IAAA,CAAK,cAAc,IAAA,EAAM,GAAG,GAAG,OAAO,IAAA;AAEnE,IAAA,MAAM,YAAY,IAAA,CAAK,SAAA;AACvB,IAAA,IAAI,CAAC,SAAA,EAAW;AAGd,MAAA,IAAA,CAAK,KAAA,CAAM,OAAO,SAAS,CAAA;AAC3B,MAAA,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,EAAE,MAAA,EAAQ,WAAW,CAAA;AAC7C,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,EAAU;AAClC,MAAA,IAAA,CAAK,KAAA,CAAM,OAAO,YAAY,CAAA;AAC9B,MAAA,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,EAAE,MAAA,EAAQ,cAAc,CAAA;AAChD,MAAA,IAAA,CAAK,QAAQ,6BAA6B,CAAA;AAC1C,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,aAAa,qBAAA,EAAsB;AACzC,IAAA,MAAM,KAAA,GACJ,UAAA,IAAc,IAAA,CAAK,SAAA,GAAY,CAAA,GAC3B,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,EAAM,EAAG,IAAA,CAAK,SAAS,CAAA,GACnD,MAAA;AACN,IAAA,MAAMC,KAAAA,GAAoB;AAAA,MACxB,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,KAAK,OAAA,EAAQ;AAAA,MACtB,IAAA;AAAA,MACA,GAAI,SAAA,EAAU,IAAK,IAAA,CAAK,MAAA,GAAS,qBAAqB,EAAE,SAAA,EAAW,IAAA,EAAK,GAAI,EAAC;AAAA,MAC7E,GAAI,MAAA,EAAO,GAAI,EAAE,QAAA,EAAU,QAAA,KAAgC,EAAC;AAAA,MAC5D,GAAI,UAAA,GAAa,EAAE,QAAQ,UAAA,CAAW,MAAA,KAAW;AAAC,KACpD;AAEA,IAAA,IAAA,CAAK,QAAA,IAAY,CAAA;AACjB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAGA,KAAI,CAAA,CAC7D,KAAA,CAAM,CAAC,KAAA,KAAmB;AAGzB,MAAA,IAAI,YAAA,CAAa,KAAK,CAAA,EAAG;AACvB,QAAA,IAAA,CAAK,MAAM,aAAA,EAAc;AACzB,QAAA,IAAA,CAAK,WAAW,SAAA,EAAW,EAAE,OAAO,SAAA,CAAU,KAAK,GAAG,CAAA;AAAA,MACxD,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,KAAA,CAAM,OAAO,SAAS,CAAA;AAC3B,QAAA,IAAA,CAAK,UAAA,CAAW,QAAQ,EAAE,MAAA,EAAQ,WAAW,KAAA,EAAO,SAAA,CAAU,KAAK,CAAA,EAAG,CAAA;AAAA,MACxE;AACA,MAAA,IAAA,CAAK,KAAA,GAAQ,iBAAiB,KAAK,CAAA;AAAA,IACrC,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM;AACb,MAAA,IAAA,CAAK,QAAA,IAAY,CAAA;AACjB,MAAA,IAAI,KAAA,KAAU,MAAA,EAAW,YAAA,CAAa,KAAK,CAAA;AAC3C,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,OAAO,CAAA;AAAA,IAC7B,CAAC,CAAA;AAEH,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,OAAO,CAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,QAAQ,UAAA,CAAW,CAAC,GAAG,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,cAAA,GAA0B;AAChC,IAAA,IAAI,KAAK,IAAA,CAAK,IAAA,KAAS,SAAS,CAAC,SAAA,IAAa,OAAO,KAAA;AACrD,IAAA,OAAO,IAAA,CAAK,cAAc,cAAA,EAAe;AAAA,EAC3C;AAAA;AAAA;AAAA,EAIQ,aAAA,CAAc,MAAc,GAAA,EAAsB;AACxD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,IAAc,eAAA,EAAgB;AAClD,IAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,GAAG,GAAG,UAAA,CAAW,IAAI,CAAC,CAAA,EAAG,OAAO,KAAA;AAAA,IAC5D,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,KAAA,GAAQ,uBAAuB,KAAK,CAAA;AACzC,MAAA,OAAO,KAAA;AAAA,IACT;AAMA,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,OAAA,EAAQ,CAC9B,KAAK,MAAM;AAGV,MAAA,IAAA,CAAK,KAAA,CAAM,UAAU,MAAM,CAAA;AAC3B,MAAA,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,EAAE,CAAA;AAAA,IAC5B,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM;AACb,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,QAAQ,CAAA;AAAA,IAC9B,CAAC,CAAA;AAEH,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,QAAQ,CAAA;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAc,OAAA,CACZ,SAAA,EACA,GAAA,EACAA,KAAAA,EACe;AACf,IAAA,IAAI,UAAA,GAAa,GAAA;AACjB,IAAA,IAAI,QAAA,GAAW,MAAM,SAAA,CAAU,UAAA,EAAYA,KAAI,CAAA;AAE/C,IAAA,IAAI,QAAO,EAAG;AACZ,MAAA,IAAI,SAAA,GAAY,CAAA;AAChB,MAAA,OAAO,kBAAkB,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA,IAAK,YAAY,aAAA,EAAe;AAC1E,QAAA,MAAMJ,SAAAA,GAAW,QAAA,CAAS,OAAA,EAAS,GAAA,CAAI,UAAU,CAAA;AACjD,QAAA,IAAI,CAACA,SAAAA,EAAU;AACf,QAAA,MAAM,UAAU,IAAI,GAAA,CAAIA,SAAAA,EAAU,UAAU,EAAE,QAAA,EAAS;AAIvD,QAAA,IAAI,CAAC,qBAAA,CAAsB,UAAA,EAAY,OAAO,CAAA,EAAG;AACjD,QAAA,UAAA,GAAa,IAAA,CAAK,SAAS,OAAO,CAAA;AAClC,QAAA,SAAA,IAAa,CAAA;AACb,QAAA,QAAA,GAAW,MAAM,SAAA,CAAU,UAAA,EAAYI,KAAI,CAAA;AAAA,MAC7C;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,CAAS,MAAA,IAAU,GAAA,IAAO,QAAA,CAAS,SAAS,GAAA,EAAK;AACnD,MAAA,IAAA,CAAK,KAAA,CAAM,UAAU,MAAM,CAAA;AAC3B,MAAA,IAAA,CAAK,WAAW,MAAA,EAAQ,EAAE,MAAA,EAAQ,QAAA,CAAS,QAAQ,CAAA;AAAA,IACrD,CAAA,MAAO;AAGL,MAAA,IAAA,CAAK,KAAA,CAAM,OAAO,UAAU,CAAA;AAC5B,MAAA,IAAA,CAAK,UAAA,CAAW,QAAQ,EAAE,MAAA,EAAQ,YAAY,MAAA,EAAQ,QAAA,CAAS,QAAQ,CAAA;AACvE,MAAA,IAAI,KAAK,KAAA,EAAO;AAEd,QAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,QAAQ,CAAA;AACzC,QAAA,IAAA,CAAK,MAAM,CAAA,wBAAA,EAA2B,QAAA,CAAS,MAAM,CAAA,EAAG,MAAM,CAAA,CAAE,CAAA;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,OAAA,GAAkC;AACxC,IAAA,OAAO;AAAA;AAAA;AAAA,MAGL,GAAI,IAAA,CAAK,IAAA,CAAK,IAAA,KAAS,QAAA,GACnB,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA,CAAA,KAC3C,EAAC;AAAA,MACL,cAAA,EAAgB,kBAAA;AAAA;AAAA,MAEhB,GAAI,MAAA,EAAO,GAAI,EAAE,YAAA,EAAc,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,EAAG,GAAI;AAAC,KACnE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAS,GAAA,EAAqB;AACpC,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,IAAA,KAAS,KAAA,EAAO,OAAO,GAAA;AACrC,IAAA,IAAI,GAAA,CAAI,QAAA,CAAS,aAAa,CAAA,EAAG,OAAO,GAAA;AACxC,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,QAAA,CAAS,GAAG,IAAI,GAAA,GAAM,GAAA;AAC5C,IAAA,OAAO,CAAA,EAAG,GAAG,CAAA,EAAG,SAAS,cAAc,kBAAA,CAAmB,IAAA,CAAK,IAAA,CAAK,SAAS,CAAC,CAAA,CAAA;AAAA,EAChF;AACF,CAAA;AAEA,SAAS,qBAAA,GAAqD;AAC5D,EAAA,OAAO,OAAO,eAAA,KAAoB,UAAA,GAAa,IAAI,iBAAgB,GAAI,MAAA;AACzE;AAIA,SAAS,eAAA,GAA0C;AACjD,EAAA,IAAI,OAAO,SAAA,KAAc,WAAA,EAAa,OAAO,MAAA;AAC7C,EAAA,MAAM,SAAS,SAAA,CAAU,UAAA;AACzB,EAAA,OAAO,OAAO,MAAA,KAAW,UAAA,GACrB,CAAC,GAAA,EAAK,IAAA,KAAS,MAAA,CAAO,IAAA,CAAK,SAAA,EAAW,GAAA,EAAK,IAAI,CAAA,GAC/C,MAAA;AACN;AAKA,SAAS,WAAW,IAAA,EAAwB;AAC1C,EAAA,IAAI,OAAO,IAAA,KAAS,UAAA,EAAY,OAAO,IAAA;AACvC,EAAA,OAAO,IAAI,KAAK,CAAC,IAAI,GAAG,EAAE,IAAA,EAAM,qBAAqB,CAAA;AACvD;AAGA,SAAS,cAAA,GAA0B;AACjC,EAAA,OAAO,OAAO,QAAA,KAAa,WAAA,IAAe,QAAA,CAAS,eAAA,KAAoB,QAAA;AACzE;AAGA,SAAS,aAAa,KAAA,EAAyB;AAC7C,EAAA,OAAO,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA;AAClD;AAGA,SAAS,qBAAA,CAAsB,SAAiB,KAAA,EAAwB;AACtE,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,OAAO,CAAA,CAAE,IAAA;AAC9B,IAAA,MAAM,EAAA,GAAK,IAAI,GAAA,CAAI,KAAK,CAAA,CAAE,IAAA;AAC1B,IAAA,OAAO,IAAA,KAAS,MAAM,CAAA,IAAA,EAAO,IAAI,OAAO,EAAA,IAAM,IAAA,KAAS,OAAO,EAAE,CAAA,CAAA;AAAA,EAClE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAGA,eAAe,YAAY,QAAA,EAAqC;AAC9D,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAGlC,IAAA,MAAM,QAAQ,IAAA,EAAM,KAAA;AACpB,IAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AACnB,IAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,CAAM,IAAA,EAAM,MAAM,OAAO,CAAA,CAAE,OAAO,OAAO,CAAA;AACxD,IAAA,OAAO,KAAA,CAAM,SAAS,CAAA,GAAI,CAAA,EAAA,EAAK,MAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,GAAM,EAAA;AAAA,EACvD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAA;AAAA,EACT;AACF;;;ACzQO,IAAM,SAAN,MAAa;AAAA,EAmClB,WAAA,CAAY,UAAA,EAAgC,IAAA,GAAmB,EAAC,EAAG;AANnE;AAAA;AAAA,IAAA,IAAA,CAAQ,gBAAA,GAAmB,KAAA;AAOzB,IAAA,IAAA,CAAK,OAAA,GAAU,eAAe,UAAU,CAAA;AACxC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,IAAI,KAAA,EAAM;AACrC,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,WAAA,CAAY,IAAA,CAAK,QAAQ,YAAY,CAAA;AAC5D,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,KAAA,IAAS,IAAI,KAAA,CAAM,IAAA,CAAK,QAAQ,cAAc,CAAA;AACpE,IAAA,IAAA,CAAK,MAAM,kBAAA,EAAmB;AAC9B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,IAAI,YAAA,EAAa;AAC5C,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,MAAA;AAClC,IAAA,IAAA,CAAK,kBACH,IAAA,CAAK,eAAA,KAAoB,MAAM,kBAAA,CAAmB,IAAA,CAAK,QAAQ,OAAO,CAAA,CAAA;AACxE,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,KAAA,IAAS,YAAA;AAC3B,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,cAAA,GAAiB,YAAiB,GAAI,MAAA;AAKrE,IAAA,IAAA,CAAK,OAAO,oBAAA,CAAqB,IAAA,CAAK,OAAA,EAAS,SAAA,EAAW,CAAA,IAAK;AAAA,MAC7D,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACV;AACA,IAAA,IAAA,CAAK,SAAA,GACH,IAAA,CAAK,SAAA,IACL,IAAI,SAAA,CAAU;AAAA,MACZ,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAA,EAAU,KAAK,OAAA,CAAQ,QAAA;AAAA,MACvB,KAAA,EAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,GAAQ,CAAC,CAAA,EAAG,CAAA,KAAM,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,CAAC,CAAA,GAAI,MAAA;AAAA,MAC5D,UAAA,EAAY,CAAC,KAAA,EAAO,OAAA,KAAY,KAAK,WAAA,CAAY,MAAA,CAAO,OAAO,OAAO;AAAA,KACvE,CAAA;AACH,IAAA,IAAA,CAAK,SAAA,GACH,IAAA,CAAK,SAAA,IACL,IAAI,SAAA;AAAA,MACF,CAAC,KAAA,KAAU,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AAAA,MAC/B,KAAK,OAAA,CAAQ,aAAA;AAAA,MACb,KAAK,OAAA,CAAQ;AAAA,KACf;AAGF,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,OAAA,KAAY,MAAA,EAAW;AACpC,MAAA,IAAA,CAAK,MAAM,UAAA,CAAW,MAAA,GAAS,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAC,CAAA;AAAA,IAClD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,KAAA,GAAe;AACjB,IAAA,OAAO,KAAK,GAAA,EAAK,QAAA,EAAS,IAAK,IAAA,CAAK,aAAa,IAAA,CAAK,SAAA;AAAA,EACxD;AAAA,EAEA,IAAI,OAAA,GAAmB;AACrB,IAAA,OAAO,SAAA,CAAU,IAAA,CAAK,OAAA,EAAS,SAAA,EAAW,CAAA;AAAA,EAC5C;AAAA,EAEA,IAAI,cAAA,GAAgC;AAClC,IAAA,OAAO,cAAA,CAAe,IAAA,CAAK,OAAA,EAAS,SAAA,EAAW,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,IAAY,eAAA,GAA0B;AACpC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,KAAS,KAAA,GAAQ,QAAA,CAAS,KAAK,OAAO,CAAA,GAAI,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA;AAAA,EACnF;AAAA,EAEA,IAAI,YAAA,GAAmC;AACrC,IAAA,OAAO,YAAA,CAAa,KAAK,OAAO,CAAA;AAAA,EAClC;AAAA,EAEA,IAAI,uBAAA,GAAkC;AACpC,IAAA,OAAO,KAAK,OAAA,CAAQ,uBAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAA,CAAiB,KAAA,EAAgB,IAAA,GAAoB,EAAC,EAAS;AAC7D,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,qBAAA,EAAsB,EAAG;AAE9C,IAAA,MAAM,UAAA,GAAa,eAAe,KAAK,CAAA;AACvC,IAAA,IAAI,KAAK,OAAA,CAAQ,kBAAA,CAAmB,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA,EAAG;AAC/D,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,KAAK,CAAA,EAAG;AAEnC,IAAA,MAAM,GAAA,GAAM,QAAA;AAAA,MACV,UAAA,CAAW,IAAA;AAAA,MACX,UAAA,CAAW,KAAA;AAAA,MACX,WAAA,CAAY,WAAW,KAAK;AAAA,KAC9B;AACA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,GAAG,CAAA,EAAG;AAGjC,IAAA,IAAA,CAAK,KAAA,CAAM,aAAa,KAAK,CAAA;AAC7B,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC1C,MAAA,IAAA,CAAK,SAAS,aAAa,CAAA;AAC3B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAU,eAAA,CAAgB;AAAA,MAC9B,KAAA,EAAO,UAAA;AAAA,MACP,WAAA,EAAa,KAAK,OAAA,CAAQ,WAAA;AAAA,MAC1B,OAAA,EAAS,KAAK,OAAA,CAAQ,OAAA;AAAA,MACtB,OAAA,EAAS,KAAK,OAAA,IAAW,KAAA;AAAA,MACzB,KAAA,EAAO,KAAK,KAAA,IAAS,OAAA;AAAA,MACrB,SAAA,EAAW,KAAK,SAAA,EAAU;AAAA,MAC1B,OAAA,EAAS,KAAK,KAAA,CAAM,OAAA;AAAA,MACpB,QAAA,EAAU,KAAK,KAAA,CAAM,eAAA;AAAA,MACrB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,OAAA,EAAS,KAAK,WAAA,EAAY;AAAA,MAC1B,YAAY,IAAA,CAAK;AAAA,KAClB,CAAA;AACD,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,IAAA,CAAK,eAAA,EAAiB,gBAAgB,CAAA;AAAA,EAC9D;AAAA;AAAA,EAGA,cAAA,CAAe,OAAA,EAAiB,KAAA,GAAoB,MAAA,EAAc;AAChE,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,qBAAA,EAAsB,EAAG;AAC9C,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC1C,MAAA,IAAA,CAAK,SAAS,aAAa,CAAA;AAC3B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAU,iBAAA,CAAkB;AAAA,MAChC,OAAA;AAAA,MACA,WAAA,EAAa,KAAK,OAAA,CAAQ,WAAA;AAAA,MAC1B,OAAA,EAAS,KAAK,OAAA,CAAQ,OAAA;AAAA,MACtB,KAAA;AAAA,MACA,SAAA,EAAW,KAAK,SAAA,EAAU;AAAA,MAC1B,OAAA,EAAS,KAAK,KAAA,CAAM,OAAA;AAAA,MACpB,QAAA,EAAU,KAAK,KAAA,CAAM,eAAA;AAAA,MACrB,OAAA,EAAS,KAAK,WAAA,EAAY;AAAA,MAC1B,YAAY,IAAA,CAAK;AAAA,KAClB,CAAA;AACD,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,IAAA,CAAK,eAAA,EAAiB,gBAAgB,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAMA,GAAA,CACE,KAAA,EACA,OAAA,EACA,UAAA,EACAC,OAAAA,EACM;AACN,IAAA,IAAI,CAAC,KAAK,OAAA,IAAW,CAAC,KAAK,OAAA,CAAQ,WAAA,IAAe,uBAAsB,EAAG;AAC3E,IAAA,MAAM,UAAA,GAAa,kBAAkB,KAAK,CAAA;AAC1C,IAAA,IAAI,CAAC,aAAA,CAAc,UAAA,EAAY,IAAA,CAAK,OAAA,CAAQ,YAAY,CAAA,EAAG;AAC3D,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,cAAc,CAAA,EAAG;AAC9C,MAAA,IAAA,CAAK,SAAS,aAAa,CAAA;AAC3B,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAA,CAAQ,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA,EAAG;AAEjC,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA;AAAA,MACb,aAAA,CAAc;AAAA,QACZ,OAAA;AAAA,QACA,KAAA,EAAO,UAAA;AAAA,QACP,WAAA,EAAa,KAAK,OAAA,CAAQ,WAAA;AAAA,QAC1B,OAAA,EAAS,KAAK,OAAA,CAAQ,OAAA;AAAA,QACtB,MAAA,EAAAA,OAAAA;AAAA,QACA,OAAA,EAAS,KAAK,KAAA,CAAM,OAAA;AAAA,QACpB;AAAA,OACD;AAAA,KACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAA,CACE,KAAA,EACA,IAAA,EACA,IAAA,GAA2C,EAAC,EACzC;AACH,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,MAAM,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AAC1D,MAAA,MAAM,IAAI,SAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,MAAM,SAAS,MAAY;AACzB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,EAAM,GAAI,KAAA;AAChC,MAAA,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,QAAA,EAAU,IAAA,CAAK,IAAI,CAAA;AAAA,IAClD,CAAA;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,IAAA,EAAK;AACpB,MAAA,IAAI,UAAA,CAAW,MAAM,CAAA,EAAG;AACtB,QAAA,OAAQ,MAAA,CAA4B,IAAA;AAAA,UAClC,CAAC,KAAA,KAAU;AACT,YAAA,MAAA,EAAO;AACP,YAAA,OAAO,KAAA;AAAA,UACT,CAAA;AAAA,UACA,CAAC,KAAA,KAAmB;AAClB,YAAA,MAAA,EAAO;AACP,YAAA,MAAM,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,MAAA,EAAO;AACP,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,EAAO;AACP,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA,EAIA,kBAAA,CAAmB,IAAA,EAAc,GAAA,EAAa,UAAA,EAA0B;AACtE,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,MAAiB,CAAC,IAAA,CAAK,QAAQ,mBAAA,EAAqB;AAC9D,IAAA,MAAM,SAAA,GAAY,KAAK,OAAA,CAAQ,uBAAA;AAC/B,IAAA,IAAI,SAAA,IAAa,CAAA,IAAK,UAAA,GAAa,SAAA,EAAW;AAE9C,IAAA,IAAA,CAAK,OAAA;AAAA,MACH,0BAAA,CAA2B;AAAA,QACzB,OAAA,EAAS,oBAAA;AAAA,QACT,UAAA;AAAA,QACA,WAAA,EAAa,KAAK,OAAA,CAAQ,WAAA;AAAA,QAC1B,QAAA,EAAU,IAAA;AAAA,QACV,OAAA,EAAS,GAAA;AAAA,QACT,OAAA,EAAS,KAAK,KAAA,CAAM;AAAA,OACrB,CAAA;AAAA,MACD,UAAA,CAAW,KAAK,OAAO,CAAA;AAAA,MACvB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA,EAIA,kBAAA,CAAmB,IAAA,EAAc,GAAA,EAAa,KAAA,EAAqB;AACjE,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,MAAiB,CAAC,IAAA,CAAK,QAAQ,mBAAA,EAAqB;AAE9D,IAAA,IAAA,CAAK,OAAA;AAAA,MACH,0BAAA,CAA2B;AAAA,QACzB,OAAA,EAAS,eAAA;AAAA,QACT,WAAA,EAAa,KAAK,OAAA,CAAQ,WAAA;AAAA,QAC1B,QAAA,EAAU,IAAA;AAAA,QACV,OAAA,EAAS,GAAA;AAAA,QACT,UAAA,EAAY,KAAA;AAAA,QACZ,OAAA,EAAS,KAAK,KAAA,CAAM;AAAA,OACrB,CAAA;AAAA,MACD,UAAA,CAAW,KAAK,OAAO,CAAA;AAAA,MACvB;AAAA,KACF;AAAA,EACF;AAAA;AAAA,EAGA,UAAA,CAAW,YAAoB,KAAA,EAAqB;AAClD,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,MAAiB,CAAC,IAAA,CAAK,QAAQ,UAAA,EAAY;AAErD,IAAA,IAAA,CAAK,OAAA;AAAA,MACH,0BAAA,CAA2B;AAAA,QACzB,OAAA,EAAS,MAAA;AAAA,QACT,UAAA;AAAA,QACA,WAAA,EAAa,KAAK,OAAA,CAAQ,WAAA;AAAA,QAC1B,KAAA;AAAA,QACA,OAAA,EAAS,KAAK,KAAA,CAAM;AAAA,OACrB,CAAA;AAAA,MACD,UAAA,CAAW,KAAK,OAAO,CAAA;AAAA,MACvB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,eAAA,CAAgB,SAAA,GAA+B,EAAC,EAAS;AACvD,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,IAAA,IAAI,CAAC,WAAU,EAAG;AAElB,IAAA,IAAA,CAAK,OAAA;AAAA,MACH,EAAE,GAAG,aAAA,CAAc,SAAS,GAAG,WAAA,EAAa,IAAA,CAAK,QAAQ,WAAA,EAAY;AAAA,MACrE,YAAA,CAAa,KAAK,OAAO,CAAA;AAAA,MACzB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,CAAa,IAAA,EAAc,SAAA,GAA+B,EAAC,EAAS;AAClE,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,IAAA,IAAI,CAAC,WAAU,EAAG;AAClB,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,IAAA,CAAK,OAAA;AAAA,MACH,EAAE,GAAG,aAAA,CAAc,SAAS,GAAG,IAAA,EAAM,WAAA,EAAa,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAY;AAAA,MAC3E,YAAA,CAAa,KAAK,OAAO,CAAA;AAAA,MACzB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,iBAAiB,QAAA,EAAgC;AAC/C,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,IAAA,IAAI,CAAC,WAAU,EAAG;AAClB,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3B,IAAA,IAAI,uBAAsB,EAAG;AAC7B,IAAA,IAAI,CAAC,IAAA,CAAK,mBAAA,EAAoB,EAAG;AAC/B,MAAA,IAAA,CAAK,SAAS,aAAa,CAAA;AAC3B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,CAACC,QAAAA,MAAa;AAAA,MACzC,GAAGA,QAAAA;AAAA,MACH,WAAA,EAAa,KAAK,OAAA,CAAQ,WAAA;AAAA,MAC1B,GAAI,IAAA,CAAK,OAAA,CAAQ,OAAA,GAAU,EAAE,SAAS,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAQ,GAAI;AAAC,KAClE,CAAE,CAAA;AACF,IAAA,MAAM,OAAO,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA,CAAE,IAAI,kBAAkB,CAAA;AACjE,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AAEvB,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AACrC,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,GAAG,CAAA,EAAG;AAClC,MAAA,IAAA,CAAK,KAAA,CAAM,UAAU,UAAU,CAAA;AAC/B,MAAA,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,SAAA,EAAW,EAAE,IAAA,EAAM,MAAA,CAAO,GAAG,CAAA,EAAG,KAAA,EAAO,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,IAC9E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,mBAAmB,EAAA,EAA8B;AAC/C,IAAA,IAAA,CAAK,KAAA,CAAM,mBAAmB,EAAE,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,KAAA,EAA2B;AAC5C,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,IAAA,IAAI,CAAC,WAAU,EAAG;AAElB,IAAA,IAAA,CAAK,OAAA;AAAA,MACH,EAAE,GAAG,KAAA,EAAO,WAAA,EAAa,IAAA,CAAK,QAAQ,WAAA,EAAY;AAAA,MAClD,SAAA,CAAU,KAAK,OAAO,CAAA;AAAA,MACtB;AAAA,KACF;AAAA,EACF;AAAA;AAAA,EAIA,QAAQ,IAAA,EAAgC;AACtC,IAAA,IAAA,CAAK,KAAA,CAAM,QAAQ,IAAI,CAAA;AAAA,EACzB;AAAA,EAEA,MAAA,CAAO,KAAa,KAAA,EAAqB;AACvC,IAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,GAAA,EAAK,KAAK,CAAA;AAAA,EAC9B;AAAA,EAEA,QAAQ,IAAA,EAAoC;AAC1C,IAAA,IAAA,CAAK,KAAA,CAAM,QAAQ,IAAI,CAAA;AAAA,EACzB;AAAA,EAEA,QAAA,CAAS,KAAa,KAAA,EAAsB;AAC1C,IAAA,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,GAAA,EAAK,KAAK,CAAA;AAAA,EAChC;AAAA,EAEA,UAAA,CAAW,KAAa,KAAA,EAAsC;AAC5D,IAAA,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,GAAA,EAAK,KAAK,CAAA;AAAA,EAClC;AAAA,EAEA,WAAW,EAAA,EAA8B;AACvC,IAAA,IAAA,CAAK,KAAA,CAAM,WAAW,EAAE,CAAA;AAAA,EAC1B;AAAA,EAEA,cAAc,KAAA,EAA8B;AAC1C,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAa;AAC/B,IAAA,IAAA,CAAK,KAAA,CAAM,cAAc,KAAK,CAAA;AAAA,EAChC;AAAA,EAEA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,cAAc,OAAA,EAA6B;AACzC,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,IAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,eAAA,CAAgB,OAAA,EAAS,aAAa,CAAC,CAAA;AACvE,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,IAAA,CAAK,MAAM,aAAA,CAAc;AAAA,MACvB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,UAAA,EAAY,eAAA,CAAgB,eAAA,CAAgB,OAAA,EAAS,YAAY,CAAC,CAAA;AAAA,MAClE,OAAA,EAAS,gBAAA,CAAiB,eAAA,CAAgB,OAAA,EAAS,SAAS,CAAC;AAAA,KAC9D,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,gBAAgB,MAAA,EAAyC;AACvD,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,OAAO,EAAC;AAC3B,IAAA,MAAM,OAAA,GAAU,KAAK,KAAA,CAAM,OAAA;AAC3B,IAAA,IAAI,OAAA,KAAY,MAAA,EAAW,OAAO,EAAC;AACnC,IAAA,IAAI,MAAA,KAAW,UAAa,CAAC,IAAA,CAAK,qBAAqB,MAAM,CAAA,SAAU,EAAC;AAExE,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,WAAA,EAAa,iBAAA;AAAA,QACX,OAAA;AAAA,QACA,MAAA,EAAO;AAAA,QACP,IAAA,CAAK,MAAM,YAAA,IAAgB;AAAA;AAC7B,KACF;AACA,IAAA,IAAI,KAAK,KAAA,CAAM,UAAA,UAAoB,YAAY,CAAA,GAAI,KAAK,KAAA,CAAM,UAAA;AAC9D,IAAA,IAAI,KAAK,KAAA,CAAM,YAAA,UAAsB,SAAS,CAAA,GAAI,KAAK,KAAA,CAAM,YAAA;AAC7D,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,MAAA,EAAyB;AACpD,IAAA,IAAI,wBAAA,CAAyB,MAAA,EAAQ,IAAA,CAAK,OAAA,CAAQ,uBAAuB,CAAA,EAAG;AAC1E,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,MAAA,GAAS,OAAO,QAAA,KAAa,WAAA,GAAc,SAAS,MAAA,GAAS,MAAA;AACnE,IAAA,OAAO,MAAA,KAAW,MAAA,IAAa,YAAA,CAAa,MAAA,EAAQ,MAAM,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,aAAgB,EAAA,EAA4B;AAC1C,IAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,KAAK,EAAE,UAAA,EAAY,MAAM,CAAA;AACnD,IAAA,MAAA,CAAO,WAAW,MAAA,EAAO,CAAE,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAC,CAAA;AAC5C,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,EAAE,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAa,EAAA,EAA4B;AACvC,IAAA,OAAO,KAAK,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,IAAA,IAAQ,EAAE,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,UAAA,CAAc,OAAc,EAAA,EAA4B;AAC9D,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AACjB,IAAA,IAAI,GAAA,SAAY,GAAA,CAAI,GAAA,CAAI,OAAO,MAAM,EAAA,CAAG,KAAK,CAAC,CAAA;AAC9C,IAAA,MAAM,WAAW,IAAA,CAAK,SAAA;AACtB,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,IAAI;AACF,MAAA,OAAO,GAAG,KAAK,CAAA;AAAA,IACjB,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,SAAA,GAAY,QAAA;AAAA,IACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,iBAAiB,MAAA,EAAuB;AACtC,IAAA,IAAA,CAAK,SAAA,CAAU,cAAc,MAAM,CAAA;AAAA,EACrC;AAAA;AAAA,EAGA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,MAAM,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,UAAU,OAAA,EAAQ;AACvB,IAAA,MAAM,IAAA,CAAK,UAAU,KAAA,EAAM;AAC3B,IAAA,IAAI,CAAC,KAAK,gBAAA,EAAkB;AAC1B,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,MAAA,IAAA,CAAK,WAAA,CAAY,OAAO,UAAA,EAAY,EAAE,OAAO,IAAA,CAAK,KAAA,CAAM,QAAA,EAAS,EAAG,CAAA;AAAA,IACtE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,QAAA,CAAS,MAAA,EAAoB,OAAA,GAA6B,EAAC,EAAS;AAC1E,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,MAAM,CAAA;AACxB,IAAA,IAAA,CAAK,YAAY,MAAA,CAAO,MAAA,EAAQ,EAAE,MAAA,EAAQ,GAAG,SAAS,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKQ,OAAA,CACN,OAAA,EACA,GAAA,EACA,GAAA,EACM;AAGN,IAAA,IAAI,uBAAsB,EAAG;AAE7B,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,CAAQ,UAAA;AAC1B,IAAA,IAAI,IAAA,GAAqB,OAAA;AACzB,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,KAAK,OAAO,CAAA;AAAA,MACvB,SAAS,KAAA,EAAO;AAGd,QAAA,IAAA,CAAK,SAAS,OAAA,EAAS,EAAE,OAAO,SAAA,CAAU,KAAK,GAAG,CAAA;AAClD,QAAA,IAAA,CAAK,QAAA,CAAS,4CAA4C,KAAK,CAAA;AAC/D,QAAA;AAAA,MACF;AACA,MAAA,IAAI,WAAW,IAAA,EAAM;AACnB,QAAA,IAAA,CAAK,SAAS,aAAa,CAAA;AAC3B,QAAA;AAAA,MACF;AACA,MAAA,IAAA,GAAO,MAAA;AAAA,IACT;AACA,IAAA,IAAI,GAAA,EAAK,IAAA,GAAO,GAAA,CAAI,IAAI,CAAA;AACxB,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,GAAG,CAAA,EAAG;AAClC,MAAA,IAAA,CAAK,KAAA,CAAM,UAAU,UAAU,CAAA;AAC/B,MAAA,IAAA,CAAK,WAAA,CAAY,OAAO,SAAA,EAAW,EAAE,MAAM,MAAA,CAAO,GAAG,GAAG,CAAA;AAAA,IAC1D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,gBAAgB,KAAA,EAAuC;AAC7D,IAAA,MAAM,IAAA,GAAO,KAAK,OAAA,CAAQ,UAAA;AAC1B,IAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAElB,IAAA,MAAM,OAAuB,EAAC;AAC9B,IAAA,KAAA,MAAW,SAAS,KAAA,EAAO;AACzB,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,KAAK,KAAK,CAAA;AAAA,MACrB,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,SAAS,OAAA,EAAS,EAAE,OAAO,SAAA,CAAU,KAAK,GAAG,CAAA;AAClD,QAAA;AAAA,MACF;AACA,MAAA,IAAI,WAAW,IAAA,EAAM;AACnB,QAAA,IAAA,CAAK,SAAS,aAAa,CAAA;AAC3B,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,KAAK,MAAM,CAAA;AAAA,IAClB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,UAAU,KAAA,EAA6B;AAC7C,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACxB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA;AAC3C,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAI3B,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA;AAChC,IAAA,KAAA,MAAW,KAAA,IAAS,aAAA,CAAc,QAAA,EAAU,iBAAA,EAAmB,cAAc,CAAA,EAAG;AAC9E,MAAA,IAAI,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAA,EAAO,GAAG,CAAA,EAAG;AACnC,QAAA,IAAA,CAAK,KAAA,CAAM,UAAU,UAAU,CAAA;AAC/B,QAAA,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,SAAA,EAAW,EAAE,IAAA,EAAM,MAAA,CAAO,GAAG,CAAA,EAAG,KAAA,EAAO,KAAA,CAAM,MAAA,EAAQ,CAAA;AAAA,MAC/E;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,gBAAA,CACN,KAAA,EACA,UAAA,EACA,IAAA,EACM;AACN,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,IAAA,IAAI,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,qBAAA,EAAuB;AAErD,IAAA,IAAA,CAAK,OAAA;AAAA,MACH,oBAAA,CAAqB;AAAA,QACnB,KAAA;AAAA,QACA,UAAA;AAAA,QACA,WAAA,EAAa,KAAK,OAAA,CAAQ,WAAA;AAAA,QAC1B,OAAA,EAAS,KAAK,KAAA,CAAM,OAAA;AAAA,QACpB,IAAA,EAAM,IAAA,CAAK,OAAA,CAAQ,sBAAA,GAAyB,IAAA,GAAO;AAAA,OACpD,CAAA;AAAA,MACD,UAAA,CAAW,KAAK,OAAO,CAAA;AAAA,MACvB;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,WAAA,GAAuB;AAC7B,IAAA,OAAO,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,uBAAA;AAAA,EACtC;AAAA,EAEQ,SAAA,GAA0B;AAChC,IAAA,OAAO,IAAA,CAAK,MAAM,WAAA,CAAY,EAAE,SAAS,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AAAA,EACjE;AAAA,EAEQ,WAAA,GAAmD;AACzD,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,cAAA,EAAgB,OAAO,MAAA;AACzC,IAAA,OAAO,KAAK,eAAA,EAAgB;AAAA,EAC9B;AAAA,EAEQ,QAAQ,IAAA,EAAuB;AACrC,IAAA,IAAI,IAAA,IAAQ,GAAG,OAAO,IAAA;AACtB,IAAA,IAAI,IAAA,IAAQ,GAAG,OAAO,KAAA;AACtB,IAAA,OAAO,IAAA,CAAK,QAAO,GAAI,IAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAA,GAA+B;AACrC,IAAA,IAAA,CAAK,qBAAL,IAAA,CAAK,gBAAA,GAAqB,KAAK,OAAA,CAAQ,IAAA,CAAK,QAAQ,mBAAmB,CAAA,CAAA;AACvE,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EACd;AAAA;AAAA;AAAA,EAIQ,QAAA,CAAS,SAAiB,KAAA,EAAuB;AACvD,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO;AACzB,IAAA,IAAI,OAAO,YAAY,WAAA,EAAa;AAElC,MAAA,OAAA,CAAQ,KAAA,CAAM,eAAA,EAAiB,OAAA,EAAS,KAAA,IAAS,EAAE,CAAA;AAAA,IACrD;AAAA,EACF;AACF;AAIA,SAAS,iBAAiB,OAAA,EAAqC;AAC7D,EAAA,OAAO,QAAA,CAAS,SAAS,iBAAiB,CAAA;AAC5C;AAEA,SAAS,uBAAuB,OAAA,EAAqC;AACnE,EAAA,OAAO,cAAA,CAAe,SAAS,iBAAiB,CAAA;AAClD;AAIA,SAAS,mBAAmB,OAAA,EAAqC;AAC/D,EAAA,OAAO,UAAA,CAAW,SAAS,iBAAiB,CAAA;AAC9C;AAIA,SAAS,OAAO,GAAA,EAAiC;AAC/C,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA;AAAA,EACtB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAEA,SAAS,WAAW,KAAA,EAA2C;AAC7D,EAAA,OACE,KAAA,KAAU,IAAA,KACT,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,KAAA,KAAU,UAAA,CAAA,IAC/C,OAAQ,KAAA,CAA6B,IAAA,KAAS,UAAA;AAElD;AAEA,SAAS,YAAA,GAAuB;AAC9B,EAAA,OAAO,OAAO,WAAA,KAAgB,WAAA,IAAe,OAAO,WAAA,CAAY,GAAA,KAAQ,UAAA,GACpE,WAAA,CAAY,GAAA,EAAI,GAChB,IAAA,CAAK,GAAA,EAAI;AACf;AAGA,SAAS,YAAY,KAAA,EAA+C;AAClE,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,KAAA,MAAW,GAAA,IAAO,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,EAAG;AACnC,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,EAAK;AACtB,IAAA,IAAI,IAAA,CAAK,WAAW,KAAK,CAAA,IAAK,KAAK,QAAA,CAAS,GAAG,GAAG,OAAO,IAAA;AAAA,EAC3D;AACA,EAAA,OAAO,MAAA;AACT;;;ACn0BA,IAAM,SAAA,uBAAgB,GAAA,EAAwB;AAC9C,IAAI,cAAA,GAAsC,IAAA;AAC1C,IAAI,QAAA,GAAW,EAAA;AAKR,SAAS,oBAAoB,QAAA,EAA0C;AAC5E,EAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AACtB,EAAA,IAAI,cAAA,KAAmB,IAAA,EAAM,cAAA,GAAiB,YAAA,EAAa;AAE3D,EAAA,OAAO,MAAM;AACX,IAAA,SAAA,CAAU,OAAO,QAAQ,CAAA;AACzB,IAAA,IAAI,SAAA,CAAU,IAAA,KAAS,CAAA,IAAK,cAAA,KAAmB,IAAA,EAAM;AACnD,MAAA,cAAA,EAAe;AACf,MAAA,cAAA,GAAiB,IAAA;AAAA,IACnB;AAAA,EACF,CAAA;AACF;AAEA,SAAS,YAAA,GAA2B;AAClC,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,YAAY,WAAA,EAAa;AACnE,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,QAAA,GAAW,QAAA,EAAS;AAEpB,EAAA,MAAM,SAAS,MAAY;AACzB,IAAA,MAAM,KAAK,QAAA,EAAS;AACpB,IAAA,IAAI,OAAO,QAAA,EAAU;AACrB,IAAA,MAAM,IAAA,GAAO,QAAA;AACb,IAAA,QAAA,GAAW,EAAA;AAEX,IAAA,KAAA,MAAW,YAAY,CAAC,GAAG,SAAS,CAAA,EAAG,QAAA,CAAS,IAAI,IAAI,CAAA;AAAA,EAC1D,CAAA;AAEA,EAAA,MAAM,eAAe,OAAA,CAAQ,SAAA;AAC7B,EAAA,MAAM,kBAAkB,OAAA,CAAQ,YAAA;AAEhC,EAAA,OAAA,CAAQ,SAAA,GAAY,SAAS,WAAA,CAAA,GAExB,IAAA,EACG;AACN,IAAA,YAAA,CAAa,KAAA,CAAM,MAAM,IAAI,CAAA;AAC7B,IAAA,MAAA,EAAO;AAAA,EACT,CAAA;AACA,EAAA,OAAA,CAAQ,YAAA,GAAe,SAAS,cAAA,CAAA,GAE3B,IAAA,EACG;AACN,IAAA,eAAA,CAAgB,KAAA,CAAM,MAAM,IAAI,CAAA;AAChC,IAAA,MAAA,EAAO;AAAA,EACT,CAAA;AACA,EAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,MAAM,CAAA;AAE1C,EAAA,OAAO,MAAM;AACX,IAAA,OAAA,CAAQ,SAAA,GAAY,YAAA;AACpB,IAAA,OAAA,CAAQ,YAAA,GAAe,eAAA;AACvB,IAAA,MAAA,CAAO,mBAAA,CAAoB,YAAY,MAAM,CAAA;AAAA,EAC/C,CAAA;AACF;AAEA,IAAM,OAAO,MAAY;AAAC,CAAA;AAE1B,SAAS,QAAA,GAAmB;AAC1B,EAAA,OAAO,OAAO,QAAA,KAAa,WAAA,GAAc,QAAA,CAAS,IAAA,GAAO,EAAA;AAC3D;;;ACnEA,IAAM,WAAA,GAAc,GAAA;AAGb,SAAS,mBAAmB,MAAA,EAA4B;AAC7D,EAAA,MAAM,IAAA,GAAO,OAAO,OAAA,CAAQ,eAAA;AAC5B,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,IAAA,CAAK,KAAA,GAAQ,aAAA,CAAc,MAAM,CAAA,GAAIC,KAAAA;AAAA,IACrC,IAAA,CAAK,UAAA,GAAa,iBAAA,CAAkB,MAAM,CAAA,GAAIA,KAAAA;AAAA,IAC9C,IAAA,CAAK,OAAA,GAAU,cAAA,CAAe,MAAM,CAAA,GAAIA;AAAA,GAC1C;AACA,EAAA,OAAO,MAAM,UAAA,CAAW,OAAA,CAAQ,CAAC,EAAA,KAAO,IAAI,CAAA;AAC9C;AAEA,IAAMA,QAAO,MAAY;AAAC,CAAA;AAI1B,SAAS,cAAc,MAAA,EAA4B;AACjD,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAOA,KAAAA;AAC5C,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAuB;AACtC,IAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,IAAA,IAAI,CAAC,SAAA,CAAU,MAAM,CAAA,EAAG;AACxB,IAAA,MAAA,CAAO,aAAA,CAAc;AAAA,MACnB,QAAA,EAAU,UAAA;AAAA,MACV,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS,kBAAkB,MAAM;AAAA,KAClC,CAAA;AAAA,EACH,CAAA;AACA,EAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA;AAChD,EAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,OAAA,EAAS,SAAS,IAAI,CAAA;AAClE;AAGO,SAAS,kBAAkB,EAAA,EAAqB;AACrD,EAAA,IAAI,QAAA,GAAW,EAAA,CAAG,OAAA,CAAQ,WAAA,EAAY;AACtC,EAAA,IAAI,EAAA,CAAG,EAAA,EAAI,QAAA,IAAY,CAAA,CAAA,EAAI,GAAG,EAAE,CAAA,CAAA;AAChC,EAAA,MAAM,SAAA,GAAY,EAAA,CAAG,YAAA,CAAa,OAAO,CAAA,IAAK,EAAA;AAC9C,EAAA,MAAM,OAAA,GAAU,SAAA,CAAU,IAAA,EAAK,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACxE,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG,QAAA,IAAY,IAAI,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AACzD,EAAA,MAAM,SAAS,EAAA,CAAG,YAAA,CAAa,aAAa,CAAA,IAAK,EAAA,CAAG,aAAa,WAAW,CAAA;AAC5E,EAAA,IAAI,MAAA,EAAQ,QAAA,IAAY,CAAA,cAAA,EAAiB,MAAM,CAAA,EAAA,CAAA;AAC/C,EAAA,OAAO,QAAA;AACT;AAOA,SAAS,kBAAkB,MAAA,EAA4B;AACrD,EAAA,OAAO,mBAAA,CAAoB,CAAC,EAAA,EAAI,IAAA,KAAS;AACvC,IAAA,MAAA,CAAO,aAAA,CAAc;AAAA,MACnB,QAAA,EAAU,YAAA;AAAA,MACV,IAAA,EAAM,YAAA;AAAA,MACN,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,IAAQ,EAAE,CAAA,EAAG,EAAA,EAAI,QAAA,CAAS,EAAE,CAAA;AAAE,KACtD,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAGO,SAAS,SAAS,IAAA,EAAsB;AAC7C,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,OAAO,QAAA,KAAa,WAAA,GAAc,SAAS,IAAA,GAAO,KAAA,CAAA;AAC/D,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,IAAA,EAAM,IAAI,CAAA;AAC9B,IAAA,OAAO,GAAA,CAAI,SAAS,GAAA,CAAI,QAAA;AAAA,EAC1B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,IAAA,EAAM,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,IAAA;AAAA,EACvD;AACF;AAIA,SAAS,eAAe,MAAA,EAA4B;AAClD,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,EAAa,OAAOA,KAAAA;AAE3C,EAAA,MAAM,WAAW,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,KAAA,EAAO,QAAQ,KAAA,EAAM;AAE5D,EAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,EAA4B,MAAA,KAAmC;AAC5E,IAAA,MAAM,cAAA,GAAiB,SAAS,MAAM,CAAA;AACtC,IAAA,OAAA,CAAQ,MAAM,CAAA,GAAI,SAAS,OAAA,CAAA,GAAW,IAAA,EAAuB;AAC3D,MAAA,MAAA,CAAO,aAAA,CAAc;AAAA,QACnB,QAAA,EAAU,SAAA;AAAA,QACV,KAAA;AAAA,QACA,OAAA,EAAS,cAAc,IAAI;AAAA,OAC5B,CAAA;AACD,MAAA,cAAA,CAAe,KAAA,CAAM,SAAS,IAAI,CAAA;AAAA,IACpC,CAAA;AAAA,EACF,CAAA;AACA,EAAA,KAAA,CAAM,WAAW,MAAM,CAAA;AACvB,EAAA,KAAA,CAAM,SAAS,OAAO,CAAA;AAEtB,EAAA,OAAO,MAAM;AACX,IAAA,OAAA,CAAQ,OAAO,QAAA,CAAS,IAAA;AACxB,IAAA,OAAA,CAAQ,QAAQ,QAAA,CAAS,KAAA;AAAA,EAC3B,CAAA;AACF;AAEA,SAAS,cAAc,IAAA,EAAyB;AAC9C,EAAA,MAAM,OAAA,GAAU,IAAA,CACb,GAAA,CAAI,CAAC,GAAA,KAAQ;AACZ,IAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,EAAU,OAAO,GAAA;AACpC,IAAA,IAAI,GAAA,YAAe,KAAA,EAAO,OAAO,GAAA,CAAI,OAAA;AACrC,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,UAAU,GAAG,CAAA;AAAA,IAC3B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,OAAO,GAAG,CAAA;AAAA,IACnB;AAAA,EACF,CAAC,CAAA,CACA,IAAA,CAAK,GAAG,CAAA;AACX,EAAA,OAAO,OAAA,CAAQ,SAAS,WAAA,GAAc,CAAA,EAAG,QAAQ,KAAA,CAAM,CAAA,EAAG,WAAW,CAAC,CAAA,MAAA,CAAA,GAAM,OAAA;AAC9E;AAIA,SAAS,UAAU,KAAA,EAA6C;AAC9D,EAAA,OAAO,OAAO,OAAA,KAAY,WAAA,IAAe,KAAA,YAAiB,OAAA;AAC5D;;;ACtHO,SAAS,sBAAsB,MAAA,EAA4B;AAChE,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,MAAM;AAAA,EAAC,CAAA;AAEjD,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAuB;AACtC,IAAA,MAAM,UAAA,GAAa,KAAA;AAEnB,IAAA,IAAI,CAAC,UAAA,CAAW,KAAA,IAAS,CAAC,WAAW,OAAA,EAAS;AAE9C,IAAA,IAAI,WAAW,KAAA,EAAO;AACpB,MAAA,MAAA,CAAO,iBAAiB,UAAA,CAAW,KAAA,EAAO,EAAE,OAAA,EAAS,OAAO,CAAA;AAC5D,MAAA;AAAA,IACF;AACA,IAAA,MAAA,CAAO,iBAAiB,eAAA,CAAgB,UAAU,GAAG,EAAE,OAAA,EAAS,OAAO,CAAA;AAAA,EACzE,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAuB;AAC1C,IAAA,MAAM,SAAA,GAAY,KAAA;AAClB,IAAA,MAAM,MAAA,GAAS,UAAU,MAAA,IAAU,6BAAA;AACnC,IAAA,MAAA,CAAO,gBAAA,CAAiB,MAAA,EAAQ,EAAE,OAAA,EAAS,OAAO,CAAA;AAAA,EACpD,CAAA;AAEA,EAAA,MAAA,CAAO,gBAAA,CAAiB,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA;AAC9C,EAAA,MAAA,CAAO,gBAAA,CAAiB,oBAAA,EAAsB,WAAA,EAAa,IAAI,CAAA;AAE/D,EAAA,OAAO,MAAM;AACX,IAAA,MAAA,CAAO,mBAAA,CAAoB,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA;AACjD,IAAA,MAAA,CAAO,mBAAA,CAAoB,oBAAA,EAAsB,WAAA,EAAa,IAAI,CAAA;AAAA,EACpE,CAAA;AACF;AAIA,SAAS,gBAAgB,KAAA,EAIvB;AACA,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,eAAA;AACjC,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,MAAM,QAAA,EAAU;AAClB,IAAA,MAAM,IAAA,GAAO,MAAM,MAAA,IAAU,CAAA;AAC7B,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,IAAS,CAAA;AAC3B,IAAA,KAAA,GAAQ,UAAU,OAAO;AAAA,OAAA,EAAY,KAAA,CAAM,QAAQ,CAAA,CAAA,EAAI,IAAI,IAAI,GAAG,CAAA,CAAA;AAAA,EACpE;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,KAAA,EAAM;AACzC;;;AC/CA,IAAM,OAAA,GAAU,gEAAA;AAChB,IAAM,cAAA,GAAiB,SAAA;AAEhB,SAAS,eAAe,IAAA,EAAsB;AACnD,EAAA,OAAO,KAAK,OAAA,CAAQ,OAAA,EAAS,QAAQ,CAAA,CAAE,OAAA,CAAQ,gBAAgB,KAAK,CAAA;AACtE;;;ACKO,IAAM,sBAAN,MAA0B;AAAA,EAG/B,YACmB,QAAA,EACA,GAAA,GAAoB,MAAM,IAAA,CAAK,KAAI,EACpD;AAFiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAJnB,IAAA,IAAA,CAAiB,IAAA,uBAAW,GAAA,EAAsB;AAAA,EAK/C;AAAA;AAAA,EAGH,OAAO,GAAA,EAAqB;AAC1B,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,IAAA,MAAM,MAAA,GAAS,UAAU,IAAA,CAAK,QAAA;AAC9B,IAAA,MAAM,UAAA,GAAA,CAAc,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,IAAK,EAAC,EAAG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,GAAI,MAAM,CAAA;AACtE,IAAA,UAAA,CAAW,KAAK,OAAO,CAAA;AACvB,IAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,UAAU,CAAA;AAC7B,IAAA,OAAO,UAAA,CAAW,MAAA;AAAA,EACpB;AACF,CAAA;AAGO,SAAS,2BAA2B,MAAA,EAA4B;AACrE,EAAA,MAAM,UAAU,IAAI,mBAAA;AAAA,IAClB,OAAO,OAAA,CAAQ,oBAAA;AAAA,IACf,MAAA,CAAO;AAAA,GACT;AACA,EAAA,MAAM,UAAA,GAAa,CAAC,YAAA,CAAa,MAAA,EAAQ,OAAO,CAAA,EAAG,UAAA,CAAW,MAAA,EAAQ,OAAO,CAAC,CAAA;AAC9E,EAAA,OAAO,MAAM,UAAA,CAAW,OAAA,CAAQ,CAAC,EAAA,KAAO,IAAI,CAAA;AAC9C;AAEA,SAAS,YAAA,CAAa,QAAgB,OAAA,EAA0C;AAC9E,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,MAAA,CAAO,UAAU,UAAA,EAAY;AACvE,IAAA,OAAO,MAAM;AAAA,IAAC,CAAA;AAAA,EAChB;AACA,EAAA,MAAM,gBAAgB,MAAA,CAAO,KAAA;AAE7B,EAAA,MAAA,CAAO,KAAA,GAAQ,SAAS,YAAA,CAEtB,KAAA,EACAH,KAAAA,EACmB;AACnB,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,EAAOA,KAAI,CAAA;AACnC,IAAA,MAAM,GAAA,GAAM,MAAM,KAAK,CAAA;AACvB,IAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,EAAM;AAE3B,IAAA,OAAO,aAAA,CACJ,KAAK,MAAA,EAAQ,KAAA,EAAOA,KAAI,CAAA,CACxB,IAAA,CAAK,CAAC,QAAA,KAAa;AAClB,MAAA,eAAA,CAAgB,QAAQ,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,QAAA,CAAS,QAAQ,KAAK,CAAA;AACpE,MAAA,OAAO,QAAA;AAAA,IACT,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAmB;AACzB,MAAA,eAAA,CAAgB,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,GAAG,KAAK,CAAA;AACtD,MAAA,MAAM,KAAA;AAAA,IACR,CAAC,CAAA;AAAA,EACL,CAAA;AAEA,EAAA,OAAO,MAAM;AACX,IAAA,MAAA,CAAO,KAAA,GAAQ,aAAA;AAAA,EACjB,CAAA;AACF;AAEA,SAAS,UAAA,CAAW,QAAgB,OAAA,EAA0C;AAC5E,EAAA,IAAI,OAAO,cAAA,KAAmB,WAAA,EAAa,OAAO,MAAM;AAAA,EAAC,CAAA;AAEzD,EAAA,MAAM,QAAQ,cAAA,CAAe,SAAA;AAC7B,EAAA,MAAM,eAAe,KAAA,CAAM,IAAA;AAC3B,EAAA,MAAM,eAAe,KAAA,CAAM,IAAA;AAQ3B,EAAA,KAAA,CAAM,IAAA,GAAO,SAAS,WAAA,CAEpB,MAAA,EACA,QACG,IAAA,EACG;AACN,IAAA,IAAA,CAAK,WAAA,GAAc,OAAO,WAAA,EAAY;AACtC,IAAA,IAAA,CAAK,WAAW,OAAO,GAAA,KAAQ,QAAA,GAAW,GAAA,GAAM,IAAI,QAAA,EAAS;AAE7D,IAAA,OAAO,aAAa,IAAA,CAAK,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAK,GAAG,IAAI,CAAA;AAAA,EACrD,CAAA;AAEA,EAAA,KAAA,CAAM,IAAA,GAAO,SAAS,WAAA,CAAA,GAEjB,IAAA,EACG;AACN,IAAA,IAAA,CAAK,UAAA,GAAa,OAAO,KAAA,EAAM;AAC/B,IAAA,IAAA,CAAK,gBAAA,CAAiB,WAAW,MAAM;AACrC,MAAA,eAAA;AAAA,QACE,MAAA;AAAA,QACA,OAAA;AAAA,QACA,KAAK,WAAA,IAAe,KAAA;AAAA,QACpB,KAAK,QAAA,IAAY,EAAA;AAAA,QACjB,IAAA,CAAK,MAAA;AAAA,QACL,IAAA,CAAK,UAAA,IAAc,MAAA,CAAO,KAAA;AAAM,OAClC;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,YAAA,CAAa,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAAA,EACtC,CAAA;AAEA,EAAA,OAAO,MAAM;AACX,IAAA,KAAA,CAAM,IAAA,GAAO,YAAA;AACb,IAAA,KAAA,CAAM,IAAA,GAAO,YAAA;AAAA,EACf,CAAA;AACF;AAGA,SAAS,gBACP,MAAA,EACA,OAAA,EACA,MAAA,EACA,MAAA,EACA,QACA,OAAA,EACM;AACN,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,KAAA,EAAM,GAAI,OAAA;AACpC,EAAA,MAAM,GAAA,GAAM,SAAS,MAAM,CAAA;AAC3B,EAAA,MAAM,IAAA,GAAO,OAAO,GAAG,CAAA;AACvB,EAAA,IAAI,IAAA,IAAQ,IAAA,KAAS,MAAA,CAAO,YAAA,EAAc;AAE1C,EAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,EAAA,MAAM,QAAA,GAAW,OAAO,QAAA,KAAa,WAAA,GAAc,SAAS,IAAA,GAAO,MAAA;AACnE,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,IAAA,EAAM,MAAA,CAAO,cAAc,QAAQ,CAAA;AAEnE,EAAA,IAAI,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,eAAA,CAAgB,IAAA,EAAM;AACvD,IAAA,MAAM,QAAQ,cAAA,CAAe;AAAA,MAC3B,MAAA;AAAA,MACA,GAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,iBAAiB,OAAA,CAAQ;AAAA,KAC1B,CAAA;AACD,IAAA,MAAA,CAAO,cAAc,KAAK,CAAA;AAAA,EAC5B;AAEA,EAAA,IAAI,YAAY,IAAA,EAAM;AACpB,IAAA,MAAM,IAAA,GAAO,cAAA,CAAe,UAAA,CAAW,GAAG,CAAC,CAAA;AAE3C,IAAA,MAAA,CAAO,kBAAA,CAAmB,IAAA,EAAM,IAAA,EAAM,UAAU,CAAA;AAChD,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAA,CAAO,CAAA,EAAG,IAAI;AAAA,EAAK,IAAI,CAAA,CAAE,CAAA;AAC/C,IAAA,IAAI,KAAA,KAAU,QAAQ,qBAAA,EAAuB;AAC3C,MAAA,MAAA,CAAO,kBAAA,CAAmB,IAAA,EAAM,IAAA,EAAM,KAAK,CAAA;AAAA,IAC7C;AAAA,EACF;AACF;AAeO,SAAS,eAAe,GAAA,EAA6C;AAC1E,EAAA,MAAM,IAAA,GAAgC;AAAA,IACpC,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,KAAK,GAAA,CAAI,GAAA;AAAA,IACT,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,WAAA,EAAa,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,UAAU;AAAA,GACxC;AACA,EAAA,MAAM,IAAA,GACJ,IAAI,eAAA,GAAkB,CAAA,IAAK,IAAI,UAAA,IAAc,GAAA,CAAI,mBAAmB,GAAA,CAAI,QAAA;AAE1E,EAAA,MAAM,QAAyB,EAAE,QAAA,EAAU,MAAA,EAAQ,IAAA,EAAM,QAAQ,IAAA,EAAK;AACtE,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,IAAA,CAAK,oBAAoB,CAAA,GAAI,IAAA;AAC7B,IAAA,KAAA,CAAM,KAAA,GAAQ,SAAA;AAAA,EAChB;AACA,EAAA,OAAO,KAAA;AACT;AAGA,SAAS,cAAA,CACP,IAAA,EACAI,aAAAA,EACA,QAAA,EACS;AACT,EAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,EAAA,IAAI,IAAA,KAASA,eAAc,OAAO,KAAA;AAClC,EAAA,IAAI,QAAA,IAAY,IAAA,KAAS,QAAA,EAAU,OAAO,KAAA;AAC1C,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,MAAM,KAAA,EAAkC;AACtD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI,KAAA,YAAiB,GAAA,EAAK,OAAO,KAAA,CAAM,QAAA,EAAS;AAChD,EAAA,OAAO,KAAA,CAAM,GAAA;AACf;AAEA,SAAS,QAAA,CAAS,OAA0BJ,KAAAA,EAA4B;AACtE,EAAA,IAAIA,KAAAA,EAAM,MAAA,EAAQ,OAAOA,KAAAA,CAAK,OAAO,WAAA,EAAY;AACjD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,QAAA,IAAY,KAAA,IAAS,MAAM,MAAA,EAAQ;AAClE,IAAA,OAAO,KAAA,CAAM,OAAO,WAAA,EAAY;AAAA,EAClC;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,OAAO,GAAA,EAAiC;AAC/C,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,GAAA,CAAI,GAAG,CAAA,CAAE,IAAA;AAAA,EACtB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAEA,SAAS,WAAW,GAAA,EAAqB;AACvC,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA;AAAA,EACtB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,GAAA;AAAA,EACT;AACF;;;AC5NO,SAAS,qBAAqB,MAAA,EAA4B;AAC/D,EAAA,MAAM,WAAW,UAAA,CAAW,mBAAA;AAE5B,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,SAAS,mBAAA,EAAqB,QAAA,CAAS,UAAU,CAAA,EAAG;AACpE,IAAA,OAAO,MAAM;AAAA,IAAC,CAAA;AAAA,EAChB;AAEA,EAAA,MAAM,QAAA,GAAW,IAAI,QAAA,CAAS,CAAC,IAAA,KAAS;AACtC,IAAA,KAAA,MAAW,KAAA,IAAU,IAAA,CAAsB,UAAA,EAAW,EAAG;AACvD,MAAA,IAAI,KAAA,CAAM,QAAA,IAAY,MAAA,CAAO,OAAA,CAAQ,eAAA,EAAiB;AACtD,MAAA,MAAA,CAAO,UAAA,CAAW,KAAA,CAAM,QAAA,EAAU,YAAA,EAAc,CAAA;AAAA,IAClD;AAAA,EACF,CAAC,CAAA;AAED,EAAA,IAAI;AACF,IAAA,QAAA,CAAS,QAAQ,EAAE,UAAA,EAAY,CAAC,UAAU,GAAG,CAAA;AAAA,EAC/C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAM;AAAA,IAAC,CAAA;AAAA,EAChB;AAEA,EAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AACnC;AAEA,SAAS,YAAA,GAAuB;AAC9B,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,WAAA;AAC5C,EAAA,OAAO,cAAA,CAAe,SAAS,QAAQ,CAAA;AACzC;;;AC/BO,SAAS,iBAAiB,MAAA,EAA4B;AAC3D,EAAA,MAAA,CAAO,eAAA,EAAgB;AACvB,EAAA,IAAI,eAAe,QAAA,CAAS,QAAA;AAE5B,EAAA,OAAO,oBAAoB,MAAM;AAC/B,IAAA,IAAI,QAAA,CAAS,aAAa,YAAA,EAAc;AACxC,IAAA,YAAA,GAAe,QAAA,CAAS,QAAA;AACxB,IAAA,MAAA,CAAO,eAAA,EAAgB;AAAA,EACzB,CAAC,CAAA;AACH;;;ACKO,SAAS,iBAAiB,KAAA,EAAuC;AACtE,EAAA,OAAO;AAAA,IACL,mBAAmB,KAAA,CAAM,eAAA;AAAA,IACzB,KAAK,KAAA,CAAM,GAAA;AAAA,IACX,YAAY,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,EAAE,WAAA,EAAY;AAAA,IAClD,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,GAAI,MAAM,IAAA,GAAO,EAAE,MAAM,KAAA,CAAM,IAAA,KAAS,EAAC;AAAA,IACzC,GAAI,MAAM,IAAA,GAAO,EAAE,MAAM,KAAA,CAAM,IAAA,KAAS;AAAC,GAC3C;AACF;;;AC3BO,IAAM,kBAAA,GAAqB,YAAA;AAkBlC,IAAI,aAAA,GAAsC,IAAA;AAKnC,SAAS,mBAAA,CACd,UAA0C,cAAA,EAAe,EACzD,MAAoB,MAAM,IAAA,CAAK,KAAI,EACpB;AACf,EAAA,MAAM,KAAA,GAAQ,OAAA,KAAY,MAAA,GAAY,cAAA,EAAe,GAAI,OAAA;AACzD,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,QAAA,GAAW,WAAW,KAAK,CAAA;AACjC,IAAA,IAAI,UAAU,OAAO,QAAA;AACrB,IAAA,MAAM,UAAyB,EAAE,EAAA,EAAI,gBAAe,EAAG,SAAA,EAAW,KAAI,EAAE;AACxE,IAAA,WAAA,CAAY,OAAO,OAAO,CAAA;AAC1B,IAAA,OAAO,OAAA;AAAA,EACT;AACA,EAAA,IAAI,eAAe,OAAO,aAAA;AAC1B,EAAA,aAAA,GAAgB,EAAE,EAAA,EAAI,cAAA,EAAe,EAAG,SAAA,EAAW,KAAI,EAAE;AACzD,EAAA,OAAO,aAAA;AACT;AAOA,SAAS,WAAW,OAAA,EAA4C;AAC9D,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,OAAA,CAAQ,QAAQ,kBAAkB,CAAA;AAAA,EAC1C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,IAAI,OAAO,MAAA,CAAO,EAAA,KAAO,YAAY,OAAO,MAAA,CAAO,cAAc,QAAA,EAAU;AACzE,MAAA,OAAO,EAAE,EAAA,EAAI,MAAA,CAAO,EAAA,EAAI,SAAA,EAAW,OAAO,SAAA,EAAU;AAAA,IACtD;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,WAAA,CAAY,SAAsB,OAAA,EAA8B;AACvE,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,OAAA,CAAQ,kBAAA,EAAoB,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,EAC7D,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEA,SAAS,cAAA,GAAqC;AAC5C,EAAA,IAAI;AACF,IAAA,IAAI,OAAO,cAAA,KAAmB,WAAA,EAAa,OAAO,cAAA;AAAA,EACpD,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,IAAA;AACT;;;AC9CA,IAAM,iBAAA,GAAoB,GAAA;AAInB,SAAS,aAAA,CAAc,MAAA,EAAgB,IAAA,GAAmB,EAAC,EAAe;AAC/E,EAAA,MAAM,OAAA,GAAU,mBAAA,CAAoB,IAAA,CAAK,OAAA,EAAS,KAAK,GAAG,CAAA;AAC1D,EAAA,MAAA,CAAO,kBAAA,CAAmB,QAAQ,EAAE,CAAA;AACnC,EAAA,CAAC,IAAA,CAAK,gBAAA,IAAoB,iBAAA,EAAmB,OAAA,CAAQ,EAAE,CAAA;AAExD,EAAA,IAAI,SAAoB,EAAC;AACzB,EAAA,IAAI,GAAA,GAAM,CAAA;AAEV,EAAA,MAAMK,SAAQ,MAAY;AACxB,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACzB,IAAA,MAAM,MAAA,GAAS,MAAA;AACf,IAAA,MAAA,GAAS,EAAC;AACV,IAAA,MAAA,CAAO,kBAAA;AAAA,MACL,gBAAA,CAAiB;AAAA,QACf,iBAAiB,OAAA,CAAQ,EAAA;AAAA,QACzB,GAAA,EAAK,GAAA,EAAA;AAAA,QACL,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,MAAA;AAAA,QACA,MAAM,WAAA,EAAY;AAAA,QAClB,IAAA,EAAM,OAAO,KAAA,CAAM;AAAA,OACpB;AAAA,KACH;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,IAAU,aAAA;AAC9B,EAAA,MAAM,OAAO,MAAA,CAAO;AAAA,IAClB,IAAA,EAAM,CAAC,KAAA,KAAU;AACf,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACjB,MAAA,IAAI,MAAA,CAAO,MAAA,IAAU,iBAAA,EAAmBA,MAAAA,EAAM;AAAA,IAChD,CAAA;AAAA,IACA,aAAA,EAAe,OAAO,OAAA,CAAQ,mBAAA;AAAA,IAC9B,aAAA,EAAe,OAAO,OAAA,CAAQ,mBAAA;AAAA,IAC9B,gBAAA,EAAkB,OAAO,OAAA,CAAQ;AAAA,GAClC,CAAA;AAED,EAAA,MAAM,QAAA,GAAW,WAAA,CAAYA,MAAAA,EAAO,MAAA,CAAO,QAAQ,qBAAqB,CAAA;AACxE,EAAA,MAAM,MAAA,GAAS,MAAYA,MAAAA,EAAM;AACjC,EAAA,MAAM,eAAe,MAAY;AAC/B,IAAA,IAAI,OAAO,QAAA,KAAa,WAAA,IAAe,QAAA,CAAS,oBAAoB,QAAA,EAAU;AAC5E,MAAAA,MAAAA,EAAM;AAAA,IACR;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,MAAM,CAAA;AAAA,EAC5C;AACA,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,IAAA,QAAA,CAAS,gBAAA,CAAiB,oBAAoB,YAAY,CAAA;AAAA,EAC5D;AAEA,EAAA,OAAO,MAAM;AACX,IAAA,aAAA,CAAc,QAAQ,CAAA;AACtB,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAA,CAAO,mBAAA,CAAoB,YAAY,MAAM,CAAA;AAAA,IAC/C;AACA,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,MAAA,QAAA,CAAS,mBAAA,CAAoB,oBAAoB,YAAY,CAAA;AAAA,IAC/D;AACA,IAAA,IAAA,EAAK;AACL,IAAAA,MAAAA,EAAM;AAAA,EACR,CAAA;AACF;AAIA,SAAS,WAAA,GAAkC;AACzC,EAAA,OAAO,OAAO,QAAA,KAAa,WAAA,GAAc,QAAA,CAAS,QAAA,GAAW,MAAA;AAC/D;AAUA,SAAS,cAAc,IAAA,EAAuC;AAC5D,EAAA,MAAM,QAAS,UAAA,CAAuC,KAAA;AACtD,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,MAAM,MAAA,KAAW,UAAA,SAAmB,MAAM;AAAA,EAAC,CAAA;AAChE,EAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO;AAAA,IACxB,IAAA,EAAM,CAAC,KAAA,KAAmB,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,IACzC,eAAe,IAAA,CAAK,aAAA;AAAA,IACpB,GAAI,KAAK,aAAA,GAAgB,EAAE,eAAe,IAAA,CAAK,aAAA,KAAkB,EAAC;AAAA,IAClE,GAAI,KAAK,gBAAA,GAAmB,EAAE,kBAAkB,IAAA,CAAK,gBAAA,KAAqB;AAAC,GAC5E,CAAA;AACD,EAAA,OAAO,OAAO,IAAA,KAAS,UAAA,GAAa,IAAA,GAAO,MAAM;AAAA,EAAC,CAAA;AACpD;AAMA,SAAS,kBAAkB,EAAA,EAAkB;AAC3C,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,EAAA,IAAI;AACF,IAAA,QAAA,CAAS,MAAA,GAAS,CAAA,WAAA,EAAc,kBAAA,CAAmB,EAAE,CAAC,CAAA,sBAAA,CAAA;AAAA,EACxD,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;;;ACrHA,IAAM,qBAAA,GAAwB,EAAA;AAK9B,IAAM,eAAA,GAA0C;AAAA,EAC9C,MAAA,EAAQ,qBAAA;AAAA,EACR,IAAA,EAAM,8BAAA;AAAA,EACN,GAAA,EAAK,uBAAA;AAAA,EACL,KAAA,EAAO,uBAAA;AAAA,EACP,KAAA,EAAO,oBAAA;AAAA,EACP,KAAA,EAAO,oBAAA;AAAA,EACP,MAAA,EAAQ,oCAAA;AAAA,EACR,KAAA,EAAO,sBAAA;AAAA,EACP,MAAA,EAAQ,oCAAA;AAAA,EACR,MAAA,EAAQ,sBAAA;AAAA,EACR,KAAA,EAAO;AACT,CAAA;AAIO,SAAS,sBAAsB,MAAA,EAA4B;AAChE,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,MAAM;AAAA,EAAC,CAAA;AAKjD,EAAA,MAAM,QAAA,GAAwC;AAAA,IAC5C,aAAA,sBAAmB,GAAA,EAAI;AAAA,IACvB,YAAA,sBAAkB,GAAA;AAAI,GACxB;AAEA,EAAA,MAAM,OAAA,GAAU,CACd,IAAA,EACA,GAAA,EACA,SACA,QAAA,KACS;AACT,IAAA,MAAM,IAAA,GAAO,SAAS,IAAI,CAAA;AAC1B,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACnB,IAAA,IAAI,IAAA,CAAK,QAAQ,qBAAA,EAAuB;AACxC,IAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,IAAA,MAAA,CAAO,gBAAA;AAAA,MACL,EAAE,MAAM,OAAA,EAAQ;AAAA,MAChB,EAAE,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,MAAM,QAAA;AAAS,KAC9C;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAuB;AAEtC,IAAA,MAAM,UAAA,GAAa,KAAA;AACnB,IAAA,IAAI,UAAA,CAAW,KAAA,IAAS,UAAA,CAAW,OAAA,EAAS;AAE5C,IAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,KAAW,UAAU,CAACC,UAAAA,CAAU,MAAM,CAAA,EAAG;AAExD,IAAA,MAAM,GAAA,GAAM,YAAY,MAAM,CAAA;AAC9B,IAAA,IAAI,CAAC,GAAA,EAAK;AAEV,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,WAAA,EAAY;AAC3C,IAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,OAAO,CAAA,IAAK,sBAAA;AAC1C,IAAA,OAAA,CAAQ,iBAAiB,GAAA,EAAK,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,EAAI;AAAA,MAChD,QAAA,EAAU,EAAE,GAAA,EAAK,OAAA;AAAQ,KAC1B,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAuB;AAC1C,IAAA,MAAM,SAAA,GAAY,KAAA;AAClB,IAAA,MAAM,SAAA,GACJ,SAAA,CAAU,kBAAA,IAAsB,SAAA,CAAU,iBAAA,IAAqB,QAAA;AACjE,IAAA,MAAM,UAAU,SAAA,CAAU,UAAA,GAAaC,WAAAA,CAAW,SAAA,CAAU,UAAU,CAAA,GAAI,QAAA;AAC1E,IAAA,MAAM,aAAa,SAAA,CAAU,UAAA,GACzBA,WAAAA,CAAW,SAAA,CAAU,UAAU,CAAA,GAC/B,MAAA;AAEJ,IAAA,OAAA;AAAA,MACE,cAAA;AAAA,MACA,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAAA,MACvB,CAAA,EAAG,SAAS,CAAA,aAAA,EAAgB,OAAO,CAAA,CAAA;AAAA,MACnC;AAAA,QACE,GAAA,EAAK;AAAA,UACH,WAAA,EAAa,OAAA;AAAA,UACb,mBAAA,EAAqB,SAAA;AAAA,UACrB,GAAI,UAAU,WAAA,GAAc,EAAE,aAAa,SAAA,CAAU,WAAA,KAAgB,EAAC;AAAA,UACtE,GAAI,UAAA,GAAa,EAAE,WAAA,EAAa,UAAA,KAAe,EAAC;AAAA,UAChD,GAAI,UAAU,UAAA,GAAa,EAAE,aAAa,SAAA,CAAU,UAAA,KAAe;AAAC;AACtE;AACF,KACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAA,CAAO,gBAAA,CAAiB,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA;AAC9C,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,IAAA,QAAA,CAAS,gBAAA,CAAiB,2BAA2B,WAAW,CAAA;AAAA,EAClE;AAEA,EAAA,OAAO,MAAM;AACX,IAAA,MAAA,CAAO,mBAAA,CAAoB,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA;AACjD,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,MAAA,QAAA,CAAS,mBAAA,CAAoB,2BAA2B,WAAW,CAAA;AAAA,IACrE;AAAA,EACF,CAAA;AACF;AAEA,SAASD,WAAU,MAAA,EAAwC;AACzD,EAAA,OAAO,OAAQ,OAAmB,OAAA,KAAY,QAAA;AAChD;AAOA,SAAS,YAAY,OAAA,EAAsC;AACzD,EAAA,MAAM,UAAW,OAAA,CAAqC,UAAA;AACtD,EAAA,MAAM,OACH,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,GAAU,UAAU,IAAA,KACpD,OAAA,CAAQ,YAAA,CAAa,KAAK,KAC1B,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA,IAC3B,OAAA,CAAQ,aAAa,MAAM,CAAA;AAC7B,EAAA,IAAI,CAAC,KAAK,OAAO,MAAA;AACjB,EAAA,OAAOC,YAAW,GAAG,CAAA;AACvB;AAEA,SAASA,YAAW,GAAA,EAAqB;AACvC,EAAA,OAAO,IAAI,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA,CAAE,CAAC,CAAA,IAAK,GAAA;AACpC;;;ACvIA,IAAI,kBAAA,GAAqB,EAAA;AAElB,IAAM,wBAAwB,MAAM,kBAAA;AAEpC,IAAM,gBAAA,GAAmB,CAAC,EAAA,KAAgC;AAC/D,EAAA,gBAAA,CACE,UAAA,EACA,CAAC,KAAA,KAAS;AACR,IAAA,IAAI,MAAM,SAAA,EAAW;AACnB,MAAA,kBAAA,GAAqB,KAAA,CAAM,SAAA;AAC3B,MAAA,EAAA,CAAG,KAAK,CAAA;AACV,IAAA;AACF,EAAA,CAAA,EACA,IAAI,CAAA;AAER,CAAA;;;ACjBA,IAAM,SAAA,GAAY,CAChB,KAAA,EACA,UAAA,KACwB;AACxB,EAAA,IAAI,KAAA,GAAQ,UAAA,CAAW,CAAC,CAAA,EAAG;AACzB,IAAA,OAAO,MAAA;AACT,EAAA;AACA,EAAA,IAAI,KAAA,GAAQ,UAAA,CAAW,CAAC,CAAA,EAAG;AACzB,IAAA,OAAO,mBAAA;AACT,EAAA;AACA,EAAA,OAAO,MAAA;AACT,CAAA;AAEO,IAAM,YAAA,GAAe,CAC1B,QAAA,EACA,MAAA,EACA,YACA,gBAAA,KACE;AACF,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,KAAA;AACJ,EAAA,OAAO,CAAC,WAAA,KAAyB;AAC/B,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,IAAI,eAAe,gBAAA,EAAkB;AACnC,QAAA,KAAA,GAAQ,MAAA,CAAO,SAAS,SAAA,IAAa,CAAA,CAAA;AAMrC,QAAA,IAAI,KAAA,IAAS,cAAc,MAAA,EAAW;AACpC,UAAA,SAAA,GAAY,MAAA,CAAO,KAAA;AACnB,UAAA,MAAA,CAAO,KAAA,GAAQ,KAAA;AACf,UAAA,MAAA,CAAO,MAAA,GAAS,SAAA,CAAU,MAAA,CAAO,KAAA,EAAO,UAAU,CAAA;AAClD,UAAA,QAAA,CAAS,MAAM,CAAA;AACjB,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA,CAAA;AACF,CAAA;;;ACzCO,IAAM,SAAA,GAAY,CAAC,EAAA,KAAqB;AAC7C,EAAA,qBAAA,CAAsB,MAAM,qBAAA,CAAsB,EAAE,CAAC,CAAA;AACvD,CAAA;;;ACFO,IAAM,qBAAqB,MAAyC;AACzE,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,gBAAA,CAAiB,YAAY,EAAE,CAAC,CAAA;AASpE,EAAA,IACE,eAAA,IACA,gBAAgB,aAAA,GAAgB,CAAA,IAChC,gBAAgB,aAAA,GAAgB,WAAA,CAAY,KAAG,EAC/C;AACA,IAAA,OAAO,eAAA;AACT,EAAA;AACF,CAAA;;;ACfO,IAAM,qBAAqB,MAAa;AAC7C,EAAA,OAAO,kBAAA,IAAsB,eAAA,IAAmB,CAAA;AAClD,CAAA;;;ACDA,IAAI,eAAA,GAAkB,EAAA;AACtB,IAAM,iBAAA,uBAAyC,GAAA,EAAG;AAElD,IAAM,iBAAiB,MAAK;AAM1B,EAAA,OAAO,SAAS,eAAA,KAAoB,QAAA,IAAY,CAAC,QAAA,CAAS,eACtD,CAAA,GACA,QAAA;AACN,CAAA;AAEA,IAAM,kBAAA,GAAqB,CAAC,KAAA,KAAgB;AAE1C,EAAA,IAAI,QAAA,CAAS,oBAAoB,QAAA,EAAU;AACzC,IAAA,IAAI,KAAA,CAAM,SAAS,kBAAA,EAAoB;AACrC,MAAA,KAAA,MAAW,oBAAoB,iBAAA,EAAmB;AAChD,QAAA,gBAAA,EAAgB;AAClB,MAAA;AACF,IAAA;AAIA,IAAA,IAAI,CAAC,QAAA,CAAS,eAAe,CAAA,EAAG;AAQ9B,MAAA,eAAA,GAAkB,KAAA,CAAM,IAAA,KAAS,kBAAA,GAAqB,KAAA,CAAM,SAAA,GAAY,CAAA;AAKxE,MAAA,mBAAA,CAAoB,oBAAA,EAAsB,oBAAoB,IAAI,CAAA;AACpE,IAAA;AACF,EAAA;AACF,CAAA;AAEO,IAAM,oBAAA,GAAuB,CAAC,KAAA,GAAQ,KAAA,KAAS;AACpD,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,eAAA,GAAkB,QAAA;AACpB,EAAA;AACA,EAAA,IAAI,kBAAkB,CAAA,EAAG;AAEvB,IAAA,MAAM,kBAAkB,kBAAA,EAAkB;AAE1C,IAAA,MAAM,iCAAiC,CAAC,QAAA,CAAS,eAC7C,UAAA,CAAW,WAAA,CACR,iBAAiB,kBAAkB,CAAA,CACnC,KAAK,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,QAAA,IAAY,EAAE,SAAA,IAAa,eAAe,GAChE,SAAA,GACJ,MAAA;AAOJ,IAAA,eAAA,GAAkB,kCAAkC,cAAA,EAAc;AAKlE,IAAA,gBAAA,CAAiB,kBAAA,EAAoB,oBAAoB,IAAI,CAAA;AAK7D,IAAA,gBAAA,CAAiB,oBAAA,EAAsB,oBAAoB,IAAI,CAAA;AAG/D,IAAA,gBAAA,CAAiB,MAAK;AAIpB,MAAA,UAAA,CAAW,MAAK;AACd,QAAA,eAAA,GAAkB,cAAA,EAAc;MAClC,CAAC,CAAA;IACH,CAAC,CAAA;AACH,EAAA;AACA,EAAA,OAAO;AACL,IAAA,IAAI,eAAA,GAAe;AACjB,MAAA,OAAO,eAAA;AACT,IAAA,CAAA;AACA,IAAA,QAAA,CAAS,EAAA,EAAc;AACrB,MAAA,iBAAA,CAAkB,IAAI,EAAE,CAAA;AAC1B,IAAA;;AAEJ,CAAA;;;AC3FO,IAAM,mBAAmB,MAAK;AACnC,EAAA,OAAO,CAAA,GAAA,EAAM,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAM,IAAM,IAAA,GAAO,CAAA,CAAE,IAAI,IAAI,CAAA,CAAA;AAC1E,CAAA;;;ACDO,IAAM,UAAA,GAAa,CACxB,IAAA,EACA,KAAA,GAAgB,EAAA,EAChB,gBACA,YAAA,GAAuB,CAAA,EACvB,uBAAA,EACA,aAAA,EACA,mBAAA,KACE;AACF,EAAA,MAAM,eAAe,kBAAA,EAAkB;AACvC,EAAA,MAAM,SAAA,GAAY,cAAc,YAAA,IAAgB,CAAA;AAChD,EAAA,IAAI,eAAA,GAAgD,UAAA;AAEpD,EAAA,IAAI,cAAA,EAAgB;AAElB,IAAA,eAAA,GAAkB,cAAA;EACpB,CAAA,MAAA,IAAW,qBAAA,MAA2B,CAAA,EAAG;AACvC,IAAA,eAAA,GAAkB,oBAAA;AACpB,EAAA,CAAA,MAAA,IAAW,YAAA,EAAc;AACvB,IAAA,IAAI,QAAA,CAAS,YAAA,IAAgB,kBAAA,EAAkB,GAAK,CAAA,EAAG;AACrD,MAAA,eAAA,GAAkB,WAAA;AACpB,IAAA,CAAA,MAAA,IAAW,SAAS,YAAA,EAAc;AAChC,MAAA,eAAA,GAAkB,SAAA;AACpB,IAAA,CAAA,MAAA,IAAW,aAAa,IAAA,EAAM;AAC5B,MAAA,eAAA,GAAkB,YAAA,CAAa,IAAA,CAAK,OAAA,CAClC,IAAA,EACA,GAAG,CAAA;AAEP,IAAA;AACF,EAAA;AAGA,EAAA,MAAM,UAA8D,EAAA;AAEpE,EAAA,OAAO;AACL,IAAA,IAAA;AACA,IAAA,KAAA;IACA,MAAA,EAAQ,MAAA;;IACR,KAAA,EAAO,CAAA;AACP,IAAA,OAAA;AACA,IAAA,EAAA,EAAI,gBAAA,EAAgB;IACpB,cAAA,EAAgB,eAAA;AAChB,IAAA,YAAA,EAAc,YAAA,IAAgB,SAAA;AAC9B,IAAA,uBAAA;AACA,IAAA,aAAA,EAAe,iBAAiB,YAAA,EAAc,IAAA;AAC9C,IAAA,mBAAA,EAAqB,mBAAA,IAAuB;;AAEhD,CAAA;;;ACrDA,IAAM,WAAA,uBAGE,OAAA,EAAO;AAOT,SAAU,UAAA,CAAc,aAAqB,QAAA,EAAqB;AACtE,EAAA,IAAI,cAAA,GAAiB,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AAC7C,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,cAAA,uBAAqB,OAAA,EAAO;AAC5B,IAAA,WAAA,CAAY,GAAA,CAAI,UAAU,cAAc,CAAA;AAC1C,EAAA;AACA,EAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,WAAW,CAAA,EAAG;AACpC,IAAA,cAAA,CAAe,GAAA,CAAI,WAAA,EAAa,IAAI,QAAA,EAAU,CAAA;AAChD,EAAA;AACA,EAAA,OAAO,cAAA,CAAe,IAAI,WAAW,CAAA;AACvC;;;ACpBM,IAAO,qBAAP,MAAyB;AAAzB,EAAA,WAAA,GAAA;AACJ,IAAA,aAAA,CAAA,IAAA,EAAA,mCAAA,CAAA;AAEA,IAAA,aAAA,CAAA,IAAA,EAAA,eAAA,EAAgB,CAAA,CAAA;AAChB,IAAA,aAAA,CAAA,IAAA,EAAA,iBAAA,EAAiC,EAAA,CAAA;;AAEjC,EAAA,aAAA,CAAc,KAAA,EAAkB;AAE9B,IAAA,IAAI,KAAA,CAAM,cAAA;AAAgB,MAAA;AAE1B,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,eAAA,CAAgB,CAAC,CAAA;AAChD,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,eAAA,CAAgB,EAAA,CAAG,EAAE,CAAA;AAMnD,IAAA,IACE,IAAA,CAAK,aAAA,IACL,iBAAA,IACA,gBAAA,IACA,KAAA,CAAM,SAAA,GAAY,gBAAA,CAAiB,SAAA,GAAY,GAAA,IAC/C,KAAA,CAAM,SAAA,GAAY,iBAAA,CAAkB,YAAY,GAAA,EAChD;AACA,MAAA,IAAA,CAAK,iBAAiB,KAAA,CAAM,KAAA;AAC5B,MAAA,IAAA,CAAK,eAAA,CAAgB,KAAK,KAAK,CAAA;IACjC,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,gBAAgB,KAAA,CAAM,KAAA;AAC3B,MAAA,IAAA,CAAK,eAAA,GAAkB,CAAC,KAAK,CAAA;AAC/B,IAAA;AAEA,IAAA,IAAA,CAAK,oCAAoC,KAAK,CAAA;AAChD,EAAA;;;;ACXK,IAAM,UAAU,CACrB,KAAA,EACA,QAAA,EACA,IAAA,GAAgC,EAAA,KACG;AACnC,EAAA,IAAI;AACF,IAAA,MAAM,cAAA,GAAiB,MAAM,MAAA,CAAO,CAAC,MACnC,mBAAA,CAAoB,mBAAA,CAAoB,QAAA,CAAS,CAAC,CAAC,CAAA;AAErD,IAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,MAAA,MAAMC,GAAAA,GAAK,IAAI,mBAAA,CAAoB,CAAC,IAAA,KAAQ;AAI1C,QAAA,cAAA,CAAe,MAAK;AAClB,UAAA,MAAM,OAAA,GAAU,KAAK,UAAA,EAAU;AAK/B,UAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,YAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAK;AACpB,cAAA,MAAM,MAAA,GAAS,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,QAAA;AAC/B,cAAA,MAAM,MAAA,GAAS,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,QAAA;AAE/B,cAAA,OAAO,MAAA,GAAS,MAAA;YAClB,CAAC,CAAA;AACH,UAAA;AACA,UAAA,QAAA,CAAS,OAAgD,CAAA;QAC3D,CAAC,CAAA;MACH,CAAC,CAAA;AAED,MAAA,KAAA,MAAW,KAAK,cAAA,EAAgB;AAC9B,QAAAA,GAAAA,CAAG,QAAQ,EAAC,IAAA,EAAM,GAAG,QAAA,EAAU,IAAA,EAAM,GAAG,IAAA,EAAK,CAAA;AAC/C,MAAA;AACA,MAAA,OAAOA,GAAAA;AACT,IAAA;EACF,CAAA,CAAA,MAAQ;AAER,EAAA;AACA,EAAA;AACF,CAAA;;;AC5DO,IAAM,oBAAA,GAAuB,CAAC,IAAA,KAAqB;AACxD,EAAA;;IAEE,UAAA,CAAW,mBAAA,EAAqB,mBAAA,CAAoB,QAAA,CAClD,iBAAiB,CAAA;;;AAKnB,IAAA,OAAO,WAAW,yBAAA,EAA2B,SAAA,EACzC,oCAAA,KAAyC,UAAA,IAC7C,QACA,IAAA,CAAK;;AAET,CAAA;AAIO,IAAM,iBAAA,GAAoB,CAC/B,GAAA,EACA,KAAA,KACE;AACF,EAAA,GAAA,CAAI,GAAA,CAAI,KAAA,CAAM,YAAA,EAAe,KAAK,CAAA;AAIlC,EAAA,IAAI,GAAA,CAAI,OAAO,CAAA,EAAG;AAChB,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,IAAA,EAAI,CAAG,MAAI,CAAG,KAAA;AACnC,IAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,MAAA,GAAA,CAAI,OAAO,QAAQ,CAAA;AACrB,IAAA;AACF,EAAA;AACF,CAAA;;;AClCO,IAAM,OAAA,GAAU,CAAC,EAAA,KAAkB;AACxC,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,OAAO,MAAK;AACV,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,EAAA,EAAE;AACF,MAAA,MAAA,GAAS,IAAA;AACX,IAAA;AACF,EAAA,CAAA;AACF,CAAA;;;ACRM,IAAO,kBAAP,MAAsB;AAAtB,EAAA,WAAA,GAAA;AACJ,IAAA,aAAA,CAAA,IAAA,EAAA,yBAAA,CAAA;;;;;ACDK,IAAM,aAAA,GAAgB,CAAC,QAAA,KAAwB;AACpD,EAAA,IAAI,SAAS,YAAA,EAAc;AACzB,IAAA,gBAAA,CAAiB,oBAAA,EAAsB,UAAU,IAAI,CAAA;EACvD,CAAA,MAAO;AACL,IAAA,QAAA,EAAQ;AACV,EAAA;AACF,CAAA;;;ACQO,IAAM,aAAA,GAAwC,CAAC,IAAA,EAAM,GAAI,CAAA;AAQzD,IAAM,KAAA,GAAQ,CACnB,QAAA,EACA,IAAA,GAAmB,EAAA,KACjB;AACF,EAAA,MAAM,eAAA,GAAkB,qBAAqB,IAAI,CAAA;AAEjD,EAAA,aAAA,CAAc,MAAK;AAIjB,IAAA,MAAM,eAAA,GAAkB,UAAA,CAAW,IAAA,EAAM,eAAe,CAAA;AACxD,IAAA,MAAM,oBAAoB,oBAAA,EAAoB;AAC9C,IAAA,IAAI,MAAA,GAAS,WAAW,KAAK,CAAA;AAC7B,IAAA,IAAI,MAAA;AAEJ,IAAA,MAAM,aAAA,GAAgB,CAAC,OAAA,KAAiC;AACtD,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,IAAI,KAAA,CAAM,SAAS,wBAAA,EAA0B;AAC3C,UAAAA,IAAI,UAAA,EAAU;AAGd,UAAA,IAAI,KAAA,CAAM,SAAA,GAAY,iBAAA,CAAkB,eAAA,EAAiB;AAKvD,YAAA,MAAA,CAAO,QAAQ,IAAA,CAAK,GAAA,CAAI,MAAM,SAAA,GAAY,kBAAA,IAAsB,CAAC,CAAA;AACjE,YAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,KAAK,CAAA;AACzB,YAAA,MAAA,CAAO,YAAA,GAAe,KAAA,CAAM,YAAA,IAAgB,MAAA,CAAO,YAAA;AAEnD,YAAA,MAAA,CAAO,IAAI,CAAA;AACb,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMA,GAAAA,GAAK,OAAA,CAAQ,CAAC,OAAO,GAAG,aAAa,CAAA;AAE3C,IAAA,IAAIA,GAAAA,EAAI;AACN,MAAA,MAAA,GAAS,YAAA,CACP,QAAA,EACA,MAAA,EACA,aAAA,EACA,KAAK,gBAAgB,CAAA;AAKvB,MAAA,gBAAA,CAAiB,CAAC,KAAA,KAAS;AACzB,QAAA,MAAA,GAAS,UAAA,CACP,KAAA,EACA,EAAA,EACA,oBAAA,EACA,MAAA,CAAO,YAAA,EACP,MAAA,CAAO,uBAAA,EACP,MAAA,CAAO,aAAA,EACP,qBAAA,EAAuB,CAAA;AAEzB,QAAA,MAAA,GAAS,YAAA,CACP,QAAA,EACA,MAAA,EACA,aAAA,EACA,KAAK,gBAAgB,CAAA;AAGvB,QAAA,SAAA,CAAU,MAAK;AACb,UAAA,MAAA,CAAO,KAAA,GAAQ,WAAA,CAAY,GAAA,EAAG,GAAK,KAAA,CAAM,SAAA;AACzC,UAAA,MAAA,CAAO,IAAI,CAAA;QACb,CAAC,CAAA;MACH,CAAC,CAAA;AACH,IAAA;AAEA,IAAA,IAAI,eAAA,EAAiB;AAInB,MAAA,MAAM,oBAAA,GAAuB,CAAC,OAAA,KAAwC;AACpE,QAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,KAAS;AAKxB,UAAA,IAAI,eAAA,CAAgB,uBAAA,IAA2B,KAAA,CAAM,YAAA,EAAc;AACjE,YAAA,iBAAA,CAAkB,eAAA,CAAgB,yBAAyB,KAAK,CAAA;AAClE,UAAA;AAGA,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAA,CAClB,KAAA,CAAM,gBAAA,IAAoB,MAAM,SAAA,IAAa,CAAA,IAAK,KAAA,CAAM,SAAA,EACzD,CAAC,CAAA;AAEH,UAAA,MAAA,GAAS,UAAA,CACP,KAAA,EACA,OAAA,EACA,iBAAA,EACA,KAAA,CAAM,YAAA,EACN,KAAA,CAAM,aAAA,EACN,KAAA,CAAM,IAAA,EACN,KAAA,CAAM,SAAS,CAAA;AAEjB,UAAA,MAAA,GAAS,YAAA,CACP,QAAA,EACA,MAAA,EACA,aAAA,EACA,KAAK,gBAAgB,CAAA;AAEvB,UAAA,MAAA,CAAO,IAAI,CAAA;QACb,CAAC,CAAA;AACH,MAAA,CAAA;AACA,MAAA,OAAA,CAAQ,CAAC,iBAAiB,CAAA,EAAG,oBAAA,EAAsB,IAAI,CAAA;AACzD,IAAA;EACF,CAAC,CAAA;AACH,CAAA;;;ACnHO,IAAM,aAAA,GAAwC,CAAC,GAAA,EAAK,IAAI,CAAA;AAuBxD,IAAM,KAAA,GAAQ,CACnB,QAAA,EACA,IAAA,GAAmB,EAAA,KACjB;AACF,EAAA,MAAM,oBAAoB,oBAAA,EAAoB;AAG9C,EAAA,KAAA,CACE,QAAQ,MAAK;AACX,IAAA,IAAI,MAAA,GAAS,UAAA,CAAW,KAAA,EAAO,CAAC,CAAA;AAChC,IAAA,IAAI,MAAA;AAEJ,IAAA,MAAM,kBAAA,GAAqB,UAAA,CAAW,IAAA,EAAM,kBAAkB,CAAA;AAE9D,IAAA,MAAM,mBAAmB,CACvB,cAAA,EACA,YAAA,EACA,uBAAA,EACA,eACA,mBAAA,KACE;AACF,MAAA,MAAA,GAAS,WACP,KAAA,EACA,CAAA,EACA,gBACA,YAAA,EACA,uBAAA,EACA,eACA,mBAAmB,CAAA;AAErB,MAAA,kBAAA,CAAmB,aAAA,GAAgB,CAAA;AACnC,MAAA,MAAA,GAAS,YAAA,CACP,QAAA,EACA,MAAA,EACA,aAAA,EACA,KAAK,gBAAgB,CAAA;AAEzB,IAAA,CAAA;AAEA,IAAA,MAAM,qBAAA,GAAwB,CAAC,WAAA,GAAuB,KAAA,KAAS;AAG7D,MAAA,IAAI,kBAAA,CAAmB,aAAA,GAAgB,MAAA,CAAO,KAAA,EAAO;AACnD,QAAA,MAAA,CAAO,QAAQ,kBAAA,CAAmB,aAAA;AAClC,QAAA,MAAA,CAAO,UAAU,kBAAA,CAAmB,eAAA;AACtC,MAAA;AACA,MAAA,MAAA,CAAO,WAAW,CAAA;AACpB,IAAA,CAAA;AAEA,IAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAAoC;AAC9D,MAAA,qBAAA,CAAsB,IAAI,CAAA;AAC1B,MAAA,gBAAA,CACE,iBAAA,EACA,MAAM,YAAA,EACN,KAAA,CAAM,eACN,KAAA,CAAM,IAAA,EACN,MAAM,SAAS,CAAA;AAEnB,IAAA,CAAA;AAEA,IAAA,MAAM,aAAA,GAAgB,CACpB,OAAA,KACE;AACF,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,IAAI,KAAA,CAAM,cAAc,iBAAA,EAAmB;AACzC,UAAA,kBAAA,CAAmB,KAAkC,CAAA;AACrD,UAAA;AACF,QAAA;AACA,QAAA,kBAAA,CAAmB,cAAc,KAAoB,CAAA;AACvD,MAAA;AAEA,MAAA,qBAAA,EAAqB;AACvB,IAAA,CAAA;AAEA,IAAA,MAAM,KAAA,GAAQ,CAAC,cAAc,CAAA;AAC7B,IAAA,IAAI,oBAAA,CAAqB,IAAI,CAAA,EAAG;AAC9B,MAAA,KAAA,CAAM,KAAK,iBAAiB,CAAA;AAC9B,IAAA;AACA,IAAA,MAAMA,GAAAA,GAAK,OAAA,CAAQ,KAAA,EAAO,aAAa,CAAA;AACvC,IAAA,IAAIA,GAAAA,EAAI;AACN,MAAA,MAAA,GAAS,YAAA,CACP,QAAA,EACA,MAAA,EACA,aAAA,EACA,KAAK,gBAAgB,CAAA;AAGvB,MAAA,iBAAA,CAAkB,SAAS,MAAK;AAC9B,QAAA,aAAA,CACEA,GAAAA,CAAG,aAA0D,CAAA;AAE/D,QAAA,MAAA,CAAO,IAAI,CAAA;MACb,CAAC,CAAA;AAID,MAAA,gBAAA,CAAiB,MAAK;AACpB,QAAA,gBAAA,CACE,oBAAA,EACA,OAAO,YAAA,EACP,MAAA,CAAO,yBACP,MAAA,CAAO,aAAA,EACP,uBAAuB,CAAA;AAGzB,QAAA,SAAA,CAAU,MAAM,CAAA;MAClB,CAAC,CAAA;AAKD,MAAA,UAAA,CAAW,MAAM,CAAA;AACnB,IAAA;AACF,EAAA,CAAC,CAAC,CAAA;AAEN,CAAA;;;ACrJA,IAAI,wBAAA,GAA2B,CAAA;AAC/B,IAAI,qBAAA,GAAwB,QAAA;AAC5B,IAAI,qBAAA,GAAwB,CAAA;AAE5B,IAAM,cAAA,GAAiB,CAAC,OAAA,KAAqC;AAC3D,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,IAAI,MAAM,aAAA,EAAe;AACvB,MAAA,qBAAA,GAAwB,IAAA,CAAK,GAAA,CAC3B,qBAAA,EACA,KAAA,CAAM,aAAa,CAAA;AAErB,MAAA,qBAAA,GAAwB,IAAA,CAAK,GAAA,CAC3B,qBAAA,EACA,KAAA,CAAM,aAAa,CAAA;AAGrB,MAAA,wBAAA,GAA2B,qBAAA,GAAA,CACtB,qBAAA,GAAwB,qBAAA,IAAyB,CAAA,GAAI,CAAA,GACtD,CAAA;AACN,IAAA;AACF,EAAA;AACF,CAAA;AAEA,IAAI,EAAA;AAMG,IAAM,sBAAsB,MAAK;AACtC,EAAA,OAAO,EAAA,GAAK,wBAAA,GAA4B,WAAA,CAAY,gBAAA,IAAoB,CAAA;AAC1E,CAAA;AAKO,IAAM,+BAA+B,MAAK;AAC/C,EAAA,IAAI,sBAAsB,WAAA,IAAe,EAAA;AAAI,IAAA;AAE7C,EAAA,EAAA,GAAK,OAAA,CAAQ,CAAC,OAAO,CAAA,EAAG,cAAA,EAAgB;IACtC,iBAAA,EAAmB;AACO,GAAA,CAAA;AAC9B,CAAA;;;ACnCA,IAAM,4BAAA,GAA+B,EAAA;AAE/B,IAAO,qBAAP,MAAyB;AAAzB,EAAA,WAAA,GAAA;AASJ;;;;;;;;AAAwB,IAAA,aAAA,CAAA,IAAA,EAAA,uBAAA,EAAA,CAAA,CAAA;AAMxB;;;;;mDAAyC,EAAA,CAAA;AAMzC;;;;AAAmD,IAAA,aAAA,CAAA,IAAA,EAAA,wBAAA,kBAAA,IAAI,GAAA,EAAG,CAAA;AAE1D,IAAA,aAAA,CAAA,IAAA,EAAA,0BAAA,CAAA;AAEA,IAAA,aAAA,CAAA,IAAA,EAAA,gCAAA,CAAA;;;;;;EAMA,iCAAA,GAAiC;AAC/B,IAAA,OAAO,mBAAA,KAAwB,IAAA,CAAK,qBAAA;AACtC,EAAA;EAEA,kBAAA,GAAkB;AAChB,IAAA,IAAA,CAAK,wBAAwB,mBAAA,EAAmB;AAChD,IAAA,IAAA,CAAK,wBAAwB,MAAA,GAAS,CAAA;AACtC,IAAA,IAAA,CAAK,uBAAuB,KAAA,EAAK;AACnC,EAAA;;;;;AAMA,EAAA,8BAAA,CAA+B,cAAA,EAAwC;AACrE,IAAA,MAAM,6BAAA,GACJ,KAAK,iCAAA,EAAiC;AACxC,IAAA,MAAM,yBAAA,GAA4B,IAAA,CAAK,GAAA,CACrC,IAAA,CAAK,uBAAA,CAAwB,MAAA,GAAS,CAAA,EACtC,IAAA,CAAK,KAAA,CAAM,6BAAA,GAAgC,EAAE,CAAC,CAAA;AAQhD,IAAA,IACE,iCACA,yBAAA,KAA8B,EAAA,KAC7B,cAAA,KAAmB,iBAAA,IAClB,mBAAmB,oBAAA,CAAA,EACrB;AACA,MAAA,OAAO;QACL,QAAA,EAAU,CAAA;QACV,EAAA,EAAI,EAAA;AACJ,QAAA,OAAA,EAAS;;AAEb,IAAA;AAEA,IAAA,OAAO,IAAA,CAAK,wBAAwB,yBAAyB,CAAA;AAC/D,EAAA;;;;;;;AAQA,EAAA,aAAA,CAAc,KAAA,EAA6B;AACzC,IAAA,IAAA,CAAK,2BAA2B,KAAK,CAAA;AAGrC,IAAA,IAAI,EAAE,KAAA,CAAM,aAAA,IAAiB,KAAA,CAAM,SAAA,KAAc,aAAA,CAAA;AAAgB,MAAA;AAGjE,IAAA,MAAM,qBAAA,GAAwB,IAAA,CAAK,uBAAA,CAAwB,EAAA,CAAG,EAAE,CAAA;AAEhE,IAAA,IAAI,WAAA,GAAc,IAAA,CAAK,sBAAA,CAAuB,GAAA,CAAI,MAAM,aAAc,CAAA;AAItE,IAAA,IACE,WAAA,IACA,IAAA,CAAK,uBAAA,CAAwB,MAAA,GAAS,4BAAA;IAEtC,KAAA,CAAM,QAAA,GAAW,sBAAuB,QAAA,EACxC;AAEA,MAAA,IAAI,WAAA,EAAa;AAGf,QAAA,IAAI,KAAA,CAAM,QAAA,GAAW,WAAA,CAAY,QAAA,EAAU;AACzC,UAAA,WAAA,CAAY,OAAA,GAAU,CAAC,KAAK,CAAA;AAC5B,UAAA,WAAA,CAAY,WAAW,KAAA,CAAM,QAAA;QAC/B,CAAA,MAAA,IACE,KAAA,CAAM,QAAA,KAAa,WAAA,CAAY,QAAA,IAC/B,KAAA,CAAM,cAAc,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAA,CAAE,SAAA,EAC3C;AACA,UAAA,WAAA,CAAY,OAAA,CAAQ,KAAK,KAAK,CAAA;AAChC,QAAA;MACF,CAAA,MAAO;AACL,QAAA,WAAA,GAAc;AACZ,UAAA,EAAA,EAAI,KAAA,CAAM,aAAA;AACV,UAAA,OAAA,EAAS,CAAC,KAAK,CAAA;AACf,UAAA,QAAA,EAAU,KAAA,CAAM;;AAElB,QAAA,IAAA,CAAK,sBAAA,CAAuB,GAAA,CAAI,WAAA,CAAY,EAAA,EAAI,WAAW,CAAA;AAC3D,QAAA,IAAA,CAAK,uBAAA,CAAwB,KAAK,WAAW,CAAA;AAC/C,MAAA;AAGA,MAAA,IAAA,CAAK,uBAAA,CAAwB,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,QAAA,GAAW,EAAE,QAAQ,CAAA;AACnE,MAAA,IAAI,IAAA,CAAK,uBAAA,CAAwB,MAAA,GAAS,4BAAA,EAA8B;AACtE,QAAA,MAAM,mBAAA,GAAsB,IAAA,CAAK,uBAAA,CAAwB,MAAA,CACvD,4BAA4B,CAAA;AAG9B,QAAA,KAAA,MAAWC,gBAAe,mBAAA,EAAqB;AAC7C,UAAA,IAAA,CAAK,sBAAA,CAAuB,MAAA,CAAOA,YAAAA,CAAY,EAAE,CAAA;AACnD,QAAA;AACF,MAAA;AAGA,MAAA,IAAA,CAAK,iCAAiC,WAAW,CAAA;AACnD,IAAA;AACF,EAAA;;;;ACpJK,IAAM,gBAAA,GAAmB,CAAC,EAAA,KAAkB;AAIjD,EAAA,MAAM,OAAA,GAAU,qBAAA,IAAyB,UAAA,GAAa,GAAA,GAAO,CAAA;AAE7D,EAAA,MAAM,GAAA,GAAM,WAAW,mBAAA,IAAuB,UAAA;AAC9C,EAAA,MAAM,GAAA,GAAM,WAAW,kBAAA,IAAsB,YAAA;AAI7C,EAAA,IAAI,QAAA,CAAS,oBAAoB,QAAA,EAAU;AACzC,IAAA,EAAA,EAAE;EACJ,CAAA,MAAO;AACL,IAAA,MAAM,SAAA,GAAY,QAAQ,EAAE,CAAA;AAE5B,IAAA,IAAI,UAAA,GAAa,EAAA;AACjB,IAAA,MAAM,WAAW,MAAK;AACpB,MAAA,GAAA,CAAI,UAAU,CAAA;AACd,MAAA,SAAA,EAAS;AACX,IAAA,CAAA;AAEA,IAAA,gBAAA,CAAiB,oBAAoB,QAAA,EAAU,EAAC,MAAM,IAAA,EAAM,OAAA,EAAS,MAAK,CAAA;AAC1E,IAAA,UAAA,GAAa,IACX,MAAK;AACH,MAAA,mBAAA,CAAoB,kBAAA,EAAoB,QAAA,EAAU,EAAC,OAAA,EAAS,MAAK,CAAA;AACjE,MAAA,SAAA,EAAS;IACX,CAAA,EACA,EAAC,SAAiB,CAAA;AAEtB,EAAA;AACF,CAAA;;;ACjBO,IAAM,aAAA,GAAwC,CAAC,GAAA,EAAK,GAAG,CAAA;AAU9D,IAAM,0BAAA,GAA6B,EAAA;AA+B5B,IAAM,KAAA,GAAQ,CACnB,QAAA,EACA,IAAA,GAAsB,EAAA,KACpB;AAEF,EAAA,IAAI,EACF,UAAA,CAAW,sBAAA,IACX,eAAA,IAAmB,uBAAuB,SAAA,CAAA,EACzC;AACD,IAAA;AACF,EAAA;AAEA,EAAA,MAAM,oBAAoB,oBAAA,EAAoB;AAE9C,EAAA,aAAA,CAAc,MAAK;AAEjB,IAAA,4BAAA,EAA4B;AAE5B,IAAA,IAAI,MAAA,GAAS,WAAW,KAAK,CAAA;AAC7B,IAAA,IAAI,MAAA;AAEJ,IAAA,MAAM,kBAAA,GAAqB,UAAA,CAAW,IAAA,EAAM,kBAAkB,CAAA;AAE9D,IAAA,MAAM,mBAAmB,CACvB,cAAA,EACA,YAAA,EACA,uBAAA,EACA,eACA,mBAAA,KACE;AACF,MAAA,kBAAA,CAAmB,kBAAA,EAAkB;AACrC,MAAA,MAAA,GAAS,WACP,KAAA,EACA,EAAA,EACA,gBACA,YAAA,EACA,uBAAA,EACA,eACA,mBAAmB,CAAA;AAErB,MAAA,MAAA,GAAS,YAAA,CACP,QAAA,EACA,MAAA,EACA,aAAA,EACA,KAAK,gBAAgB,CAAA;AAEzB,IAAA,CAAA;AAEA,IAAA,MAAM,kBAAkB,MAAK;AAC3B,MAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,8BAAA,CAC7B,MAAA,CAAO,cAAc,CAAA;AAGvB,MAAA,IAAI,GAAA,IAAO,GAAA,CAAI,QAAA,KAAa,MAAA,CAAO,KAAA,EAAO;AACxC,QAAA,MAAA,CAAO,QAAQ,GAAA,CAAI,QAAA;AACnB,QAAA,MAAA,CAAO,UAAU,GAAA,CAAI,OAAA;AACrB,QAAA,MAAA,EAAM;AACR,MAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAAoC;AAC9D,MAAA,eAAA,EAAe;AACf,MAAA,MAAA,CAAO,IAAI,CAAA;AACX,MAAA,gBAAA,CACE,iBAAA,EACA,MAAM,YAAA,EACN,KAAA,CAAM,eACN,KAAA,CAAM,IAAA,EACN,MAAM,SAAS,CAAA;AAEnB,IAAA,CAAA;AAEA,IAAA,MAAM,aAAA,GAAgB,CACpB,OAAA,EACA,WAAA,GAAuB,KAAA,KACrB;AAOF,MAAA,gBAAA,CAAiB,MAAK;AACpB,QAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,UAAA,IAAI,KAAA,CAAM,cAAc,iBAAA,EAAmB;AACzC,YAAA,kBAAA,CAAmB,KAAkC,CAAA;AACrD,YAAA;AACF,UAAA;AACA,UAAA,kBAAA,CAAmB,cAAc,KAA+B,CAAA;AAClE,QAAA;AACA,QAAA,eAAA,EAAe;AACf,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,MAAA,CAAO,IAAI,CAAA;AACb,QAAA;MACF,CAAC,CAAA;AACH,IAAA,CAAA;AAEA,IAAA,MAAM,KAAA,GAAQ,CAAC,OAAA,EAAS,aAAa,CAAA;AAGrC,IAAA,IAAI,oBAAA,CAAqB,IAAI,CAAA,EAAG;AAC9B,MAAA,KAAA,CAAM,KAAK,iBAAiB,CAAA;AAC9B,IAAA;AACA,IAAA,MAAMD,GAAAA,GAAK,OAAA,CAAQ,KAAA,EAAO,aAAA,EAAe;MACvC,GAAG,IAAA;AACH,MAAA,iBAAA,EAAmB,KAAK,iBAAA,IAAqB;AACnB,KAAA,CAAA;AAE5B,IAAA,MAAA,GAAS,YAAA,CACP,QAAA,EACA,MAAA,EACA,aAAA,EACA,KAAK,gBAAgB,CAAA;AAGvB,IAAA,IAAIA,GAAAA,EAAI;AACN,MAAA,iBAAA,CAAkB,SAAS,MAAK;AAC9B,QAAA,aAAA,CACEA,GAAAA,CAAG,WAAA,EAAW,EAGd,IAAI,CAAA;MAER,CAAC,CAAA;AAID,MAAA,gBAAA,CAAiB,MAAK;AACpB,QAAA,gBAAA,CACE,oBAAA,EACA,OAAO,YAAA,EACP,MAAA,CAAO,yBACP,MAAA,CAAO,aAAA,EACP,uBAAuB,CAAA;MAE3B,CAAC,CAAA;AACH,IAAA;EACF,CAAC,CAAA;AACH,CAAA;;;ACvMM,IAAO,kBAAP,MAAsB;AAAtB,EAAA,WAAA,GAAA;AACJ,IAAA,aAAA,CAAA,IAAA,EAAA,0BAAA,CAAA;AACA,IAAA,aAAA,CAAA,IAAA,EAAA,yBAAA,CAAA;;AAEA,EAAA,aAAA,CAAc,KAAA,EAA6B;AACzC,IAAA,IAAA,CAAK,2BAA2B,KAAK,CAAA;AACvC,EAAA;;;;ACcK,IAAM,aAAA,GAAwC,CAAC,IAAA,EAAM,GAAI,CAAA;AAazD,IAAM,KAAA,GAAQ,CACnB,QAAA,EACA,IAAA,GAAmB,EAAA,KACjB;AAGF,EAAA,IAAI,WAAA,GAAc,KAAA;AAClB,EAAA,MAAM,eAAA,GAAkB,qBAAqB,IAAI,CAAA;AAEjD,EAAA,aAAA,CAAc,MAAK;AACjB,IAAA,IAAI,oBAAoB,oBAAA,EAAoB;AAC5C,IAAA,IAAI,MAAA,GAAS,WAAW,KAAK,CAAA;AAC7B,IAAA,IAAI,MAAA;AAEJ,IAAA,MAAM,eAAA,GAAkB,UAAA,CAAW,IAAA,EAAM,eAAe,CAAA;AAExD,IAAA,MAAM,mBAAmB,CACvB,UAAA,EACA,YAAA,EACA,uBAAA,EACA,eACA,mBAAA,KACE;AACF,MAAA,MAAA,GAAS,WACP,KAAA,EACA,EAAA,EACA,YACA,YAAA,EACA,uBAAA,EACA,eACA,mBAAmB,CAAA;AAErB,MAAA,MAAA,GAAS,YAAA,CACP,QAAA,EACA,MAAA,EACA,aAAA,EACA,KAAK,gBAAgB,CAAA;AAGvB,MAAA,WAAA,GAAc,KAAA;AAEd,MAAA,IAAI,eAAe,iBAAA,EAAmB;AACpC,QAAA,iBAAA,GAAoB,qBAAqB,IAAI,CAAA;AAC/C,MAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAAoC;AAC9D,MAAA,IAAI,eAAA,CAAgB,uBAAA,IAA2B,KAAA,CAAM,YAAA,EAAc;AACjE,QAAA,iBAAA,CAAkB,eAAA,CAAgB,yBAAyB,KAAK,CAAA;AAClE,MAAA;AAEA,MAAA,IAAI,CAAC,WAAA;AAAa,QAAA,MAAA,CAAO,IAAI,CAAA;AAC7B,MAAA,gBAAA,CACE,iBAAA,EACA,MAAM,YAAA,EACN,KAAA,CAAM,eACN,KAAA,CAAM,IAAA,EACN,MAAM,SAAS,CAAA;AAMjB,MAAA,MAAM,iCAAA,GACJ,MAAM,oCAAA,IAAsC;AAC9C,MAAA,IAAI,iCAAA,EAAmC;AACrC,QAAA,aAAA,CAAc,CAAC,iCAAiC,CAAC,CAAA;AACnD,MAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAM,aAAA,GAAgB,CACpB,OAAA,KAKE;AAGF,MAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,IAAoB,CAAC,eAAA,EAAiB;AAC9C,QAAA,OAAA,GAAU,OAAA,CAAQ,MAAM,EAAE,CAAA;AAC5B,MAAA;AAEA,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,IAAI,CAAC,KAAA;AAAO,UAAA;AAEZ,QAAA,IAAI,KAAA,CAAM,cAAc,iBAAA,EAAmB;AACzC,UAAA,kBAAA,CAAmB,KAAkC,CAAA;AACrD,UAAA;AACF,QAAA;AAEA,QAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,QAAA,IAAI,gBAA0C,EAAA;AAC9C,QAAA,IAAI,aAAa,KAAA,CAAM,SAAA;AACvB,QAAA,IAAI,KAAA,CAAM,cAAc,0BAAA,EAA4B;AAOlD,UAAA,KAAA,GAAQ,KAAK,GAAA,CAAI,KAAA,CAAM,SAAA,GAAY,kBAAA,IAAsB,CAAC,CAAA;AAE1D,UAAA,eAAA,CAAgB,cAAc,KAA+B,CAAA;AAC7D,UAAA,aAAA,GAAgB,CAAC,KAA+B,CAAA;QAClD,CAAA,MAAA,IAAW,KAAA,CAAM,cAAc,8BAAA,EAAgC;AAC7D,UAAA,MAAM,QAAA,GAAW,KAAA;AAIjB,UAAA,IAAI,CAAC,MAAA,CAAO,YAAA;AAAc,YAAA;AAK1B,UAAA,IACE,eAAA,IAAmB,QAAA,IACnB,QAAA,CAAS,aAAA,IAAiB,OAAO,uBAAA,EACjC;AACA,YAAA;AACF,UAAA;AAEA,UAAA,UAAA,GAAa,QAAA,CAAS,wBAAwB,UAAA,IAAc,CAAA;AAG5D,UAAA,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,UAAA,GAAa,KAAA,CAAM,WAAW,CAAC,CAAA;AAEhD,UAAA,IAAI,SAAS,sBAAA,EAAwB;AACnC,YAAA,eAAA,CAAgB,aAAA,CAAc,SAAS,sBAAsB,CAAA;AAC7D,YAAA,aAAA,GAAgB,CAAC,SAAS,sBAAsB,CAAA;AAClD,UAAA;AACF,QAAA;AAGA,QAAA,IAAI,UAAA,GAAa,kBAAkB,eAAA,EAAiB;AAClD,UAAA,MAAA,CAAO,KAAA,GAAQ,KAAA;AACf,UAAA,MAAA,CAAO,OAAA,GAAU,aAAA;AACjB,UAAA,MAAA,EAAM;AACR,QAAA;AACF,MAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAM,KAAA,GAAQ,CAAC,0BAA0B,CAAA;AAKzC,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,KAAA,CAAM,IAAA,CAAK,gCAAgC,iBAAiB,CAAA;AAC9D,IAAA;AACA,IAAA,MAAMA,GAAAA,GAAK,OAAA,CAAQ,KAAA,EAAO,aAAa,CAAA;AAEvC,IAAA,IAAIA,GAAAA,EAAI;AACN,MAAA,MAAA,GAAS,YAAA,CACP,QAAA,EACA,MAAA,EACA,aAAA,EACA,KAAK,gBAAgB,CAAA;AAGvB,MAAA,MAAM,kBAAA,GAAqB,CAAC,SAAA,EAAW,OAAA,EAAS,kBAAkB,CAAA;AAElE,MAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAgB;AACnC,QAAA,IAAI,KAAA,CAAM,SAAA,IAAa,CAAC,WAAA,EAAa;AAInC,UAAA,MAAM,qBAAqB,MAAA,CAAO,EAAA;AAClC,UAAA,gBAAA,CAAiB,MAAK;AACpB,YAAA,IAAI,CAAC,WAAA,EAAa;AAChB,cAAA,IAAI,CAAC,eAAA,EAAiB;AAEpB,gBAAAA,IAAI,UAAA,EAAU;AACd,gBAAA,KAAA,MAAW,QAAQ,kBAAA,EAAoB;AACrC,kBAAA,mBAAA,CAAoB,IAAA,EAAM,WAAA,EAAa,EAAC,OAAA,EAAS,MAAK,CAAA;AACxD,gBAAA;AACF,cAAA;AAIA,cAAA,IAAI,kBAAA,KAAuB,OAAO,EAAA,EAAI;AACpC,gBAAA,WAAA,GAAc,IAAA;AACd,gBAAA,MAAA,CAAO,IAAI,CAAA;AACb,cAAA;AACF,YAAA;UACF,CAAC,CAAA;AACH,QAAA;AACF,MAAA,CAAA;AAQA,MAAA,KAAA,MAAW,QAAQ,kBAAA,EAAoB;AACrC,QAAA,gBAAA,CAAiB,MAAM,WAAA,EAAa;UAClC,OAAA,EAAS;AACV,SAAA,CAAA;AACH,MAAA;AAIA,MAAA,gBAAA,CAAiB,CAAC,KAAA,KAAS;AACzB,QAAA,gBAAA,CACE,oBAAA,EACA,OAAO,YAAA,EACP,MAAA,CAAO,yBACP,MAAA,CAAO,aAAA,EACP,uBAAuB,CAAA;AAEzB,QAAA,MAAA,GAAS,YAAA,CACP,QAAA,EACA,MAAA,EACA,aAAA,EACA,KAAK,gBAAgB,CAAA;AAGvB,QAAA,SAAA,CAAU,MAAK;AACb,UAAA,MAAA,CAAO,KAAA,GAAQ,WAAA,CAAY,GAAA,EAAG,GAAK,KAAA,CAAM,SAAA;AACzC,UAAA,WAAA,GAAc,IAAA;AACd,UAAA,MAAA,CAAO,IAAI,CAAA;QACb,CAAC,CAAA;MACH,CAAC,CAAA;AACH,IAAA;EACF,CAAC,CAAA;AACH,CAAA;;;ACxPO,IAAM,cAAA,GAAyC,CAAC,GAAA,EAAK,IAAI,CAAA;AAMhE,IAAM,SAAA,GAAY,CAAC,QAAA,KAAwB;AACzC,EAAA,IAAI,SAAS,YAAA,EAAc;AACzB,IAAA,aAAA,CAAc,MAAM,SAAA,CAAU,QAAQ,CAAC,CAAA;EACzC,CAAA,MAAA,IAAW,QAAA,CAAS,eAAe,UAAA,EAAY;AAC7C,IAAA,gBAAA,CAAiB,MAAA,EAAQ,MAAM,SAAA,CAAU,QAAQ,GAAG,IAAI,CAAA;EAC1D,CAAA,MAAO;AAEL,IAAA,UAAA,CAAW,QAAQ,CAAA;AACrB,EAAA;AACF,CAAA;AAiBO,IAAM,MAAA,GAAS,CACpB,QAAA,EACA,IAAA,GAAmB,EAAA,KACjB;AACF,EAAA,MAAM,eAAA,GAAkB,qBAAqB,IAAI,CAAA;AAEjD,EAAA,IAAI,MAAA,GAAS,WAAW,MAAM,CAAA;AAC9B,EAAA,IAAI,SAAS,YAAA,CACX,QAAA,EACA,MAAA,EACA,cAAA,EACA,KAAK,gBAAgB,CAAA;AAGvB,EAAA,SAAA,CAAU,MAAK;AACb,IAAA,MAAM,eAAe,kBAAA,EAAkB;AACvC,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,gBAAgB,YAAA,CAAa,aAAA;AAKnC,MAAA,MAAA,CAAO,QAAQ,IAAA,CAAK,GAAA,CAAI,aAAA,GAAgB,kBAAA,IAAsB,CAAC,CAAA;AAE/D,MAAA,MAAA,CAAO,OAAA,GAAU,CAAC,YAAY,CAAA;AAC9B,MAAA,MAAA,CAAO,IAAI,CAAA;AAIX,MAAA,gBAAA,CAAiB,MAAK;AACpB,QAAA,MAAA,GAAS,UAAA,CACP,MAAA,EACA,CAAA,EACA,oBAAA,EACA,MAAA,CAAO,YAAA,EACP,MAAA,CAAO,uBAAA,EACP,MAAA,CAAO,aAAA,EACP,qBAAA,EAAuB,CAAA;AAEzB,QAAA,MAAA,GAAS,YAAA,CACP,QAAA,EACA,MAAA,EACA,cAAA,EACA,KAAK,gBAAgB,CAAA;AAGvB,QAAA,MAAA,CAAO,IAAI,CAAA;MACb,CAAC,CAAA;AAGD,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,MAAM,kBAAA,GAAqB,CAAC,OAAA,KAAwC;AAClE,UAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,KAAS;AACxB,YAAA,IAAI,MAAM,YAAA,EAAc;AACtB,cAAA,MAAA,GAAS,UAAA,CACP,MAAA,EACA,CAAA,EACA,iBAAA,EACA,KAAA,CAAM,YAAA,EACN,KAAA,CAAM,aAAA,EACN,KAAA,CAAM,IAAA,EACN,KAAA,CAAM,SAAS,CAAA;AAEjB,cAAA,MAAA,CAAO,OAAA,GAAU,CAAC,KAAK,CAAA;AACvB,cAAA,MAAA,GAAS,YAAA,CACP,QAAA,EACA,MAAA,EACA,cAAA,EACA,KAAK,gBAAgB,CAAA;AAEvB,cAAA,MAAA,CAAO,IAAI,CAAA;AACb,YAAA;UACF,CAAC,CAAA;AACH,QAAA,CAAA;AACA,QAAA,OAAA,CAAQ,CAAC,iBAAiB,CAAA,EAAG,kBAAA,EAAoB,IAAI,CAAA;AACvD,MAAA;AACF,IAAA;EACF,CAAC,CAAA;AACH,CAAA;;;AC/GA,IAAM,gBAAA,GAAmB;AAAA,EACvB,UAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA;AA2BO,SAAS,cAAc,KAAA,EAAuC;AACnE,EAAA,MAAM,cAAA,GAAiB,uBAAA,CAAwB,KAAA,CAAM,cAAc,CAAA;AAEnE,EAAA,OAAO;AAAA,IACL,UAAU,MAAA,EAAO;AAAA,IACjB,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,KAAA,EAAO,aAAA,CAAc,KAAA,CAAM,MAAA,EAAQ,MAAM,KAAK,CAAA;AAAA,IAC9C,UAAU,QAAA,CAAS,QAAA;AAAA,IACnB,IAAA,EAAM,SAAA,CAAU,KAAA,CAAM,IAAA,IAAQ,SAAS,QAAQ,CAAA;AAAA,IAC/C,GAAI,cAAA,GAAiB,EAAE,eAAA,EAAiB,cAAA,KAAmB,EAAC;AAAA,IAC5D,WAAA,EAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACtC;AACF;AAOO,SAAS,wBAAwB,GAAA,EAA6C;AACnF,EAAA,IAAI,CAAC,KAAK,OAAO,MAAA;AACjB,EAAA,MAAM,UAAA,GAAa,IAAI,IAAA,EAAK,CAAE,aAAY,CAAE,OAAA,CAAQ,gBAAgB,cAAc,CAAA;AAClF,EAAA,OAAQ,gBAAA,CAAuC,QAAA,CAAS,UAAU,CAAA,GAC9D,UAAA,GACA,MAAA;AACN;AAKO,SAAS,aAAA,CAAc,QAAsB,KAAA,EAAuB;AACzE,EAAA,IAAI,WAAW,KAAA,EAAO,OAAO,KAAK,KAAA,CAAM,KAAA,GAAQ,GAAK,CAAA,GAAI,GAAA;AACzD,EAAA,OAAO,IAAA,CAAK,MAAM,KAAK,CAAA;AACzB;AAIA,SAAS,UAAU,IAAA,EAAsB;AACvC,EAAA,OAAO,KAAK,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA,CAAE,CAAC,CAAA,IAAK,IAAA;AACrC;;;AC3DA,IAAM,iBAAA,GAAoB,GAAA;AAG1B,IAAM,YAAA,GAAqD;AAAA,EACzD,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK;AACP,CAAA;AAIA,IAAI,IAAA;AAEJ,IAAI,SAAA,GAAY,KAAA;AAehB,SAAS,qBAAqB,QAAA,EAAgD;AAC5E,EAAA,IAAA,GAAO,QAAA;AACP,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,SAAA,GAAY,IAAA;AAGZ,IAAA,MAAM,QAAA,GAAW,CAAC,MAAA,KAAyB,IAAA,GAAO,MAAM,CAAA;AACxD,IAAA,MAAA,CAAO,QAAQ,CAAA;AACf,IAAA,KAAA,CAAM,QAAQ,CAAA;AACd,IAAA,KAAA,CAAM,QAAQ,CAAA;AACd,IAAA,KAAA,CAAM,QAAQ,CAAA;AACd,IAAA,KAAA,CAAM,QAAQ,CAAA;AAAA,EAChB;AAEA,EAAA,OAAO,MAAM;AAGX,IAAA,IAAI,IAAA,KAAS,UAAU,IAAA,GAAO,MAAA;AAAA,EAChC,CAAA;AACF;AAKO,SAAS,iBAAiB,MAAA,EAA4B;AAK3D,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAmC;AAYvD,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAkB;AAInC,EAAA,MAAM,IAAA,GAAO,OAAO,QAAA,KAAa,WAAA,GAAc,SAAS,QAAA,GAAW,MAAA;AAMnE,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,QAAA;AAEJ,EAAA,MAAM,wBAAwB,MAAY;AACxC,IAAA,IAAI,aAAa,MAAA,EAAW;AAC5B,IAAA,QAAA,GAAW,WAAW,MAAM;AAC1B,MAAA,QAAA,GAAW,MAAA;AACX,MAAAH,MAAAA,EAAM;AAAA,IACR,GAAG,iBAAiB,CAAA;AAAA,EACtB,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,CAAC,MAAA,KAAyB;AACvC,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,MAAA,CAAO,IAAI,CAAA;AACrC,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AAE7B,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,IAAA;AAAA,MACA,aAAA,CAAc;AAAA,QACZ,MAAA,EAAQ,IAAA;AAAA,QACR,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,IAAA;AAAA,QACA,gBAAgB,MAAA,CAAO;AAAA,OACxB;AAAA,KACH;AACA,IAAA,IAAI,SAAS,qBAAA,EAAsB;AAAA,EACrC,CAAA;AAEA,EAAA,MAAMA,SAAQ,MAAY;AACxB,IAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,MAAA,YAAA,CAAa,QAAQ,CAAA;AACrB,MAAA,QAAA,GAAW,MAAA;AAAA,IACb;AACA,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AAExB,IAAA,MAAM,QAAA,GAAW,CAAC,GAAG,OAAA,CAAQ,QAAQ,CAAA;AACrC,IAAA,KAAA,MAAW,QAAQ,OAAA,CAAQ,IAAA,EAAK,EAAG,IAAA,CAAK,IAAI,IAAI,CAAA;AAChD,IAAA,OAAA,CAAQ,KAAA,EAAM;AACd,IAAA,MAAA,CAAO,iBAAiB,QAAQ,CAAA;AAAA,EAClC,CAAA;AAEA,EAAA,MAAM,eAAe,MAAY;AAC/B,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,IAAA,IAAI,QAAA,CAAS,eAAA,KAAoB,QAAA,EAAUA,MAAAA,EAAM;AAAA,EACnD,CAAA;AAQA,EAAA,MAAM,WAAA,GAAc,qBAAqB,MAAM,CAAA;AAE/C,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,MAAA,CAAO,gBAAA,CAAiB,YAAYA,MAAK,CAAA;AAAA,EAC3C;AACA,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,IAAA,QAAA,CAAS,gBAAA,CAAiB,oBAAoB,YAAY,CAAA;AAAA,EAC5D;AAEA,EAAA,OAAO,MAAM;AAYX,IAAA,WAAA,EAAY;AACZ,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAA,CAAO,mBAAA,CAAoB,YAAYA,MAAK,CAAA;AAAA,IAC9C;AACA,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,MAAA,QAAA,CAAS,mBAAA,CAAoB,oBAAoB,YAAY,CAAA;AAAA,IAC/D;AACA,IAAAA,MAAAA,EAAM;AAAA,EACR,CAAA;AACF;;;ACxLO,SAAS,oBAAA,CACd,MAAA,EACA,IAAA,GAA6B,OAAA,EACjB;AACZ,EAAA,MAAM,eAAe,MAAY;AAC/B,IAAA,KAAK,OAAO,KAAA,EAAM;AAAA,EACpB,CAAA;AAEA,EAAA,MAAM,YAAY,YAA2B;AAC3C,IAAA,MAAM,OAAO,KAAA,EAAM;AACnB,IAAA,MAAM,MAAA,GAAS,KAAK,SAAA,CAAU,SAAS,EAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,SAAS,CAAA;AACtE,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,IAAA,CAAK,cAAA,CAAe,WAAW,SAAkB,CAAA;AACjD,MAAA,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,SAAS,CAAA;AAAA,IAC/B;AAAA,EACF,CAAA;AAEA,EAAA,IAAA,CAAK,EAAA,CAAG,cAAc,YAAqB,CAAA;AAC3C,EAAA,IAAA,CAAK,EAAA,CAAG,WAAW,SAAkB,CAAA;AAErC,EAAA,OAAO,MAAM;AACX,IAAA,IAAA,CAAK,cAAA,CAAe,cAAc,YAAqB,CAAA;AACvD,IAAA,IAAA,CAAK,cAAA,CAAe,WAAW,SAAkB,CAAA;AAAA,EACnD,CAAA;AACF;;;ACdO,SAAS,uBACd,MAAA,EACA,IAAA,GAAoB,OAAA,EACpB,OAAA,GAAkC,EAAC,EACvB;AACZ,EAAA,MAAM,cAAA,GAAiB,QAAQ,cAAA,IAAkB,GAAA;AAEjD,EAAA,MAAM,MAAA,GAAS,OAAO,KAAA,EAAe,KAAA,EAAgB,IAAA,KAAkB;AACrE,IAAA,MAAA,CAAO,iBAAiB,KAAA,EAAO,EAAE,SAAS,KAAA,EAAO,KAAA,EAAO,SAAS,CAAA;AACjE,IAAA,MAAM,gBAAA,CAAiB,QAAQ,cAAc,CAAA;AAE7C,IAAA,MAAM,MAAA,GAAS,KAAK,SAAA,CAAU,KAAK,EAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,IAAI,CAAA;AAC7D,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,IAAA,CAAK,MAAA,EAAQ,KAAA,CAAM,CAAA,EAAG,aAAA,CAAc,KAAK,CAAC;AAAA,CAAI,CAAA;AAC9C,MAAA,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,IACb;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,aAAa,CAAC,KAAA,KAClB,MAAA,CAAO,mBAAA,EAAqB,OAAO,UAAU,CAAA;AAC/C,EAAA,MAAM,cAAc,CAAC,MAAA,KACnB,MAAA,CAAO,oBAAA,EAAsB,QAAQ,WAAW,CAAA;AAElD,EAAA,IAAA,CAAK,EAAA,CAAG,qBAAqB,UAAmB,CAAA;AAChD,EAAA,IAAA,CAAK,EAAA,CAAG,sBAAsB,WAAoB,CAAA;AAElD,EAAA,OAAO,MAAM;AACX,IAAA,IAAA,CAAK,cAAA,CAAe,qBAAqB,UAAmB,CAAA;AAC5D,IAAA,IAAA,CAAK,cAAA,CAAe,sBAAsB,WAAoB,CAAA;AAAA,EAChE,CAAA;AACF;AAEA,eAAe,gBAAA,CAAiB,QAAgB,SAAA,EAAkC;AAChF,EAAA,MAAM,QAAQ,IAAA,CAAK;AAAA,IACjB,OAAO,KAAA,EAAM;AAAA,IACb,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AAC7B,MAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,OAAA,EAAS,SAAS,CAAA;AAC1C,MAAC,MAAiC,KAAA,IAAQ;AAAA,IAC7C,CAAC;AAAA,GACF,CAAA;AACH;AAEA,SAAS,cAAc,KAAA,EAAwB;AAC7C,EAAA,IAAI,KAAA,YAAiB,KAAA,EAAO,OAAO,KAAA,CAAM,KAAA,IAAS,GAAG,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAA;AACjF,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;;;AClEO,IAAM,iBAAA,GAAN,MAAM,kBAAA,CAAkB;AAAA,EAC7B,WAAA,CACmB,WACA,IAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAChB;AAAA;AAAA,EAGH,MAAM,IAAA,EAAiC;AACrC,IAAA,OAAO,IAAI,kBAAA,CAAkB,IAAA,CAAK,SAAA,EAAW,IAAI,CAAA;AAAA,EACnD;AAAA,EAEA,KAAA,CAAM,SAAiB,UAAA,EAA4C;AACjE,IAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,UAAU,CAAA;AAAA,EACxC;AAAA,EAEA,IAAA,CAAK,SAAiB,UAAA,EAA4C;AAChE,IAAA,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAS,UAAU,CAAA;AAAA,EACvC;AAAA,EAEA,IAAA,CAAK,SAAiB,UAAA,EAA4C;AAChE,IAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,OAAA,EAAS,UAAU,CAAA;AAAA,EAC1C;AAAA,EAEA,KAAA,CAAM,SAAiB,UAAA,EAA4C;AACjE,IAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,UAAU,CAAA;AAAA,EACxC;AAAA,EAEA,KAAA,CAAM,SAAiB,UAAA,EAA4C;AACjE,IAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,UAAU,CAAA;AAAA,EACxC;AAAA,EAEQ,IAAA,CACN,KAAA,EACA,OAAA,EACA,UAAA,EACM;AACN,IAAA,IAAA,CAAK,WAAU,EAAG,GAAA,CAAI,OAAO,OAAA,EAAS,UAAA,EAAY,KAAK,IAAI,CAAA;AAAA,EAC7D;AACF;;;ACXA,IAAI,aAAA,GAA+B,IAAA;AACnC,IAAI,iBAAA,GAAyC,IAAA;AAC7C,IAAI,oBAAA,GAA4C,IAAA;AAChD,IAAI,aAAA,GAAqC,IAAA;AACzC,IAAI,aAAA,GAAqC,IAAA;AACzC,IAAI,kBAAA,GAA0C,IAAA;AAC9C,IAAI,eAAA,GAAuC,IAAA;AAC3C,IAAI,kBAAA,GAA0C,IAAA;AAC9C,IAAI,uBAAA,GAA+C,IAAA;AACnD,IAAI,kBAAA,GAA0C,IAAA;AAK9C,IAAM,gBAAA,uBAAuB,GAAA,EAAmB;AAEhD,SAAS,cAAc,OAAA,EAA8B;AACnD,EAAA,MAAM,OAAA,GAAU,OAAA,CACb,KAAA,CAAM,MAAM;AAAA,EAAC,CAAC,CAAA,CACd,OAAA,CAAQ,MAAM;AACb,IAAA,gBAAA,CAAiB,OAAO,OAAO,CAAA;AAAA,EACjC,CAAC,CAAA;AACH,EAAA,gBAAA,CAAiB,IAAI,OAAO,CAAA;AAC9B;AAWO,SAAS,KAAK,OAAA,EAAqC;AAKxD,EAAA,IACE,iBACA,oBAAA,CAAqB,aAAA,CAAc,SAAS,cAAA,CAAe,OAAO,CAAC,CAAA,EACnE;AACA,IAAA,OAAO,aAAA;AAAA,EACT;AAQA,EAAA,MAAM,QAAA,GAAW,aAAA;AACjB,EAAA,QAAA,EAAS;AACT,EAAA,MAAM,MAAA,GAAS,IAAI,MAAA,CAAO,OAAA,EAAS,QAAA,GAAW,EAAE,KAAA,EAAO,QAAA,CAAS,KAAA,EAAM,GAAI,EAAE,CAAA;AAC5E,EAAA,aAAA,GAAgB,MAAA;AAChB,EAAA,IAAI,QAAA,EAAU,aAAA,CAAc,QAAA,CAAS,KAAA,EAAO,CAAA;AAK5C,EAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,QAAQ,OAAA,EAAS;AAC7C,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,CAAA,gCAAA,EAAmC,OAAO,cAAc,CAAA,sCAAA;AAAA,KAC1D;AAAA,EACF;AAIA,EAAA,IAAI,WAAU,IAAK,aAAA,CAAc,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACtD,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,OAAA,CAAQ,WAAA,EAAa;AAChD,IAAA,IAAI,WAAU,EAAG;AAGf,MAAA,kBAAA,GAAqB,iBAAiB,MAAM,CAAA;AAC5C,MAAA,iBAAA,GAAoB,sBAAsB,MAAM,CAAA;AAChD,MAAA,IAAI,MAAA,CAAO,QAAQ,WAAA,EAAa;AAC9B,QAAA,oBAAA,GAAuB,mBAAmB,MAAM,CAAA;AAAA,MAClD;AAGA,MAAA,MAAM,SAAA,GACH,MAAA,CAAO,OAAA,CAAQ,WAAA,IAAe,MAAA,CAAO,OAAA,CAAQ,eAAA,CAAgB,IAAA,IAC7D,MAAA,CAAO,OAAA,CAAQ,uBAAA,IAA2B,MAAA,CAAO,OAAA,CAAQ,mBAAA;AAC5D,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,aAAA,GAAgB,2BAA2B,MAAM,CAAA;AAAA,MACnD;AACA,MAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,uBAAA,IAA2B,MAAA,CAAO,QAAQ,UAAA,EAAY;AACvE,QAAA,aAAA,GAAgB,qBAAqB,MAAM,CAAA;AAAA,MAC7C;AACA,MAAA,IAAI,MAAA,CAAO,QAAQ,cAAA,EAAgB;AACjC,QAAA,kBAAA,GAAqB,iBAAiB,MAAM,CAAA;AAAA,MAC9C;AACA,MAAA,IAAI,MAAA,CAAO,QAAQ,MAAA,EAAQ;AACzB,QAAA,eAAA,GAAkB,cAAc,MAAM,CAAA;AAAA,MACxC;AAGA,MAAA,IAAI,MAAA,CAAO,QAAQ,cAAA,EAAgB;AACjC,QAAA,kBAAA,GAAqB,iBAAiB,MAAM,CAAA;AAAA,MAC9C;AACA,MAAA,IAAI,MAAA,CAAO,QAAQ,qBAAA,EAAuB;AACxC,QAAA,uBAAA,GAA0B,sBAAsB,MAAM,CAAA;AAAA,MACxD;AAAA,IACF,CAAA,MAAA,IAAW,QAAO,EAAG;AACnB,MAAA,iBAAA,GAAoB,uBAAuB,MAAM,CAAA;AACjD,MAAA,kBAAA,GAAqB,qBAAqB,MAAM,CAAA;AAAA,IAClD;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,gBAAA,CAAiB,OAAgB,IAAA,EAA0B;AACzE,EAAA,aAAA,EAAe,gBAAA,CAAiB,OAAO,IAAI,CAAA;AAC7C;AAGO,SAAS,cAAA,CAAe,OAAA,EAAiB,KAAA,GAAoB,MAAA,EAAc;AAChF,EAAA,aAAA,EAAe,cAAA,CAAe,SAAS,KAAK,CAAA;AAC9C;AAGO,SAAS,GAAA,CACd,KAAA,EACA,OAAA,EACA,UAAA,EACA,UAAA,EACM;AACN,EAAA,aAAA,EAAe,GAAA,CAAI,KAAA,EAAO,OAAA,EAAS,UAAA,EAAY,UAAU,CAAA;AAC3D;AAIO,IAAM,MAAA,GAAS,IAAI,iBAAA,CAAkB,MAAM,aAAa;AAKxD,SAAS,OAAA,CACd,KAAA,EACA,IAAA,EACA,IAAA,EACG;AACH,EAAA,IAAI,eAAe,OAAO,aAAA,CAAc,OAAA,CAAQ,KAAA,EAAO,MAAM,IAAI,CAAA;AACjE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,MAAM,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AAC1D,IAAA,MAAM,IAAI,SAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,IAAA,EAAK;AACd;AAMO,SAAS,gBAAgB,SAAA,EAAqC;AACnE,EAAA,aAAA,EAAe,gBAAgB,SAAS,CAAA;AAC1C;AAIO,SAAS,YAAA,CAAa,MAAc,SAAA,EAAqC;AAC9E,EAAA,aAAA,EAAe,YAAA,CAAa,MAAM,SAAS,CAAA;AAC7C;AAGO,SAAS,QAAQ,IAAA,EAAgC;AACtD,EAAA,aAAA,EAAe,QAAQ,IAAI,CAAA;AAC7B;AAGO,SAAS,MAAA,CAAO,KAAa,KAAA,EAAqB;AACvD,EAAA,aAAA,EAAe,MAAA,CAAO,KAAK,KAAK,CAAA;AAClC;AAGO,SAAS,QAAQ,IAAA,EAAoC;AAC1D,EAAA,aAAA,EAAe,QAAQ,IAAI,CAAA;AAC7B;AAGO,SAAS,QAAA,CAAS,KAAa,KAAA,EAAsB;AAC1D,EAAA,aAAA,EAAe,QAAA,CAAS,KAAK,KAAK,CAAA;AACpC;AAGO,SAAS,UAAA,CAAW,KAAa,KAAA,EAAsC;AAC5E,EAAA,aAAA,EAAe,UAAA,CAAW,KAAK,KAAK,CAAA;AACtC;AAGO,SAAS,WAAW,EAAA,EAA8B;AACvD,EAAA,aAAA,EAAe,WAAW,EAAE,CAAA;AAC9B;AAGO,SAAS,UAAA,GAAiC;AAC/C,EAAA,OAAO,eAAe,KAAA,CAAM,OAAA;AAC9B;AAMO,SAAS,cAAc,OAAA,EAA6B;AACzD,EAAA,aAAA,EAAe,cAAc,OAAO,CAAA;AACtC;AAOO,SAAS,gBAAgB,MAAA,EAAyC;AACvE,EAAA,OAAO,aAAA,EAAe,eAAA,CAAgB,MAAM,CAAA,IAAK,EAAC;AACpD;AAGO,SAAS,kBAAA,GAAyC;AACvD,EAAA,OAAO,eAAe,KAAA,CAAM,eAAA;AAC9B;AAGO,SAAS,cAAc,KAAA,EAMrB;AACP,EAAA,aAAA,EAAe,cAAc,KAAK,CAAA;AACpC;AAGO,SAAS,UAAA,GAAmB;AACjC,EAAA,aAAA,EAAe,UAAA,EAAW;AAC5B;AASO,SAAS,aAAgB,EAAA,EAA4B;AAC1D,EAAA,IAAI,aAAA,EAAe,OAAO,aAAA,CAAc,YAAA,CAAa,EAAE,CAAA;AACvD,EAAA,OAAO,EAAA,CAAG,IAAI,KAAA,EAAO,CAAA;AACvB;AAMO,SAAS,UAAa,EAAA,EAA4B;AACvD,EAAA,IAAI,aAAA,EAAe,OAAO,aAAA,CAAc,SAAA,CAAU,EAAE,CAAA;AACpD,EAAA,OAAO,EAAA,CAAG,IAAI,KAAA,EAAO,CAAA;AACvB;AAMO,SAAS,QAAA,GAA0B;AACxC,EAAA,OAAO,aAAA,EAAe,KAAA,CAAM,QAAA,EAAS,IAAK,kBAAA,EAAmB;AAC/D;AAGO,SAASK,UAAAA,GAAqB;AACnC,EAAA,OAAO,eAAe,OAAA,IAAW,KAAA;AACnC;AAIO,SAAS,KAAA,GAAuB;AACrC,EAAA,OAAO,QAAQ,GAAA,CAAI;AAAA,IACjB,aAAA,EAAe,KAAA,EAAM,IAAK,OAAA,CAAQ,OAAA,EAAQ;AAAA,IAC1C,GAAG;AAAA,GACJ,CAAA,CAAE,IAAA,CAAK,MAAM,MAAS,CAAA;AACzB;AAKA,eAAsB,KAAA,GAAuB;AAC3C,EAAA,MAAM,MAAA,GAAS,aAAA;AACf,EAAA,QAAA,EAAS;AACT,EAAA,aAAA,GAAgB,IAAA;AAChB,EAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,EAAM,IAAK,OAAA,CAAQ,OAAA,EAAQ,EAAG,GAAG,gBAAgB,CAAC,CAAA;AAC/E;AAEA,SAAS,QAAA,GAAiB;AACxB,EAAA,iBAAA,IAAoB;AACpB,EAAA,oBAAA,IAAuB;AACvB,EAAA,aAAA,IAAgB;AAChB,EAAA,aAAA,IAAgB;AAChB,EAAA,kBAAA,IAAqB;AACrB,EAAA,eAAA,IAAkB;AAClB,EAAA,kBAAA,IAAqB;AACrB,EAAA,uBAAA,IAA0B;AAC1B,EAAA,kBAAA,IAAqB;AACrB,EAAA,iBAAA,GAAoB,IAAA;AACpB,EAAA,oBAAA,GAAuB,IAAA;AACvB,EAAA,aAAA,GAAgB,IAAA;AAChB,EAAA,aAAA,GAAgB,IAAA;AAChB,EAAA,kBAAA,GAAqB,IAAA;AACrB,EAAA,eAAA,GAAkB,IAAA;AAClB,EAAA,kBAAA,GAAqB,IAAA;AACrB,EAAA,uBAAA,GAA0B,IAAA;AAC1B,EAAA,kBAAA,GAAqB,IAAA;AACvB;AAYA,SAAS,iBAAiB,MAAA,EAA4B;AACpD,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,MAAM;AAAA,EAAC,CAAA;AAEjD,EAAA,MAAM,SAAS,MAAY;AACzB,IAAA,MAAA,CAAO,iBAAiB,IAAI,CAAA;AAC5B,IAAA,KAAK,OAAO,KAAA,EAAM;AAAA,EACpB,CAAA;AACA,EAAA,MAAM,SAAS,MAAY;AACzB,IAAA,MAAA,CAAO,iBAAiB,KAAK,CAAA;AAAA,EAC/B,CAAA;AACA,EAAA,MAAM,eAAe,MAAY;AAC/B,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,IAAA,IAAI,QAAA,CAAS,eAAA,KAAoB,QAAA,EAAU,MAAA,EAAO;AAAA,SAC7C,MAAA,EAAO;AAAA,EACd,CAAA;AAEA,EAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,MAAM,CAAA;AAC1C,EAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,MAAM,CAAA;AAC1C,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,IAAA,QAAA,CAAS,gBAAA,CAAiB,oBAAoB,YAAY,CAAA;AAAA,EAC5D;AAEA,EAAA,OAAO,MAAM;AACX,IAAA,MAAA,CAAO,mBAAA,CAAoB,YAAY,MAAM,CAAA;AAC7C,IAAA,MAAA,CAAO,mBAAA,CAAoB,YAAY,MAAM,CAAA;AAC7C,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,MAAA,QAAA,CAAS,mBAAA,CAAoB,oBAAoB,YAAY,CAAA;AAAA,IAC/D;AAAA,EACF,CAAA;AACF","file":"index.mjs","sourcesContent":["// Deduplica su due livelli:\n// 1. identità dell'oggetto (WeakSet): lo stesso `Error` che risale più handler\n//    viene inviato una volta sola, per sempre — equivale alla ivar\n//    `@__closeyourit_captured` del gem e all'`Expando` del dart;\n// 2. finestra temporale su chiave (type + message + frame di crash): raffiche\n//    identiche entro [windowMs] vengono scartate (es. un onerror in loop) —\n//    copre i casi senza oggetto (stringhe di window.onerror).\n\nexport class Deduplicator {\n  private readonly seen = new Map<string, number>()\n  private readonly captured = new WeakSet<object>()\n\n  constructor(\n    private readonly windowMs: number = 5000,\n    private readonly now: () => number = () => Date.now(),\n  ) {}\n\n  /// `true` se [error] (oggetto) è già stato catturato. I primitivi non sono\n  /// tracciabili per identità → sempre `false` (ci pensa la finestra).\n  wasCaptured(error: unknown): boolean {\n    return isObject(error) && this.captured.has(error)\n  }\n\n  /// Marca [error] come catturato (no-op sui primitivi).\n  markCaptured(error: unknown): void {\n    if (isObject(error)) this.captured.add(error)\n  }\n\n  /// `true` se [key] è già stata vista entro la finestra; altrimenti la registra.\n  isDuplicate(key: string): boolean {\n    const current = this.now()\n    this.prune(current)\n    const previous = this.seen.get(key)\n    if (previous !== undefined && current - previous < this.windowMs) {\n      return true\n    }\n    this.seen.set(key, current)\n    return false\n  }\n\n  private prune(current: number): void {\n    for (const [key, ts] of this.seen) {\n      if (current - ts >= this.windowMs) this.seen.delete(key)\n    }\n  }\n}\n\nfunction isObject(value: unknown): value is object {\n  return (typeof value === 'object' && value !== null) || typeof value === 'function'\n}\n\n/// Chiave di dedup da tipo, messaggio e primo frame (top of stack = crash).\nexport function dedupKey(\n  type: string,\n  message: string,\n  topFrame: string | undefined,\n): string {\n  return `${type}|${message}|${topFrame ?? ''}`\n}\n","// Rilevazione dell'ambiente di esecuzione. Il ramo browser vince su Node:\n// sotto jsdom (test) esistono sia `window` sia `process`, e il comportamento\n// corretto è quello browser.\n\n/// `true` in un ambiente browser (o browser-like, es. jsdom).\nexport function isBrowser(): boolean {\n  return typeof window !== 'undefined' && typeof document !== 'undefined'\n}\n\n/// `true` in Node.js puro (senza DOM).\nexport function isNode(): boolean {\n  return (\n    !isBrowser() &&\n    typeof process !== 'undefined' &&\n    typeof process.versions?.node === 'string'\n  )\n}\n\n/// `contexts.runtime` dell'evento: `{name:'browser'}` oppure\n/// `{name:'node', version: process.version}`.\nexport function runtimeContext(): Record<string, unknown> {\n  if (isNode()) return { name: 'node', version: process.version }\n  return { name: 'browser' }\n}\n\n/// Hostname della macchina in Node (`os.hostname()`) → campo `server_name`\n/// dell'evento, in parità con la gem Ruby. `undefined` nel browser, se `os` è\n/// irraggiungibile o su hostname vuoto (non emettere un campo vuoto).\n///\n/// Guardia dynamic-require browser-safe: `os` NON è importato staticamente —\n/// romperebbe il bundle browser (l'IIFE `<script>` non ha i builtin Node). È\n/// risolto a runtime via `process.getBuiltinModule`, che il bundler non linka e\n/// che il browser non raggiunge mai (gate `isNode`). Richiede Node ≥20.16 —\n/// il minimo dichiarato in `engines` (vedi `package.json`).\nexport function serverName(): string | undefined {\n  if (!isNode()) return undefined\n  try {\n    const host = nodeOs()?.hostname?.()\n    return typeof host === 'string' && host.length > 0 ? host : undefined\n  } catch {\n    return undefined\n  }\n}\n\n/// Una release semver valida: `v` iniziale opzionale, `MAJOR.MINOR.PATCH`, con\n/// suffisso pre-release/build opzionale. Stessa regola della gem Ruby (CYRB-9):\n/// scarta i valori non-versione (`unknown`, nomi di branch) che non devono finire\n/// come release.\nconst SEMVER_RELEASE = /^v?\\d+\\.\\d+\\.\\d+([-+.].+)?$/\n\n/// Auto-rileva la release dal deploy — SOLO su runtime Node reale (SSR/backend),\n/// in parità tag-first con la gem Ruby. Il tag semver del deploy ha la precedenza\n/// (`APP_GIT_TAG` poi `GIT_TAG`, accettati solo se semver validi), poi lo SHA del\n/// deploy (`KAMAL_VERSION` poi `GIT_SHA`) come fallback.\n///\n/// `undefined` nel browser: il gate `isNode()` richiede `process.versions.node` e\n/// esclude window/jsdom, così un `process` polyfillato nel bundle browser non\n/// attiva l'auto-detect (nessun accesso alle variabili di processo lato browser).\n/// SDK isomorfo: si leggono solo le ENV, MAI un subprocess git. Nel browser la\n/// release va passata esplicita nelle options (build-time inject).\nexport function detectRelease(): string | undefined {\n  if (!isNode()) return undefined\n  const env = process.env\n  const tag = env.APP_GIT_TAG || env.GIT_TAG\n  if (tag && SEMVER_RELEASE.test(tag)) return tag\n  return env.KAMAL_VERSION || env.GIT_SHA || undefined\n}\n\ninterface NodeOs {\n  hostname?: () => string\n}\n\ninterface ProcessWithBuiltin {\n  getBuiltinModule?: (id: string) => unknown\n}\n\n// Modulo `os` di Node senza import statico (il bundle browser non deve contenere\n// 'os'). `getBuiltinModule` è l'API Node per accedere ai builtin da librerie\n// universali; garantita da `engines.node >=20.16`. Il guard resta come difesa in\n// profondità: `undefined` (mai un crash) su un runtime che non la esponesse.\nfunction nodeOs(): NodeOs | undefined {\n  const getBuiltin = (process as ProcessWithBuiltin).getBuiltinModule\n  if (typeof getBuiltin !== 'function') return undefined\n  return getBuiltin('os') as NodeOs\n}\n","// Parsing di `Error.stack` in frame formato Sentry (`stacktrace.frames`).\n//\n// Ordine di output: dal più vecchio (in fondo) al più recente (in cima) —\n// convenzione Sentry dove `frames.last` è il punto del crash. Lo stack JS è\n// newest-first, quindi viene invertito. Gestisce i formati V8/Chrome\n// (`at fn (url:line:col)`) e Firefox/Safari (`fn@url:line:col`).\n\nexport interface StackFrame {\n  filename: string\n  abs_path: string\n  function?: string\n  lineno?: number\n  colno?: number\n  in_app: boolean\n}\n\n// Limite difensivo: stack molto profondi non gonfiano il payload.\nconst MAX_FRAMES = 50\n\n/// Estrae i frame Sentry (oldest-first) da uno stack testuale, o `[]` se assente.\nexport function parseStack(stack: string | undefined): StackFrame[] {\n  if (!stack) return []\n\n  const frames: StackFrame[] = []\n  for (const raw of stack.split('\\n')) {\n    const line = raw.trim()\n    if (!line) continue\n    const parsed = parseLine(line)\n    if (parsed) frames.push(parsed)\n  }\n\n  // Stack newest-first → Sentry oldest-first, crash last.\n  frames.reverse()\n  if (frames.length > MAX_FRAMES) return frames.slice(frames.length - MAX_FRAMES)\n  return frames\n}\n\nfunction parseLine(line: string): StackFrame | null {\n  // V8/Chrome: \"at fn (loc)\" oppure \"at loc\".\n  if (line.startsWith('at ')) {\n    let rest = line.slice(3).trim()\n    let fn: string | undefined\n    const open = rest.indexOf('(')\n    if (open !== -1 && rest.endsWith(')')) {\n      fn = rest.slice(0, open).trim() || undefined\n      rest = rest.slice(open + 1, -1).trim()\n    }\n    return frameFrom(rest, cleanFunction(fn))\n  }\n\n  // Firefox/Safari: \"fn@loc\" oppure \"@loc\".\n  const at = line.lastIndexOf('@')\n  if (at !== -1) {\n    const fn = line.slice(0, at).trim() || undefined\n    const loc = line.slice(at + 1).trim()\n    return frameFrom(loc, cleanFunction(fn))\n  }\n\n  return null\n}\n\nfunction cleanFunction(fn: string | undefined): string | undefined {\n  if (!fn) return undefined\n  // Rimuove i prefissi V8 non informativi.\n  const cleaned = fn.replace(/^(async|new)\\s+/, '').trim()\n  if (!cleaned || cleaned === '<anonymous>') return undefined\n  return cleaned\n}\n\nfunction frameFrom(location: string, fn: string | undefined): StackFrame {\n  const { url, line, col } = parseLocation(location)\n  const frame: StackFrame = {\n    filename: fileNameOf(url),\n    abs_path: url,\n    in_app: isInApp(url),\n  }\n  if (fn !== undefined) frame.function = fn\n  if (line !== undefined) frame.lineno = line\n  if (col !== undefined) frame.colno = col\n  return frame\n}\n\nfunction parseLocation(loc: string): {\n  url: string\n  line?: number\n  col?: number\n} {\n  const withColRow = loc.match(/^(.+):(\\d+):(\\d+)$/)\n  if (withColRow) {\n    return {\n      url: withColRow[1]!,\n      line: Number(withColRow[2]),\n      col: Number(withColRow[3]),\n    }\n  }\n  const withRow = loc.match(/^(.+):(\\d+)$/)\n  if (withRow) {\n    return { url: withRow[1]!, line: Number(withRow[2]) }\n  }\n  return { url: loc }\n}\n\nfunction fileNameOf(url: string): string {\n  const withoutQuery = url.split('?')[0]!.split('#')[0]!\n  const segments = withoutQuery.split('/')\n  const last = segments[segments.length - 1]\n  return last && last.length > 0 ? last : url\n}\n\nfunction isInApp(url: string): boolean {\n  if (!url) return false\n  if (url === 'native' || url === '<anonymous>' || url === '[native code]') {\n    return false\n  }\n  if (url.includes('node_modules')) return false\n  return true\n}\n","// Redazione PII lato client, prima dell'invio. Specchio di `CloseYourIt::Scrubber`\n// (gem) e `Scrubber` (dart): redige ricorsivamente i valori la cui **chiave**\n// combacia con la denylist di campi sensibili.\n//\n// La denylist condivide il nucleo con backend/gem/dart\n// (`pass|secret|token|api[_-]?key|apikey|authorization|cookie|csrf|credit|card|cvv|ssn|iban`)\n// e aggiunge `email` — il browser è un contesto ad alto rischio PII e l'email è\n// il dato personale più comune che finisce per errore in attributi/context. È un\n// superset (più restrittivo), non un formato diverso: il backend ri-scruba comunque.\n\nconst SENSITIVE_KEY =\n  /pass|secret|token|api[_-]?key|apikey|authorization|cookie|csrf|credit|card|cvv|ssn|iban|e[_-]?mail/i\n\n// Assegnazione `chiave_sensibile=valore` (o `:`) dentro a un messaggio libero.\nconst SENSITIVE_ASSIGNMENT =\n  /(?:pass|secret|token|api[_-]?key|apikey|authorization|cookie|csrf|credit|card|cvv|ssn|iban|e[_-]?mail)[\\w-]*\\s*[=:]\\s*\\S+/gi\n\nexport const FILTERED = '[FILTERED]'\n\n/// `true` se la chiave è considerata sensibile (match parziale, case-insensitive).\nexport function isSensitiveKey(key: string): boolean {\n  return SENSITIVE_KEY.test(key)\n}\n\n/// Copia profonda di [value] con i valori sensibili redatti. Una chiave che\n/// combacia redige l'intero valore (anche mappe/liste); Map e Array annidati\n/// vengono attraversati. Cicli protetti da `seen`.\nexport function scrub<T>(value: T, seen: WeakSet<object> = new WeakSet()): T {\n  return scrubValue(value, seen) as T\n}\n\nfunction scrubValue(value: unknown, seen: WeakSet<object>): unknown {\n  if (Array.isArray(value)) {\n    if (seen.has(value)) return '[Circular]'\n    seen.add(value)\n    return value.map((item) => scrubValue(item, seen))\n  }\n  if (value !== null && typeof value === 'object') {\n    if (seen.has(value)) return '[Circular]'\n    seen.add(value)\n    const input = value as Record<string, unknown>\n    const result: Record<string, unknown> = {}\n    for (const key of Object.keys(input)) {\n      result[key] = isSensitiveKey(key) ? FILTERED : scrubValue(input[key], seen)\n    }\n    return result\n  }\n  return value\n}\n\n/// Redige le coppie `chiave_sensibile=valore` in un messaggio testuale libero\n/// (es. il messaggio di un'eccezione), prima dell'invio.\nexport function scrubMessage(input: string): string {\n  return input.replace(SENSITIVE_ASSIGNMENT, FILTERED)\n}\n","// UUID v4 senza trattini per `event_id`, e generatore del `trace_id` di pagina.\n// Usa `crypto.getRandomValues` quando disponibile, con fallback a `Math.random`.\n\nfunction randomBytes(length: number): Uint8Array {\n  const bytes = new Uint8Array(length)\n  const cryptoObj = (globalThis as { crypto?: Crypto }).crypto\n  if (cryptoObj && typeof cryptoObj.getRandomValues === 'function') {\n    cryptoObj.getRandomValues(bytes)\n    return bytes\n  }\n  for (let i = 0; i < length; i++) {\n    bytes[i] = Math.floor(Math.random() * 256)\n  }\n  return bytes\n}\n\n/// UUID v4 canonico (con trattini).\nexport function uuidV4(): string {\n  const b = randomBytes(16)\n  // Versione (4) e variante (10xx) secondo RFC 4122.\n  b[6] = (b[6]! & 0x0f) | 0x40\n  b[8] = (b[8]! & 0x3f) | 0x80\n  const hex: string[] = []\n  for (let i = 0; i < 16; i++) hex.push(b[i]!.toString(16).padStart(2, '0'))\n  return (\n    hex.slice(0, 4).join('') +\n    '-' +\n    hex.slice(4, 6).join('') +\n    '-' +\n    hex.slice(6, 8).join('') +\n    '-' +\n    hex.slice(8, 10).join('') +\n    '-' +\n    hex.slice(10, 16).join('')\n  )\n}\n\n/// UUID v4 senza trattini — formato di `event_id` accettato dall'ingest.\nexport function uuidV4NoDashes(): string {\n  return uuidV4().replace(/-/g, '')\n}\n\n/// Span-id W3C Trace Context: 8 byte casuali in esadecimale (16 char). Identifica\n/// la singola operazione ed è il `parent-id` del traceparent propagato. Il bit 0\n/// del primo byte è forzato a 1 così lo span-id non è mai tutto-zero (valore\n/// riservato/invalido dallo standard), come `uuidV4` forza versione e variante.\nexport function spanId(): string {\n  const b = randomBytes(8)\n  b[0] = b[0]! | 0x01\n  let hex = ''\n  for (let i = 0; i < 8; i++) hex += b[i]!.toString(16).padStart(2, '0')\n  return hex\n}\n","// Nome e versione dell'SDK, inviati in `sdk.{name,version}` di ogni payload e\n// nello `User-Agent`. Tenere `SDK_VERSION` allineata a `version` in package.json.\nexport const SDK_NAME = 'closeyourit-js'\nexport const SDK_VERSION = '0.10.0'\n\n// `platform` degli eventi Sentry e `contexts.runtime.name`.\nexport const PLATFORM = 'javascript'\n","// Costruzione dei payload Sentry-compatibili inviati all'ingest CloseYourIt.\n// Specchio di `CloseYourIt::Events::{ErrorEvent,MessageEvent,LogEvent}` (gem) e\n// dei rispettivi in `closeyourit-dart`. Tutti i campi sono snake_case.\n\nimport { runtimeContext } from './runtime'\nimport { parseStack } from './stackTrace'\nimport { scrub, scrubMessage } from './scrubber'\nimport type { EventLevel, EventPayload, LogLevel } from './types'\nimport { uuidV4NoDashes } from './uuid'\nimport { PLATFORM, SDK_NAME, SDK_VERSION } from './version'\n\nconst SDK_INFO = { name: SDK_NAME, version: SDK_VERSION } as const\n\n/// Rappresentazione normalizzata di un errore, indipendente dal tipo in ingresso.\nexport interface NormalizedError {\n  type: string\n  value: string\n  stack: string | undefined\n}\n\n/// Riduce un input arbitrario (`Error`, stringa, oggetto, valore) a `{type,value,stack}`.\nexport function normalizeError(input: unknown): NormalizedError {\n  if (input instanceof Error) {\n    return {\n      type: input.name || 'Error',\n      value: input.message || String(input),\n      stack: input.stack,\n    }\n  }\n  if (typeof input === 'string') {\n    return { type: 'Error', value: input, stack: undefined }\n  }\n  if (input && typeof input === 'object') {\n    const obj = input as { name?: unknown; message?: unknown; stack?: unknown }\n    const type = typeof obj.name === 'string' ? obj.name : 'Error'\n    const value = typeof obj.message === 'string' ? obj.message : safeStringify(input)\n    const stack = typeof obj.stack === 'string' ? obj.stack : undefined\n    return { type, value, stack }\n  }\n  return { type: 'Error', value: String(input), stack: undefined }\n}\n\nfunction safeStringify(value: unknown): string {\n  try {\n    return JSON.stringify(value) ?? String(value)\n  } catch {\n    return String(value)\n  }\n}\n\ninterface ErrorEventInput {\n  error: NormalizedError\n  environment: string\n  release?: string | undefined\n  handled: boolean\n  level: EventLevel\n  scopeHash: EventPayload\n  traceId?: string | undefined\n  /// Id della sessione di replay in corso → `contexts.replay.replay_id`, lega\n  /// l'errore al video della sessione.\n  replayId?: string | undefined\n  contexts?: Record<string, unknown> | undefined\n  /// `contexts.runtime` (default: rilevato dall'ambiente).\n  runtime?: Record<string, unknown> | undefined\n  /// Request context automatico; il `request` dello scope ha precedenza.\n  request?: Record<string, unknown> | undefined\n  /// Hostname del server (Node) → campo top-level `server_name`, in parità con la\n  /// gem Ruby. Risolto dal client (via `serverName()`) e presente solo lato server\n  /// con `sendServerName` attivo; nel browser resta assente.\n  serverName?: string | undefined\n}\n\n/// Payload errore per `POST …/events`.\nexport function buildErrorEvent(input: ErrorEventInput): EventPayload {\n  const { base, scopeContexts } = splitScope(input.scopeHash)\n  const frames = parseStack(input.error.stack)\n\n  const payload: EventPayload = {\n    event_id: uuidV4NoDashes(),\n    timestamp: nowIso(),\n    platform: PLATFORM,\n    level: input.level,\n    environment: input.environment,\n    ...(input.release ? { release: input.release } : {}),\n    ...(input.serverName ? { server_name: input.serverName } : {}),\n    exception: {\n      values: [\n        {\n          type: input.error.type,\n          value: scrubMessage(input.error.value),\n          stacktrace: { frames },\n          mechanism: { type: PLATFORM, handled: input.handled },\n        },\n      ],\n    },\n    contexts: {\n      runtime: input.runtime ?? runtimeContext(),\n      ...scopeContexts,\n      ...scrub(input.contexts ?? {}),\n      ...(input.replayId ? { replay: { replay_id: input.replayId } } : {}),\n    },\n    sdk: SDK_INFO,\n    // Il request automatico precede lo spread dello scope: un\n    // `scope.setRequest` manuale lo sovrascrive.\n    ...(input.request ? { request: input.request } : {}),\n    ...base,\n    ...(input.traceId ? { trace_id: input.traceId } : {}),\n  }\n  return payload\n}\n\ninterface MessageEventInput {\n  message: string\n  environment: string\n  release?: string | undefined\n  level: EventLevel\n  scopeHash: EventPayload\n  traceId?: string | undefined\n  replayId?: string | undefined\n  runtime?: Record<string, unknown> | undefined\n  request?: Record<string, unknown> | undefined\n  /// Hostname del server (Node) → campo top-level `server_name` (vedi\n  /// `ErrorEventInput`). Assente nel browser.\n  serverName?: string | undefined\n}\n\n/// Payload messaggio diagnostico per `POST …/events`.\nexport function buildMessageEvent(input: MessageEventInput): EventPayload {\n  const { base, scopeContexts } = splitScope(input.scopeHash)\n  return {\n    event_id: uuidV4NoDashes(),\n    timestamp: nowIso(),\n    platform: PLATFORM,\n    level: input.level,\n    environment: input.environment,\n    ...(input.release ? { release: input.release } : {}),\n    ...(input.serverName ? { server_name: input.serverName } : {}),\n    message: { formatted: scrubMessage(input.message) },\n    contexts: {\n      runtime: input.runtime ?? runtimeContext(),\n      ...scopeContexts,\n      ...(input.replayId ? { replay: { replay_id: input.replayId } } : {}),\n    },\n    sdk: SDK_INFO,\n    ...(input.request ? { request: input.request } : {}),\n    ...base,\n    ...(input.traceId ? { trace_id: input.traceId } : {}),\n  }\n}\n\ninterface LogEventInput {\n  message: string\n  level: LogLevel\n  environment: string\n  release?: string | undefined\n  logger?: string | undefined\n  traceId?: string | undefined\n  attributes?: Record<string, unknown> | undefined\n}\n\n/// Voce di log per `POST …/logs` (inviata in batch, come array).\nexport function buildLogEvent(input: LogEventInput): EventPayload {\n  const attributes =\n    input.attributes && Object.keys(input.attributes).length > 0\n      ? scrub(input.attributes)\n      : undefined\n\n  return {\n    event_id: uuidV4NoDashes(),\n    timestamp: nowIso(),\n    level: input.level,\n    // Scrub del message anche sui log (non solo su errori/message-event): un log può contenere\n    // PII/segreti quanto un errore (es. `Failed auth email=… token=…`). Parità con buildErrorEvent.\n    message: scrubMessage(input.message),\n    ...(attributes ? { attributes } : {}),\n    ...(input.logger ? { logger: input.logger } : {}),\n    ...(input.traceId ? { trace_id: input.traceId } : {}),\n    environment: input.environment,\n    ...(input.release ? { release: input.release } : {}),\n    sdk: SDK_INFO,\n  }\n}\n\n// Estrae `contexts` dallo scope hash: va fuso nei contexts dell'evento, non\n// spread al top-level (parità con dart/ruby).\nfunction splitScope(scopeHash: EventPayload): {\n  base: EventPayload\n  scopeContexts: Record<string, unknown>\n} {\n  const base: EventPayload = { ...scopeHash }\n  const scopeContexts = (base['contexts'] as Record<string, unknown>) ?? {}\n  delete base['contexts']\n  return { base, scopeContexts }\n}\n\nfunction nowIso(): string {\n  return new Date().toISOString()\n}\n","// Budget byte e truncation dei payload prima dell'invio (CYJS-10).\n//\n// I limiti del servizio (contratto condiviso, CYRA-110/112) rifiutano con `413`\n// i payload troppo grandi. Senza un budget applicato lato client, un evento con\n// breadcrumb/contexts enormi, un batch di log o un chunk di replay grande\n// verrebbe perso INTERAMENTE: proprio il segnale che serviva. Qui riduciamo\n// PRIMA i contenuti meno importanti — preservando identità ed errore principale —\n// e marchiamo il payload con `truncated: true`.\n//\n// Misuriamo BYTE UTF-8 dopo `JSON.stringify`, NON caratteri: un emoji è 1 code\n// point ma 4 byte, ed è la dimensione in byte quella che il server confronta col\n// limite. Applicare il budget a monte evita anche che un gateway trusted rifiuti\n// (413) e ritenti un payload che non rientrerebbe mai (CYRA-112).\n//\n// Strategia per canale (verificata ai confini X-1/X/X+1 nei test):\n//   - eventi (error/message) → capEvent: droppa in quest'ordine breadcrumbs (i\n//     più vecchi), request, contexts custom (tiene runtime/os/app/device/replay),\n//     extra, tags, frames dello stacktrace; come ultima risorsa tronca il value\n//     dell'errore. Non tocca mai event_id/level/timestamp/exception.type.\n//   - log (batch) → chunkLogBatch: tronca il singolo log troppo grande\n//     (attributes poi message) e spezza l'array in più richieste ciascuna sotto\n//     budget e sotto il cap di conteggio, senza perdere alcun log.\n//   - replay (chunk) → capReplayChunk: droppa gli eventi rrweb dalla coda tenendo\n//     il prefisso in ordine; identità di sessione (replay_session_id/seq) intatta.\n//   - metriche/pageview → capGeneric: campi già piccoli a monte, ma label/url/\n//     route/path/referrer/utm (e le iniezioni di `beforeSend`) non hanno un tetto\n//     proprio, quindi una rete generica li tronca/rimuove se serve.\n//\n// Ogni cap chiude con la rete di sicurezza `enforceBudget`, che GARANTISCE il\n// rientro sotto budget sfoltendo i residui non identitari (anche quelli iniettati\n// da `beforeSend`) che la strategia specifica non ha previsto.\n\nimport type { EventPayload } from './types'\n\n/// Budget conservativo per singola richiesta HTTP, in byte UTF-8 del body JSON\n/// (NON compresso — il transport non gzippa). Derivato dal contratto (API.md §6):\n/// envelope decompresso max 5 MB (`MAX_DECOMPRESSED`), compresso max 1 MB\n/// (`MAX_COMPRESSED`); un gateway trusted applica un `DefaultMaxBodyBytes`\n/// «almeno altrettanto restrittivo». 512 KiB sta ampiamente sotto tutti: un\n/// evento/chunk sano non lo sfiora, la truncation scatta solo su payload anomali.\nexport const MAX_PAYLOAD_BYTES = 512 * 1024\n\n// Overhead in byte delle parentesi quadre di un array JSON (`[` + `]`). Serve a\n// capare il singolo elemento lasciando spazio al wrapper del suo chunk.\nconst ARRAY_BRACKETS = 2\n\n// Contexts identitari/diagnostici da preservare quando si sfoltiscono i contexts\n// custom: legano l'evento (replay) o descrivono l'ambiente (parità col contratto,\n// dove os/app sono indicizzati). Tutto il resto è \"custom\" e cade per primo.\nconst CORE_CONTEXTS = new Set(['runtime', 'os', 'app', 'device', 'replay'])\n\n// Chiavi identitarie per canale: la rete di sicurezza `enforceBudget` non le\n// rimuove mai (e non tronca le loro stringhe). Ciò che resta fuori è riducibile.\nconst EVENT_KEEP = new Set([\n  'event_id',\n  'timestamp',\n  'platform',\n  'level',\n  'environment',\n  'release',\n  'server_name',\n  'sdk',\n  'trace_id',\n  'exception',\n  'message',\n  'contexts',\n  'user',\n  'truncated',\n])\nconst LOG_KEEP = new Set([\n  'event_id',\n  'timestamp',\n  'level',\n  'message',\n  'trace_id',\n  'sdk',\n  'truncated',\n])\nconst REPLAY_KEEP = new Set([\n  'replay_session_id',\n  'seq',\n  'started_at',\n  'events',\n  'environment',\n  'truncated',\n])\n// Canali a forma libera (metriche/pageview): l'identità minima comune. Label,\n// url, route, path, referrer, utm sono stringhe fuori dal set → troncate se\n// serve; gli oggetti custom (o iniettati da beforeSend) vengono rimossi.\nconst GENERIC_KEEP = new Set([\n  'kind',\n  'subtype',\n  'name',\n  'event_id',\n  'environment',\n  'trace_id',\n  'timestamp',\n  'truncated',\n])\n\n// Encoder condiviso (browser + Node ≥ 20): `TextEncoder().encode` conta i byte\n// UTF-8 reali. Cache lazy alla prima chiamata; assente solo in ambienti minimali.\nlet cachedEncoder: TextEncoder | undefined\n\n/// Byte UTF-8 di [value] (non caratteri): la metrica che il server confronta.\nexport function utf8Bytes(value: string): number {\n  if (typeof TextEncoder === 'function') {\n    cachedEncoder ??= new TextEncoder()\n    return cachedEncoder.encode(value).length\n  }\n  return manualUtf8Bytes(value)\n}\n\n// Fallback senza `TextEncoder`: somma i byte per code point (`for…of` itera per\n// code point, quindi i surrogate pair contano 4 byte una volta sola).\nfunction manualUtf8Bytes(value: string): number {\n  let bytes = 0\n  for (const ch of value) {\n    const cp = ch.codePointAt(0) ?? 0\n    if (cp <= 0x7f) bytes += 1\n    else if (cp <= 0x7ff) bytes += 2\n    else if (cp <= 0xffff) bytes += 3\n    else bytes += 4\n  }\n  return bytes\n}\n\n/// Byte UTF-8 del payload serializzato in JSON.\nexport function payloadBytes(payload: unknown): number {\n  return utf8Bytes(JSON.stringify(payload) ?? '')\n}\n\n// Byte del contributo JSON di una stringa: `JSON.stringify` la avvolge tra\n// virgolette ed ESCAPA `\"`, `\\` e i caratteri di controllo (`\"`→`\\\"`,\n// newline→`\\n`, ctrl→`\\u00XX`), quindi la stringa serializzata può pesare più di\n// quella grezza. Contiamo i byte reali che finiscono nel body, meno le 2\n// virgolette esterne, così il budget del campo è calcolato «dopo JSON.stringify».\nfunction jsonEscapedBytes(str: string): number {\n  return utf8Bytes(JSON.stringify(str)) - 2\n}\n\n/// Tronca [str] così che il suo contributo JSON (byte dopo l'escaping) sia ≤\n/// [maxEscapedBytes], senza spezzare un code point (i surrogate pair restano\n/// interi). È la troncatura giusta per un campo che verrà serializzato in JSON.\nexport function truncateUtf8Json(str: string, maxEscapedBytes: number): string {\n  if (maxEscapedBytes <= 0) return ''\n  if (jsonEscapedBytes(str) <= maxEscapedBytes) return str\n  let out = ''\n  let used = 0\n  for (const ch of str) {\n    const cost = utf8Bytes(JSON.stringify(ch)) - 2\n    if (used + cost > maxEscapedBytes) break\n    out += ch\n    used += cost\n  }\n  return out\n}\n\n// Rete di sicurezza comune a tutti i canali: garantisce che, dopo la strategia\n// specifica, `payloadBytes(payload) ≤ budget` anche quando restano residui\n// riducibili non previsti dalla strategia — campi custom o iniettati da\n// `beforeSend`, `logger`/`release`/`path`/`user` sovradimensionati. Prima tronca\n// i valori stringa top-level non identitari (il più grande per primo,\n// rispettando l'escaping JSON), poi rimuove i valori non-stringa non identitari\n// (oggetti/array custom). Le chiavi in [keep] non vengono mai rimosse e le loro\n// stringhe non troncate: sono l'identità del canale. Con budget realistico basta\n// sempre; sotto budget minuscoli l'identità irriducibile ha la precedenza.\nfunction enforceBudget(payload: EventPayload, budget: number, keep: Set<string>): void {\n  while (payloadBytes(payload) > budget) {\n    const key = largestTopLevel(payload, keep, 'string')\n    if (!key) break\n    const current = payload[key] as string\n    const room = budget - payloadBytes({ ...payload, [key]: '' })\n    const next = truncateUtf8Json(current, Math.max(0, room))\n    if (next === current) break\n    payload[key] = next\n  }\n  while (payloadBytes(payload) > budget) {\n    const key = largestTopLevel(payload, keep, 'other')\n    if (!key) break\n    delete payload[key]\n  }\n}\n\n// Chiave top-level (non in [keep]) col valore più pesante del tipo richiesto\n// (`string` o `other`), o `undefined` se non ce ne sono.\nfunction largestTopLevel(\n  payload: EventPayload,\n  keep: Set<string>,\n  kind: 'string' | 'other',\n): string | undefined {\n  let best: string | undefined\n  let bestBytes = 0\n  for (const key of Object.keys(payload)) {\n    if (keep.has(key)) continue\n    const value = payload[key]\n    const isString = typeof value === 'string'\n    if (kind === 'string' ? !isString : isString) continue\n    const bytes = payloadBytes(value)\n    if (bytes > bestBytes) {\n      bestBytes = bytes\n      best = key\n    }\n  }\n  return best\n}\n\n// Clone JSON-safe: i payload sono già JSON (vanno sul filo), così non mutiamo\n// l'input dei chiamanti mentre sfoltiamo i rami annidati.\nfunction clone<T>(value: T): T {\n  return JSON.parse(JSON.stringify(value)) as T\n}\n\n/// Riduce un evento error/message finché rientra in [budget] byte, preservando\n/// identità ed errore principale. Ritorna il payload originale se già sotto\n/// budget; altrimenti una copia ridotta con `truncated: true`.\nexport function capEvent(input: EventPayload, budget: number): EventPayload {\n  if (payloadBytes(input) <= budget) return input\n\n  const payload = clone(input)\n  // Il flag entra subito: così è già contato in tutte le misure successive e la\n  // sua aggiunta non può far risuperare il budget.\n  payload['truncated'] = true\n  const fits = (): boolean => payloadBytes(payload) <= budget\n\n  // 1. Breadcrumbs: droppa i più vecchi (i meno rilevanti al crash) uno a uno;\n  //    se non basta neppure svuotandoli, rimuove la chiave.\n  dropOldestBreadcrumbs(payload, fits)\n  if (fits()) return payload\n\n  // 2. Request context (URL/headers/body della richiesta): utile ma non identità.\n  if (removeKey(payload, 'request') && fits()) return payload\n\n  // 3. Contexts custom: tiene solo i core (runtime/os/app/device/replay).\n  if (pruneContexts(payload) && fits()) return payload\n\n  // 4-5. Extra e tags: metadati arricchiti, non spostano il grouping.\n  if (removeKey(payload, 'extra') && fits()) return payload\n  if (removeKey(payload, 'tags') && fits()) return payload\n\n  // 6. Frames dello stacktrace: tiene i più vicini al crash (in coda), scarta i\n  //    più esterni finché rientra.\n  if (trimStackFrames(payload, fits)) return payload\n\n  // 7. Ultima risorsa: tronca i value degli errori (e il message formattato)\n  //    lasciando type/mechanism. L'identità e la classe d'errore restano.\n  truncatePrimaryMessage(payload, budget)\n  // 8. Rete di sicurezza: residui top-level non identitari (campi iniettati da\n  //    beforeSend) che le 1-7 non toccano.\n  enforceBudget(payload, budget, EVENT_KEEP)\n  return payload\n}\n\n/// Riduce un singolo log finché rientra in [budget]: prima rimuove gli\n/// `attributes`, poi tronca il `message`, infine (rete di sicurezza) sfoltisce i\n/// campi non identitari residui. Preserva event_id/level/timestamp.\nexport function capLogEvent(input: EventPayload, budget: number): EventPayload {\n  if (payloadBytes(input) <= budget) return input\n\n  const payload = clone(input)\n  payload['truncated'] = true\n  if (removeKey(payload, 'attributes') && payloadBytes(payload) <= budget)\n    return payload\n\n  if (typeof payload['message'] === 'string') {\n    // Spazio residuo per il contributo JSON del message = budget meno tutto il\n    // resto già serializzato (le virgolette del campo sono già in withoutMessage).\n    const withoutMessage = { ...payload, message: '' }\n    const room = budget - payloadBytes(withoutMessage)\n    payload['message'] = truncateUtf8Json(payload['message'], Math.max(0, room))\n  }\n  // Campi non identitari residui (logger/release/environment o iniettati da\n  // beforeSend) ancora sopra budget: la rete di sicurezza li tronca/rimuove.\n  enforceBudget(payload, budget, LOG_KEEP)\n  return payload\n}\n\n/// Spezza un batch di log in più richieste, ciascuna sotto [budget] byte e sotto\n/// [maxCount] elementi, senza perdere alcun log. I singoli log troppo grandi\n/// vengono prima troncati da [capLogEvent]. L'array vuoto dà nessun chunk.\nexport function chunkLogBatch(\n  batch: EventPayload[],\n  budget: number,\n  maxCount: number,\n): EventPayload[][] {\n  const chunks: EventPayload[][] = []\n  let current: EventPayload[] = []\n  let currentBytes = ARRAY_BRACKETS\n\n  const push = (): void => {\n    if (current.length > 0) chunks.push(current)\n    current = []\n    currentBytes = ARRAY_BRACKETS\n  }\n\n  for (const raw of batch) {\n    // Ogni log deve stare da solo in un chunk: lo capiamo a budget meno i bracket.\n    const log = capLogEvent(raw, budget - ARRAY_BRACKETS)\n    // Byte aggiunti al chunk: l'elemento + la virgola se non è il primo. JSON di\n    // un array è `[` + join(',') + `]`, quindi il conteggio è esatto.\n    const add = payloadBytes(log) + (current.length > 0 ? 1 : 0)\n    const overBytes = currentBytes + add > budget\n    const overCount = current.length >= maxCount\n    if (current.length > 0 && (overBytes || overCount)) push()\n    current.push(log)\n    currentBytes += current.length > 1 ? payloadBytes(log) + 1 : payloadBytes(log)\n  }\n  push()\n  return chunks\n}\n\n/// Riduce un chunk di replay finché rientra in [budget]: droppa gli eventi rrweb\n/// dalla coda tenendo il prefisso in ordine (timeline continua dall'inizio).\n/// Identità di sessione (replay_session_id/seq/started_at) sempre preservata.\nexport function capReplayChunk(input: EventPayload, budget: number): EventPayload {\n  if (payloadBytes(input) <= budget) return input\n\n  const payload = clone(input)\n  payload['truncated'] = true\n  const events = Array.isArray(payload['events'])\n    ? (payload['events'] as unknown[])\n    : []\n\n  // Prefisso più lungo di eventi che rientra: overhead (chunk con events:[]) +\n  // byte cumulati degli eventi + virgole. Il conteggio segue la forma JSON.\n  const overhead = payloadBytes({ ...payload, events: [] }) - ARRAY_BRACKETS\n  let used = overhead + ARRAY_BRACKETS\n  const kept: unknown[] = []\n  for (const ev of events) {\n    const add = payloadBytes(ev) + (kept.length > 0 ? 1 : 0)\n    if (used + add > budget) break\n    kept.push(ev)\n    used += add\n  }\n  payload['events'] = kept\n  // Rete di sicurezza: se persino i metadati (path/user grandi, campi iniettati)\n  // sfondano il budget, sfoltiscili tenendo l'identità di sessione e gli eventi.\n  enforceBudget(payload, budget, REPLAY_KEEP)\n  return payload\n}\n\n/// Cap generico per i canali a forma libera (metriche, pageview): se supera\n/// [budget], tronca i valori stringa non identitari (label/url/route/path/\n/// referrer/utm…) e rimuove i valori custom, marcando `truncated`. L'identità\n/// minima del canale (kind/subtype/name/environment…) resta.\nexport function capGeneric(input: EventPayload, budget: number): EventPayload {\n  if (payloadBytes(input) <= budget) return input\n  const payload = clone(input)\n  payload['truncated'] = true\n  enforceBudget(payload, budget, GENERIC_KEEP)\n  return payload\n}\n\n// ---------------------------------------------------------------- riduttori\n\n// Droppa i breadcrumb più vecchi (testa dell'array) uno a uno finché [fits] o\n// l'array è vuoto; in tal caso rimuove del tutto la chiave.\nfunction dropOldestBreadcrumbs(payload: EventPayload, fits: () => boolean): void {\n  const container = payload['breadcrumbs']\n  const values =\n    container &&\n    typeof container === 'object' &&\n    Array.isArray((container as { values?: unknown }).values)\n      ? (container as { values: unknown[] }).values\n      : undefined\n  if (!values) return\n  while (values.length > 0 && !fits()) values.shift()\n  if (values.length === 0) delete payload['breadcrumbs']\n}\n\n// Rimuove [key] se presente. Ritorna `true` se ha rimosso qualcosa.\nfunction removeKey(payload: EventPayload, key: string): boolean {\n  if (!(key in payload)) return false\n  delete payload[key]\n  return true\n}\n\n// Tiene nei contexts solo le chiavi core; rimuove le custom. Ritorna `true` se ha\n// tolto almeno una chiave.\nfunction pruneContexts(payload: EventPayload): boolean {\n  const contexts = payload['contexts']\n  if (!contexts || typeof contexts !== 'object') return false\n  const map = contexts as Record<string, unknown>\n  let changed = false\n  for (const key of Object.keys(map)) {\n    if (!CORE_CONTEXTS.has(key)) {\n      delete map[key]\n      changed = true\n    }\n  }\n  if (Object.keys(map).length === 0) delete payload['contexts']\n  return changed\n}\n\n// Riduce i frame dello stacktrace tenendo i più vicini al crash (coda dell'array,\n// dove `parseStack` mette il frame che ha lanciato) finché [fits]. Ritorna `true`\n// se dopo la riduzione il payload rientra.\nfunction trimStackFrames(payload: EventPayload, fits: () => boolean): boolean {\n  const values = exceptionValues(payload)\n  if (!values) return false\n  for (const value of values) {\n    const frames = stackFrames(value)\n    if (!frames) continue\n    while (frames.length > 0 && !fits()) frames.shift()\n  }\n  return fits()\n}\n\n// Tronca i messaggi degli errori (exception.values[*].value e message.formatted)\n// all'ultimo respiro, lasciando spazio all'identità già serializzata. Il backend\n// legge l'ultimo value, ma anche gli altri occupano byte: li riduce tutti. type e\n// mechanism restano intatti. Il conteggio tiene conto dell'escaping JSON.\nfunction truncatePrimaryMessage(payload: EventPayload, budget: number): void {\n  const values = exceptionValues(payload)\n  if (values) {\n    for (let i = 0; i < values.length; i++) {\n      const value = values[i]\n      if (!value || typeof value.value !== 'string') continue\n      const probe = clone(payload)\n      const probeValue = exceptionValues(probe)?.[i]\n      if (!probeValue) continue\n      probeValue.value = ''\n      const room = budget - payloadBytes(probe)\n      value.value = truncateUtf8Json(value.value, Math.max(0, room))\n    }\n  }\n  const message = payload['message']\n  if (\n    message &&\n    typeof message === 'object' &&\n    typeof (message as { formatted?: unknown }).formatted === 'string'\n  ) {\n    const probe = clone(payload)\n    ;(probe['message'] as { formatted: string }).formatted = ''\n    const room = budget - payloadBytes(probe)\n    ;(message as { formatted: string }).formatted = truncateUtf8Json(\n      (message as { formatted: string }).formatted,\n      Math.max(0, room),\n    )\n  }\n}\n\ninterface ExceptionValue {\n  type?: string\n  value?: string\n  stacktrace?: { frames?: unknown[] }\n}\n\nfunction exceptionValues(payload: EventPayload): ExceptionValue[] | undefined {\n  const exception = payload['exception']\n  if (!exception || typeof exception !== 'object') return undefined\n  const values = (exception as { values?: unknown }).values\n  return Array.isArray(values) ? (values as ExceptionValue[]) : undefined\n}\n\nfunction stackFrames(value: ExceptionValue): unknown[] | undefined {\n  const frames = value.stacktrace?.frames\n  return Array.isArray(frames) ? frames : undefined\n}\n","// Buffer batch dei log. Specchio di `CloseYourIt::LogBuffer` (gem) e `LogBuffer`\n// (dart). Accumula i log e li svuota quando: raggiunge [batchSize], scade\n// [flushIntervalMs] (timer), oppure su [flushNow]/[dispose].\n\nimport type { EventPayload } from './types'\n\n/// Massimo numero di log per singola richiesta HTTP a `/logs` (il backend rifiuta\n/// batch più grandi con 413). I batch oltre soglia vengono spezzati.\nexport const LOGS_MAX_BATCH = 1000\n\n/// Spezza [items] in blocchi di al più [size] elementi (ordine preservato).\nexport function chunkBatches<T>(items: T[], size: number): T[][] {\n  if (size <= 0) return [items]\n  const chunks: T[][] = []\n  for (let start = 0; start < items.length; start += size) {\n    chunks.push(items.slice(start, start + size))\n  }\n  return chunks\n}\n\nexport class LogBuffer {\n  private events: EventPayload[] = []\n  private timer: ReturnType<typeof setInterval> | undefined\n  private disposed = false\n\n  constructor(\n    private readonly onFlush: (batch: EventPayload[]) => void,\n    private readonly batchSize: number = 50,\n    private readonly flushIntervalMs: number = 5000,\n  ) {}\n\n  get length(): number {\n    return this.events.length\n  }\n\n  add(event: EventPayload): void {\n    if (this.disposed) return\n    this.events.push(event)\n    this.ensureTimer()\n    if (this.events.length >= this.batchSize) this.flush()\n  }\n\n  /// Svuota il buffer consegnando il batch a [onFlush] (no-op se vuoto).\n  flush(): void {\n    if (this.events.length === 0) return\n    const batch = this.events\n    this.events = []\n    this.onFlush(batch)\n  }\n\n  private ensureTimer(): void {\n    if (this.timer !== undefined || this.flushIntervalMs <= 0) return\n    this.timer = setInterval(() => this.flush(), this.flushIntervalMs)\n    // In Node il timer non deve tenere vivo il processo (no-op nel browser).\n    const t = this.timer as { unref?: () => void }\n    if (typeof t.unref === 'function') t.unref()\n  }\n\n  /// Ferma il timer e svuota un'ultima volta. Dopo, [add] è no-op.\n  dispose(): void {\n    this.disposed = true\n    if (this.timer !== undefined) {\n      clearInterval(this.timer)\n      this.timer = undefined\n    }\n    this.flush()\n  }\n}\n","// Livelli di log canonici del backend e loro normalizzazione. Specchio di\n// `LogLevel` (dart) e della normalizzazione in `LogDevice`/`LogEvent` (gem):\n// warn→warning, err→error, unknown→fatal, livello ignoto→info.\n\nimport type { LogLevel } from './types'\n\nconst ORDINALS: Record<LogLevel, number> = {\n  debug: 0,\n  info: 1,\n  warning: 2,\n  error: 3,\n  fatal: 4,\n}\n\nconst ALIASES: Record<string, LogLevel> = {\n  warn: 'warning',\n  err: 'error',\n  unknown: 'fatal',\n}\n\n/// Normalizza un livello arbitrario al canone wire (`debug|info|warning|error|fatal`).\nexport function normalizeLogLevel(input: string): LogLevel {\n  const value = input.trim().toLowerCase()\n  if (value in ORDINALS) return value as LogLevel\n  return ALIASES[value] ?? 'info'\n}\n\n/// Posizione del livello nella scala di severità (debug=0 … fatal=4).\nexport function logLevelOrdinal(level: LogLevel): number {\n  return ORDINALS[level]\n}\n\n/// `true` se [level] è pari o superiore a [min].\nexport function meetsMinLevel(level: LogLevel, min: LogLevel): boolean {\n  return logLevelOrdinal(level) >= logLevelOrdinal(min)\n}\n","// Payload delle metriche per `POST …/metrics`. Specchio di\n// `CloseYourIt::Events::{SlowMethodEvent,PerformanceIssueEvent}` (gem) e\n// `MetricEvent`/`PerformanceIssueEvent` (dart). A differenza degli eventi\n// errore, `sample_id` è un uuid CON trattini. Le metriche non sono mai\n// campionate.\n\nimport { isSensitiveKey, FILTERED } from './scrubber'\nimport type { EventPayload } from './types'\nimport { uuidV4 } from './uuid'\nimport { SDK_NAME, SDK_VERSION } from './version'\n\nconst SDK_INFO = { name: SDK_NAME, version: SDK_VERSION } as const\nconst MAX_ARG_VALUE = 120\n\nexport interface SlowMethodInput {\n  /// Etichetta della misura: è il fingerprint della metrica (obbligatoria).\n  label: string\n  durationMs: number\n  environment: string\n  traceId?: string | undefined\n  file?: string | undefined\n  lineno?: number | undefined\n  /// Argomenti opzionali (già gateati da `captureMethodArguments` nel client).\n  args?: Record<string, unknown> | undefined\n}\n\n/// Payload `kind: slow_method`. Label vuota → TypeError: senza fingerprint la\n/// metrica non è raggruppabile (parità dart 0.2.0).\nexport function buildSlowMethodEvent(input: SlowMethodInput): EventPayload {\n  if (typeof input.label !== 'string' || input.label.trim().length === 0) {\n    throw new TypeError(\n      'closeyourit: measure(label) richiede una label non vuota (è il fingerprint della metrica)',\n    )\n  }\n\n  return {\n    kind: 'slow_method',\n    sample_id: uuidV4(),\n    duration_ms: round2(input.durationMs),\n    occurred_at: new Date().toISOString(),\n    environment: input.environment,\n    label: input.label,\n    ...(input.file ? { file: input.file } : {}),\n    ...(input.lineno !== undefined ? { lineno: input.lineno } : {}),\n    ...(input.args && Object.keys(input.args).length > 0\n      ? { arguments: formatArgs(input.args) }\n      : {}),\n    ...(input.traceId ? { trace_id: input.traceId } : {}),\n    sdk: SDK_INFO,\n  }\n}\n\nexport type PerformanceIssueSubtype = 'slow_external_http' | 'repeated_http' | 'jank'\n\nexport interface PerformanceIssueInput {\n  subtype: PerformanceIssueSubtype\n  environment: string\n  durationMs?: number | undefined\n  traceId?: string | undefined\n  /// slow_external_http / repeated_http\n  httpHost?: string | undefined\n  httpUrl?: string | undefined\n  /// jank\n  route?: string | undefined\n  /// repeated_http: numero di richieste identiche nella finestra. Sul wire è\n  /// `query_count` — stesso nome cross-SDK (dart, gem) e leggibile dal reader\n  /// Rails `occurrence_query_count` in UI.\n  queryCount?: number | undefined\n}\n\n/// Payload `kind: performance_issue`. I campi non pertinenti al subtype\n/// restano assenti (il backend raggruppa per signature kind-specifica).\nexport function buildPerformanceIssueEvent(input: PerformanceIssueInput): EventPayload {\n  return {\n    kind: 'performance_issue',\n    subtype: input.subtype,\n    sample_id: uuidV4(),\n    ...(input.durationMs !== undefined\n      ? { duration_ms: round2(input.durationMs) }\n      : {}),\n    occurred_at: new Date().toISOString(),\n    environment: input.environment,\n    ...(input.httpHost ? { http_host: input.httpHost } : {}),\n    ...(input.httpUrl ? { http_url: input.httpUrl } : {}),\n    ...(input.route ? { route: input.route } : {}),\n    ...(input.queryCount !== undefined ? { query_count: input.queryCount } : {}),\n    ...(input.traceId ? { trace_id: input.traceId } : {}),\n    sdk: SDK_INFO,\n  }\n}\n\n// `arguments` wire: array di {name, value} con valore stringificato, scrubato\n// per nome e troncato (parità slow_method_event.rb).\nfunction formatArgs(\n  args: Record<string, unknown>,\n): Array<{ name: string; value: string }> {\n  return Object.entries(args).map(([name, value]) => ({\n    name,\n    value: isSensitiveKey(name) ? FILTERED : truncate(stringify(value)),\n  }))\n}\n\nfunction stringify(value: unknown): string {\n  if (typeof value === 'string') return value\n  try {\n    return JSON.stringify(value) ?? String(value)\n  } catch {\n    return String(value)\n  }\n}\n\nfunction truncate(value: string): string {\n  return value.length > MAX_ARG_VALUE ? `${value.slice(0, MAX_ARG_VALUE)}…` : value\n}\n\nfunction round2(value: number): number {\n  return Math.round(value * 100) / 100\n}\n","// Normalizzazione e validazione delle opzioni. Specchio di\n// `CloseYourItOptions`/`Configuration` (dart/gem): i tre campi obbligatori\n// mancanti disabilitano l'SDK (no-op) invece di sollevare.\n\nimport { normalizeLogLevel } from './logLevel'\nimport { detectRelease } from './runtime'\nimport type {\n  BeforeSend,\n  CloseYourItOptions,\n  LogLevel,\n  OnDiagnostic,\n  TracePropagationTarget,\n} from './types'\n\n/// Soglia di default (ms) per una richiesta HTTP esterna lenta (breadcrumb\n/// `slow_external_http` + verdetto performance). Parità ruby/dart.\nexport const DEFAULT_SLOW_EXTERNAL_THRESHOLD_MS = 1000\n\nexport interface ResolvedOptions {\n  endpointUrl: string\n  token: string\n  publicKey: string\n  projectId: string\n  environment: string\n  release: string | undefined\n  sampleRate: number\n  beforeSend: BeforeSend | undefined\n  onDiagnostic: OnDiagnostic | undefined\n  debug: boolean\n  autoInstall: boolean\n  breadcrumbs: boolean\n  autoBreadcrumbs: {\n    click: boolean\n    navigation: boolean\n    console: boolean\n    http: boolean\n  }\n  maxBreadcrumbs: number\n  sendPii: boolean\n  sendServerName: boolean\n  maxQueue: number\n  excludedExceptions: string[]\n  captureRequest: boolean\n  trackPageviews: boolean\n  replay: boolean\n  replayMaskAllInputs: boolean\n  replayBlockSelector: string | undefined\n  replayMaskTextSelector: string | undefined\n  replayFlushIntervalMs: number\n  logsEnabled: boolean\n  logsSampleRate: number\n  logsBatchSize: number\n  logsFlushIntervalMs: number\n  logsMinLevel: LogLevel\n  slowMethodThresholdMs: number\n  captureMethodArguments: boolean\n  detectPerformanceIssues: boolean\n  captureExternalHttp: boolean\n  slowExternalThresholdMs: number\n  repeatedHttpThreshold: number\n  repeatedHttpWindowMs: number\n  detectJank: boolean\n  jankThresholdMs: number\n  trackWebVitals: boolean\n  webVitalsSampleRate: number\n  captureResourceErrors: boolean\n  tracePropagationTargets: TracePropagationTarget[]\n  enabled: boolean\n}\n\nexport function resolveOptions(options: CloseYourItOptions): ResolvedOptions {\n  return {\n    endpointUrl: (options.endpointUrl ?? '').trim().replace(/\\/+$/, ''),\n    token: (options.token ?? '').trim(),\n    publicKey: (options.publicKey ?? '').trim(),\n    projectId: (options.projectId ?? '').trim(),\n    environment: options.environment ?? 'production',\n    // release esplicita dal consumer, altrimenti auto-detect Node-side (tag-first,\n    // parità con la gem Ruby); undefined nel browser (vedi `detectRelease`).\n    release: options.release ?? detectRelease(),\n    sampleRate: clampRate(options.sampleRate),\n    beforeSend: options.beforeSend,\n    onDiagnostic: options.onDiagnostic,\n    debug: options.debug ?? false,\n    autoInstall: options.autoInstall ?? true,\n    breadcrumbs: options.breadcrumbs ?? true,\n    autoBreadcrumbs: {\n      click: options.autoBreadcrumbs?.click ?? true,\n      navigation: options.autoBreadcrumbs?.navigation ?? true,\n      console: options.autoBreadcrumbs?.console ?? true,\n      http: options.autoBreadcrumbs?.http ?? true,\n    },\n    maxBreadcrumbs: options.maxBreadcrumbs ?? 50,\n    sendPii: options.sendPii ?? false,\n    sendServerName: options.sendServerName ?? true,\n    maxQueue: positiveOr(options.maxQueue, 30),\n    excludedExceptions: options.excludedExceptions ?? [],\n    captureRequest: options.captureRequest ?? true,\n    trackPageviews: options.trackPageviews ?? false,\n    replay: options.replay ?? false,\n    replayMaskAllInputs: options.replayMaskAllInputs ?? true,\n    replayBlockSelector: options.replayBlockSelector,\n    // CYJS-15 · In un gestionale il grosso dei dati sensibili è testo che la pagina\n    // mostra (nomi, pratiche, importi), non solo quello digitato nei campi: il\n    // default deve coprirlo. `*` è il selettore che in rrweb fa matchare ogni\n    // elemento, quindi maschera tutti i nodi di testo. Chi vuole vedere in chiaro\n    // una parte della pagina passa un selettore più stretto: l'opt-out è per\n    // costruzione, e va dichiarato.\n    replayMaskTextSelector: options.replayMaskTextSelector ?? '*',\n    replayFlushIntervalMs: positiveOr(options.replayFlushIntervalMs, 5000),\n    logsEnabled: options.logsEnabled ?? true,\n    logsSampleRate: clampRate(options.logsSampleRate),\n    logsBatchSize: positiveOr(options.logsBatchSize, 50),\n    logsFlushIntervalMs: options.logsFlushIntervalMs ?? 5000,\n    logsMinLevel: normalizeLogLevel(options.logsMinLevel ?? 'info'),\n    slowMethodThresholdMs: positiveOr(options.slowMethodThresholdMs, 200),\n    captureMethodArguments: options.captureMethodArguments ?? false,\n    detectPerformanceIssues: options.detectPerformanceIssues ?? false,\n    captureExternalHttp: options.captureExternalHttp ?? true,\n    slowExternalThresholdMs: clampThreshold(options.slowExternalThresholdMs),\n    repeatedHttpThreshold: positiveOr(options.repeatedHttpThreshold, 5),\n    repeatedHttpWindowMs: positiveOr(options.repeatedHttpWindowMs, 5000),\n    detectJank: options.detectJank ?? true,\n    jankThresholdMs: positiveOr(options.jankThresholdMs, 100),\n    trackWebVitals: options.trackWebVitals ?? false,\n    webVitalsSampleRate: clampRate(options.webVitalsSampleRate),\n    captureResourceErrors: options.captureResourceErrors ?? false,\n    tracePropagationTargets: options.tracePropagationTargets ?? [],\n    enabled: options.enabled ?? true,\n  }\n}\n\nfunction clampRate(rate: number | undefined): number {\n  if (rate === undefined || Number.isNaN(rate)) return 1\n  if (rate < 0) return 0\n  if (rate > 1) return 1\n  return rate\n}\n\n// Valore > 0, altrimenti default (undefined/NaN/zero/negativi inclusi).\nfunction positiveOr(value: number | undefined, fallback: number): number {\n  if (value === undefined || Number.isNaN(value) || value <= 0) return fallback\n  return value\n}\n\n// Soglia in ms: `0` è valido (disattiva la rilevazione); undefined/NaN/negativi\n// ricadono sul default.\nfunction clampThreshold(value: number | undefined): number {\n  if (value === undefined || Number.isNaN(value) || value < 0) {\n    return DEFAULT_SLOW_EXTERNAL_THRESHOLD_MS\n  }\n  return value\n}\n\n/// Confronto strutturale di due set di opzioni **risolte**, per l'idempotenza di\n/// `init` (CYJS-8): equivalenti ⇒ una nuova `init` non riconfigura l'SDK. Il\n/// confronto è ricorsivo su oggetti annidati e array; le funzioni (`beforeSend`)\n/// sono confrontate per reference — una nuova closure conta come cambiamento, scelta\n/// prudente per non ignorare mai un intento di riconfigurazione.\nexport function resolvedOptionsEqual(a: ResolvedOptions, b: ResolvedOptions): boolean {\n  return deepEqual(a, b)\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n  if (a === b) return true\n  if (typeof a !== 'object' || a === null || typeof b !== 'object' || b === null) {\n    return false\n  }\n  // Le RegExp (in `tracePropagationTargets`) hanno chiavi enumerabili vuote: senza\n  // questo ramo due pattern diversi risulterebbero equivalenti. Confronto per\n  // sorgente e flag così un cambio di allowlist riconfigura davvero l'SDK.\n  if (a instanceof RegExp || b instanceof RegExp) {\n    return (\n      a instanceof RegExp &&\n      b instanceof RegExp &&\n      a.source === b.source &&\n      a.flags === b.flags\n    )\n  }\n  if (Array.isArray(a) || Array.isArray(b)) {\n    if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false\n    return a.every((item, index) => deepEqual(item, b[index]))\n  }\n  const aObj = a as Record<string, unknown>\n  const bObj = b as Record<string, unknown>\n  const aKeys = Object.keys(aObj)\n  const bKeys = Object.keys(bObj)\n  if (aKeys.length !== bKeys.length) return false\n  return aKeys.every(\n    (key) =>\n      Object.prototype.hasOwnProperty.call(bObj, key) &&\n      deepEqual(aObj[key], bObj[key]),\n  )\n}\n\n/// Prefisso del bearer **segreto** (`cyi_…`, server-only). La DSN public key è\n/// invece esadecimale senza prefisso (parità con la generazione backend).\nexport const SECRET_TOKEN_PREFIX = 'cyi_'\n\n/// `true` se [value] è un bearer segreto `cyi_` (mai da esporre nel browser).\nexport function isSecretToken(value: string): boolean {\n  return value.startsWith(SECRET_TOKEN_PREFIX)\n}\n\n/// Credenziale con cui il transport autentica l'ingest.\n/// - `bearer`: `Authorization: Bearer <secret>` — solo lato server.\n/// - `dsn`: DSN public key via `?sentry_key=` — browser-safe (nessun segreto).\nexport type TransportAuth =\n  { kind: 'bearer'; secret: string } | { kind: 'dsn'; publicKey: string }\n\n/// Sceglie la credenziale d'invio in base all'ambiente. Nel browser il bearer\n/// segreto NON è mai eleggibile (finirebbe nel bundle/Network): serve la\n/// `publicKey`. Lato server il bearer è la scelta primaria, con fallback alla\n/// public key se è l'unica fornita. `null` = nessuna credenziale utilizzabile.\nexport function resolveTransportAuth(\n  options: ResolvedOptions,\n  browser: boolean,\n): TransportAuth | null {\n  if (browser) {\n    return options.publicKey ? { kind: 'dsn', publicKey: options.publicKey } : null\n  }\n  if (options.token) return { kind: 'bearer', secret: options.token }\n  if (options.publicKey) return { kind: 'dsn', publicKey: options.publicKey }\n  return null\n}\n\n/// Motivo per cui l'SDK è disabilitato, o `null` se attivo. Dipende\n/// dall'ambiente: nel browser serve la DSN public key (il bearer è server-only).\nexport function disabledReason(\n  options: ResolvedOptions,\n  browser: boolean,\n): string | null {\n  if (!options.enabled) return 'disabilitato da configurazione (enabled: false)'\n  if (!options.endpointUrl) return 'endpointUrl mancante'\n  if (!options.projectId) return 'projectId mancante'\n  if (resolveTransportAuth(options, browser) === null) {\n    return browser\n      ? 'publicKey mancante (nel browser il bearer segreto cyi_ è server-only: usa la DSN public key)'\n      : 'token mancante'\n  }\n  if (\n    options.environment === 'production' &&\n    options.endpointUrl.startsWith('http://')\n  ) {\n    return 'endpoint http:// non ammesso in produzione'\n  }\n  return null\n}\n\nexport function isEnabled(options: ResolvedOptions, browser: boolean): boolean {\n  return disabledReason(options, browser) === null\n}\n\n/// URI di ingest per gli eventi errore/messaggio (auth bearer, path v1).\nexport function eventsUri(options: ResolvedOptions): string {\n  return `${options.endpointUrl}/api/v1/projects/${options.projectId}/events`\n}\n\n/// URI drop-in Sentry per gli eventi errore/messaggio quando si autentica via\n/// DSN public key: il backend espone `POST /api/:project_id/store` (evento JSON\n/// singolo), auth `?sentry_key=`. È il canale browser-safe per gli errori.\nexport function storeUri(options: ResolvedOptions): string {\n  return `${options.endpointUrl}/api/${options.projectId}/store`\n}\n\n/// URI di ingest per i log (batch).\nexport function logsUri(options: ResolvedOptions): string {\n  return `${options.endpointUrl}/api/v1/projects/${options.projectId}/logs`\n}\n\n/// URI di ingest per le metriche (slow_method, performance_issue).\nexport function metricsUri(options: ResolvedOptions): string {\n  return `${options.endpointUrl}/api/v1/projects/${options.projectId}/metrics`\n}\n\n/// URI di ingest per le pageview (web analytics).\nexport function pageviewsUri(options: ResolvedOptions): string {\n  return `${options.endpointUrl}/api/v1/projects/${options.projectId}/pageviews`\n}\n\n/// URI di ingest per i chunk di session replay.\nexport function replayUri(options: ResolvedOptions): string {\n  return `${options.endpointUrl}/api/v1/projects/${options.projectId}/replays`\n}\n\n/// URI di ingest per le misure Web Vitals (LCP/CLS/INP/TTFB/FCP dai visitatori\n/// veri). Endpoint suo, non un ramo dei pageview: forma, tetto di batch e\n/// throttle sono diversi (CYJS-12, CYJS-28).\nexport function webVitalsUri(options: ResolvedOptions): string {\n  return `${options.endpointUrl}/api/v1/projects/${options.projectId}/web_vitals`\n}\n\n/// Host dell'endpoint (per escludere la telemetria dai breadcrumb HTTP).\nexport function endpointHost(options: ResolvedOptions): string | undefined {\n  try {\n    return new URL(options.endpointUrl).host\n  } catch {\n    return undefined\n  }\n}\n","// Costruzione del payload di una pageview (web analytics cookieless). Campi\n// snake_case, come il resto del contratto wire (closeyourit-docs/API.md §4.4).\n// NESSUN segnale identificante viaggia nel body: IP e User-Agent li ricava il\n// server dalla richiesta; della query viaggiano SOLO le 3 chiavi UTM (mai la\n// query intera). `path` è sempre privo di query string. `environment` è aggiunto\n// dal client all'invio (è lui a conoscere l'ambiente risolto).\n//\n// Assume un contesto browser: l'unico chiamante, `Client.capturePageview`, gata\n// su `isBrowser()` prima di invocarla — una pageview fuori dal browser non ha\n// senso (niente location/referrer/UTM). Nessuna guardia non-browser qui: sarebbe\n// codice morto irraggiungibile sotto jsdom.\n\nimport { uuidV4 } from './uuid'\n\n/// Payload di una pageview pronto per l'invio, SENZA `environment` (lo aggiunge\n/// il client). `referrer` e gli `utm_*` sono presenti solo se valorizzati.\nexport interface PageviewPayload {\n  event_id: string\n  /// Nome dell'evento: assente (→ il server usa \"pageview\") per le visite pagina,\n  /// il nome del custom event per goal/conversioni (CloseYourIt.captureEvent).\n  name?: string\n  hostname: string\n  path: string\n  referrer?: string\n  utm_source?: string\n  utm_medium?: string\n  utm_campaign?: string\n  utm_term?: string\n  utm_content?: string\n  screen_width?: number\n  occurred_at: string\n}\n\nconst UTM_KEYS = [\n  'utm_source',\n  'utm_medium',\n  'utm_campaign',\n  'utm_term',\n  'utm_content',\n] as const\n\n/// Costruisce la pageview dalla location corrente. [overrides.path] forza il\n/// path (default `location.pathname`, MAI la query). `event_id` è un UUID v4 (con\n/// trattini) per l'idempotenza `(project_id, event_id)`.\nexport function buildPageview(overrides: { path?: string } = {}): PageviewPayload {\n  const payload: PageviewPayload = {\n    event_id: uuidV4(),\n    hostname: location.hostname,\n    path: overrides.path ?? location.pathname,\n    occurred_at: new Date().toISOString(),\n  }\n\n  if (document.referrer) payload.referrer = document.referrer\n\n  // Larghezza della viewport: il server la classifica in categoria di screen size\n  // (mai il valore raw come dimensione — solo la classe). Sempre presente in browser.\n  if (window.innerWidth > 0) payload.screen_width = window.innerWidth\n\n  const params = new URLSearchParams(location.search)\n  for (const key of UTM_KEYS) {\n    const value = params.get(key)\n    if (value) payload[key] = value\n  }\n\n  return payload\n}\n","// Request context automatico per gli eventi. Nel browser la \"richiesta\" è la\n// pagina corrente: URL (senza query, salvo sendPii), User-Agent e referrer.\n// Su Node non c'è una richiesta implicita → `undefined` (usare\n// `scope.setRequest` nei server, es. da un middleware).\n\nimport { isBrowser } from './runtime'\n\nexport function autoRequestContext(\n  sendPii: boolean,\n): Record<string, unknown> | undefined {\n  if (!isBrowser()) return undefined\n\n  const request: Record<string, unknown> = {\n    url: sendPii ? location.href : location.origin + location.pathname,\n    headers: { 'User-Agent': navigator.userAgent },\n  }\n  const referrer = typeof document !== 'undefined' ? document.referrer : ''\n  if (referrer) {\n    request['referrer'] = sendPii ? referrer : stripQuery(referrer)\n  }\n  return request\n}\n\nfunction stripQuery(href: string): string {\n  try {\n    const url = new URL(href)\n    return url.origin + url.pathname\n  } catch {\n    return (href.split('?')[0] ?? href).split('#')[0] ?? href\n  }\n}\n","// Storage del contesto per flusso asincrono su Node: `AsyncLocalStorage` tiene lo\n// scope della richiesta corrente separato da quello delle richieste concorrenti\n// (CYJS-7). Nel browser non esiste (ed è inutile: single-thread) → `undefined`, e\n// il `Client` ricade su un semplice stack sincrono.\n//\n// `async_hooks` NON è importato staticamente: romperebbe il bundle browser (l'IIFE\n// `<script>` non ha i builtin Node). È risolto a runtime via\n// `process.getBuiltinModule`, che il bundler non linka e che il browser non\n// raggiunge mai (gate `isNode`) — stessa guardia di `nodeOs` in `runtime.ts`.\n// Richiede Node ≥20.16, il minimo dichiarato in `engines` (vedi `package.json`).\n\nimport { isNode } from './runtime'\nimport type { Scope } from './scope'\n\n/// Sottoinsieme di `AsyncLocalStorage` usato dal client (evita la dipendenza dai\n/// tipi `@types/node` nella firma pubblica e mantiene il modulo isomorfo).\nexport interface ScopeStorage {\n  getStore(): Scope | undefined\n  run<T>(store: Scope, callback: () => T): T\n}\n\ninterface AsyncLocalStorageCtor {\n  new (): ScopeStorage\n}\n\ninterface AsyncHooks {\n  AsyncLocalStorage?: AsyncLocalStorageCtor\n}\n\ninterface ProcessWithBuiltin {\n  getBuiltinModule?: (id: string) => unknown\n}\n\n/// Crea lo storage per lo scope su Node, o `undefined` nel browser / se\n/// `async_hooks` è irraggiungibile (difesa in profondità: mai un crash).\nexport function createScopeStorage(): ScopeStorage | undefined {\n  if (!isNode()) return undefined\n  try {\n    const ctor = nodeAsyncHooks()?.AsyncLocalStorage\n    return typeof ctor === 'function' ? new ctor() : undefined\n  } catch {\n    return undefined\n  }\n}\n\nfunction nodeAsyncHooks(): AsyncHooks | undefined {\n  const getBuiltin = (process as ProcessWithBuiltin).getBuiltinModule\n  if (typeof getBuiltin !== 'function') return undefined\n  return getBuiltin('async_hooks') as AsyncHooks\n}\n","// Notificatore diagnostico process-local. Inoltra ogni tappa del ciclo di vita\n// di un evento (enqueue/send/drop/timeout/shutdown) all'hook `onDiagnostic`, se\n// configurato. Specchio di `CloseYourIt.notify_diagnostic` (gem Ruby, CYRB-12).\n//\n// Non ricorsivo per costruzione: mentre un hook è in esecuzione la soppressione è\n// attiva — il Client vi gata sopra le API di cattura (niente telemetria dalla\n// diagnostica) e un ulteriore `notify` viene ignorato (niente loop). Un errore\n// sollevato dall'hook è assorbito: la diagnostica non deve mai far crashare\n// l'host né interrompere l'invio in corso.\n//\n// La soppressione è PROCESSO-globale (come il thread-local della gem Ruby), non\n// per-client: durante un `init` a caldo (CYJS-8) il vecchio client può essere in\n// chiusura mentre il nuovo è già in uso, e l'hook del vecchio potrebbe catturare\n// via la facade sul nuovo client. Un flag globale garantisce che «mentre un\n// qualsiasi hook gira, nessuna cattura passa» valga per l'intero processo.\n\nimport type { DiagnosticDetails, DiagnosticEvent, OnDiagnostic } from './types'\n\n// True mentre un hook diagnostico è in esecuzione, ovunque nel processo. JS è\n// single-thread e `notify` è sincrona: un solo hook gira alla volta → basta un\n// boolean, sempre riportato a `false` nel `finally`.\nlet active = false\n\n/// `true` se un QUALSIASI hook diagnostico è in esecuzione nel processo. Le API\n/// di cattura vi gatano sopra per non generare telemetria dalla diagnostica,\n/// anche attraverso la facade dopo una re-init (CYJS-9).\nexport function diagnosticsSuppressed(): boolean {\n  return active\n}\n\n/// Solo il NOME della classe d'errore, mai il messaggio: quest'ultimo potrebbe\n/// contenere URL o dati sensibili e la diagnostica non deve mai esporre\n/// payload/segreti. Fallback `'Error'` per valori non-Error.\nexport function errorName(error: unknown): string {\n  return error instanceof Error ? error.name : 'Error'\n}\n\nexport class Diagnostics {\n  private readonly hook: OnDiagnostic | undefined\n\n  constructor(hook?: OnDiagnostic) {\n    this.hook = hook\n  }\n\n  /// `true` mentre un hook diagnostico è in esecuzione (soppressione globale).\n  get suppressed(): boolean {\n    return active\n  }\n\n  /// Notifica [event] all'hook con [details]. No-op senza hook o durante un\n  /// notify già in corso (di questa o di un'altra istanza). Un'eccezione\n  /// dell'hook è assorbita.\n  notify(event: DiagnosticEvent, details: DiagnosticDetails = {}): void {\n    if (!this.hook || active) return\n    active = true\n    try {\n      this.hook(event, details)\n    } catch {\n      // Hook difettoso: la diagnostica non deve mai propagare né interrompere.\n    } finally {\n      active = false\n    }\n  }\n}\n","// Breadcrumb (formato Sentry) e ring buffer. Specchio di `Breadcrumb` /\n// `BreadcrumbBuffer` (dart). I `data` vengono scrubati alla costruzione.\n\nimport { scrub } from './scrubber'\nimport type { EventPayload } from './types'\n\nexport interface BreadcrumbInput {\n  message?: string\n  category?: string\n  /// Tipo Sentry: `default`, `query`, `http`, `user`, `navigation`.\n  type?: string\n  /// Livello: `info`, `debug`, `warning`, `error`.\n  level?: string\n  data?: Record<string, unknown>\n}\n\nexport class Breadcrumb {\n  readonly timestamp: string\n  readonly message: string | undefined\n  readonly category: string | undefined\n  readonly type: string\n  readonly level: string\n  readonly data: Record<string, unknown> | undefined\n\n  constructor(input: BreadcrumbInput) {\n    this.timestamp = new Date().toISOString()\n    this.message = input.message\n    this.category = input.category\n    this.type = input.type ?? 'default'\n    this.level = input.level ?? 'info'\n    this.data =\n      input.data && Object.keys(input.data).length > 0 ? scrub(input.data) : undefined\n  }\n\n  toJSON(): EventPayload {\n    const json: EventPayload = {\n      timestamp: this.timestamp,\n      type: this.type,\n      level: this.level,\n    }\n    if (this.category !== undefined) json['category'] = this.category\n    if (this.message !== undefined) json['message'] = this.message\n    if (this.data !== undefined) json['data'] = this.data\n    return json\n  }\n}\n\n/// Ring buffer: tiene gli ultimi [maxSize], scarta i più vecchi.\nexport class BreadcrumbBuffer {\n  private items: Breadcrumb[] = []\n\n  constructor(private readonly capacity: number = 50) {}\n\n  /// Numero massimo di breadcrumb tenuti (serve a replicare il limite in un fork).\n  get maxSize(): number {\n    return this.capacity\n  }\n\n  get length(): number {\n    return this.items.length\n  }\n\n  add(crumb: Breadcrumb): void {\n    if (this.capacity <= 0) return\n    this.items.push(crumb)\n    while (this.items.length > this.capacity) this.items.shift()\n  }\n\n  clear(): void {\n    this.items = []\n  }\n\n  toList(): Breadcrumb[] {\n    return [...this.items]\n  }\n\n  /// Serializza in `{values: [...]}` (formato Sentry), o `null` se vuoto.\n  toJSON(): EventPayload | null {\n    if (this.items.length === 0) return null\n    return { values: this.items.map((c) => c.toJSON()) }\n  }\n}\n","// Contesto allegato agli eventi: user, tag, extra, context, trace_id e cronologia\n// breadcrumb. Specchio di `CloseYourIt::Scope` (gem) e `Scope` (dart). Nel browser\n// c'è un holder globale singolo (single-thread); su Node il `Client` ne isola una\n// copia per flusso asincrono via [fork] + AsyncLocalStorage (CYJS-7), così i dati\n// di una richiesta non finiscono negli eventi di un'altra concorrente. La\n// correlazione per-operazione si ottiene via [traceId].\n\nimport { Breadcrumb, BreadcrumbBuffer } from './breadcrumbs'\nimport type { BreadcrumbInput } from './breadcrumbs'\nimport { scrub } from './scrubber'\nimport type { EventPayload, UserContext } from './types'\n\nexport class Scope {\n  readonly breadcrumbs: BreadcrumbBuffer\n\n  private user: Record<string, unknown> | undefined\n  private tags: Record<string, string> = {}\n  private extra: Record<string, unknown> = {}\n  private contexts: Record<string, Record<string, unknown>> = {}\n  private request: Record<string, unknown> | undefined\n\n  /// ID di correlazione condiviso da log/errori della stessa operazione/pagina.\n  traceId: string | undefined\n\n  /// ID della sessione di replay in corso (più longevo del `traceId`: copre\n  /// l'intera sessione-browser). Allegato agli errori come `contexts.replay.replay_id`.\n  replaySessionId: string | undefined\n\n  /// `parent-id` (span-id del chiamante) del trace context W3C adottato con\n  /// `continueTrace`. Presente solo dopo aver continuato un trace distribuito.\n  traceParentId: string | undefined\n\n  /// Flag di campionamento del trace W3C adottato (bit 0 di `trace-flags`).\n  traceSampled: boolean | undefined\n\n  /// `tracestate` W3C opaco (già validato/troncato) da ri-propagare.\n  traceState: string | undefined\n\n  /// `baggage` W3C opaco adottato: può contenere PII, perciò è ri-propagato SOLO\n  /// verso destinazioni fidate e MAI allegato agli eventi.\n  traceBaggage: string | undefined\n\n  constructor(maxBreadcrumbs = 50) {\n    this.breadcrumbs = new BreadcrumbBuffer(maxBreadcrumbs)\n  }\n\n  setUser(user: UserContext | null): void {\n    this.user = user === null ? undefined : { ...user }\n  }\n\n  /// Id utente corrente come stringa (per la correlazione del session replay), o\n  /// `undefined` se non impostato.\n  get userId(): string | undefined {\n    const id = this.user?.['id']\n    return id === undefined || id === null ? undefined : String(id)\n  }\n\n  setTag(key: string, value: string): void {\n    this.tags[key] = value\n  }\n\n  setTags(tags: Record<string, string>): void {\n    Object.assign(this.tags, tags)\n  }\n\n  setExtra(key: string, value: unknown): void {\n    this.extra[key] = value\n  }\n\n  setContext(key: string, value: Record<string, unknown>): void {\n    this.contexts[key] = value\n  }\n\n  setTraceId(id: string | undefined): void {\n    this.traceId = id\n  }\n\n  /// Adotta un trace context W3C in ingresso: il suo `trace-id` diventa il\n  /// `traceId` di correlazione (così errori/log lo portano) e parent/sampling/\n  /// tracestate/baggage sono conservati per la ri-propagazione verso host fidati.\n  continueTrace(ctx: {\n    traceId: string\n    parentId: string\n    sampled: boolean\n    tracestate?: string | undefined\n    baggage?: string | undefined\n  }): void {\n    this.traceId = ctx.traceId\n    this.traceParentId = ctx.parentId\n    this.traceSampled = ctx.sampled\n    this.traceState = ctx.tracestate\n    this.traceBaggage = ctx.baggage\n  }\n\n  setReplaySessionId(id: string | undefined): void {\n    this.replaySessionId = id\n  }\n\n  /// Request context manuale: vince su quello rilevato automaticamente.\n  setRequest(request: Record<string, unknown> | null): void {\n    this.request = request === null ? undefined : { ...request }\n  }\n\n  addBreadcrumb(input: BreadcrumbInput): void {\n    this.breadcrumbs.add(new Breadcrumb(input))\n  }\n\n  /// Crea uno scope isolato a partire da questo: copia user/tag/extra/contexts/\n  /// request/replaySessionId in strutture nuove, così le mutazioni sul fork non\n  /// toccano l'originale (né viceversa). È la base dell'isolamento per flusso\n  /// asincrono su Node (CYJS-7).\n  ///\n  /// Con [opts.freshTrace] (per-richiesta: `runWithScope`) il fork parte come\n  /// nuova unità di correlazione — `traceId` azzerato e nessun breadcrumb\n  /// ereditato — pur conservando i dati di scope come base. Senza (contesto\n  /// temporaneo: `withScope`) eredita `traceId` e una copia dei breadcrumb correnti.\n  fork(opts: { freshTrace?: boolean } = {}): Scope {\n    const forked = new Scope(this.breadcrumbs.maxSize)\n    forked.user = this.user ? { ...this.user } : undefined\n    forked.tags = { ...this.tags }\n    forked.extra = { ...this.extra }\n    forked.contexts = cloneContexts(this.contexts)\n    forked.request = this.request ? { ...this.request } : undefined\n    forked.replaySessionId = this.replaySessionId\n    if (!(opts.freshTrace ?? false)) {\n      forked.traceId = this.traceId\n      // Il trace context W3C fa parte della stessa unità di correlazione del\n      // traceId: ereditato col contesto temporaneo, azzerato con freshTrace.\n      forked.traceParentId = this.traceParentId\n      forked.traceSampled = this.traceSampled\n      forked.traceState = this.traceState\n      forked.traceBaggage = this.traceBaggage\n      for (const crumb of this.breadcrumbs.toList()) forked.breadcrumbs.add(crumb)\n    }\n    return forked\n  }\n\n  clear(): void {\n    this.user = undefined\n    this.tags = {}\n    this.extra = {}\n    this.contexts = {}\n    this.request = undefined\n    this.traceId = undefined\n    this.traceParentId = undefined\n    this.traceSampled = undefined\n    this.traceState = undefined\n    this.traceBaggage = undefined\n    this.breadcrumbs.clear()\n  }\n\n  /// Serializza in chiavi Sentry, includendo solo le sezioni valorizzate.\n  /// Tags/extra/contexts/request passano per lo scrubber (difesa in profondità).\n  /// `user` ha la sua policy dedicata (parità gem): senza `sendPii` si riduce a\n  /// `{id}` (email & co. non partono proprio); con `sendPii` viaggia intero —\n  /// impostarlo è una dichiarazione esplicita d'intento.\n  toEventHash(opts: { sendPii?: boolean } = {}): EventPayload {\n    const hash: EventPayload = {}\n\n    if (this.user) {\n      const user = (opts.sendPii ?? false) ? { ...this.user } : pickId(this.user)\n      if (user) hash['user'] = user\n    }\n    if (Object.keys(this.tags).length > 0) hash['tags'] = scrub(this.tags)\n    if (Object.keys(this.extra).length > 0) hash['extra'] = scrub(this.extra)\n    if (Object.keys(this.contexts).length > 0) {\n      hash['contexts'] = scrub(this.contexts)\n    }\n    if (this.request) hash['request'] = scrub(this.request)\n    const crumbs = this.breadcrumbs.toJSON()\n    if (crumbs) hash['breadcrumbs'] = crumbs\n\n    return hash\n  }\n}\n\nfunction pickId(user: Record<string, unknown>): Record<string, unknown> | undefined {\n  return 'id' in user ? { id: user['id'] } : undefined\n}\n\n// Copia i contexts per chiave (un livello): `setContext` rimpiazza sempre l'intera\n// chiave, quindi lo shallow-per-chiave basta a isolare il fork dall'originale.\nfunction cloneContexts(\n  contexts: Record<string, Record<string, unknown>>,\n): Record<string, Record<string, unknown>> {\n  const out: Record<string, Record<string, unknown>> = {}\n  for (const key of Object.keys(contexts)) out[key] = { ...contexts[key] }\n  return out\n}\n","// Contatori diagnostici delle operazioni di telemetria. Specchio di\n// `CloseYourIt::Stats` (gem) e `Stats` (dart). Oltre agli aggregati\n// (`enqueued`/`sent`/`dropped`/`failed`, più `timeout` come sotto-conteggio dei\n// `failed`, parità gem Ruby) tiene la ripartizione `reasons` per rendere\n// visibile il MOTIVO di ogni scarto/fallimento — così `getStats` distingue una\n// coda piena da un drop di `beforeSend` o da un 5xx (CYJS-9).\n\nimport type { DropReason, StatsSnapshot } from './types'\n\nexport type { StatsSnapshot } from './types'\n\nexport type StatKey = 'enqueued' | 'sent' | 'dropped' | 'failed' | 'timeout'\n\nconst DROP_REASONS: DropReason[] = [\n  'sample_rate',\n  'before_send',\n  'error',\n  'queue_full',\n  'response',\n  'network',\n]\n\n// Motivi che rappresentano un invio TENTATO ma fallito (non-2xx / rete): contano\n// tra i `failed`. Gli altri sono scarti client-side (mai partiti) → `dropped`.\nconst FAILED_REASONS = new Set<DropReason>(['response', 'network'])\n\n/// Snapshot con tutti i contatori a zero (usato pre-init / dopo close).\nexport function emptyStatsSnapshot(): StatsSnapshot {\n  return {\n    enqueued: 0,\n    sent: 0,\n    dropped: 0,\n    failed: 0,\n    timeout: 0,\n    reasons: zeroReasons(),\n  }\n}\n\nfunction zeroReasons(): Record<DropReason, number> {\n  return {\n    sample_rate: 0,\n    before_send: 0,\n    error: 0,\n    queue_full: 0,\n    response: 0,\n    network: 0,\n  }\n}\n\nexport class Stats {\n  private counts: Record<StatKey, number> = {\n    enqueued: 0,\n    sent: 0,\n    dropped: 0,\n    failed: 0,\n    timeout: 0,\n  }\n\n  private reasons: Record<DropReason, number> = zeroReasons()\n\n  /// Incrementa un contatore aggregato ([enqueued]/[sent] nell'uso normale).\n  increment(key: StatKey): void {\n    this.counts[key] += 1\n  }\n\n  /// Valore corrente di un contatore aggregato.\n  get(key: StatKey): number {\n    return this.counts[key]\n  }\n\n  /// Registra uno scarto/fallimento con il suo [reason]: incrementa `dropped`\n  /// (scarti client-side) oppure `failed` (`response`/`network`, invio tentato)\n  /// e sempre il contatore del motivo in `reasons`.\n  record(reason: DropReason): void {\n    this.reasons[reason] += 1\n    if (FAILED_REASONS.has(reason)) this.counts.failed += 1\n    else this.counts.dropped += 1\n  }\n\n  /// Registra un timeout di rete: `failed` + `timeout` (sotto-conteggio dei\n  /// falliti, parità gem Ruby: isola i problemi di connettività dai non-2xx).\n  recordTimeout(): void {\n    this.counts.failed += 1\n    this.counts.timeout += 1\n  }\n\n  /// Snapshot dei contatori (copia profonda: nessun aliasing con lo stato interno).\n  toObject(): StatsSnapshot {\n    return { ...this.counts, reasons: { ...this.reasons } }\n  }\n\n  /// Azzera tutti i contatori e i motivi.\n  reset(): void {\n    for (const key of Object.keys(this.counts) as StatKey[]) this.counts[key] = 0\n    for (const reason of DROP_REASONS) this.reasons[reason] = 0\n  }\n}\n","// Parser/validator/formatter del W3C Trace Context (`traceparent`/`tracestate`)\n// e del W3C Baggage, più la decisione di propagazione via allowlist. Modulo puro\n// e isomorfo (nessun accesso a window/process): il glue con scope e opzioni vive\n// nel `Client`. Riferimenti: W3C Trace Context (traceparent/tracestate) e W3C\n// Baggage. Il `trace-id` W3C (32 hex) coincide col `trace_id` interno CloseYourIt\n// (UUID v4 senza trattini), così adottare un trace distribuito è un mapping 1:1.\n\nimport type { TraceCarrier, TracePropagationTarget } from './types'\n\n/// Trace context W3C estratto da un `traceparent` valido.\nexport interface TraceParent {\n  /// `trace-id`: 32 esadecimali lowercase, non tutto-zero.\n  traceId: string\n  /// `parent-id` (span-id del chiamante): 16 esadecimali lowercase, non tutto-zero.\n  parentId: string\n  /// Bit 0 di `trace-flags` (`sampled`): il trace a monte è campionato.\n  sampled: boolean\n}\n\nconst HEX2 = /^[0-9a-f]{2}$/\nconst HEX16 = /^[0-9a-f]{16}$/\nconst HEX32 = /^[0-9a-f]{32}$/\nconst ZERO_TRACE = '0'.repeat(32)\nconst ZERO_PARENT = '0'.repeat(16)\n\n/// Interpreta un header `traceparent` W3C. Ritorna il trace context, oppure\n/// `null` se assente o malformato (lowercase-only, campi di lunghezza fissa,\n/// trace-id/parent-id non tutto-zero, version `ff` riservata rifiutata). Una\n/// version futura (> `00`) è accettata leggendo i primi quattro campi e ignorando\n/// gli eventuali campi aggiuntivi, come raccomanda lo standard.\nexport function parseTraceparent(value: string | null | undefined): TraceParent | null {\n  if (!value) return null\n  const parts = value.trim().split('-')\n  if (parts.length < 4) return null\n\n  const version = parts[0]!\n  const traceId = parts[1]!\n  const parentId = parts[2]!\n  const flags = parts[3]!\n\n  if (!HEX2.test(version) || version === 'ff') return null\n  // La version corrente (`00`) è definita esattamente su quattro campi: nessun\n  // campo extra ammesso. Le version future possono aggiungerne (ignorati).\n  if (version === '00' && parts.length !== 4) return null\n  if (!HEX32.test(traceId) || traceId === ZERO_TRACE) return null\n  if (!HEX16.test(parentId) || parentId === ZERO_PARENT) return null\n  if (!HEX2.test(flags)) return null\n\n  return { traceId, parentId, sampled: (parseInt(flags, 16) & 0x01) === 0x01 }\n}\n\n/// Compone un `traceparent` version `00` da trace-id, span-id e flag di sampling.\n/// I due id sono attesi già validi (32 e 16 esadecimali).\nexport function formatTraceparent(\n  traceId: string,\n  spanId: string,\n  sampled: boolean,\n): string {\n  return `00-${traceId}-${spanId}-${sampled ? '01' : '00'}`\n}\n\n// key = lcalpha *( lcalpha / DIGIT / \"_\" / \"-\" / \"*\" / \"/\" ) con tenant \"@vendor\"\n// opzionale (semplificazione conforme del grammar W3C tracestate).\nconst TRACESTATE_KEY = /^[a-z0-9][a-z0-9_\\-*/]*(@[a-z0-9][a-z0-9_\\-*/]*)?$/\n\nfunction isValidTracestateMember(member: string): boolean {\n  const eq = member.indexOf('=')\n  if (eq <= 0) return false\n  const key = member.slice(0, eq)\n  const val = member.slice(eq + 1)\n  if (!TRACESTATE_KEY.test(key)) return false\n  if (val.length === 0 || val.length > 256) return false\n  // value: printable ASCII (la virgola è già consumata come separatore di lista\n  // da `parseTracestate`, che splitta prima di validare i membri).\n  return /^[\\x20-\\x7e]*$/.test(val)\n}\n\n/// Valida e normalizza un header `tracestate` come stringa opaca da ri-propagare:\n/// scarta i membri malformati, tronca a 32 membri (limite W3C). Ritorna\n/// `undefined` se assente o interamente invalido.\nexport function parseTracestate(value: string | null | undefined): string | undefined {\n  if (!value) return undefined\n  const valid = value\n    .split(',')\n    .map((m) => m.trim())\n    .filter((m) => m.length > 0 && isValidTracestateMember(m))\n    .slice(0, 32)\n  return valid.length > 0 ? valid.join(',') : undefined\n}\n\n/// Massimo dimensionamento raccomandato per l'header `baggage` (W3C Baggage).\nconst MAX_BAGGAGE_BYTES = 8192\n\n/// Valida un header `baggage` come stringa opaca da ri-propagare SOLO verso\n/// destinazioni fidate: può contenere PII, quindi non va mai allegato agli eventi\n/// né inviato a host non consentiti. Ritorna `undefined` se vuoto, non-printable\n/// o oltre il limite.\nexport function normalizeBaggage(value: string | null | undefined): string | undefined {\n  if (!value) return undefined\n  const trimmed = value.trim()\n  if (trimmed.length === 0 || trimmed.length > MAX_BAGGAGE_BYTES) return undefined\n  return /^[\\x20-\\x7e]+$/.test(trimmed) ? trimmed : undefined\n}\n\n/// `true` se [url] è tra le destinazioni fidate: una stringa matcha per substring\n/// (stile `tracePropagationTargets` di Sentry), una RegExp è testata sull'URL\n/// completo. I target stringa vuoti sono ignorati (non matcherebbero tutto).\nexport function matchesPropagationTarget(\n  url: string,\n  targets: readonly TracePropagationTarget[],\n): boolean {\n  for (const target of targets) {\n    if (typeof target === 'string') {\n      if (target.length > 0 && url.includes(target)) return true\n    } else if (regExpMatches(target, url)) {\n      return true\n    }\n  }\n  return false\n}\n\n// `RegExp.test` con flag `g`/`y` avanza `lastIndex`, rendendo il match della\n// stessa destinazione intermittente tra chiamate successive. Si testa su una\n// copia priva di quei flag (gli altri — `i`, `m`, `s`, `u`, `d` — sono preservati),\n// senza mutare la RegExp fornita dal consumer.\nfunction regExpMatches(pattern: RegExp, url: string): boolean {\n  if (!pattern.global && !pattern.sticky) return pattern.test(url)\n  return new RegExp(pattern.source, pattern.flags.replace(/[gy]/g, '')).test(url)\n}\n\n/// `true` se [target] risolve nella stessa origine di [origin] (URL relativi\n/// inclusi): la propria origine è first-party e fidata per definizione. `false`\n/// su URL non parsabili.\nexport function isSameOrigin(target: string, origin: string): boolean {\n  try {\n    return new URL(target, origin).origin === origin\n  } catch {\n    return false\n  }\n}\n\n/// Legge un header (case-insensitive) da un carrier eterogeneo: un getter\n/// `(name) => value`, un `Headers`, o una mappa header (Node) con valori\n/// stringa/array. Dei valori multipli prende il primo. `undefined` se assente.\nexport function readTraceHeader(\n  carrier: TraceCarrier,\n  name: string,\n): string | undefined {\n  if (typeof carrier === 'function') return orUndefined(carrier(name))\n  if (typeof Headers !== 'undefined' && carrier instanceof Headers) {\n    return orUndefined(carrier.get(name))\n  }\n  const wanted = name.toLowerCase()\n  for (const key of Object.keys(carrier)) {\n    if (key.toLowerCase() !== wanted) continue\n    const value = (carrier as Record<string, string | string[] | undefined | null>)[key]\n    if (Array.isArray(value))\n      return value.length > 0 ? orUndefined(value[0]) : undefined\n    return orUndefined(value)\n  }\n  return undefined\n}\n\nfunction orUndefined(value: string | null | undefined): string | undefined {\n  return value === null || value === undefined ? undefined : value\n}\n","// Invio HTTP fire-and-forget. Non solleva mai (la telemetria non deve crashare\n// l'host) e non ha retry loop.\n//\n// Auth (CYJS-1): due modi mutuamente esclusivi decisi a monte in base\n// all'ambiente. `bearer` → header `Authorization: Bearer <secret>` (SERVER-ONLY:\n// il bearer `cyi_` non deve mai finire nel bundle browser). `dsn` → DSN public\n// key non segreta via query `?sentry_key=` (browser-safe): nessun header custom,\n// così la preflight CORS resta su `Content-Type` soltanto.\n//\n// Browser: `fetch` con `keepalive: true` (solo sotto la quota body di 64KB di\n// Chrome) così le richieste sopravvivono all'unload della pagina. I redirect\n// restano al fetch nativo (`follow`): con `manual` la risposta sarebbe\n// `opaqueredirect` senza Location leggibile.\n//\n// Browser, pagina in uscita (CYJS-29): `fetch(keepalive)` non basta quando la\n// scheda si chiude — Safari iOS abbandona la richiesta e l'ultima misura si\n// perde — quindi da `pagehide`/`visibilitychange(hidden)` in poi l'invio passa da\n// `navigator.sendBeacon`. Usabile SOLO in modalità `dsn`: il beacon non può\n// impostare header (in `bearer` partirebbe senza credenziale), mentre qui l'auth\n// è la public key in query. Il body viaggia come `text/plain`: con\n// `application/json` la richiesta non sarebbe CORS-simple e scatenerebbe una\n// preflight a cui un invio in chiusura pagina non sopravvive (il backend parsa il\n// body grezzo). Fallback a `fetch(keepalive)` dove il beacon manca o rifiuta il\n// payload (quota per-origin superata).\n//\n// Le richieste GIÀ partite col fetch quando la pagina si chiude restano dove\n// sono: NON vengono rispedite col beacon. Il reinvio le duplicherebbe ogni volta\n// che il fetch arriva comunque (il caso normale), e una metrica contata due volte\n// è un danno certo contro una perdita solo possibile. È `keepalive` a coprirle,\n// per quel che può.\n//\n// Node: `redirect:'manual'` + follow a mano (max 2) ri-POSTando lo stesso body —\n// un 301 apex→www con `follow` degraderebbe il POST in GET (parità con il\n// Transport ruby/dart, MAX_REDIRECTS=2). In più viaggia lo User-Agent\n// `closeyourit-js/{versione}` (nel browser è vietato dal fetch spec).\n\nimport { errorName } from './diagnostics'\nimport type { TransportAuth } from './options'\nimport { isBrowser, isNode } from './runtime'\nimport type { Stats } from './stats'\nimport type { DiagnosticDetails, DiagnosticEvent } from './types'\nimport { SDK_NAME, SDK_VERSION } from './version'\n\ntype NotifyDiagnostic = (event: DiagnosticEvent, details?: DiagnosticDetails) => void\n\ntype FetchImpl = typeof fetch\n\n/// Invio \"beacon\" (firma di `navigator.sendBeacon`): `true` se il browser ha\n/// preso in carico la richiesta, `false` se l'ha rifiutata (quota superata).\nexport type BeaconImpl = (url: string, body: BodyInit) => boolean\n\nconst MAX_REDIRECTS = 2\n// Quota keepalive di Chrome: 64KB per-origin sui body in volo. Oltre la soglia\n// (con margine) l'invio parte senza keepalive: perde solo la garanzia di\n// sopravvivere all'unload, ma non fallisce con TypeError.\nconst KEEPALIVE_MAX_BODY = 60_000\nconst REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308])\n// Il solo Content-Type che tiene il beacon dentro le richieste CORS-simple: con\n// `application/json` scatterebbe la preflight e l'invio in chiusura pagina non le\n// sopravvivrebbe. È anche il tipo che la spec assegna a un beacon di sola stringa.\nconst BEACON_CONTENT_TYPE = 'text/plain;charset=UTF-8'\n\nexport interface TransportOptions {\n  auth: TransportAuth\n  stats: Stats\n  fetchImpl?: FetchImpl | undefined\n  /// Invio beacon iniettabile (test). Default: `navigator.sendBeacon`, risolto a\n  /// ogni invio — l'SDK può essere inizializzato prima che il DOM esista (SSR).\n  beaconImpl?: BeaconImpl | undefined\n  maxQueue?: number\n  timeoutMs?: number\n  debug?: (message: string, error?: unknown) => void\n  /// Notificatore diagnostico (process-local, non ricorsivo): riceve le tappe di\n  /// invio/scarto/timeout per l'hook `onDiagnostic` (CYJS-9).\n  diagnostic?: NotifyDiagnostic\n}\n\nexport class Transport {\n  private readonly auth: TransportAuth\n  private readonly stats: Stats\n  private readonly fetchImpl: FetchImpl | undefined\n  private readonly beaconImpl: BeaconImpl | undefined\n  private readonly maxQueue: number\n  private readonly timeoutMs: number\n  private readonly debug: ((message: string, error?: unknown) => void) | undefined\n  private readonly diagnostic: NotifyDiagnostic\n\n  private inFlight = 0\n  private readonly pending = new Set<Promise<void>>()\n  // La pagina sta uscendo di scena (`pagehide`/`visibilitychange(hidden)`): lo\n  // segnala il lifecycle del facade, non lo si indovina qui.\n  private pageHiding = false\n\n  constructor(options: TransportOptions) {\n    this.auth = options.auth\n    this.stats = options.stats\n    this.fetchImpl =\n      options.fetchImpl ??\n      (typeof fetch === 'function' ? fetch.bind(globalThis) : undefined)\n    this.beaconImpl = options.beaconImpl\n    this.maxQueue = options.maxQueue ?? 30\n    this.timeoutMs = options.timeoutMs ?? 5000\n    this.debug = options.debug\n    this.diagnostic = options.diagnostic ?? (() => {})\n  }\n\n  /// Segnala che la pagina sta uscendo di scena (`pagehide`,\n  /// `visibilitychange(hidden)`) o vi è rientrata (`pageshow` da bfcache). Da\n  /// pagina in uscita gli invii browser in modalità `dsn` passano dal beacon:\n  /// è l'unico che il browser porta a termine dopo la chiusura della scheda\n  /// (CYJS-29). Nessun effetto su Node né in modalità `bearer`.\n  setPageHiding(hiding: boolean): void {\n    this.pageHiding = hiding\n  }\n\n  /// Invia [payload] (oggetto o array) a [url]. Ritorna `true` se l'invio è stato\n  /// accettato (beacon preso in carico o richiesta in coda), `false` se scartato\n  /// (coda piena o nessun trasporto disponibile).\n  send(payload: unknown, url: string): boolean {\n    const body = JSON.stringify(payload)\n\n    // Pagina in uscita: il beacon è sincrono, non consuma la coda in volo e\n    // sopravvive alla chiusura della scheda. Se manca o rifiuta il payload si\n    // prosegue col fetch qui sotto — un invio perso è peggio di uno senza\n    // garanzia di sopravvivenza.\n    if (this.beaconEligible() && this.sendViaBeacon(body, url)) return true\n\n    const fetchImpl = this.fetchImpl\n    if (!fetchImpl) {\n      // Nessun `fetch` nell'ambiente: l'evento non ha modo di partire → fallimento\n      // di trasporto (parità col contatore `failed`, motivo `network`).\n      this.stats.record('network')\n      this.diagnostic('drop', { reason: 'network' })\n      return false\n    }\n    if (this.inFlight >= this.maxQueue) {\n      this.stats.record('queue_full')\n      this.diagnostic('drop', { reason: 'queue_full' })\n      this.debug?.('coda piena, evento scartato')\n      return false\n    }\n\n    const controller = createAbortController()\n    const timer =\n      controller && this.timeoutMs > 0\n        ? setTimeout(() => controller.abort(), this.timeoutMs)\n        : undefined\n    const init: RequestInit = {\n      method: 'POST',\n      headers: this.headers(),\n      body,\n      ...(isBrowser() && body.length < KEEPALIVE_MAX_BODY ? { keepalive: true } : {}),\n      ...(isNode() ? { redirect: 'manual' as RequestRedirect } : {}),\n      ...(controller ? { signal: controller.signal } : {}),\n    }\n\n    this.inFlight += 1\n    const promise = this.perform(fetchImpl, this.withAuth(url), init)\n      .catch((error: unknown) => {\n        // Un abort è il nostro timeout di rete (isolato dai non-2xx, parità gem);\n        // ogni altra reject di `fetch` è un errore di rete generico.\n        if (isAbortError(error)) {\n          this.stats.recordTimeout()\n          this.diagnostic('timeout', { error: errorName(error) })\n        } else {\n          this.stats.record('network')\n          this.diagnostic('drop', { reason: 'network', error: errorName(error) })\n        }\n        this.debug?.('invio fallito', error)\n      })\n      .finally(() => {\n        this.inFlight -= 1\n        if (timer !== undefined) clearTimeout(timer)\n        this.pending.delete(promise)\n      })\n\n    this.pending.add(promise)\n    return true\n  }\n\n  /// Attende gli invii in volo (best-effort; non solleva). Il beacon è già\n  /// consegnato al browser al ritorno di `send`: qui si attende solo la sua\n  /// contabilizzazione, rinviata a fine turno.\n  async flush(): Promise<void> {\n    await Promise.allSettled([...this.pending])\n  }\n\n  // Il beacon vale solo nel browser e solo con l'auth in query (`?sentry_key=`):\n  // non potendo impostare header, in modalità `bearer` l'invio partirebbe senza\n  // credenziale. `visibilityState` copre il caso in cui la pagina è già nascosta\n  // prima che il lifecycle dell'SDK sia in ascolto (init a scheda in background).\n  private beaconEligible(): boolean {\n    if (this.auth.kind !== 'dsn' || !isBrowser()) return false\n    return this.pageHiding || documentHidden()\n  }\n\n  // Consegna il body al browser via beacon. `false` = non consegnato (beacon\n  // assente, quota superata o eccezione): il chiamante ripiega sul fetch.\n  private sendViaBeacon(body: string, url: string): boolean {\n    const beacon = this.beaconImpl ?? navigatorBeacon()\n    if (!beacon) return false\n    try {\n      if (!beacon(this.withAuth(url), beaconBody(body))) return false\n    } catch (error) {\n      this.debug?.('beacon non riuscito', error)\n      return false\n    }\n    // L'invio è già nelle mani del browser, ma l'esito si contabilizza in coda al\n    // turno: `send` è sincrono solo qui, e chi lo chiama deve poter registrare\n    // l'accodamento per primo — l'ordine diagnostico resta `enqueue` → `send`\n    // come nel ramo fetch, senza snapshot intermedi con più inviati che accodati.\n    // La notifica entra in `pending`, così `flush()` la attende.\n    const notified = Promise.resolve()\n      .then(() => {\n        // Il beacon non restituisce una risposta: `sent` qui significa \"preso in\n        // carico dal browser\" e la diagnostica non ha uno status da riportare.\n        this.stats.increment('sent')\n        this.diagnostic('send', {})\n      })\n      .finally(() => {\n        this.pending.delete(notified)\n      })\n\n    this.pending.add(notified)\n    return true\n  }\n\n  // Esegue la richiesta seguendo a mano i redirect su Node (POST preservato).\n  private async perform(\n    fetchImpl: FetchImpl,\n    url: string,\n    init: RequestInit,\n  ): Promise<void> {\n    let currentUrl = url\n    let response = await fetchImpl(currentUrl, init)\n\n    if (isNode()) {\n      let redirects = 0\n      while (REDIRECT_STATUSES.has(response.status) && redirects < MAX_REDIRECTS) {\n        const location = response.headers?.get('location')\n        if (!location) break\n        const nextUrl = new URL(location, currentUrl).toString()\n        // Il follow ri-invia Authorization: consentito SOLO verso lo stesso\n        // host o la variante www (il caso reale apex→www). Un Location verso\n        // un host estraneo esfiltrerebbe il Bearer → stop.\n        if (!allowedRedirectTarget(currentUrl, nextUrl)) break\n        currentUrl = this.withAuth(nextUrl)\n        redirects += 1\n        response = await fetchImpl(currentUrl, init)\n      }\n    }\n\n    if (response.status >= 200 && response.status < 300) {\n      this.stats.increment('sent')\n      this.diagnostic('send', { status: response.status })\n    } else {\n      // Non-2xx (4xx / 429 / 5xx): l'evento è partito ma è stato rifiutato →\n      // fallimento d'invio. Lo `status` distingue i casi nell'hook diagnostico.\n      this.stats.record('response')\n      this.diagnostic('drop', { reason: 'response', status: response.status })\n      if (this.debug) {\n        // Include il codice R- + messaggio dall'envelope backend (DX diagnostica), non solo lo status.\n        const detail = await errorDetail(response)\n        this.debug(`invio fallito con stato ${response.status}${detail}`)\n      }\n    }\n  }\n\n  private headers(): Record<string, string> {\n    return {\n      // Il bearer viaggia in header solo in modalità server. In `dsn` la\n      // credenziale è la public key in query (?sentry_key=), mai un header.\n      ...(this.auth.kind === 'bearer'\n        ? { Authorization: `Bearer ${this.auth.secret}` }\n        : {}),\n      'Content-Type': 'application/json',\n      // Nel browser lo User-Agent è un forbidden header (lo imposta il browser).\n      ...(isNode() ? { 'User-Agent': `${SDK_NAME}/${SDK_VERSION}` } : {}),\n    }\n  }\n\n  // In modalità `dsn` autentica appendendo la DSN public key come query param\n  // (browser-safe, non allarga la preflight CORS). Idempotente: non raddoppia il\n  // param se già presente (es. ri-invio su redirect follow).\n  private withAuth(url: string): string {\n    if (this.auth.kind !== 'dsn') return url\n    if (url.includes('sentry_key=')) return url\n    const separator = url.includes('?') ? '&' : '?'\n    return `${url}${separator}sentry_key=${encodeURIComponent(this.auth.publicKey)}`\n  }\n}\n\nfunction createAbortController(): AbortController | undefined {\n  return typeof AbortController === 'function' ? new AbortController() : undefined\n}\n\n// `navigator.sendBeacon` legato al suo receiver (chiamarlo staccato solleva\n// \"Illegal invocation\"). `undefined` fuori dal browser o dove non esiste.\nfunction navigatorBeacon(): BeaconImpl | undefined {\n  if (typeof navigator === 'undefined') return undefined\n  const beacon = navigator.sendBeacon\n  return typeof beacon === 'function'\n    ? (url, body) => beacon.call(navigator, url, body)\n    : undefined\n}\n\n// Body del beacon come `text/plain` (richiesta CORS-simple, nessuna preflight).\n// Senza `Blob` nell'ambiente si manda la stringa: per spec il browser le assegna\n// comunque `text/plain;charset=UTF-8`.\nfunction beaconBody(body: string): BodyInit {\n  if (typeof Blob !== 'function') return body\n  return new Blob([body], { type: BEACON_CONTENT_TYPE })\n}\n\n// `true` quando la pagina non è visibile (scheda in background o in chiusura).\nfunction documentHidden(): boolean {\n  return typeof document !== 'undefined' && document.visibilityState === 'hidden'\n}\n\n// `controller.abort()` (il nostro timeout) fa rigettare `fetch` con un AbortError.\nfunction isAbortError(error: unknown): boolean {\n  return error instanceof Error && error.name === 'AbortError'\n}\n\n// Stesso host oppure www-swap (`closeyour.it` ⇄ `www.closeyour.it`).\nfunction allowedRedirectTarget(fromUrl: string, toUrl: string): boolean {\n  try {\n    const from = new URL(fromUrl).host\n    const to = new URL(toUrl).host\n    return from === to || `www.${from}` === to || from === `www.${to}`\n  } catch {\n    return false\n  }\n}\n\n// Estrae \" (R…: messaggio)\" dall'envelope d'errore del backend per il log diagnostico.\nasync function errorDetail(response: Response): Promise<string> {\n  try {\n    const body = (await response.json()) as {\n      error?: { code?: string; message?: string }\n    }\n    const error = body?.error\n    if (!error) return ''\n    const parts = [error.code, error.message].filter(Boolean)\n    return parts.length > 0 ? ` (${parts.join(': ')})` : ''\n  } catch {\n    return ''\n  }\n}\n","// Coordinatore del client: tiene configurazione, scope, transport, log buffer,\n// stats e dedup, e implementa la logica di cattura/invio. Specchio di\n// `CloseYourIt::Client` (gem) e `CloseYourItClient` (dart). Dipendenze iniettabili\n// per i test. Nessun metodo solleva.\n\nimport type { BreadcrumbInput } from './breadcrumbs'\nimport { Deduplicator, dedupKey } from './dedup'\nimport {\n  buildErrorEvent,\n  buildLogEvent,\n  buildMessageEvent,\n  normalizeError,\n} from './events'\nimport {\n  MAX_PAYLOAD_BYTES,\n  capEvent,\n  capGeneric,\n  capReplayChunk,\n  chunkLogBatch,\n} from './budget'\nimport { LOGS_MAX_BATCH, LogBuffer } from './logBuffer'\nimport { meetsMinLevel, normalizeLogLevel } from './logLevel'\nimport { buildPerformanceIssueEvent, buildSlowMethodEvent } from './metricEvents'\nimport {\n  disabledReason,\n  endpointHost,\n  eventsUri,\n  isEnabled,\n  logsUri,\n  metricsUri,\n  pageviewsUri,\n  replayUri,\n  resolveOptions,\n  resolveTransportAuth,\n  storeUri,\n  webVitalsUri,\n} from './options'\nimport { buildPageview } from './pageviews'\nimport { autoRequestContext } from './requestContext'\nimport type { ResolvedOptions, TransportAuth } from './options'\nimport { isBrowser, serverName as detectServerName } from './runtime'\nimport { createScopeStorage } from './asyncContext'\nimport type { ScopeStorage } from './asyncContext'\nimport { Diagnostics, diagnosticsSuppressed, errorName } from './diagnostics'\nimport { Scope } from './scope'\nimport { Stats } from './stats'\nimport {\n  formatTraceparent,\n  isSameOrigin,\n  matchesPropagationTarget,\n  normalizeBaggage,\n  parseTraceparent,\n  parseTracestate,\n  readTraceHeader,\n} from './traceContext'\nimport { Transport } from './transport'\nimport type {\n  CaptureHint,\n  CloseYourItOptions,\n  DiagnosticDetails,\n  DropReason,\n  EventLevel,\n  EventPayload,\n  LogLevel,\n  TraceCarrier,\n  UserContext,\n} from './types'\nimport { spanId, uuidV4 } from './uuid'\n\n/// Dipendenze iniettabili (test).\nexport interface ClientDeps {\n  transport?: Transport\n  logBuffer?: LogBuffer\n  stats?: Stats\n  scope?: Scope\n  dedup?: Deduplicator\n  random?: () => number\n  /// Provider del request context automatico (default: pagina corrente nel browser).\n  requestProvider?: () => Record<string, unknown> | undefined\n  /// Clock monotono in ms per `measure` (default `performance.now`).\n  nowMs?: () => number\n}\n\nexport class Client {\n  readonly options: ResolvedOptions\n  readonly stats: Stats\n  /// Notificatore diagnostico process-local (hook `onDiagnostic`), non ricorsivo.\n  readonly diagnostics: Diagnostics\n\n  // Scope root: unico holder nel browser (single-thread) e fallback su Node fuori\n  // da withScope/runWithScope. `scope` (getter) risolve la copia attiva del flusso.\n  private readonly baseScope: Scope\n  // Storage per-flusso su Node (AsyncLocalStorage); `undefined` nel browser (CYJS-7).\n  private readonly als: ScopeStorage | undefined\n  // Scope attivo nel fallback sincrono (browser, o Node senza AsyncLocalStorage).\n  private syncScope: Scope | undefined\n\n  private readonly transport: Transport\n  /// Credenziale d'invio risolta per l'ambiente (bearer server / dsn browser).\n  private readonly auth: TransportAuth\n  private readonly logBuffer: LogBuffer\n  private readonly dedup: Deduplicator\n  private readonly random: () => number\n  private readonly requestProvider: () => Record<string, unknown> | undefined\n  /// Clock monotono in ms (iniettabile): usato da `measure` e dalle integrazioni.\n  readonly nowMs: () => number\n  /// Hostname del server, risolto una volta (non cambia nel processo): allegato\n  /// come `server_name` a errori/messaggi. `undefined` nel browser o con\n  /// `sendServerName: false` → il campo resta assente (parità con la gem Ruby).\n  private readonly serverName: string | undefined\n  // Lo `shutdown` diagnostico è emesso una sola volta per client (una close()\n  // ripetuta non lo duplica), parità gem Ruby.\n  private shutdownNotified = false\n  // Esito del campionamento Web Vitals per QUESTO client, tirato una volta sola\n  // (CYJS-28). Nel browser un client è un caricamento di pagina, e le sue misure\n  // possono partire in più batch: vedi `captureWebVitals`.\n  private webVitalsSampled: boolean | undefined\n\n  constructor(rawOptions: CloseYourItOptions, deps: ClientDeps = {}) {\n    this.options = resolveOptions(rawOptions)\n    this.stats = deps.stats ?? new Stats()\n    this.diagnostics = new Diagnostics(this.options.onDiagnostic)\n    this.baseScope = deps.scope ?? new Scope(this.options.maxBreadcrumbs)\n    this.als = createScopeStorage()\n    this.dedup = deps.dedup ?? new Deduplicator()\n    this.random = deps.random ?? Math.random\n    this.requestProvider =\n      deps.requestProvider ?? (() => autoRequestContext(this.options.sendPii))\n    this.nowMs = deps.nowMs ?? defaultNowMs\n    this.serverName = this.options.sendServerName ? detectServerName() : undefined\n\n    // Nel browser è ammessa solo la DSN public key: il bearer segreto non è mai\n    // eleggibile (fallback innocuo a bearer vuoto quando l'SDK è disabilitato →\n    // il transport non viene comunque mai usato, i metodi gatano su `enabled`).\n    this.auth = resolveTransportAuth(this.options, isBrowser()) ?? {\n      kind: 'bearer',\n      secret: '',\n    }\n    this.transport =\n      deps.transport ??\n      new Transport({\n        auth: this.auth,\n        stats: this.stats,\n        maxQueue: this.options.maxQueue,\n        debug: this.options.debug ? (m, e) => this.debugLog(m, e) : undefined,\n        diagnostic: (event, details) => this.diagnostics.notify(event, details),\n      })\n    this.logBuffer =\n      deps.logBuffer ??\n      new LogBuffer(\n        (batch) => this.flushLogs(batch),\n        this.options.logsBatchSize,\n        this.options.logsFlushIntervalMs,\n      )\n\n    // trace_id di pagina: correla errori e log della stessa sessione/pagina.\n    if (this.scope.traceId === undefined) {\n      this.scope.setTraceId(uuidV4().replace(/-/g, ''))\n    }\n  }\n\n  /// Scope attivo per il flusso corrente: la copia isolata quando si è dentro\n  /// withScope/runWithScope (per-richiesta su Node via AsyncLocalStorage),\n  /// altrimenti lo scope root condiviso. Tutte le API di scope e la cattura\n  /// eventi passano di qui, così ogni flusso vede solo i propri dati (CYJS-7).\n  get scope(): Scope {\n    return this.als?.getStore() ?? this.syncScope ?? this.baseScope\n  }\n\n  get enabled(): boolean {\n    return isEnabled(this.options, isBrowser())\n  }\n\n  get disabledReason(): string | null {\n    return disabledReason(this.options, isBrowser())\n  }\n\n  // Endpoint degli eventi errore/messaggio: col bearer è il path v1; con la DSN\n  // public key (browser) è il drop-in Sentry `/store`, che il backend accetta\n  // autenticando via `?sentry_key=`.\n  private get eventsIngestUri(): string {\n    return this.auth.kind === 'dsn' ? storeUri(this.options) : eventsUri(this.options)\n  }\n\n  get endpointHost(): string | undefined {\n    return endpointHost(this.options)\n  }\n\n  get slowExternalThresholdMs(): number {\n    return this.options.slowExternalThresholdMs\n  }\n\n  // ---------------------------------------------------------------- errori\n\n  /// Cattura un'eccezione (o valore arbitrario). No-op se disabilitato, escluso,\n  /// già catturato, duplicato entro la finestra, o non campionato.\n  captureException(error: unknown, hint: CaptureHint = {}): void {\n    if (!this.enabled || diagnosticsSuppressed()) return\n\n    const normalized = normalizeError(error)\n    if (this.options.excludedExceptions.includes(normalized.type)) return\n    if (this.dedup.wasCaptured(error)) return\n\n    const key = dedupKey(\n      normalized.type,\n      normalized.value,\n      topFrameKey(normalized.stack),\n    )\n    if (this.dedup.isDuplicate(key)) return\n    // Marcato PRIMA del sampling (parità gem): un errore scartato dal sampling\n    // non viene re-inviato da un handler più esterno.\n    this.dedup.markCaptured(error)\n    if (!this.sampled(this.options.sampleRate)) {\n      this.noteDrop('sample_rate')\n      return\n    }\n\n    const payload = buildErrorEvent({\n      error: normalized,\n      environment: this.options.environment,\n      release: this.options.release,\n      handled: hint.handled ?? false,\n      level: hint.level ?? 'error',\n      scopeHash: this.scopeHash(),\n      traceId: this.scope.traceId,\n      replayId: this.scope.replaySessionId,\n      contexts: hint.contexts,\n      request: this.autoRequest(),\n      serverName: this.serverName,\n    })\n    this.enqueue(payload, this.eventsIngestUri, capEventToBudget)\n  }\n\n  /// Cattura un messaggio diagnostico.\n  captureMessage(message: string, level: EventLevel = 'info'): void {\n    if (!this.enabled || diagnosticsSuppressed()) return\n    if (!this.sampled(this.options.sampleRate)) {\n      this.noteDrop('sample_rate')\n      return\n    }\n\n    const payload = buildMessageEvent({\n      message,\n      environment: this.options.environment,\n      release: this.options.release,\n      level,\n      scopeHash: this.scopeHash(),\n      traceId: this.scope.traceId,\n      replayId: this.scope.replaySessionId,\n      request: this.autoRequest(),\n      serverName: this.serverName,\n    })\n    this.enqueue(payload, this.eventsIngestUri, capEventToBudget)\n  }\n\n  // ------------------------------------------------------------------- logs\n\n  /// Bufferizza un log strutturato (inviato in batch a `/logs`). No-op se i log\n  /// sono disattivati, sotto `logsMinLevel`, non campionati o con message vuoto.\n  log(\n    level: LogLevel,\n    message: string,\n    attributes?: Record<string, unknown>,\n    logger?: string,\n  ): void {\n    if (!this.enabled || !this.options.logsEnabled || diagnosticsSuppressed()) return\n    const normalized = normalizeLogLevel(level)\n    if (!meetsMinLevel(normalized, this.options.logsMinLevel)) return\n    if (!this.sampled(this.options.logsSampleRate)) {\n      this.noteDrop('sample_rate')\n      return\n    }\n    if (message.trim().length === 0) return\n\n    this.logBuffer.add(\n      buildLogEvent({\n        message,\n        level: normalized,\n        environment: this.options.environment,\n        release: this.options.release,\n        logger,\n        traceId: this.scope.traceId,\n        attributes,\n      }),\n    )\n  }\n\n  // --------------------------------------------------------------- metriche\n\n  /// Misura [body] e invia una metrica `slow_method` se la durata supera\n  /// `slowMethodThresholdMs`. Preserva la sincronicità: un body sincrono\n  /// ritorna il valore, un body async ritorna la Promise (misurata al settle).\n  /// La metrica parte anche se il body lancia. MAI campionata.\n  /// Label vuota → TypeError immediato anche a client disabilitato (errore del\n  /// programmatore, deve emergere deterministicamente).\n  measure<T>(\n    label: string,\n    body: () => T,\n    opts: { args?: Record<string, unknown> } = {},\n  ): T {\n    if (typeof label !== 'string' || label.trim().length === 0) {\n      throw new TypeError(\n        'closeyourit: measure(label) richiede una label non vuota (è il fingerprint della metrica)',\n      )\n    }\n\n    const start = this.nowMs()\n    const finish = (): void => {\n      const duration = this.nowMs() - start\n      this.recordSlowMethod(label, duration, opts.args)\n    }\n\n    try {\n      const result = body()\n      if (isThenable(result)) {\n        return (result as Promise<unknown>).then(\n          (value) => {\n            finish()\n            return value\n          },\n          (error: unknown) => {\n            finish()\n            throw error\n          },\n        ) as T\n      }\n      finish()\n      return result\n    } catch (error) {\n      finish()\n      throw error\n    }\n  }\n\n  /// Verdetto `slow_external_http` per una richiesta esterna completata.\n  /// No-op sotto soglia o senza `detectPerformanceIssues`/`captureExternalHttp`.\n  recordExternalHttp(host: string, url: string, durationMs: number): void {\n    if (!this.perfEnabled() || !this.options.captureExternalHttp) return\n    const threshold = this.options.slowExternalThresholdMs\n    if (threshold <= 0 || durationMs < threshold) return\n\n    this.enqueue(\n      buildPerformanceIssueEvent({\n        subtype: 'slow_external_http',\n        durationMs,\n        environment: this.options.environment,\n        httpHost: host,\n        httpUrl: url,\n        traceId: this.scope.traceId,\n      }),\n      metricsUri(this.options),\n      capGenericToBudget,\n    )\n  }\n\n  /// Verdetto `repeated_http`: stessa richiesta ripetuta [count] volte nella\n  /// finestra (l'N+1 del client). Il tracking della finestra sta all'integrazione.\n  recordRepeatedHttp(host: string, url: string, count: number): void {\n    if (!this.perfEnabled() || !this.options.captureExternalHttp) return\n\n    this.enqueue(\n      buildPerformanceIssueEvent({\n        subtype: 'repeated_http',\n        environment: this.options.environment,\n        httpHost: host,\n        httpUrl: url,\n        queryCount: count,\n        traceId: this.scope.traceId,\n      }),\n      metricsUri(this.options),\n      capGenericToBudget,\n    )\n  }\n\n  /// Verdetto `jank`: long task del main thread oltre soglia.\n  recordJank(durationMs: number, route: string): void {\n    if (!this.perfEnabled() || !this.options.detectJank) return\n\n    this.enqueue(\n      buildPerformanceIssueEvent({\n        subtype: 'jank',\n        durationMs,\n        environment: this.options.environment,\n        route,\n        traceId: this.scope.traceId,\n      }),\n      metricsUri(this.options),\n      capGenericToBudget,\n    )\n  }\n\n  // --------------------------------------------------------------- pageview\n\n  /// Cattura una pageview (web analytics cookieless). No-op se disabilitato o\n  /// fuori dal browser. MAI campionata (parità con metriche/log: l'analytics\n  /// perde di senso con dati parziali). [overrides.path] forza il path (default\n  /// `location.pathname`); `environment` è aggiunto qui dall'ambiente risolto.\n  /// Passa da `enqueue`, quindi rispetta `beforeSend` e i contatori come gli\n  /// altri invii.\n  capturePageview(overrides: { path?: string } = {}): void {\n    if (!this.enabled) return\n    if (!isBrowser()) return\n\n    this.enqueue(\n      { ...buildPageview(overrides), environment: this.options.environment },\n      pageviewsUri(this.options),\n      capGenericToBudget,\n    )\n  }\n\n  /// Cattura un custom event (goal/conversione). [name] è il nome dell'evento\n  /// (mai \"pageview\"); no-op se disabilitato, fuori dal browser o senza nome.\n  /// Stessa location/hostname/UTM del contesto corrente della pageview.\n  captureEvent(name: string, overrides: { path?: string } = {}): void {\n    if (!this.enabled) return\n    if (!isBrowser()) return\n    if (!name) return\n\n    this.enqueue(\n      { ...buildPageview(overrides), name, environment: this.options.environment },\n      pageviewsUri(this.options),\n      capGenericToBudget,\n    )\n  }\n\n  // ------------------------------------------------------------ web vitals\n\n  /// Invia le misure Web Vitals della pagina (LCP/CLS/INP/TTFB/FCP) in **un solo\n  /// invio**: il backend accetta un array e un caricamento produce una manciata\n  /// di misure, che al momento in cui la pagina esce di scena conviene far\n  /// partire insieme. No-op se disabilitato, fuori dal browser o senza misure.\n  ///\n  /// Il campionamento (`webVitalsSampleRate`) decide sul **caricamento intero**,\n  /// non sul singolo batch: le misure di una pagina partono tutte o nessuna,\n  /// anche quando arrivano in due invii (il flush di cortesia, CYJS-28). Tirare i\n  /// dadi a ogni batch costruirebbe i percentili di metriche diverse su insiemi\n  /// di pagine diversi, che non sono più confrontabili tra loro. Uno scarto vale\n  /// un `sample_rate`.\n  /// `environment` e `release` sono aggiunti qui (li conosce solo il client).\n  captureWebVitals(measures: EventPayload[]): void {\n    if (!this.enabled) return\n    if (!isBrowser()) return\n    if (measures.length === 0) return\n    if (diagnosticsSuppressed()) return\n    if (!this.sampledForWebVitals()) {\n      this.noteDrop('sample_rate')\n      return\n    }\n\n    const stamped = measures.map((measure) => ({\n      ...measure,\n      environment: this.options.environment,\n      ...(this.options.release ? { release: this.options.release } : {}),\n    }))\n    const kept = this.applyBeforeSend(stamped).map(capGenericToBudget)\n    if (kept.length === 0) return\n\n    const url = webVitalsUri(this.options)\n    if (this.transport.send(kept, url)) {\n      this.stats.increment('enqueued')\n      this.diagnostics.notify('enqueue', { path: pathOf(url), batch: kept.length })\n    }\n  }\n\n  // ----------------------------------------------------------------- replay\n\n  /// Imposta l'id della sessione di replay corrente (lo mette sullo scope → gli\n  /// errori successivi lo portano in `contexts.replay.replay_id`). Chiamato dal\n  /// recorder all'avvio.\n  setReplaySessionId(id: string | undefined): void {\n    this.scope.setReplaySessionId(id)\n  }\n\n  /// Invia un chunk di replay (già costruito da `buildReplayChunk`). No-op se\n  /// disabilitato o fuori dal browser. Passa da `enqueue` → rispetta `beforeSend`\n  /// e i contatori come gli altri invii. `environment` aggiunto qui.\n  captureReplayChunk(chunk: EventPayload): void {\n    if (!this.enabled) return\n    if (!isBrowser()) return\n\n    this.enqueue(\n      { ...chunk, environment: this.options.environment },\n      replayUri(this.options),\n      capReplayChunkToBudget,\n    )\n  }\n\n  // ------------------------------------------------------------------ scope\n\n  setUser(user: UserContext | null): void {\n    this.scope.setUser(user)\n  }\n\n  setTag(key: string, value: string): void {\n    this.scope.setTag(key, value)\n  }\n\n  setTags(tags: Record<string, string>): void {\n    this.scope.setTags(tags)\n  }\n\n  setExtra(key: string, value: unknown): void {\n    this.scope.setExtra(key, value)\n  }\n\n  setContext(key: string, value: Record<string, unknown>): void {\n    this.scope.setContext(key, value)\n  }\n\n  setTraceId(id: string | undefined): void {\n    this.scope.setTraceId(id)\n  }\n\n  addBreadcrumb(input: BreadcrumbInput): void {\n    if (!this.options.breadcrumbs) return\n    this.scope.addBreadcrumb(input)\n  }\n\n  clearScope(): void {\n    this.scope.clear()\n  }\n\n  // --------------------------------------------------------- trace context W3C\n\n  /// Adotta un trace context W3C in ingresso da [carrier] (header di richiesta\n  /// server/SSR, un `Headers`, o un getter): se `traceparent` è valido, il suo\n  /// trace-id diventa il `trace_id` di correlazione — così errori/log/metriche si\n  /// agganciano al trace distribuito — e parent/sampling/tracestate/baggage sono\n  /// conservati per la ri-propagazione verso host fidati. Header assente o\n  /// malformato: no-op (si mantiene il trace corrente). No-op se disabilitato.\n  /// Dentro `runWithScope` opera sullo scope isolato della richiesta.\n  continueTrace(carrier: TraceCarrier): void {\n    if (!this.enabled) return\n    const parsed = parseTraceparent(readTraceHeader(carrier, 'traceparent'))\n    if (!parsed) return\n    this.scope.continueTrace({\n      traceId: parsed.traceId,\n      parentId: parsed.parentId,\n      sampled: parsed.sampled,\n      tracestate: parseTracestate(readTraceHeader(carrier, 'tracestate')),\n      baggage: normalizeBaggage(readTraceHeader(carrier, 'baggage')),\n    })\n  }\n\n  /// Header W3C Trace Context da iniettare in una richiesta in uscita verso\n  /// [target]: `traceparent` (trace-id corrente + nuovo span-id + flag di\n  /// sampling), più `tracestate`/`baggage` se adottati. Ritorna `{}` — nessun\n  /// header — se l'SDK è disabilitato o se [target] non è fidato\n  /// (`tracePropagationTargets` o same-origin nel browser): così il trace interno\n  /// e il baggage (potenziale PII) non raggiungono host non fidati. Senza\n  /// [target] la destinazione è considerata first-party e la propagazione è\n  /// consentita. Ogni chiamata genera un nuovo span-id (l'hop corrente).\n  getTraceHeaders(target?: string): Record<string, string> {\n    if (!this.enabled) return {}\n    const traceId = this.scope.traceId\n    if (traceId === undefined) return {}\n    if (target !== undefined && !this.isPropagationAllowed(target)) return {}\n\n    const headers: Record<string, string> = {\n      traceparent: formatTraceparent(\n        traceId,\n        spanId(),\n        this.scope.traceSampled ?? true,\n      ),\n    }\n    if (this.scope.traceState) headers['tracestate'] = this.scope.traceState\n    if (this.scope.traceBaggage) headers['baggage'] = this.scope.traceBaggage\n    return headers\n  }\n\n  // Destinazione fidata: match nell'allowlist `tracePropagationTargets`, oppure\n  // same-origin nel browser (la propria origine è first-party). Su Node manca\n  // `location`: conta solo l'allowlist.\n  private isPropagationAllowed(target: string): boolean {\n    if (matchesPropagationTarget(target, this.options.tracePropagationTargets)) {\n      return true\n    }\n    const origin = typeof location !== 'undefined' ? location.origin : undefined\n    return origin !== undefined && isSameOrigin(target, origin)\n  }\n\n  /// Esegue [fn] in uno scope isolato per l'intero flusso asincrono: nuovo\n  /// trace_id (unità di correlazione per-richiesta), breadcrumb propri e una copia\n  /// di user/tag/extra/contexts correnti come base. Su Node l'isolamento è reale\n  /// anche tra richieste concorrenti (AsyncLocalStorage): quel che [fn] imposta —\n  /// e ogni sua continuazione `await` — non filtra in altri flussi (CYJS-7). Nel\n  /// browser (single-thread) il fork è attivo per la sola durata sincrona di [fn].\n  /// Da avvolgere attorno all'handler di richiesta (es. middleware server).\n  /// Ritorna il valore di [fn]; una Promise è propagata (l'isolamento copre l'await).\n  runWithScope<T>(fn: (scope: Scope) => T): T {\n    const forked = this.scope.fork({ freshTrace: true })\n    forked.setTraceId(uuidV4().replace(/-/g, ''))\n    return this.runInScope(forked, fn)\n  }\n\n  /// Esegue [fn] con uno scope temporaneo forkato da quello corrente (trace_id e\n  /// breadcrumb ereditati): le modifiche fatte dentro non escono. Utile per una\n  /// cattura con contesto aggiuntivo senza sporcare lo scope condiviso.\n  withScope<T>(fn: (scope: Scope) => T): T {\n    return this.runInScope(this.scope.fork(), fn)\n  }\n\n  // Attiva [scope] per la durata di [fn]. Su Node l'AsyncLocalStorage propaga\n  // l'isolamento attraverso i flussi asincroni e ripristina da solo il contesto\n  // precedente (anche in caso di eccezione). Nel fallback sincrono si salva/ripristina\n  // manualmente `syncScope` — corretto perché il browser non ha concorrenza reale.\n  private runInScope<T>(scope: Scope, fn: (scope: Scope) => T): T {\n    const als = this.als\n    if (als) return als.run(scope, () => fn(scope))\n    const previous = this.syncScope\n    this.syncScope = scope\n    try {\n      return fn(scope)\n    } finally {\n      this.syncScope = previous\n    }\n  }\n\n  // ------------------------------------------------------------- lifecycle\n\n  /// Segnala al transport che la pagina sta uscendo di scena (`pagehide`,\n  /// `visibilitychange(hidden)`) o vi è rientrata (`pageshow` da bfcache). Da\n  /// pagina in uscita gli invii browser passano dal beacon, l'unico che il\n  /// browser porta a termine dopo la chiusura della scheda (CYJS-29). Lo chiama\n  /// il lifecycle del facade, non l'applicazione.\n  notifyPageHiding(hiding: boolean): void {\n    this.transport.setPageHiding(hiding)\n  }\n\n  /// Svuota i log bufferizzati e attende gli invii in volo.\n  async flush(): Promise<void> {\n    this.logBuffer.flush()\n    await this.transport.flush()\n  }\n\n  /// Spegne il client: svuota i log, attende gli invii, poi notifica lo\n  /// `shutdown` con lo snapshot dei contatori così l'operatore vede il bilancio\n  /// dell'invio. Emesso DOPO il drain (e una sola volta): lo snapshot riflette\n  /// anche i log dell'ultimo flush e gli invii completati, e nessun altro evento\n  /// diagnostico lo segue (parità gem Ruby, CYJS-9).\n  async close(): Promise<void> {\n    this.logBuffer.dispose()\n    await this.transport.flush()\n    if (!this.shutdownNotified) {\n      this.shutdownNotified = true\n      this.diagnostics.notify('shutdown', { stats: this.stats.toObject() })\n    }\n  }\n\n  // -------------------------------------------------------------- internals\n\n  // Registra uno scarto client-side col suo motivo e lo notifica all'hook: unico\n  // punto che tiene allineati il contatore (`reasons`) e la callback (CYJS-9).\n  private noteDrop(reason: DropReason, details: DiagnosticDetails = {}): void {\n    this.stats.record(reason)\n    this.diagnostics.notify('drop', { reason, ...details })\n  }\n\n  // [cap] applica il budget byte del canale (CYJS-10) DOPO `beforeSend`: l'hook\n  // può gonfiare il payload, quindi il cap è l'ultima cosa prima del filo, così\n  // ciò che parte rispetta sempre il limite del servizio.\n  private enqueue(\n    payload: EventPayload,\n    url: string,\n    cap?: (payload: EventPayload) => EventPayload,\n  ): void {\n    // Un evento generato DALLA callback diagnostica non deve produrre telemetria\n    // (né toccare i contatori): la diagnostica è a somma zero (CYJS-9).\n    if (diagnosticsSuppressed()) return\n\n    const hook = this.options.beforeSend\n    let body: EventPayload = payload\n    if (hook) {\n      let result: EventPayload | null\n      try {\n        result = hook(payload)\n      } catch (error) {\n        // beforeSend non deve mai far crashare l'host: assorbito e reso visibile\n        // come scarto col motivo `error` (parità gem Ruby).\n        this.noteDrop('error', { error: errorName(error) })\n        this.debugLog('beforeSend ha sollevato, evento scartato', error)\n        return\n      }\n      if (result === null) {\n        this.noteDrop('before_send')\n        return\n      }\n      body = result\n    }\n    if (cap) body = cap(body)\n    if (this.transport.send(body, url)) {\n      this.stats.increment('enqueued')\n      this.diagnostics.notify('enqueue', { path: pathOf(url) })\n    }\n  }\n\n  // `beforeSend` applicato a ogni elemento di un batch: una voce scartata (o che\n  // fa sollevare l'hook) non porta via le altre, ed è contata col suo motivo.\n  // Senza hook il batch passa intatto. Condiviso da log e web vitals: sono gli\n  // unici due canali che spediscono più payload in una richiesta sola.\n  private applyBeforeSend(batch: EventPayload[]): EventPayload[] {\n    const hook = this.options.beforeSend\n    if (!hook) return batch\n\n    const kept: EventPayload[] = []\n    for (const event of batch) {\n      let result: EventPayload | null\n      try {\n        result = hook(event)\n      } catch (error) {\n        this.noteDrop('error', { error: errorName(error) })\n        continue\n      }\n      if (result === null) {\n        this.noteDrop('before_send')\n        continue\n      }\n      kept.push(result)\n    }\n    return kept\n  }\n\n  private flushLogs(batch: EventPayload[]): void {\n    if (batch.length === 0) return\n    const payloads = this.applyBeforeSend(batch)\n    if (payloads.length === 0) return\n    // Il backend rifiuta batch oltre LOGS_MAX_BATCH (413) e i payload troppo\n    // grandi: chunkLogBatch spezza sia per conteggio sia per byte, troncando i\n    // singoli log giganti, senza mai perdere una voce (CYJS-10).\n    const url = logsUri(this.options)\n    for (const chunk of chunkLogBatch(payloads, MAX_PAYLOAD_BYTES, LOGS_MAX_BATCH)) {\n      if (this.transport.send(chunk, url)) {\n        this.stats.increment('enqueued')\n        this.diagnostics.notify('enqueue', { path: pathOf(url), batch: chunk.length })\n      }\n    }\n  }\n\n  private recordSlowMethod(\n    label: string,\n    durationMs: number,\n    args: Record<string, unknown> | undefined,\n  ): void {\n    if (!this.enabled) return\n    if (durationMs < this.options.slowMethodThresholdMs) return\n\n    this.enqueue(\n      buildSlowMethodEvent({\n        label,\n        durationMs,\n        environment: this.options.environment,\n        traceId: this.scope.traceId,\n        args: this.options.captureMethodArguments ? args : undefined,\n      }),\n      metricsUri(this.options),\n      capGenericToBudget,\n    )\n  }\n\n  private perfEnabled(): boolean {\n    return this.enabled && this.options.detectPerformanceIssues\n  }\n\n  private scopeHash(): EventPayload {\n    return this.scope.toEventHash({ sendPii: this.options.sendPii })\n  }\n\n  private autoRequest(): Record<string, unknown> | undefined {\n    if (!this.options.captureRequest) return undefined\n    return this.requestProvider()\n  }\n\n  private sampled(rate: number): boolean {\n    if (rate >= 1) return true\n    if (rate <= 0) return false\n    return this.random() < rate\n  }\n\n  // Il dado dei Web Vitals si tira una volta per client e poi vale per sempre:\n  // il caricamento è dentro o fuori, non a metà. Il valore memoizzato è ciò che\n  // tiene insieme il primo invio e quelli del flush di cortesia.\n  private sampledForWebVitals(): boolean {\n    this.webVitalsSampled ??= this.sampled(this.options.webVitalsSampleRate)\n    return this.webVitalsSampled\n  }\n\n  // Log diagnostici interni su console (mai nel log buffer: eviterebbe loop di\n  // telemetria su un invio fallito). Attivo solo con `debug: true`.\n  private debugLog(message: string, error?: unknown): void {\n    if (!this.options.debug) return\n    if (typeof console !== 'undefined') {\n      // eslint-disable-next-line no-console\n      console.debug('[closeyourit]', message, error ?? '')\n    }\n  }\n}\n\n// Cap dei canali eventi e replay ancorati al budget conservativo condiviso\n// (CYJS-10): applicati in `enqueue` come ultimo passo prima dell'invio.\nfunction capEventToBudget(payload: EventPayload): EventPayload {\n  return capEvent(payload, MAX_PAYLOAD_BYTES)\n}\n\nfunction capReplayChunkToBudget(payload: EventPayload): EventPayload {\n  return capReplayChunk(payload, MAX_PAYLOAD_BYTES)\n}\n\n// Metriche e pageview: label/url/route/path/referrer/utm (e le iniezioni di\n// beforeSend) non hanno un tetto proprio, il cap generico li tiene sotto budget.\nfunction capGenericToBudget(payload: EventPayload): EventPayload {\n  return capGeneric(payload, MAX_PAYLOAD_BYTES)\n}\n\n// Path dell'endpoint (senza host né query): metadato non sensibile allegato\n// all'evento diagnostico `enqueue` (mai l'URL completo).\nfunction pathOf(url: string): string | undefined {\n  try {\n    return new URL(url).pathname\n  } catch {\n    return undefined\n  }\n}\n\nfunction isThenable(value: unknown): value is Promise<unknown> {\n  return (\n    value !== null &&\n    (typeof value === 'object' || typeof value === 'function') &&\n    typeof (value as { then?: unknown }).then === 'function'\n  )\n}\n\nfunction defaultNowMs(): number {\n  return typeof performance !== 'undefined' && typeof performance.now === 'function'\n    ? performance.now()\n    : Date.now()\n}\n\n// Prima riga di stack utile (crash frame) per la chiave di dedup.\nfunction topFrameKey(stack: string | undefined): string | undefined {\n  if (!stack) return undefined\n  for (const raw of stack.split('\\n')) {\n    const line = raw.trim()\n    if (line.startsWith('at ') || line.includes('@')) return line\n  }\n  return undefined\n}\n","// Patch condiviso della History API: intercetta pushState/replaceState/popstate\n// e notifica i subscriber a ogni cambio di URL. Il monkey-patch si installa UNA\n// sola volta al primo subscriber e si ripristina quando l'ultimo si disiscrive —\n// così breadcrumb di navigazione e pageview possono coesistere senza doppio\n// patch. Estratto da `breadcrumbs.ts` (l'ex `installNavigation`) per condividerlo.\n\n/// Notificato a ogni cambio URL: [to] è il nuovo href, [from] il precedente\n/// (`null` se non ancora noto).\nexport type NavigationListener = (to: string, from: string | null) => void\n\nconst listeners = new Set<NavigationListener>()\nlet uninstallPatch: (() => void) | null = null\nlet lastHref = ''\n\n/// Registra [listener] sui cambi di URL SPA (pushState/replaceState/popstate) e\n/// ritorna la funzione di disiscrizione. Il patch della History è condiviso:\n/// installato al primo subscriber, ripristinato quando esce l'ultimo.\nexport function subscribeNavigation(listener: NavigationListener): () => void {\n  listeners.add(listener)\n  if (uninstallPatch === null) uninstallPatch = installPatch()\n\n  return () => {\n    listeners.delete(listener)\n    if (listeners.size === 0 && uninstallPatch !== null) {\n      uninstallPatch()\n      uninstallPatch = null\n    }\n  }\n}\n\nfunction installPatch(): () => void {\n  if (typeof window === 'undefined' || typeof history === 'undefined') {\n    return noop\n  }\n\n  lastHref = safeHref()\n\n  const record = (): void => {\n    const to = safeHref()\n    if (to === lastHref) return\n    const from = lastHref\n    lastHref = to\n    // Copia difensiva: un listener potrebbe disiscriversi durante la notifica.\n    for (const listener of [...listeners]) listener(to, from)\n  }\n\n  const originalPush = history.pushState\n  const originalReplace = history.replaceState\n\n  history.pushState = function patchedPush(\n    this: History,\n    ...args: Parameters<History['pushState']>\n  ): void {\n    originalPush.apply(this, args)\n    record()\n  }\n  history.replaceState = function patchedReplace(\n    this: History,\n    ...args: Parameters<History['replaceState']>\n  ): void {\n    originalReplace.apply(this, args)\n    record()\n  }\n  window.addEventListener('popstate', record)\n\n  return () => {\n    history.pushState = originalPush\n    history.replaceState = originalReplace\n    window.removeEventListener('popstate', record)\n  }\n}\n\nconst noop = (): void => {}\n\nfunction safeHref(): string {\n  return typeof location !== 'undefined' ? location.href : ''\n}\n","// Breadcrumb automatici browser: click, navigazione (history/popstate) e\n// console.warn/error. Le richieste HTTP vivono in `http.ts` (instrumentation\n// unificata breadcrumb+performance). Ogni sotto-integrazione è gateata da\n// `autoBreadcrumbs.{click,navigation,console}`; `install…` ritorna la funzione\n// di disinstallazione che ripristina i patch.\n\nimport type { Client } from '../../client'\nimport { subscribeNavigation } from './navigation'\n\nconst MAX_MESSAGE = 200\n\n/// Installa le sotto-integrazioni abilitate dalle opzioni.\nexport function installBreadcrumbs(client: Client): () => void {\n  const auto = client.options.autoBreadcrumbs\n  const uninstalls = [\n    auto.click ? installClicks(client) : noop,\n    auto.navigation ? installNavigation(client) : noop,\n    auto.console ? installConsole(client) : noop,\n  ]\n  return () => uninstalls.forEach((fn) => fn())\n}\n\nconst noop = (): void => {}\n\n// ------------------------------------------------------------------- click\n\nfunction installClicks(client: Client): () => void {\n  if (typeof document === 'undefined') return noop\n  const handler = (event: Event): void => {\n    const target = event.target\n    if (!isElement(target)) return\n    client.addBreadcrumb({\n      category: 'ui.click',\n      type: 'default',\n      message: syntheticSelector(target),\n    })\n  }\n  document.addEventListener('click', handler, true)\n  return () => document.removeEventListener('click', handler, true)\n}\n\n/// Selettore sintetico e privo di PII: tag + id + prime classi + data-test(id).\nexport function syntheticSelector(el: Element): string {\n  let selector = el.tagName.toLowerCase()\n  if (el.id) selector += `#${el.id}`\n  const classAttr = el.getAttribute('class') ?? ''\n  const classes = classAttr.trim().split(/\\s+/).filter(Boolean).slice(0, 3)\n  if (classes.length > 0) selector += `.${classes.join('.')}`\n  const testId = el.getAttribute('data-testid') ?? el.getAttribute('data-test')\n  if (testId) selector += `[data-testid=\"${testId}\"]`\n  return selector\n}\n\n// -------------------------------------------------------------- navigation\n\n// Consumer del patch condiviso (`navigation.ts`): traduce ogni cambio di URL in\n// un breadcrumb `navigation`, con from/to privati di query e hash. Il patch\n// della History è installato una sola volta anche quando coesiste coi pageview.\nfunction installNavigation(client: Client): () => void {\n  return subscribeNavigation((to, from) => {\n    client.addBreadcrumb({\n      category: 'navigation',\n      type: 'navigation',\n      data: { from: stripUrl(from ?? to), to: stripUrl(to) },\n    })\n  })\n}\n\n/// Rimuove query string e hash da un URL (PII-safe): resta origin + pathname.\nexport function stripUrl(href: string): string {\n  try {\n    const base = typeof location !== 'undefined' ? location.href : undefined\n    const url = new URL(href, base)\n    return url.origin + url.pathname\n  } catch {\n    return (href.split('?')[0] ?? href).split('#')[0] ?? href\n  }\n}\n\n// ----------------------------------------------------------------- console\n\nfunction installConsole(client: Client): () => void {\n  if (typeof console === 'undefined') return noop\n\n  const original = { warn: console.warn, error: console.error }\n\n  const patch = (level: 'warning' | 'error', method: 'warn' | 'error'): void => {\n    const originalMethod = original[method]\n    console[method] = function patched(...args: unknown[]): void {\n      client.addBreadcrumb({\n        category: 'console',\n        level,\n        message: stringifyArgs(args),\n      })\n      originalMethod.apply(console, args)\n    }\n  }\n  patch('warning', 'warn')\n  patch('error', 'error')\n\n  return () => {\n    console.warn = original.warn\n    console.error = original.error\n  }\n}\n\nfunction stringifyArgs(args: unknown[]): string {\n  const message = args\n    .map((arg) => {\n      if (typeof arg === 'string') return arg\n      if (arg instanceof Error) return arg.message\n      try {\n        return JSON.stringify(arg)\n      } catch {\n        return String(arg)\n      }\n    })\n    .join(' ')\n  return message.length > MAX_MESSAGE ? `${message.slice(0, MAX_MESSAGE)}…` : message\n}\n\n// ------------------------------------------------------------------ shared\n\nfunction isElement(value: EventTarget | null): value is Element {\n  return typeof Element !== 'undefined' && value instanceof Element\n}\n","// Gestori globali degli errori non gestiti. Usiamo `addEventListener` (non\n// l'assegnazione di `window.onerror`) per non clobberare handler preesistenti.\n// Ritornano una funzione di disinstallazione.\n\nimport type { Client } from '../../client'\n\n/// Installa i listener `error` e `unhandledrejection`. No-op fuori dal browser.\nexport function installGlobalHandlers(client: Client): () => void {\n  if (typeof window === 'undefined') return () => {}\n\n  const onError = (event: Event): void => {\n    const errorEvent = event as Partial<ErrorEvent> & Event\n    // Errori di caricamento risorsa (img/script): nessun error/message → ignora.\n    if (!errorEvent.error && !errorEvent.message) return\n\n    if (errorEvent.error) {\n      client.captureException(errorEvent.error, { handled: false })\n      return\n    }\n    client.captureException(synthesizeError(errorEvent), { handled: false })\n  }\n\n  const onRejection = (event: Event): void => {\n    const rejection = event as PromiseRejectionEvent\n    const reason = rejection.reason ?? 'Unhandled promise rejection'\n    client.captureException(reason, { handled: false })\n  }\n\n  window.addEventListener('error', onError, true)\n  window.addEventListener('unhandledrejection', onRejection, true)\n\n  return () => {\n    window.removeEventListener('error', onError, true)\n    window.removeEventListener('unhandledrejection', onRejection, true)\n  }\n}\n\n// window.onerror non porta un oggetto Error: sintetizziamo name/message/stack da\n// message/filename/lineno/colno così `parseStack` produce un frame coerente.\nfunction synthesizeError(event: Partial<ErrorEvent>): {\n  name: string\n  message: string\n  stack: string | undefined\n} {\n  const message = event.message ?? 'Unknown error'\n  let stack: string | undefined\n  if (event.filename) {\n    const line = event.lineno ?? 0\n    const col = event.colno ?? 0\n    stack = `Error: ${message}\\n    at ${event.filename}:${line}:${col}`\n  }\n  return { name: 'Error', message, stack }\n}\n","// Templatizzazione dei path HTTP per il grouping delle metriche: gli id\n// variabili (uuid, run numeriche) diventano placeholder, così richieste alla\n// stessa rotta condividono la signature. Parità con `NetHTTPPatch` (gem) e\n// `dio_interceptor` (dart): uuid→`<uuid>`, run ≥3 cifre→`<n>`.\n\nconst UUID_RE = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi\nconst LONG_NUMBER_RE = /\\d{3,}/g\n\nexport function templatizePath(path: string): string {\n  return path.replace(UUID_RE, '<uuid>').replace(LONG_NUMBER_RE, '<n>')\n}\n","// Instrumentation HTTP browser unificata: UN solo patch di `fetch` e\n// `XMLHttpRequest` alimenta due consumatori indipendenti:\n//   1. breadcrumb `http` (se `breadcrumbs` + `autoBreadcrumbs.http`);\n//   2. verdetti performance `slow_external_http` / `repeated_http`\n//      (se `detectPerformanceIssues` + `captureExternalHttp` — gate nel client).\n// Le richieste verso l'endpoint CloseYourIt sono escluse da entrambi (no loop\n// di telemetria). Ogni URL è privato di query string e hash (PII).\n\nimport type { BreadcrumbInput } from '../../breadcrumbs'\nimport type { Client } from '../../client'\nimport { templatizePath } from '../../templatize'\nimport { stripUrl } from './breadcrumbs'\n\n/// Conteggio delle richieste identiche (host + path templatizzato) in una\n/// finestra scorrevole: l'N+1 del client. Pura e con clock iniettato (test).\nexport class RepeatedHttpTracker {\n  private readonly hits = new Map<string, number[]>()\n\n  constructor(\n    private readonly windowMs: number,\n    private readonly now: () => number = () => Date.now(),\n  ) {}\n\n  /// Registra un hit per [key] e ritorna il conteggio nella finestra corrente.\n  record(key: string): number {\n    const current = this.now()\n    const cutoff = current - this.windowMs\n    const timestamps = (this.hits.get(key) ?? []).filter((t) => t > cutoff)\n    timestamps.push(current)\n    this.hits.set(key, timestamps)\n    return timestamps.length\n  }\n}\n\n/// Installa il patch fetch+XHR. Ritorna la funzione di disinstallazione.\nexport function installHttpInstrumentation(client: Client): () => void {\n  const tracker = new RepeatedHttpTracker(\n    client.options.repeatedHttpWindowMs,\n    client.nowMs,\n  )\n  const uninstalls = [installFetch(client, tracker), installXhr(client, tracker)]\n  return () => uninstalls.forEach((fn) => fn())\n}\n\nfunction installFetch(client: Client, tracker: RepeatedHttpTracker): () => void {\n  if (typeof window === 'undefined' || typeof window.fetch !== 'function') {\n    return () => {}\n  }\n  const originalFetch = window.fetch\n\n  window.fetch = function patchedFetch(\n    this: unknown,\n    input: RequestInfo | URL,\n    init?: RequestInit,\n  ): Promise<Response> {\n    const method = methodOf(input, init)\n    const url = urlOf(input)\n    const start = client.nowMs()\n\n    return originalFetch\n      .call(window, input, init)\n      .then((response) => {\n        handleCompleted(client, tracker, method, url, response.status, start)\n        return response\n      })\n      .catch((error: unknown) => {\n        handleCompleted(client, tracker, method, url, 0, start)\n        throw error\n      })\n  }\n\n  return () => {\n    window.fetch = originalFetch\n  }\n}\n\nfunction installXhr(client: Client, tracker: RepeatedHttpTracker): () => void {\n  if (typeof XMLHttpRequest === 'undefined') return () => {}\n\n  const proto = XMLHttpRequest.prototype\n  const originalOpen = proto.open\n  const originalSend = proto.send\n\n  interface Tracked {\n    __cyiMethod?: string\n    __cyiUrl?: string\n    __cyiStart?: number\n  }\n\n  proto.open = function patchedOpen(\n    this: XMLHttpRequest & Tracked,\n    method: string,\n    url: string | URL,\n    ...rest: unknown[]\n  ): void {\n    this.__cyiMethod = method.toUpperCase()\n    this.__cyiUrl = typeof url === 'string' ? url : url.toString()\n    // @ts-expect-error firma variadica originale\n    return originalOpen.call(this, method, url, ...rest)\n  }\n\n  proto.send = function patchedSend(\n    this: XMLHttpRequest & Tracked,\n    ...args: Parameters<XMLHttpRequest['send']>\n  ): void {\n    this.__cyiStart = client.nowMs()\n    this.addEventListener('loadend', () => {\n      handleCompleted(\n        client,\n        tracker,\n        this.__cyiMethod ?? 'GET',\n        this.__cyiUrl ?? '',\n        this.status,\n        this.__cyiStart ?? client.nowMs(),\n      )\n    })\n    return originalSend.apply(this, args)\n  }\n\n  return () => {\n    proto.open = originalOpen\n    proto.send = originalSend\n  }\n}\n\n// Richiesta completata (o fallita a rete): breadcrumb + verdetti performance.\nfunction handleCompleted(\n  client: Client,\n  tracker: RepeatedHttpTracker,\n  method: string,\n  rawUrl: string,\n  status: number,\n  startMs: number,\n): void {\n  const durationMs = client.nowMs() - startMs\n  const url = stripUrl(rawUrl)\n  const host = hostOf(url)\n  if (host && host === client.endpointHost) return\n\n  const options = client.options\n  const pageHost = typeof location !== 'undefined' ? location.host : undefined\n  const external = isExternalHost(host, client.endpointHost, pageHost)\n\n  if (options.breadcrumbs && options.autoBreadcrumbs.http) {\n    const crumb = httpBreadcrumb({\n      method,\n      url,\n      status,\n      durationMs,\n      external,\n      slowThresholdMs: options.slowExternalThresholdMs,\n    })\n    client.addBreadcrumb(crumb)\n  }\n\n  if (external && host) {\n    const path = templatizePath(pathnameOf(url))\n    // Il gate detect/captureExternalHttp e la soglia slow vivono nel client.\n    client.recordExternalHttp(host, path, durationMs)\n    const count = tracker.record(`${host}\\n${path}`)\n    if (count === options.repeatedHttpThreshold) {\n      client.recordRepeatedHttp(host, path, count)\n    }\n  }\n}\n\ninterface HttpBreadcrumbContext {\n  method: string\n  url: string\n  status: number\n  durationMs: number\n  external: boolean\n  /// Soglia oltre cui marcare `slow_external_http`; `0` disattiva la marcatura.\n  slowThresholdMs: number\n}\n\n/// Breadcrumb `http` per una richiesta (URL già senza query). Marca\n/// `slow_external_http` (e `level: warning`) quando la durata supera la soglia\n/// e l'host è esterno. Helper puro per i test.\nexport function httpBreadcrumb(ctx: HttpBreadcrumbContext): BreadcrumbInput {\n  const data: Record<string, unknown> = {\n    method: ctx.method,\n    url: ctx.url,\n    status: ctx.status,\n    duration_ms: Math.round(ctx.durationMs),\n  }\n  const slow =\n    ctx.slowThresholdMs > 0 && ctx.durationMs >= ctx.slowThresholdMs && ctx.external\n\n  const crumb: BreadcrumbInput = { category: 'http', type: 'http', data }\n  if (slow) {\n    data['slow_external_http'] = true\n    crumb.level = 'warning'\n  }\n  return crumb\n}\n\n// Esterno = host presente, diverso dall'endpoint CloseYourIt e dall'origine della pagina.\nfunction isExternalHost(\n  host: string | undefined,\n  endpointHost: string | undefined,\n  pageHost: string | undefined,\n): boolean {\n  if (!host) return false\n  if (host === endpointHost) return false\n  if (pageHost && host === pageHost) return false\n  return true\n}\n\n/// Estrae l'URL da un argomento fetch (`string`, `URL` o `Request`).\nexport function urlOf(input: RequestInfo | URL): string {\n  if (typeof input === 'string') return input\n  if (input instanceof URL) return input.toString()\n  return input.url\n}\n\nfunction methodOf(input: RequestInfo | URL, init?: RequestInit): string {\n  if (init?.method) return init.method.toUpperCase()\n  if (typeof input === 'object' && 'method' in input && input.method) {\n    return input.method.toUpperCase()\n  }\n  return 'GET'\n}\n\nfunction hostOf(url: string): string | undefined {\n  try {\n    return new URL(url).host\n  } catch {\n    return undefined\n  }\n}\n\nfunction pathnameOf(url: string): string {\n  try {\n    return new URL(url).pathname\n  } catch {\n    return url\n  }\n}\n","// Rilevazione jank del main thread via PerformanceObserver(longtask).\n// Un long task oltre `jankThresholdMs` (default 100 — le entry longtask hanno\n// già floor 50ms) emette un verdetto `performance_issue` subtype `jank` con la\n// route corrente templatizzata. longtask è di fatto Chromium-only: dove non è\n// supportato l'integrazione è un no-op silenzioso.\n\nimport type { Client } from '../../client'\nimport { templatizePath } from '../../templatize'\n\ninterface LongTaskEntry {\n  duration: number\n}\n\ninterface LongTaskList {\n  getEntries(): LongTaskEntry[]\n}\n\n/// Installa l'observer. Ritorna la funzione di disinstallazione.\nexport function installJankDetection(client: Client): () => void {\n  const Observer = globalThis.PerformanceObserver as\n    (typeof PerformanceObserver & { supportedEntryTypes?: string[] }) | undefined\n  if (!Observer || !Observer.supportedEntryTypes?.includes('longtask')) {\n    return () => {}\n  }\n\n  const observer = new Observer((list) => {\n    for (const entry of (list as LongTaskList).getEntries()) {\n      if (entry.duration <= client.options.jankThresholdMs) continue\n      client.recordJank(entry.duration, currentRoute())\n    }\n  })\n\n  try {\n    observer.observe({ entryTypes: ['longtask'] })\n  } catch {\n    return () => {}\n  }\n\n  return () => observer.disconnect()\n}\n\nfunction currentRoute(): string {\n  if (typeof location === 'undefined') return '<unknown>'\n  return templatizePath(location.pathname)\n}\n","// Auto-tracking delle pageview (opt-in `trackPageviews`). Emette una pageview al\n// load e a ogni cambio di `pathname`, riusando il patch History condiviso\n// (`navigation.ts`) — così breadcrumb di navigazione e pageview non doppiano il\n// monkey-patch. Installato solo nel browser (l'`init` gata su `isBrowser()`).\n//\n// Dedup sul `pathname` (semantica Plausible, senza timer): un cambio di hash o un\n// `replaceState` ripetuto sullo stesso path NON producono una nuova pageview.\n\nimport type { Client } from '../../client'\nimport { subscribeNavigation } from './navigation'\n\n/// Emette la pageview iniziale e si iscrive ai cambi di pathname. Ritorna la\n/// funzione di disinstallazione (disiscrive dal patch condiviso).\nexport function installPageviews(client: Client): () => void {\n  client.capturePageview()\n  let lastPathname = location.pathname\n\n  return subscribeNavigation(() => {\n    if (location.pathname === lastPathname) return\n    lastPathname = location.pathname\n    client.capturePageview()\n  })\n}\n","// Costruzione del payload di un chunk di session replay per `POST …/replays`. Un\n// chunk raccoglie una finestra di eventi rrweb della sessione. Contratto wire\n// snake_case come gli altri builder. Gli eventi rrweb sono OPACHI qui: il masking\n// PII è già applicato a monte (opzioni rrweb + `beforeSend`), questo builder non\n// li ispeziona. L'`environment` è aggiunto dal client, come per le pageview.\n\nimport type { EventPayload } from './types'\n\n/// Ingressi per un chunk di replay.\nexport interface ReplayChunkInput {\n  /// Id di sessione opaco (vedi `session.ts`), condiviso con gli errori correlati.\n  replaySessionId: string\n  /// Indice progressivo del chunk nella sessione (ordina la ricostruzione).\n  seq: number\n  /// Epoch ms di inizio sessione (t0 relativo agli eventi rrweb).\n  startedAt: number\n  /// Eventi rrweb grezzi della finestra.\n  events: unknown[]\n  /// Pathname corrente al flush (per la galleria comportamento: pagine visitate).\n  /// Omesso se non nel browser. Nessuna query string.\n  path?: string | undefined\n  /// Id utente (da `setUser`), se impostato: il backend lo hasha (mai in chiaro).\n  user?: string | undefined\n}\n\n/// Payload di un chunk di replay per `POST …/replays`. `path`/`user` opzionali:\n/// il backend è retro-compatibile coi chunk che non li portano.\nexport function buildReplayChunk(input: ReplayChunkInput): EventPayload {\n  return {\n    replay_session_id: input.replaySessionId,\n    seq: input.seq,\n    started_at: new Date(input.startedAt).toISOString(),\n    events: input.events,\n    ...(input.path ? { path: input.path } : {}),\n    ...(input.user ? { user: input.user } : {}),\n  }\n}\n","// Sessione di replay: un id opaco stabile per l'intera sessione-browser, più\n// longevo del `trace_id` (che è per-pagina). Persistito in `sessionStorage` così\n// da sopravvivere alle navigazioni full-page (Turbo Drive incluso); se lo storage\n// non è disponibile (SSR, modalità privata, accesso negato) ricade su un id\n// in-memory valido per la pagina corrente. L'id è casuale e NON contiene PII.\n\nimport { uuidV4NoDashes } from './uuid'\n\n/// Chiave in sessionStorage e nome del cookie di correlazione lato server.\nexport const REPLAY_STORAGE_KEY = 'cyi_replay'\n\n/// Sessione di replay corrente.\nexport interface ReplaySession {\n  /// Id opaco condiviso da tutti i chunk e dagli errori della sessione.\n  id: string\n  /// Epoch ms di inizio sessione (t0 per la ricostruzione lato viewer).\n  startedAt: number\n}\n\n/// Sottoinsieme di `Storage` usato (iniettabile nei test).\nexport interface StorageLike {\n  getItem(key: string): string | null\n  setItem(key: string, value: string): void\n}\n\n// Fallback quando lo storage non è disponibile: un'unica sessione in-memory per\n// il contesto corrente (il browser è single-thread → una sessione per pagina).\nlet memorySession: ReplaySession | null = null\n\n/// Ritorna la sessione di replay corrente creandola al primo accesso; idempotente\n/// entro la stessa sessione-browser. [storage] iniettabile: `undefined` usa il\n/// default (`sessionStorage` se disponibile), `null` forza il fallback in-memory.\nexport function ensureReplaySession(\n  storage: StorageLike | null | undefined = defaultStorage(),\n  now: () => number = () => Date.now(),\n): ReplaySession {\n  const store = storage === undefined ? defaultStorage() : storage\n  if (store) {\n    const existing = readStored(store)\n    if (existing) return existing\n    const created: ReplaySession = { id: uuidV4NoDashes(), startedAt: now() }\n    writeStored(store, created)\n    return created\n  }\n  if (memorySession) return memorySession\n  memorySession = { id: uuidV4NoDashes(), startedAt: now() }\n  return memorySession\n}\n\n/// Azzera il fallback in-memory. Solo per i test (isola le sessioni tra casi).\nexport function resetReplaySessionMemory(): void {\n  memorySession = null\n}\n\nfunction readStored(storage: StorageLike): ReplaySession | null {\n  let raw: string | null\n  try {\n    raw = storage.getItem(REPLAY_STORAGE_KEY)\n  } catch {\n    return null\n  }\n  if (!raw) return null\n  try {\n    const parsed = JSON.parse(raw) as Partial<ReplaySession>\n    if (typeof parsed.id === 'string' && typeof parsed.startedAt === 'number') {\n      return { id: parsed.id, startedAt: parsed.startedAt }\n    }\n  } catch {\n    // valore corrotto → rigenera\n  }\n  return null\n}\n\nfunction writeStored(storage: StorageLike, session: ReplaySession): void {\n  try {\n    storage.setItem(REPLAY_STORAGE_KEY, JSON.stringify(session))\n  } catch {\n    // quota superata o accesso negato: la sessione resta valida per la pagina\n  }\n}\n\nfunction defaultStorage(): StorageLike | null {\n  try {\n    if (typeof sessionStorage !== 'undefined') return sessionStorage\n  } catch {\n    // l'accesso a sessionStorage può sollevare (iframe cross-origin, storage off)\n  }\n  return null\n}\n","// Recorder di session replay (opt-in `replay`). Registra la sessione con rrweb,\n// bufferizza gli eventi e li invia in chunk (flush periodico + su\n// `pagehide`/`visibilitychange(hidden)`). Twin strutturale di `installPageviews`.\n//\n// rrweb NON è una dipendenza del pacchetto (che resta zero-dep): il recorder usa\n// il globale `window.rrweb` fornito dalla pagina (build UMD di rrweb via\n// script/importmap), coerentemente col modello di distribuzione dell'SDK. Il\n// `record` è iniettabile per i test → nessun rrweb nel test path.\n//\n// Correlazione con gli errori server: al primo avvio la sessione scrive un cookie\n// `cyi_replay` (id opaco). Le richieste same-origin lo trasportano → il gem\n// `closeyourit-ruby` lo legge e lega gli errori server allo stesso replay. Gli\n// errori JS invece portano l'id in `contexts.replay.replay_id` (via lo scope).\n\nimport type { Client } from '../../client'\nimport { buildReplayChunk } from '../../replay'\nimport { ensureReplaySession } from '../../session'\nimport type { StorageLike } from '../../session'\n\n/// Opzioni passate al recorder rrweb (sottoinsieme usato).\nexport interface ReplayRecordOptions {\n  emit: (event: unknown) => void\n  maskAllInputs: boolean\n  blockSelector: string | undefined\n  maskTextSelector: string | undefined\n}\n\n/// Dipendenze iniettabili (test).\nexport interface ReplayDeps {\n  /// Avvia la registrazione e ritorna la funzione di stop. Default: `window.rrweb`.\n  record?: (opts: ReplayRecordOptions) => () => void\n  /// Storage per la sessione (`undefined` = default, `null` = fallback in-memory).\n  storage?: StorageLike | null\n  /// Clock (test).\n  now?: () => number\n  /// Scrive l'id dove le richieste same-origin lo trasportano al backend (default:\n  /// cookie `cyi_replay`). Iniettabile per i test.\n  writeCorrelation?: (id: string) => void\n}\n\n// Eventi rrweb accumulati oltre cui forzare un flush: evita chunk illimitati sotto\n// interazioni intense (rrweb emette molti eventi durante scroll/typing).\nconst REPLAY_MAX_BUFFER = 200\n\n/// Avvia il recorder. Ritorna la funzione di disinstallazione (stop rrweb + flush\n/// finale + rimozione listener/interval).\nexport function installReplay(client: Client, deps: ReplayDeps = {}): () => void {\n  const session = ensureReplaySession(deps.storage, deps.now)\n  client.setReplaySessionId(session.id)\n  ;(deps.writeCorrelation ?? writeReplayCookie)(session.id)\n\n  let buffer: unknown[] = []\n  let seq = 0\n\n  const flush = (): void => {\n    if (buffer.length === 0) return\n    const events = buffer\n    buffer = []\n    client.captureReplayChunk(\n      buildReplayChunk({\n        replaySessionId: session.id,\n        seq: seq++,\n        startedAt: session.startedAt,\n        events,\n        path: currentPath(),\n        user: client.scope.userId,\n      }),\n    )\n  }\n\n  const record = deps.record ?? defaultRecord\n  const stop = record({\n    emit: (event) => {\n      buffer.push(event)\n      if (buffer.length >= REPLAY_MAX_BUFFER) flush()\n    },\n    maskAllInputs: client.options.replayMaskAllInputs,\n    blockSelector: client.options.replayBlockSelector,\n    maskTextSelector: client.options.replayMaskTextSelector,\n  })\n\n  const interval = setInterval(flush, client.options.replayFlushIntervalMs)\n  const onHide = (): void => flush()\n  const onVisibility = (): void => {\n    if (typeof document !== 'undefined' && document.visibilityState === 'hidden') {\n      flush()\n    }\n  }\n\n  if (typeof window !== 'undefined') {\n    window.addEventListener('pagehide', onHide)\n  }\n  if (typeof document !== 'undefined') {\n    document.addEventListener('visibilitychange', onVisibility)\n  }\n\n  return () => {\n    clearInterval(interval)\n    if (typeof window !== 'undefined') {\n      window.removeEventListener('pagehide', onHide)\n    }\n    if (typeof document !== 'undefined') {\n      document.removeEventListener('visibilitychange', onVisibility)\n    }\n    stop()\n    flush()\n  }\n}\n\n// Pathname corrente al flush (senza query string): alimenta le \"pagine visitate\"\n// della galleria. `undefined` fuori dal browser.\nfunction currentPath(): string | undefined {\n  return typeof location !== 'undefined' ? location.pathname : undefined\n}\n\n/// Forma minima della build globale rrweb (`window.rrweb`).\ninterface RrwebGlobal {\n  record: (opts: Record<string, unknown>) => (() => void) | undefined\n}\n\n// Recorder di default: usa `window.rrweb` se presente, altrimenti no-op (il\n// replay resta inattivo, il resto dell'SDK invariato). Nessun import statico di\n// rrweb → il pacchetto core resta zero-dep.\nfunction defaultRecord(opts: ReplayRecordOptions): () => void {\n  const rrweb = (globalThis as { rrweb?: RrwebGlobal }).rrweb\n  if (!rrweb || typeof rrweb.record !== 'function') return () => {}\n  const stop = rrweb.record({\n    emit: (event: unknown) => opts.emit(event),\n    maskAllInputs: opts.maskAllInputs,\n    ...(opts.blockSelector ? { blockSelector: opts.blockSelector } : {}),\n    ...(opts.maskTextSelector ? { maskTextSelector: opts.maskTextSelector } : {}),\n  })\n  return typeof stop === 'function' ? stop : () => {}\n}\n\n// Cookie di correlazione: session cookie, `SameSite=Lax`, id opaco (no PII). Le\n// richieste same-origin (Turbo, XHR, form, navigazioni full-page) lo trasportano\n// → il gem server lega gli errori server al replay. Scritto solo a replay attivo,\n// che richiede il consenso dell'utente.\nfunction writeReplayCookie(id: string): void {\n  if (typeof document === 'undefined') return\n  try {\n    document.cookie = `cyi_replay=${encodeURIComponent(id)}; path=/; SameSite=Lax`\n  } catch {\n    // ambienti senza cookie: la correlazione server è best-effort\n  }\n}\n","// Fallimenti delle risorse della pagina e violazioni della Content Security\n// Policy (opt-in `captureResourceErrors`, CYJS-12). Sono i guasti che il\n// browser segnala e che nessuno stack trace racconta: uno script di terze parti\n// che non risponde, un foglio di stile che non arriva, una policy che blocca\n// qualcosa che alla pagina serviva.\n//\n// Il canale è quello degli eventi, come per gli errori JS: sono fallimenti, e li\n// si vuole raggruppati per risorsa e visti accanto agli altri. Passano da\n// `captureException`, quindi ereditano campionamento, `excludedExceptions`\n// (`ResourceError` / `CSPViolation` spengono una famiglia sola), `beforeSend`,\n// scrubbing e contatori — senza una riga di pipeline in più.\n//\n// Livello `warning` e non `error`: una risorsa bloccata è quasi sempre ambiente\n// o terze parti (un blocco pubblicità, una CDN irraggiungibile), non un difetto\n// dell'applicazione. Alzarla a errore riempirebbe l'alerting di rumore che\n// nessuno può correggere.\n//\n// L'evento `error` di una risorsa NON risale il DOM: si intercetta in fase di\n// cattura su window, come già fa `globalHandlers` — che invece questi eventi li\n// scarta, perché senza `error`/`message` non c'è niente da normalizzare.\n\nimport type { Client } from '../../client'\n\n// Tetto di segnalazioni per caricamento pagina, **per famiglia**. Una CDN\n// irraggiungibile fa fallire ogni immagine del catalogo: la prima decina dice\n// già tutto, le altre sarebbero solo traffico e quota bruciata su un ingest che\n// non ne sa di più. Il tetto è per famiglia e non condiviso perché una CDN giù\n// non deve nascondere una policy che blocca: sono due problemi diversi, e chi\n// arriva secondo non ha colpa di quanto è rumoroso il primo.\nconst MAX_FAILURES_PER_PAGE = 10\n\n/// Etichette leggibili per gli elementi che sanno fallire nel caricamento. Il\n/// nome finisce nel messaggio dell'evento, che è la chiave con cui il backend\n/// raggruppa: \"script non caricato: …\" resta lo stesso gruppo a ogni occorrenza.\nconst RESOURCE_LABELS: Record<string, string> = {\n  script: 'script non caricato',\n  link: 'foglio di stile non caricato',\n  img: 'immagine non caricata',\n  image: 'immagine non caricata',\n  audio: 'audio non caricato',\n  video: 'video non caricato',\n  source: 'sorgente multimediale non caricata',\n  track: 'traccia non caricata',\n  iframe: 'contenuto incorporato non caricato',\n  object: 'oggetto non caricato',\n  embed: 'oggetto non caricato',\n}\n\n/// Installa i listener (risorse + CSP). Ritorna la funzione di disinstallazione.\n/// No-op fuori dal browser.\nexport function installResourceErrors(client: Client): () => void {\n  if (typeof window === 'undefined') return () => {}\n\n  // Chiavi già segnalate in questa pagina, una raccolta per famiglia: fa da\n  // deduplica (la stessa risorsa che ritenta non vale una nuova segnalazione) e,\n  // con la sua capienza, da tetto — che resta separato tra risorse e policy.\n  const reported: Record<string, Set<string>> = {\n    ResourceError: new Set(),\n    CSPViolation: new Set(),\n  }\n\n  const capture = (\n    name: 'ResourceError' | 'CSPViolation',\n    key: string,\n    message: string,\n    contexts: Record<string, unknown>,\n  ): void => {\n    const seen = reported[name]!\n    if (seen.has(key)) return\n    if (seen.size >= MAX_FAILURES_PER_PAGE) return\n    seen.add(key)\n    client.captureException(\n      { name, message },\n      { level: 'warning', handled: true, contexts },\n    )\n  }\n\n  const onError = (event: Event): void => {\n    // Errore JavaScript vero: è di `globalHandlers`, qui non si tocca.\n    const errorEvent = event as Partial<ErrorEvent> & Event\n    if (errorEvent.error || errorEvent.message) return\n\n    const target = event.target\n    if (!target || target === window || !isElement(target)) return\n\n    const url = resourceUrl(target)\n    if (!url) return\n\n    const element = target.tagName.toLowerCase()\n    const label = RESOURCE_LABELS[element] ?? 'risorsa non caricata'\n    capture('ResourceError', url, `${label}: ${url}`, {\n      resource: { url, element },\n    })\n  }\n\n  const onViolation = (event: Event): void => {\n    const violation = event as Event & Partial<SecurityPolicyViolationEvent>\n    const directive =\n      violation.effectiveDirective || violation.violatedDirective || 'policy'\n    const blocked = violation.blockedURI ? stripQuery(violation.blockedURI) : 'inline'\n    const sourceFile = violation.sourceFile\n      ? stripQuery(violation.sourceFile)\n      : undefined\n\n    capture(\n      'CSPViolation',\n      `${directive}:${blocked}`,\n      `${directive} ha bloccato ${blocked}`,\n      {\n        csp: {\n          blocked_uri: blocked,\n          effective_directive: directive,\n          ...(violation.disposition ? { disposition: violation.disposition } : {}),\n          ...(sourceFile ? { source_file: sourceFile } : {}),\n          ...(violation.lineNumber ? { line_number: violation.lineNumber } : {}),\n        },\n      },\n    )\n  }\n\n  window.addEventListener('error', onError, true)\n  if (typeof document !== 'undefined') {\n    document.addEventListener('securitypolicyviolation', onViolation)\n  }\n\n  return () => {\n    window.removeEventListener('error', onError, true)\n    if (typeof document !== 'undefined') {\n      document.removeEventListener('securitypolicyviolation', onViolation)\n    }\n  }\n}\n\nfunction isElement(target: EventTarget): target is Element {\n  return typeof (target as Element).tagName === 'string'\n}\n\n// Indirizzo della risorsa fallita: `currentSrc` per primo — con `srcset` è il\n// browser a scegliere la variante, e l'attributo `src` può essere assente o\n// indicare un altro file — poi `src`, `href` per i fogli di stile, `data` per\n// gli oggetti incorporati. Sempre senza query string: può portare token di firma\n// delle CDN, e per sapere quale risorsa manca non serve.\nfunction resourceUrl(element: Element): string | undefined {\n  const current = (element as { currentSrc?: unknown }).currentSrc\n  const raw =\n    (typeof current === 'string' && current ? current : null) ??\n    element.getAttribute('src') ??\n    element.getAttribute('href') ??\n    element.getAttribute('data')\n  if (!raw) return undefined\n  return stripQuery(raw)\n}\n\nfunction stripQuery(url: string): string {\n  return url.split(/[?#]/, 1)[0] ?? url\n}\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\ninterface onBFCacheRestoreCallback {\n  (event: PageTransitionEvent): void;\n}\n\nlet bfcacheRestoreTime = -1;\n\nexport const getBFCacheRestoreTime = () => bfcacheRestoreTime;\n\nexport const onBFCacheRestore = (cb: onBFCacheRestoreCallback) => {\n  addEventListener(\n    'pageshow',\n    (event) => {\n      if (event.persisted) {\n        bfcacheRestoreTime = event.timeStamp;\n        cb(event);\n      }\n    },\n    true,\n  );\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {MetricType, MetricRatingThresholds} from '../types.js';\n\nconst getRating = (\n  value: number,\n  thresholds: MetricRatingThresholds,\n): MetricType['rating'] => {\n  if (value > thresholds[1]) {\n    return 'poor';\n  }\n  if (value > thresholds[0]) {\n    return 'needs-improvement';\n  }\n  return 'good';\n};\n\nexport const bindReporter = <MetricName extends MetricType['name']>(\n  callback: (metric: Extract<MetricType, {name: MetricName}>) => void,\n  metric: Extract<MetricType, {name: MetricName}>,\n  thresholds: MetricRatingThresholds,\n  reportAllChanges?: boolean,\n) => {\n  let prevValue: number;\n  let delta: number;\n  return (forceReport?: boolean) => {\n    if (metric.value >= 0) {\n      if (forceReport || reportAllChanges) {\n        delta = metric.value - (prevValue ?? 0);\n\n        // Report the metric if there's a non-zero delta or if no previous\n        // value exists (which can happen in the case of the document becoming\n        // hidden when the metric value is 0).\n        // See: https://github.com/GoogleChrome/web-vitals/issues/14\n        if (delta || prevValue === undefined) {\n          prevValue = metric.value;\n          metric.delta = delta;\n          metric.rating = getRating(metric.value, thresholds);\n          callback(metric);\n        }\n      }\n    }\n  };\n};\n","/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const doubleRAF = (cb: () => unknown) => {\n  requestAnimationFrame(() => requestAnimationFrame(cb));\n};\n","/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const getNavigationEntry = (): PerformanceNavigationTiming | void => {\n  const navigationEntry = performance.getEntriesByType('navigation')[0];\n\n  // Check to ensure the `responseStart` property is present and valid.\n  // In some cases a zero value is reported by the browser (for\n  // privacy/security reasons), and in other cases (bugs) the value is\n  // negative or is larger than the current page time. Ignore these cases:\n  // - https://github.com/GoogleChrome/web-vitals/issues/137\n  // - https://github.com/GoogleChrome/web-vitals/issues/162\n  // - https://github.com/GoogleChrome/web-vitals/issues/275\n  if (\n    navigationEntry &&\n    navigationEntry.responseStart > 0 &&\n    navigationEntry.responseStart < performance.now()\n  ) {\n    return navigationEntry;\n  }\n};\n","/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {getNavigationEntry} from './getNavigationEntry.js';\n\nexport const getActivationStart = (): number => {\n  return getNavigationEntry()?.activationStart ?? 0;\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {onBFCacheRestore} from './bfcache.js';\nimport {getActivationStart} from './getActivationStart.js';\n\nlet firstHiddenTime = -1;\nconst onHiddenFunctions: Set<() => void> = new Set();\n\nconst initHiddenTime = () => {\n  // If the document is hidden when this code runs, assume it was always\n  // hidden and the page was loaded in the background, with the one exception\n  // that visibility state is always 'hidden' during prerendering, so we have\n  // to ignore that case until prerendering finishes (see: `prerenderingchange`\n  // event logic below).\n  return document.visibilityState === 'hidden' && !document.prerendering\n    ? 0\n    : Infinity;\n};\n\nconst onVisibilityUpdate = (event: Event) => {\n  // Handle changes to hidden state\n  if (document.visibilityState === 'hidden') {\n    if (event.type === 'visibilitychange') {\n      for (const onHiddenFunction of onHiddenFunctions) {\n        onHiddenFunction();\n      }\n    }\n\n    // If the document is 'hidden' and no previous hidden timestamp has been\n    // set (so is infinity), update it based on the current event data.\n    if (!isFinite(firstHiddenTime)) {\n      // If the event is a 'visibilitychange' event, it means the page was\n      // visible prior to this change, so the event timestamp is the first\n      // hidden time.\n      // However, if the event is not a 'visibilitychange' event, then it must\n      // be a 'prerenderingchange' event, and the fact that the document is\n      // still 'hidden' from the above check means the tab was activated\n      // in a background state and so has always been hidden.\n      firstHiddenTime = event.type === 'visibilitychange' ? event.timeStamp : 0;\n\n      // We no longer need the `prerenderingchange` event listener now we've\n      // set an initial init time so remove that\n      // (we'll keep the visibilitychange one for onHiddenFunction above)\n      removeEventListener('prerenderingchange', onVisibilityUpdate, true);\n    }\n  }\n};\n\nexport const getVisibilityWatcher = (reset = false) => {\n  if (reset) {\n    firstHiddenTime = Infinity;\n  }\n  if (firstHiddenTime < 0) {\n    // Check if we have a previous hidden `visibility-state` performance entry.\n    const activationStart = getActivationStart();\n    /* eslint-disable indent */\n    const firstVisibilityStateHiddenTime = !document.prerendering\n      ? globalThis.performance\n          .getEntriesByType('visibility-state')\n          .find((e) => e.name === 'hidden' && e.startTime >= activationStart)\n          ?.startTime\n      : undefined;\n    /* eslint-enable indent */\n\n    // Prefer that, but if it's not available and the document is hidden when\n    // this code runs, assume it was hidden since navigation start. This isn't\n    // a perfect heuristic, but it's the best we can do until the\n    // `visibility-state` performance entry becomes available in all browsers.\n    firstHiddenTime = firstVisibilityStateHiddenTime ?? initHiddenTime();\n\n    // Listen for visibility changes so we can handle things like bfcache\n    // restores and/or prerender without having to examine individual\n    // timestamps in detail and also for onHidden function calls.\n    addEventListener('visibilitychange', onVisibilityUpdate, true);\n    // IMPORTANT: when a page is prerendering, its `visibilityState` is\n    // 'hidden', so in order to account for cases where this module checks for\n    // visibility during prerendering, an additional check after prerendering\n    // completes is also required.\n    addEventListener('prerenderingchange', onVisibilityUpdate, true);\n\n    // Reset the time on bfcache restores.\n    onBFCacheRestore(() => {\n      // Schedule a task in order to track the `visibilityState` once it's\n      // had an opportunity to change to visible in all browsers.\n      // https://bugs.chromium.org/p/chromium/issues/detail?id=1133363\n      setTimeout(() => {\n        firstHiddenTime = initHiddenTime();\n      });\n    });\n  }\n  return {\n    get firstHiddenTime() {\n      return firstHiddenTime;\n    },\n    onHidden(cb: () => void) {\n      onHiddenFunctions.add(cb);\n    },\n  };\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Performantly generate a unique, 30-char string by combining a version\n * number, the current timestamp with a 13-digit number integer.\n * @return {string}\n */\nexport const generateUniqueID = () => {\n  return `v6-${Date.now()}-${Math.floor(Math.random() * (9e12 - 1)) + 1e12}`;\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {getBFCacheRestoreTime} from './bfcache.js';\nimport {generateUniqueID} from './generateUniqueID.js';\nimport {getActivationStart} from './getActivationStart.js';\nimport {getNavigationEntry} from './getNavigationEntry.js';\nimport type {MetricType} from '../types.js';\n\nexport const initMetric = <MetricName extends MetricType['name']>(\n  name: MetricName,\n  value: number = -1,\n  navigationType?: MetricType['navigationType'],\n  navigationId: number = 0,\n  navigationInteractionId?: number,\n  navigationURL?: string,\n  navigationStartTime?: number,\n) => {\n  const hardNavEntry = getNavigationEntry();\n  const hardNavId = hardNavEntry?.navigationId || 0;\n  let _navigationType: MetricType['navigationType'] = 'navigate';\n\n  if (navigationType) {\n    // If it was passed in, then use that\n    _navigationType = navigationType;\n  } else if (getBFCacheRestoreTime() >= 0) {\n    _navigationType = 'back-forward-cache';\n  } else if (hardNavEntry) {\n    if (document.prerendering || getActivationStart() > 0) {\n      _navigationType = 'prerender';\n    } else if (document.wasDiscarded) {\n      _navigationType = 'restore';\n    } else if (hardNavEntry.type) {\n      _navigationType = hardNavEntry.type.replace(\n        /_/g,\n        '-',\n      ) as MetricType['navigationType'];\n    }\n  }\n\n  // Use `entries` type specific for the metric.\n  const entries: Extract<MetricType, {name: MetricName}>['entries'] = [];\n\n  return {\n    name,\n    value,\n    rating: 'good' as const, // If needed, will be updated when reported. `const` to keep the type from widening to `string`.\n    delta: 0,\n    entries,\n    id: generateUniqueID(),\n    navigationType: _navigationType,\n    navigationId: navigationId || hardNavId,\n    navigationInteractionId: navigationInteractionId,\n    navigationURL: navigationURL || hardNavEntry?.name,\n    navigationStartTime: navigationStartTime || 0,\n  };\n};\n","/*\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst instanceMap: WeakMap<\n  new () => unknown,\n  WeakMap<object, unknown>\n> = new WeakMap();\n\n/**\n * A function that accepts and identity object and a class object and returns\n * either a new instance of that class or an existing instance, if the\n * identity object was previously used.\n */\nexport function initUnique<T>(identityObj: object, ClassObj: new () => T): T {\n  let classInstances = instanceMap.get(ClassObj);\n  if (!classInstances) {\n    classInstances = new WeakMap();\n    instanceMap.set(ClassObj, classInstances);\n  }\n  if (!classInstances.get(identityObj)) {\n    classInstances.set(identityObj, new ClassObj());\n  }\n  return classInstances.get(identityObj)! as T;\n}\n","/*\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport class LayoutShiftManager {\n  _onAfterProcessingUnexpectedShift?: (entry: LayoutShift) => void;\n\n  _sessionValue = 0;\n  _sessionEntries: LayoutShift[] = [];\n\n  _processEntry(entry: LayoutShift) {\n    // Only count layout shifts without recent user input.\n    if (entry.hadRecentInput) return;\n\n    const firstSessionEntry = this._sessionEntries[0];\n    const lastSessionEntry = this._sessionEntries.at(-1);\n\n    // If the entry occurred less than 1 second after the previous entry\n    // and less than 5 seconds after the first entry in the session,\n    // include the entry in the current session. Otherwise, start a new\n    // session.\n    if (\n      this._sessionValue &&\n      firstSessionEntry &&\n      lastSessionEntry &&\n      entry.startTime - lastSessionEntry.startTime < 1000 &&\n      entry.startTime - firstSessionEntry.startTime < 5000\n    ) {\n      this._sessionValue += entry.value;\n      this._sessionEntries.push(entry);\n    } else {\n      this._sessionValue = entry.value;\n      this._sessionEntries = [entry];\n    }\n\n    this._onAfterProcessingUnexpectedShift?.(entry);\n  }\n}\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\ninterface PerformanceEntryMap {\n  'event': PerformanceEventTiming[];\n  'first-input': PerformanceEventTiming[];\n  'interaction-contentful-paint': InteractionContentfulPaint[];\n  'layout-shift': LayoutShift[];\n  'largest-contentful-paint': LargestContentfulPaint[];\n  'long-animation-frame': PerformanceLongAnimationFrameTiming[];\n  'paint': PerformancePaintTiming[];\n  'navigation': PerformanceNavigationTiming[];\n  'resource': PerformanceResourceTiming[];\n  'soft-navigation': PerformanceSoftNavigation[];\n}\n\n/**\n * Takes a performance entry type and a callback function, and creates a\n * `PerformanceObserver` instance that will observe the specified entry type\n * with buffering enabled and call the callback _for each entry_.\n *\n * This function also feature-detects entry support and wraps the logic in a\n * try/catch to avoid errors in unsupporting browsers.\n */\nexport const observe = <K extends keyof PerformanceEntryMap>(\n  types: K[],\n  callback: (entries: Array<PerformanceEntryMap[K][number]>) => void,\n  opts: PerformanceObserverInit = {},\n): PerformanceObserver | undefined => {\n  try {\n    const supportedTypes = types.filter((t) =>\n      PerformanceObserver.supportedEntryTypes.includes(t),\n    );\n    if (supportedTypes.length > 0) {\n      const po = new PerformanceObserver((list) => {\n        // Delay by a microtask to workaround a bug in Safari where the\n        // callback is invoked immediately, rather than in a separate task.\n        // See: https://github.com/GoogleChrome/web-vitals/issues/277\n        queueMicrotask(() => {\n          const entries = list.getEntries();\n          // When observing more than one entry type, entries from different\n          // types can be delivered out of order, so sort by end time\n          // (startTime + duration) to ensure they're in the right order.\n          // See: https://github.com/w3c/performance-timeline/issues/224\n          if (supportedTypes.length > 1) {\n            entries.sort((a, b) => {\n              const scoreA = a.startTime + a.duration;\n              const scoreB = b.startTime + b.duration;\n\n              return scoreA - scoreB;\n            });\n          }\n          callback(entries as Array<PerformanceEntryMap[K][number]>);\n        });\n      });\n\n      for (const t of supportedTypes) {\n        po.observe({type: t, buffered: true, ...opts});\n      }\n      return po;\n    }\n  } catch {\n    // Do nothing.\n  }\n  return;\n};\n","/*\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {ReportOpts} from '../types.js';\n\nexport const checkSoftNavsEnabled = (opts?: ReportOpts) => {\n  return (\n    // Firefox has a preference to disable this, which some people use so add a guard\n    globalThis.PerformanceObserver?.supportedEntryTypes.includes(\n      'soft-navigation',\n    ) &&\n    // Older implementations expose the value as an attribute rather than the\n    // method. We only support the newer method as that was what was launched\n    // to stable unflagged.\n    typeof globalThis.PerformanceSoftNavigation?.prototype\n      ?.getLargestInteractionContentfulPaint === 'function' &&\n    opts &&\n    opts.reportSoftNavs\n  );\n};\n\n// Stores a soft navigation entry keyed by its navigationId, keeping only\n// the 2 most recent entries so the map cannot grow unbounded.\nexport const storeSoftNavEntry = (\n  map: Map<number, PerformanceSoftNavigation>,\n  entry: PerformanceSoftNavigation,\n) => {\n  map.set(entry.navigationId!, entry);\n\n  // Clean up older entries to prevent memory leaks, keeping only\n  // the 2 most recent entries.\n  if (map.size > 2) {\n    const firstKey = map.keys().next().value;\n    if (firstKey !== undefined) {\n      map.delete(firstKey);\n    }\n  }\n};\n","/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const runOnce = (cb: () => void) => {\n  let called = false;\n  return () => {\n    if (!called) {\n      cb();\n      called = true;\n    }\n  };\n};\n","/*\n * Copyright 2026 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport class FCPEntryManager {\n  _softNavigationEntryMap?: Map<number, PerformanceSoftNavigation>;\n}\n","/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const whenActivated = (callback: () => void) => {\n  if (document.prerendering) {\n    addEventListener('prerenderingchange', callback, true);\n  } else {\n    callback();\n  }\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {bindReporter} from './lib/bindReporter.js';\nimport {checkSoftNavsEnabled, storeSoftNavEntry} from './lib/softNavs.js';\nimport {doubleRAF} from './lib/doubleRAF.js';\nimport {getActivationStart} from './lib/getActivationStart.js';\nimport {getVisibilityWatcher} from './lib/getVisibilityWatcher.js';\nimport {initMetric} from './lib/initMetric.js';\nimport {initUnique} from './lib/initUnique.js';\nimport {FCPEntryManager} from './lib/FCPEntryManager.js';\nimport {observe} from './lib/observe.js';\nimport {getBFCacheRestoreTime, onBFCacheRestore} from './lib/bfcache.js';\nimport {whenActivated} from './lib/whenActivated.js';\nimport type {FCPMetric, MetricRatingThresholds, ReportOpts} from './types.js';\n\n/** Thresholds for FCP. See https://web.dev/articles/fcp#what_is_a_good_fcp_score */\nexport const FCPThresholds: MetricRatingThresholds = [1800, 3000];\n\n/**\n * Calculates the [FCP](https://web.dev/articles/fcp) value for the current page and\n * calls the `callback` function once the value is ready, along with the\n * relevant `paint` performance entry used to determine the value. The reported\n * value is a `DOMHighResTimeStamp`.\n */\nexport const onFCP = (\n  onReport: (metric: FCPMetric) => void,\n  opts: ReportOpts = {},\n) => {\n  const softNavsEnabled = checkSoftNavsEnabled(opts);\n\n  whenActivated(() => {\n    // Create a new FCP entry manager for each page activation\n    // This allows us to track soft navigations separately\n    // needed when attribution is enabled.\n    const fcpEntryManager = initUnique(opts, FCPEntryManager);\n    const visibilityWatcher = getVisibilityWatcher();\n    let metric = initMetric('FCP');\n    let report: ReturnType<typeof bindReporter>;\n\n    const handleEntries = (entries: FCPMetric['entries']) => {\n      for (const entry of entries) {\n        if (entry.name === 'first-contentful-paint') {\n          po!.disconnect();\n\n          // Only report if the page wasn't hidden prior to FCP.\n          if (entry.startTime < visibilityWatcher.firstHiddenTime) {\n            // The activationStart reference is used because FCP should be\n            // relative to page activation rather than navigation start if the\n            // page was prerendered. But in cases where `activationStart` occurs\n            // after the FCP, this time should be clamped at 0.\n            metric.value = Math.max(entry.startTime - getActivationStart(), 0);\n            metric.entries.push(entry);\n            metric.navigationId = entry.navigationId || metric.navigationId;\n            // FCP should only be reported once so can report right away\n            report(true);\n          }\n        }\n      }\n    };\n\n    const po = observe(['paint'], handleEntries);\n\n    if (po) {\n      report = bindReporter(\n        onReport,\n        metric,\n        FCPThresholds,\n        opts.reportAllChanges,\n      );\n\n      // Only report after a bfcache restore if the `PerformanceObserver`\n      // successfully registered or the `paint` entry exists.\n      onBFCacheRestore((event) => {\n        metric = initMetric(\n          'FCP',\n          -1,\n          'back-forward-cache',\n          metric.navigationId,\n          metric.navigationInteractionId,\n          metric.navigationURL,\n          getBFCacheRestoreTime(),\n        );\n        report = bindReporter(\n          onReport,\n          metric,\n          FCPThresholds,\n          opts.reportAllChanges,\n        );\n\n        doubleRAF(() => {\n          metric.value = performance.now() - event.timeStamp;\n          report(true);\n        });\n      });\n    }\n\n    if (softNavsEnabled) {\n      // As first-contentful-paint is only reported once, we can handle soft\n      // navigations afterwards on their own for simplicity, as no need to\n      // observe both and sort the entries like for the other metrics\n      const handleSoftNavEntries = (entries: PerformanceSoftNavigation[]) => {\n        entries.forEach((entry) => {\n          // Store the soft navigation entries in the entry manager so that\n          // they can be retrieved for attribution if necessary. This code\n          // is only used when attribution is enabled which sets the\n          // _softNavigationEntryMap.\n          if (fcpEntryManager._softNavigationEntryMap && entry.navigationId) {\n            storeSoftNavEntry(fcpEntryManager._softNavigationEntryMap, entry);\n          }\n\n          // Clamp FCP at 0. It should never be less, but better safe than sorry.\n          const FCPTime = Math.max(\n            (entry.presentationTime || entry.paintTime || 0) - entry.startTime,\n            0,\n          );\n          metric = initMetric(\n            'FCP',\n            FCPTime,\n            'soft-navigation',\n            entry.navigationId,\n            entry.interactionId,\n            entry.name,\n            entry.startTime,\n          );\n          report = bindReporter(\n            onReport,\n            metric,\n            FCPThresholds,\n            opts.reportAllChanges,\n          );\n          report(true);\n        });\n      };\n      observe(['soft-navigation'], handleSoftNavEntries, opts);\n    }\n  });\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {getBFCacheRestoreTime, onBFCacheRestore} from './lib/bfcache.js';\nimport {bindReporter} from './lib/bindReporter.js';\nimport {doubleRAF} from './lib/doubleRAF.js';\nimport {getVisibilityWatcher} from './lib/getVisibilityWatcher.js';\nimport {initMetric} from './lib/initMetric.js';\nimport {initUnique} from './lib/initUnique.js';\nimport {LayoutShiftManager} from './lib/LayoutShiftManager.js';\nimport {observe} from './lib/observe.js';\nimport {checkSoftNavsEnabled} from './lib/softNavs.js';\nimport {runOnce} from './lib/runOnce.js';\nimport {onFCP} from './onFCP.js';\nimport type {\n  CLSMetric,\n  Metric,\n  MetricRatingThresholds,\n  ReportOpts,\n} from './types.js';\n\n/** Thresholds for CLS. See https://web.dev/articles/cls#what_is_a_good_cls_score */\nexport const CLSThresholds: MetricRatingThresholds = [0.1, 0.25];\n\n/**\n * Calculates the [CLS](https://web.dev/articles/cls) value for the current page and\n * calls the `callback` function once the value is ready to be reported, along\n * with all `layout-shift` performance entries that were used in the metric\n * value calculation. The reported value is a `double` (corresponding to a\n * [layout shift score](https://web.dev/articles/cls#layout_shift_score)).\n *\n * If the `reportAllChanges` configuration option is set to `true`, the\n * `callback` function will be called as soon as the value is initially\n * determined as well as any time the value changes throughout the page\n * lifespan.\n *\n * _**Important:** CLS should be continually monitored for changes throughout\n * the entire lifespan of a page—including if the user returns to the page after\n * it's been hidden/backgrounded. However, since browsers often [will not fire\n * additional callbacks once the user has backgrounded a\n * page](https://developer.chrome.com/blog/page-lifecycle-api/#advice-hidden),\n * `callback` is always called when the page's visibility state changes to\n * hidden. As a result, the `callback` function might be called multiple times\n * during the same page load._\n */\nexport const onCLS = (\n  onReport: (metric: CLSMetric) => void,\n  opts: ReportOpts = {},\n) => {\n  const visibilityWatcher = getVisibilityWatcher();\n  // Start monitoring FCP so we can only report CLS if FCP is also reported.\n  // Note: this is done to match the current behavior of CrUX.\n  onFCP(\n    runOnce(() => {\n      let metric = initMetric('CLS', 0);\n      let report: ReturnType<typeof bindReporter>;\n\n      const layoutShiftManager = initUnique(opts, LayoutShiftManager);\n\n      const initNewCLSMetric = (\n        navigationType?: Metric['navigationType'],\n        navigationId?: number,\n        navigationInteractionId?: number,\n        navigationURL?: string,\n        navigationStartTime?: number,\n      ) => {\n        metric = initMetric(\n          'CLS',\n          0,\n          navigationType,\n          navigationId,\n          navigationInteractionId,\n          navigationURL,\n          navigationStartTime,\n        );\n        layoutShiftManager._sessionValue = 0;\n        report = bindReporter(\n          onReport,\n          metric,\n          CLSThresholds,\n          opts.reportAllChanges,\n        );\n      };\n\n      const updateAndReportMetric = (forceReport: boolean = false) => {\n        // If the current session value is larger than the current CLS value,\n        // update CLS and the entries contributing to it.\n        if (layoutShiftManager._sessionValue > metric.value) {\n          metric.value = layoutShiftManager._sessionValue;\n          metric.entries = layoutShiftManager._sessionEntries;\n        }\n        report(forceReport);\n      };\n\n      const handleSoftNavEntry = (entry: PerformanceSoftNavigation) => {\n        updateAndReportMetric(true);\n        initNewCLSMetric(\n          'soft-navigation',\n          entry.navigationId,\n          entry.interactionId,\n          entry.name,\n          entry.startTime,\n        );\n      };\n\n      const handleEntries = (\n        entries: (LayoutShift | PerformanceSoftNavigation)[],\n      ) => {\n        for (const entry of entries) {\n          if (entry.entryType === 'soft-navigation') {\n            handleSoftNavEntry(entry as PerformanceSoftNavigation);\n            continue;\n          }\n          layoutShiftManager._processEntry(entry as LayoutShift);\n        }\n\n        updateAndReportMetric();\n      };\n\n      const types = ['layout-shift'] as ('layout-shift' | 'soft-navigation')[];\n      if (checkSoftNavsEnabled(opts)) {\n        types.push('soft-navigation');\n      }\n      const po = observe(types, handleEntries);\n      if (po) {\n        report = bindReporter(\n          onReport,\n          metric,\n          CLSThresholds,\n          opts.reportAllChanges,\n        );\n\n        visibilityWatcher.onHidden(() => {\n          handleEntries(\n            po.takeRecords() as [LayoutShift | PerformanceSoftNavigation],\n          );\n          report(true);\n        });\n\n        // Only report after a bfcache restore if the `PerformanceObserver`\n        // successfully registered.\n        onBFCacheRestore(() => {\n          initNewCLSMetric(\n            'back-forward-cache',\n            metric.navigationId,\n            metric.navigationInteractionId,\n            metric.navigationURL,\n            getBFCacheRestoreTime(),\n          );\n\n          doubleRAF(report);\n        });\n\n        // Queue a task to report (if nothing else triggers a report first).\n        // This allows CLS to be reported as soon as FCP fires when\n        // `reportAllChanges` is true.\n        setTimeout(report);\n      }\n    }),\n  );\n};\n","/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {observe} from '../observe.js';\n\ndeclare global {\n  interface Performance {\n    readonly interactionCount: number;\n  }\n}\n\nlet interactionCountEstimate = 0;\nlet minKnownInteractionId = Infinity;\nlet maxKnownInteractionId = 0;\n\nconst updateEstimate = (entries: PerformanceEventTiming[]) => {\n  for (const entry of entries) {\n    if (entry.interactionId) {\n      minKnownInteractionId = Math.min(\n        minKnownInteractionId,\n        entry.interactionId,\n      );\n      maxKnownInteractionId = Math.max(\n        maxKnownInteractionId,\n        entry.interactionId,\n      );\n\n      interactionCountEstimate = maxKnownInteractionId\n        ? (maxKnownInteractionId - minKnownInteractionId) / 7 + 1\n        : 0;\n    }\n  }\n};\n\nlet po: PerformanceObserver | undefined;\n\n/**\n * Returns the `interactionCount` value using the native API (if available)\n * or the polyfill estimate in this module.\n */\nexport const getInteractionCount = () => {\n  return po ? interactionCountEstimate : (performance.interactionCount ?? 0);\n};\n\n/**\n * Feature detects native support or initializes the polyfill if needed.\n */\nexport const initInteractionCountPolyfill = () => {\n  if ('interactionCount' in performance || po) return;\n\n  po = observe(['event'], updateEstimate, {\n    durationThreshold: 0,\n  } as PerformanceObserverInit);\n};\n","/*\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {getInteractionCount} from './polyfills/interactionCountPolyfill.js';\nimport type {Metric} from '../types.js';\n\nexport interface Interaction {\n  _latency: number;\n  // While the `id` and `entries` properties are also internal and could be\n  // mangled by prefixing with an underscore, since they correspond to public\n  // symbols there is no need to mangle them as the library will compress\n  // better if we reuse the existing names.\n  id: number;\n  entries: PerformanceEventTiming[];\n}\n\n// To prevent unnecessary memory usage on pages with lots of interactions,\n// store at most 10 of the longest interactions to consider as INP candidates.\nconst MAX_INTERACTIONS_TO_CONSIDER = 10;\n\nexport class InteractionManager {\n  /**\n   * The interaction count at the start of the current navigation, so p98\n   * interaction latencies only consider interactions since then.\n   *\n   * This is per-instance rather than module state: `initUnique()` gives every\n   * `onINP()` call its own manager, and a shared counter would let whichever\n   * instance resets first hide the interactions from all the others.\n   */\n  _prevInteractionCount = 0;\n  /**\n   * A list of longest interactions on the page (by latency) sorted so the\n   * longest one is first. The list is at most MAX_INTERACTIONS_TO_CONSIDER\n   * long.\n   */\n  _longestInteractionList: Interaction[] = [];\n\n  /**\n   * A mapping of longest interactions by their interaction ID.\n   * This is used for faster lookup.\n   */\n  _longestInteractionMap: Map<number, Interaction> = new Map();\n\n  _onBeforeProcessingEntry?: (entry: PerformanceEventTiming) => void;\n\n  _onAfterProcessingINPCandidate?: (interaction: Interaction) => void;\n\n  /**\n   * Returns the interaction count since the start of the current navigation\n   * (or the full page lifecycle if there were no soft navs / bfcache restores).\n   */\n  _getInteractionCountForNavigation() {\n    return getInteractionCount() - this._prevInteractionCount;\n  }\n\n  _resetInteractions() {\n    this._prevInteractionCount = getInteractionCount();\n    this._longestInteractionList.length = 0;\n    this._longestInteractionMap.clear();\n  }\n\n  /**\n   * Returns the estimated p98 longest interaction based on the stored\n   * interaction candidates and the interaction count for the current page.\n   */\n  _estimateP98LongestInteraction(navigationType: Metric['navigationType']) {\n    const interactionCountForNavigation =\n      this._getInteractionCountForNavigation();\n    const candidateInteractionIndex = Math.min(\n      this._longestInteractionList.length - 1,\n      Math.floor(interactionCountForNavigation / 50),\n    );\n\n    // If we have a non-zero interactionCountForNavigation but no\n    // candidateInteractionIndex, then it's below the 16ms limit\n    // so report a dummy 8ms interaction. This is only needed for\n    // soft-navs and bfcache restores as `first-input` handles the\n    // rest.\n    if (\n      interactionCountForNavigation &&\n      candidateInteractionIndex === -1 &&\n      (navigationType === 'soft-navigation' ||\n        navigationType === 'back-forward-cache')\n    ) {\n      return {\n        _latency: 8,\n        id: -1,\n        entries: [],\n      };\n    }\n\n    return this._longestInteractionList[candidateInteractionIndex];\n  }\n\n  /**\n   * Takes a performance entry and adds it to the list of worst interactions\n   * if its duration is long enough to make it among the worst. If the\n   * entry is part of an existing interaction, it is merged and the latency\n   * and entries list is updated as needed.\n   */\n  _processEntry(entry: PerformanceEventTiming) {\n    this._onBeforeProcessingEntry?.(entry);\n\n    // Skip further processing for entries that cannot be INP candidates.\n    if (!(entry.interactionId || entry.entryType === 'first-input')) return;\n\n    // The least-long of the 10 longest interactions.\n    const minLongestInteraction = this._longestInteractionList.at(-1);\n\n    let interaction = this._longestInteractionMap.get(entry.interactionId!);\n\n    // Only process the entry if it's possibly one of the ten longest,\n    // or if it's part of an existing interaction.\n    if (\n      interaction ||\n      this._longestInteractionList.length < MAX_INTERACTIONS_TO_CONSIDER ||\n      // If the above conditions are false, `minLongestInteraction` will be set.\n      entry.duration > minLongestInteraction!._latency\n    ) {\n      // If the interaction already exists, update it. Otherwise create one.\n      if (interaction) {\n        // If the new entry has a longer duration, replace the old entries,\n        // otherwise add to the array.\n        if (entry.duration > interaction._latency) {\n          interaction.entries = [entry];\n          interaction._latency = entry.duration;\n        } else if (\n          entry.duration === interaction._latency &&\n          entry.startTime === interaction.entries[0].startTime\n        ) {\n          interaction.entries.push(entry);\n        }\n      } else {\n        interaction = {\n          id: entry.interactionId!,\n          entries: [entry],\n          _latency: entry.duration,\n        };\n        this._longestInteractionMap.set(interaction.id, interaction);\n        this._longestInteractionList.push(interaction);\n      }\n\n      // Sort the entries by latency (descending) and keep only the top ten.\n      this._longestInteractionList.sort((a, b) => b._latency - a._latency);\n      if (this._longestInteractionList.length > MAX_INTERACTIONS_TO_CONSIDER) {\n        const removedInteractions = this._longestInteractionList.splice(\n          MAX_INTERACTIONS_TO_CONSIDER,\n        );\n\n        for (const interaction of removedInteractions) {\n          this._longestInteractionMap.delete(interaction.id);\n        }\n      }\n\n      // Call any post-processing on the interaction\n      this._onAfterProcessingINPCandidate?.(interaction);\n    }\n  }\n}\n","/*\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {runOnce} from './runOnce.js';\n\n/**\n * Runs the passed callback during the next idle period, or immediately\n * if the browser's visibility state is (or becomes) hidden.\n */\nexport const whenIdleOrHidden = (cb: () => void) => {\n  // Cap the requestIdleCallback to 1 sec for very busy apps\n  // https://github.com/GoogleChrome/web-vitals/issues/754\n  // If not using rIC, then the setTimeout timeout should be 0\n  const timeout = 'requestIdleCallback' in globalThis ? 1000 : 0;\n\n  const rIC = globalThis.requestIdleCallback || setTimeout;\n  const cIC = globalThis.cancelIdleCallback || clearTimeout;\n\n  // If the document is hidden, run the callback immediately, otherwise\n  // race an idle callback with the next `visibilitychange` event.\n  if (document.visibilityState === 'hidden') {\n    cb();\n  } else {\n    const wrappedCb = runOnce(cb);\n\n    let idleHandle = -1;\n    const onHidden = () => {\n      cIC(idleHandle);\n      wrappedCb();\n    };\n\n    addEventListener('visibilitychange', onHidden, {once: true, capture: true});\n    idleHandle = rIC(\n      () => {\n        removeEventListener('visibilitychange', onHidden, {capture: true});\n        wrappedCb();\n      },\n      {timeout: timeout},\n    );\n  }\n};\n","/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {getBFCacheRestoreTime, onBFCacheRestore} from './lib/bfcache.js';\nimport {bindReporter} from './lib/bindReporter.js';\nimport {initMetric} from './lib/initMetric.js';\nimport {initUnique} from './lib/initUnique.js';\nimport {InteractionManager} from './lib/InteractionManager.js';\nimport {observe} from './lib/observe.js';\nimport {checkSoftNavsEnabled} from './lib/softNavs.js';\nimport {initInteractionCountPolyfill} from './lib/polyfills/interactionCountPolyfill.js';\nimport {whenActivated} from './lib/whenActivated.js';\nimport {getVisibilityWatcher} from './lib/getVisibilityWatcher.js';\nimport {whenIdleOrHidden} from './lib/whenIdleOrHidden.js';\n\nimport type {\n  INPMetric,\n  Metric,\n  MetricRatingThresholds,\n  INPReportOpts,\n} from './types.js';\n\n/** Thresholds for INP. See https://web.dev/articles/inp#what_is_a_good_inp_score */\nexport const INPThresholds: MetricRatingThresholds = [200, 500];\n\n// The default `durationThreshold` used across this library for observing\n// `event` entries via PerformanceObserver.\n// Event Timing entries have their durations rounded to the nearest 8ms,\n// so a duration of 40ms would be any event that spans 2.5 or more frames\n// at 60Hz. This threshold is chosen to strike a balance between usefulness\n// and performance. Running this callback for any interaction that spans\n// just one or two frames is likely not worth the insight that could be\n// gained.\nconst DEFAULT_DURATION_THRESHOLD = 40;\n\n/**\n * Calculates the [INP](https://web.dev/articles/inp) value for the current\n * page and calls the `callback` function once the value is ready, along with\n * the `event` performance entries reported for that interaction. The reported\n * value is a `DOMHighResTimeStamp`.\n *\n * A custom `durationThreshold` configuration option can optionally be passed\n * to control what `event-timing` entries are considered for INP reporting. The\n * default threshold is `40`, which means INP scores of less than 40 will not\n * be reported. To avoid reporting no interactions in these cases, the library\n * will fall back to the input delay of the first interaction. Note that this\n * will not affect your 75th percentile INP value unless that value is also\n * less than 40 (well below the recommended\n * [good](https://web.dev/articles/inp#what_is_a_good_inp_score) threshold).\n *\n * If the `reportAllChanges` configuration option is set to `true`, the\n * `callback` function will be called as soon as the value is initially\n * determined as well as any time the value changes throughout the page\n * lifespan.\n *\n * _**Important:** INP should be continually monitored for changes throughout\n * the entire lifespan of a page—including if the user returns to the page after\n * it's been hidden/backgrounded. However, since browsers often [will not fire\n * additional callbacks once the user has backgrounded a\n * page](https://developer.chrome.com/blog/page-lifecycle-api/#advice-hidden),\n * `callback` is always called when the page's visibility state changes to\n * hidden. As a result, the `callback` function might be called multiple times\n * during the same page load._\n */\nexport const onINP = (\n  onReport: (metric: INPMetric) => void,\n  opts: INPReportOpts = {},\n) => {\n  // Return if the browser doesn't support all APIs needed to measure INP.\n  if (!(\n    globalThis.PerformanceEventTiming &&\n    'interactionId' in PerformanceEventTiming.prototype\n  )) {\n    return;\n  }\n\n  const visibilityWatcher = getVisibilityWatcher();\n\n  whenActivated(() => {\n    // TODO(philipwalton): remove once the polyfill is no longer needed.\n    initInteractionCountPolyfill();\n\n    let metric = initMetric('INP');\n    let report: ReturnType<typeof bindReporter>;\n\n    const interactionManager = initUnique(opts, InteractionManager);\n\n    const initNewINPMetric = (\n      navigationType?: Metric['navigationType'],\n      navigationId?: number,\n      navigationInteractionId?: number,\n      navigationURL?: string,\n      navigationStartTime?: number,\n    ) => {\n      interactionManager._resetInteractions();\n      metric = initMetric(\n        'INP',\n        -1,\n        navigationType,\n        navigationId,\n        navigationInteractionId,\n        navigationURL,\n        navigationStartTime,\n      );\n      report = bindReporter(\n        onReport,\n        metric,\n        INPThresholds,\n        opts.reportAllChanges,\n      );\n    };\n\n    const updateINPMetric = () => {\n      const inp = interactionManager._estimateP98LongestInteraction(\n        metric.navigationType,\n      );\n\n      if (inp && inp._latency !== metric.value) {\n        metric.value = inp._latency;\n        metric.entries = inp.entries;\n        report();\n      }\n    };\n\n    const handleSoftNavEntry = (entry: PerformanceSoftNavigation) => {\n      updateINPMetric();\n      report(true);\n      initNewINPMetric(\n        'soft-navigation',\n        entry.navigationId,\n        entry.interactionId,\n        entry.name,\n        entry.startTime,\n      );\n    };\n\n    const handleEntries = (\n      entries: (PerformanceEventTiming | PerformanceSoftNavigation)[],\n      forceReport: boolean = false,\n    ) => {\n      // Queue the `handleEntries()` callback in the next idle task.\n      // This is needed to increase the chances that all event entries that\n      // occurred between the user interaction and the next paint\n      // have been dispatched. Note: there is currently an experiment\n      // running in Chrome (EventTimingKeypressAndCompositionInteractionId)\n      // 123+ that if rolled out fully may make this no longer necessary.\n      whenIdleOrHidden(() => {\n        for (const entry of entries) {\n          if (entry.entryType === 'soft-navigation') {\n            handleSoftNavEntry(entry as PerformanceSoftNavigation);\n            continue;\n          }\n          interactionManager._processEntry(entry as PerformanceEventTiming);\n        }\n        updateINPMetric();\n        if (forceReport) {\n          report(true);\n        }\n      });\n    };\n\n    const types = ['event', 'first-input'] as (\n      'event' | 'first-input' | 'soft-navigation'\n    )[];\n    if (checkSoftNavsEnabled(opts)) {\n      types.push('soft-navigation');\n    }\n    const po = observe(types, handleEntries, {\n      ...opts,\n      durationThreshold: opts.durationThreshold ?? DEFAULT_DURATION_THRESHOLD,\n    } as PerformanceObserverInit);\n\n    report = bindReporter(\n      onReport,\n      metric,\n      INPThresholds,\n      opts.reportAllChanges,\n    );\n\n    if (po) {\n      visibilityWatcher.onHidden(() => {\n        handleEntries(\n          po.takeRecords() as [\n            PerformanceEventTiming | PerformanceSoftNavigation,\n          ],\n          true, // forceReport after processing all entries\n        );\n      });\n\n      // Only report after a bfcache restore if the `PerformanceObserver`\n      // successfully registered.\n      onBFCacheRestore(() => {\n        initNewINPMetric(\n          'back-forward-cache',\n          metric.navigationId,\n          metric.navigationInteractionId,\n          metric.navigationURL,\n          getBFCacheRestoreTime(),\n        );\n      });\n    }\n  });\n};\n","/*\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport class LCPEntryManager {\n  _onBeforeProcessingEntry?: (entry: LargestContentfulPaint) => void;\n  _softNavigationEntryMap?: Map<number, PerformanceSoftNavigation>;\n\n  _processEntry(entry: LargestContentfulPaint) {\n    this._onBeforeProcessingEntry?.(entry);\n  }\n}\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {LCPEntryManager} from './lib/LCPEntryManager.js';\nimport {getBFCacheRestoreTime, onBFCacheRestore} from './lib/bfcache.js';\nimport {bindReporter} from './lib/bindReporter.js';\nimport {doubleRAF} from './lib/doubleRAF.js';\nimport {getActivationStart} from './lib/getActivationStart.js';\nimport {checkSoftNavsEnabled, storeSoftNavEntry} from './lib/softNavs.js';\nimport {getVisibilityWatcher} from './lib/getVisibilityWatcher.js';\nimport {initMetric} from './lib/initMetric.js';\nimport {initUnique} from './lib/initUnique.js';\nimport {observe} from './lib/observe.js';\nimport {whenActivated} from './lib/whenActivated.js';\nimport {whenIdleOrHidden} from './lib/whenIdleOrHidden.js';\nimport type {\n  LCPMetric,\n  Metric,\n  MetricRatingThresholds,\n  ReportOpts,\n} from './types.js';\n\n/** Thresholds for LCP. See https://web.dev/articles/lcp#what_is_a_good_lcp_score */\nexport const LCPThresholds: MetricRatingThresholds = [2500, 4000];\n\n/**\n * Calculates the [LCP](https://web.dev/articles/lcp) value for the current page and\n * calls the `callback` function once the value is ready (along with the\n * relevant `largest-contentful-paint` performance entry used to determine the\n * value). The reported value is a `DOMHighResTimeStamp`.\n *\n * If the `reportAllChanges` configuration option is set to `true`, the\n * `callback` function will be called any time a new `largest-contentful-paint`\n * performance entry is dispatched, or once the final value of the metric has\n * been determined.\n */\nexport const onLCP = (\n  onReport: (metric: LCPMetric) => void,\n  opts: ReportOpts = {},\n) => {\n  // As InteractionContentfulPaint entries used by soft navs can emit after\n  // LCP is finalized, we need a flag to know to ignore them.\n  let isFinalized = false;\n  const softNavsEnabled = checkSoftNavsEnabled(opts);\n\n  whenActivated(() => {\n    let visibilityWatcher = getVisibilityWatcher();\n    let metric = initMetric('LCP');\n    let report: ReturnType<typeof bindReporter>;\n\n    const lcpEntryManager = initUnique(opts, LCPEntryManager);\n\n    const initNewLCPMetric = (\n      navigation?: Metric['navigationType'],\n      navigationId?: number,\n      navigationInteractionId?: number,\n      navigationURL?: string,\n      navigationStartTime?: number,\n    ) => {\n      metric = initMetric(\n        'LCP',\n        -1,\n        navigation,\n        navigationId,\n        navigationInteractionId,\n        navigationURL,\n        navigationStartTime,\n      );\n      report = bindReporter(\n        onReport,\n        metric,\n        LCPThresholds,\n        opts.reportAllChanges,\n      );\n      // Reset the finalized flag\n      isFinalized = false;\n      // If it's a soft nav, then need to reset the visibilityWatcher\n      if (navigation === 'soft-navigation') {\n        visibilityWatcher = getVisibilityWatcher(true);\n      }\n    };\n\n    const handleSoftNavEntry = (entry: PerformanceSoftNavigation) => {\n      if (lcpEntryManager._softNavigationEntryMap && entry.navigationId) {\n        storeSoftNavEntry(lcpEntryManager._softNavigationEntryMap, entry);\n      }\n\n      if (!isFinalized) report(true);\n      initNewLCPMetric(\n        'soft-navigation',\n        entry.navigationId,\n        entry.interactionId,\n        entry.name,\n        entry.startTime,\n      );\n      // Soft Navs should contain the largest paint until now, so handle that\n      // as if it just happened, then listen for more.\n      // It can however be null in rare circumstances\n      // (see https://github.com/GoogleChrome/web-vitals/issues/725)\n      const largestInteractionContentfulPaint =\n        entry.getLargestInteractionContentfulPaint?.();\n      if (largestInteractionContentfulPaint) {\n        handleEntries([largestInteractionContentfulPaint]);\n      }\n    };\n\n    const handleEntries = (\n      entries: (\n        | LargestContentfulPaint\n        | InteractionContentfulPaint\n        | PerformanceSoftNavigation\n      )[],\n    ) => {\n      // If reportAllChanges is set or soft navs is enabled then call this\n      // function for each entry, otherwise only consider the last one.\n      if (!opts.reportAllChanges && !softNavsEnabled) {\n        entries = entries.slice(-1);\n      }\n\n      for (const entry of entries) {\n        if (!entry) continue;\n\n        if (entry.entryType === 'soft-navigation') {\n          handleSoftNavEntry(entry as PerformanceSoftNavigation);\n          continue;\n        }\n\n        let value = 0;\n        let metricEntries: LargestContentfulPaint[] = [];\n        let renderTime = entry.startTime;\n        if (entry.entryType === 'largest-contentful-paint') {\n          // The startTime attribute returns the value of the renderTime if it is\n          // not 0, and the value of the loadTime otherwise. The activationStart\n          // reference is used because LCP should be relative to page activation\n          // rather than navigation start if the page was prerendered. But in cases\n          // where `activationStart` occurs after the LCP, this time should be\n          // clamped at 0.\n          value = Math.max(entry.startTime - getActivationStart(), 0);\n\n          lcpEntryManager._processEntry(entry as LargestContentfulPaint);\n          metricEntries = [entry as LargestContentfulPaint];\n        } else if (entry.entryType === 'interaction-contentful-paint') {\n          const ICPEntry = entry as InteractionContentfulPaint;\n          // InteractionContentfulPaints should only happen after a\n          // PerformanceSoftNavigation so the metric should have been set\n          // with a non-zero navigationId mapping to a soft nav.\n          if (!metric.navigationId) continue;\n\n          // Ignore interactions not for this soft nav\n          // (either paints that have bled into this interaction or paints when\n          // we should have already finalized)\n          if (\n            'interactionId' in ICPEntry &&\n            ICPEntry.interactionId != metric.navigationInteractionId\n          ) {\n            continue;\n          }\n\n          renderTime = ICPEntry.largestContentfulPaint?.renderTime || 0;\n\n          // Paints should never be less than 0 but add cap just in case\n          value = Math.max(renderTime - entry.startTime, 0);\n\n          if (ICPEntry.largestContentfulPaint) {\n            lcpEntryManager._processEntry(ICPEntry.largestContentfulPaint);\n            metricEntries = [ICPEntry.largestContentfulPaint];\n          }\n        }\n\n        // Only report if the page wasn't hidden prior to LCP.\n        if (renderTime < visibilityWatcher.firstHiddenTime) {\n          metric.value = value;\n          metric.entries = metricEntries;\n          report();\n        }\n      }\n    };\n\n    const types = ['largest-contentful-paint'] as (\n      | 'largest-contentful-paint'\n      | 'interaction-contentful-paint'\n      | 'soft-navigation'\n    )[];\n    if (softNavsEnabled) {\n      types.push('interaction-contentful-paint', 'soft-navigation');\n    }\n    const po = observe(types, handleEntries);\n\n    if (po) {\n      report = bindReporter(\n        onReport,\n        metric,\n        LCPThresholds,\n        opts.reportAllChanges,\n      );\n\n      const finalizeEventTypes = ['keydown', 'click', 'visibilitychange'];\n\n      const finalizeLCP = (event: Event) => {\n        if (event.isTrusted && !isFinalized) {\n          // Wrap the listener in an idle callback so it's run in a separate\n          // task to reduce potential INP impact.\n          // https://github.com/GoogleChrome/web-vitals/issues/383\n          const metricIdToFinalize = metric.id;\n          whenIdleOrHidden(() => {\n            if (!isFinalized) {\n              if (!softNavsEnabled) {\n                // Do some clean up since these won't be needed anymore.\n                po!.disconnect();\n                for (const type of finalizeEventTypes) {\n                  removeEventListener(type, finalizeLCP, {capture: true});\n                }\n              }\n              // As this is in a whenIdleOrHidden check, whether we're still\n              // on the metric you meant to finalize, and ignore if we've moved\n              // on in the meantime.\n              if (metricIdToFinalize === metric.id) {\n                isFinalized = true;\n                report(true);\n              }\n            }\n          });\n        }\n      };\n\n      // Finalize the current LCP after input or visibilitychange.\n      // Although the browser will automatically stop emitting entries in these\n      // cases, we don't know it's finalized, so we track to allow early report.\n      // Note: while scrolling is an input that stops LCP observation, it's\n      // unreliable since it can be programmatically generated.\n      // See: https://github.com/GoogleChrome/web-vitals/issues/75\n      for (const type of finalizeEventTypes) {\n        addEventListener(type, finalizeLCP, {\n          capture: true,\n        });\n      }\n\n      // Only report after a bfcache restore if the `PerformanceObserver`\n      // successfully registered.\n      onBFCacheRestore((event) => {\n        initNewLCPMetric(\n          'back-forward-cache',\n          metric.navigationId,\n          metric.navigationInteractionId,\n          metric.navigationURL,\n          getBFCacheRestoreTime(),\n        );\n        report = bindReporter(\n          onReport,\n          metric,\n          LCPThresholds,\n          opts.reportAllChanges,\n        );\n\n        doubleRAF(() => {\n          metric.value = performance.now() - event.timeStamp;\n          isFinalized = true;\n          report(true);\n        });\n      });\n    }\n  });\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {bindReporter} from './lib/bindReporter.js';\nimport {checkSoftNavsEnabled} from './lib/softNavs.js';\nimport {getNavigationEntry} from './lib/getNavigationEntry.js';\nimport {getActivationStart} from './lib/getActivationStart.js';\nimport {initMetric} from './lib/initMetric.js';\nimport {observe} from './lib/observe.js';\nimport {getBFCacheRestoreTime, onBFCacheRestore} from './lib/bfcache.js';\nimport {whenActivated} from './lib/whenActivated.js';\nimport type {MetricRatingThresholds, ReportOpts, TTFBMetric} from './types.js';\n\n/** Thresholds for TTFB. See https://web.dev/articles/ttfb#what_is_a_good_ttfb_score */\nexport const TTFBThresholds: MetricRatingThresholds = [800, 1800];\n\n/**\n * Runs in the next task after the page is done loading and/or prerendering.\n * @param callback\n */\nconst whenReady = (callback: () => void) => {\n  if (document.prerendering) {\n    whenActivated(() => whenReady(callback));\n  } else if (document.readyState !== 'complete') {\n    addEventListener('load', () => whenReady(callback), true);\n  } else {\n    // Queue a task so the callback runs after `loadEventEnd`.\n    setTimeout(callback);\n  }\n};\n\n/**\n * Calculates the [TTFB](https://web.dev/articles/ttfb) value for the\n * current page and calls the `callback` function once the page has loaded,\n * along with the relevant `navigation` performance entry used to determine the\n * value. The reported value is a `DOMHighResTimeStamp`.\n *\n * Note, this function waits until after the page is loaded to call `callback`\n * in order to ensure all properties of the `navigation` entry are populated.\n * This is useful if you want to report on other metrics exposed by the\n * [Navigation Timing API](https://w3c.github.io/navigation-timing/). For\n * example, the TTFB metric starts from the page's [time\n * origin](https://www.w3.org/TR/hr-time-2/#sec-time-origin), which means it\n * includes time spent on DNS lookup, connection negotiation, network latency,\n * and server processing time.\n */\nexport const onTTFB = (\n  onReport: (metric: TTFBMetric) => void,\n  opts: ReportOpts = {},\n) => {\n  const softNavsEnabled = checkSoftNavsEnabled(opts);\n\n  let metric = initMetric('TTFB');\n  let report = bindReporter(\n    onReport,\n    metric,\n    TTFBThresholds,\n    opts.reportAllChanges,\n  );\n\n  whenReady(() => {\n    const hardNavEntry = getNavigationEntry();\n    if (hardNavEntry) {\n      const responseStart = hardNavEntry.responseStart;\n      // The activationStart reference is used because TTFB should be\n      // relative to page activation rather than navigation start if the\n      // page was prerendered. But in cases where `activationStart` occurs\n      // after the first byte is received, this time should be clamped at 0.\n      metric.value = Math.max(responseStart - getActivationStart(), 0);\n\n      metric.entries = [hardNavEntry];\n      report(true);\n\n      // Only report TTFB after bfcache restores if a `navigation` entry\n      // was reported for the initial load.\n      onBFCacheRestore(() => {\n        metric = initMetric(\n          'TTFB',\n          0,\n          'back-forward-cache',\n          metric.navigationId,\n          metric.navigationInteractionId,\n          metric.navigationURL,\n          getBFCacheRestoreTime(),\n        );\n        report = bindReporter(\n          onReport,\n          metric,\n          TTFBThresholds,\n          opts.reportAllChanges,\n        );\n\n        report(true);\n      });\n\n      // Listen for soft-navigation entries and emit a dummy 0 TTFB entry\n      if (softNavsEnabled) {\n        const reportSoftNavTTFBs = (entries: PerformanceSoftNavigation[]) => {\n          entries.forEach((entry) => {\n            if (entry.navigationId) {\n              metric = initMetric(\n                'TTFB',\n                0,\n                'soft-navigation',\n                entry.navigationId,\n                entry.interactionId,\n                entry.name,\n                entry.startTime,\n              );\n              metric.entries = [entry];\n              report = bindReporter(\n                onReport,\n                metric,\n                TTFBThresholds,\n                opts.reportAllChanges,\n              );\n              report(true);\n            }\n          });\n        };\n        observe(['soft-navigation'], reportSoftNavTTFBs, opts);\n      }\n    }\n  });\n};\n","// Costruzione del payload di una misura Web Vital per `POST …/web_vitals`\n// (CYJS-12, esteso a TTFB e FCP in CYJS-28). Campi snake_case come il resto del\n// contratto wire, gemello di `pageviews.ts`: nessun segnale identificante nel\n// body — la misura è (metrica, valore, pagina), IP e User-Agent li ricava il\n// server dalla richiesta.\n// `path` è sempre privo di query string e frammento, come per le pageview.\n//\n// L'`esito` (good/needs-improvement/poor) NON viaggia: lo calcola il backend\n// dalle soglie ufficiali. Mandarlo significherebbe duplicare qui quelle soglie e\n// lasciare che sia il misurato a darsi il voto — un SDK vecchio dipingerebbe di\n// verde quello che oggi è rosso.\n//\n// Assume un contesto browser (l'unico chiamante, l'integrazione web vitals, gira\n// solo lì): niente guardie non-browser, sarebbe codice morto.\n\nimport { uuidV4 } from './uuid'\n\n/// Le metriche raccolte. I tre Core Web Vitals con cui Google giudica un sito —\n/// caricamento percepito (LCP), stabilità del layout (CLS), reattività alle\n/// interazioni (INP) — più le due diagnostiche che spiegano un LCP alto: il\n/// tempo di risposta del server (TTFB) e il primo contenuto dipinto (FCP).\nexport type WebVitalName = 'lcp' | 'cls' | 'inp' | 'ttfb' | 'fcp'\n\n/// Tipi di navigazione riconosciuti dal backend. La Navigation Timing API usa\n/// `back_forward` con l'underscore: la traduzione vive in\n/// `normalizeNavigationType`, un tipo non tradotto verrebbe scartato lato server.\nconst NAVIGATION_TYPES = [\n  'navigate',\n  'reload',\n  'back-forward',\n  'prerender',\n  'restore',\n] as const\n\n/// Payload di una misura, SENZA `environment`/`release` (li aggiunge il client:\n/// è lui a conoscere la configurazione risolta). Type alias e non interfaccia:\n/// così resta assegnabile a `EventPayload` quando il client lo spedisce.\nexport type WebVitalPayload = {\n  event_id: string\n  metric: WebVitalName\n  value: number\n  hostname: string\n  path: string\n  navigation_type?: string\n  occurred_at: string\n}\n\nexport interface WebVitalInput {\n  metric: WebVitalName\n  value: number\n  /// Path della pagina misurata (default `location.pathname`). Query e frammento\n  /// sono comunque strippati.\n  path?: string | undefined\n  /// Tipo di navigazione grezzo (`PerformanceNavigationTiming.type`).\n  navigationType?: string | undefined\n}\n\n/// Costruisce la misura dalla location corrente. `event_id` è un UUID v4 (con\n/// trattini) per l'idempotenza `(project_id, event_id)`, come per le pageview.\nexport function buildWebVital(input: WebVitalInput): WebVitalPayload {\n  const navigationType = normalizeNavigationType(input.navigationType)\n\n  return {\n    event_id: uuidV4(),\n    metric: input.metric,\n    value: roundWebVital(input.metric, input.value),\n    hostname: location.hostname,\n    path: stripPath(input.path ?? location.pathname),\n    ...(navigationType ? { navigation_type: navigationType } : {}),\n    occurred_at: new Date().toISOString(),\n  }\n}\n\n/// Tipo di navigazione nel vocabolario del backend, o `undefined` se ignoto (un\n/// valore inventato verrebbe scartato: meglio non mandarlo affatto). Ci finiscono\n/// anche i tipi che web-vitals conosce e l'ingest no (`back-forward-cache`,\n/// `soft-navigation`): la misura parte comunque, solo senza il tipo — perderla\n/// per un campo accessorio sarebbe uno scambio pessimo.\nexport function normalizeNavigationType(raw: string | undefined): string | undefined {\n  if (!raw) return undefined\n  const normalized = raw.trim().toLowerCase().replace('back_forward', 'back-forward')\n  return (NAVIGATION_TYPES as readonly string[]).includes(normalized)\n    ? normalized\n    : undefined\n}\n\n/// Arrotondamento per metrica: il CLS è adimensionale e si muove su valori\n/// piccoli (4 decimali), le altre sono millisecondi e la frazione non aggiunge\n/// nulla a un percentile.\nexport function roundWebVital(metric: WebVitalName, value: number): number {\n  if (metric === 'cls') return Math.round(value * 10000) / 10000\n  return Math.round(value)\n}\n\n// Solo il pathname: la query può portare token e identificativi, e una misura di\n// velocità non ne ha alcun bisogno.\nfunction stripPath(path: string): string {\n  return path.split(/[?#]/, 1)[0] ?? path\n}\n","// Raccolta dei Web Vitals (opt-in `trackWebVitals`) sopra `web-vitals`, la\n// libreria di riferimento di Google (CYJS-28).\n//\n// È l'UNICA dipendenza del pacchetto, ed è presa di proposito. LCP e CLS a mano\n// sono fattibili, l'INP no: dipende dal percentile sulle interazioni, dal\n// conteggio che il browser espone solo in parte e da una manciata di eccezioni\n// che cambiano da una versione di Chrome all'altra. Una versione sbagliata non\n// si vede — produce numeri plausibili — e resterebbe sbagliata per mesi. È anche\n// l'unico modo per essere confrontabili con CrUX, che è tutto il punto di\n// affiancare le due colonne nella stessa pagina.\n//\n// Import per-metrica (`web-vitals/onLCP.js`, non il barrel): l'IIFE cresce per\n// tutti quelli che caricano lo snippet, anche per chi i Web Vitals non li\n// accende. Il tetto è committato e la CI lo verifica (`pnpm size`).\n//\n// SOLO la build standard, MAI `web-vitals/attribution`: quella porta con sé\n// l'elemento colpevole e pesa molto di più, e finché il backend non ha dove\n// metterlo sarebbe peso pagato da ogni visitatore per un dato che nessuno legge.\n//\n// Comportamento di DEFAULT, non `reportAllChanges`: ogni metrica arriva una\n// volta sola, col valore definitivo. Con `reportAllChanges` arriverebbe a ogni\n// variazione, e sarebbe una richiesta per aggiornamento invece di una per\n// caricamento.\n//\n// L'integrazione va installata DOPO il lifecycle del facade: da pagina in uscita\n// l'invio deve passare dal beacon (CYJS-29), e il segnale lo alza il lifecycle.\n\nimport type { Metric } from 'web-vitals'\nimport { onCLS } from 'web-vitals/onCLS.js'\nimport { onFCP } from 'web-vitals/onFCP.js'\nimport { onINP } from 'web-vitals/onINP.js'\nimport { onLCP } from 'web-vitals/onLCP.js'\nimport { onTTFB } from 'web-vitals/onTTFB.js'\nimport type { Client } from '../../client'\nimport { buildWebVital } from '../../webVitals'\nimport type { WebVitalName, WebVitalPayload } from '../../webVitals'\n\n// Intervallo del flush di cortesia: svuota il buffer dalle misure arrivate DOPO\n// il primo invio (vedi `flushed` più sotto).\nconst COURTESY_FLUSH_MS = 5000\n\n/// Dal vocabolario di web-vitals a quello dell'ingest.\nconst METRIC_NAMES: Record<Metric['name'], WebVitalName> = {\n  LCP: 'lcp',\n  CLS: 'cls',\n  INP: 'inp',\n  TTFB: 'ttfb',\n  FCP: 'fcp',\n}\n\n// Destinatario corrente delle misure: l'installazione viva, o nessuno dopo lo\n// smontaggio. È UNO perché di SDK inizializzato ce n'è uno.\nlet sink: ((metric: Metric) => void) | undefined\n// I cinque callback sono stati registrati per questa pagina.\nlet listening = false\n\n// Iscrive [onMetric] alle misure e ritorna la funzione per disiscriverlo.\n//\n// La registrazione presso `web-vitals` avviene UNA SOLA VOLTA per pagina, non a\n// ogni installazione: la libreria non offre disiscrizione e ogni chiamata a\n// `onLCP` & co. apre nuovi `PerformanceObserver` che restano vivi — e a lavorare\n// sul main thread — fino alla fine della pagina. Registrarli a ogni `init` li\n// accumulerebbe senza modo di chiuderli, e chi riconfigura l'SDK due volte\n// pagherebbe il monitoraggio due volte. Peggio: la seconda registrazione fa\n// riconsegnare le metriche già riportate, e lo stesso caricamento manderebbe due\n// volte il suo LCP.\n//\n// Il prezzo, dichiarato: dopo un `close()` gli observer restano aperti, perché\n// non esiste API per chiuderli. Quello che si può evitare è che si moltiplichino.\nfunction subscribeToWebVitals(onMetric: (metric: Metric) => void): () => void {\n  sink = onMetric\n  if (!listening) {\n    listening = true\n    // Il dispatch è stabile: inoltra al destinatario del momento, così una\n    // `init` successiva eredita gli observer già aperti invece di aprirne altri.\n    const dispatch = (metric: Metric): void => sink?.(metric)\n    onTTFB(dispatch)\n    onFCP(dispatch)\n    onLCP(dispatch)\n    onCLS(dispatch)\n    onINP(dispatch)\n  }\n\n  return () => {\n    // Solo se il posto è ancora nostro: un'`init` successiva lo ha già preso, e\n    // liberarlo qui spegnerebbe la raccolta di un client vivo.\n    if (sink === onMetric) sink = undefined\n  }\n}\n\n/// Registra i cinque callback e restituisce la funzione di disinstallazione, che\n/// stacca i listener e manda comunque le misure raccolte fin lì: uno spegnimento\n/// esplicito dell'SDK non è un buon motivo per buttare una misura già presa.\nexport function installWebVitals(client: Client): () => void {\n  // Le misure aspettano qui l'uscita di pagina. Indicizzate per metrica perché\n  // web-vitals può riportare la stessa più volte (il CLS cresce a ogni ritorno\n  // in primo piano): finché il batch non è partito vale l'ultimo valore, che è\n  // il più completo.\n  const pending = new Map<WebVitalName, WebVitalPayload>()\n  // Metriche già partite: una seconda misura della stessa metrica, nello stesso\n  // caricamento, non si manda. Due valori della stessa pagina dentro un\n  // percentile lo falsano più di un valore fermo al primo invio.\n  //\n  // Ci ricade anche il RITORNO DA BFCACHE, ed è voluto: web-vitals lo tratta\n  // come una navigazione nuova e rimisura tutto, ma quelle misure qui restano\n  // fuori. È la stessa scelta di CYJS-12, dichiarata nel README — dopo l'uscita\n  // di pagina il caricamento è chiuso. Rimisurarlo è una decisione di prodotto\n  // (raddoppia gli invii e apre la domanda di quale sia il \"caricamento\" per il\n  // percentile), non un dettaglio da cambiare qui: il tipo di navigazione\n  // `back-forward-cache` non è nemmeno nel vocabolario dell'ingest.\n  const sent = new Set<WebVitalName>()\n  // Pagina a cui le misure appartengono, letta all'installazione: in una SPA il\n  // percorso può cambiare prima dell'uscita, e attribuire il caricamento\n  // all'ultima route vista darebbe la colpa alla pagina sbagliata.\n  const path = typeof location !== 'undefined' ? location.pathname : undefined\n\n  // Il primo batch è partito. Prima di quel momento le misure aspettano\n  // l'uscita di pagina, così un caricamento produce UNA richiesta; dopo, ogni\n  // misura che arriva è già definitiva e non c'è un secondo `pagehide` su cui\n  // contare — la porta via il flush di cortesia.\n  let flushed = false\n  let courtesy: ReturnType<typeof setTimeout> | undefined\n\n  const scheduleCourtesyFlush = (): void => {\n    if (courtesy !== undefined) return\n    courtesy = setTimeout(() => {\n      courtesy = undefined\n      flush()\n    }, COURTESY_FLUSH_MS)\n  }\n\n  const record = (metric: Metric): void => {\n    const name = METRIC_NAMES[metric.name]\n    if (!name || sent.has(name)) return\n\n    pending.set(\n      name,\n      buildWebVital({\n        metric: name,\n        value: metric.value,\n        path,\n        navigationType: metric.navigationType,\n      }),\n    )\n    if (flushed) scheduleCourtesyFlush()\n  }\n\n  const flush = (): void => {\n    if (courtesy !== undefined) {\n      clearTimeout(courtesy)\n      courtesy = undefined\n    }\n    flushed = true\n    if (pending.size === 0) return\n\n    const measures = [...pending.values()]\n    for (const name of pending.keys()) sent.add(name)\n    pending.clear()\n    client.captureWebVitals(measures)\n  }\n\n  const onVisibility = (): void => {\n    if (typeof document === 'undefined') return\n    if (document.visibilityState === 'hidden') flush()\n  }\n\n  // Prima l'iscrizione, poi i nostri listener: `web-vitals` consegna le misure\n  // di LCP, CLS e INP proprio sul `visibilitychange`, e deve averlo già fatto\n  // quando tocca a noi svuotare il buffer. Altrimenti servirebbe un secondo\n  // invio per le stesse metriche. (I suoi listener sono in fase di capture su\n  // `window`, i nostri in bubble su `document`: l'ordine regge anche quando\n  // l'iscrizione riusa una registrazione fatta da un'installazione precedente.)\n  const unsubscribe = subscribeToWebVitals(record)\n\n  if (typeof window !== 'undefined') {\n    window.addEventListener('pagehide', flush)\n  }\n  if (typeof document !== 'undefined') {\n    document.addEventListener('visibilitychange', onVisibility)\n  }\n\n  return () => {\n    // La disiscrizione chiude la porta: una misura in ritardo non finisce in un\n    // client già spento. Gli observer aperti da `web-vitals` restano — non c'è\n    // API per chiuderli — ma sono UN set per pagina, non uno per `init`, e\n    // un'installazione successiva eredita quelli invece di aprirne altri.\n    //\n    // Uno spegnimento a pagina ancora visibile manda ciò che è stato raccolto\n    // fin qui, e non di più: LCP, CLS e INP li consegna la libreria all'uscita\n    // di pagina, quindi a pagina viva possono non essere ancora arrivati. Non\n    // c'è modo di farseli dare prima — l'unica leva sarebbe simulare un\n    // `visibilitychange`, che mentirebbe a tutta la pagina, non solo a noi. Sono\n    // valori ancora provvisori: perderli è meno peggio che inventarli.\n    unsubscribe()\n    if (typeof window !== 'undefined') {\n      window.removeEventListener('pagehide', flush)\n    }\n    if (typeof document !== 'undefined') {\n      document.removeEventListener('visibilitychange', onVisibility)\n    }\n    flush()\n  }\n}\n","// Flush di fine vita su Node: `beforeExit` (uscita naturale dell'event loop)\n// e `SIGTERM` (stop orchestrato, es. deploy/container). Su SIGTERM, se i\n// nostri sono gli unici listener, il listener si auto-rimuove e ri-manda il\n// segnale al processo — preserva la terminazione di default senza loop. Con\n// handler utente presenti, la terminazione resta a carico loro.\n\nimport type { Client } from '../../client'\n\n/// Sottoinsieme di `process` usato dal lifecycle (iniettabile nei test).\nexport interface LifecycleProcessLike {\n  pid: number\n  on(event: string, listener: (...args: never[]) => unknown): unknown\n  removeListener(event: string, listener: (...args: never[]) => unknown): unknown\n  listeners(event: string): unknown[]\n  kill(pid: number, signal: string): unknown\n}\n\n/// Installa i flush di lifecycle. Ritorna la funzione di disinstallazione.\nexport function installNodeLifecycle(\n  client: Client,\n  proc: LifecycleProcessLike = process as unknown as LifecycleProcessLike,\n): () => void {\n  const onBeforeExit = (): void => {\n    void client.flush()\n  }\n\n  const onSigterm = async (): Promise<void> => {\n    await client.flush()\n    const others = proc.listeners('SIGTERM').filter((l) => l !== onSigterm)\n    if (others.length === 0) {\n      proc.removeListener('SIGTERM', onSigterm as never)\n      proc.kill(proc.pid, 'SIGTERM')\n    }\n  }\n\n  proc.on('beforeExit', onBeforeExit as never)\n  proc.on('SIGTERM', onSigterm as never)\n\n  return () => {\n    proc.removeListener('beforeExit', onBeforeExit as never)\n    proc.removeListener('SIGTERM', onSigterm as never)\n  }\n}\n","// Handler globali per Node: `uncaughtException` e `unhandledRejection`.\n//\n// Si usa un listener ATTIVO (non `uncaughtExceptionMonitor`): il monitor non\n// tiene vivo l'event loop, quindi il POST asincrono della telemetria morirebbe\n// quasi sempre prima di partire. Registrare un listener però DISATTIVA il\n// crash di default di Node → lo si ripristina a mano: dopo capture + flush\n// (con timeout), se i nostri sono gli unici listener, stampa l'errore su\n// stderr ed esce con codice 1 (pattern sentry-node). Se l'utente ha propri\n// handler, la decisione di uscire resta a lui. Stessa policy per\n// `unhandledRejection` (da Node ≥15 il default è crashare).\n\nimport type { Client } from '../../client'\n\n/// Sottoinsieme di `process` usato dagli handler (iniettabile nei test).\nexport interface ProcessLike {\n  on(event: string, listener: (...args: never[]) => unknown): unknown\n  removeListener(event: string, listener: (...args: never[]) => unknown): unknown\n  listeners(event: string): unknown[]\n  exit(code: number): void\n  stderr?: { write(chunk: string): unknown }\n}\n\nexport interface ProcessHandlersOptions {\n  /// Tempo massimo (ms) concesso al flush prima di uscire comunque.\n  flushTimeoutMs?: number\n}\n\n/// Installa gli handler. Ritorna la funzione di disinstallazione.\nexport function installProcessHandlers(\n  client: Client,\n  proc: ProcessLike = process as unknown as ProcessLike,\n  options: ProcessHandlersOptions = {},\n): () => void {\n  const flushTimeoutMs = options.flushTimeoutMs ?? 2000\n\n  const handle = async (event: string, error: unknown, self: unknown) => {\n    client.captureException(error, { handled: false, level: 'fatal' })\n    await flushWithTimeout(client, flushTimeoutMs)\n    // Solo il nostro listener registrato? Allora ripristiniamo il default.\n    const others = proc.listeners(event).filter((l) => l !== self)\n    if (others.length === 0) {\n      proc.stderr?.write(`${describeError(error)}\\n`)\n      proc.exit(1)\n    }\n  }\n\n  const onUncaught = (error: unknown): Promise<void> =>\n    handle('uncaughtException', error, onUncaught)\n  const onRejection = (reason: unknown): Promise<void> =>\n    handle('unhandledRejection', reason, onRejection)\n\n  proc.on('uncaughtException', onUncaught as never)\n  proc.on('unhandledRejection', onRejection as never)\n\n  return () => {\n    proc.removeListener('uncaughtException', onUncaught as never)\n    proc.removeListener('unhandledRejection', onRejection as never)\n  }\n}\n\nasync function flushWithTimeout(client: Client, timeoutMs: number): Promise<void> {\n  await Promise.race([\n    client.flush(),\n    new Promise<void>((resolve) => {\n      const timer = setTimeout(resolve, timeoutMs)\n      ;(timer as { unref?: () => void }).unref?.()\n    }),\n  ])\n}\n\nfunction describeError(error: unknown): string {\n  if (error instanceof Error) return error.stack ?? `${error.name}: ${error.message}`\n  return String(error)\n}\n","// Logger applicativo nominato, null-safe. Specchio di `CloseYourIt.logger`\n// (gem, LogDevice) e `CloseYourItLogger` (dart): metodi di comodo per livello\n// che delegano a `client.log`. `warn` viene normalizzato in `warning` (canone\n// wire). Prima di `init` ogni metodo è no-op.\n\nimport type { Client } from './client'\n\nexport class CloseYourItLogger {\n  constructor(\n    private readonly getClient: () => Client | null,\n    private readonly name?: string | undefined,\n  ) {}\n\n  /// Un logger figlio con nome (`logger.named('payments').info(...)`).\n  named(name: string): CloseYourItLogger {\n    return new CloseYourItLogger(this.getClient, name)\n  }\n\n  debug(message: string, attributes?: Record<string, unknown>): void {\n    this.emit('debug', message, attributes)\n  }\n\n  info(message: string, attributes?: Record<string, unknown>): void {\n    this.emit('info', message, attributes)\n  }\n\n  warn(message: string, attributes?: Record<string, unknown>): void {\n    this.emit('warning', message, attributes)\n  }\n\n  error(message: string, attributes?: Record<string, unknown>): void {\n    this.emit('error', message, attributes)\n  }\n\n  fatal(message: string, attributes?: Record<string, unknown>): void {\n    this.emit('fatal', message, attributes)\n  }\n\n  private emit(\n    level: 'debug' | 'info' | 'warning' | 'error' | 'fatal',\n    message: string,\n    attributes?: Record<string, unknown>,\n  ): void {\n    this.getClient()?.log(level, message, attributes, this.name)\n  }\n}\n","// Facade pubblico dell'SDK CloseYourIt, isomorfo browser/Node. Mantiene un\n// singleton di [Client]; tutti i metodi sono no-op finché non si chiama [init]\n// e nessuno solleva. Nell'IIFE (`globalName: CloseYourIt`) questi export\n// diventano i metodi di `window.CloseYourIt`. Le integrazioni installate\n// dipendono dalla piattaforma: window handlers/breadcrumb/http/jank e, se\n// richiesti, web vitals e fallimenti di risorse/CSP nel browser; process\n// handlers + lifecycle su Node.\n\nimport { Client } from './client'\nimport { installBreadcrumbs } from './integrations/browser/breadcrumbs'\nimport { installGlobalHandlers } from './integrations/browser/globalHandlers'\nimport { installHttpInstrumentation } from './integrations/browser/http'\nimport { installJankDetection } from './integrations/browser/jank'\nimport { installPageviews } from './integrations/browser/pageviews'\nimport { installReplay } from './integrations/browser/replay'\nimport { installResourceErrors } from './integrations/browser/resourceErrors'\nimport { installWebVitals } from './integrations/browser/webVitals'\nimport { installNodeLifecycle } from './integrations/node/lifecycle'\nimport { installProcessHandlers } from './integrations/node/processHandlers'\nimport { CloseYourItLogger } from './logger'\nimport { isSecretToken, resolveOptions, resolvedOptionsEqual } from './options'\nimport { isBrowser, isNode } from './runtime'\nimport { Scope } from './scope'\nimport type {\n  CaptureHint,\n  CloseYourItOptions,\n  EventLevel,\n  LogLevel,\n  TraceCarrier,\n  UserContext,\n} from './types'\nimport { emptyStatsSnapshot } from './stats'\nimport type { StatsSnapshot } from './stats'\n\nlet currentClient: Client | null = null\nlet uninstallHandlers: (() => void) | null = null\nlet uninstallBreadcrumbs: (() => void) | null = null\nlet uninstallHttp: (() => void) | null = null\nlet uninstallJank: (() => void) | null = null\nlet uninstallPageviews: (() => void) | null = null\nlet uninstallReplay: (() => void) | null = null\nlet uninstallWebVitals: (() => void) | null = null\nlet uninstallResourceErrors: (() => void) | null = null\nlet uninstallLifecycle: (() => void) | null = null\n\n// Chiusure dei client sostituiti da una re-init, ancora in volo (CYJS-8). `init`\n// resta sincrona e non le attende, ma `flush()`/`close()` sì: così gli eventi già in\n// coda del vecchio client non si perdono se il processo esce subito dopo il cambio.\nconst pendingTeardowns = new Set<Promise<void>>()\n\nfunction trackTeardown(closing: Promise<void>): void {\n  const settled = closing\n    .catch(() => {})\n    .finally(() => {\n      pendingTeardowns.delete(settled)\n    })\n  pendingTeardowns.add(settled)\n}\n\n/// Inizializza l'SDK. **Idempotente per opzioni equivalenti**: con la stessa\n/// configurazione risolta ritorna il client esistente senza reinstallare gli handler,\n/// anche se disabilitato da misconfig (non lo chiude e ricrea a vuoto). Con **opzioni\n/// diverse riconfigura a caldo** (CYJS-8): smonta gli handler del client precedente e\n/// ne avvia flush+close in background — gli eventi già in coda partono verso la\n/// configurazione con cui erano stati accodati (attendibile via `flush()`/`close()`) —\n/// trasferisce lo scope corrente (trace_id, utente, tag, breadcrumb) al nuovo client e\n/// mette in uso la nuova config, senza bisogno di un `close()` manuale. Con config\n/// incompleta resta no-op (non solleva) e può essere superata da una `init` valida.\nexport function init(options: CloseYourItOptions): Client {\n  // Idempotenza per opzioni equivalenti: stessa configurazione risolta → no-op,\n  // qualunque sia lo stato (attivo o disabilitato). Non si smontano né reinstallano\n  // gli handler (nessun listener duplicato) e un client disabilitato non viene chiuso\n  // e ricreato a ogni init identica.\n  if (\n    currentClient &&\n    resolvedOptionsEqual(currentClient.options, resolveOptions(options))\n  ) {\n    return currentClient\n  }\n\n  // Re-init (o primo init, o superamento di un client disabilitato da misconfig):\n  // smonta i listener del client precedente e ne avvia flush+close SENZA bloccare\n  // init (che resta sincrona). La chiusura è tracciata così un flush()/close()\n  // successivo la attende: gli eventi in coda del vecchio client non si perdono\n  // all'uscita del processo. Lo scope corrente è trasferito al nuovo client, così\n  // cambiare la sola config non azzera lo stato applicativo (utente, tag, trace).\n  const previous = currentClient\n  teardown()\n  const client = new Client(options, previous ? { scope: previous.scope } : {})\n  currentClient = client\n  if (previous) trackTeardown(previous.close())\n\n  // Senza questo warning una misconfig (es. token/projectId mancante) rende l'SDK un no-op\n  // totalmente silenzioso: nessun evento inviato e nessun segnale al dev, nemmeno con debug:true.\n  // Non avvisa quando la disabilitazione è voluta (options.enabled: false).\n  if (!client.enabled && client.options.enabled) {\n    console.warn(\n      `[closeyourit] SDK disabilitato: ${client.disabledReason} — nessun evento verrà inviato`,\n    )\n  }\n\n  // Nel browser il bearer segreto (cyi_) non deve nemmeno comparire nel bundle:\n  // l'SDK non lo invia mai, ma se è presente nel codice client va rimosso.\n  if (isBrowser() && isSecretToken(client.options.token)) {\n    console.warn(\n      '[closeyourit] bearer segreto (cyi_…) presente nel codice browser: è SERVER-ONLY e non verrà mai inviato. Rimuovilo dal bundle e usa `publicKey` (DSN public key).',\n    )\n  }\n\n  if (client.enabled && client.options.autoInstall) {\n    if (isBrowser()) {\n      // Per primo: chi flusha su `pagehide` (replay) deve trovare il segnale di\n      // pagina in uscita già alzato, altrimenti quell'invio non usa il beacon.\n      uninstallLifecycle = installLifecycle(client)\n      uninstallHandlers = installGlobalHandlers(client)\n      if (client.options.breadcrumbs) {\n        uninstallBreadcrumbs = installBreadcrumbs(client)\n      }\n      // Il patch http serve a due consumatori: breadcrumb http e/o verdetti\n      // performance. Si installa se almeno uno è attivo.\n      const wantsHttp =\n        (client.options.breadcrumbs && client.options.autoBreadcrumbs.http) ||\n        (client.options.detectPerformanceIssues && client.options.captureExternalHttp)\n      if (wantsHttp) {\n        uninstallHttp = installHttpInstrumentation(client)\n      }\n      if (client.options.detectPerformanceIssues && client.options.detectJank) {\n        uninstallJank = installJankDetection(client)\n      }\n      if (client.options.trackPageviews) {\n        uninstallPageviews = installPageviews(client)\n      }\n      if (client.options.replay) {\n        uninstallReplay = installReplay(client)\n      }\n      // Dopo il lifecycle, come il replay: le misure partono a pagina in uscita\n      // e devono trovare il beacon già in uso (CYJS-29).\n      if (client.options.trackWebVitals) {\n        uninstallWebVitals = installWebVitals(client)\n      }\n      if (client.options.captureResourceErrors) {\n        uninstallResourceErrors = installResourceErrors(client)\n      }\n    } else if (isNode()) {\n      uninstallHandlers = installProcessHandlers(client)\n      uninstallLifecycle = installNodeLifecycle(client)\n    }\n  }\n\n  return client\n}\n\n/// Cattura un'eccezione o valore arbitrario.\nexport function captureException(error: unknown, hint?: CaptureHint): void {\n  currentClient?.captureException(error, hint)\n}\n\n/// Cattura un messaggio diagnostico.\nexport function captureMessage(message: string, level: EventLevel = 'info'): void {\n  currentClient?.captureMessage(message, level)\n}\n\n/// Bufferizza un log strutturato (inviato in batch).\nexport function log(\n  level: LogLevel,\n  message: string,\n  attributes?: Record<string, unknown>,\n  loggerName?: string,\n): void {\n  currentClient?.log(level, message, attributes, loggerName)\n}\n\n/// Logger applicativo con metodi per livello (`logger.warn('…')`), null-safe.\n/// `logger.named('payments')` crea un logger figlio con nome.\nexport const logger = new CloseYourItLogger(() => currentClient)\n\n/// Misura [body] e invia una metrica `slow_method` oltre soglia. Preserva la\n/// sincronicità del body. Pre-init esegue comunque il body senza misurare.\n/// Label vuota → TypeError (sempre, anche pre-init: errore del programmatore).\nexport function measure<T>(\n  label: string,\n  body: () => T,\n  opts?: { args?: Record<string, unknown> },\n): T {\n  if (currentClient) return currentClient.measure(label, body, opts)\n  if (typeof label !== 'string' || label.trim().length === 0) {\n    throw new TypeError(\n      'closeyourit: measure(label) richiede una label non vuota (è il fingerprint della metrica)',\n    )\n  }\n  return body()\n}\n\n/// Cattura una pageview (web analytics). No-op fuori dal browser o pre-init.\n/// [overrides.path] forza il path (default `location.pathname`). Con\n/// `trackPageviews: true` l'auto-tracking la chiama al load e a ogni cambio di\n/// pathname; usarla a mano per SPA con routing custom o eventi virtuali.\nexport function capturePageview(overrides?: { path?: string }): void {\n  currentClient?.capturePageview(overrides)\n}\n\n/// Cattura un custom event (goal/conversione). [name] è il nome dell'evento\n/// (es. \"Signup\"); no-op fuori dal browser o pre-init.\nexport function captureEvent(name: string, overrides?: { path?: string }): void {\n  currentClient?.captureEvent(name, overrides)\n}\n\n/// Imposta l'utente corrente (`null` per rimuoverlo).\nexport function setUser(user: UserContext | null): void {\n  currentClient?.setUser(user)\n}\n\n/// Imposta un tag.\nexport function setTag(key: string, value: string): void {\n  currentClient?.setTag(key, value)\n}\n\n/// Imposta più tag in un colpo.\nexport function setTags(tags: Record<string, string>): void {\n  currentClient?.setTags(tags)\n}\n\n/// Imposta un valore extra.\nexport function setExtra(key: string, value: unknown): void {\n  currentClient?.setExtra(key, value)\n}\n\n/// Imposta un context nominato.\nexport function setContext(key: string, value: Record<string, unknown>): void {\n  currentClient?.setContext(key, value)\n}\n\n/// Imposta l'ID di correlazione (default: generato per pagina).\nexport function setTraceId(id: string | undefined): void {\n  currentClient?.setTraceId(id)\n}\n\n/// ID di correlazione corrente, o `undefined` se non inizializzato.\nexport function getTraceId(): string | undefined {\n  return currentClient?.scope.traceId\n}\n\n/// Adotta un trace context W3C in ingresso da [carrier] (header di richiesta\n/// server/SSR, un `Headers`, o un getter): un `traceparent` valido diventa il\n/// `trace_id` di correlazione e aggancia errori/log al trace distribuito.\n/// No-op pre-init o su header assente/malformato.\nexport function continueTrace(carrier: TraceCarrier): void {\n  currentClient?.continueTrace(carrier)\n}\n\n/// Header W3C Trace Context (`traceparent`, più `tracestate`/`baggage` se\n/// adottati) da iniettare in una richiesta in uscita verso [target]. `{}` se\n/// pre-init/disabilitato o se [target] non è fidato (`tracePropagationTargets` o\n/// same-origin): trace interno e baggage non raggiungono host non fidati. Senza\n/// [target] la destinazione è first-party e la propagazione è consentita.\nexport function getTraceHeaders(target?: string): Record<string, string> {\n  return currentClient?.getTraceHeaders(target) ?? {}\n}\n\n/// ID della sessione di replay in corso, o `undefined` se il replay non è attivo.\nexport function getReplaySessionId(): string | undefined {\n  return currentClient?.scope.replaySessionId\n}\n\n/// Aggiunge un breadcrumb manuale.\nexport function addBreadcrumb(input: {\n  message?: string\n  category?: string\n  type?: string\n  level?: string\n  data?: Record<string, unknown>\n}): void {\n  currentClient?.addBreadcrumb(input)\n}\n\n/// Azzera lo scope (user/tag/extra/context/breadcrumbs), tranne il trace_id.\nexport function clearScope(): void {\n  currentClient?.clearScope()\n}\n\n/// Esegue [fn] in uno scope isolato per l'intero flusso asincrono: nuovo trace_id\n/// (correlazione per-richiesta) e breadcrumb propri. Su Node tiene separati i dati\n/// di richieste concorrenti (AsyncLocalStorage); nel browser (single-thread) isola\n/// per la durata sincrona di [fn]. Va avvolto attorno all'handler di richiesta (es.\n/// middleware server) così user/tag/request/breadcrumb non attraversano il confine\n/// tra richieste (CYJS-7). Pre-init esegue [fn] senza isolamento. Ritorna il valore\n/// di [fn] (una Promise è propagata: l'isolamento copre l'await).\nexport function runWithScope<T>(fn: (scope: Scope) => T): T {\n  if (currentClient) return currentClient.runWithScope(fn)\n  return fn(new Scope())\n}\n\n/// Esegue [fn] con uno scope temporaneo forkato da quello corrente (trace_id e\n/// breadcrumb ereditati): le modifiche fatte dentro non escono. Utile per una\n/// cattura con contesto aggiuntivo senza sporcare lo scope condiviso. Pre-init\n/// esegue [fn] senza isolamento.\nexport function withScope<T>(fn: (scope: Scope) => T): T {\n  if (currentClient) return currentClient.withScope(fn)\n  return fn(new Scope())\n}\n\n/// Snapshot dei contatori diagnostici: aggregati (`enqueued`, `sent`, `dropped`,\n/// `failed`, `timeout`) più `reasons`, la ripartizione di scarti e fallimenti per\n/// motivo (`sample_rate`, `before_send`, `error`, `queue_full`, `response`,\n/// `network`). Pura lettura in-memory: non invia mai telemetria (CYJS-9).\nexport function getStats(): StatsSnapshot {\n  return currentClient?.stats.toObject() ?? emptyStatsSnapshot()\n}\n\n/// `true` se inizializzato e la configurazione consente l'invio.\nexport function isEnabled(): boolean {\n  return currentClient?.enabled ?? false\n}\n\n/// Svuota i log bufferizzati e attende gli invii in volo, incluse le chiusure dei\n/// client sostituiti da una re-init ancora in corso (CYJS-8).\nexport function flush(): Promise<void> {\n  return Promise.all([\n    currentClient?.flush() ?? Promise.resolve(),\n    ...pendingTeardowns,\n  ]).then(() => undefined)\n}\n\n/// Spegne l'SDK, ripristina i patch globali e libera le risorse. `currentClient` è\n/// azzerato SUBITO (prima dell'await): una `init` concorrente durante la chiusura\n/// installa il nuovo client senza che questo `close()` lo azzeri al termine (CYJS-8).\nexport async function close(): Promise<void> {\n  const client = currentClient\n  teardown()\n  currentClient = null\n  await Promise.all([client?.close() ?? Promise.resolve(), ...pendingTeardowns])\n}\n\nfunction teardown(): void {\n  uninstallHandlers?.()\n  uninstallBreadcrumbs?.()\n  uninstallHttp?.()\n  uninstallJank?.()\n  uninstallPageviews?.()\n  uninstallReplay?.()\n  uninstallWebVitals?.()\n  uninstallResourceErrors?.()\n  uninstallLifecycle?.()\n  uninstallHandlers = null\n  uninstallBreadcrumbs = null\n  uninstallHttp = null\n  uninstallJank = null\n  uninstallPageviews = null\n  uninstallReplay = null\n  uninstallWebVitals = null\n  uninstallResourceErrors = null\n  uninstallLifecycle = null\n}\n\n// Su `pagehide`/`visibilitychange(hidden)` segnala al client che la pagina sta\n// uscendo di scena e svuota i log. Il segnale viene PRIMA del flush perché da lì\n// in poi gli invii passano dal beacon: `fetch(keepalive)` non sopravvive alla\n// chiusura della scheda su Safari iOS (CYJS-29). `pageshow` (ritorno da bfcache)\n// e il ritorno in primo piano rimettono in uso il fetch, che a pagina viva dà la\n// risposta su cui si regge la diagnostica.\n//\n// Va installato per PRIMO tra gli handler browser: gli ascoltatori di `pagehide`\n// girano nell'ordine di registrazione, e quelli delle altre integrazioni (replay)\n// devono trovare il segnale già alzato per partire anch'essi col beacon.\nfunction installLifecycle(client: Client): () => void {\n  if (typeof window === 'undefined') return () => {}\n\n  const onHide = (): void => {\n    client.notifyPageHiding(true)\n    void client.flush()\n  }\n  const onShow = (): void => {\n    client.notifyPageHiding(false)\n  }\n  const onVisibility = (): void => {\n    if (typeof document === 'undefined') return\n    if (document.visibilityState === 'hidden') onHide()\n    else onShow()\n  }\n\n  window.addEventListener('pagehide', onHide)\n  window.addEventListener('pageshow', onShow)\n  if (typeof document !== 'undefined') {\n    document.addEventListener('visibilitychange', onVisibility)\n  }\n\n  return () => {\n    window.removeEventListener('pagehide', onHide)\n    window.removeEventListener('pageshow', onShow)\n    if (typeof document !== 'undefined') {\n      document.removeEventListener('visibilitychange', onVisibility)\n    }\n  }\n}\n\nexport { Client } from './client'\nexport { CloseYourItLogger } from './logger'\nexport { Scope } from './scope'\nexport { SDK_NAME, SDK_VERSION } from './version'\nexport type { StatsSnapshot } from './stats'\nexport type {\n  AutoBreadcrumbsOptions,\n  BeforeSend,\n  CaptureHint,\n  CloseYourItOptions,\n  DiagnosticDetails,\n  DiagnosticEvent,\n  DropReason,\n  EventLevel,\n  EventPayload,\n  LogLevel,\n  OnDiagnostic,\n  TraceCarrier,\n  TracePropagationTarget,\n  UserContext,\n} from './types'\n"]}