why-hydration 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +66 -0
- package/README.md +87 -23
- package/dist/chunk-CER5NQRR.js +1333 -0
- package/dist/chunk-CER5NQRR.js.map +1 -0
- package/dist/{chunk-3OAI2ZHY.js → chunk-KP4S6CRL.js} +339 -181
- package/dist/chunk-KP4S6CRL.js.map +1 -0
- package/dist/{chunk-KX6G7I4Y.cjs → chunk-QFHUKJ5K.cjs} +339 -181
- package/dist/chunk-QFHUKJ5K.cjs.map +1 -0
- package/dist/chunk-RWMRFTQ4.cjs +1356 -0
- package/dist/chunk-RWMRFTQ4.cjs.map +1 -0
- package/dist/index.cjs +19 -19
- package/dist/index.d.cts +9 -2
- package/dist/index.d.ts +9 -2
- package/dist/index.js +1 -1
- package/dist/next/index.cjs +4 -4
- package/dist/next/index.js +2 -2
- package/dist/react.cjs +4 -4
- package/dist/react.d.cts +4 -3
- package/dist/react.d.ts +4 -3
- package/dist/react.js +2 -2
- package/package.json +22 -4
- package/dist/chunk-3OAI2ZHY.js.map +0 -1
- package/dist/chunk-KX6G7I4Y.cjs.map +0 -1
- package/dist/chunk-MK3TYHKM.js +0 -966
- package/dist/chunk-MK3TYHKM.js.map +0 -1
- package/dist/chunk-R7IWOK5M.cjs +0 -989
- package/dist/chunk-R7IWOK5M.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/react/console.ts","../src/react/capture.ts","../src/react/locales/ar.ts","../src/react/locales/fa.ts","../src/react/locales/he.ts","../src/react/i18n.ts","../src/react/overlay.ts","../src/react/fiber.ts","../src/react/controller.ts","../src/react/inspector.tsx","../src/react/index.tsx"],"names":["React2"],"mappings":";;;;;AAMO,SAAS,0BACd,SAAA,EACY;AACZ,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,EAAa,OAAO,MAAM;AAAA,EAAC,CAAA;AAClD,EAAA,MAAM,WAAW,OAAA,CAAQ,KAAA;AACzB,EAAA,MAAM,OAAA,GAAmB,IAAI,IAAA,KAAoB;AAC/C,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,kBAAkB,IAAI,CAAA;AACtC,MAAA,IAAI,OAAA,IAAW,kBAAA,CAAmB,OAAO,CAAA,EAAG;AAC1C,QAAA,SAAA,CAAU,SAAS,IAAI,CAAA;AAAA,MACzB;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAIA,IAAA,QAAA,CAAS,KAAA,CAAM,SAAS,IAAI,CAAA;AAAA,EAC9B,CAAA;AACA,EAAA,OAAA,CAAQ,KAAA,GAAQ,OAAA;AAEhB,EAAA,OAAO,MAAM;AACX,IAAA,IAAI,OAAA,CAAQ,UAAW,OAAA,EAAkC;AACvD,MAAA,OAAA,CAAQ,KAAA,GAAQ,QAAA;AAAA,IAClB;AAAA,EACF,CAAA;AACF;AAEA,IAAM,KAAA,GAAQ,gCAAA;AACd,IAAM,GAAA,GAAM,eAAA;AAEL,SAAS,qBAAA,GAAoC;AAClD,EAAA,MAAM,IAAA,GAAmB,CAAC,MAAA,KAA4B;AACpD,IAAA,MAAM,KAAA,GAAQ,4BAAuB,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA,QAAA,EAAM,MAAA,CAAO,KAAK,IAAI,CAAA,CAAA;AAChF,IAAA,OAAA,CAAQ,KAAA,CAAM,KAAA,EAAO,KAAA,EAAO,GAAG,CAAA;AAC/B,IAAA,OAAA,CAAQ,IAAI,aAAA,EAAe,eAAA,EAAiB,EAAA,EAAI,MAAA,CAAO,UAAU,QAAQ,CAAA;AACzE,IAAA,OAAA,CAAQ,IAAI,aAAA,EAAe,eAAA,EAAiB,EAAA,EAAI,MAAA,CAAO,UAAU,QAAQ,CAAA;AACzE,IAAA,IAAI,OAAO,SAAA,EAAW;AACpB,MAAA,OAAA,CAAQ,IAAI,gBAAA,EAAkB,GAAA,EAAK,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,IAChE;AACA,IAAA,IAAI,MAAA,CAAO,UAAU,IAAA,EAAM;AACzB,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,QAAA,CAAS,IAAA,GACxB,GAAG,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,CAAA,GAC/C,OAAO,QAAA,CAAS,IAAA;AACpB,MAAA,OAAA,CAAQ,GAAA,CAAI,aAAA,EAAe,GAAA,EAAK,EAAA,EAAI,GAAG,CAAA;AAAA,IACzC;AACA,IAAA,OAAA,CAAQ,IAAI,UAAA,EAAY,GAAA,EAAK,EAAA,EAAI,MAAA,CAAO,MAAM,WAAW,CAAA;AACzD,IAAA,OAAA,CAAQ,IAAI,UAAA,EAAY,eAAA,EAAiB,EAAA,EAAI,MAAA,CAAO,MAAM,UAAU,CAAA;AACpE,IAAA,IAAI,MAAA,CAAO,MAAM,OAAA,EAAS;AACxB,MAAA,OAAA,CAAQ,IAAI,WAAA,EAAa,GAAA,EAAK,EAAA,EAAI,MAAA,CAAO,MAAM,OAAO,CAAA;AAAA,IACxD;AACA,IAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,MAAA,OAAA,CAAQ,GAAA,CAAI,sBAAA,EAAwB,GAAA,EAAK,EAAA,EAAI,OAAO,cAAc,CAAA;AAAA,IACpE;AACA,IAAA,OAAA,CAAQ,QAAA,EAAS;AAAA,EACnB,CAAA;AACA,EAAA,OAAO,IAAA;AACT;;;AC7CO,IAAM,YAAA,GAAe,EAAA;AAE5B,IAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,IAAM,SAAA,uBAAgB,GAAA,EAAqB;AAC3C,IAAI,SAAA,GAAiC,IAAA;AAG9B,SAAS,YAAA,GAAqB;AACnC,EAAA,IAAI,SAAA,IAAa,OAAO,MAAA,KAAW,WAAA,EAAa;AAChD,EAAA,SAAA,GAAY,yBAAA,CAA0B,CAAC,OAAA,KAAY;AAKjD,IAAA,IAAI,SAAS,GAAA,CAAI,OAAO,CAAA,IAAK,QAAA,CAAS,QAAQ,YAAA,EAAc;AAC5D,IAAA,QAAA,CAAS,IAAI,OAAO,CAAA;AACpB,IAAA,KAAA,MAAW,YAAY,CAAC,GAAG,SAAS,CAAA,WAAY,OAAO,CAAA;AAAA,EACzD,CAAC,CAAA;AACH;AAOO,SAAS,iBAAiB,QAAA,EAAuC;AACtE,EAAA,YAAA,EAAa;AACb,EAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AACtB,EAAA,KAAA,MAAW,WAAW,CAAC,GAAG,QAAQ,CAAA,WAAY,OAAO,CAAA;AAErD,EAAA,OAAO,MAAM;AACX,IAAA,IAAI,CAAC,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA,EAAG;AAMjC,IAAA,IAAI,SAAA,CAAU,IAAA,KAAS,CAAA,IAAK,SAAA,EAAW;AACrC,MAAA,SAAA,EAAU;AACV,MAAA,SAAA,GAAY,IAAA;AAAA,IACd;AAAA,EACF,CAAA;AACF;;;AC3CA,IAAM,WAAA,GAA8B;AAAA,EAClC,yBAAA,EAA2B;AAAA,IACzB,WAAA,EACE,+qBAAA;AAAA,IAGF,UAAA,EACE;AAAA,GAGJ;AAAA,EACA,WAAA,EAAa;AAAA,IACX,WAAA,EACE,6lBAAA;AAAA,IAEF,UAAA,EACE;AAAA,GAEJ;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,WAAA,EACE,gsCAAA;AAAA,IAIF,UAAA,EACE;AAAA,GAGJ;AAAA,EACA,sBAAA,EAAwB;AAAA,IACtB,WAAA,EACE,orBAAA;AAAA,IAEF,UAAA,EACE;AAAA,GAGJ;AAAA,EACA,0BAAA,EAA4B;AAAA,IAC1B,WAAA,EACE,obAAA;AAAA,IAEF,UAAA,EACE;AAAA,GAEJ;AAAA,EACA,0BAAA,EAA4B;AAAA,IAC1B,WAAA,EACE,gVAAA;AAAA,IAEF,UAAA,EACE;AAAA,GACJ;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,WAAA,EACE,mnBAAA;AAAA,IAGF,UAAA,EACE;AAAA,GAGJ;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,WAAA,EACE,gnBAAA;AAAA,IAEF,UAAA,EACE;AAAA,GAGJ;AAAA,EACA,sBAAA,EAAwB;AAAA,IACtB,WAAA,EACE,srBAAA;AAAA,IAGF,UAAA,EACE;AAAA,GAGJ;AAAA,EACA,yBAAA,EAA2B;AAAA,IACzB,WAAA,EACE,mvBAAA;AAAA,IAGF,UAAA,EACE;AAAA,GAEJ;AAAA,EACA,8CAAA,EAAgD;AAAA,IAC9C,WAAA,EACE,gfAAA;AAAA,IAEF,UAAA,EACE;AAAA,GAEJ;AAAA,EACA,yCAAA,EAA2C;AAAA,IACzC,WAAA,EACE,mgBAAA;AAAA,IAEF,UAAA,EACE;AAAA,GAEJ;AAAA,EACA,wCAAA,EAA0C;AAAA,IACxC,WAAA,EAAa,CAAC,CAAA,KAAM;AAAA,MAClB,yMAAA;AAAA,MACA,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,MACpB;AAAA,KAEF;AAAA,IACA,UAAA,EACE;AAAA,GAGJ;AAAA,EACA,0BAAA,EAA4B;AAAA,IAC1B,WAAA,EAAa,CAAC,CAAA,KAAM;AAAA,MAClB,iCAAA;AAAA,MACA,KAAK,OAAO,CAAA;AAAA,MACZ,qGAAA;AAAA,MACA,GAAG,YAAY,CAAA,EAAG;AAAA,QAChB,KAAA,EAAO,0FAAA;AAAA,QACP,OAAA,EAAS,0FAAA;AAAA,QACT,aAAA,EAAe,SAAA;AAAA,QACf,aAAA,EAAe,SAAA;AAAA,QACf,IAAA,EAAM,IAAA;AAAA,QACN,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,MACD;AAAA,KAEF;AAAA,IACA,UAAA,EACE;AAAA,GAGJ;AAAA,EACA,0BAAA,EAA4B;AAAA,IAC1B,WAAA,EACE,wmBAAA;AAAA,IAEF,UAAA,EACE;AAAA,GAEJ;AAAA,EACA,4BAAA,EAA8B;AAAA,IAC5B,WAAA,EACE,6fAAA;AAAA,IAGF,UAAA,EACE;AAAA,GAEJ;AAAA,EACA,OAAA,EAAS;AAAA,IACP,WAAA,EACE,mdAAA;AAAA,IAEF,UAAA,EACE;AAAA,GAGJ;AAAA,EACA,qBAAA,EAAuB;AAAA,IACrB,WAAA,EACE,wbAAA;AAAA,IAEF,UAAA,EACE;AAAA;AAIN,CAAA;AAQA,IAAI,QAAA;AACJ,SAAS,aAAa,KAAA,EAAuB;AAC3C,EAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,IAAA,QAAA,GACE,OAAO,IAAA,KAAS,WAAA,IAAe,OAAO,IAAA,CAAK,WAAA,KAAgB,UAAA,GACvD,IAAI,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,GACzB,IAAA;AAAA,EACR;AACA,EAAA,OAAO,QAAA,EAAU,MAAA,CAAO,KAAK,CAAA,IAAK,OAAA;AACpC;AAEA,SAAS,aAAa,KAAA,EAAuB;AAC3C,EAAA,QAAQ,YAAA,CAAa,KAAK,CAAA;AAAG,IAC3B,KAAK,MAAA;AACH,MAAA,OAAO,mDAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAA,OAAO,+DAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAA,OAAO,4CAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAA,OAAO,GAAG,KAAK,CAAA,qCAAA,CAAA;AAAA,IACjB;AACE,MAAA,OAAO,GAAG,KAAK,CAAA,+BAAA,CAAA;AAAA;AAErB;AAEO,IAAM,EAAA,GAAqB;AAAA,EAChC,GAAA,EAAK,KAAA;AAAA,EACL,KAAA,EAAO,6FAAA;AAAA,EACP,WAAA,EAAa,+GAAA;AAAA,EACb,OAAA,EAAS,gCAAA;AAAA,EACT,YAAA,EAAc,oGAAA;AAAA,EACd,gBAAA,EAAkB,2EAAA;AAAA,EAClB,MAAA,EAAQ,sCAAA;AAAA,EACR,MAAA,EAAQ,sCAAA;AAAA,EACR,GAAA,EAAK,2BAAA;AAAA;AAAA,EAEL,SAAA,EAAW,2IAAA;AAAA,EACX,IAAA,EAAM,mCAAA;AAAA,EACN,KAAA,EAAO,4BAAA;AAAA,EACP,gBAAA,EAAkB,mDAAA;AAAA,EAClB,UAAA,EAAY;AAAA,IACV,yBAAA,EAA2B,4EAAA;AAAA,IAC3B,WAAA,EAAa,6EAAA;AAAA,IACb,eAAA,EAAiB,gHAAA;AAAA,IACjB,kBAAA,EAAoB,0GAAA;AAAA,IACpB,oBAAA,EAAsB,2GAAA;AAAA,IACtB,sBAAA,EAAwB,iFAAA;AAAA,IACxB,yBAAA,EAA2B,+FAAA;AAAA,IAC3B,0BAAA,EAA4B,mGAAA;AAAA,IAC5B,oBAAA,EAAsB,kFAAA;AAAA,IACtB,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU,WAAA;AAAA,EACV,MAAM,CAAC,KAAA,KAAU,CAAA,OAAA,EAAK,YAAA,CAAa,KAAK,CAAC,CAAA,wFAAA;AAC3C,CAAA;;;AC1OA,IAAM,WAAA,GAA8B;AAAA,EAClC,yBAAA,EAA2B;AAAA,IACzB,WAAA,EACE,muBAAA;AAAA,IAGF,UAAA,EACE;AAAA,GAIJ;AAAA,EACA,WAAA,EAAa;AAAA,IACX,WAAA,EACE,woBAAA;AAAA,IAEF,UAAA,EACE;AAAA,GAGJ;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,WAAA,EACE,4uCAAA;AAAA,IAIF,UAAA,EACE;AAAA,GAGJ;AAAA,EACA,sBAAA,EAAwB;AAAA,IACtB,WAAA,EACE,ywBAAA;AAAA,IAGF,UAAA,EACE;AAAA,GAGJ;AAAA,EACA,0BAAA,EAA4B;AAAA,IAC1B,WAAA,EACE,ijBAAA;AAAA,IAEF,UAAA,EACE;AAAA,GAEJ;AAAA,EACA,0BAAA,EAA4B;AAAA,IAC1B,WAAA,EACE,8ZAAA;AAAA,IAEF,UAAA,EACE;AAAA,GAEJ;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,WAAA,EACE,yiBAAA;AAAA,IAGF,UAAA,EACE;AAAA,GAGJ;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,WAAA,EACE,qqBAAA;AAAA,IAGF,UAAA,EACE;AAAA,GAGJ;AAAA,EACA,sBAAA,EAAwB;AAAA,IACtB,WAAA,EACE,utBAAA;AAAA,IAGF,UAAA,EACE;AAAA,GAGJ;AAAA,EACA,yBAAA,EAA2B;AAAA,IACzB,WAAA,EACE,muBAAA;AAAA,IAGF,UAAA,EACE;AAAA,GAGJ;AAAA,EACA,8CAAA,EAAgD;AAAA,IAC9C,WAAA,EACE,kpBAAA;AAAA,IAGF,UAAA,EACE;AAAA,GAGJ;AAAA,EACA,yCAAA,EAA2C;AAAA,IACzC,WAAA,EACE,4qBAAA;AAAA,IAGF,UAAA,EACE;AAAA,GAEJ;AAAA,EACA,wCAAA,EAA0C;AAAA,IACxC,WAAA,EAAa,CAAC,CAAA,KAAM;AAAA,MAClB,4NAAA;AAAA,MACA,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,MACpB;AAAA,KAEF;AAAA,IACA,UAAA,EACE;AAAA,GAIJ;AAAA,EACA,0BAAA,EAA4B;AAAA,IAC1B,WAAA,EAAa,CAAC,CAAA,KAAM;AAAA,MAClB,iCAAA;AAAA,MACA,KAAK,OAAO,CAAA;AAAA,MACZ,sIAAA;AAAA,MACA,GAAG,YAAY,CAAA,EAAG;AAAA,QAChB,KAAA,EAAO,iGAAA;AAAA,QACP,OAAA,EAAS,qFAAA;AAAA,QACT,aAAA,EAAe,SAAA;AAAA,QACf,aAAA,EAAe,SAAA;AAAA,QACf,IAAA,EAAM,IAAA;AAAA,QACN,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,MACD;AAAA,KAEF;AAAA,IACA,UAAA,EACE;AAAA,GAGJ;AAAA,EACA,0BAAA,EAA4B;AAAA,IAC1B,WAAA,EACE,qsBAAA;AAAA,IAGF,UAAA,EACE;AAAA,GAEJ;AAAA,EACA,4BAAA,EAA8B;AAAA,IAC5B,WAAA,EACE,6iBAAA;AAAA,IAGF,UAAA,EACE;AAAA,GAEJ;AAAA,EACA,OAAA,EAAS;AAAA,IACP,WAAA,EACE,wjBAAA;AAAA,IAEF,UAAA,EACE;AAAA,GAGJ;AAAA,EACA,qBAAA,EAAuB;AAAA,IACrB,WAAA,EACE,ihBAAA;AAAA,IAEF,UAAA,EACE;AAAA;AAIN,CAAA;AAIO,IAAM,EAAA,GAAqB;AAAA,EAChC,GAAA,EAAK,KAAA;AAAA,EACL,KAAA,EAAO,+EAAA;AAAA,EACP,WAAA,EAAa,mHAAA;AAAA,EACb,OAAA,EAAS,0BAAA;AAAA,EACT,YAAA,EAAc,8FAAA;AAAA,EACd,gBAAA,EAAkB,8FAAA;AAAA,EAClB,MAAA,EAAQ,0BAAA;AAAA,EACR,MAAA,EAAQ,sCAAA;AAAA,EACR,GAAA,EAAK,uCAAA;AAAA;AAAA,EAEL,SAAA,EAAW,4IAAA;AAAA,EACX,IAAA,EAAM,sBAAA;AAAA,EACN,KAAA,EAAO,4BAAA;AAAA,EACP,gBAAA,EAAkB,wDAAA;AAAA,EAClB,UAAA,EAAY;AAAA,IACV,yBAAA,EAA2B,2EAAA;AAAA,IAC3B,WAAA,EAAa,2DAAA;AAAA,IACb,eAAA,EAAiB,uHAAA;AAAA,IACjB,kBAAA,EAAoB,yEAAA;AAAA,IACpB,oBAAA,EAAsB,gJAAA;AAAA,IACtB,sBAAA,EAAwB,kGAAA;AAAA,IACxB,yBAAA,EAA2B,2GAAA;AAAA,IAC3B,0BAAA,EAA4B,yGAAA;AAAA,IAC5B,oBAAA,EAAsB,uFAAA;AAAA,IACtB,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU,WAAA;AAAA,EACV,IAAA,EAAM,CAAC,KAAA,KACL,CAAA,OAAA,EAAK,UAAU,CAAA,GAAI,uCAAA,GAAY,CAAA,EAAG,KAAK,CAAA,yBAAA,CAAO,CAAA,0IAAA;AAClD,CAAA;;;ACjOA,IAAM,WAAA,GAA8B;AAAA,EAClC,yBAAA,EAA2B;AAAA,IACzB,WAAA,EACE,4mBAAA;AAAA,IAEF,UAAA,EACE;AAAA,GAGJ;AAAA,EACA,WAAA,EAAa;AAAA,IACX,WAAA,EACE,2jBAAA;AAAA,IAEF,UAAA,EACE;AAAA,GAEJ;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,WAAA,EACE,25BAAA;AAAA,IAGF,UAAA,EACE;AAAA,GAGJ;AAAA,EACA,sBAAA,EAAwB;AAAA,IACtB,WAAA,EACE,olBAAA;AAAA,IAEF,UAAA,EACE;AAAA,GAGJ;AAAA,EACA,0BAAA,EAA4B;AAAA,IAC1B,WAAA,EACE,icAAA;AAAA,IAEF,UAAA,EACE;AAAA,GAEJ;AAAA,EACA,0BAAA,EAA4B;AAAA,IAC1B,WAAA,EACE,0RAAA;AAAA,IACF,UAAA,EACE;AAAA,GACJ;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,WAAA,EACE,0eAAA;AAAA,IAGF,UAAA,EACE;AAAA,GAGJ;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,WAAA,EACE,ihBAAA;AAAA,IAEF,UAAA,EACE;AAAA,GAGJ;AAAA,EACA,sBAAA,EAAwB;AAAA,IACtB,WAAA,EACE,kmBAAA;AAAA,IAGF,UAAA,EACE;AAAA,GAGJ;AAAA,EACA,yBAAA,EAA2B;AAAA,IACzB,WAAA,EACE,ikBAAA;AAAA,IAGF,UAAA,EACE;AAAA,GAEJ;AAAA,EACA,8CAAA,EAAgD;AAAA,IAC9C,WAAA,EACE,6gBAAA;AAAA,IAGF,UAAA,EACE;AAAA,GAEJ;AAAA,EACA,yCAAA,EAA2C;AAAA,IACzC,WAAA,EACE,2gBAAA;AAAA,IAEF,UAAA,EACE;AAAA,GAEJ;AAAA,EACA,wCAAA,EAA0C;AAAA,IACxC,WAAA,EAAa,CAAC,CAAA,KAAM;AAAA,MAClB,yOAAA;AAAA,MACA,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,MACpB;AAAA,KAEF;AAAA,IACA,UAAA,EACE;AAAA,GAGJ;AAAA,EACA,0BAAA,EAA4B;AAAA,IAC1B,WAAA,EAAa,CAAC,CAAA,KAAM;AAAA,MAClB,SAAA;AAAA,MACA,KAAK,OAAO,CAAA;AAAA,MACZ,sGAAA;AAAA,MACA,GAAG,YAAY,CAAA,EAAG;AAAA,QAChB,KAAA,EAAO,2DAAA;AAAA,QACP,OAAA,EAAS,2DAAA;AAAA,QACT,aAAA,EAAe,IAAA;AAAA,QACf,aAAA,EAAe,IAAA;AAAA,QACf,IAAA,EAAM,IAAA;AAAA,QACN,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,MACD;AAAA,KAEF;AAAA,IACA,UAAA,EACE;AAAA,GAGJ;AAAA,EACA,0BAAA,EAA4B;AAAA,IAC1B,WAAA,EACE,0jBAAA;AAAA,IAEF,UAAA,EACE;AAAA,GAEJ;AAAA,EACA,4BAAA,EAA8B;AAAA,IAC5B,WAAA,EACE,8dAAA;AAAA,IAEF,UAAA,EACE;AAAA,GAEJ;AAAA,EACA,OAAA,EAAS;AAAA,IACP,WAAA,EACE,ubAAA;AAAA,IAEF,UAAA,EACE;AAAA,GAEJ;AAAA,EACA,qBAAA,EAAuB;AAAA,IACrB,WAAA,EACE,mYAAA;AAAA,IAEF,UAAA,EACE;AAAA;AAIN,CAAA;AAIA,IAAI,QAAA;AACJ,SAAS,aAAa,KAAA,EAAuB;AAC3C,EAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,IAAA,QAAA,GACE,OAAO,IAAA,KAAS,WAAA,IAAe,OAAO,IAAA,CAAK,WAAA,KAAgB,UAAA,GACvD,IAAI,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,GACzB,IAAA;AAAA,EACR;AACA,EAAA,QAAQ,QAAA,EAAU,MAAA,CAAO,KAAK,CAAA,IAAK,OAAA;AAAS,IAC1C,KAAK,KAAA;AACH,MAAA,OAAO,6CAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAA,OAAO,mDAAA;AAAA,IACT;AACE,MAAA,OAAO,GAAG,KAAK,CAAA,+BAAA,CAAA;AAAA;AAErB;AAEO,IAAM,EAAA,GAAqB;AAAA,EAChC,GAAA,EAAK,KAAA;AAAA,EACL,KAAA,EAAO,8DAAA;AAAA,EACP,WAAA,EAAa,6FAAA;AAAA,EACb,OAAA,EAAS,gCAAA;AAAA,EACT,YAAA,EAAc,0GAAA;AAAA,EACd,gBAAA,EAAkB,yDAAA;AAAA,EAClB,MAAA,EAAQ,oBAAA;AAAA,EACR,MAAA,EAAQ,0BAAA;AAAA,EACR,GAAA,EAAK,iCAAA;AAAA;AAAA,EAEL,SAAA,EAAW,6GAAA;AAAA,EACX,IAAA,EAAM,sBAAA;AAAA,EACN,KAAA,EAAO,sBAAA;AAAA,EACP,gBAAA,EAAkB,6CAAA;AAAA,EAClB,UAAA,EAAY;AAAA,IACV,yBAAA,EAA2B,8FAAA;AAAA,IAC3B,WAAA,EAAa,qDAAA;AAAA,IACb,eAAA,EAAiB,qGAAA;AAAA,IACjB,kBAAA,EAAoB,0EAAA;AAAA,IACpB,oBAAA,EAAsB,2GAAA;AAAA,IACtB,sBAAA,EAAwB,2EAAA;AAAA,IACxB,yBAAA,EAA2B,6EAAA;AAAA,IAC3B,0BAAA,EAA4B,gHAAA;AAAA,IAC5B,oBAAA,EAAsB,wFAAA;AAAA,IACtB,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU,WAAA;AAAA,EACV,MAAM,CAAC,KAAA,KAAU,CAAA,OAAA,EAAK,YAAA,CAAa,KAAK,CAAC,CAAA,2GAAA;AAC3C,CAAA;;;ACzMA,IAAM,EAAA,GAAqB;AAAA,EACzB,GAAA,EAAK,KAAA;AAAA,EACL,KAAA,EAAO,oBAAA;AAAA,EACP,WAAA,EAAa,gCAAA;AAAA,EACb,OAAA,EAAS,SAAA;AAAA,EACT,YAAA,EAAc,6BAAA;AAAA,EACd,gBAAA,EAAkB,cAAA;AAAA,EAClB,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ,QAAA;AAAA,EACR,GAAA,EAAK,MAAA;AAAA,EACL,SAAA,EAAW,mBAAA;AAAA,EACX,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO,SAAA;AAAA,EACP,gBAAA,EAAkB,UAAA;AAAA,EAClB,UAAA,EAAY;AAAA,IACV,yBAAA,EAA2B,yBAAA;AAAA,IAC3B,WAAA,EAAa,aAAA;AAAA,IACb,eAAA,EAAiB,mBAAA;AAAA,IACjB,kBAAA,EAAoB,kBAAA;AAAA,IACpB,oBAAA,EAAsB,oBAAA;AAAA,IACtB,sBAAA,EAAwB,sBAAA;AAAA,IACxB,yBAAA,EAA2B,2BAAA;AAAA,IAC3B,0BAAA,EAA4B,0BAAA;AAAA,IAC5B,oBAAA,EAAsB,oBAAA;AAAA,IACtB,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU,WAAA;AAAA,EACV,IAAA,EAAM,CAAC,KAAA,KAAU,CAAA,OAAA,EAAK,KAAK,CAAA,gCAAA;AAC7B,CAAA;AAEO,IAAM,eAAA,GACX;AAAA,EACE,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAMF,IAAM,UAAA,GAA8D;AAAA,EAClE,CAAC,MAAM,qEAAqE,CAAA;AAAA,EAC5E,CAAC,MAAM,oBAAoB,CAAA;AAAA,EAC3B,CAAC,MAAM,yBAAyB;AAClC,CAAA;AAEA,IAAM,SAAA,uBAAgB,GAAA,CAAY,CAAC,MAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAC,CAAA;AASnD,SAAS,cAAc,UAAA,EAAoC;AAChE,EAAA,IAAI,UAAA,IAAc,IAAA,IAAQ,UAAA,KAAe,MAAA,EAAQ;AAC/C,IAAA,OAAO,SAAA,CAAU,GAAA,CAAI,UAAU,CAAA,GAAK,UAAA,GAA+B,IAAA;AAAA,EACrE;AACA,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,IAAA;AAC5C,EAAA,MAAM,QAAQ,QAAA,CAAS,eAAA,CAAgB,aAAa,MAAM,CAAA,IAAK,IAAI,IAAA,EAAK;AACxE,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,KAAK,CAAA,IAAK,UAAA,MAAgB,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,MAAA;AACvE,EAAA,OAAO,IAAA;AACT;;;ACxEA,IAAM,YAAA,GAAe,uBAAA;AAIrB,IAAM,YAAA,GAAe,qDAAA;AACrB,IAAM,OAAA,GAAU,gEAAgE,YAAY,CAAA,YAAA,CAAA;AAC5F,IAAM,SAAA,GAAY,0DAAA;AAElB,IAAM,MAAA,GAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAA,EAkBI,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yEAAA,EA+CiD,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA,qGAAA,EAImB,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAAA,EAgB/F,SAAS,CAAA;AAAA;AAAA,kCAAA,EAEU,OAAO,CAAA;AAAA,mEAAA,EAC0B,OAAO,CAAA;AAAA;AAAA;AAAA,oBAAA,EAGtD,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAAA,EAQd,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA6B1B,SAAS,EAAA,CACP,GAAA,EACA,SAAA,EACA,IAAA,EAC0B;AAC1B,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACvC,EAAA,IAAI,SAAA,OAAgB,SAAA,GAAY,SAAA;AAChC,EAAA,IAAI,IAAA,IAAQ,IAAA,EAAM,IAAA,CAAK,WAAA,GAAc,IAAA;AACrC,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,YAAY,IAAA,EAAsB;AACzC,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAC1C,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,KAAA,CAAM,wCAAwC,CAAA;AACxE,EAAA,IAAI,MAAA,IAAU,MAAA,CAAO,KAAA,IAAS,IAAA,EAAM;AAClC,IAAA,OAAO,WAAW,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,EACzD;AACA,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA;AAClC,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,EAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AACjC;AAKA,IAAM,SAAA,GAA8C;AAAA,EAClD,QAAA,EAAU,MAAA;AAAA,EACV,QAAA,EAAU,KAAA;AAAA,EACV,QAAA,EAAU,KAAA;AAAA,EACV,QAAA,EAAU,KAAA;AAAA,EACV,QAAA,EAAU,KAAA;AAAA,EACV,QAAA,EAAU,KAAA;AAAA,EACV,QAAA,EAAU,KAAA;AAAA,EACV,QAAA,EAAU,KAAA;AAAA,EACV,QAAA,EAAU,KAAA;AAAA,EACV,QAAA,EAAU,KAAA;AAAA,EACV,QAAA,EAAU,KAAA;AAAA,EACV,QAAA,EAAU,KAAA;AAAA,EACV,QAAA,EAAU,KAAA;AAAA,EACV,QAAA,EAAU;AACZ,CAAA;AACA,IAAM,YAAA,GACJ,4DAAA;AACF,IAAM,eAAA,GACJ,8DAAA;AAGF,IAAM,UAAA,GAAa,aAAA;AAEnB,SAAS,WAAA,CACP,OACA,OAAA,EACa;AACb,EAAA,IAAI,KAAA,IAAS,IAAA,IAAQ,KAAA,KAAU,EAAA,EAAI;AACjC,IAAA,OAAO,EAAA;AAAA,MACL,MAAA;AAAA,MACA,gBAAA;AAAA,MACA,KAAA,KAAU,EAAA,GAAK,OAAA,CAAQ,KAAA,GAAQ,OAAA,CAAQ;AAAA,KACzC;AAAA,EACF;AACA,EAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,KAAA,EAAO,UAAU,CAAA;AAClC,EAAA,KAAA,CAAM,GAAA,GAAM,MAAA;AAGZ,EAAA,IAAI,WAAW,IAAA,CAAK,KAAK,GAAG,KAAA,CAAM,SAAA,CAAU,IAAI,UAAU,CAAA;AAC1D,EAAA,IAAI,CAAC,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA,EAAG;AAC7B,IAAA,KAAA,CAAM,WAAA,GAAc,KAAA;AACpB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,CAAM,eAAe,CAAA,EAAG;AAC/C,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,IAAA,GAAO,UAAU,IAAI,CAAA;AAC3B,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,KAAA,CAAM,OAAO,IAAI,CAAA;AACjB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,MAAA,EAAQ,cAAA,EAAgB,IAAI,CAAA;AAC7C,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,WAAA,CAAY,CAAC,CAAA,CAAG,QAAA,CAAS,EAAE,CAAA,CAAE,WAAA,EAAY,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AAC1E,IAAA,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAA,EAAK,EAAE,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAC7B,IAAA,KAAA,CAAM,YAAY,KAAK,CAAA;AAAA,EACzB;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,eAAe,QAAA,EAAuD;AAC7E,EAAA,MAAM,GAAA,GAAM,SAAS,sBAAA,EAAuB;AAC5C,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,IAAI,OAAO,MAAM,QAAA,EAAU;AACzB,MAAA,GAAA,CAAI,OAAO,CAAC,CAAA;AAAA,IACd,CAAA,MAAA,IAAW,UAAU,CAAA,EAAG;AACtB,MAAA,MAAM,CAAA,GAAI,EAAA,CAAG,MAAA,EAAQ,SAAA,EAAW,EAAE,IAAI,CAAA;AACtC,MAAA,CAAA,CAAE,GAAA,GAAM,MAAA;AACR,MAAA,GAAA,CAAI,YAAY,CAAC,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,MAAM,CAAA,GAAI,EAAA,CAAG,KAAA,EAAO,UAAA,EAAY,EAAE,KAAK,CAAA;AACvC,MAAA,GAAA,CAAI,YAAY,CAAC,CAAA;AAAA,IACnB;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAIA,SAAS,UAAU,IAAA,EAAgC;AACjD,EAAA,OAAO,IAAA,CACJ,MAAM,GAAG,CAAA,CACT,IAAI,CAAC,IAAA,EAAM,MAAO,CAAA,GAAI,CAAA,KAAM,IAAI,EAAE,IAAA,EAAM,MAAK,GAAI,IAAK,EACtD,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,EAAE,CAAA;AAC3B;AASA,SAAS,SAAA,CACP,KAAA,EACA,KAAA,EACA,OAAA,EACqD;AACrD,EAAA,MAAM,KAAK,KAAA,CAAM,SAAA;AACjB,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,IAAU,EAAC;AAChC,EAAA,IAAI,MAAM,MAAA,CAAO,SAAA,CAAU,eAAe,IAAA,CAAK,WAAA,EAAa,EAAE,CAAA,EAAG;AAC/D,IAAA,MAAM,OAAA,GAAU,UAAU,aAAA,CAAc,WAAA,CAAY,EAAE,CAAA,CAAE,KAAK,CAAA,EAAG,MAAM,CAAC,CAAA;AACvE,IAAA,IAAI,OAAA,KAAY,KAAA,CAAM,KAAK,CAAA,EAAG;AAC5B,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,cAAc,OAAA,CAAQ,QAAA,CAAS,EAAE,CAAA,CAAE,KAAK,GAAG,MAAM,CAAA;AAAA,QAC3D,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,EAAE,UAAU,SAAA,CAAU,KAAA,CAAM,KAAK,CAAC,CAAA,EAAG,YAAY,KAAA,EAAM;AAChE;AAEA,SAAS,UAAA,CACP,QACA,OAAA,EACa;AACb,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,KAAA,EAAO,SAAS,CAAA;AAEhC,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,KAAA,EAAO,cAAc,CAAA;AACrC,EAAA,IAAA,CAAK,WAAA;AAAA,IACH,EAAA;AAAA,MACE,MAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAQ,UAAA,CAAW,MAAA,CAAO,KAAA,CAAM,QAAQ,KAAK,OAAA,CAAQ;AAAA;AACvD,GACF;AACA,EAAA,MAAM,IAAA,GAAO,EAAA;AAAA,IACX,MAAA;AAAA,IACA,SAAA;AAAA,IACA,GAAG,IAAA,CAAK,KAAA,CAAM,OAAO,KAAA,CAAM,UAAA,GAAa,GAAG,CAAC,CAAA,CAAA;AAAA,GAC9C;AACA,EAAA,IAAA,CAAK,GAAA,GAAM,KAAA;AACX,EAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AACrB,EAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AAErB,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,KAAA,EAAO,SAAS,CAAA;AAEhC,EAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,KAAA,EAAO,UAAU,CAAA;AAClC,EAAA,MAAM,OAAO,MAAA,CAAO,SAAA,IAAa,MAAA,CAAO,IAAA,CAAK,SAAS,WAAA,EAAY;AAClE,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,MAAM,IAAA,GAAO,EAAA;AAAA,MACX,KAAA;AAAA,MACA,MAAA,CAAO,YAAY,SAAA,GAAY,SAAA;AAAA,MAC/B,IAAI,IAAI,CAAA,CAAA;AAAA,KACV;AACA,IAAA,IAAA,CAAK,GAAA,GAAM,KAAA;AACX,IAAA,KAAA,CAAM,MAAA,CAAO,MAAM,QAAK,CAAA;AAAA,EAC1B;AACA,EAAA,MAAM,OAAO,EAAA,CAAG,MAAA,EAAQ,MAAA,EAAW,MAAA,CAAO,KAAK,IAAI,CAAA;AACnD,EAAA,IAAA,CAAK,GAAA,GAAM,KAAA;AACX,EAAA,KAAA,CAAM,YAAY,IAAI,CAAA;AACtB,EAAA,IAAI,MAAA,CAAO,KAAK,SAAA,EAAW;AACzB,IAAA,MAAM,IAAA,GAAO,GAAG,KAAA,EAAO,SAAA,EAAW,IAAI,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAE,CAAA;AAC7D,IAAA,IAAA,CAAK,GAAA,GAAM,KAAA;AACX,IAAA,KAAA,CAAM,MAAA,CAAO,UAAO,IAAI,CAAA;AAAA,EAC1B;AACA,EAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AAEtB,EAAA,IAAI,MAAA,CAAO,UAAU,IAAA,EAAM;AACzB,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA;AAC7C,IAAA,MAAM,GAAA,GAAM,EAAA;AAAA,MACV,KAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA,CAAO,SAAS,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,CAAA,GAAK;AAAA,KAC7D;AACA,IAAA,GAAA,CAAI,GAAA,GAAM,KAAA;AACV,IAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AAAA,EACtB;AAEA,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,KAAA,EAAO,SAAS,CAAA;AAChC,EAAA,MAAM,MAAA,GAAS,EAAA,CAAG,KAAA,EAAO,mBAAmB,CAAA;AAC5C,EAAA,MAAA,CAAO,YAAY,EAAA,CAAG,MAAA,EAAQ,UAAA,EAAY,OAAA,CAAQ,MAAM,CAAC,CAAA;AACzD,EAAA,MAAA,CAAO,WAAA,CAAY,WAAA,CAAY,MAAA,CAAO,MAAA,EAAQ,OAAO,CAAC,CAAA;AACtD,EAAA,MAAM,MAAA,GAAS,EAAA,CAAG,KAAA,EAAO,mBAAmB,CAAA;AAC5C,EAAA,MAAA,CAAO,YAAY,EAAA,CAAG,MAAA,EAAQ,UAAA,EAAY,OAAA,CAAQ,MAAM,CAAC,CAAA;AACzD,EAAA,MAAA,CAAO,WAAA,CAAY,WAAA,CAAY,MAAA,CAAO,MAAA,EAAQ,OAAO,CAAC,CAAA;AACtD,EAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AACvB,EAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AACvB,EAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AAErB,EAAA,MAAM,WAAA,GAAc,SAAA,CAAU,MAAA,CAAO,KAAA,EAAO,eAAe,OAAO,CAAA;AAClE,EAAA,MAAM,OAAA,GAAU,EAAA,CAAG,KAAA,EAAO,YAAY,CAAA;AAGtC,EAAA,OAAA,CAAQ,GAAA,GAAM,WAAA,CAAY,UAAA,GAAa,OAAA,CAAQ,GAAA,GAAM,MAAA;AACrD,EAAA,OAAA,CAAQ,WAAA,CAAY,cAAA,CAAe,WAAA,CAAY,QAAQ,CAAC,CAAA;AACxD,EAAA,IAAA,CAAK,YAAY,OAAO,CAAA;AAExB,EAAA,MAAM,UAAA,GAAa,SAAA,CAAU,MAAA,CAAO,KAAA,EAAO,cAAc,OAAO,CAAA;AAChE,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,KAAA,EAAO,QAAQ,CAAA;AAC9B,EAAA,GAAA,CAAI,YAAY,EAAA,CAAG,QAAA,EAAU,MAAA,EAAW,OAAA,CAAQ,GAAG,CAAC,CAAA;AACpD,EAAA,GAAA,CAAI,OAAO,GAAG,CAAA;AACd,EAAA,MAAM,OAAA,GAAU,GAAG,MAAM,CAAA;AACzB,EAAA,OAAA,CAAQ,GAAA,GAAM,UAAA,CAAW,UAAA,GAAa,OAAA,CAAQ,GAAA,GAAM,MAAA;AACpD,EAAA,OAAA,CAAQ,WAAA,CAAY,cAAA,CAAe,UAAA,CAAW,QAAQ,CAAC,CAAA;AACvD,EAAA,GAAA,CAAI,YAAY,OAAO,CAAA;AACvB,EAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AAEpB,EAAA,IAAI,MAAA,CAAO,MAAM,OAAA,IAAW,eAAA,CAAgB,KAAK,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,EAAG;AACtE,IAAA,MAAM,CAAA,GAAI,EAAA,CAAG,GAAA,EAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAC9C,IAAA,CAAA,CAAE,IAAA,GAAO,OAAO,KAAA,CAAM,OAAA;AACtB,IAAA,CAAA,CAAE,MAAA,GAAS,QAAA;AACX,IAAA,CAAA,CAAE,GAAA,GAAM,qBAAA;AACR,IAAA,IAAA,CAAK,YAAY,CAAC,CAAA;AAAA,EACpB;AAEA,EAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AACrB,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,aAAA,CAAc,OAAA,GAA0B,EAAC,EAAkB;AACzE,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,cAAA;AACrC,EAAA,IAAI,IAAA,GAA2B,IAAA;AAC/B,EAAA,IAAI,MAAA,GAA6B,IAAA;AACjC,EAAA,IAAI,OAAA,GAA8B,IAAA;AAClC,EAAA,IAAI,MAAA,GAA6B,IAAA;AACjC,EAAA,IAAI,UAAA,GAAiC,IAAA;AACrC,EAAA,IAAI,cAAA,GAAuD,IAAA;AAC3D,EAAA,IAAI,aAAA,GAAgB,KAAA;AACpB,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,UAA0B,eAAA,CAAgB,EAAA;AAE9C,EAAA,SAAS,aAAA,GAAsB;AAC7B,IAAA,IAAI,IAAA,EAAM;AACV,IAAA,QAAA,CAAS,cAAA,CAAe,YAAY,CAAA,EAAG,MAAA,EAAO;AAG9C,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,OAAA,CAAQ,MAAM,CAAA;AAC3C,IAAA,OAAA,GAAU,gBAAgB,MAAM,CAAA;AAEhC,IAAA,IAAA,GAAO,QAAA,CAAS,cAAc,KAAK,CAAA;AACnC,IAAA,IAAA,CAAK,EAAA,GAAK,YAAA;AACV,IAAA,IAAA,CAAK,YAAA,CAAa,sBAAsB,SAAS,CAAA;AACjD,IAAA,IAAA,CAAK,YAAA,CAAa,eAAe,OAAO,CAAA;AACxC,IAAA,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,OAAA,CAAQ,GAAG,CAAA;AACpC,IAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,MAAM,CAAA;AAChC,IAAA,MAAM,SAAS,IAAA,CAAK,YAAA,CAAa,EAAE,IAAA,EAAM,QAAQ,CAAA;AAEjD,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,IAAA,KAAA,CAAM,WAAA,GAAc,MAAA;AACpB,IAAA,MAAA,CAAO,YAAY,KAAK,CAAA;AAExB,IAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,KAAA,EAAO,CAAA,YAAA,EAAe,QAAQ,CAAA,CAAE,CAAA;AAKjD,IAAA,KAAA,CAAM,YAAA,CAAa,KAAA,EAAO,OAAA,CAAQ,GAAG,CAAA;AACrC,IAAA,KAAA,CAAM,YAAA,CAAa,QAAQ,MAAM,CAAA;AACjC,IAAA,KAAA,CAAM,YAAA,CAAa,QAAQ,QAAQ,CAAA;AACnC,IAAA,KAAA,CAAM,YAAA,CAAa,YAAA,EAAc,OAAA,CAAQ,WAAW,CAAA;AAEpD,IAAA,MAAM,MAAA,GAAS,EAAA,CAAG,KAAA,EAAO,WAAW,CAAA;AACpC,IAAA,MAAA,CAAO,WAAA,CAAY,EAAA,CAAG,MAAA,EAAQ,QAAQ,CAAC,CAAA;AACvC,IAAA,MAAA,CAAO,YAAY,EAAA,CAAG,MAAA,EAAQ,UAAA,EAAY,OAAA,CAAQ,KAAK,CAAC,CAAA;AACxD,IAAA,OAAA,GAAU,EAAA,CAAG,MAAA,EAAQ,UAAA,EAAY,GAAG,CAAA;AACpC,IAAA,OAAA,CAAQ,GAAA,GAAM,KAAA;AACd,IAAA,MAAA,CAAO,YAAY,OAAO,CAAA;AAC1B,IAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,QAAA,EAAU,QAAA,EAAU,QAAQ,OAAO,CAAA;AACpD,IAAA,KAAA,CAAM,YAAA,CAAa,YAAA,EAAc,OAAA,CAAQ,YAAY,CAAA;AACrD,IAAA,KAAA,CAAM,gBAAA,CAAiB,OAAA,EAAS,MAAM,OAAA,EAAS,CAAA;AAC/C,IAAA,MAAA,CAAO,YAAY,KAAK,CAAA;AACxB,IAAA,KAAA,CAAM,YAAY,MAAM,CAAA;AAExB,IAAA,MAAA,GAAS,EAAA,CAAG,OAAO,SAAS,CAAA;AAC5B,IAAA,KAAA,CAAM,YAAY,MAAM,CAAA;AAExB,IAAA,MAAA,GAAS,EAAA,CAAG,OAAO,SAAS,CAAA;AAC5B,IAAA,UAAA,GAAa,EAAA,CAAG,QAAQ,cAAc,CAAA;AACtC,IAAA,MAAA,CAAO,YAAY,UAAU,CAAA;AAC7B,IAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,QAAA,EAAU,WAAA,EAAa,QAAG,CAAA;AAC3C,IAAA,KAAA,CAAM,YAAA,CAAa,YAAA,EAAc,OAAA,CAAQ,gBAAgB,CAAA;AACzD,IAAA,KAAA,CAAM,gBAAA,CAAiB,OAAA,EAAS,MAAM,WAAA,EAAa,CAAA;AACnD,IAAA,MAAA,CAAO,YAAY,KAAK,CAAA;AACxB,IAAA,KAAA,CAAM,YAAY,MAAM,CAAA;AAExB,IAAA,MAAA,CAAO,YAAY,KAAK,CAAA;AACxB,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAE9B,IAAA,IAAA,CAAK,gBAAA,CAAiB,SAAA,EAAW,CAAC,CAAA,KAAM;AACtC,MAAA,IAAK,CAAA,CAAoB,GAAA,KAAQ,QAAA,EAAU,OAAA,EAAQ;AAAA,IACrD,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,SAAS,WAAA,GAAoB;AAC3B,IAAA,aAAA,GAAgB,IAAA;AAChB,IAAA,MAAA,EAAQ,SAAA,CAAU,OAAO,SAAS,CAAA;AAAA,EACpC;AAMA,EAAA,SAAS,UAAA,GAAmB;AAC1B,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,UAAA,IAAc,aAAA,EAAe;AAC7C,IAAA,UAAA,CAAW,WAAA,GAAc,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AAC3C,IAAA,IAAI,KAAA,IAAS,CAAA,EAAG,MAAA,CAAO,SAAA,CAAU,IAAI,SAAS,CAAA;AAAA,EAChD;AAMA,EAAA,SAAS,OAAA,GAAgB;AACvB,IAAA,IAAI,cAAA,eAA6B,cAAc,CAAA;AAC/C,IAAA,cAAA,GAAiB,IAAA;AACjB,IAAA,IAAA,EAAM,MAAA,EAAO;AACb,IAAA,IAAA,GAAO,IAAA;AACP,IAAA,MAAA,GAAS,IAAA;AACT,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,MAAA,GAAS,IAAA;AACT,IAAA,UAAA,GAAa,IAAA;AACb,IAAA,KAAA,GAAQ,CAAA;AACR,IAAA,aAAA,GAAgB,KAAA;AAAA,EAClB;AAEA,EAAA,SAAS,KAAK,MAAA,EAA+B;AAC3C,IAAA,aAAA,EAAc;AACd,IAAA,KAAA,IAAS,CAAA;AACT,IAAA,IAAI,OAAA,EAAS,OAAA,CAAQ,WAAA,GAAc,MAAA,CAAO,KAAK,CAAA;AAC/C,IAAA,MAAA,EAAQ,WAAA,CAAY,UAAA,CAAW,MAAA,EAAQ,OAAO,CAAC,CAAA;AAG/C,IAAA,IAAI,cAAA,eAA6B,cAAc,CAAA;AAC/C,IAAA,cAAA,GAAiB,UAAA,CAAW,YAAY,GAAG,CAAA;AAAA,EAC7C;AAEA,EAAA,OAAO,EAAE,MAAM,OAAA,EAAQ;AACzB;;;AC1fA,SAAS,SAAS,IAAA,EAA0B;AAC1C,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,IACE,IAAI,UAAA,CAAW,eAAe,KAC9B,GAAA,CAAI,UAAA,CAAW,0BAA0B,CAAA,EACzC;AACA,MAAA,OAAQ,IAAA,CAA0C,GAAG,CAAA,IAAK,IAAA;AAAA,IAC5D;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,cAAc,IAAA,EAAmC;AACxD,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,UAAU,OAAO,MAAA;AAC9C,EAAA,IAAI,OAAO,SAAS,UAAA,EAAY;AAC9B,IAAA,MAAM,EAAA,GAAK,IAAA;AACX,IAAA,OAAO,EAAA,CAAG,WAAA,IAAe,EAAA,CAAG,IAAA,IAAQ,MAAA;AAAA,EACtC;AACA,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,MAAM,GAAA,GAAM,IAAA;AAKZ,IAAA,IAAI,GAAA,CAAI,WAAA,EAAa,OAAO,GAAA,CAAI,WAAA;AAChC,IAAA,IAAI,IAAI,MAAA,EAAQ,OAAO,IAAI,MAAA,CAAO,WAAA,IAAe,IAAI,MAAA,CAAO,IAAA;AAC5D,IAAA,IAAI,GAAA,CAAI,IAAA,EAAM,OAAO,aAAA,CAAc,IAAI,IAAI,CAAA;AAAA,EAC7C;AACA,EAAA,OAAO,MAAA;AACT;AAOO,SAAS,mBAAmB,IAAA,EAAwC;AACzE,EAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAC;AACnB,EAAA,IAAI;AACF,IAAA,IAAI,KAAA,GAAsB,SAAS,IAAI,CAAA;AACvC,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,OAAO,KAAA,IAAS,OAAO,EAAA,EAAI;AACzB,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,MAAM,IAAA,GAAO,aAAA,CAAc,KAAA,CAAM,IAAI,CAAA;AAGrC,QAAA,IAAI,QAAQ,CAAC,QAAA,CAAS,IAAA,CAAK,IAAI,GAAG,SAAA,GAAY,IAAA;AAAA,MAChD;AACA,MAAA,IAAI,CAAC,QAAA,IAAY,KAAA,CAAM,YAAA,EAAc,QAAA,EAAU;AAC7C,QAAA,QAAA,GAAW;AAAA,UACT,IAAA,EAAM,MAAM,YAAA,CAAa,QAAA;AAAA,UACzB,IAAA,EAAM,MAAM,YAAA,CAAa,UAAA;AAAA,UACzB,MAAA,EAAQ,MAAM,YAAA,CAAa;AAAA,SAC7B;AAAA,MACF;AACA,MAAA,IAAI,aAAa,QAAA,EAAU;AAC3B,MAAA,KAAA,GAAQ,MAAM,MAAA,IAAU,IAAA;AACxB,MAAA,IAAA,IAAQ,CAAA;AAAA,IACV;AACA,IAAA,MAAM,SAA2B,EAAC;AAClC,IAAA,IAAI,SAAA,SAAkB,SAAA,GAAY,SAAA;AAClC,IAAA,IAAI,QAAA,SAAiB,QAAA,GAAW,QAAA;AAChC,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;;;AC9DA,IAAM,mBAAA,GAAsB,EAAA;AAW5B,SAAS,YACP,MAAA,EAC0C;AAC1C,EAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,GAAG,OAAO,MAAA;AAC3C,EAAA,OAAO,CAAC,UAAA,KAAoC;AAC1C,IAAA,MAAM,IAAA,GAAO,WAAW,OAAA,IAAW,IAAA;AACnC,IAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,MAAA,IAAI,OAAO,SAAS,UAAA,EAAY;AAC9B,QAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,IAAA;AAAA,MACjC,WAAW,IAAA,EAAM;AACf,QAAA,IAAI;AACF,UAAA,IAAI,IAAA,CAAK,QAAQ,IAAI,CAAA,IAAK,KAAK,OAAA,CAAQ,IAAI,GAAG,OAAO,IAAA;AAAA,QACvD,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AACF;AAEO,IAAM,sBAAN,MAA0B;AAAA,EAmB/B,WAAA,CAAY,OAAA,GAA4B,EAAC,EAAG;AAhB5C,IAAA,IAAA,CAAQ,eAAA,GAAuC,IAAA;AAC/C,IAAA,IAAA,CAAiB,YAAA,uBAAmB,GAAA,EAAY;AAChD,IAAA,IAAA,CAAiB,WAA8B,EAAC;AAChD,IAAA,IAAA,CAAQ,OAAA,GAAU,KAAA;AAClB,IAAA,IAAA,CAAQ,iBAAmC,EAAC;AAC5C,IAAA,IAAA,CAAiB,QAAA,uBAAe,GAAA,EAAY;AAK5C;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAiB,cAAA,uBAAqB,GAAA,EAA8B;AACpE,IAAA,IAAA,CAAiB,WAAA,uBAAkB,GAAA,EAAY;AAC/C,IAAA,IAAA,CAAQ,iBAAuD,EAAC;AAChE,IAAA,IAAA,CAAQ,gBAAA,GAAmB,KAAA;AAC3B,IAAA,IAAA,CAAQ,YAAA,GAAqD,IAAA;AAuD7D,IAAA,IAAA,CAAA,kBAAA,GAAqB,CACnB,OACA,IAAA,KACS;AACT,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,MAAA,IAAA,CAAK,gBAAgB,OAAO,CAAA;AAC5B,MAAA,IAAI,KAAK,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,IAAK,MAAM,cAAA,EAAgB;AACtD,QAAA,IAAA,CAAK,cAAA,CAAe,IAAI,OAAA,EAAS;AAAA,UAC/B,gBAAgB,IAAA,CAAK,cAAA;AAAA,UACrB,SAAA,EAAW,uBAAA,CAAwB,IAAA,CAAK,cAAc;AAAA,SACvD,CAAA;AAAA,MACH;AACA,MAAA,IAAA,CAAK,YAAA,CAAa;AAAA,QAChB,gBAAgB,IAAA,EAAM,cAAA;AAAA,QACtB,SAAA,EAAW,uBAAA,CAAwB,IAAA,EAAM,cAAc,CAAA;AAAA,QACvD,YAAA,EAAc;AAAA,OACf,CAAA;AACD,MAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,IACvB,CAAA;AAvEE,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,eAAA,CAAgB;AAAA,MACnC,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,OAAO,OAAA,CAAQ,QAAA;AAAA,MACf,MAAA,EAAQ,WAAA,CAAY,OAAA,EAAS,MAAM;AAAA,KACpC,CAAA;AAAA,EACH;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAI,KAAK,OAAA,IAAW,CAAC,KAAA,IAAS,OAAO,WAAW,WAAA,EAAa;AAC7D,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAKf,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA;AAAA,MACZ,IAAA,CAAK,UAAU,OAAA,CAAQ,CAAC,WAAW,IAAA,CAAK,OAAA,CAAQ,QAAA,GAAW,MAAM,CAAC;AAAA,KACpE;AACA,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,IAAA,CAAK,UAAU,OAAA,CAAQ,qBAAA,EAAuB,CAAC,CAAA;AAClE,IAAA,IAAA,CAAK,YAAA,EAAa;AAIlB,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA;AAAA,MACZ,gBAAA,CAAiB,CAAC,OAAA,KAAY;AAC5B,QAAA,IAAA,CAAK,gBAAgB,OAAO,CAAA;AAC5B,QAAA,IAAA,CAAK,YAAA,CAAa,EAAE,YAAA,EAAc,OAAA,EAAS,CAAA;AAC3C,QAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,MACvB,CAAC;AAAA,KACH;AAEA,IAAA,IAAA,CAAK,2BAAA,EAA4B;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,2BAAA,GAAoC;AAC1C,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,MAAM,MAAA,GAAS,CAAC,EAAA,EAAI,GAAA,EAAK,KAAK,IAAI,CAAA;AAClC,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,IAAA,GAAO,KAAA,KAAU,MAAA,CAAO,MAAA,CAAO,SAAS,CAAC,CAAA;AAC/C,MAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,QAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,QAAA,IAAI,IAAA,OAAW,kBAAA,EAAmB;AAAA,MACpC,GAAG,KAAK,CAAA;AACR,MAAA,IAAA,CAAK,cAAA,CAAe,KAAK,KAAK,CAAA;AAAA,IAChC;AAAA,EACF;AAAA,EAuBQ,gBAAgB,OAAA,EAAuB;AAC7C,IAAA,IAAI,IAAA,CAAK,SAAS,IAAA,IAAQ,YAAA,IAAgB,CAAC,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,EAAG;AACrE,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,OAAO,CAAA;AAAA,EAC3B;AAAA,EAEQ,aAAa,GAAA,EAA6B;AAChD,IAAA,IAAA,CAAK,cAAA,GAAiB;AAAA,MACpB,cAAA,EAAgB,GAAA,CAAI,cAAA,IAAkB,IAAA,CAAK,cAAA,CAAe,cAAA;AAAA,MAC1D,SAAA,EAAW,GAAA,CAAI,SAAA,IAAa,IAAA,CAAK,cAAA,CAAe,SAAA;AAAA,MAChD,QAAA,EAAU,GAAA,CAAI,QAAA,IAAY,IAAA,CAAK,cAAA,CAAe,QAAA;AAAA,MAC9C,YAAA,EAAc,GAAA,CAAI,YAAA,IAAgB,IAAA,CAAK,cAAA,CAAe;AAAA,KACxD;AAAA,EACF;AAAA;AAAA;AAAA,EAIQ,WAAW,OAAA,EAAmC;AACpD,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,KAAK,cAAA,CAAe,QAAA;AAAA,MAC9B,GAAG,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,OAAO;AAAA,KACpC;AAAA,EACF;AAAA,EAEQ,UAAA,GAA+B;AACrC,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,KAAK,cAAA,CAAe,cAAA;AAAA,MACpC,SAAA,EAAW,KAAK,cAAA,CAAe,SAAA;AAAA,MAC/B,QAAA,EAAU,KAAK,cAAA,CAAe;AAAA,KAChC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,OAAO,OAAA,EAAiC;AACtC,IAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACrD,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,UAAU,SAAA,CAAU;AAAA,MACvB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,OAAO,OAAA,CAAQ,QAAA;AAAA,MACf,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,MAAM;AAAA,KACnC,CAAA;AACD,IAAA,IAAI,KAAK,OAAA,IAAW,UAAA,CAAW,OAAA,CAAQ,OAAO,MAAM,aAAA,EAAe;AACjE,MAAA,IAAA,CAAK,cAAA,EAAe;AACpB,MAAA,IAAA,CAAK,YAAA,EAAa;AAAA,IACpB;AAAA,EACF;AAAA,EAEQ,YAAA,GAAqB;AAC3B,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,OAAA,KAAY,KAAA,EAAO;AACpC,IAAA,MAAM,MAAA,GAAS,aAAA;AAAA,MACb,OAAO,KAAK,OAAA,CAAQ,OAAA,KAAY,WAAW,IAAA,CAAK,OAAA,CAAQ,UAAU;AAAC,KACrE;AAEA,IAAA,MAAM,MAAA,GAAS,KAAK,SAAA,CAAU,OAAA,CAAQ,OAAO,IAAA,EAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,CAAA;AACnE,IAAA,IAAA,CAAK,kBAAkB,MAAM;AAC3B,MAAA,MAAA,EAAO;AACP,MAAA,MAAA,CAAO,OAAA,EAAQ;AAAA,IACjB,CAAA;AAAA,EACF;AAAA,EAEQ,cAAA,GAAuB;AAC7B,IAAA,IAAA,CAAK,eAAA,IAAkB;AACvB,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,EACzB;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,KAAA,MAAW,SAAS,IAAA,CAAK,cAAA,CAAe,OAAO,CAAC,CAAA,eAAgB,KAAK,CAAA;AACrE,IAAA,IAAA,CAAK,qBAAA,EAAsB;AAC3B,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,KAAA,MAAW,WAAW,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,CAAC,GAAG,OAAA,EAAQ;AACvD,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAAA,EACjB;AAAA,EAEA,UAAA,GAAyC;AACvC,IAAA,OAAO,IAAA,CAAK,UAAU,UAAA,EAAW;AAAA,EACnC;AAAA,EAEA,UAAA,CAAW,OAAA,GAA4B,EAAC,EAAS;AAC/C,IAAA,IAAA,CAAK,aAAa,OAAO,CAAA;AACzB,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACvB;AAAA,EAEQ,eAAA,GAAwB;AAC9B,IAAA,IACE,CAAC,KAAK,OAAA,IACN,OAAO,aAAa,WAAA,IACpB,IAAA,CAAK,UAAU,MAAA,EACf;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,UAAA,GAAa,KAAK,OAAA,CAAQ,KAAA;AAChC,IAAA,MAAM,SAAA,GAAY,cAAc,iBAAA,EAAkB;AAClD,IAAA,MAAM,OAAA,GAAU,KAAK,UAAA,EAAW;AAChC,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAa;AAC9B,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,IAAI,IAAA,GAAuB,IAAA;AAC3B,MAAA,IAAI;AACF,QAAA,IAAA,GAAO,QAAA,CAAS,cAAc,QAAQ,CAAA;AAAA,MACxC,CAAA,CAAA,MAAQ;AACN,QAAA,IAAA,CAAK,QAAA,CAAS,QAAA,EAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,8BAAA,CAAgC,CAAA;AACpE,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,IAAA,CAAK,YAAA,CAAa,IAAI,QAAQ,CAAA;AAC9B,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AACpB,MAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AACb,MAAA,IAAI,UAAA,IAAc,oBAAA,CAAqB,IAAI,CAAA,IAAK,IAAA,EAAM;AACpD,QAAA,IAAA,CAAK,QAAA;AAAA,UACH,QAAA;AAAA,UACA,oCAAoC,QAAQ,CAAA,mHAAA;AAAA,SAG9C;AACA,QAAA;AAAA,MACF;AACA,MAAA,WAAA;AAAA,QAAY,IAAA;AAAA,QAAM,IAAA,CAAK,SAAA;AAAA,QAAW,OAAA;AAAA,QAAS,CAAC,UAAA,KAC1C,kBAAA,CAAmB,UAAA,CAAW,WAAW,IAAI;AAAA,OAC/C;AAAA,IACF;AAMA,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,QAAA,EAAU;AACnC,MAAA,iBAAA,CAAkB,SAAS,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,EAAG;AAAA,QACnE,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,IACH;AAMA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CACnB,UAAA,EAAW,CACX,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,SAAA,KAAc,qBAAqB,CAAA;AAC1D,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,KAAA,MAAW,OAAA,IAAW,KAAK,QAAA,EAAU;AACnC,QAAA,iBAAA,CAAkB,SAAS,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,EAAG;AAAA,UACnE,YAAA,EAAc;AAAA,SACf,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,kBAAA,GAA2B;AACjC,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAG;AAC/C,MAAA,IAAI,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA,EAAG;AACrC,MAAA,IAAA,CAAK,QAAA;AAAA,QACH,QAAA;AAAA,QACA,uBAAuB,QAAQ,CAAA,kFAAA;AAAA,OAEjC;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,QAAA,CAAS,UAAkB,MAAA,EAAsB;AACvD,IAAA,IAAI,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA,EAAG;AACpC,IAAA,IAAA,CAAK,WAAA,CAAY,IAAI,QAAQ,CAAA;AAE7B,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,+BAAA,EAAkC,MAAM,CAAA,CAAE,CAAA;AAAA,EACzD;AAAA,EAEQ,eAAA,GAAwB;AAC9B,IAAA,IAAI,KAAK,gBAAA,EAAkB;AAC3B,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,IAAA,MAAM,MAAM,MAAM;AAChB,MAAA,IAAI,CAAC,KAAK,gBAAA,EAAkB;AAC5B,MAAA,IAAA,CAAK,qBAAA,EAAsB;AAC3B,MAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,IACvB,CAAA;AACA,IAAA,IAAI,OAAO,qBAAA,KAA0B,UAAA,EAAY,qBAAA,CAAsB,GAAG,CAAA;AAC1E,IAAA,IAAA,CAAK,YAAA,GAAe,UAAA,CAAW,GAAA,EAAK,mBAAmB,CAAA;AAAA,EACzD;AAAA,EAEQ,qBAAA,GAA8B;AACpC,IAAA,IAAA,CAAK,gBAAA,GAAmB,KAAA;AACxB,IAAA,IAAI,IAAA,CAAK,gBAAgB,IAAA,EAAM;AAC7B,MAAA,YAAA,CAAa,KAAK,YAAY,CAAA;AAC9B,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,IACtB;AAAA,EACF;AACF,CAAA;AAIA,SAAS,WAAW,OAAA,EAA8C;AAChE,EAAA,IAAI,OAAA,KAAY,OAAO,OAAO,KAAA;AAC9B,EAAA,MAAM,CAAA,GAAI,OAAO,OAAA,KAAY,QAAA,GAAW,UAAU,EAAC;AACnD,EAAA,OAAO,GAAG,CAAA,CAAE,QAAA,IAAY,cAAc,CAAA,CAAA,EAAI,CAAA,CAAE,UAAU,MAAM,CAAA,CAAA;AAC9D;AAEA,SAAS,iBAAA,GAA8B;AACrC,EAAA,MAAM,WAAW,YAAA,EAAa;AAC9B,EAAA,MAAM,OAAO,QAAA,GAAW,MAAA,CAAO,KAAK,QAAA,CAAS,KAAK,IAAI,EAAC;AACvD,EAAA,OAAO,KAAK,MAAA,GAAS,CAAA,GAAI,IAAA,GAAO,CAAC,GAAG,0BAA0B,CAAA;AAChE;AAOA,SAAS,wBAAwB,KAAA,EAAoC;AACnE,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,MAAM,KAAA,GAAQ,0CAAA;AACd,EAAA,KAAA,MAAW,KAAA,IAAS,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,EAAG;AACzC,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,IAAI,QAAA,CAAS,KAAK,IAAI,CAAA,IAAK,CAAC,mBAAA,CAAoB,IAAI,GAAG,OAAO,IAAA;AAAA,EAChE;AACA,EAAA,OAAO,MAAA;AACT;ACzWO,SAAS,cACd,KAAA,EACoB;AACpB,EAAA,MAAM,EAAE,QAAA,EAAU,OAAA,EAAS,UAAU,MAAA,EAAQ,QAAA,EAAU,YAAW,GAAI,KAAA;AAMtE,EAAA,YAAA,EAAa;AAEb,EAAA,MAAM,OAAA,GAA4B;AAAA,IAChC,OAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,MAAM,UAAA,GAAmB,aAAO,OAAO,CAAA;AACvC,EAAA,MAAM,aAAA,GAAsB,aAAmC,IAAI,CAAA;AAEnE,EAAM,gBAAU,MAAM;AAKpB,IAAA,MAAM,UAAA,GAAa,IAAI,mBAAA,CAAoB,UAAA,CAAW,OAAO,CAAA;AAC7D,IAAA,aAAA,CAAc,OAAA,GAAU,UAAA;AACxB,IAAA,UAAA,CAAW,KAAA,EAAM;AACjB,IAAA,OAAO,MAAM;AACX,MAAA,UAAA,CAAW,IAAA,EAAK;AAChB,MAAA,IAAI,aAAA,CAAc,OAAA,KAAY,UAAA,EAAY,aAAA,CAAc,OAAA,GAAU,IAAA;AAAA,IACpE,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAKL,EAAM,gBAAU,MAAM;AACpB,IAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AACrB,IAAA,aAAA,CAAc,OAAA,EAAS,OAAO,OAAO,CAAA;AAAA,EAEvC,GAAG,CAAC,OAAA,EAAS,UAAU,MAAA,EAAQ,QAAA,EAAU,UAAU,CAAC,CAAA;AAEpD,EAAA,OAAa,KAAA,CAAA,aAAA,CAAoB,KAAA,CAAA,QAAA,EAAU,IAAA,EAAM,QAAQ,CAAA;AAC3D;;;ACvDA,SAAS,YAAY,KAAA,EAEE;AACrB,EAAA,OAAaA,KAAA,CAAA,aAAA,CAAoBA,KAAA,CAAA,QAAA,EAAU,IAAA,EAAM,KAAA,CAAM,QAAQ,CAAA;AACjE;AAIO,IAAM,kBAAA,GAGX,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,eAAe,aAAA,GAAgB;AAUnD,SAAS,wBAAA,CACd,OAAA,GAA4B,EAAC,EACH;AAC1B,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA,EAAc;AACzC,IAAA,OAAO;AAAA,MACL,oBAAoB,MAAM;AAAA,MAAC,CAAA;AAAA,MAC3B,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,IAAI,mBAAA,CAAoB,OAAO,CAAA;AAClD,EAAA,UAAA,CAAW,KAAA,EAAM;AAEjB,EAAA,SAAS,SAAS,KAAA,EAA2D;AAC3E,IAAMA,gBAAU,MAAM;AAOpB,MAAA,UAAA,CAAW,KAAA,EAAM;AACjB,MAAA,OAAO,MAAM,WAAW,IAAA,EAAK;AAAA,IAC/B,CAAA,EAAG,EAAE,CAAA;AACL,IAAA,OAAaA,KAAA,CAAA,aAAA,CAAoBA,KAAA,CAAA,QAAA,EAAU,IAAA,EAAM,KAAA,CAAM,QAAQ,CAAA;AAAA,EACjE;AAEA,EAAA,OAAO;AAAA,IACL,oBAAoB,UAAA,CAAW,kBAAA;AAAA,IAC/B;AAAA,GACF;AACF","file":"chunk-CER5NQRR.js","sourcesContent":["import { formatConsoleArgs, isHydrationMessage } from '../core/react-message';\nimport type { HydrationReport } from '../core/types';\nimport type { ReportSink } from '../core/report';\n\ntype ErrorFn = (...args: unknown[]) => void;\n\nexport function installConsoleInterceptor(\n onMessage: (message: string, args: readonly unknown[]) => void,\n): () => void {\n if (typeof console === 'undefined') return () => {};\n const original = console.error;\n const patched: ErrorFn = (...args: unknown[]) => {\n try {\n const message = formatConsoleArgs(args);\n if (message && isHydrationMessage(message)) {\n onMessage(message, args);\n }\n } catch {\n /* never let interception break normal logging */\n }\n // `apply` rather than a bound copy, so uninstalling can hand back the exact\n // function we replaced. Restoring a bound copy instead leaves a wrapper\n // behind on every install/uninstall cycle.\n original.apply(console, args);\n };\n console.error = patched as typeof console.error;\n\n return () => {\n if (console.error === (patched as typeof console.error)) {\n console.error = original as typeof console.error;\n }\n };\n}\n\nconst BADGE = 'color:#f59e0b;font-weight:bold';\nconst DIM = 'color:#9ca3af';\n\nexport function createConsoleReporter(): ReportSink {\n const sink: ReportSink = (report: HydrationReport) => {\n const title = `%c⬡ why-hydration%c ${report.cause.category} — ${report.node.path}`;\n console.group(title, BADGE, DIM);\n console.log('%cServer:%c', 'color:#fb7185', '', report.server ?? '(none)');\n console.log('%cClient:%c', 'color:#4ade80', '', report.client ?? '(none)');\n if (report.component) {\n console.log('%cComponent:%c', DIM, '', `<${report.component}>`);\n }\n if (report.location?.file) {\n const loc = report.location.line\n ? `${report.location.file}:${report.location.line}`\n : report.location.file;\n console.log('%cSource:%c', DIM, '', loc);\n }\n console.log('%cWhy:%c', DIM, '', report.cause.explanation);\n console.log('%cFix:%c', 'color:#86efac', '', report.cause.suggestion);\n if (report.cause.docsUrl) {\n console.log('%cDocs:%c', DIM, '', report.cause.docsUrl);\n }\n if (report.componentStack) {\n console.log('%cComponent stack:%c', DIM, '', report.componentStack);\n }\n console.groupEnd();\n };\n return sink;\n}\n","import { installConsoleInterceptor } from './console';\n\n/**\n * Module-scoped capture of React's hydration warnings.\n *\n * React logs a mismatch while it hydrates the tree *below* the inspector, which\n * is long before any effect runs — so interception has to begin during render.\n * Render is also the one place a component may be invoked more than once per\n * mount (Strict Mode renders twice, with fresh hook state each time), so the\n * state lives here rather than on an instance: a second call is then a genuine\n * no-op instead of a second interceptor that nobody owns and nobody removes.\n */\n\nexport type CaptureListener = (message: string) => void;\n\n// Hydration warnings are emitted once per page load; this only guards against\n// an app that logs matching messages in a loop. Past the cap a message is\n// dropped outright rather than recorded-but-forwarded — see `startCapture`.\nexport const MAX_CAPTURED = 50;\n\nconst captured = new Set<string>();\nconst listeners = new Set<CaptureListener>();\nlet uninstall: (() => void) | null = null;\n\n/** Start intercepting. Idempotent, and safe to call from render. */\nexport function startCapture(): void {\n if (uninstall || typeof window === 'undefined') return;\n uninstall = installConsoleInterceptor((message) => {\n // The cap gates the *notification*, not just the recording. Forwarding a\n // message we decline to record would defeat the dedup above at exactly the\n // point the cap exists to protect: every repeat past the cap would look\n // new, and each one costs a listener a full inspection pass.\n if (captured.has(message) || captured.size >= MAX_CAPTURED) return;\n captured.add(message);\n for (const listener of [...listeners]) listener(message);\n });\n}\n\n/**\n * Subscribe to hydration messages. Whatever was captured before subscribing is\n * replayed immediately, so a listener attached after hydration — or re-attached\n * across a Strict Mode stop/start cycle — still sees what React logged.\n */\nexport function subscribeCapture(listener: CaptureListener): () => void {\n startCapture();\n listeners.add(listener);\n for (const message of [...captured]) listener(message);\n\n return () => {\n if (!listeners.delete(listener)) return;\n // The backlog outlives the last subscriber on purpose: hydration happens\n // once per page, so a remounted inspector still needs those messages.\n // Only the console patch is handed back. The live set is the count — a\n // separate counter would drift the moment one listener subscribed twice\n // (`Set.add` dedupes, a counter does not) and strand the patch forever.\n if (listeners.size === 0 && uninstall) {\n uninstall();\n uninstall = null;\n }\n };\n}\n\n/** Drop the interceptor and the recorded backlog (tests, hot reload). */\nexport function resetCapture(): void {\n uninstall?.();\n uninstall = null;\n listeners.clear();\n captured.clear();\n}\n","/**\n * Arabic overlay strings. Only the overlay imports this, so it is tree-shaken\n * out of production builds with the rest of the dev implementation.\n */\n\nimport {\n classDetail,\n code,\n param,\n type MessageCatalog,\n} from '../../core/classify/messages';\nimport type { OverlayStrings } from '../i18n';\n\n// Written as Modern Standard Arabic for developers: technical terms that Arab\n// developers use in English day to day (Hydration, DOM, React, Intl) stay in\n// English, and every identifier stays in a code span so the renderer can keep\n// it left-to-right inside the right-to-left sentence.\nconst AR_MESSAGES: MessageCatalog = {\n 'non-deterministic-value': {\n explanation:\n 'عرض الخادم والعميل قيمتين تبدوان عشوائيتين ومختلفتين (معرّف أو رمز ' +\n 'أو ناتج `Math.random()`). أي شيء غير حتمي أثناء العرض ينتج قيمة ' +\n 'مختلفة على كل جانب.',\n suggestion:\n 'استخدم `useId()` من React للمعرّفات. أما القيم العشوائية فولّدها بعد ' +\n 'التركيب (داخل `useEffect`) أو مرّرها من الخادم ليتفق الطرفان. لا ' +\n 'تستدعِ `Math.random()` أو `crypto` أثناء العرض أبدًا.',\n },\n 'date-time': {\n explanation:\n 'القيمتان تاريخان أو وقتان يختلفان بين عرض الخادم وعرض العميل — تغيّرت ' +\n 'الساعة (أو اختلفت المنطقة الزمنية) بين البيئتين.',\n suggestion:\n 'اعرض الوقت الحالي بعد التركيب، أو مرّر طابعًا زمنيًا واحدًا من الخادم ' +\n 'ونسّقه بالطريقة نفسها على الجانبين. وحدّد منطقة زمنية صريحة عند التنسيق.',\n },\n 'locale-format.bidi': {\n explanation:\n 'القيمتان لا تختلفان إلا بعلامات تحكم ثنائية الاتجاه غير مرئية ' +\n '(`LRM` و`RLM` وعلامات العزل). تضيف `Intl` هذه العلامات حول الأرقام ' +\n 'والتواريخ في اللغات التي تُكتب من اليمين إلى اليسار، وتُصدر إصدارات ' +\n 'ICU المختلفة — Node مقابل المتصفح — علامات مختلفة للمدخل نفسه.',\n suggestion:\n 'نسّق القيمة في مكان واحد ومرّر النص الناتج، أو ثبّت اللغة والمنطقة ' +\n 'الزمنية نفسيهما على الجانبين. وإن كانت العلامات غير مؤذية فأضف ' +\n '`suppressHydrationWarning` إلى العنصر.',\n },\n 'locale-format.script': {\n explanation:\n 'نُسّقت القيمة نفسها بنظامَي أرقام مختلفين (أرقام عربية مشرقية `٠١٢` ' +\n 'مقابل أرقام لاتينية `012`). اختار الخادم والعميل إعدادين محليين مختلفين.',\n suggestion:\n 'مرّر `locale` صريحًا (ومنطقة زمنية) إلى `Intl.NumberFormat` أو ' +\n '`toLocaleString` على الخادم والعميل معًا، أو نسّق القيمة بعد التركيب ' +\n 'ليُستخدم إعداد العميل وحده.',\n },\n 'locale-format.separators': {\n explanation:\n 'نُسّق الرقم نفسه بفواصل آلاف أو فواصل عشرية مختلفة بين الخادم والعميل ' +\n '(مثل `1,234.56` مقابل `1.234,56`).',\n suggestion:\n 'مرّر إعدادًا محليًا صريحًا إلى `Intl.NumberFormat` أو `toLocaleString` ' +\n 'على الجانبين لتتطابق الفواصل.',\n },\n 'locale-format.date-order': {\n explanation:\n 'عُرض التاريخ نفسه بترتيب حقول مختلف (`MM/DD` مقابل `DD/MM`) بين ' +\n 'الخادم والعميل.',\n suggestion:\n 'نسّق التواريخ بإعداد محلي ومنطقة زمنية صريحين عبر `Intl` على الجانبين.',\n },\n 'browser-only-api': {\n explanation:\n 'عرض العميل محتوى تركه الخادم فارغًا — وهذه علامة على قراءة واجهة لا ' +\n 'تتوفر إلا في المتصفح (`window` أو `document` أو `localStorage` أو ' +\n '`navigator` أو `matchMedia`) أثناء العرض.',\n suggestion:\n 'اجعل قراءات المتصفح مشروطة بعلامة تركيب أو ضعها داخل `useEffect`، أو ' +\n 'استخدم `useSyncExternalStore` مع لقطة للخادم ليطابق أول عرض على العميل ' +\n 'ما عرضه الخادم.',\n },\n 'viewport-branching': {\n explanation:\n 'أُضيفت شجرة فرعية كاملة أو حُذفت أو استُبدلت بين الخادم والعميل — ' +\n 'غالبًا بسبب فحص في JavaScript لعرض الشاشة يفرّع الشجرة في أول عرض.',\n suggestion:\n 'اعرض الفرعين وبدّل بينهما باستعلامات الوسائط في CSS عند أول رسم بدل ' +\n 'التفريع في JavaScript، أو أجّل الفرع المعتمد على JavaScript إلى ما بعد ' +\n 'التركيب.',\n },\n 'invalid-html-nesting': {\n explanation:\n 'نُقلت عقدة أو أُخرجت من مكانها لأن ترميز HTML غير صالح (مثل `<div>` ' +\n 'داخل `<p>`، أو `<a>` داخل `<a>`). يُصلح المتصفح DOM القادم من الخادم، ' +\n 'فلا يعود مطابقًا لما يتوقعه React.',\n suggestion:\n 'صحّح صلاحية الترميز: لا يمكن وضع العناصر الكتلية داخل `<p>`، ولا يمكن ' +\n 'تداخل الروابط. استبدل العنصر الأب غير الصالح بـ `<div>` أو أعد هيكلة ' +\n 'الشجرة.',\n },\n 'whitespace-minification': {\n explanation:\n 'الاختلاف في المسافات البيضاء فقط — النص متطابق باستثناء المسافات ' +\n 'والأسطر الجديدة. على الأرجح ضغط مُصغّر HTML المسافات حول جذر الـ ' +\n 'Hydration بطريقة مختلفة عن React.',\n suggestion:\n 'راجع إعدادات مُصغّر HTML (مثل `conservativeCollapse`) حول جذر التطبيق، ' +\n 'أو تجنّب تصغير المسافات داخل الترميز الذي يمر بالـ Hydration.',\n },\n 'third-party-dom-mutation.extension-attribute': {\n explanation:\n 'حقن امتداد متصفح أو سكربت خارجي (مثل Grammarly أو ColorZilla) السمة ' +\n '`{attribute}` قبل الـ Hydration، فلم يعد DOM على العميل مطابقًا للخادم.',\n suggestion:\n 'غالبًا ما يكون هذا غير مؤذٍ. أضف `suppressHydrationWarning` إلى العنصر ' +\n 'المتأثر، أو أجّل تهيئة السكربت الخارجي إلى ما بعد الـ Hydration.',\n },\n 'third-party-dom-mutation.root-attribute': {\n explanation:\n 'ظهرت سمة (`{attribute}`) على عنصر جذري لم يرسلها الخادم أبدًا — وهي ' +\n 'علامة مميزة لامتداد أو سكربت خارجي مبكر يعدّل DOM.',\n suggestion:\n 'أضف `suppressHydrationWarning` إلى العنصر الجذري، أو أجّل السكربت ' +\n 'الخارجي إلى ما بعد الـ Hydration.',\n },\n 'third-party-dom-mutation.injected-node': {\n explanation: (p) => [\n 'حقن سكربت خارجي أو امتداد متصفح العنصر ',\n code(param(p, 'tag')),\n ' (إعلانات أو نافذة موافقة أو تحليلات أو محادثة) بعد عرض الخادم. ليس ' +\n 'هذا جزءًا من الـ Hydration في تطبيقك، لذا فهو غالبًا ضجيج غير مؤذٍ.',\n ],\n suggestion:\n 'إن حذّر React منه فأضف `suppressHydrationWarning` إلى أقرب غلاف عُرض ' +\n 'على الخادم، أو حمّل السكربت الخارجي بعد الـ Hydration (مثل ' +\n '`<Script strategy=\"afterInteractive\">` في Next.js).',\n },\n 'attribute-mismatch.class': {\n explanation: (p) => [\n 'تختلف ',\n code('class'),\n ' بين الخادم والعميل',\n ...classDetail(p, {\n added: 'أُضيف على العميل: ',\n removed: 'أُزيل على العميل: ',\n listSeparator: '، ',\n partSeparator: '؛ ',\n open: ' (',\n close: ')',\n }),\n '. طُبّقت فئة CSS بشكل مشروط على العميل — غالبًا بسبب فحص لحجم الشاشة ' +\n 'أو استعلام وسائط أو سمة (theme) أو علامة ميزة يُنفَّذ أثناء أول عرض.',\n ],\n suggestion:\n 'اعرض قيمة `className` نفسها على الخادم وفي أول رسم على العميل. انقل ' +\n 'الشروط الخاصة بالعميل إلى `useEffect` أو علامة تركيب، أو نفّذ التغيير ' +\n 'البصري باستعلامات الوسائط في CSS بدل تبديل الفئة عبر JavaScript.',\n },\n 'attribute-mismatch.style': {\n explanation:\n 'يختلف `style` المضمّن بين الخادم والعميل — حُسب نمط مضمّن من حالة ' +\n 'خاصة بالعميل (حجم الشاشة أو السمة أو موضع التمرير) أثناء العرض.',\n suggestion:\n 'احسب النمط بعد التركيب (`useEffect`) ليطابق أول عرض على العميل ما عرضه ' +\n 'الخادم، أو انقله إلى فئة CSS أو استعلام وسائط.',\n },\n 'attribute-mismatch.generic': {\n explanation:\n 'تختلف السمة `{attribute}` بين الخادم (`{server}`) والعميل ' +\n '(`{client}`) — اشتُقّت قيمتها من شيء يختلف بين الخادم وأول عرض على ' +\n 'العميل.',\n suggestion:\n 'اجعل قيمة السمة حتمية على الخادم والعميل، أو عيّنها بعد التركيب ليطابق ' +\n 'أول عرض على العميل HTML القادم من الخادم.',\n },\n unknown: {\n explanation:\n 'اكتُشف عدم تطابق في الـ Hydration لكن تعذّرت مطابقته مع سبب معروف. ' +\n 'افحص قيمتَي الخادم والعميل أعلاه.',\n suggestion:\n 'قارن بين قيمتَي الخادم والعميل. من الأسباب الشائعة: القيم غير الحتمية، ' +\n 'والتواريخ والإعدادات المحلية، والواجهات الخاصة بالمتصفح المستخدمة أثناء ' +\n 'العرض.',\n },\n 'unknown.no-location': {\n explanation:\n 'أبلغ React بفشل الـ Hydration دون أن يحدد العقدة المختلفة، ولم يجد فحص ' +\n 'DOM أي اختلاف يمكن الإشارة إليه.',\n suggestion:\n 'تأكد من وجود `<HydrationSnapshotScript>` (أو سكربت اللقطة اليدوي) داخل ' +\n '`<head>` ليتمكن فحص DOM من تحديد العقدة، واقرأ تحذير React الكامل في ' +\n 'وحدة تحكم المتصفح.',\n },\n};\n\n// Arabic has six plural forms; English's \"issue(s)\" pattern reads as broken\n// grammar for most counts, so pick the form the count actually takes.\n//\n// Created lazily, on first use. A module-level `new Intl.PluralRules()` is a\n// constructor call no bundler can prove pure, so it survived tree-shaking and\n// ran on every production page load — the one thing this package must never do.\nlet arPlural: Intl.PluralRules | null | undefined;\nfunction arabicPlural(count: number): string {\n if (arPlural === undefined) {\n arPlural =\n typeof Intl !== 'undefined' && typeof Intl.PluralRules === 'function'\n ? new Intl.PluralRules('ar')\n : null;\n }\n return arPlural?.select(count) ?? 'other';\n}\n\nfunction arabicIssues(count: number): string {\n switch (arabicPlural(count)) {\n case 'zero':\n return 'لا مشكلات';\n case 'one':\n return 'مشكلة واحدة';\n case 'two':\n return 'مشكلتان';\n case 'few':\n return `${count} مشكلات`;\n default:\n return `${count} مشكلة`;\n }\n}\n\nexport const AR: OverlayStrings = {\n dir: 'rtl',\n title: 'عدم تطابق في الـ Hydration',\n dialogLabel: 'تشخيص عدم تطابق الـ Hydration',\n dismiss: 'إغلاق',\n dismissLabel: 'إغلاق لوحة التشخيص',\n hintDismissLabel: 'إخفاء التلميح',\n server: 'الخادم',\n client: 'العميل',\n fix: 'الحل:',\n // The docs are only written in English, so say so rather than surprise.\n learnMore: 'اعرف المزيد (بالإنجليزية) ←',\n none: '(لا شيء)',\n empty: '(فارغ)',\n fallbackCategory: 'عدم تطابق',\n categories: {\n 'non-deterministic-value': 'قيمة غير حتمية',\n 'date-time': 'التاريخ / الوقت',\n 'locale-format': 'تنسيق اللغة والمنطقة',\n 'browser-only-api': 'واجهة خاصة بالمتصفح',\n 'viewport-branching': 'تفرّع حسب حجم الشاشة',\n 'invalid-html-nesting': 'تداخل HTML غير صالح',\n 'whitespace-minification': 'المسافات / التصغير',\n 'third-party-dom-mutation': 'تعديل DOM من طرف خارجي',\n 'attribute-mismatch': 'اختلاف في السمة',\n unknown: 'غير معروف',\n },\n messages: AR_MESSAGES,\n hint: (count) => `↓ ${arabicIssues(count)} — مرّر لرؤية الكل`,\n};\n","/**\n * Persian overlay strings. Only the overlay imports this, so it is tree-shaken\n * out of production builds with the rest of the dev implementation.\n *\n * Written for developers: terms Iranian developers use in English day to day\n * (Hydration, DOM, React, API, mount, snapshot) stay in English, and every\n * identifier stays in a code span so the renderer keeps it left-to-right.\n *\n * Persian spelling depends on the zero-width non-joiner (U+200C) — «میکند»,\n * «راهحل» — and on the Persian letters ی and ک rather than the Arabic ي and ك.\n * Both are checked by `test/overlay-rtl.test.ts`; the non-joiners are real\n * characters in these strings, not typos.\n */\n\nimport {\n classDetail,\n code,\n param,\n type MessageCatalog,\n} from '../../core/classify/messages';\nimport type { OverlayStrings } from '../i18n';\n\nconst FA_MESSAGES: MessageCatalog = {\n 'non-deterministic-value': {\n explanation:\n 'سرور و کلاینت دو مقدار متفاوت و بهظاهر تصادفی رندر کردند (یک شناسه، ' +\n 'توکن یا خروجی `Math.random()`). هر چیز غیرقطعی در رندر، در هر طرف ' +\n 'مقدار متفاوتی تولید میکند.',\n suggestion:\n 'برای شناسهها از `useId()` در React استفاده کنید. مقدارهای تصادفی را ' +\n 'بعد از mount (داخل `useEffect`) بسازید یا مقداری را از سرور پاس بدهید تا ' +\n 'هر دو طرف یکسان باشند. هنگام رندر هرگز `Math.random()` یا `crypto` را ' +\n 'صدا نزنید.',\n },\n 'date-time': {\n explanation:\n 'مقدارها تاریخ یا زمانهایی هستند که بین رندر سرور و رندر کلاینت فرق ' +\n 'دارند — ساعت جلو رفته (یا منطقهٔ زمانی متفاوت است) بین دو محیط.',\n suggestion:\n 'زمان فعلی را بعد از mount نمایش دهید، یا یک timestamp از سرور پاس بدهید ' +\n 'و در هر دو طرف یکسان قالببندی کنید. هنگام قالببندی یک منطقهٔ زمانی ' +\n 'مشخص تعیین کنید.',\n },\n 'locale-format.bidi': {\n explanation:\n 'مقدارها فقط در نویسههای کنترلی دوسویهٔ نامرئی (`LRM`، `RLM` و ' +\n 'نویسههای جداسازی) فرق دارند. `Intl` این نویسهها را در زبانهای ' +\n 'راستبهچپ دور اعداد و تاریخها اضافه میکند و نسخههای مختلف ICU — ' +\n 'Node در برابر مرورگر — برای ورودی یکسان نویسههای متفاوتی اضافه میکنند.',\n suggestion:\n 'مقدار را در یک جا قالببندی کنید و رشتهٔ حاصل را پاس بدهید، یا زبان و ' +\n 'منطقهٔ زمانی یکسانی در دو طرف تعیین کنید. اگر این نویسهها بیضررند، ' +\n '`suppressHydrationWarning` را به عنصر اضافه کنید.',\n },\n 'locale-format.script': {\n explanation:\n 'یک مقدار با دو نظام رقم متفاوت قالببندی شده است (رقمهای عربی-هندی ' +\n '`٠١٢` در برابر رقمهای لاتین `012`). سرور و کلاینت تنظیمات منطقهای ' +\n 'متفاوتی انتخاب کردهاند.',\n suggestion:\n 'یک `locale` مشخص (و منطقهٔ زمانی) را هم در سرور و هم در کلاینت به ' +\n '`Intl.NumberFormat` یا `toLocaleString` بدهید، یا مقدار را بعد از mount ' +\n 'قالببندی کنید تا فقط تنظیمات کلاینت به کار رود.',\n },\n 'locale-format.separators': {\n explanation:\n 'یک عدد با جداکنندهٔ هزارگان یا جداکنندهٔ اعشار متفاوت بین سرور و کلاینت ' +\n 'قالببندی شده است (مثلاً `1,234.56` در برابر `1.234,56`).',\n suggestion:\n 'یک تنظیم منطقهای مشخص را در هر دو طرف به `Intl.NumberFormat` یا ' +\n '`toLocaleString` بدهید تا جداکنندهها یکسان شوند.',\n },\n 'locale-format.date-order': {\n explanation:\n 'یک تاریخ با ترتیب بخشهای متفاوت (`MM/DD` در برابر `DD/MM`) بین سرور و ' +\n 'کلاینت نمایش داده شده است.',\n suggestion:\n 'تاریخها را با تنظیم منطقهای و منطقهٔ زمانی مشخص از طریق `Intl` در هر ' +\n 'دو طرف قالببندی کنید.',\n },\n 'browser-only-api': {\n explanation:\n 'کلاینت محتوایی رندر کرد که سرور خالی گذاشته بود — نشانهٔ خواندن یک API ' +\n 'مخصوص مرورگر (`window`، `document`، `localStorage`، `navigator`، ' +\n '`matchMedia`) هنگام رندر.',\n suggestion:\n 'خواندن از مرورگر را پشت یک پرچم mount یا داخل `useEffect` قرار دهید، یا ' +\n 'از `useSyncExternalStore` با snapshot سرور استفاده کنید تا اولین رندر ' +\n 'کلاینت با سرور یکسان باشد.',\n },\n 'viewport-branching': {\n explanation:\n 'یک زیردرخت کامل بین سرور و کلاینت اضافه، حذف یا جایگزین شده است — ' +\n 'معمولاً یک بررسی عرض صفحه در JavaScript که درخت را در اولین رندر ' +\n 'دوشاخه میکند.',\n suggestion:\n 'هر دو شاخه را رندر کنید و در اولین نمایش با media queryهای CSS بینشان ' +\n 'جابهجا شوید، نه با انشعاب در JavaScript؛ یا شاخهٔ وابسته به JavaScript ' +\n 'را تا بعد از mount به تعویق بیندازید.',\n },\n 'invalid-html-nesting': {\n explanation:\n 'یک گره جابهجا یا بیرون رانده شد چون HTML نامعتبر است (مثلاً `<div>` ' +\n 'داخل `<p>`، یا `<a>` داخل `<a>`). مرورگر DOM رسیده از سرور را اصلاح ' +\n 'میکند و دیگر با انتظار React مطابقت ندارد.',\n suggestion:\n 'اعتبار HTML را درست کنید: عنصرهای بلوکی نمیتوانند داخل `<p>` باشند، ' +\n 'پیوندها نمیتوانند تودرتو باشند و مانند آن. والد نامعتبر را با `<div>` ' +\n 'جایگزین کنید یا ساختار درخت را تغییر دهید.',\n },\n 'whitespace-minification': {\n explanation:\n 'تفاوت فقط در فاصلههاست — متن جز فاصلهها و خطهای جدید یکسان است. ' +\n 'احتمالاً یک کوچککنندهٔ HTML فاصلههای اطراف ریشهٔ Hydration را متفاوت ' +\n 'با React فشرده کرده است.',\n suggestion:\n 'تنظیمات کوچککنندهٔ HTML (مثلاً `conservativeCollapse`) را اطراف ریشهٔ ' +\n 'برنامه بررسی کنید، یا از کوچکسازی فاصلهها در markupی که Hydration ' +\n 'میشود پرهیز کنید.',\n },\n 'third-party-dom-mutation.extension-attribute': {\n explanation:\n 'ویژگی `{attribute}` پیش از Hydration توسط یک افزونهٔ مرورگر یا اسکریپت ' +\n 'شخص ثالث (مثلاً Grammarly یا ColorZilla) تزریق شده است، بنابراین DOM ' +\n 'کلاینت دیگر با سرور یکسان نیست.',\n suggestion:\n 'معمولاً بیضرر است. `suppressHydrationWarning` را به عنصر مربوط اضافه ' +\n 'کنید، یا راهاندازی اسکریپت خارجی را تا بعد از Hydration به تعویق ' +\n 'بیندازید.',\n },\n 'third-party-dom-mutation.root-attribute': {\n explanation:\n 'ویژگیای (`{attribute}`) روی یک عنصر ریشه ظاهر شد که سرور هرگز نفرستاده ' +\n 'بود — نشانهٔ بارز یک افزونه یا اسکریپت شخص ثالث زودهنگام که DOM را تغییر ' +\n 'میدهد.',\n suggestion:\n '`suppressHydrationWarning` را به عنصر ریشه اضافه کنید، یا اسکریپت خارجی ' +\n 'را تا بعد از Hydration به تعویق بیندازید.',\n },\n 'third-party-dom-mutation.injected-node': {\n explanation: (p) => [\n 'یک اسکریپت شخص ثالث یا افزونهٔ مرورگر عنصر ',\n code(param(p, 'tag')),\n ' را پس از رندر سرور تزریق کرد (تبلیغات، رضایتنامه، آنالیتیکس یا چت). ' +\n 'این بخشی از Hydration برنامهٔ شما نیست، پس معمولاً نویزی بیضرر است.',\n ],\n suggestion:\n 'اگر React دربارهٔ آن هشدار میدهد، `suppressHydrationWarning` را به ' +\n 'نزدیکترین پوشش رندرشده در سرور اضافه کنید، یا اسکریپت خارجی را بعد از ' +\n 'Hydration بارگذاری کنید (مثلاً `<Script strategy=\"afterInteractive\">` ' +\n 'در Next.js).',\n },\n 'attribute-mismatch.class': {\n explanation: (p) => [\n 'ویژگی ',\n code('class'),\n ' بین سرور و کلاینت فرق دارد',\n ...classDetail(p, {\n added: 'در کلاینت اضافه شد: ',\n removed: 'در کلاینت حذف شد: ',\n listSeparator: '، ',\n partSeparator: '؛ ',\n open: ' (',\n close: ')',\n }),\n '. یک کلاس بهصورت شرطی در کلاینت اعمال شده است — معمولاً بررسی اندازهٔ ' +\n 'صفحه، media query، تم یا feature flag که در اولین رندر اجرا میشود.',\n ],\n suggestion:\n 'همان `className` را در سرور و اولین نمایش کلاینت رندر کنید. شرطهای ' +\n 'مخصوص کلاینت را به `useEffect` یا یک پرچم mount منتقل کنید، یا تغییر ' +\n 'ظاهری را با media queryهای CSS انجام دهید نه با تغییر کلاس در JavaScript.',\n },\n 'attribute-mismatch.style': {\n explanation:\n '`style` درونخطی بین سرور و کلاینت فرق دارد — یک استایل درونخطی هنگام ' +\n 'رندر از وضعیت مخصوص کلاینت (اندازهٔ صفحه، تم، موقعیت اسکرول) محاسبه ' +\n 'شده است.',\n suggestion:\n 'استایل را بعد از mount (`useEffect`) محاسبه کنید تا اولین رندر کلاینت با ' +\n 'سرور یکسان باشد، یا آن را به یک کلاس CSS یا media query منتقل کنید.',\n },\n 'attribute-mismatch.generic': {\n explanation:\n 'ویژگی `{attribute}` بین سرور (`{server}`) و کلاینت (`{client}`) فرق ' +\n 'دارد — مقدار آن از چیزی گرفته شده که بین سرور و اولین رندر کلاینت ' +\n 'متفاوت است.',\n suggestion:\n 'ویژگی را در سرور و کلاینت قطعی کنید، یا آن را بعد از mount تنظیم کنید تا ' +\n 'اولین رندر کلاینت با HTML سرور یکسان باشد.',\n },\n unknown: {\n explanation:\n 'یک ناهمخوانی Hydration پیدا شد اما با هیچ علت شناختهشدهای تطبیق داده ' +\n 'نشد. مقدارهای سرور و کلاینت را در بالا بررسی کنید.',\n suggestion:\n 'مقدارهای سرور و کلاینت را مقایسه کنید. علتهای رایج: مقدارهای غیرقطعی، ' +\n 'تاریخها و تنظیمات منطقهای، و APIهای مخصوص مرورگر که هنگام رندر ' +\n 'استفاده میشوند.',\n },\n 'unknown.no-location': {\n explanation:\n 'React گزارش داد که Hydration شکست خورده اما نگفت کدام گره متفاوت بوده ' +\n 'است، و بررسی DOM هم تفاوتی برای نشان دادن پیدا نکرد.',\n suggestion:\n 'مطمئن شوید `<HydrationSnapshotScript>` (یا اسکریپت snapshot دستی) داخل ' +\n '`<head>` است تا بررسی DOM بتواند گره را پیدا کند، و هشدار کامل React را ' +\n 'در کنسول مرورگر بخوانید.',\n },\n};\n\n// Persian nouns stay singular after a number («۵ مشکل», never «۵ مشکلها»),\n// so only the one-item form differs.\nexport const FA: OverlayStrings = {\n dir: 'rtl',\n title: 'ناهمخوانی در Hydration',\n dialogLabel: 'عیبیابی ناهمخوانی Hydration',\n dismiss: 'بستن',\n dismissLabel: 'بستن پنل عیبیابی',\n hintDismissLabel: 'پنهان کردن راهنما',\n server: 'سرور',\n client: 'کلاینت',\n fix: 'راهحل:',\n // The docs are only written in English, so say so rather than surprise.\n learnMore: 'اطلاعات بیشتر (به انگلیسی) ←',\n none: '(هیچ)',\n empty: '(خالی)',\n fallbackCategory: 'ناهمخوانی',\n categories: {\n 'non-deterministic-value': 'مقدار غیرقطعی',\n 'date-time': 'تاریخ / زمان',\n 'locale-format': 'قالببندی زبان و منطقه',\n 'browser-only-api': 'API مخصوص مرورگر',\n 'viewport-branching': 'انشعاب بر اساس اندازهٔ صفحه',\n 'invalid-html-nesting': 'تودرتویی نامعتبر HTML',\n 'whitespace-minification': 'فاصلهها / کوچکسازی',\n 'third-party-dom-mutation': 'تغییر DOM توسط شخص ثالث',\n 'attribute-mismatch': 'ناهمخوانی ویژگی',\n unknown: 'نامشخص',\n },\n messages: FA_MESSAGES,\n hint: (count) =>\n `↓ ${count === 1 ? 'یک مشکل' : `${count} مشکل`} — برای دیدن همه اسکرول کنید`,\n};\n","/**\n * Hebrew overlay strings. Only the overlay imports this, so it is tree-shaken\n * out of production builds with the rest of the dev implementation.\n *\n * Written for developers: terms Israeli developers use in English day to day\n * (Hydration, DOM, React, API, media query) stay in English, the plural \"you\"\n * of Hebrew documentation is used for instructions, and every identifier stays\n * in a code span so the renderer keeps it left-to-right inside the sentence.\n */\n\nimport {\n classDetail,\n code,\n param,\n type MessageCatalog,\n} from '../../core/classify/messages';\nimport type { OverlayStrings } from '../i18n';\n\nconst HE_MESSAGES: MessageCatalog = {\n 'non-deterministic-value': {\n explanation:\n 'השרת והלקוח רינדרו ערכים שונים שנראים אקראיים (מזהה, טוקן או תוצאה של ' +\n '`Math.random()`). כל דבר לא דטרמיניסטי ברינדור מפיק ערך שונה בכל צד.',\n suggestion:\n 'השתמשו ב-`useId()` של React עבור מזהים. ערכים אקראיים צרו אחרי הטעינה ' +\n '(בתוך `useEffect`) או העבירו ערך מהשרת כדי ששני הצדדים יסכימו. אל ' +\n 'תקראו ל-`Math.random()` או ל-`crypto` בזמן רינדור.',\n },\n 'date-time': {\n explanation:\n 'הערכים הם תאריכים או שעות ששונים בין רינדור השרת לרינדור הלקוח — השעון ' +\n 'התקדם (או שאזור הזמן שונה) בין שתי הסביבות.',\n suggestion:\n 'הציגו את השעה הנוכחית אחרי הטעינה, או העבירו חותמת זמן אחת מהשרת ועצבו ' +\n 'אותה באותו אופן בשני הצדדים. קבעו אזור זמן מפורש בעת העיצוב.',\n },\n 'locale-format.bidi': {\n explanation:\n 'הערכים שונים רק בתווי בקרה דו-כיווניים בלתי נראים (`LRM`, `RLM` ותווי ' +\n 'בידוד). `Intl` מוסיף אותם סביב מספרים ותאריכים בשפות מימין לשמאל, ' +\n 'וגרסאות ICU שונות — Node לעומת הדפדפן — מוסיפות תווים שונים לאותו קלט.',\n suggestion:\n 'עצבו את הערך במקום אחד והעבירו את המחרוזת הלאה, או קבעו את אותה שפה ' +\n 'ואותו אזור זמן בשני הצדדים. אם התווים אינם מזיקים, הוסיפו ' +\n '`suppressHydrationWarning` לאלמנט.',\n },\n 'locale-format.script': {\n explanation:\n 'אותו ערך עוצב במערכות ספרות שונות (ספרות ערביות-הודיות `٠١٢` לעומת ' +\n 'ספרות לטיניות `012`). השרת והלקוח בחרו הגדרות אזור שונות.',\n suggestion:\n 'העבירו `locale` מפורש (ואזור זמן) ל-`Intl.NumberFormat` או ' +\n 'ל-`toLocaleString` גם בשרת וגם בלקוח, או עצבו את הערך אחרי הטעינה כך ' +\n 'שרק הגדרת הלקוח תשמש.',\n },\n 'locale-format.separators': {\n explanation:\n 'אותו מספר עוצב עם מפרידי אלפים או מפרידים עשרוניים שונים בין השרת ' +\n 'ללקוח (למשל `1,234.56` לעומת `1.234,56`).',\n suggestion:\n 'העבירו הגדרת אזור מפורשת ל-`Intl.NumberFormat` או ל-`toLocaleString` ' +\n 'בשני הצדדים כדי שהמפרידים יתאימו.',\n },\n 'locale-format.date-order': {\n explanation:\n 'אותו תאריך הוצג בסדר שדות שונה (`MM/DD` לעומת `DD/MM`) בין השרת ללקוח.',\n suggestion:\n 'עצבו תאריכים עם הגדרת אזור ואזור זמן מפורשים באמצעות `Intl` בשני הצדדים.',\n },\n 'browser-only-api': {\n explanation:\n 'הלקוח רינדר תוכן שהשרת השאיר ריק — סימן מובהק לקריאה ל-API שקיים רק ' +\n 'בדפדפן (`window`, `document`, `localStorage`, `navigator`, ' +\n '`matchMedia`) בזמן רינדור.',\n suggestion:\n 'התנו קריאות מהדפדפן בדגל טעינה או ב-`useEffect`, או השתמשו ' +\n 'ב-`useSyncExternalStore` עם snapshot לשרת, כך שהרינדור הראשון בלקוח ' +\n 'יתאים לשרת.',\n },\n 'viewport-branching': {\n explanation:\n 'תת-עץ שלם נוסף, הוסר או הוחלף בין השרת ללקוח — בדרך כלל בדיקה של רוחב ' +\n 'המסך ב-JavaScript שמפצלת את העץ ברינדור הראשון.',\n suggestion:\n 'רנדרו את שני הענפים והחליפו ביניהם עם media queries של CSS בציור ' +\n 'הראשון במקום לפצל ב-JavaScript, או דחו את הענף שתלוי ב-JavaScript ' +\n 'לאחר הטעינה.',\n },\n 'invalid-html-nesting': {\n explanation:\n 'צומת הוזז או נפלט כי ה-HTML אינו תקין (למשל `<div>` בתוך `<p>`, או ' +\n '`<a>` בתוך `<a>`). הדפדפן מתקן את ה-DOM שהגיע מהשרת, ולכן הוא כבר לא ' +\n 'תואם את מה ש-React מצפה לו.',\n suggestion:\n 'תקנו את תקינות ה-HTML: אלמנטי בלוק לא יכולים להיות בתוך `<p>`, קישורים ' +\n 'לא יכולים להיות מקוננים וכדומה. החליפו את ההורה הלא תקין ב-`<div>` או ' +\n 'ארגנו מחדש את העץ.',\n },\n 'whitespace-minification': {\n explanation:\n 'ההבדל הוא ברווחים בלבד — הטקסט זהה מלבד רווחים ושורות חדשות. כנראה ' +\n 'ש-minifier של HTML כיווץ רווחים סביב שורש ה-Hydration באופן שונה ' +\n 'מ-React.',\n suggestion:\n 'בדקו את הגדרות ה-minifier של ה-HTML (למשל `conservativeCollapse`) סביב ' +\n 'שורש האפליקציה, או הימנעו ממיזעור רווחים בתוך markup שעובר Hydration.',\n },\n 'third-party-dom-mutation.extension-attribute': {\n explanation:\n 'המאפיין `{attribute}` הוזרק על ידי תוסף דפדפן או סקריפט צד שלישי (למשל ' +\n 'Grammarly או ColorZilla) לפני ה-Hydration, ולכן ה-DOM בלקוח כבר לא ' +\n 'תואם לשרת.',\n suggestion:\n 'בדרך כלל זה לא מזיק. הוסיפו `suppressHydrationWarning` לאלמנט המושפע, ' +\n 'או דחו את אתחול הסקריפט החיצוני עד אחרי ה-Hydration.',\n },\n 'third-party-dom-mutation.root-attribute': {\n explanation:\n 'מאפיין (`{attribute}`) הופיע על אלמנט שורש שהשרת מעולם לא שלח — סימן ' +\n 'היכר לתוסף או לסקריפט צד שלישי מוקדם שמשנה את ה-DOM.',\n suggestion:\n 'הוסיפו `suppressHydrationWarning` לאלמנט השורש, או דחו את הסקריפט ' +\n 'החיצוני עד אחרי ה-Hydration.',\n },\n 'third-party-dom-mutation.injected-node': {\n explanation: (p) => [\n 'סקריפט צד שלישי או תוסף דפדפן הזריק את האלמנט ',\n code(param(p, 'tag')),\n ' (פרסומות, הסכמה, אנליטיקה או צ׳אט) אחרי רינדור השרת. הוא לא חלק ' +\n 'מה-Hydration של האפליקציה שלכם, ולכן זה בדרך כלל רעש לא מזיק.',\n ],\n suggestion:\n 'אם React מזהיר לגביו, הוסיפו `suppressHydrationWarning` לעטיפה הקרובה ' +\n 'ביותר שרונדרה בשרת, או טענו את הסקריפט החיצוני אחרי ה-Hydration (למשל ' +\n '`<Script strategy=\"afterInteractive\">` ב-Next.js).',\n },\n 'attribute-mismatch.class': {\n explanation: (p) => [\n 'ה-',\n code('class'),\n ' שונה בין השרת ללקוח',\n ...classDetail(p, {\n added: 'נוסף בלקוח: ',\n removed: 'הוסר בלקוח: ',\n listSeparator: ', ',\n partSeparator: '; ',\n open: ' (',\n close: ')',\n }),\n '. מחלקה הוחלה בתנאי בלקוח — לרוב בדיקה של גודל מסך, media query, ' +\n 'ערכת נושא או feature flag שרצה ברינדור הראשון.',\n ],\n suggestion:\n 'רנדרו את אותו `className` בשרת ובציור הראשון בלקוח. העבירו תנאים שקיימים ' +\n 'רק בלקוח ל-`useEffect` או לדגל טעינה, או בצעו את השינוי החזותי עם ' +\n 'media queries של CSS במקום החלפת מחלקה ב-JavaScript.',\n },\n 'attribute-mismatch.style': {\n explanation:\n 'ה-`style` המוטבע שונה בין השרת ללקוח — סגנון מוטבע חושב ממצב שקיים רק ' +\n 'בלקוח (גודל מסך, ערכת נושא, מיקום גלילה) בזמן רינדור.',\n suggestion:\n 'חשבו את הסגנון אחרי הטעינה (`useEffect`) כדי שהרינדור הראשון בלקוח ' +\n 'יתאים לשרת, או העבירו אותו למחלקת CSS או ל-media query.',\n },\n 'attribute-mismatch.generic': {\n explanation:\n 'המאפיין `{attribute}` שונה בין השרת (`{server}`) ללקוח (`{client}`) — ' +\n 'הערך שלו נגזר ממשהו ששונה בין השרת לרינדור הראשון בלקוח.',\n suggestion:\n 'הפכו את המאפיין לדטרמיניסטי בשרת ובלקוח, או קבעו אותו אחרי הטעינה כך ' +\n 'שהרינדור הראשון בלקוח יתאים ל-HTML מהשרת.',\n },\n unknown: {\n explanation:\n 'זוהתה אי-התאמה ב-Hydration אך לא ניתן היה לשייך אותה לסיבה ידועה. ' +\n 'בדקו את ערכי השרת והלקוח למעלה.',\n suggestion:\n 'השוו בין ערכי השרת והלקוח. סיבות נפוצות הן ערכים לא דטרמיניסטיים, ' +\n 'תאריכים והגדרות אזור, ו-API של דפדפן שמשמשים בזמן רינדור.',\n },\n 'unknown.no-location': {\n explanation:\n 'React דיווח שה-Hydration נכשל אך לא ציין איזה צומת שונה, ובדיקת ה-DOM ' +\n 'לא מצאה הבדל להצביע עליו.',\n suggestion:\n 'ודאו ש-`<HydrationSnapshotScript>` (או סקריפט ה-snapshot הידני) נמצא ' +\n 'ב-`<head>` כדי שבדיקת ה-DOM תוכל לאתר את הצומת, וקראו את האזהרה המלאה ' +\n 'של React בקונסולת הדפדפן.',\n },\n};\n\n// Lazily, for the same reason as in the Arabic catalog: a module-level\n// `new Intl.PluralRules()` survives tree-shaking into production bundles.\nlet hePlural: Intl.PluralRules | null | undefined;\nfunction hebrewIssues(count: number): string {\n if (hePlural === undefined) {\n hePlural =\n typeof Intl !== 'undefined' && typeof Intl.PluralRules === 'function'\n ? new Intl.PluralRules('he')\n : null;\n }\n switch (hePlural?.select(count) ?? 'other') {\n case 'one':\n return 'בעיה אחת';\n case 'two':\n return 'שתי בעיות';\n default:\n return `${count} בעיות`;\n }\n}\n\nexport const HE: OverlayStrings = {\n dir: 'rtl',\n title: 'אי-התאמה ב-Hydration',\n dialogLabel: 'אבחון אי-התאמה ב-Hydration',\n dismiss: 'סגירה',\n dismissLabel: 'סגירת חלונית האבחון',\n hintDismissLabel: 'הסתרת הרמז',\n server: 'שרת',\n client: 'לקוח',\n fix: 'תיקון:',\n // The docs are only written in English, so say so rather than surprise.\n learnMore: 'למידע נוסף (באנגלית) ←',\n none: '(אין)',\n empty: '(ריק)',\n fallbackCategory: 'אי-התאמה',\n categories: {\n 'non-deterministic-value': 'ערך לא דטרמיניסטי',\n 'date-time': 'תאריך / שעה',\n 'locale-format': 'עיצוב לפי שפה ואזור',\n 'browser-only-api': 'API של דפדפן בלבד',\n 'viewport-branching': 'הסתעפות לפי גודל מסך',\n 'invalid-html-nesting': 'קינון HTML לא תקין',\n 'whitespace-minification': 'רווחים / מיזעור',\n 'third-party-dom-mutation': 'שינוי DOM על ידי צד שלישי',\n 'attribute-mismatch': 'אי-התאמה במאפיין',\n unknown: 'לא ידוע',\n },\n messages: HE_MESSAGES,\n hint: (count) => `↓ ${hebrewIssues(count)} — גללו כדי לראות הכול`,\n};\n","/**\n * Overlay languages.\n *\n * The overlay speaks the page's language where it can: an Arabic page gets an\n * Arabic, right-to-left panel, and everything else gets English. The engine's\n * own output (`cause.explanation`, the console, `onReport`) is always English;\n * only this view is translated, by looking causes up by `messageId`.\n *\n * Only the overlay imports this module, so it is tree-shaken out of production\n * builds together with the rest of the dev implementation.\n */\n\nimport type { HydrationCauseCategory } from '../core/types';\nimport { EN_MESSAGES, type MessageCatalog } from '../core/classify/messages';\nimport { AR } from './locales/ar';\nimport { FA } from './locales/fa';\nimport { HE } from './locales/he';\n\nexport type OverlayLocale = 'en' | 'ar' | 'he' | 'fa';\n\nexport interface OverlayStrings {\n readonly dir: 'ltr' | 'rtl';\n readonly title: string;\n readonly dialogLabel: string;\n readonly dismiss: string;\n readonly dismissLabel: string;\n readonly hintDismissLabel: string;\n readonly server: string;\n readonly client: string;\n readonly fix: string;\n readonly learnMore: string;\n readonly none: string;\n readonly empty: string;\n readonly fallbackCategory: string;\n readonly categories: Readonly<Record<HydrationCauseCategory, string>>;\n readonly messages: MessageCatalog;\n /** \"↓ 6 issues — scroll to see all\", with the language's plural rules. */\n hint(count: number): string;\n}\n\nconst EN: OverlayStrings = {\n dir: 'ltr',\n title: 'Hydration mismatch',\n dialogLabel: 'Hydration mismatch diagnostics',\n dismiss: 'Dismiss',\n dismissLabel: 'Dismiss diagnostics overlay',\n hintDismissLabel: 'Dismiss hint',\n server: 'Server',\n client: 'Client',\n fix: 'Fix:',\n learnMore: 'Learn more →',\n none: '(none)',\n empty: '(empty)',\n fallbackCategory: 'Mismatch',\n categories: {\n 'non-deterministic-value': 'Non-deterministic value',\n 'date-time': 'Date / time',\n 'locale-format': 'Locale formatting',\n 'browser-only-api': 'Browser-only API',\n 'viewport-branching': 'Viewport branching',\n 'invalid-html-nesting': 'Invalid HTML nesting',\n 'whitespace-minification': 'Whitespace / minification',\n 'third-party-dom-mutation': 'Third-party DOM mutation',\n 'attribute-mismatch': 'Attribute mismatch',\n unknown: 'Unknown',\n },\n messages: EN_MESSAGES,\n hint: (count) => `↓ ${count} issues — scroll to see all`,\n};\n\nexport const OVERLAY_STRINGS: Readonly<Record<OverlayLocale, OverlayStrings>> =\n {\n en: EN,\n ar: AR,\n he: HE,\n fa: FA,\n };\n\n// BCP 47 primary subtags per overlay language. Arabic lists the macrolanguage\n// plus the regional varieties a site might declare instead; `iw` is the\n// pre-1989 code for Hebrew that some systems still emit; Persian includes\n// Dari (`prs`) and the Iranian Persian code (`pes`).\nconst LANG_CODES: ReadonlyArray<readonly [OverlayLocale, RegExp]> = [\n ['ar', /^(?:ar|arb|arz|ary|arq|aeb|apc|ajp|acm|afb|ars|acw|ayl|apd)(?:-|$)/i],\n ['he', /^(?:he|iw)(?:-|$)/i],\n ['fa', /^(?:fa|pes|prs)(?:-|$)/i],\n];\n\nconst SUPPORTED = new Set<string>(['en', 'ar', 'he', 'fa']);\n\n/**\n * `'auto'` (the default) follows the page's `<html lang>`: Arabic, Hebrew and\n * Persian pages get the overlay in that language, laid out right-to-left, and\n * everything else — including other right-to-left languages the overlay does\n * not translate, such as Urdu — gets English. An explicit locale wins, and\n * anything unrecognised falls back to English rather than guessing.\n */\nexport function resolveLocale(preference?: string): OverlayLocale {\n if (preference != null && preference !== 'auto') {\n return SUPPORTED.has(preference) ? (preference as OverlayLocale) : 'en';\n }\n if (typeof document === 'undefined') return 'en';\n const lang = (document.documentElement.getAttribute('lang') ?? '').trim();\n for (const [locale, codes] of LANG_CODES) if (codes.test(lang)) return locale;\n return 'en';\n}\n","import type { Cause, HydrationReport } from '../core/types';\nimport {\n EN_MESSAGES,\n plainText,\n renderMessage,\n type MessageId,\n type MessageSegment,\n} from '../core/classify/messages';\nimport {\n OVERLAY_STRINGS,\n resolveLocale,\n type OverlayLocale,\n type OverlayStrings,\n} from './i18n';\n\nexport type { OverlayLocale } from './i18n';\n\nexport interface OverlayOptions {\n position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';\n /**\n * Language of the panel. `'auto'` (the default) follows the page's\n * `<html lang>`: Arabic, Hebrew and Persian pages get the panel in that\n * language, laid out right-to-left, and every other page gets English.\n * Pass `'en'`, `'ar'`, `'he'` or `'fa'` to pin it.\n */\n locale?: 'auto' | OverlayLocale;\n}\n\nexport interface OverlayHandle {\n push: (report: HydrationReport) => void;\n destroy: () => void;\n}\n\nconst CONTAINER_ID = 'why-hydration-overlay';\n\n// Proportional faces that carry Arabic script on each platform, so Arabic text\n// never falls through to a monospace face — those render it disconnected.\nconst ARABIC_FACES = 'Tahoma, \"Noto Sans Arabic\", \"Geeza Pro\", \"Segoe UI\"';\nconst UI_FONT = `ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, ${ARABIC_FACES}, sans-serif`;\nconst MONO_FONT = 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace';\n\nconst STYLES = `\n:host {\n all: initial;\n /* The \"all\" shorthand deliberately excludes direction/unicode-bidi (CSS\n spec), so these are set explicitly: the host page's own dir must never\n leak in. The panel below then takes its direction from the overlay's\n language, set inside this shadow root where no page style can reach it. */\n direction: ltr;\n unicode-bidi: isolate;\n}\n* { box-sizing: border-box; }\n.wh-panel {\n position: fixed;\n z-index: 2147483647;\n width: min(420px, calc(100vw - 32px));\n max-height: min(70vh, 640px);\n display: flex;\n flex-direction: column;\n font: 13px/1.5 ${UI_FONT};\n color: #e5e7eb;\n background: #0b0f17;\n border: 1px solid #1f2937;\n border-radius: 12px;\n box-shadow: 0 12px 40px rgba(0,0,0,.5);\n overflow: hidden;\n text-align: start;\n}\n.wh-panel[dir=\"ltr\"] { direction: ltr; }\n/* Arabic reads poorly at Latin sizes, and letter-spacing or uppercasing breaks\n the joining between its letters, so the right-to-left panel resets both. */\n.wh-panel[dir=\"rtl\"] { direction: rtl; font-size: 14px; line-height: 1.7; }\n.wh-panel[dir=\"rtl\"] .wh-side .wh-label { text-transform: none; letter-spacing: 0; font-size: 11px; }\n.wh-bottom-right { bottom: 16px; right: 16px; }\n.wh-bottom-left { bottom: 16px; left: 16px; }\n.wh-top-right { top: 16px; right: 16px; }\n.wh-top-left { top: 16px; left: 16px; }\n.wh-header {\n display: flex; align-items: center; gap: 8px;\n padding: 10px 12px;\n background: linear-gradient(180deg, #151b26, #0d1220);\n border-bottom: 1px solid #1f2937;\n}\n.wh-dot { width: 8px; height: 8px; border-radius: 50%; background: #f59e0b; flex: none; }\n.wh-title { font-weight: 600; color: #f3f4f6; }\n.wh-count {\n margin-inline-start: auto; font-size: 11px; color: #9ca3af;\n background: #111827; border: 1px solid #1f2937; border-radius: 999px;\n padding: 1px 8px;\n}\n.wh-btn {\n appearance: none; border: 1px solid #1f2937; background: #111827;\n color: #9ca3af; border-radius: 6px; cursor: pointer;\n font: inherit; font-size: 12px; padding: 3px 8px;\n}\n.wh-btn:hover { color: #f3f4f6; border-color: #374151; }\n.wh-list { flex: 1 1 auto; min-height: 0; overflow-y: auto; overscroll-behavior: contain; padding: 8px; display: flex; flex-direction: column; gap: 8px; }\n.wh-card { flex: 0 0 auto; border: 1px solid #1f2937; border-radius: 10px; background: #0f1521; overflow: hidden; }\n.wh-card-head { display: flex; align-items: center; gap: 8px; padding: 8px 10px; }\n.wh-cat { font-weight: 600; color: #fbbf24; font-size: 12px; }\n.wh-conf { margin-inline-start: auto; font-size: 11px; color: #6b7280; unicode-bidi: isolate; }\n.wh-body { padding: 0 10px 10px; }\n.wh-where { font-size: 11px; color: #9ca3af; overflow-wrap: anywhere; margin-bottom: 4px; }\n/* Selectors, component names, file paths and attribute names are code: they\n stay left-to-right and isolated, or an RTL line mirrors their brackets and\n reorders their segments. */\n.wh-where code, .wh-comp, .wh-attr { unicode-bidi: isolate; font-family: ${MONO_FONT}; }\n.wh-where code { color: #93c5fd; }\n.wh-comp { color: #f3f4f6; font-weight: 600; }\n.wh-attr { color: #c4b5fd; }\n.wh-loc { font-size: 11px; color: #7dd3fc; overflow-wrap: anywhere; margin-bottom: 8px; font-family: ${MONO_FONT}; unicode-bidi: isolate; text-align: start; }\n.wh-diff { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; margin-bottom: 8px; }\n.wh-side { border-radius: 8px; padding: 6px 8px; font-size: 11px; min-width: 0; }\n.wh-server { background: rgba(244,63,94,.08); border: 1px solid rgba(244,63,94,.35); }\n.wh-client { background: rgba(34,197,94,.08); border: 1px solid rgba(34,197,94,.35); }\n.wh-side .wh-label { display: block; font-size: 9px; text-transform: uppercase; letter-spacing: .04em; margin-bottom: 3px; }\n.wh-server .wh-label { color: #fb7185; }\n.wh-client .wh-label { color: #4ade80; }\n/* A value is page data in any script. Each line takes its direction from its\n own first strong character, so Arabic values read right-to-left with their\n punctuation at the end even inside the English panel, and English values\n stay left-to-right inside the Arabic one. Whitespace is preserved: a diff\n viewer that collapses spaces hides whitespace-only mismatches. */\n.wh-value {\n display: block; unicode-bidi: plaintext; text-align: start;\n white-space: pre-wrap; overflow-wrap: anywhere;\n font-family: ${MONO_FONT};\n}\n.wh-value.wh-prose { font-family: ${UI_FONT}; font-size: 12px; }\n.wh-empty-value { color: #6b7280; font-style: italic; font-family: ${UI_FONT}; }\n.wh-invisible {\n display: inline-block; margin: 0 1px; padding: 0 3px; border-radius: 3px;\n font: 600 8px/1.6 ${MONO_FONT}; letter-spacing: .02em; vertical-align: 1px;\n color: #fde68a; background: rgba(245,158,11,.18); border: 1px solid rgba(245,158,11,.45);\n unicode-bidi: isolate; direction: ltr;\n}\n.wh-explain { color: #cbd5e1; margin-bottom: 8px; }\n.wh-fix { color: #e5e7eb; background: #111827; border-inline-start: 3px solid #22c55e; border-radius: 4px; padding: 6px 8px; }\n.wh-fix strong { color: #86efac; }\n.wh-code {\n font-family: ${MONO_FONT}; font-size: .92em; color: #e2e8f0;\n background: rgba(148,163,184,.14); border-radius: 4px; padding: 0 3px;\n unicode-bidi: isolate; overflow-wrap: anywhere;\n}\n.wh-param { unicode-bidi: isolate; color: #f8fafc; }\n.wh-docs { display: inline-block; margin-top: 6px; color: #60a5fa; text-decoration: none; font-size: 11px; }\n.wh-docs:hover { text-decoration: underline; }\n.wh-hint {\n display: none; align-items: center; gap: 8px;\n padding: 7px 12px; font-size: 11px; color: #cbd5e1;\n background: #0d1220; border-top: 1px solid #1f2937;\n animation: wh-fade .2s ease;\n}\n.wh-hint.wh-show { display: flex; }\n.wh-hint-text { flex: 1; }\n.wh-hint-x {\n appearance: none; border: 0; background: transparent; cursor: pointer;\n color: #9ca3af; font-size: 14px; line-height: 1; padding: 2px 4px;\n}\n.wh-hint-x:hover { color: #f3f4f6; }\n@keyframes wh-fade { from { opacity: 0 } to { opacity: 1 } }\n@media (max-width: 420px) {\n .wh-panel { width: auto; max-height: min(80vh, 640px); }\n .wh-bottom-right, .wh-bottom-left { left: 8px; right: 8px; }\n .wh-top-right, .wh-top-left { left: 8px; right: 8px; }\n .wh-diff { grid-template-columns: 1fr; }\n}\n`;\n\nfunction el<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n className?: string,\n text?: string,\n): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag);\n if (className) node.className = className;\n if (text != null) node.textContent = text;\n return node;\n}\n\nfunction shortenPath(file: string): string {\n const normalized = file.replace(/\\\\/g, '/');\n const marker = normalized.match(/(?:^|\\/)(?:src|app|pages|components)\\//);\n if (marker && marker.index != null) {\n return normalized.slice(marker.index).replace(/^\\//, '');\n }\n const parts = normalized.split('/');\n return parts.slice(-2).join('/');\n}\n\n// Characters that change layout while rendering as nothing. In a value cell\n// they are exactly what differs between server and client in the bidi-mark\n// case, so they are drawn as labelled badges instead of being applied.\nconst INVISIBLE: Readonly<Record<string, string>> = {\n '\\u200b': 'ZWSP',\n '\\u200e': 'LRM',\n '\\u200f': 'RLM',\n '\\u061c': 'ALM',\n '\\u202a': 'LRE',\n '\\u202b': 'RLE',\n '\\u202c': 'PDF',\n '\\u202d': 'LRO',\n '\\u202e': 'RLO',\n '\\u2066': 'LRI',\n '\\u2067': 'RLI',\n '\\u2068': 'FSI',\n '\\u2069': 'PDI',\n '\\ufeff': 'BOM',\n};\nconst INVISIBLE_RE =\n /[\\u200b\\u200e\\u200f\\u061c\\u202a-\\u202e\\u2066-\\u2069\\ufeff]/;\nconst INVISIBLE_SPLIT =\n /([\\u200b\\u200e\\u200f\\u061c\\u202a-\\u202e\\u2066-\\u2069\\ufeff])/;\n\n// Hebrew, Arabic, Syriac, Thaana, N'Ko and the Arabic presentation forms.\nconst RTL_SCRIPT = /[-ࣿיִ-﷿ﹰ-ﻼ]/;\n\nfunction renderValue(\n value: string | null,\n strings: OverlayStrings,\n): HTMLElement {\n if (value == null || value === '') {\n return el(\n 'span',\n 'wh-empty-value',\n value === '' ? strings.empty : strings.none,\n );\n }\n const block = el('div', 'wh-value');\n block.dir = 'auto';\n // Human text in a right-to-left script reads as prose, not code: a\n // monospace face either lacks those glyphs or draws them disconnected.\n if (RTL_SCRIPT.test(value)) block.classList.add('wh-prose');\n if (!INVISIBLE_RE.test(value)) {\n block.textContent = value;\n return block;\n }\n for (const part of value.split(INVISIBLE_SPLIT)) {\n if (!part) continue;\n const name = INVISIBLE[part];\n if (!name) {\n block.append(part);\n continue;\n }\n const badge = el('span', 'wh-invisible', name);\n const cp = part.codePointAt(0)!.toString(16).toUpperCase().padStart(4, '0');\n badge.title = `U+${cp} ${name}`;\n block.appendChild(badge);\n }\n return block;\n}\n\nfunction renderSegments(segments: readonly MessageSegment[]): DocumentFragment {\n const out = document.createDocumentFragment();\n for (const s of segments) {\n if (typeof s === 'string') {\n out.append(s);\n } else if ('code' in s) {\n const c = el('code', 'wh-code', s.code);\n c.dir = 'auto';\n out.appendChild(c);\n } else {\n const v = el('bdi', 'wh-param', s.value);\n out.appendChild(v);\n }\n }\n return out;\n}\n\n// A custom classifier's text has no template; still render its backtick spans\n// as code, without touching anything that looks like a `{placeholder}`.\nfunction splitCode(text: string): MessageSegment[] {\n return text\n .split('`')\n .map((part, i) => (i % 2 === 1 ? { code: part } : part))\n .filter((s) => s !== '');\n}\n\n/**\n * The words for one field of a cause, in the overlay's language. A cause is\n * only translated when it is provably one of ours: a known `messageId` whose\n * English rendering is exactly the text the cause carries. Anything else — a\n * custom classifier, or one that reused an id with its own wording — is shown\n * as written, and flagged so it can be laid out in its own direction.\n */\nfunction causeText(\n cause: Cause,\n field: 'explanation' | 'suggestion',\n strings: OverlayStrings,\n): { segments: MessageSegment[]; translated: boolean } {\n const id = cause.messageId as MessageId | undefined;\n const params = cause.params ?? {};\n if (id && Object.prototype.hasOwnProperty.call(EN_MESSAGES, id)) {\n const english = plainText(renderMessage(EN_MESSAGES[id][field], params));\n if (english === cause[field]) {\n return {\n segments: renderMessage(strings.messages[id][field], params),\n translated: true,\n };\n }\n }\n return { segments: splitCode(cause[field]), translated: false };\n}\n\nfunction renderCard(\n report: HydrationReport,\n strings: OverlayStrings,\n): HTMLElement {\n const card = el('div', 'wh-card');\n\n const head = el('div', 'wh-card-head');\n head.appendChild(\n el(\n 'span',\n 'wh-cat',\n strings.categories[report.cause.category] ?? strings.fallbackCategory,\n ),\n );\n const conf = el(\n 'span',\n 'wh-conf',\n `${Math.round(report.cause.confidence * 100)}%`,\n );\n conf.dir = 'ltr';\n head.appendChild(conf);\n card.appendChild(head);\n\n const body = el('div', 'wh-body');\n\n const where = el('div', 'wh-where');\n const name = report.component ?? report.node.tagName?.toLowerCase();\n if (name) {\n const comp = el(\n 'bdi',\n report.component ? 'wh-comp' : 'wh-attr',\n `<${name}>`,\n );\n comp.dir = 'ltr';\n where.append(comp, ' · ');\n }\n const path = el('code', undefined, report.node.path);\n path.dir = 'ltr';\n where.appendChild(path);\n if (report.node.attribute) {\n const attr = el('bdi', 'wh-attr', `@${report.node.attribute}`);\n attr.dir = 'ltr';\n where.append(' · ', attr);\n }\n body.appendChild(where);\n\n if (report.location?.file) {\n const file = shortenPath(report.location.file);\n const loc = el(\n 'div',\n 'wh-loc',\n report.location.line ? `${file}:${report.location.line}` : file,\n );\n loc.dir = 'ltr';\n body.appendChild(loc);\n }\n\n const diff = el('div', 'wh-diff');\n const server = el('div', 'wh-side wh-server');\n server.appendChild(el('span', 'wh-label', strings.server));\n server.appendChild(renderValue(report.server, strings));\n const client = el('div', 'wh-side wh-client');\n client.appendChild(el('span', 'wh-label', strings.client));\n client.appendChild(renderValue(report.client, strings));\n diff.appendChild(server);\n diff.appendChild(client);\n body.appendChild(diff);\n\n const explanation = causeText(report.cause, 'explanation', strings);\n const explain = el('div', 'wh-explain');\n // Untranslated text keeps its own direction: an English sentence inside\n // the Arabic panel would otherwise read with its punctuation reversed.\n explain.dir = explanation.translated ? strings.dir : 'auto';\n explain.appendChild(renderSegments(explanation.segments));\n body.appendChild(explain);\n\n const suggestion = causeText(report.cause, 'suggestion', strings);\n const fix = el('div', 'wh-fix');\n fix.appendChild(el('strong', undefined, strings.fix));\n fix.append(' ');\n const fixText = el('span');\n fixText.dir = suggestion.translated ? strings.dir : 'auto';\n fixText.appendChild(renderSegments(suggestion.segments));\n fix.appendChild(fixText);\n body.appendChild(fix);\n\n if (report.cause.docsUrl && /^https?:\\/\\//i.test(report.cause.docsUrl)) {\n const a = el('a', 'wh-docs', strings.learnMore);\n a.href = report.cause.docsUrl;\n a.target = '_blank';\n a.rel = 'noreferrer noopener';\n body.appendChild(a);\n }\n\n card.appendChild(body);\n return card;\n}\n\nexport function createOverlay(options: OverlayOptions = {}): OverlayHandle {\n const position = options.position ?? 'bottom-right';\n let host: HTMLElement | null = null;\n let listEl: HTMLElement | null = null;\n let countEl: HTMLElement | null = null;\n let hintEl: HTMLElement | null = null;\n let hintTextEl: HTMLElement | null = null;\n let hintCheckTimer: ReturnType<typeof setTimeout> | null = null;\n let hintDismissed = false;\n let count = 0;\n let strings: OverlayStrings = OVERLAY_STRINGS.en;\n\n function ensureMounted(): void {\n if (host) return;\n document.getElementById(CONTAINER_ID)?.remove();\n // Resolved per mount, so a page whose <html lang> is set after load picks\n // it up the next time the panel appears.\n const locale = resolveLocale(options.locale);\n strings = OVERLAY_STRINGS[locale];\n\n host = document.createElement('div');\n host.id = CONTAINER_ID;\n host.setAttribute('data-why-hydration', 'overlay');\n host.setAttribute('aria-hidden', 'false');\n host.setAttribute('dir', strings.dir);\n host.setAttribute('lang', locale);\n const shadow = host.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = STYLES;\n shadow.appendChild(style);\n\n const panel = el('div', `wh-panel wh-${position}`);\n // Direction and language live on the panel, inside the shadow root, where\n // no stylesheet from the host page can override them. `lang` also makes a\n // screen reader voice the panel in its own language rather than the\n // page's — without it, English text is read aloud with an Arabic voice.\n panel.setAttribute('dir', strings.dir);\n panel.setAttribute('lang', locale);\n panel.setAttribute('role', 'dialog');\n panel.setAttribute('aria-label', strings.dialogLabel);\n\n const header = el('div', 'wh-header');\n header.appendChild(el('span', 'wh-dot'));\n header.appendChild(el('span', 'wh-title', strings.title));\n countEl = el('span', 'wh-count', '0');\n countEl.dir = 'ltr';\n header.appendChild(countEl);\n const close = el('button', 'wh-btn', strings.dismiss);\n close.setAttribute('aria-label', strings.dismissLabel);\n close.addEventListener('click', () => destroy());\n header.appendChild(close);\n panel.appendChild(header);\n\n listEl = el('div', 'wh-list');\n panel.appendChild(listEl);\n\n hintEl = el('div', 'wh-hint');\n hintTextEl = el('span', 'wh-hint-text');\n hintEl.appendChild(hintTextEl);\n const hintX = el('button', 'wh-hint-x', '✕');\n hintX.setAttribute('aria-label', strings.hintDismissLabel);\n hintX.addEventListener('click', () => dismissHint());\n hintEl.appendChild(hintX);\n panel.appendChild(hintEl);\n\n shadow.appendChild(panel);\n document.body.appendChild(host);\n\n host.addEventListener('keydown', (e) => {\n if ((e as KeyboardEvent).key === 'Escape') destroy();\n });\n }\n\n function dismissHint(): void {\n hintDismissed = true;\n hintEl?.classList.remove('wh-show');\n }\n\n // Show a persistent \"scroll for more\" hint once there are enough issues that\n // the panel is guaranteed to overflow (cards are ~150px+, panel caps at\n // ~640px, so 4+ always scroll). Count-based — no async layout measurement —\n // and only ever ADDS the class. It's removed only by its own ✕ button.\n function updateHint(): void {\n if (!hintEl || !hintTextEl || hintDismissed) return;\n hintTextEl.textContent = strings.hint(count);\n if (count >= 4) hintEl.classList.add('wh-show');\n }\n\n // Tears the panel down to nothing — including the counters, which describe\n // the cards in the list rather than the reports ever seen. `push` re-mounts\n // an empty panel, so a stale count would have it claim \"14 issues — scroll to\n // see all\" above a single card that does not scroll.\n function destroy(): void {\n if (hintCheckTimer) clearTimeout(hintCheckTimer);\n hintCheckTimer = null;\n host?.remove();\n host = null;\n listEl = null;\n countEl = null;\n hintEl = null;\n hintTextEl = null;\n count = 0;\n hintDismissed = false;\n }\n\n function push(report: HydrationReport): void {\n ensureMounted();\n count += 1;\n if (countEl) countEl.textContent = String(count);\n listEl?.appendChild(renderCard(report, strings));\n // Debounce: reports arrive in bursts across the settling window. Evaluate\n // the hint once things go quiet.\n if (hintCheckTimer) clearTimeout(hintCheckTimer);\n hintCheckTimer = setTimeout(updateHint, 400);\n }\n\n return { push, destroy };\n}\n","import type { DetectionContext } from '../core/types';\n\n// Best-effort: walk the React fiber attached to a DOM node to recover the\n// owning component name and (in React 18 dev builds) its source file/line.\n// This is what turns a bare selector path into \"which component / file\".\n// Purely read-only, dev-only, and defensive — any failure returns {}.\n\ninterface Fiber {\n type?: unknown;\n return?: Fiber | null;\n _debugSource?: { fileName?: string; lineNumber?: number; columnNumber?: number };\n _debugOwner?: Fiber | null;\n}\n\nfunction getFiber(node: Node): Fiber | null {\n for (const key in node) {\n if (\n key.startsWith('__reactFiber$') ||\n key.startsWith('__reactInternalInstance$')\n ) {\n return (node as unknown as Record<string, Fiber>)[key] ?? null;\n }\n }\n return null;\n}\n\nfunction componentName(type: unknown): string | undefined {\n if (!type || typeof type === 'string') return undefined;\n if (typeof type === 'function') {\n const fn = type as { displayName?: string; name?: string };\n return fn.displayName || fn.name || undefined;\n }\n if (typeof type === 'object') {\n const obj = type as {\n displayName?: string;\n render?: { displayName?: string; name?: string };\n type?: unknown;\n };\n if (obj.displayName) return obj.displayName;\n if (obj.render) return obj.render.displayName || obj.render.name;\n if (obj.type) return componentName(obj.type);\n }\n return undefined;\n}\n\n/**\n * Resolve the component and source location responsible for a live DOM node.\n * Returns a {@link DetectionContext} fragment (`component`, `location`) that the\n * reporter merges into the report.\n */\nexport function resolveReactSource(node: Element | null): DetectionContext {\n if (!node) return {};\n try {\n let fiber: Fiber | null = getFiber(node);\n let component: string | undefined;\n let location: DetectionContext['location'];\n let hops = 0;\n while (fiber && hops < 80) {\n if (!component) {\n const name = componentName(fiber.type);\n // Skip built-in host components (div, span…) — we want the nearest\n // user component that owns this node.\n if (name && !/^[a-z]/.test(name)) component = name;\n }\n if (!location && fiber._debugSource?.fileName) {\n location = {\n file: fiber._debugSource.fileName,\n line: fiber._debugSource.lineNumber,\n column: fiber._debugSource.columnNumber,\n };\n }\n if (component && location) break;\n fiber = fiber.return ?? null;\n hops += 1;\n }\n const result: DetectionContext = {};\n if (component) result.component = component;\n if (location) result.location = location;\n return result;\n } catch {\n return {};\n }\n}\n","import { inspectRoot, reportFromMessage } from '../core/inspect';\nimport { isInternalComponent } from '../core/react-message';\nimport { ReportCollector } from '../core/report';\nimport {\n DEFAULT_SNAPSHOT_SELECTORS,\n getServerHtmlForRoot,\n readSnapshot,\n} from '../core/snapshot';\nimport { isDev } from '../core/env';\nimport type {\n Classifier,\n DetectionContext,\n Divergence,\n HydrationReport,\n} from '../core/types';\nimport { MAX_CAPTURED, subscribeCapture } from './capture';\nimport { createConsoleReporter } from './console';\nimport { createOverlay, type OverlayOptions } from './overlay';\nimport { resolveReactSource } from './fiber';\n\nconst INSPECT_FALLBACK_MS = 50;\n\nexport interface InspectorOptions {\n overlay?: boolean | OverlayOptions;\n onReport?: (report: HydrationReport) => void;\n ignore?: Array<string | ((node: Element) => boolean)>;\n classify?: Classifier[];\n maxReports?: number;\n roots?: string[];\n}\n\nfunction buildIgnore(\n ignore: InspectorOptions['ignore'],\n): ((d: Divergence) => boolean) | undefined {\n if (!ignore || ignore.length === 0) return undefined;\n return (divergence: Divergence): boolean => {\n const node = divergence.element ?? null;\n for (const rule of ignore) {\n if (typeof rule === 'function') {\n if (node && rule(node)) return true;\n } else if (node) {\n try {\n if (node.matches(rule) || node.closest(rule)) return true;\n } catch {\n /* invalid selector */\n }\n }\n }\n return false;\n };\n}\n\nexport class InspectorController {\n private readonly collector: ReportCollector;\n private options: InspectorOptions;\n private overlayTeardown: (() => void) | null = null;\n private readonly matchedRoots = new Set<string>();\n private readonly cleanups: Array<() => void> = [];\n private started = false;\n private pendingContext: DetectionContext = {};\n private readonly messages = new Set<string>();\n // The component a recoverable error's own stack names, per message. A report\n // parsed from a message may only carry *that* message's context: borrowing\n // the latest error's instead labelled unrelated reports with the component\n // from some other error (a localStorage read attributed to <InvalidNesting>).\n private readonly messageContext = new Map<string, DetectionContext>();\n private readonly warnedRoots = new Set<string>();\n private settlingTimers: Array<ReturnType<typeof setTimeout>> = [];\n private inspectScheduled = false;\n private inspectTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(options: InspectorOptions = {}) {\n this.options = options;\n this.collector = new ReportCollector({\n maxReports: options.maxReports,\n extra: options.classify,\n ignore: buildIgnore(options?.ignore),\n });\n }\n\n start(): void {\n if (this.started || !isDev || typeof window === 'undefined') return;\n this.started = true;\n\n // Forwarded rather than registered directly, so `update()` can swap the\n // callback without re-registering it — and without replaying reports the\n // previous callback already received.\n this.cleanups.push(\n this.collector.addSink((report) => this.options.onReport?.(report)),\n );\n this.cleanups.push(this.collector.addSink(createConsoleReporter()));\n this.mountOverlay();\n\n // Replays whatever React logged before this controller existed, which is\n // the normal case: the mismatch is reported while the tree hydrates.\n this.cleanups.push(\n subscribeCapture((message) => {\n this.rememberMessage(message);\n this.mergeContext({ reactMessage: message });\n this.scheduleInspect();\n }),\n );\n\n this.scheduleSettlingInspections();\n }\n\n // React applies client values to mismatched subtrees via a client re-render a\n // few hundred ms after the initial hydration commit. We diff once per frame\n // and then across this short \"settling window\" to catch that, deduped. This\n // is a bounded, one-shot window — NOT a standing observer — so DOM changes\n // from later app state are never mistaken for hydration mismatches.\n private scheduleSettlingInspections(): void {\n this.scheduleInspect();\n const delays = [80, 250, 700, 1500];\n for (const delay of delays) {\n const last = delay === delays[delays.length - 1];\n const timer = setTimeout(() => {\n this.inspectAllRoots();\n if (last) this.warnUnmatchedRoots();\n }, delay);\n this.settlingTimers.push(timer);\n }\n }\n\n onRecoverableError = (\n error: unknown,\n info?: { componentStack?: string },\n ): void => {\n if (!isDev) return;\n const message = error instanceof Error ? error.message : String(error);\n this.rememberMessage(message);\n if (this.messages.has(message) && info?.componentStack) {\n this.messageContext.set(message, {\n componentStack: info.componentStack,\n component: firstComponentFromStack(info.componentStack),\n });\n }\n this.mergeContext({\n componentStack: info?.componentStack,\n component: firstComponentFromStack(info?.componentStack),\n reactMessage: message,\n });\n this.scheduleInspect();\n };\n\n private rememberMessage(message: string): void {\n if (this.messages.size >= MAX_CAPTURED && !this.messages.has(message)) {\n return;\n }\n this.messages.add(message);\n }\n\n private mergeContext(ctx: DetectionContext): void {\n this.pendingContext = {\n componentStack: ctx.componentStack ?? this.pendingContext.componentStack,\n component: ctx.component ?? this.pendingContext.component,\n location: ctx.location ?? this.pendingContext.location,\n reactMessage: ctx.reactMessage ?? this.pendingContext.reactMessage,\n };\n }\n\n // Context for reports parsed from one message: that message's own component\n // and stack if it came with one, plus the source location the caller gave.\n private contextFor(message: string): DetectionContext {\n return {\n location: this.pendingContext.location,\n ...this.messageContext.get(message),\n };\n }\n\n private domContext(): DetectionContext {\n return {\n componentStack: this.pendingContext.componentStack,\n component: this.pendingContext.component,\n location: this.pendingContext.location,\n };\n }\n\n /**\n * Apply new options to a running inspector. `<HydrationInspector>` calls\n * this when its props change; before, it read them once at mount and every\n * later change was silently ignored until a reload.\n *\n * - `onReport` takes effect for the next report.\n * - `overlay` (on/off, `position`, `locale`) rebuilds the panel, replaying\n * the reports so far — only when it actually changed, so inline objects\n * re-created on every render do not remount it.\n * - `ignore`, `classify` and `maxReports` apply to everything reported from\n * now on; reports already made stay as they are.\n */\n update(options: InspectorOptions): void {\n const overlayBefore = overlayKey(this.options.overlay);\n this.options = options;\n this.collector.configure({\n maxReports: options.maxReports,\n extra: options.classify,\n ignore: buildIgnore(options.ignore),\n });\n if (this.started && overlayKey(options.overlay) !== overlayBefore) {\n this.unmountOverlay();\n this.mountOverlay();\n }\n }\n\n private mountOverlay(): void {\n if (this.options.overlay === false) return;\n const handle = createOverlay(\n typeof this.options.overlay === 'object' ? this.options.overlay : {},\n );\n // Replay: a fresh overlay must show the reports collected before it.\n const detach = this.collector.addSink(handle.push, { replay: true });\n this.overlayTeardown = () => {\n detach();\n handle.destroy();\n };\n }\n\n private unmountOverlay(): void {\n this.overlayTeardown?.();\n this.overlayTeardown = null;\n }\n\n stop(): void {\n for (const timer of this.settlingTimers.splice(0)) clearTimeout(timer);\n this.clearScheduledInspect();\n this.unmountOverlay();\n for (const cleanup of this.cleanups.splice(0)) cleanup();\n this.started = false;\n }\n\n getReports(): readonly HydrationReport[] {\n return this.collector.getReports();\n }\n\n inspectNow(context: DetectionContext = {}): void {\n this.mergeContext(context);\n this.inspectAllRoots();\n }\n\n private inspectAllRoots(): void {\n if (\n !this.started ||\n typeof document === 'undefined' ||\n this.collector.isFull\n ) {\n return;\n }\n // 1) DOM diff — every visible mismatch (text/attribute/structure), precise\n // path + component/source from the fiber.\n const configured = this.options.roots;\n const selectors = configured ?? snapshotSelectors();\n const context = this.domContext();\n const seen = new Set<Element>();\n for (const selector of selectors) {\n let root: Element | null = null;\n try {\n root = document.querySelector(selector);\n } catch {\n this.warnRoot(selector, `\"${selector}\" is not a valid CSS selector.`);\n continue;\n }\n if (!root) continue;\n this.matchedRoots.add(selector);\n if (seen.has(root)) continue;\n seen.add(root);\n if (configured && getServerHtmlForRoot(root) == null) {\n this.warnRoot(\n selector,\n `no server HTML was captured for \"${selector}\". Add it to the ` +\n '`selectors` prop of <HydrationSnapshotScript> so the server ' +\n 'markup for that root is snapshotted.',\n );\n continue;\n }\n inspectRoot(root, this.collector, context, (divergence) =>\n resolveReactSource(divergence.element ?? null),\n );\n }\n\n // 2) React's own messages — the only source for class/style mismatches\n // (React doesn't patch attributes into the DOM) and for pages with no\n // snapshot. Value-based dedup means this never double-reports a\n // mismatch the DOM diff already found.\n for (const message of this.messages) {\n reportFromMessage(message, this.collector, this.contextFor(message), {\n locationless: 'skip',\n });\n }\n // 3) React's bare \"hydration failed\" message names no node. Next to a\n // concrete report it is a card with no values; it earns its place only\n // when nothing else was found — no snapshot script, say — because then\n // it is the one sign that hydration failed at all. Deciding after the\n // other messages keeps that independent of the order they arrived in.\n const concrete = this.collector\n .getReports()\n .some((r) => r.cause.messageId !== 'unknown.no-location');\n if (!concrete) {\n for (const message of this.messages) {\n reportFromMessage(message, this.collector, this.contextFor(message), {\n locationless: 'only',\n });\n }\n }\n }\n\n // A configured root that matches nothing can never be inspected — usually a\n // typo, or a selector for markup this page does not have. Checked once the\n // settling window is over rather than on the first pass, so a root that is\n // rendered a moment after hydration is not reported by mistake.\n private warnUnmatchedRoots(): void {\n if (!this.started) return;\n for (const selector of this.options.roots ?? []) {\n if (this.matchedRoots.has(selector)) continue;\n this.warnRoot(\n selector,\n `no element matches \"${selector}\" on this page, so it was never ` +\n 'inspected. Check the selector against your markup.',\n );\n }\n }\n\n private warnRoot(selector: string, detail: string): void {\n if (this.warnedRoots.has(selector)) return;\n this.warnedRoots.add(selector);\n // eslint-disable-next-line no-console\n console.warn(`[why-hydration] Skipping root: ${detail}`);\n }\n\n private scheduleInspect(): void {\n if (this.inspectScheduled) return;\n this.inspectScheduled = true;\n const run = () => {\n if (!this.inspectScheduled) return;\n this.clearScheduledInspect();\n this.inspectAllRoots();\n };\n if (typeof requestAnimationFrame === 'function') requestAnimationFrame(run);\n this.inspectTimer = setTimeout(run, INSPECT_FALLBACK_MS);\n }\n\n private clearScheduledInspect(): void {\n this.inspectScheduled = false;\n if (this.inspectTimer != null) {\n clearTimeout(this.inspectTimer);\n this.inspectTimer = null;\n }\n }\n}\n\n// What the overlay would render, so an update that only re-creates an equal\n// options object — an inline `overlay={{ position }}` — does not remount it.\nfunction overlayKey(overlay: InspectorOptions['overlay']): string {\n if (overlay === false) return 'off';\n const o = typeof overlay === 'object' ? overlay : {};\n return `${o.position ?? 'bottom-right'}|${o.locale ?? 'auto'}`;\n}\n\nfunction snapshotSelectors(): string[] {\n const snapshot = readSnapshot();\n const keys = snapshot ? Object.keys(snapshot.roots) : [];\n return keys.length > 0 ? keys : [...DEFAULT_SNAPSHOT_SELECTORS];\n}\n\n// A component stack lists frames innermost first, and the innermost ones are\n// usually host elements — `at p`, `at span` — which are DOM tags, not\n// components. Naming those as the culprit sends the reader to the wrong\n// place, so skip them (lowercase by JSX convention) along with framework\n// internals, and report the nearest component the developer actually wrote.\nfunction firstComponentFromStack(stack?: string): string | undefined {\n if (!stack) return undefined;\n const frame = /(?:^|\\n)\\s*(?:at|in)\\s+([A-Za-z0-9_$]+)/g;\n for (const match of stack.matchAll(frame)) {\n const name = match[1]!;\n if (/^[A-Z]/.test(name) && !isInternalComponent(name)) return name;\n }\n return undefined;\n}\n","import * as React from 'react';\nimport type { Classifier, HydrationReport } from '../core/types';\nimport { startCapture } from './capture';\nimport { InspectorController, type InspectorOptions } from './controller';\nimport type { OverlayOptions } from './overlay';\n\nexport interface HydrationInspectorProps {\n children: React.ReactNode;\n overlay?: boolean | OverlayOptions;\n onReport?: (report: HydrationReport) => void;\n ignore?: Array<string | ((node: Element) => boolean)>;\n classify?: Classifier[];\n maxReports?: number;\n}\n\nexport function InspectorImpl(\n props: HydrationInspectorProps,\n): React.ReactElement {\n const { children, overlay, onReport, ignore, classify, maxReports } = props;\n\n // The one thing that cannot wait for an effect: React logs the mismatch while\n // it hydrates the children below, and effects run after that. Capture is\n // module-scoped and idempotent, so Strict Mode — which renders twice with\n // fresh hook state — starts it once instead of leaving a stray interceptor.\n startCapture();\n\n const options: InspectorOptions = {\n overlay,\n onReport,\n ignore,\n classify,\n maxReports,\n };\n // Seeded from the first render and kept current by the effect below — not\n // written during render, which React may discard or repeat.\n const optionsRef = React.useRef(options);\n const controllerRef = React.useRef<InspectorController | null>(null);\n\n React.useEffect(() => {\n // Everything stateful is owned by the effect so React controls its\n // lifetime. Strict Mode's setup → cleanup → setup then yields one live\n // controller, fully torn down and fully rebuilt, and the messages React\n // already logged are replayed to it from the capture backlog.\n const controller = new InspectorController(optionsRef.current);\n controllerRef.current = controller;\n controller.start();\n return () => {\n controller.stop();\n if (controllerRef.current === controller) controllerRef.current = null;\n };\n }, []);\n\n // Props that change after mount reach the running controller instead of\n // being ignored until a reload. The controller compares what matters, so\n // inline values re-created on every render cost nothing.\n React.useEffect(() => {\n optionsRef.current = options;\n controllerRef.current?.update(options);\n // `options` is rebuilt every render; its parts are the real dependencies.\n }, [overlay, onReport, ignore, classify, maxReports]);\n\n return React.createElement(React.Fragment, null, children);\n}\n","// NOTE: the `'use client'` directive for this entry is injected into the built\n// output by scripts/postbuild-use-client.mjs (esbuild strips source-level module\n// directives when bundling). This entry only exports client components.\nimport * as React from 'react';\nimport { InspectorController, type InspectorOptions } from './controller';\nimport { InspectorImpl, type HydrationInspectorProps } from './inspector';\n\nfunction PassThrough(props: {\n children?: React.ReactNode;\n}): React.ReactElement {\n return React.createElement(React.Fragment, null, props.children);\n}\n\n// The process.env.NODE_ENV checks are inline (not hoisted to a variable) so\n// production bundlers fold them and tree-shake the dev-only implementation.\nexport const HydrationInspector: (\n props: HydrationInspectorProps,\n) => React.ReactElement =\n process.env.NODE_ENV !== 'production' ? InspectorImpl : PassThrough;\n\nexport interface HydrationInspectorHandle {\n onRecoverableError: (\n error: unknown,\n info?: { componentStack?: string },\n ) => void;\n Provider: (props: { children?: React.ReactNode }) => React.ReactElement;\n}\n\nexport function createHydrationInspector(\n options: InspectorOptions = {},\n): HydrationInspectorHandle {\n if (process.env.NODE_ENV === 'production') {\n return {\n onRecoverableError: () => {},\n Provider: PassThrough,\n };\n }\n\n const controller = new InspectorController(options);\n controller.start();\n\n function Provider(props: { children?: React.ReactNode }): React.ReactElement {\n React.useEffect(() => {\n // The controller is started eagerly above, because the console has to be\n // intercepted before `hydrateRoot` runs. Strict Mode then plays this\n // effect setup → cleanup → setup, so a Provider that only stopped on\n // cleanup left the inspector dead for the rest of the session. `start()`\n // is idempotent and the controller is restartable, so re-starting here\n // yields exactly one live inspector either way.\n controller.start();\n return () => controller.stop();\n }, []);\n return React.createElement(React.Fragment, null, props.children);\n }\n\n return {\n onRecoverableError: controller.onRecoverableError,\n Provider,\n };\n}\n\nexport type { HydrationInspectorProps } from './inspector';\nexport type { InspectorOptions } from './controller';\nexport type { OverlayLocale, OverlayOptions } from './overlay';\nexport type {\n Cause,\n Classifier,\n DetectionContext,\n Divergence,\n HydrationCauseCategory,\n HydrationReport,\n} from '../core/types';\n"]}
|