@loadbare/app 0.19.1 → 0.20.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.
@@ -1 +1 @@
1
- {"version":3,"file":"lb-apply.js","sourceRoot":"","sources":["../../hub/lb-apply.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAE3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,EACL,UAAU,EACV,WAAW,EACX,WAAW,EACX,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,QAAQ,EACR,WAAW,EACX,iBAAiB,GAClB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,WAAW,EACX,aAAa,EACb,OAAO,EACP,WAAW,EACX,UAAU,EACV,MAAM,EACN,MAAM,GAUP,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,YAAY,EACZ,aAAa,EACb,OAAO,EACP,MAAM,EACN,MAAM,EACN,aAAa,GACd,MAAM,mBAAmB,CAAC;AAE3B,kFAAkF;AAClF,MAAM,aAAa,GAAG,EAAE,CAAC;AAEzB,kDAAkD;AAClD,MAAM,YAAY,GAAG,CAAC,CAAC;AAEvB,mDAAmD;AACnD,MAAM,SAAS,GAAG,CAAC,CAAC;AAEpB;;;;GAIG;AACH,MAAM,eAAe,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAOtD;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,EAAW;IAClC,IAAI,EAAE,CAAC,SAAS,KAAK,QAAQ,IAAI,EAAE,CAAC,SAAS,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IAC1E,OAAO,CACL,EAAE,CAAC,SAAS,KAAK,OAAO;QACxB,CAAC,eAAe,CAAC,QAAQ,CAAE,EAAuB,CAAC,IAAI,CAAC,CACzD,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,UAAU,CAAC,EAAW;IAC7B,OAAO,CACL,EAAE,CAAC,SAAS,KAAK,OAAO,IAAK,EAAuB,CAAC,IAAI,KAAK,UAAU,CACzE,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,EAAW;IACjC,OAAO,EAAE,CAAC,SAAS,KAAK,OAAO,IAAK,EAAuB,CAAC,IAAI,KAAK,OAAO,CAAC;AAC/E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAAW;IAC1C,MAAM,IAAI,GAAG,EAAE,CAAC,WAA2C,CAAC;IAC5D,OAAO,IAAI,CAAC,cAAc,KAAK,IAAI,IAAI,OAAO,IAAI,EAAE,CAAC;AACvD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,EAAW;IACnC,OAAO,CACL,eAAe,CAAC,EAAE,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,gBAAgB,CAAC,EAAE,CAAC,CAC7E,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,EAAW;IAC/B,OAAO,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAE,EAAuB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;AAC9E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CACxB,MAA8B,EAC9B,MAAc,EACd,EAAW;IAEX,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,CAAE,EAAuB,CAAC,OAAO,EAAE,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO;IACT,CAAC;IACD,MAAM,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;AACpC,CAAC;AAED;;;;;GAKG;AACH,SAAS,IAAI,CAAC,EAAW,EAAE,KAAc;IACvC,kEAAkE;IAClE,sDAAsD;IACtD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,IAAI,UAAU,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;YACjC,EAAuB,CAAC,OAAO,GAAG,KAAK,CAAC;QAC3C,CAAC;aAAM,IAAI,SAAS,CAAC,EAAE,CAAC;YAAE,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC;aACnC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;YACjE,EAAE,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,CAAC;QACD,EAAE,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC;QACtC,OAAO;IACT,CAAC;IACD,IAAI,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;QACnB,uEAAuE;QACvE,yBAAyB;QACxB,EAAuB,CAAC,OAAO,GAAG,KAAK,KAAK,KAAK,CAAC;IACrD,CAAC;SAAM,IAAI,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;QACtB,EAAuB,CAAC,OAAO;YAC7B,EAAuB,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC;SAAM,IAAI,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;QACzB,EAAE,CAAC,KAAK,GAAG,KAAe,CAAC;IAC7B,CAAC;SAAM,IAAI,EAAE,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;QACpC,OAAO,CAAC,IAAI,CACV,iDAAkD,EAAuB,CAAC,IAAI,cAAc,EAC5F,EAAE,CACH,CAAC;QACF,OAAO;IACT,CAAC;SAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7B,CAAC;IACD,QAAQ,CAAC,EAAE,EAAE,iBAAiB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACjD,CAAC;AAED;;;;GAIG;AACH,SAAS,OAAO,CAAC,EAAW,EAAE,IAAY;IACxC,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAI;QACf,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,SAAS;YACrB,IAAI,CAAC,QAAQ,KAAK,SAAS;YAC1B,IAAa,CAAC,IAAI,KAAK,IAAI;QAC9B,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;IAChB,IAAI,CAAC,IAAI;QAAE,EAAE,CAAC,WAAW,GAAG,IAAI,CAAC;AACnC,CAAC;AAED,0DAA0D;AAC1D,SAAS,QAAQ,CAAC,EAAW,EAAE,IAAY,EAAE,KAAa;IACxD,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,KAAK;QAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACpE,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAS,OAAO,CACd,IAAgC,EAChC,EAAW,EACX,IAAa;IAEb,IAAI,IAAI,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1D,KAAK,IAAI,IAAI,GAAG,EAAE,CAAC,aAAa,EAAE,IAAI,IAAI,IAAI,KAAK,IAAI,GAAG,CAAC;QACzD,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC;YAAE,OAAO,KAAK,CAAC;QAChD,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7C,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,MAAM,CAAC,IAAa,EAAE,QAAgB;IACpD,MAAM,KAAK,GAAc,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjD,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,KAAK,CACZ,IAAgC,EAChC,QAAgB,EAChB,IAAa;IAEb,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjD,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,IAAI,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CACR,GAAG,KAAK,CAAE,MAA8B,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAClE,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,SAAS,UAAU,CAAC,IAAgB,EAAE,QAAgB;IACpD,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,MAAM,OAAO,GAAI,MAA8B,CAAC,OAAO,CAAC;QACxD,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,GAAY,EAAE,EAAW;IAC7C,GAAwB,CAAC,OAAO,GAAG,EAAE,CAAC;IACvC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;AAChE,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAS,OAAO,CAAC,EAAW,EAAE,EAAW;IACvC,IAAI,EAAE,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;QAChC,MAAM,MAAM,GAAI,EAA0B,CAAC,OAAO,CAAC,iBAAiB,CAAC;QACrE,IAAI,EAAE,IAAI,MAAM;YAAE,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACzC,OAAO;IACT,CAAC;IACD,IAAI,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE,QAAQ,KAAK,aAAa;QAAE,OAAO;IAC5D,wEAAwE;IACxE,0DAA0D;IAC1D,KAAK,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,WAAW,GAAG,CAAC,CAAC,EAAE,CAAC;QACnE,IAAI,GAAG,CAAC,YAAY,CAAC,WAAW,CAAC;YAAE,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACxD,CAAC;IACD,MAAM,MAAM,GAAG,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAC1D,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,EAAE,CAAC,YAAY,CAAC,SAAS,CAAE,CAAC,CAAC;IAC5D,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACvB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED,wDAAwD;AACxD,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAgC,CAAC;AAE7D;;;;GAIG;AACH,SAAS,aAAa,CAAC,EAAW,EAAE,EAAW;IAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChC,IAAI,MAAM,IAAI,EAAE,CAAC,UAAU,KAAK,MAAM,CAAC,OAAO;QAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACpE,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC;AAWD,SAAS,QAAQ,CAAC,GAA2B,EAAE,IAAY,EAAE,EAAW;IACtE,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,IAAI;QAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;;QACnB,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED;;;;GAIG;AACH,SAAS,IAAI,CAAC,MAAc,EAAE,EAAW;IACvC,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;IAC5C,IAAI,MAAM,KAAK,IAAI;QAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACxC,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO;IAC1B,IAAI,EAAE,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;QAChC,MAAM,MAAM,GAAI,EAA0B,CAAC,OAAO,CAAC,iBAAiB,CAAC;QACrE,IAAI,MAAM;YAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,EAAyB,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;IACD,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,QAAQ;IACf,OAAO,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;AAClD,CAAC;AAED;;;;GAIG;AACH,SAAS,MAAM,CAAC,IAAa,EAAE,IAAa,EAAE,IAAa;IACzD,MAAM,MAAM,GAAG,QAAQ,EAAE,CAAC;IAC1B,IAAI,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC;QAC3C,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,WAAW,CAAE,EAAE,IAAI,CAAC,CAAC;IAClE,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,WAAW,OAAO,SAAS,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;QACvE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAQD,SAAS,IAAI,CAAC,EAAW;IACvB,OAAO,EAAE,CAAC,SAAS,KAAK,UAAU;QAChC,CAAC,CAAE,EAA0B,CAAC,OAAO,CAAC,QAAQ;QAC9C,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,SAAS,OAAO,CAAC,GAAY;IAC3B,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,CAAC,EAAW,EAAE,IAAU,EAAQ,EAAE;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;YAC3B,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;YACxB,IAAI,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC;gBACrE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC;YACD,IAAI,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC;gBAAE,SAAS;YAC7C,IAAI,KAAK,CAAC,SAAS,KAAK,UAAU,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC;gBACrE,SAAS;YACX,CAAC;YACD,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACd,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,SAAS,QAAQ,CAAC,GAAY,EAAE,KAAa;IAC3C,MAAM,MAAM,GAAG,QAAQ,EAAE,CAAC;IAC1B,IAAI,GAAG,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC;QAClC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,YAAY,CAAC,WAAW,CAAE,EAAE,GAAG,CAAC,CAAC;IAChE,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,EAAE,GAAG,GAAG,CAAC;QACb,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC;QACxC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,oDAAoD;AACpD,SAAS,IAAI,CAAC,CAAU,EAAE,CAAU;IAClC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,uEAAuE;IACvE,OAAO,CACL,OAAO,CAAC,KAAK,QAAQ;QACrB,OAAO,CAAC,KAAK,QAAQ;QACrB,CAAC,KAAK,IAAI;QACV,CAAC,KAAK,IAAI;QACV,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CACxC,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,IAAI,CAAC,MAAc,EAAE,GAAQ;IACpC,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAClD,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE;YAAE,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACnE,MAAM,EAAE,GAAG,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,CAAC;QAC7C,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE;YAAE,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACvE,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;YAChE,aAAa,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,QAAQ,CACtB,IAAa,EACb,GAAQ,EACR,IAAI,GAAG,KAAK,EACZ,IAAa;IAEb,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;AACtC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAa;IACpC,MAAM,GAAG,GAAQ,EAAE,CAAC;IACpB,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,CAAE,CAAC,GAAG,IAAI,CAAC;IAC5C,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAE,CAAC;QACzC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC7E,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,EAAW;IACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,EAAE,iBAAiB,SAAS,IAAI,CAAC,CAAC,IAAI,CAC9D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAChB,CAAC;IACF,OAAQ,QAA4C,IAAI,IAAI,CAAC;AAC/D,CAAC;AAED,qEAAqE;AACrE,MAAM,SAAS,GACb,iEAAiE;IACjE,4CAA4C;IAC5C,kDAAkD,CAAC;AAErD;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,IAAa;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC;IAC/B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,gBAAgB,CAAc,SAAS,CAAC,EAAE,CAAC;QAC/D,IAAI,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;YAAE,SAAS;QACtC,IAAI,EAAE,CAAC,OAAO,CAAC,uCAAuC,CAAC;YAAE,SAAS;QAClE,IAAI,EAAE,CAAC,eAAe,EAAE,EAAE,KAAK,KAAK;YAAE,SAAS;QAC/C,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,GAAG,CAAC,aAAa,KAAK,EAAE;YAAE,OAAO;IACvC,CAAC;AACH,CAAC;AAyDD,MAAM,KAAK,GAAG,IAAI,OAAO,EAAiB,CAAC;AAE3C,sEAAsE;AACtE,MAAM,MAAM,GAAG,IAAI,OAAO,EAAW,CAAC;AAEtC;;;GAGG;AACH,MAAM,aAAa,GAAG,GAAG,QAAQ,KAAK,UAAU,KAAK,OAAO,EAAE,CAAC;AAE/D,yCAAyC;AACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEnE;;;;GAIG;AACH,SAAS,MAAM,CAAC,IAAgC;IAC9C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,SAAS,IAAI,CAAC,EAAE,CAAC;QACtE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAAE,OAAO,CAAwB,CAAC;IACxD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,IAAa,EAAE,IAAa;IAChD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;IACpD,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;QAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,SAAS,OAAO,CAAC,EAAW,EAAE,QAA6B;IACzD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5B,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,MAAM,GAA0B,EAAE,CAAC;IACzC,IAAI,EAAE,GAAG,QAAQ,CAAC;IAClB,OAAO,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CACX,gCAAgC,EAAE,CAAC,SAAS,oBAAoB;gBAC9D,2BAA2B,CAC9B,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,EAAE,GAAG,IAAI,CAAC;IACZ,CAAC;IACD,MAAM,IAAI,GAAS;QACjB,GAAG,EAAE,QAAQ;QACb,MAAM;QACN,WAAW,EAAE,EAAE;QACf,KAAK,EAAE,IAAI,GAAG,EAAE;QAChB,IAAI,EAAE;YACJ,EAAE,EAAE,EAAE;YACN,KAAK,EAAE,EAAE;YACT,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,EAAE;YACZ,IAAI,EAAE,EAAE;YACR,KAAK,EAAE,EAAE;YACT,UAAU,EAAE,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC;YACnC,MAAM,EAAE,KAAK;SACd;KACF,CAAC;IACF,wEAAwE;IACxE,sEAAsE;IACtE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,KAAK,MAAM,GAAG,IAAI,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC;gBAAE,SAAS;YAChC,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,CAAC,cAAc,CAAE,CAAC;YAC9C,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,OAAO,CAAC,KAAK,CACX,YAAY,EAAE,CAAC,SAAS,kCAAkC,GAAG,GAAG,CACjE,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,GAAU;gBACnB,GAAG;gBACH,EAAE,EAAE,GAAG;gBACP,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC;gBACzB,IAAI,EAAE,EAAE;gBACR,MAAM,EAAE,KAAK;aACd,CAAC;YACF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACpB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kEAAkE;AAClE,SAAS,SAAS,CAAC,KAAY;IAC7B,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;QAC9B,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC;QACnC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,SAAS,MAAM,CAAC,IAAU,EAAE,GAAa,EAAE,GAAW;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,iBAAkB,CAAC;IAC7D,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC,2EAA2E;IAC3E,oEAAoE;IACpE,wEAAwE;IACxE,WAAW;IACX,MAAM,EAAE,GAAG,GAAG,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC1C,aAAa,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACvB,MAAM,CAAC,EAAE,CAAC,CAAC;IACX,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IACnC,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACrC,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACpB,MAAM,KAAK,GAAU;QACnB,GAAG;QACH,EAAE;QACF,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC;QAChC,IAAI,EAAE,EAAE;QACR,MAAM,EAAE,KAAK;KACd,CAAC;IACF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC3B,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,SAAS,UAAU,CAAC,GAAY,EAAE,GAAW;IAC3C,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,GAAG,EAAE,qBAAqB,WAAW,GAAG,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,WAAW,CAAE,CAAC;QACtE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,6EAA6E;AAC7E,SAAS,OAAO,CAAC,MAAc,EAAE,KAAc;IAC7C,OAAO,GAAG,MAAM,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC;AAC3D,CAAC;AAED,6EAA6E;AAC7E,SAAS,SAAS,CAChB,GAAa,EACb,QAA6B,EAC7B,EAAU,EACV,IAA2B,EAC3B,KAAc;IAEd,6DAA6D;IAC7D,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACxD,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IACvC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,UAAU,GAAc,EAAE,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,QAAQ,KAAK,YAAY,IAAI,IAAI,KAAK,IAAI;YAAE,SAAS;QAC9D,MAAM,EAAE,GAAG,IAAe,CAAC;QAC3B,MAAM,CAAC,EAAE,CAAC,CAAC;QACX,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;QACrC,IAAI,IAAI;YAAE,EAAE,CAAC,YAAY,CAAC,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC1C,EAAE,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACnD,CAAC;QACD,wEAAwE;QACxE,wDAAwD;QACxD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;QAC1D,UAAU,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO;QACL,EAAE;QACF,KAAK;QACL,IAAI;QACJ,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,EAAE;QACR,KAAK;QACL,UAAU;QACV,MAAM,EAAE,KAAK;KACd,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,QAAQ,CACf,GAAQ,EACR,IAAS,EACT,GAAc,EACd,OAAiC;IAEjC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,KAAK,GAAG,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC;QAAE,KAAK,EAAE,CAAC;IAC3D,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,OACE,IAAI,GAAG,IAAI,GAAG,KAAK;QACnB,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,EAC3D,CAAC;QACD,IAAI,EAAE,CAAC;IACT,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACrD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAChC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IACpE,MAAM,QAAQ,GAAG,GAAG,CAAC,aAAc,CAAC,sBAAsB,EAAE,CAAC;IAC7D,KAAK,MAAM,IAAI,IAAI,MAAM;QAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7D,GAAG,CAAC,UAAW,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAC9C,CAAC;AAED;;;;GAIG;AACH,SAAS,OAAO,CACd,IAAU,EACV,GAAa,EACb,KAAc,EACd,KAAkB;IAElB,MAAM,OAAO,GAAY,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,CAAC,MAAa,EAAE,KAAa,EAAE,OAAgB,EAAQ,EAAE;QACrE,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACjC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YACnE,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC;YACtB,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAuD,EAAE,CAAC;QACpE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACpD,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,IAAI,EAAE,EAAE,KAAK,EAAE;gBAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;gBACzC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,sEAAsE;QACtE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAmB,CAAC;QACxC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CACnB,CAAC,GAAG,EAAE,EAAE,CACN,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE;YACzB,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAC/D,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE;YAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QACxD,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrE,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAE,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IACpE,CAAC,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IAC3B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,SAAS,SAAS,CAChB,MAAe,EACf,KAAc,EACd,OAA2B;IAE3B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAS,CAAC;IAC/B,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACrC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,wEAAwE;IACxE,MAAM,OAAO,GAAG,CAAC,IAAa,EAAgC,EAAE;QAC9D,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAC;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACnD,IAAI,IAAI,GAAiB,IAAI,CAAC;QAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;;gBAC/C,IAAI,GAAG,GAAG,CAAC;QAClB,CAAC;QACD,IAAI,GAAG,IAAI,CAAC;QACZ,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YACjC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;;gBAC5C,IAAI,GAAG,GAAG,CAAC;QAClB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IACF,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5B,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACvD,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;QAC7B,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,SAAS;YAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,uEAAuE;AACvE,SAAS,OAAO,CAAC,EAAW,EAAE,IAAY,EAAE,KAAa;IACvD,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACzB,EAAE,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC;IACvC,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC3B,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,yEAAyE;AACzE,SAAS,UAAU,CAAC,KAAY,EAAE,KAAkB;IAClD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ;QAAE,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC7D,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;YACnC,OAAO,CAAC,IAAe,EAAE,eAAe,EAAE,kBAAkB,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACH,SAAS,MAAM,CAAC,KAAkB;IAChC,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,QAAQ,KAAK,YAAY;YAAE,SAAS;QAC7C,MAAM,EAAE,GAAG,IAA8D,CAAC;QAC1E,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,EAAE,GAAG,GAAS,EAAE;QACpB,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QACxC,aAAa,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC;IACF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,EAAE,EAAE,CAAC;;QAC1B,KAAK,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxE,CAAC;AAED;;;;GAIG;AACH,MAAM,MAAM;IACF,KAAK,GAAwB,EAAE,CAAC;IAExC,GAAG,CAAC,EAAW,EAAE,IAAY,EAAE,EAAW;QACxC,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,GAAG;YAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,IAAI,GAAG;YAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;;YAChC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,CAAC,GAAa;QAChB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACpC,KAAK,GAAG,CAAC,WAAW,EAAE,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;QACxE,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK;YAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACjE,CAAC;CACF;AAQD,8DAA8D;AAC9D,MAAM,OAAO,GAAG,oBAAoB,CAAC;AAErC,SAAS,SAAS,CAAC,KAAc;IAC/B,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/D,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IACxE,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtD,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,KAAM,GAAG,QAAQ,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;AACvE,CAAC;AAED,SAAS,OAAO,CAAC,CAAU,EAAE,KAAa;IACxC,OAAO,CAAC,CAAC,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,WAAW,CAAC,MAAc,EAAE,KAAa;IAChD,MAAM,QAAQ,GAAG,MAAM,GAAG,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;SACvC,QAAQ,EAAE;SACV,QAAQ,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,GAAG,QAAQ,EAAE,CAAC;AACrD,CAAC;AAED,wEAAwE;AACxE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;AAEnC;;;;;GAKG;AACH,SAAS,WAAW,CAClB,IAAY,EACZ,MAAc,EACd,IAAW,EACX,IAAiB;IAEjB,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI;SAChB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;SACzB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC5B,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACnE,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACnB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,MAAM,EAAE,CAAC,EAAE,CAAC;YAC5C,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,MAAM,EAAE,CAAC,CAAC;YAClC,OAAO,CAAC,IAAI,CACV,WAAW,IAAI,KAAK,MAAM,cAAc,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI;gBAC/D,uBAAuB,CAC1B,CAAC;QACJ,CAAC;IACH,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IACzE,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACtD,0EAA0E;IAC1E,+CAA+C;IAC/C,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACpC,IAAI,IAAI,GAAG,WAAW,CAAC,CAAC,EAAE,GAAG,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACvE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3E,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACvD,CAAC;AAED,0EAA0E;AAC1E,SAAS,SAAS,CAAC,QAAmB,EAAE,IAAW,EAAE,KAAkB;IACrE,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAE,CAAC;QACzD,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,SAAS,IAAI,CAAC,EAAW,EAAE,MAAe;IACxC,IAAI,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,MAAM;QAAE,EAAE,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AACjF,CAAC;AAED;;;;;GAKG;AACH,SAAS,MAAM,CAAC,KAAY,EAAE,KAAkB;IAC9C,MAAM,IAAI,GACR,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;QACvB,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACzD,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAChE,IAAI,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QAC5B,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QACtB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,QAAQ,KAAK,YAAY,IAAI,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC1D,IAAI,CAAC,IAAe,EAAE,MAAM,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,IAAI,CAAC,CAAC,CAAC;QAAE,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK;YAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACzC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kEAAkE;AAClE,SAAS,OAAO,CAAC,EAAW,EAAE,KAAyB;IACrD,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,SAAS,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACrE,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,uEAAuE;AACvE,SAAS,QAAQ,CAAC,OAAwB,EAAE,MAAc;IACxD,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;IAChC,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;QAC1D,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACpB,CAAC;AAED,kDAAkD;AAClD,SAAS,QAAQ,CAAC,EAAW;IAC3B,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;SACxC,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;SAC9B,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,SAAS,QAAQ,CAAC,EAAW,EAAE,OAAoB;IACjD,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtE,OAAO,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,SAAS,SAAS,CAChB,EAAW,EACX,OAAwB,EACxB,KAAkB;IAElB,MAAM,OAAO,GAA6B,EAAE,CAAC;IAC7C,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC1D,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,EAAE,CACb,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAClF,CAAC;AAED;;;GAGG;AACH,SAAS,SAAS,CAAC,KAAY,EAAE,MAAe;IAC9C,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO;IACpC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACvB,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,KAAK,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,WAAW,GAAG,CAAC,CAAC,EAAE,CAAC;QAC/E,IAAI,GAAG,CAAC,YAAY,CAAC,WAAW,CAAC;YAAE,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED,oEAAoE;AACpE,SAAS,OAAO,CAAC,MAAW,EAAE,KAAU;IACtC,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAC/B,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAClD,CAAC;AACJ,CAAC;AAmBD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,SAAS,CACvB,EAAW,EACX,QAA6B,EAC7B,SAAiB,EACjB,MAAkB,EAClB,UAAuB,EAAE;IAEzB,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IACnC,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,MAAM,GAAG,GAAG,EAAE,CAAC,aAAa,CAAC;IAC7B,MAAM,IAAI,GAAG,EAA4B,CAAC;IAC1C,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAEtC,oDAAoD;IACpD,KAAK,MAAM,KAAK,IAAI,KAAK;QAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC;IAExE,6BAA6B;IAC7B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAe,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;QACxD,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE,CAAC;YAClC,OAAO,CAAC,KAAK,CACX,sBAAsB,EAAE,CAAC,SAAS,aAAa,SAAS,UAAU,CACnE,CAAC;YACF,SAAS;QACX,CAAC;QACD,kEAAkE;QAClE,8DAA8D;QAC9D,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACpC,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CACX,yBAAyB,EAAE,CAAC,SAAS,mBAAmB,GAAG,KAAK;gBAC9D,oBAAoB,CACvB,CAAC;YACF,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;QACD,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,MAAM,OAAO,GAAG,KAAK;QACnB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,KAAK,MAAM,GAAG,IAAI,OAAO;QAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,KAAK;QAChB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnD,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAExD,qBAAqB;IACrB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAS,CAAC;IACjC,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,0EAA0E;IAC1E,wEAAwE;IACxE,oEAAoE;IACpE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAS,CAAC;IACjC,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;QACnC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC5D,IAAI,KAAK,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC5E,KAAK,CAAC,IAAI,GAAG,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;IAC1C,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,aAAa,EAAE,gBAAgB,CAAC,CAAC;IACrD,CAAC;IAED,wEAAwE;IACxE,oEAAoE;IACpE,+BAA+B;IAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC;IAC5E,IAAI,KAAK,GAAG,KAAK;QACf,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;QACzD,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IACjD,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QACzD,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACf,OAAO,CAAC,IAAI,CACV,YAAY,EAAE,CAAC,SAAS,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,SAAS;YAC1D,+BAA+B,KAAK,CAAC,MAAM,yBAAyB;YACpE,qCAAqC,CACxC,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,KAAK,GAAG,KAAK;aACV,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;aACjC,IAAI,CACH,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC;YAC7D,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CACZ;aACA,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,OAAO,GAAG,SAAS,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACpE,KAAK,MAAM,KAAK,IAAI,KAAK;QAAE,SAAS,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAElE,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACjD,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAEvB,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;IAC5B,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;QACnC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,IAAI;YACpB,CAAC,CAAC,eAAe;YACjB,CAAC,CAAC,KAAK;gBACL,CAAC,CAAC,iBAAiB;gBACnB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;oBAClB,CAAC,CAAC,iBAAiB;oBACnB,CAAC,CAAC,IAAI,CAAC;QACb,IAAI,OAAO,CAAC,SAAS,IAAI,SAAS,EAAE,CAAC;YACnC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEjB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACpD,gEAAgE;IAChE,QAAQ,CAAC,EAAE,EAAE,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAExD,MAAM,SAAS,GAAgB,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7D,KAAK,MAAM,KAAK,IAAI,OAAO;QAAE,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC1D,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAE5C,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;AACxB,CAAC;AAQD,SAAS,UAAU,CAAC,IAAU,EAAE,GAAa;IAC3C,MAAM,MAAM,GAAG,GAAG,CAAC,aAAmC,CAAC;IACvD,MAAM,GAAG,GAAG,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,cAAc,CAAE,CAAC,CAAC;IAChE,OAAO,KAAK,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACtD,CAAC;AAED;;;;GAIG;AACH,SAAS,OAAO,CAAC,IAAU,EAAE,OAAuB;IAClD,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAClC,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC;IACjC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QACzD,IAAI,GAAG,CAAC,aAAa,KAAK,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW;YAAE,OAAO;QAChE,MAAM,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,MAAM,CAAC,cAAc,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9D,IAAI,KAAK;QAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,kEAAkE;AAClE,SAAS,QAAQ,CACf,EAAW,EACX,IAAkB,EAClB,UAAuB,EAAE;IAEzB,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IACtD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACrB,IAAI,QAAQ,EAAE,CAAC;YACb,SAAS,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QACD,qEAAqE;QACrE,gBAAgB;QAChB,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3B,EAAE,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;YACnC,OAAO;QACT,CAAC;QACD,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAClB,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACtC,QAAQ,CAAC,EAAE,EAAE,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO;IACT,CAAC;IACD,0EAA0E;IAC1E,oDAAoD;IACpD,IAAI,CAAC,QAAQ;QAAE,OAAO;IACtB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IAC7C,SAAS,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AACrD,CAAC;AAYD,MAAM,IAAI,GAAG,IAAI,OAAO,EAAoB,CAAC;AAE7C,SAAS,OAAO,CAAC,IAAgB;IAC/B,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,KAAK,GAAG,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,EAAE,CAAC;QACtD,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,UAAU,CACxB,IAAgB,EAChB,KAAa;IAEb,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,KAAW,EAAE,IAAkB;IAClD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;IACvD,OAAO;QACL,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,GAAG,IAAI,SAAS;KAC5D,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,MAAM,CAAC,IAAgB;IACrC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC;AAED;;;;GAIG;AACH,SAAS,OAAO,CAAC,IAAW,EAAE,GAAW,EAAE,KAAY;IACrD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAClE,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE;QAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,IAAI,CAAC,OAAkC,EAAE,IAAkB;IAClE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG;QACf,GAAG,CAAC,MAAM,EAAE,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QAC3D,GAAG,CAAC,MAAM,EAAE,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;KAC5D,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QAClD,OAAO;IACT,CAAC;IACD,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE;QACtB,GAAG,QAAQ;QACX,GAAG,KAAK;QACR,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC;KACvD,CAAC,CAAC;AACL,CAAC;AAED,2DAA2D;AAC3D,SAAS,MAAM,CAAC,KAAW,EAAE,IAAkB;IAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC;IAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,MAAM,IAAI,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,qEAAqE;AACrE,SAAS,KAAK,CAAC,EAAW,EAAE,OAAoB;IAC9C,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;IAC1C,OAAO,CACL,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CACnD,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,QAAQ,CAAC,IAAgB,EAAE,KAAW,EAAE,OAAoB;IACnE,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAC1C,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;YAAE,SAAS;QACrC,KAAK,MAAM,EAAE,IAAI,UAAU,CAAC,IAAI,EAAE,IAAI,UAAU,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;YAChE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;gBAAE,SAAS;YAC3D,IAAI,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC;gBAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CAAC,IAAgB,EAAE,KAAW;IACjD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAClC,KAAK,IAAI,MAAM,GAAG,IAAI,EAAE,MAAM,GAAG,CAAC;QAChC,MAAM,GAAG,KAAK,CAAC;QACf,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;YACpC,KAAK,MAAM,EAAE,IAAI,UAAU,CAAC,IAAI,EAAE,IAAI,UAAU,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;gBAChE,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;oBAAE,SAAS;gBACpD,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACf,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClE,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAcD;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAgB,EAChB,KAAqB,EACrB,UAAuB,EAAE;IAEzB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GACX,IAAI,CAAC,KAAK,KAAK,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAU,CAAC;QACzE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC1B,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,UAAU,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,CACxE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAC7B,CAAC;QACF,IACE,OAAO,CAAC,MAAM,KAAK,CAAC;YACpB,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,kBAAkB,CAAC;YAC1C,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EACpC,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,0BAA0B,IAAI,CAAC,KAAK,aAAa,CAAC,CAAC;QAClE,CAAC;QACD,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;YACzB,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACrB,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE;gBACjB,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC;gBAC3B,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B,CAAC,CAAC;QACL,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC;YAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IACD,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC1B,YAAY,EAAE,CAAC;AACjB,CAAC","sourcesContent":["/// <reference lib=\"dom\" />\n\n/**\n * Landing — see docs/reference/data-binding.md.\n *\n * The hub lands a response item's rows on every element whose `lb-query`\n * names its query. The item says the query's kind and key, so the markup\n * says neither:\n *\n * kind row template the hub\n * row no lands the row on the element itself\n * row yes lands one live row\n * rows yes lands one live row per row\n * rows no lands nothing\n *\n * Filling a live row and filling an element a `row` lands on are the same\n * operation, and the only difference is how much of the page the root\n * covers.\n *\n * An answer is kept after it lands. An element that names a query and\n * arrives after that query's answer — a picker in a new live row, a ghost\n * row a custom element built — is filled from the kept answer at the end of\n * the next landing, so a query need not land again, and need not land after\n * the one whose rows hold it, just to fill what is new.\n *\n * Every custom element landing places is told so once the landing is done,\n * and every one it removes is told so once it is gone — see lb-lifecycle.\n *\n * A `rows` query is placed by its order: the user's, from the choice its\n * element's `lb-order` names, or the one the server declared, or, with\n * neither, the order its rows arrived in. Groups are built from the markup's\n * group templates as the order breaks, and every change to a list — a row\n * created, changed, moved or leaving, a group appearing or leaving — is one\n * a stylesheet can see. A row a filter the user chose does not pass is\n * hidden.\n *\n * A condition is the one other thing landing moves. An element whose\n * `lb-show` column is off stands in the document inside a template, and\n * landing reaches in there as it reaches everywhere else, so a branch that\n * returns is already current. Nothing but landing reaches in.\n */\n\nimport {\n AGGREGATES,\n ATTR_COLUMN,\n ATTR_FILTER,\n ATTR_ORDER,\n CHOICES_QUERY,\n LB_RESERVED_PREFIX,\n ATTR_COLUMN_VALUE,\n ATTR_COUNT,\n ATTR_GROUP,\n ATTR_GROUP_COLUMN,\n ATTR_GROUP_LEAVING,\n ATTR_GROUP_LIVE,\n ATTR_GROUP_VALUE,\n ATTR_KEY_VALUE,\n ATTR_MAX,\n ATTR_MIN,\n ATTR_QUERY,\n ATTR_QUERY_ROW_COUNT,\n ATTR_ROW_CHANGED,\n ATTR_ROW_CREATED,\n ATTR_ROW_LEAVING,\n ATTR_ROW_LIVE,\n ATTR_ROW_MOVED,\n ATTR_ROW_REQUESTED,\n ATTR_SHOW,\n ATTR_SUM,\n KIND_ROW,\n LIVE_GROUP,\n LIVE_ROW,\n REQUESTED_CHANGED,\n REQUESTED_CREATED,\n REQUESTED_MOVED,\n SHOW_NOT,\n ATTR_SELECT,\n ATTR_ROW_SELECTED,\n} from \"../core/lb-constants.js\";\nimport {\n compareRows,\n compareValues,\n isPatch,\n parseFilter,\n parseOrder,\n passes,\n readAs,\n type ColumnType,\n type ColumnTypes,\n type FilterTerm,\n type OrderTerm,\n type Patch,\n type HubLifecycle,\n type ResponseItem,\n type Row,\n type RowsResult,\n} from \"../core/lb-types.js\";\nimport {\n attachPlaced,\n detachRemoved,\n LEAVING,\n PARKED,\n placed,\n upgradeAbsent,\n} from \"./lb-lifecycle.js\";\n\n/** A DocumentFragment's nodeType. Tier 3 has no `Node` global to read it from. */\nconst FRAGMENT_NODE = 11;\n\n/** An Element's nodeType, for the same reason. */\nconst ELEMENT_NODE = 1;\n\n/** A Text node's nodeType, for the same reason. */\nconst TEXT_NODE = 3;\n\n/**\n * The input types whose state is not their `value`, or cannot be set. A\n * checkbox's and a radio button's state is `checked`, and each is a control\n * by its own rule.\n */\nconst UNLANDED_INPUTS = [\"checkbox\", \"radio\", \"file\"];\n\n/** A control's value, whether it is native or a custom element. */\nexport interface Control extends Element {\n value: string;\n}\n\n/**\n * A native control whose state is its `value`: a `<select>`, a\n * `<textarea>`, or an `<input>` of any type but checkbox, radio and file.\n *\n * Told apart by tag name and type rather than by class, so it holds for an\n * element from any document.\n */\nfunction isNativeControl(el: Element): boolean {\n if (el.localName === \"select\" || el.localName === \"textarea\") return true;\n return (\n el.localName === \"input\" &&\n !UNLANDED_INPUTS.includes((el as HTMLInputElement).type)\n );\n}\n\n/**\n * A checkbox, whose state is `checked` rather than `value`. HTML's quirk,\n * and so the hub's: it lands and gathers by its checked state, so every other\n * part of the vocabulary treats it as any control.\n */\nfunction isCheckbox(el: Element): boolean {\n return (\n el.localName === \"input\" && (el as HTMLInputElement).type === \"checkbox\"\n );\n}\n\n/**\n * A radio button, whose state is `checked` as well. It is checked when its\n * own `value` is the value that landed, so a group of them naming one column\n * shows that value, and gathers the one checked.\n */\nexport function isRadio(el: Element): boolean {\n return el.localName === \"input\" && (el as HTMLInputElement).type === \"radio\";\n}\n\n/**\n * A form-associated custom element with a `value` property. HTML marks one\n * with `static formAssociated = true` on its class, and a control has a value.\n */\nexport function isFormAssociated(el: Element): boolean {\n const ctor = el.constructor as { formAssociated?: unknown };\n return ctor.formAssociated === true && \"value\" in el;\n}\n\n/**\n * A control: an `<input>`, `<select>` or `<textarea>`, a checkbox, a radio\n * button, or a\n * form-associated custom element with a `value` property. Landing and\n * gathering draw the same line, so a value read back is the one that landed\n * there.\n */\nexport function isControl(el: Element): el is Control {\n return (\n isNativeControl(el) || isCheckbox(el) || isRadio(el) || isFormAssociated(el)\n );\n}\n\n/**\n * What a control gathers: a checkbox `\"true\"` or `\"false\"`, so unchecked\n * still says so, and any other control its `value`.\n */\nfunction controlValue(el: Control): string {\n return isCheckbox(el) ? String((el as HTMLInputElement).checked) : el.value;\n}\n\n/**\n * Gather a control into `values` under its column. Of the radio buttons\n * naming one column, the one checked gives the value, and `\"\"` stands when\n * none is.\n */\nexport function gatherInto(\n values: Record<string, string>,\n column: string,\n el: Control,\n): void {\n if (isRadio(el) && !(el as HTMLInputElement).checked) {\n values[column] ??= \"\";\n return;\n }\n values[column] = controlValue(el);\n}\n\n/**\n * Set an element from a column. A control's `value` is set. A custom element\n * that is not a control keeps its content, which the builder placed there\n * from its element file, and renders the stamp instead. Any other element's\n * text content is set. Every one carries the value as `lb-column-value`.\n */\nfunction land(el: Element, value: unknown): void {\n // Untouched, whatever the server sent: the browser decides what a\n // non-string looks like. See Row in core/lb-types.ts.\n if (value === null || value === undefined) {\n if (isCheckbox(el) || isRadio(el)) {\n (el as HTMLInputElement).checked = false;\n } else if (isControl(el)) el.value = \"\";\n else if (!el.localName.includes(\"-\") && el.localName !== \"input\") {\n el.textContent = \"\";\n }\n el.removeAttribute(ATTR_COLUMN_VALUE);\n return;\n }\n if (isCheckbox(el)) {\n // Checked by the rule `lb-show` is on by: only null and false are off,\n // and no string is read.\n (el as HTMLInputElement).checked = value !== false;\n } else if (isRadio(el)) {\n (el as HTMLInputElement).checked =\n (el as HTMLInputElement).value === String(value);\n } else if (isControl(el)) {\n el.value = value as string;\n } else if (el.localName === \"input\") {\n console.warn(\n `lb-hub: a value does not land on <input type=\"${(el as HTMLInputElement).type}\">, ignoring`,\n el,\n );\n return;\n } else if (!el.localName.includes(\"-\")) {\n setText(el, String(value));\n }\n setStamp(el, ATTR_COLUMN_VALUE, String(value));\n}\n\n/**\n * Set an element's text, unless it already holds exactly that text. Writing\n * the same text again replaces the text node, which is two mutations and a\n * style check for nothing.\n */\nfunction setText(el: Element, text: string): void {\n const only = el.firstChild;\n const same = only\n ? only === el.lastChild &&\n only.nodeType === TEXT_NODE &&\n (only as Text).data === text\n : text === \"\";\n if (!same) el.textContent = text;\n}\n\n/** Set an attribute, unless it already has that value. */\nfunction setStamp(el: Element, name: string, value: string): void {\n if (el.getAttribute(name) !== value) el.setAttribute(name, value);\n}\n\n/**\n * Whether an element under `root` belongs to root's query, rather than to a\n * query nested inside it.\n *\n * A descendant is root's unless something between it and root carries\n * `lb-query`. The element's own `lb-query` does not count: it names what the\n * element holds, and the row it reads from is its ancestors'. So a picker\n * carrying `lb-query` and `lb-column` is set from the row around it. Root's\n * own attribute does not count either: root is what is being filled.\n *\n * Root may be the content of a template holding an absent branch. The walk\n * up from an element inside it stops at the top of that content, which has\n * no parent, and the template it stands for was in scope already.\n */\nfunction inScope(\n root: Element | DocumentFragment,\n el: Element,\n stop?: string,\n): boolean {\n if (stop && el !== root && el.matches(stop)) return false;\n for (let node = el.parentElement; node && node !== root;) {\n if (node.hasAttribute(ATTR_QUERY)) return false;\n if (stop && node.matches(stop)) return false;\n node = node.parentElement;\n }\n return true;\n}\n\n/**\n * Root if it matches, then every descendant in root's query that does.\n * Gathering finds columns through here. It does not reach into an absent\n * branch, so a live row is read back from the places a row lands that are\n * showing.\n */\nexport function within(root: Element, selector: string): Element[] {\n const found: Element[] = root.matches(selector) ? [root] : [];\n for (const el of root.querySelectorAll(selector)) {\n if (inScope(root, el)) found.push(el);\n }\n return found;\n}\n\n/**\n * Every descendant in root's query that matches, absent branches included.\n *\n * `querySelectorAll` does not enter template content, so an element that is\n * off would otherwise miss everything landed while it was away, and return\n * stale or with its rows empty. A template holding one is in root's query by\n * the ordinary rule, and its content is searched as if it stood there.\n */\nfunction below(\n root: Element | DocumentFragment,\n selector: string,\n stop?: string,\n): Element[] {\n const found: Element[] = [];\n for (const el of root.querySelectorAll(selector)) {\n if (inScope(root, el, stop)) found.push(el);\n }\n for (const parked of root.querySelectorAll(PARKED)) {\n if (inScope(root, parked, stop)) {\n found.push(\n ...below((parked as HTMLTemplateElement).content, selector, stop),\n );\n }\n }\n return found;\n}\n\n/**\n * Every element in root that matches, absent branches included. A query is\n * looked up this way before any row is known, so nothing is filtered out.\n */\nfunction everywhere(root: ParentNode, selector: string): Element[] {\n const found = [...root.querySelectorAll(selector)];\n for (const parked of root.querySelectorAll(PARKED)) {\n const content = (parked as HTMLTemplateElement).content;\n found.push(...everywhere(content, selector));\n }\n return found;\n}\n\n/**\n * Tick or clear an `lb-select` checkbox, and stamp the live row it selects\n * to match.\n */\nexport function select(box: Element, on: boolean): void {\n (box as HTMLInputElement).checked = on;\n box.closest(LIVE_ROW)?.toggleAttribute(ATTR_ROW_SELECTED, on);\n}\n\n/**\n * Put an element in the document or take it out, as its `lb-show` column\n * says.\n *\n * Off is inside a template that stands where the element stood, carrying the\n * same `lb-show`. The element is moved rather than rebuilt, so a custom\n * element keeps its instance and a control keeps what was typed into it. On\n * moves it back and the template goes.\n *\n * Landing reaches into that template, so both it and the element it holds\n * arrive here. The template decides; the element it holds, whose parent is\n * the template's content, is left to it.\n */\nfunction present(el: Element, on: boolean): void {\n if (el.localName === \"template\") {\n const branch = (el as HTMLTemplateElement).content.firstElementChild;\n if (on && branch) el.replaceWith(branch);\n return;\n }\n if (on || el.parentNode?.nodeType === FRAGMENT_NODE) return;\n // A selection hidden is a selection abandoned: a tick kept out of sight\n // would come back stale, and nothing else could clear it.\n for (const box of [el, ...el.querySelectorAll(`[${ATTR_SELECT}]`)]) {\n if (box.hasAttribute(ATTR_SELECT)) select(box, false);\n }\n const parked = el.ownerDocument.createElement(\"template\");\n parked.setAttribute(ATTR_SHOW, el.getAttribute(ATTR_SHOW)!);\n el.replaceWith(parked);\n parked.content.append(el);\n parkedIn.set(el, parked);\n}\n\n/** The template each absent element was last put in. */\nconst parkedIn = new WeakMap<Element, HTMLTemplateElement>();\n\n/**\n * Put a live row's element in the document or take it out, the element\n * itself being known. Its template, while it is in one, decides first, as it\n * does when landing finds both.\n */\nfunction presentPlaced(el: Element, on: boolean): void {\n const parked = parkedIn.get(el);\n if (parked && el.parentNode === parked.content) present(parked, on);\n present(el, on);\n}\n\n/**\n * Where one row's columns land and its conditions show, each list by the\n * attribute's value: `lb-column`'s, and `lb-show`'s with its `!`.\n */\ninterface Places {\n columns: Map<string, Element[]>;\n shows: Map<string, Element[]>;\n}\n\nfunction addPlace(map: Map<string, Element[]>, name: string, el: Element): void {\n const list = map.get(name);\n if (list) list.push(el);\n else map.set(name, [el]);\n}\n\n/**\n * Note an element among the places: where its `lb-column` lands, and what\n * its `lb-show` decides. A template holding an absent branch decides for the\n * branch it holds, and is noted as that branch's.\n */\nfunction note(places: Places, el: Element): void {\n const column = el.getAttribute(ATTR_COLUMN);\n if (column !== null) addPlace(places.columns, column, el);\n const show = el.getAttribute(ATTR_SHOW);\n if (show === null) return;\n if (el.localName === \"template\") {\n const branch = (el as HTMLTemplateElement).content.firstElementChild;\n if (branch) parkedIn.set(branch, el as HTMLTemplateElement);\n return;\n }\n addPlace(places.shows, show, el);\n}\n\nfunction noPlaces(): Places {\n return { columns: new Map(), shows: new Map() };\n}\n\n/**\n * The places in root's query, found by searching: root's own `lb-column`\n * when `self`, and every one below it short of `stop`, absent branches\n * included.\n */\nfunction search(root: Element, self: boolean, stop?: string): Places {\n const places = noPlaces();\n if (self && root.hasAttribute(ATTR_COLUMN)) {\n addPlace(places.columns, root.getAttribute(ATTR_COLUMN)!, root);\n }\n for (const el of below(root, `[${ATTR_COLUMN}], [${ATTR_SHOW}]`, stop)) {\n note(places, el);\n }\n return places;\n}\n\n/**\n * A place's position in a row: child indices from the row's root, where a\n * template holding an absent branch counts its content as its children.\n */\ntype Path = number[];\n\nfunction kids(el: Element): HTMLCollection {\n return el.localName === \"template\"\n ? (el as HTMLTemplateElement).content.children\n : el.children;\n}\n\n/**\n * Where every place below a row template's root lies, worked out once for\n * the template and followed in each copy of it. The rule is search()'s: a\n * nested query's own attributes are this row's and what is inside it is not,\n * and template content is entered only for an absent branch.\n */\nfunction compile(row: Element): Path[] {\n const paths: Path[] = [];\n const walk = (el: Element, path: Path): void => {\n const children = kids(el);\n for (let i = 0; i < children.length; i++) {\n const child = children[i]!;\n const at = [...path, i];\n if (child.hasAttribute(ATTR_COLUMN) || child.hasAttribute(ATTR_SHOW)) {\n paths.push(at);\n }\n if (child.hasAttribute(ATTR_QUERY)) continue;\n if (child.localName === \"template\" && !child.hasAttribute(ATTR_SHOW)) {\n continue;\n }\n walk(child, at);\n }\n };\n walk(row, []);\n return paths;\n}\n\n/**\n * A live row's places, by its template's paths: its root's own `lb-column`,\n * and the element at the end of each path. Followed before anything lands,\n * while the copy is as the template made it.\n */\nfunction placesBy(row: Element, paths: Path[]): Places {\n const places = noPlaces();\n if (row.hasAttribute(ATTR_COLUMN)) {\n addPlace(places.columns, row.getAttribute(ATTR_COLUMN)!, row);\n }\n for (const path of paths) {\n let el = row;\n for (const i of path) el = kids(el)[i]!;\n note(places, el);\n }\n return places;\n}\n\n/** Whether two column values are the same value. */\nfunction same(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n // Loadbare does not read a non-atomic value, but one may still arrive.\n return (\n typeof a === \"object\" &&\n typeof b === \"object\" &&\n a !== null &&\n b !== null &&\n JSON.stringify(a) === JSON.stringify(b)\n );\n}\n\n/**\n * Land a row on its places: each column's value where it lands, and the\n * conditions it decides.\n *\n * Only null and false are off. A string is never read, so \"false\" is on, and\n * the query spells a condition as a boolean or a null.\n */\nfunction fill(places: Places, row: Row): void {\n for (const [column, value] of Object.entries(row)) {\n for (const el of places.columns.get(column) ?? []) land(el, value);\n const on = value !== null && value !== false;\n for (const el of places.shows.get(column) ?? []) presentPlaced(el, on);\n for (const el of places.shows.get(`${SHOW_NOT}${column}`) ?? []) {\n presentPlaced(el, !on);\n }\n }\n}\n\n/**\n * Fill from one row: every `lb-column` and `lb-show` in root's query.\n *\n * With `self`, root's own `lb-column` counts, as a live row's does:\n * `<option>`'s content model is text, so an option row has to be the column\n * it displays. An element a `row` lands on is not its own ancestor, so its\n * own `lb-column` reads from the row around it and is left alone here. Root's\n * own `lb-show` never counts.\n *\n * `stop` passes over everything matching it and inside it.\n */\nexport function applyRow(\n root: Element,\n row: Row,\n self = false,\n stop?: string,\n): void {\n fill(search(root, self, stop), row);\n}\n\n/**\n * A row naming every column root's query shows, each null: what landing it\n * leaves is root as it stands with no row. Absent branches are counted, so a\n * column only an absent element names is cleared too.\n */\nexport function blankRow(root: Element): Row {\n const row: Row = {};\n for (const el of below(root, `[${ATTR_COLUMN}]`)) {\n row[el.getAttribute(ATTR_COLUMN)!] = null;\n }\n for (const el of below(root, `[${ATTR_SHOW}]`)) {\n const show = el.getAttribute(ATTR_SHOW)!;\n row[show.startsWith(SHOW_NOT) ? show.slice(SHOW_NOT.length) : show] = null;\n }\n return row;\n}\n\n/**\n * The row template: the first `<template>` among the element's descendants,\n * outside any nested `lb-query`. A template holding an absent branch is not a\n * row template: rows land before the row template, so one inside the first\n * live row comes first in document order.\n */\nexport function templateIn(el: Element): HTMLTemplateElement | null {\n const template = within(el, `template:not([${ATTR_SHOW}])`).find(\n (t) => t !== el,\n );\n return (template as HTMLTemplateElement | undefined) ?? null;\n}\n\n/** What can take focus, before asking whether it can be operated. */\nconst FOCUSABLE =\n `a[href], button, input:not([type=\"hidden\"]), select, textarea, ` +\n `summary, [tabindex]:not([tabindex=\"-1\"]), ` +\n `[contenteditable]:not([contenteditable=\"false\"])`;\n\n/**\n * Focus the first element in `root` the user can operate: not disabled, not\n * in a closed dialog, not inert, not hidden, and one that took the focus\n * when asked. Nothing in a `<template>` is a candidate, so an absent\n * `lb-show` branch is passed over.\n */\nexport function focusIn(root: Element): void {\n const doc = root.ownerDocument;\n for (const el of root.querySelectorAll<HTMLElement>(FOCUSABLE)) {\n if (el.matches(\":disabled\")) continue;\n if (el.closest(`dialog:not([open]), [inert], [hidden]`)) continue;\n if (el.checkVisibility?.() === false) continue;\n el.focus();\n if (doc.activeElement === el) return;\n }\n}\n\n/** One live row: its key, its element, where it lands, and what it holds. */\ninterface Entry {\n key: string;\n el: Element;\n places: Places;\n /** Its columns, as landed so far. */\n data: Row;\n /** Whether a filter the user chose hides it. */\n hidden: boolean;\n}\n\n/**\n * One group the hub built from a group template: the nodes its clone put in\n * the document, and the clone of the nested template, which is where its\n * contents go. The root of a list is a group with no nodes, whose slot is the\n * markup's own first template, and whose aggregates are the list's.\n */\ninterface Group {\n /** The column the group breaks on and its value there, as one string. */\n id: string;\n /** Every node the clone put in the document, the slot among them or not. */\n nodes: ChildNode[];\n /** The nested template's clone: contents land immediately before it. */\n slot: HTMLTemplateElement;\n /** The next level's groups, in order, when this is not the innermost. */\n children: Group[];\n /** The live rows, in order, when this is the innermost level. */\n rows: Entry[];\n /** Where each heading element's columns land, found once. */\n heads: Places[];\n /** Every aggregate the group sets, found once. */\n aggregates: Element[];\n /** Whether a filter the user chose hides every row in it. */\n hidden: boolean;\n}\n\n/**\n * What the hub keeps about one element's rows between landings: the\n * templates the markup wrote, each live row by key, and the groups built\n * from them.\n */\ninterface List {\n /** The markup's first template: a group template, or the row template. */\n top: HTMLTemplateElement;\n /** The group templates, outermost first. Empty when the list has none. */\n levels: HTMLTemplateElement[];\n /** The innermost template, which every live row is copied from. */\n rowTemplate: HTMLTemplateElement;\n /** Where the row template's places lie, once a row has been made. */\n paths?: Path[];\n /** Every live row, by key. */\n byKey: Map<string, Entry>;\n root: Group;\n}\n\nconst lists = new WeakMap<Element, List>();\n\n/** Elements already told their group templates outrun their order. */\nconst warned = new WeakSet<Element>();\n\n/**\n * What a group's heading and aggregates stop at: the rows and groups inside\n * it, live or leaving, which are filled from rows of their own.\n */\nconst SCAFFOLD_STOP = `${LIVE_ROW}, ${LIVE_GROUP}, ${LEAVING}`;\n\n/** An element carrying any aggregate. */\nconst AGGREGATE = AGGREGATES.map((name) => `[${name}]`).join(\", \");\n\n/**\n * The template a group's contents go in front of: the first `<template>` in\n * the content outside any nested `lb-query`, and not one holding an absent\n * branch.\n */\nfunction slotIn(root: Element | DocumentFragment): HTMLTemplateElement | null {\n for (const t of root.querySelectorAll(`template:not([${ATTR_SHOW}])`)) {\n if (inScope(root, t)) return t as HTMLTemplateElement;\n }\n return null;\n}\n\n/**\n * The aggregates in root's scaffolding: root itself when `self`, and every\n * one below it that is not inside a row or a group of its own.\n */\nfunction aggregatesIn(root: Element, self: boolean): Element[] {\n const found = below(root, AGGREGATE, SCAFFOLD_STOP);\n if (self && root.matches(AGGREGATE)) found.unshift(root);\n return found;\n}\n\n/**\n * The list an element holds, found from its first template the first time\n * rows land on it, and kept after that: once groups exist, their slots are\n * templates too, and they come first in the document.\n */\nfunction listFor(el: Element, template: HTMLTemplateElement): List | null {\n const found = lists.get(el);\n if (found) return found;\n const levels: HTMLTemplateElement[] = [];\n let at = template;\n while (at.hasAttribute(ATTR_GROUP)) {\n levels.push(at);\n const next = slotIn(at.content);\n if (!next) {\n console.error(\n `lb-hub: a group template in <${el.localName}> holds no nested ` +\n `template for its contents`,\n );\n return null;\n }\n at = next;\n }\n const list: List = {\n top: template,\n levels,\n rowTemplate: at,\n byKey: new Map(),\n root: {\n id: \"\",\n nodes: [],\n slot: template,\n children: [],\n rows: [],\n heads: [],\n aggregates: aggregatesIn(el, false),\n hidden: false,\n },\n };\n // Live rows already in the markup, as a page rendered ahead of its data\n // ships them, are the list's from the start, in the order they stand.\n if (levels.length === 0) {\n for (const row of el.querySelectorAll(LIVE_ROW)) {\n if (!inScope(el, row)) continue;\n const key = row.getAttribute(ATTR_KEY_VALUE)!;\n if (list.byKey.has(key)) {\n console.error(\n `lb-hub: <${el.localName}> shows two rows with the key '${key}'`,\n );\n }\n const entry: Entry = {\n key,\n el: row,\n places: search(row, true),\n data: {},\n hidden: false,\n };\n list.byKey.set(key, entry);\n list.root.rows.push(entry);\n }\n }\n lists.set(el, list);\n return list;\n}\n\n/** The live rows of a group and everything under it, in order. */\nfunction rowsUnder(group: Group): Entry[] {\n return group.children.length > 0\n ? group.children.flatMap(rowsUnder)\n : group.rows;\n}\n\n/**\n * A new live row for a key, copied from the row template: upgraded, stamped\n * with its key, its places found by the template's paths, and no values yet.\n * It is in no document until it is placed.\n */\nfunction create(list: List, doc: Document, key: string): Entry {\n const template = list.rowTemplate.content.firstElementChild!;\n list.paths ??= compile(template);\n // Imported rather than cloned: template content belongs to a document with\n // no custom element definitions, so a clone would not upgrade until\n // inserted, and a form-associated control would be filled as if it were\n // not one.\n const el = doc.importNode(template, true);\n upgradeAbsent(el, doc);\n placed(el);\n el.setAttribute(ATTR_ROW_LIVE, \"\");\n el.setAttribute(ATTR_KEY_VALUE, key);\n nameRadios(el, key);\n const entry: Entry = {\n key,\n el,\n places: placesBy(el, list.paths),\n data: {},\n hidden: false,\n };\n list.byKey.set(key, entry);\n return entry;\n}\n\n/**\n * Give each radio button of a new live row a group of its own. The browser\n * groups radio buttons by `name`, and a row template repeats one `name` in\n * every live row, so the hub follows the `name` written, or the column when\n * none is, with the row's key.\n */\nfunction nameRadios(row: Element, key: string): void {\n for (const el of below(row, `input[type=radio][${ATTR_COLUMN}]`)) {\n const name = el.getAttribute(\"name\") || el.getAttribute(ATTR_COLUMN)!;\n el.setAttribute(\"name\", `${name}-${key}`);\n }\n}\n\n/** A group's identity among its siblings: its column and its value there. */\nfunction groupId(column: string, value: unknown): string {\n return `${column}\\u0000${JSON.stringify(value ?? null)}`;\n}\n\n/** A new group, cloned from the group template for its level and stamped. */\nfunction makeGroup(\n doc: Document,\n template: HTMLTemplateElement,\n id: string,\n term: OrderTerm | undefined,\n value: unknown,\n): Group {\n // Imported rather than cloned, for the reason a live row is.\n const fragment = doc.importNode(template.content, true);\n upgradeAbsent(fragment, doc);\n const slot = slotIn(fragment)!;\n const nodes = [...fragment.childNodes];\n const heads: Places[] = [];\n const aggregates: Element[] = [];\n for (const node of nodes) {\n if (node.nodeType !== ELEMENT_NODE || node === slot) continue;\n const el = node as Element;\n placed(el);\n el.setAttribute(ATTR_GROUP_LIVE, \"\");\n if (term) el.setAttribute(ATTR_GROUP_COLUMN, term.column);\n if (value === null || value === undefined) {\n el.removeAttribute(ATTR_GROUP_VALUE);\n } else {\n el.setAttribute(ATTR_GROUP_VALUE, String(value));\n }\n // A heading's own column is filled, as a live row's is, unless it holds\n // the group's contents, which filling it would replace.\n heads.push(search(el, !el.contains(slot), SCAFFOLD_STOP));\n aggregates.push(...aggregatesIn(el, true));\n }\n return {\n id,\n nodes,\n slot,\n children: [],\n rows: [],\n heads,\n aggregates,\n hidden: false,\n };\n}\n\n/**\n * Put a sequence of items in the document in the order given, in front of\n * `end`, where `old` is the order they stood in. The run they share at the\n * start and the run they share at the end stay where they are, and what lies\n * between goes in as one fragment. An item not in `old` is new, and one in\n * `old` that is not given has gone somewhere else, or is leaving.\n */\nfunction placeRun<T>(\n old: T[],\n next: T[],\n end: ChildNode,\n nodesOf: (item: T) => ChildNode[],\n): void {\n const most = Math.min(old.length, next.length);\n let start = 0;\n while (start < most && old[start] === next[start]) start++;\n let tail = 0;\n while (\n tail < most - start &&\n old[old.length - 1 - tail] === next[next.length - 1 - tail]\n ) {\n tail++;\n }\n const middle = next.slice(start, next.length - tail);\n if (middle.length === 0) return;\n const ref = tail > 0 ? nodesOf(next[next.length - tail]!)[0]! : end;\n const fragment = ref.ownerDocument!.createDocumentFragment();\n for (const item of middle) fragment.append(...nodesOf(item));\n ref.parentNode!.insertBefore(fragment, ref);\n}\n\n/**\n * Place a list's live rows in the order given, with groups made where the\n * order breaks, kept while their run goes on, and gone where it no longer\n * does. What leaves is returned, to leave once everything is placed.\n */\nfunction arrange(\n list: List,\n doc: Document,\n order: Entry[],\n terms: OrderTerm[],\n): Group[] {\n const retired: Group[] = [];\n const visit = (parent: Group, level: number, entries: Entry[]): void => {\n if (level === list.levels.length) {\n placeRun(parent.rows, entries, parent.slot, (entry) => [entry.el]);\n parent.rows = entries;\n return;\n }\n const term = terms[level];\n const runs: { id: string; value: unknown; entries: Entry[] }[] = [];\n for (const entry of entries) {\n const value = term ? entry.data[term.column] : null;\n const id = groupId(term?.column ?? \"\", value);\n const last = runs.at(-1);\n if (last?.id === id) last.entries.push(entry);\n else runs.push({ id, value, entries: [entry] });\n }\n // Each group already here goes on with the first run that has its id.\n const pool = new Map<string, Group[]>();\n for (const child of parent.children) {\n pool.set(child.id, [...(pool.get(child.id) ?? []), child]);\n }\n const next = runs.map(\n (run) =>\n pool.get(run.id)?.shift() ??\n makeGroup(doc, list.levels[level]!, run.id, term, run.value),\n );\n for (const left of pool.values()) retired.push(...left);\n placeRun(parent.children, next, parent.slot, (group) => group.nodes);\n parent.children = next;\n runs.forEach((run, i) => visit(next[i]!, level + 1, run.entries));\n };\n visit(list.root, 0, order);\n return retired;\n}\n\n/**\n * The rows that moved: rows whose values changed, and which now stand\n * somewhere else among the rows whose values did not. A neighbour a moved\n * row passed did not move, and neither did a row whose new values left it\n * where it was.\n */\nfunction movedRows(\n before: Entry[],\n after: Entry[],\n changed: ReadonlySet<Entry>,\n): Set<Entry> {\n const moved = new Set<Entry>();\n if (changed.size === 0) return moved;\n const stayed = new Set(before);\n // For each changed row, the nearest unchanged row on either side of it.\n const anchors = (rows: Entry[]): Map<Entry, (Entry | null)[]> => {\n const around = new Map<Entry, (Entry | null)[]>();\n const kept = rows.filter((row) => stayed.has(row));\n let last: Entry | null = null;\n for (const row of kept) {\n if (changed.has(row)) around.set(row, [last, null]);\n else last = row;\n }\n last = null;\n for (const row of kept.reverse()) {\n if (changed.has(row)) around.get(row)![1] = last;\n else last = row;\n }\n return around;\n };\n const was = anchors(before);\n for (const [row, [prior, following]] of anchors(after)) {\n const [p, f] = was.get(row)!;\n if (p !== prior || f !== following) moved.add(row);\n }\n return moved;\n}\n\n/** Mark an element as leaving: no longer live, and taking no input. */\nfunction leaving(el: Element, live: string, stamp: string): void {\n el.removeAttribute(live);\n el.removeAttribute(ATTR_ROW_REQUESTED);\n el.setAttribute(stamp, \"\");\n el.setAttribute(\"inert\", \"\");\n}\n\n/** A group whose rows are all gone, and every group inside it, leave. */\nfunction leaveGroup(group: Group, nodes: ChildNode[]): void {\n for (const child of group.children) leaveGroup(child, nodes);\n for (const node of group.nodes) {\n if (node.nodeType === ELEMENT_NODE) {\n leaving(node as Element, ATTR_GROUP_LIVE, ATTR_GROUP_LEAVING);\n }\n }\n nodes.push(...group.nodes);\n}\n\n/**\n * Take nodes out of the document once whatever their stylesheet started on\n * them has finished: at once when nothing is running. Asking for the running\n * animations computes the style, so it is asked once, after everything a\n * landing writes, and an animation keyed to the leaving stamp is among them.\n */\nfunction depart(nodes: ChildNode[]): void {\n const running: Animation[] = [];\n for (const node of nodes) {\n if (node.nodeType !== ELEMENT_NODE) continue;\n const el = node as Element & { getAnimations?: Element[\"getAnimations\"] };\n running.push(...(el.getAnimations?.({ subtree: true }) ?? []));\n }\n const go = (): void => {\n for (const node of nodes) node.remove();\n detachRemoved(nodes);\n };\n if (running.length === 0) go();\n else void Promise.allSettled(running.map((a) => a.finished)).then(go);\n}\n\n/**\n * The stamps of what happened to rows, set together: a stamp a row already\n * carries is taken off first and put back after the style has been computed\n * once for all of them, so an animation keyed to it plays again.\n */\nclass Stamps {\n private again: [Element, string][] = [];\n\n set(el: Element, name: string, on: boolean): void {\n const had = el.hasAttribute(name);\n if (had) el.removeAttribute(name);\n if (!on) return;\n if (had) this.again.push([el, name]);\n else el.setAttribute(name, \"\");\n }\n\n done(doc: Document): void {\n if (this.again.length === 0) return;\n void doc.defaultView?.getComputedStyle(this.again[0]![0]).animationName;\n for (const [el, name] of this.again) el.setAttribute(name, \"\");\n }\n}\n\n/** A decimal: the digits as one integer, and how many of them are decimals. */\ninterface Decimal {\n digits: bigint;\n scale: number;\n}\n\n/** A plain decimal number, as JSON or Postgres writes one. */\nconst DECIMAL = /^[+-]?\\d+(\\.\\d+)?$/;\n\nfunction decimalOf(value: unknown): Decimal | null {\n const text = typeof value === \"number\" ? String(value) : value;\n if (typeof text !== \"string\" || !DECIMAL.test(text.trim())) return null;\n const [whole, fraction = \"\"] = text.trim().split(\".\");\n return { digits: BigInt(whole! + fraction), scale: fraction.length };\n}\n\nfunction rescale(d: Decimal, scale: number): bigint {\n return d.digits * 10n ** BigInt(scale - d.scale);\n}\n\nfunction decimalText(digits: bigint, scale: number): string {\n const negative = digits < 0n;\n const text = (negative ? -digits : digits)\n .toString()\n .padStart(scale + 1, \"0\");\n const whole = text.slice(0, text.length - scale);\n const fraction = scale > 0 ? `.${text.slice(text.length - scale)}` : \"\";\n return `${negative ? \"-\" : \"\"}${whole}${fraction}`;\n}\n\n/** Aggregates already warned about, so a bad value is reported once. */\nconst reported = new Set<string>();\n\n/**\n * One aggregate over rows. A sum and an average are exact, carried as\n * decimals with as many places as the most precise value, and an average\n * keeps up to two places more. Null and empty values are left out, as SQL\n * leaves them out; a value that is not a number is left out and reported.\n */\nfunction aggregateOf(\n name: string,\n column: string,\n rows: Row[],\n type?: ColumnType,\n): unknown {\n if (name === ATTR_COUNT) return rows.length;\n const values = rows\n .map((row) => row[column])\n .filter((v) => v !== null && v !== undefined && v !== \"\");\n if (values.length === 0) return null;\n if (name === ATTR_MIN || name === ATTR_MAX) {\n const sign = name === ATTR_MIN ? 1 : -1;\n return values.reduce((a, b) =>\n sign * compareValues(readAs(b, type), readAs(a, type)) < 0 ? b : a,\n );\n }\n const decimals: Decimal[] = [];\n for (const value of values) {\n const d = decimalOf(value);\n if (d) decimals.push(d);\n else if (!reported.has(`${name}:${column}`)) {\n reported.add(`${name}:${column}`);\n console.warn(\n `lb-hub: ${name}=\"${column}\" left out ${JSON.stringify(value)}, ` +\n `which is not a number`,\n );\n }\n }\n if (decimals.length === 0) return null;\n const scale = Math.max(...decimals.map((d) => d.scale));\n const sum = decimals.reduce((total, d) => total + rescale(d, scale), 0n);\n if (name === ATTR_SUM) return decimalText(sum, scale);\n // An average, rounded half away from zero at two places past the values',\n // which are then dropped while they are zeros.\n const scaled = sum * 100n;\n const n = BigInt(decimals.length);\n const sign = scaled < 0n ? -1n : 1n;\n let text = decimalText((2n * scaled + sign * n) / (2n * n), scale + 2);\n for (let i = 0; i < 2 && text.endsWith(\"0\"); i++) text = text.slice(0, -1);\n return text.endsWith(\".\") ? text.slice(0, -1) : text;\n}\n\n/** Set each aggregate element from rows, each column read as its type. */\nfunction aggregate(elements: Element[], rows: Row[], types: ColumnTypes): void {\n for (const el of elements) {\n const name = AGGREGATES.find((a) => el.hasAttribute(a))!;\n const column = el.getAttribute(name) ?? \"\";\n land(el, aggregateOf(name, column, rows, types[column]));\n }\n}\n\n/** Show or hide an element for a filter, saying so only when it changes. */\nfunction hide(el: Element, hidden: boolean): void {\n if (el.hasAttribute(\"hidden\") !== hidden) el.toggleAttribute(\"hidden\", hidden);\n}\n\n/**\n * Finish a group and everything under it, from the rows it shows: each\n * heading filled from the first, each aggregate set from all of them, and a\n * group hidden when a filter hides every row in it. The rows it shows are\n * returned.\n */\nfunction finish(group: Group, types: ColumnTypes): Row[] {\n const rows =\n group.children.length > 0\n ? group.children.flatMap((child) => finish(child, types))\n : group.rows.filter((entry) => !entry.hidden).map((entry) => entry.data);\n const hidden = rows.length === 0 && rowsUnder(group).length > 0;\n if (hidden !== group.hidden) {\n group.hidden = hidden;\n for (const node of group.nodes) {\n if (node.nodeType === ELEMENT_NODE && node !== group.slot) {\n hide(node as Element, hidden);\n }\n }\n }\n if (rows[0]) for (const head of group.heads) fill(head, rows[0]);\n aggregate(group.aggregates, rows, types);\n return rows;\n}\n\n/** The order to place rows by, or none when it cannot be read. */\nfunction termsOf(el: Element, order: string | undefined): OrderTerm[] {\n try {\n return parseOrder(order ?? \"\");\n } catch (err) {\n console.error(`lb-hub: <${el.localName}> ${(err as Error).message}`);\n return [];\n }\n}\n\n/** The user's choice in a column of `lb-choices`, when one is made. */\nfunction choiceIn(choices: Row | undefined, column: string): string | undefined {\n const value = choices?.[column];\n return value === null || value === undefined || value === \"\"\n ? undefined\n : String(value);\n}\n\n/** The columns an element's `lb-filter` names. */\nfunction filtered(el: Element): string[] {\n return (el.getAttribute(ATTR_FILTER) ?? \"\")\n .split(\",\")\n .map((column) => column.trim())\n .filter((column) => column !== \"\");\n}\n\n/**\n * The order an element's rows are placed by: the user's, from the column of\n * `lb-choices` its `lb-order` names, else the one the server declared.\n */\nfunction orderFor(el: Element, options: RowsOptions): string | undefined {\n const column = el.getAttribute(ATTR_ORDER);\n const chosen = column ? choiceIn(options.choices, column) : undefined;\n return chosen ?? options.order;\n}\n\n/**\n * Whether a row passes every filter the user chose for the element: for each\n * column its `lb-filter` names, the filter in the column of `lb-choices` of\n * the same name.\n */\nfunction filterFor(\n el: Element,\n choices: Row | undefined,\n types: ColumnTypes,\n): (row: Row) => boolean {\n const filters: [string, FilterTerm[]][] = [];\n for (const column of filtered(el)) {\n const text = choiceIn(choices, column);\n const terms = text === undefined ? [] : parseFilter(text);\n if (terms.length > 0) filters.push([column, terms]);\n }\n return (row) =>\n filters.every(([column, terms]) => passes(row[column], terms, types[column]));\n}\n\n/**\n * Hide or show a row for a filter. A selection hidden is a selection\n * abandoned, as it is for `lb-show`.\n */\nfunction filterRow(entry: Entry, hidden: boolean): void {\n if (entry.hidden === hidden) return;\n entry.hidden = hidden;\n hide(entry.el, hidden);\n if (!hidden) return;\n for (const box of [entry.el, ...entry.el.querySelectorAll(`[${ATTR_SELECT}]`)]) {\n if (box.hasAttribute(ATTR_SELECT)) select(box, false);\n }\n}\n\n/** Whether a row's columns as landed differ from what they were. */\nfunction differs(before: Row, after: Row): boolean {\n return Object.entries(after).some(\n ([column, value]) => !same(before[column], value),\n );\n}\n\n/** How a list of rows lands: in what order, and whether a request asked. */\nexport interface RowsOptions {\n /** The order the server declared, as an order's text. */\n order?: string;\n /** The column types the server declared. */\n types?: ColumnTypes;\n /** The user's choices: the row of `lb-choices`. */\n choices?: Row;\n /** The landing answers a request from this page. */\n requested?: boolean;\n /**\n * Fill every row, changed or not: the element has not been filled for\n * real before, so what its rows show cannot be trusted.\n */\n refill?: boolean;\n}\n\n/**\n * Land rows through a row template.\n *\n * Two loops do the work, on rows in no document. The creation loop makes a\n * live row for each key not yet shown, with its key and no values. The\n * landing loop lands each arriving row's values on its live row, as a `row`\n * lands, passing over a column that already shows its value. Then every live\n * row is placed by the order in one fragment, and the browser styles once.\n *\n * All rows decide membership: a row whose key did not arrive leaves. A patch\n * disturbs only what it names — a row it did not mention keeps its contents,\n * and keeps its place unless a row the patch named now sorts around it.\n *\n * With no order, all rows show in the order they arrived, and a patch's new\n * rows go last. A row that stands where it stood is not touched, so landing\n * the same rows again moves nothing. A row a filter the user chose does not\n * pass is `hidden`.\n */\nexport function applyRows(\n el: Element,\n template: HTMLTemplateElement,\n keyColumn: string,\n result: RowsResult,\n options: RowsOptions = {},\n): void {\n const list = listFor(el, template);\n if (!list) return;\n const doc = el.ownerDocument;\n const host = el as Element & HubLifecycle;\n const whole = !isPatch(result);\n const shown = rowsUnder(list.root);\n const focused = focusedRow(list, doc);\n\n // What a request did is said by this landing alone.\n for (const entry of shown) entry.el.removeAttribute(ATTR_ROW_REQUESTED);\n\n // The rows arriving, by key.\n const arriving = new Map<string, Row>();\n for (const data of whole ? result : (result.rows ?? [])) {\n if (data[keyColumn] === undefined) {\n console.error(\n `lb-hub: a row for <${el.localName}> has no '${keyColumn}' column`,\n );\n continue;\n }\n // The key is stored on the row as an attribute and read back from\n // there, so it is compared as the string the attribute holds.\n const key = String(data[keyColumn]);\n if (arriving.has(key)) {\n console.error(\n `lb-hub: two rows for <${el.localName}> have the key '${key}'; ` +\n `the last one shows`,\n );\n arriving.delete(key);\n }\n arriving.set(key, data);\n }\n const dropped = whole\n ? []\n : (result.drop ?? []).map((key) => String(key));\n for (const key of dropped) arriving.delete(key);\n const gone = whole\n ? shown.filter((entry) => !arriving.has(entry.key))\n : dropped.flatMap((key) => list.byKey.get(key) ?? []);\n\n // The creation loop.\n const created = new Set<Entry>();\n for (const key of arriving.keys()) {\n if (!list.byKey.has(key)) created.add(create(list, doc, key));\n }\n\n // The landing loop. A row whose values arrive as it already shows them is\n // left as it is, so a control the user has typed into and not committed\n // keeps what was typed. A row whose values changed is filled whole.\n const changed = new Set<Entry>();\n for (const [key, data] of arriving) {\n const entry = list.byKey.get(key)!;\n const fresh = created.has(entry);\n if (!fresh && differs(entry.data, data)) changed.add(entry);\n if (fresh || options.refill || changed.has(entry)) fill(entry.places, data);\n entry.data = { ...entry.data, ...data };\n }\n\n for (const entry of gone) {\n list.byKey.delete(entry.key);\n leaving(entry.el, ATTR_ROW_LIVE, ATTR_ROW_LEAVING);\n }\n\n // The order the rows arrived in for all rows, and for a patch the order\n // already showing with what is new after it. A sort keeps rows that\n // compare equal in this order.\n const stayed = shown.filter((entry) => list.byKey.get(entry.key) === entry);\n let order = whole\n ? [...arriving.keys()].map((key) => list.byKey.get(key)!)\n : [...stayed, ...created];\n const terms = termsOf(el, orderFor(el, options));\n if (list.levels.length > terms.length && !warned.has(el)) {\n warned.add(el);\n console.warn(\n `lb-hub: <${el.localName}> has ${list.levels.length} group ` +\n `template(s) and an order of ${terms.length} term(s); a level with ` +\n `no term shows its rows as one group`,\n );\n }\n if (terms.length > 0) {\n order = order\n .map((entry, i) => ({ entry, i }))\n .sort(\n (a, b) =>\n compareRows(a.entry.data, b.entry.data, terms, options.types) ||\n a.i - b.i,\n )\n .map(({ entry }) => entry);\n }\n\n const passing = filterFor(el, options.choices, options.types ?? {});\n for (const entry of order) filterRow(entry, !passing(entry.data));\n\n const moved = movedRows(stayed, order, changed);\n const retired = arrange(list, doc, order, terms);\n refocus(list, focused);\n\n const stamps = new Stamps();\n for (const key of arriving.keys()) {\n const entry = list.byKey.get(key)!;\n const fresh = created.has(entry);\n const went = moved.has(entry);\n stamps.set(entry.el, ATTR_ROW_CREATED, fresh);\n stamps.set(entry.el, ATTR_ROW_CHANGED, changed.has(entry));\n stamps.set(entry.el, ATTR_ROW_MOVED, went);\n const requested = went\n ? REQUESTED_MOVED\n : fresh\n ? REQUESTED_CREATED\n : changed.has(entry)\n ? REQUESTED_CHANGED\n : null;\n if (options.requested && requested) {\n entry.el.setAttribute(ATTR_ROW_REQUESTED, requested);\n }\n }\n stamps.done(doc);\n\n const rows = finish(list.root, options.types ?? {});\n // Counted from what the hub holds, which is what the rows show.\n setStamp(el, ATTR_QUERY_ROW_COUNT, String(rows.length));\n\n const departing: ChildNode[] = gone.map((entry) => entry.el);\n for (const group of retired) leaveGroup(group, departing);\n if (departing.length > 0) depart(departing);\n\n host.lbRowsLanded?.();\n}\n\n/** The live row of a list holding the focus, and the element that has it. */\ninterface Focused {\n entry: Entry;\n active: HTMLElement;\n}\n\nfunction focusedRow(list: List, doc: Document): Focused | null {\n const active = doc.activeElement as HTMLElement | null;\n const row = active?.closest(LIVE_ROW);\n if (!active || !row) return null;\n const entry = list.byKey.get(row.getAttribute(ATTR_KEY_VALUE)!);\n return entry?.el === row ? { entry, active } : null;\n}\n\n/**\n * Keep the focus where the user had it once rows are placed: on the same\n * element, scrolled into view, when its row still shows; otherwise on the\n * first element the user can operate in the first row showing.\n */\nfunction refocus(list: List, focused: Focused | null): void {\n if (!focused) return;\n const { entry, active } = focused;\n const doc = active.ownerDocument;\n if (list.byKey.get(entry.key) === entry && !entry.hidden) {\n if (doc.activeElement === active || !active.isConnected) return;\n active.focus({ preventScroll: true });\n active.scrollIntoView?.({ block: \"nearest\" });\n return;\n }\n const first = rowsUnder(list.root).find((row) => !row.hidden);\n if (first) focusIn(first.el);\n}\n\n/** Land one response item on one element that names its query. */\nfunction landItem(\n el: Element,\n item: ResponseItem,\n options: RowsOptions = {},\n): void {\n const template = lists.get(el)?.top ?? templateIn(el);\n if (item.kind === KIND_ROW) {\n const row = item.row;\n if (template) {\n applyRows(el, template, item.key, row ? [row] : [], options);\n return;\n }\n // No row: every column the element shows lands null, and the element\n // names no row.\n if (!row) {\n applyRow(el, blankRow(el));\n el.removeAttribute(ATTR_KEY_VALUE);\n return;\n }\n applyRow(el, row);\n const key = row[item.key];\n if (key !== undefined && key !== null) {\n setStamp(el, ATTR_KEY_VALUE, String(key));\n }\n return;\n }\n // A `rows` query with no row template lands nothing: an insert form names\n // the query it adds to, and shows none of its rows.\n if (!template) return;\n const result = item.patch ?? item.rows ?? [];\n applyRows(el, template, item.key, result, options);\n}\n\n/**\n * What landing keeps for one root: the last whole answer to each query, and\n * every element an answer has landed on. The user's choices are among the\n * answers, as the answer to `lb-choices`.\n */\ninterface Kept {\n answers: Map<string, ResponseItem>;\n landed: WeakSet<Element>;\n}\n\nconst kept = new WeakMap<ParentNode, Kept>();\n\nfunction keptFor(root: ParentNode): Kept {\n let found = kept.get(root);\n if (!found) {\n found = { answers: new Map(), landed: new WeakSet() };\n kept.set(root, found);\n }\n return found;\n}\n\n/** The answer kept for a query, as all of its rows. */\nexport function keptAnswer(\n root: ParentNode,\n query: string,\n): ResponseItem | undefined {\n return kept.get(root)?.answers.get(query);\n}\n\n/**\n * How a query's rows land: by its order, its column types, and the user's\n * choices. The order and types are the kept answer's, since only the answer\n * that loads the page carries them.\n */\nfunction rowsOptions(state: Kept, item: ResponseItem): RowsOptions {\n const declared = state.answers.get(item.query) ?? item;\n return {\n order: declared.order,\n types: declared.types,\n choices: state.answers.get(CHOICES_QUERY)?.row ?? undefined,\n };\n}\n\n/**\n * Drop what landing kept for a root. The hub calls it when it replaces the\n * page, since another page's query of the same name is another query, and\n * the user's choices were for the page they were made on.\n */\nexport function forget(root: ParentNode): void {\n kept.delete(root);\n}\n\n/**\n * All rows after a patch, as the elements it landed on now show them: a row\n * it names takes the columns it sends and keeps its place, a new one goes\n * last, and a dropped one goes.\n */\nfunction patched(rows: Row[], key: string, patch: Patch): Row[] {\n const byKey = new Map(rows.map((row) => [String(row[key]), row]));\n for (const row of patch.rows ?? []) {\n const k = String(row[key]);\n byKey.set(k, { ...byKey.get(k), ...row });\n }\n for (const k of patch.drop ?? []) byKey.delete(String(k));\n return [...byKey.values()];\n}\n\n/**\n * Keep an answer as all of the query's rows. A patch is applied to the\n * answer already kept; with none, it is not the whole of anything, and\n * nothing is kept.\n *\n * A query's order and column types arrive with the answer that loads the\n * page, and every answer after it, all rows or a patch, keeps them.\n */\nfunction keep(answers: Map<string, ResponseItem>, item: ResponseItem): void {\n const before = answers.get(item.query);\n const declared = {\n ...(before?.order !== undefined && { order: before.order }),\n ...(before?.types !== undefined && { types: before.types }),\n };\n if (!item.patch) {\n answers.set(item.query, { ...declared, ...item });\n return;\n }\n if (!before) return;\n const { patch: _, ...whole } = item;\n answers.set(item.query, {\n ...declared,\n ...whole,\n rows: patched(before.rows ?? [], item.key, item.patch),\n });\n}\n\n/** The columns of `lb-choices` an answer to it changes. */\nfunction chosen(state: Kept, item: ResponseItem): Set<string> {\n const before = state.answers.get(CHOICES_QUERY)?.row ?? {};\n const after = item.row ?? {};\n const columns = new Set<string>();\n for (const column of new Set([...Object.keys(before), ...Object.keys(after)])) {\n if (choiceIn(before, column) !== choiceIn(after, column)) columns.add(column);\n }\n return columns;\n}\n\n/** Whether an element's order or filter reads any of the columns. */\nfunction reads(el: Element, columns: Set<string>): boolean {\n const order = el.getAttribute(ATTR_ORDER);\n return (\n (order !== null && columns.has(order)) ||\n filtered(el).some((column) => columns.has(column))\n );\n}\n\n/**\n * Place again the rows of every element whose order or filter reads a choice\n * that changed. Each lands its query's kept answer again, whole, so it shows\n * what a round trip carrying the choice would have, and the server is asked\n * for nothing.\n */\nfunction rechoose(root: ParentNode, state: Kept, columns: Set<string>): void {\n for (const [query, item] of state.answers) {\n if (item.kind === KIND_ROW) continue;\n for (const el of everywhere(root, `[${ATTR_QUERY}=\"${query}\"]`)) {\n if (!state.landed.has(el) || el.closest(LEAVING)) continue;\n if (reads(el, columns)) landItem(el, item, rowsOptions(state, item));\n }\n }\n}\n\n/**\n * Fill every element that names a kept query and has had nothing land on it.\n * Filling one can build more — a live row holding a picker of its own — so\n * it goes round until a pass finds nothing new.\n */\nfunction fillArrivals(root: ParentNode, state: Kept): void {\n const { answers, landed } = state;\n for (let filled = true; filled;) {\n filled = false;\n for (const [query, item] of answers) {\n for (const el of everywhere(root, `[${ATTR_QUERY}=\"${query}\"]`)) {\n if (landed.has(el) || el.closest(LEAVING)) continue;\n landed.add(el);\n landItem(el, item, { ...rowsOptions(state, item), refill: true });\n filled = true;\n }\n }\n }\n}\n\n/** How response items land. */\nexport interface LandOptions {\n /**\n * Queries that may have nowhere to land without a warning. A query the hub\n * serves, such as `lb-url`, is always one: it lands wherever a chrome or\n * page names it, and nowhere otherwise.\n */\n quiet?: readonly string[];\n /** The items answer a request from this page. */\n requested?: boolean;\n}\n\n/**\n * Land response items. Every answer arrives through here, and is kept for\n * `root`, so that what arrives after it is filled from it — see forget().\n * An answer to `lb-choices` places again the rows its choices change. Once\n * everything has landed, each custom element placed since the last landing\n * is attached.\n */\nexport function applyResponse(\n root: ParentNode,\n items: ResponseItem[],\n options: LandOptions = {},\n): void {\n const state = keptFor(root);\n for (const item of items) {\n const choices =\n item.query === CHOICES_QUERY ? chosen(state, item) : new Set<string>();\n keep(state.answers, item);\n const targets = everywhere(root, `[${ATTR_QUERY}=\"${item.query}\"]`).filter(\n (el) => !el.closest(LEAVING),\n );\n if (\n targets.length === 0 &&\n !item.query.startsWith(LB_RESERVED_PREFIX) &&\n !options.quiet?.includes(item.query)\n ) {\n console.warn(`lb-hub: nothing names '${item.query}', skipping`);\n }\n for (const el of targets) {\n state.landed.add(el);\n landItem(el, item, {\n ...rowsOptions(state, item),\n requested: options.requested,\n });\n }\n if (choices.size > 0) rechoose(root, state, choices);\n }\n fillArrivals(root, state);\n attachPlaced();\n}\n"]}
1
+ {"version":3,"file":"lb-apply.js","sourceRoot":"","sources":["../../hub/lb-apply.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAE3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,EACL,UAAU,EACV,WAAW,EACX,WAAW,EACX,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,oBAAoB,EACpB,yBAAyB,EACzB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,SAAS,EACT,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,QAAQ,EACR,WAAW,EACX,iBAAiB,GAClB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,WAAW,EACX,aAAa,EACb,OAAO,EACP,WAAW,EACX,UAAU,EACV,MAAM,EACN,MAAM,GAUP,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,YAAY,EACZ,aAAa,EACb,OAAO,EACP,MAAM,EACN,MAAM,EACN,aAAa,GACd,MAAM,mBAAmB,CAAC;AAE3B,kFAAkF;AAClF,MAAM,aAAa,GAAG,EAAE,CAAC;AAEzB,kDAAkD;AAClD,MAAM,YAAY,GAAG,CAAC,CAAC;AAEvB,mDAAmD;AACnD,MAAM,SAAS,GAAG,CAAC,CAAC;AAEpB;;;;GAIG;AACH,MAAM,eAAe,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAOtD;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,EAAW;IAClC,IAAI,EAAE,CAAC,SAAS,KAAK,QAAQ,IAAI,EAAE,CAAC,SAAS,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IAC1E,OAAO,CACL,EAAE,CAAC,SAAS,KAAK,OAAO;QACxB,CAAC,eAAe,CAAC,QAAQ,CAAE,EAAuB,CAAC,IAAI,CAAC,CACzD,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,UAAU,CAAC,EAAW;IAC7B,OAAO,CACL,EAAE,CAAC,SAAS,KAAK,OAAO,IAAK,EAAuB,CAAC,IAAI,KAAK,UAAU,CACzE,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,EAAW;IACjC,OAAO,EAAE,CAAC,SAAS,KAAK,OAAO,IAAK,EAAuB,CAAC,IAAI,KAAK,OAAO,CAAC;AAC/E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAAW;IAC1C,MAAM,IAAI,GAAG,EAAE,CAAC,WAA2C,CAAC;IAC5D,OAAO,IAAI,CAAC,cAAc,KAAK,IAAI,IAAI,OAAO,IAAI,EAAE,CAAC;AACvD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,EAAW;IACnC,OAAO,CACL,eAAe,CAAC,EAAE,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,gBAAgB,CAAC,EAAE,CAAC,CAC7E,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,EAAW;IAC/B,OAAO,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAE,EAAuB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;AAC9E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CACxB,MAA8B,EAC9B,MAAc,EACd,EAAW;IAEX,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,CAAE,EAAuB,CAAC,OAAO,EAAE,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO;IACT,CAAC;IACD,MAAM,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;AACpC,CAAC;AAED;;;;;GAKG;AACH,SAAS,IAAI,CAAC,EAAW,EAAE,KAAc;IACvC,kEAAkE;IAClE,sDAAsD;IACtD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,IAAI,UAAU,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;YACjC,EAAuB,CAAC,OAAO,GAAG,KAAK,CAAC;QAC3C,CAAC;aAAM,IAAI,SAAS,CAAC,EAAE,CAAC;YAAE,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC;aACnC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;YACjE,EAAE,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,CAAC;QACD,EAAE,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC;QACtC,OAAO;IACT,CAAC;IACD,IAAI,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;QACnB,uEAAuE;QACvE,yBAAyB;QACxB,EAAuB,CAAC,OAAO,GAAG,KAAK,KAAK,KAAK,CAAC;IACrD,CAAC;SAAM,IAAI,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;QACtB,EAAuB,CAAC,OAAO;YAC7B,EAAuB,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC;SAAM,IAAI,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;QACzB,EAAE,CAAC,KAAK,GAAG,KAAe,CAAC;IAC7B,CAAC;SAAM,IAAI,EAAE,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;QACpC,OAAO,CAAC,IAAI,CACV,iDAAkD,EAAuB,CAAC,IAAI,cAAc,EAC5F,EAAE,CACH,CAAC;QACF,OAAO;IACT,CAAC;SAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7B,CAAC;IACD,QAAQ,CAAC,EAAE,EAAE,iBAAiB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACjD,CAAC;AAED;;;;GAIG;AACH,SAAS,OAAO,CAAC,EAAW,EAAE,IAAY;IACxC,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAI;QACf,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,SAAS;YACrB,IAAI,CAAC,QAAQ,KAAK,SAAS;YAC1B,IAAa,CAAC,IAAI,KAAK,IAAI;QAC9B,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;IAChB,IAAI,CAAC,IAAI;QAAE,EAAE,CAAC,WAAW,GAAG,IAAI,CAAC;AACnC,CAAC;AAED,0DAA0D;AAC1D,SAAS,QAAQ,CAAC,EAAW,EAAE,IAAY,EAAE,KAAa;IACxD,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,KAAK;QAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACpE,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAS,OAAO,CACd,IAAgC,EAChC,EAAW,EACX,IAAa;IAEb,IAAI,IAAI,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1D,KAAK,IAAI,IAAI,GAAG,EAAE,CAAC,aAAa,EAAE,IAAI,IAAI,IAAI,KAAK,IAAI,GAAG,CAAC;QACzD,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC;YAAE,OAAO,KAAK,CAAC;QAChD,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7C,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,MAAM,CAAC,IAAa,EAAE,QAAgB;IACpD,MAAM,KAAK,GAAc,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjD,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,KAAK,CACZ,IAAgC,EAChC,QAAgB,EAChB,IAAa;IAEb,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjD,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,IAAI,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CACR,GAAG,KAAK,CAAE,MAA8B,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAClE,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,SAAS,UAAU,CAAC,IAAgB,EAAE,QAAgB;IACpD,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,MAAM,OAAO,GAAI,MAA8B,CAAC,OAAO,CAAC;QACxD,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,GAAY,EAAE,EAAW;IAC7C,GAAwB,CAAC,OAAO,GAAG,EAAE,CAAC;IACvC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;AAChE,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAS,OAAO,CAAC,EAAW,EAAE,EAAW;IACvC,IAAI,EAAE,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;QAChC,MAAM,MAAM,GAAI,EAA0B,CAAC,OAAO,CAAC,iBAAiB,CAAC;QACrE,IAAI,EAAE,IAAI,MAAM;YAAE,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACzC,OAAO;IACT,CAAC;IACD,IAAI,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE,QAAQ,KAAK,aAAa;QAAE,OAAO;IAC5D,wEAAwE;IACxE,0DAA0D;IAC1D,KAAK,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,WAAW,GAAG,CAAC,CAAC,EAAE,CAAC;QACnE,IAAI,GAAG,CAAC,YAAY,CAAC,WAAW,CAAC;YAAE,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACxD,CAAC;IACD,MAAM,MAAM,GAAG,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAC1D,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,EAAE,CAAC,YAAY,CAAC,SAAS,CAAE,CAAC,CAAC;IAC5D,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACvB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED,wDAAwD;AACxD,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAgC,CAAC;AAE7D;;;;GAIG;AACH,SAAS,aAAa,CAAC,EAAW,EAAE,EAAW;IAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChC,IAAI,MAAM,IAAI,EAAE,CAAC,UAAU,KAAK,MAAM,CAAC,OAAO;QAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACpE,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC;AAaD,SAAS,QAAQ,CAAC,GAA2B,EAAE,IAAY,EAAE,EAAW;IACtE,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,IAAI;QAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;;QACnB,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED;;;;GAIG;AACH,SAAS,IAAI,CAAC,MAAc,EAAE,EAAW;IACvC,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;IAC5C,IAAI,MAAM,KAAK,IAAI;QAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IAC1D,IAAI,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC;QAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACxC,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO;IAC1B,IAAI,EAAE,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;QAChC,MAAM,MAAM,GAAI,EAA0B,CAAC,OAAO,CAAC,iBAAiB,CAAC;QACrE,IAAI,MAAM;YAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,EAAyB,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;IACD,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,QAAQ;IACf,OAAO,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AAC7D,CAAC;AAED,6CAA6C;AAC7C,MAAM,KAAK,GAAG,IAAI,WAAW,OAAO,SAAS,OAAO,aAAa,GAAG,CAAC;AAErE;;;GAGG;AACH,SAAS,QAAQ,CAAC,MAAc,EAAE,IAAa;IAC7C,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC;QACnC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,WAAW,CAAE,EAAE,IAAI,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;QAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC;AAED;;;;GAIG;AACH,SAAS,MAAM,CAAC,IAAa,EAAE,IAAa,EAAE,IAAa;IACzD,MAAM,MAAM,GAAG,QAAQ,EAAE,CAAC;IAC1B,IAAI,IAAI;QAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACjC,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC;QAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC5D,OAAO,MAAM,CAAC;AAChB,CAAC;AAQD,SAAS,IAAI,CAAC,EAAW;IACvB,OAAO,EAAE,CAAC,SAAS,KAAK,UAAU;QAChC,CAAC,CAAE,EAA0B,CAAC,OAAO,CAAC,QAAQ;QAC9C,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,SAAS,OAAO,CAAC,GAAY;IAC3B,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,CAAC,EAAW,EAAE,IAAU,EAAQ,EAAE;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;YAC3B,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;YACxB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACzC,IAAI,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC;gBAAE,SAAS;YAC7C,IAAI,KAAK,CAAC,SAAS,KAAK,UAAU,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC;gBACrE,SAAS;YACX,CAAC;YACD,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACd,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,SAAS,QAAQ,CAAC,GAAY,EAAE,KAAa;IAC3C,MAAM,MAAM,GAAG,QAAQ,EAAE,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,EAAE,GAAG,GAAG,CAAC;QACb,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC;QACxC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,oDAAoD;AACpD,SAAS,IAAI,CAAC,CAAU,EAAE,CAAU;IAClC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,uEAAuE;IACvE,OAAO,CACL,OAAO,CAAC,KAAK,QAAQ;QACrB,OAAO,CAAC,KAAK,QAAQ;QACrB,CAAC,KAAK,IAAI;QACV,CAAC,KAAK,IAAI;QACV,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CACxC,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,IAAI,CAAC,MAAc,EAAE,GAAQ;IACpC,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAClD,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE;YAAE,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACnE,MAAM,EAAE,GAAG,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,CAAC;QAC7C,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE;YAAE,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACvE,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;YAChE,aAAa,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,QAAQ,CACtB,IAAa,EACb,GAAQ,EACR,IAAI,GAAG,KAAK,EACZ,IAAa;IAEb,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClB,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACpB,CAAC;AAED,8EAA8E;AAC9E,MAAM,KAAK,GAAG,IAAI,OAAO,EAAmB,CAAC;AAE7C,6EAA6E;AAC7E,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;AAEnC,oDAAoD;AACpD,SAAS,OAAO,CAAC,EAAW;IAC1B,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;SAC1C,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;SAC9B,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC;AACvC,CAAC;AAED;;;;;GAKG;AACH,SAAS,IAAI,CAAC,MAAc,EAAE,GAAQ;IACpC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACtC,kEAAkE;IAClE,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC;IAC3E,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACrC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACtB,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1E,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;YAC1B,IAAI,KAAK,KAAK,SAAS,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzD,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACrB,OAAO,CAAC,IAAI,CACV,cAAc,aAAa,YAAY,MAAM,mBAAmB;oBAC9D,yBAAyB,CAC5B,CAAC;YACJ,CAAC;YACD,MAAM,MAAM,GACV,OAAO,KAAK,KAAK,QAAQ;gBACzB,OAAO,KAAK,KAAK,QAAQ;gBACzB,OAAO,KAAK,KAAK,SAAS,CAAC;YAC7B,IAAI,CAAC,MAAM,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACrD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC1B,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBACrB,OAAO,CAAC,IAAI,CACV,YAAY,MAAM,8CAA8C;wBAC9D,mBAAmB,CACtB,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,IAAI,CAAC,MAAM,IAAI,KAAK,KAAK,EAAE;gBAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;;gBAC7C,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,GAAG,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC;QACzD,IAAI,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,IAAI;YAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACtE,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAa;IACpC,MAAM,GAAG,GAAQ,EAAE,CAAC;IACpB,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,CAAE,CAAC,GAAG,IAAI,CAAC;IAC5C,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAE,CAAC;QACzC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC7E,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,EAAW;IACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,EAAE,iBAAiB,SAAS,IAAI,CAAC,CAAC,IAAI,CAC9D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAChB,CAAC;IACF,OAAQ,QAA4C,IAAI,IAAI,CAAC;AAC/D,CAAC;AAED,qEAAqE;AACrE,MAAM,SAAS,GACb,iEAAiE;IACjE,4CAA4C;IAC5C,kDAAkD,CAAC;AAErD;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,IAAa;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC;IAC/B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,gBAAgB,CAAc,SAAS,CAAC,EAAE,CAAC;QAC/D,IAAI,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;YAAE,SAAS;QACtC,IAAI,EAAE,CAAC,OAAO,CAAC,uCAAuC,CAAC;YAAE,SAAS;QAClE,IAAI,EAAE,CAAC,eAAe,EAAE,EAAE,KAAK,KAAK;YAAE,SAAS;QAC/C,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,GAAG,CAAC,aAAa,KAAK,EAAE;YAAE,OAAO;IACvC,CAAC;AACH,CAAC;AAgED,MAAM,KAAK,GAAG,IAAI,OAAO,EAAiB,CAAC;AAE3C,sEAAsE;AACtE,MAAM,MAAM,GAAG,IAAI,OAAO,EAAW,CAAC;AAEtC;;;GAGG;AACH,MAAM,aAAa,GAAG,GAAG,QAAQ,KAAK,UAAU,KAAK,OAAO,EAAE,CAAC;AAE/D,yCAAyC;AACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEnE;;;;GAIG;AACH,SAAS,MAAM,CAAC,IAAgC;IAC9C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,SAAS,IAAI,CAAC,EAAE,CAAC;QACtE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAAE,OAAO,CAAwB,CAAC;IACxD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,IAAa,EAAE,IAAa;IAChD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;IACpD,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;QAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,SAAS,OAAO,CAAC,EAAW,EAAE,QAA6B;IACzD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5B,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,MAAM,GAA0B,EAAE,CAAC;IACzC,IAAI,EAAE,GAAG,QAAQ,CAAC;IAClB,OAAO,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CACX,gCAAgC,EAAE,CAAC,SAAS,oBAAoB;gBAC9D,2BAA2B,CAC9B,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,EAAE,GAAG,IAAI,CAAC;IACZ,CAAC;IACD,MAAM,IAAI,GAAS;QACjB,GAAG,EAAE,QAAQ;QACb,MAAM;QACN,WAAW,EAAE,EAAE;QACf,KAAK,EAAE,IAAI,GAAG,EAAE;QAChB,IAAI,EAAE;YACJ,EAAE,EAAE,EAAE;YACN,KAAK,EAAE,EAAE;YACT,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,EAAE;YACZ,IAAI,EAAE,EAAE;YACR,KAAK,EAAE,EAAE;YACT,UAAU,EAAE,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC;YACnC,MAAM,EAAE,KAAK;SACd;KACF,CAAC;IACF,wEAAwE;IACxE,sEAAsE;IACtE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,KAAK,MAAM,GAAG,IAAI,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC;gBAAE,SAAS;YAChC,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,CAAC,cAAc,CAAE,CAAC;YAC9C,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,OAAO,CAAC,KAAK,CACX,YAAY,EAAE,CAAC,SAAS,kCAAkC,GAAG,GAAG,CACjE,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,GAAU;gBACnB,GAAG;gBACH,EAAE,EAAE,GAAG;gBACP,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC;gBACzB,IAAI,EAAE,EAAE;gBACR,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,KAAK;aAChB,CAAC;YACF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACpB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kEAAkE;AAClE,SAAS,SAAS,CAAC,KAAY;IAC7B,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;QAC9B,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC;QACnC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,SAAS,MAAM,CAAC,IAAU,EAAE,GAAa,EAAE,GAAW;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,iBAAkB,CAAC;IAC7D,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC,2EAA2E;IAC3E,oEAAoE;IACpE,wEAAwE;IACxE,WAAW;IACX,MAAM,EAAE,GAAG,GAAG,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC1C,aAAa,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACvB,MAAM,CAAC,EAAE,CAAC,CAAC;IACX,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IACnC,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACrC,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACpB,MAAM,KAAK,GAAU;QACnB,GAAG;QACH,EAAE;QACF,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC;QAChC,IAAI,EAAE,EAAE;QACR,MAAM,EAAE,EAAE;QACV,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,KAAK;KAChB,CAAC;IACF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC3B,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,SAAS,UAAU,CAAC,GAAY,EAAE,GAAW;IAC3C,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,GAAG,EAAE,qBAAqB,WAAW,GAAG,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,WAAW,CAAE,CAAC;QACtE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,6EAA6E;AAC7E,SAAS,OAAO,CAAC,MAAc,EAAE,KAAc;IAC7C,OAAO,GAAG,MAAM,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC;AAC3D,CAAC;AAED,6EAA6E;AAC7E,SAAS,SAAS,CAChB,GAAa,EACb,QAA6B,EAC7B,EAAU,EACV,IAA2B,EAC3B,KAAc;IAEd,6DAA6D;IAC7D,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACxD,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IACvC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,UAAU,GAAc,EAAE,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,QAAQ,KAAK,YAAY,IAAI,IAAI,KAAK,IAAI;YAAE,SAAS;QAC9D,MAAM,EAAE,GAAG,IAAe,CAAC;QAC3B,MAAM,CAAC,EAAE,CAAC,CAAC;QACX,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;QACrC,IAAI,IAAI;YAAE,EAAE,CAAC,YAAY,CAAC,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC1C,EAAE,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACnD,CAAC;QACD,wEAAwE;QACxE,wDAAwD;QACxD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;QAC1D,UAAU,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO;QACL,EAAE;QACF,KAAK;QACL,IAAI;QACJ,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,EAAE;QACR,KAAK;QACL,UAAU;QACV,MAAM,EAAE,KAAK;KACd,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,QAAQ,CACf,GAAQ,EACR,IAAS,EACT,GAAc,EACd,OAAiC;IAEjC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,KAAK,GAAG,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC;QAAE,KAAK,EAAE,CAAC;IAC3D,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,OACE,IAAI,GAAG,IAAI,GAAG,KAAK;QACnB,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,EAC3D,CAAC;QACD,IAAI,EAAE,CAAC;IACT,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACrD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAChC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IACpE,MAAM,QAAQ,GAAG,GAAG,CAAC,aAAc,CAAC,sBAAsB,EAAE,CAAC;IAC7D,KAAK,MAAM,IAAI,IAAI,MAAM;QAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7D,GAAG,CAAC,UAAW,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAC9C,CAAC;AAED;;;;GAIG;AACH,SAAS,OAAO,CACd,IAAU,EACV,GAAa,EACb,KAAc,EACd,KAAkB;IAElB,MAAM,OAAO,GAAY,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,CAAC,MAAa,EAAE,KAAa,EAAE,OAAgB,EAAQ,EAAE;QACrE,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACjC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YACnE,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC;YACtB,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAuD,EAAE,CAAC;QACpE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACtD,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,IAAI,EAAE,EAAE,KAAK,EAAE;gBAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;gBACzC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,sEAAsE;QACtE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAmB,CAAC;QACxC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CACnB,CAAC,GAAG,EAAE,EAAE,CACN,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE;YACzB,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAC/D,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE;YAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QACxD,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrE,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAE,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IACpE,CAAC,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IAC3B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,SAAS,SAAS,CAChB,MAAe,EACf,KAAc,EACd,OAA2B;IAE3B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAS,CAAC;IAC/B,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACrC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,wEAAwE;IACxE,MAAM,OAAO,GAAG,CAAC,IAAa,EAAgC,EAAE;QAC9D,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAC;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACnD,IAAI,IAAI,GAAiB,IAAI,CAAC;QAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;;gBAC/C,IAAI,GAAG,GAAG,CAAC;QAClB,CAAC;QACD,IAAI,GAAG,IAAI,CAAC;QACZ,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YACjC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;;gBAC5C,IAAI,GAAG,GAAG,CAAC;QAClB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IACF,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5B,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACvD,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;QAC7B,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,SAAS;YAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,uEAAuE;AACvE,SAAS,OAAO,CAAC,EAAW,EAAE,IAAY,EAAE,KAAa;IACvD,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACzB,EAAE,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC;IACvC,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC3B,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,yEAAyE;AACzE,SAAS,UAAU,CAAC,KAAY,EAAE,KAAkB;IAClD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ;QAAE,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC7D,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;YACnC,OAAO,CAAC,IAAe,EAAE,eAAe,EAAE,kBAAkB,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACH,SAAS,MAAM,CAAC,KAAkB;IAChC,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,QAAQ,KAAK,YAAY;YAAE,SAAS;QAC7C,MAAM,EAAE,GAAG,IAA8D,CAAC;QAC1E,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,EAAE,GAAG,GAAS,EAAE;QACpB,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QACxC,aAAa,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC;IACF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,EAAE,EAAE,CAAC;;QAC1B,KAAK,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxE,CAAC;AAED;;;;GAIG;AACH,MAAM,MAAM;IACF,KAAK,GAAwB,EAAE,CAAC;IAExC,GAAG,CAAC,EAAW,EAAE,IAAY,EAAE,EAAW;QACxC,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,GAAG;YAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,IAAI,GAAG;YAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;;YAChC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,CAAC,GAAa;QAChB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACpC,KAAK,GAAG,CAAC,WAAW,EAAE,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;QACxE,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK;YAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACjE,CAAC;CACF;AAQD,8DAA8D;AAC9D,MAAM,OAAO,GAAG,oBAAoB,CAAC;AAErC,SAAS,SAAS,CAAC,KAAc;IAC/B,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/D,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IACxE,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtD,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,KAAM,GAAG,QAAQ,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;AACvE,CAAC;AAED,SAAS,OAAO,CAAC,CAAU,EAAE,KAAa;IACxC,OAAO,CAAC,CAAC,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,WAAW,CAAC,MAAc,EAAE,KAAa;IAChD,MAAM,QAAQ,GAAG,MAAM,GAAG,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;SACvC,QAAQ,EAAE;SACV,QAAQ,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,GAAG,QAAQ,EAAE,CAAC;AACrD,CAAC;AAED,wEAAwE;AACxE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;AAEnC;;;;;GAKG;AACH,SAAS,WAAW,CAClB,IAAY,EACZ,MAAc,EACd,IAAW,EACX,IAAiB;IAEjB,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI;SAChB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;SACzB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC5B,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACnE,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACnB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,MAAM,EAAE,CAAC,EAAE,CAAC;YAC5C,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,MAAM,EAAE,CAAC,CAAC;YAClC,OAAO,CAAC,IAAI,CACV,WAAW,IAAI,KAAK,MAAM,cAAc,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI;gBAC/D,uBAAuB,CAC1B,CAAC;QACJ,CAAC;IACH,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IACzE,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACtD,0EAA0E;IAC1E,+CAA+C;IAC/C,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACpC,IAAI,IAAI,GAAG,WAAW,CAAC,CAAC,EAAE,GAAG,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACvE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3E,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACvD,CAAC;AAED,0EAA0E;AAC1E,SAAS,SAAS,CAAC,QAAmB,EAAE,IAAW,EAAE,KAAkB;IACrE,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAE,CAAC;QACzD,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,SAAS,IAAI,CAAC,EAAW,EAAE,MAAe;IACxC,IAAI,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,MAAM;QAAE,EAAE,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AACjF,CAAC;AAED;;;;;GAKG;AACH,SAAS,MAAM,CAAC,KAAY,EAAE,KAAkB;IAC9C,MAAM,KAAK,GACT,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;QACvB,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACzD,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAChE,IAAI,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QAC5B,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QACtB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,QAAQ,KAAK,YAAY,IAAI,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC1D,IAAI,CAAC,IAAe,EAAE,MAAM,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,CAAC,CAAC;QAAE,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK;YAAE,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC1E,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACzC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,kEAAkE;AAClE,SAAS,OAAO,CAAC,EAAW,EAAE,KAAyB;IACrD,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,SAAS,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACrE,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,iDAAiD;AACjD,SAAS,SAAS,CAAC,KAAkB;IACnC,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;SACtE,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,uEAAuE;AACvE,SAAS,QAAQ,CAAC,OAAwB,EAAE,MAAc;IACxD,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;IAChC,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;QAC1D,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACpB,CAAC;AAED,kDAAkD;AAClD,SAAS,QAAQ,CAAC,EAAW;IAC3B,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;SACxC,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;SAC9B,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,SAAS,QAAQ,CAAC,EAAW,EAAE,OAAoB;IACjD,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtE,OAAO,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,SAAS,SAAS,CAChB,EAAW,EACX,OAAwB,EACxB,KAAkB;IAElB,MAAM,OAAO,GAA6B,EAAE,CAAC;IAC7C,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC1D,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,EAAE,CACb,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAClF,CAAC;AAED;;;GAGG;AACH,SAAS,SAAS,CAAC,KAAY,EAAE,MAAe;IAC9C,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO;IACpC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACvB,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,KAAK,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,WAAW,GAAG,CAAC,CAAC,EAAE,CAAC;QAC/E,IAAI,GAAG,CAAC,YAAY,CAAC,WAAW,CAAC;YAAE,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED,oEAAoE;AACpE,SAAS,OAAO,CAAC,MAAW,EAAE,KAAU;IACtC,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAC/B,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAClD,CAAC;AACJ,CAAC;AAwBD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,SAAS,CACvB,EAAW,EACX,QAA6B,EAC7B,SAAiB,EACjB,MAAkB,EAClB,UAAuB,EAAE;IAEzB,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IACnC,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,MAAM,GAAG,GAAG,EAAE,CAAC,aAAa,CAAC;IAC7B,MAAM,IAAI,GAAG,EAA4B,CAAC;IAC1C,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAEtC,oDAAoD;IACpD,KAAK,MAAM,KAAK,IAAI,KAAK;QAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC;IAExE,6BAA6B;IAC7B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAe,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;QACxD,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE,CAAC;YAClC,OAAO,CAAC,KAAK,CACX,sBAAsB,EAAE,CAAC,SAAS,aAAa,SAAS,UAAU,CACnE,CAAC;YACF,SAAS;QACX,CAAC;QACD,kEAAkE;QAClE,8DAA8D;QAC9D,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACpC,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CACX,yBAAyB,EAAE,CAAC,SAAS,mBAAmB,GAAG,KAAK;gBAC9D,oBAAoB,CACvB,CAAC;YACF,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;QACD,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,MAAM,OAAO,GAAG,KAAK;QACnB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,KAAK,MAAM,GAAG,IAAI,OAAO;QAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,KAAK;QAChB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnD,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAExD,qBAAqB;IACrB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAS,CAAC;IACjC,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,0EAA0E;IAC1E,wEAAwE;IACxE,oEAAoE;IACpE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAS,CAAC;IACjC,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;QACnC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC5D,IAAI,KAAK,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC5E,KAAK,CAAC,IAAI,GAAG,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;QACxC,mEAAmE;QACnE,IAAI,KAAK,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,aAAa,EAAE,gBAAgB,CAAC,CAAC;IACrD,CAAC;IAED,wEAAwE;IACxE,oEAAoE;IACpE,+BAA+B;IAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC;IAC5E,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IACjD,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QACzD,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACf,OAAO,CAAC,IAAI,CACV,YAAY,EAAE,CAAC,SAAS,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,SAAS;YAC1D,+BAA+B,KAAK,CAAC,MAAM,yBAAyB;YACpE,qCAAqC,CACxC,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,OAAgB,EAAW,EAAE,CACzC,KAAK,CAAC,MAAM,KAAK,CAAC;QAChB,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,OAAO;aACJ,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;aACjC,IAAI,CACH,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC;YAC7D,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CACZ;aACA,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,SAAS,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAEpE,IAAI,KAAc,CAAC;IACnB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,sEAAsE;QACtE,gEAAgE;QAChE,KAAK,MAAM,KAAK,IAAI,OAAO;YAAE,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC;QACvD,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC;QAClD,KAAK,MAAM,KAAK,IAAI,KAAK;YAAE,IAAI,KAAK,CAAC,QAAQ;gBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAClE,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QACnD,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACnC,+DAA+D;YAC/D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YACjD,SAAS,CAAC,KAAK,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;YACjC,uEAAuE;YACvE,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAC5C,IAAI,CAAC,KAAK;gBAAE,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC;YACtC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC;QAC9D,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,GAAG,IAAI,CACV,KAAK;YACH,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;YACzD,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,CAC5B,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;YAC1B,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC;YAC1B,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC;YACvB,SAAS,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACjD,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAEvB,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;IAC5B,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;QACnC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,IAAI;YACpB,CAAC,CAAC,eAAe;YACjB,CAAC,CAAC,KAAK;gBACL,CAAC,CAAC,iBAAiB;gBACnB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;oBAClB,CAAC,CAAC,iBAAiB;oBACnB,CAAC,CAAC,IAAI,CAAC;QACb,IAAI,OAAO,CAAC,SAAS,IAAI,SAAS,EAAE,CAAC;YACnC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,iBAAiB,CAAC,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;YAChE,KAAK,CAAC,EAAE,CAAC,eAAe,CAAC,iBAAiB,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ;YAAE,QAAQ,EAAE,CAAC;IACjC,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACpD,gEAAgE;IAChE,QAAQ,CAAC,EAAE,EAAE,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACxD,QAAQ,CAAC,EAAE,EAAE,yBAAyB,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,EAAE,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;;QACxD,QAAQ,CAAC,EAAE,EAAE,gBAAgB,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAEtD,MAAM,SAAS,GAAgB,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7D,KAAK,MAAM,KAAK,IAAI,OAAO;QAAE,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC1D,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAE5C,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;AACxB,CAAC;AAED,mEAAmE;AACnE,SAAS,UAAU,CAAC,IAAU,EAAE,KAAkB;IAChD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,0DAA0D;AAC1D,SAAS,OAAO,CAAC,GAAQ,EAAE,KAAkB;IAC3C,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACpF,CAAC;AAED,6EAA6E;AAC7E,SAAS,SAAS,CAAC,KAAY,EAAE,IAAU,EAAE,KAAkB;IAC7D,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACnC,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED;;;;GAIG;AACH,SAAS,SAAS,CAChB,MAAe,EACf,OAAwB,EACxB,EAAe;IAEf,MAAM,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;IAC1B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACxC,IAAI,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC;QACtB,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClB,OAAO,EAAE,GAAG,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAE,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,KAAK;gBAAE,EAAE,EAAE,CAAC;YACpE,IAAI,EAAE,KAAK,CAAC;gBAAE,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC;QAClC,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAQD,SAAS,UAAU,CAAC,IAAU,EAAE,GAAa;IAC3C,MAAM,MAAM,GAAG,GAAG,CAAC,aAAmC,CAAC;IACvD,MAAM,GAAG,GAAG,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,cAAc,CAAE,CAAC,CAAC;IAChE,OAAO,KAAK,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACtD,CAAC;AAED;;;;GAIG;AACH,SAAS,OAAO,CAAC,IAAU,EAAE,OAAuB;IAClD,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAClC,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC;IACjC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QACzD,IAAI,GAAG,CAAC,aAAa,KAAK,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW;YAAE,OAAO;QAChE,MAAM,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,MAAM,CAAC,cAAc,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9D,IAAI,KAAK;QAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,kEAAkE;AAClE,SAAS,QAAQ,CACf,EAAW,EACX,IAAkB,EAClB,UAAuB,EAAE;IAEzB,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IACtD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACrB,IAAI,QAAQ,EAAE,CAAC;YACb,SAAS,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QACD,qEAAqE;QACrE,gBAAgB;QAChB,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3B,EAAE,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;YACnC,OAAO;QACT,CAAC;QACD,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAClB,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACtC,QAAQ,CAAC,EAAE,EAAE,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO;IACT,CAAC;IACD,0EAA0E;IAC1E,oDAAoD;IACpD,IAAI,CAAC,QAAQ;QAAE,OAAO;IACtB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IAC7C,SAAS,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AACrD,CAAC;AAYD,MAAM,IAAI,GAAG,IAAI,OAAO,EAAoB,CAAC;AAE7C,SAAS,OAAO,CAAC,IAAgB;IAC/B,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,KAAK,GAAG,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,EAAE,CAAC;QACtD,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,UAAU,CACxB,IAAgB,EAChB,KAAa;IAEb,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,KAAW,EAAE,IAAkB;IAClD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;IACvD,OAAO;QACL,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,GAAG,IAAI,SAAS;KAC5D,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,MAAM,CAAC,IAAgB;IACrC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC;AAED;;;;GAIG;AACH,SAAS,OAAO,CAAC,IAAW,EAAE,GAAW,EAAE,KAAY;IACrD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAClE,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE;QAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,IAAI,CAAC,OAAkC,EAAE,IAAkB;IAClE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG;QACf,GAAG,CAAC,MAAM,EAAE,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QAC3D,GAAG,CAAC,MAAM,EAAE,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;KAC5D,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QAClD,OAAO;IACT,CAAC;IACD,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE;QACtB,GAAG,QAAQ;QACX,GAAG,KAAK;QACR,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC;KACvD,CAAC,CAAC;AACL,CAAC;AAED,2DAA2D;AAC3D,SAAS,MAAM,CAAC,KAAW,EAAE,IAAkB;IAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC;IAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,MAAM,IAAI,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,qEAAqE;AACrE,SAAS,KAAK,CAAC,EAAW,EAAE,OAAoB;IAC9C,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;IAC1C,OAAO,CACL,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CACnD,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,QAAQ,CAAC,IAAgB,EAAE,KAAW,EAAE,OAAoB;IACnE,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAC1C,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;YAAE,SAAS;QACrC,KAAK,MAAM,EAAE,IAAI,UAAU,CAAC,IAAI,EAAE,IAAI,UAAU,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;YAChE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;gBAAE,SAAS;YAC3D,IAAI,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC;gBAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CAAC,IAAgB,EAAE,KAAW;IACjD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAClC,KAAK,IAAI,MAAM,GAAG,IAAI,EAAE,MAAM,GAAG,CAAC;QAChC,MAAM,GAAG,KAAK,CAAC;QACf,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;YACpC,KAAK,MAAM,EAAE,IAAI,UAAU,CAAC,IAAI,EAAE,IAAI,UAAU,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;gBAChE,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;oBAAE,SAAS;gBACpD,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACf,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClE,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAmBD;;;GAGG;AACH,SAAS,QAAQ,CAAC,EAAW,EAAE,MAA2B;IACxD,OAAO,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,IAAI,UAAU,GAAG,CAAC,KAAK,EAAE,CAAC;AAClE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAgB,EAChB,KAAqB,EACrB,UAAuB,EAAE;IAEzB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GACX,IAAI,CAAC,KAAK,KAAK,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAU,CAAC;QACzE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC1B,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,UAAU,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,CACxE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAC7B,CAAC;QACF,IACE,OAAO,CAAC,MAAM,KAAK,CAAC;YACpB,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,kBAAkB,CAAC;YAC1C,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EACpC,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,0BAA0B,IAAI,CAAC,KAAK,aAAa,CAAC,CAAC;QAClE,CAAC;QACD,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;YACzB,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACrB,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE;gBACjB,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC;gBAC3B,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC;aACnC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC;YAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IACD,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC1B,YAAY,EAAE,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,MAAM,CAAC,IAAgB,EAAE,EAAW;IAClD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IACnE,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QACvE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAC7C,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["/// <reference lib=\"dom\" />\n\n/**\n * Landing — see docs/reference/data-binding.md.\n *\n * The hub lands a response item's rows on every element whose `lb-query`\n * names its query. The item says the query's kind and key, so the markup\n * says neither:\n *\n * kind row template the hub\n * row no lands the row on the element itself\n * row yes lands one live row\n * rows yes lands one live row per row\n * rows no lands nothing\n *\n * Filling a live row and filling an element a `row` lands on are the same\n * operation, and the only difference is how much of the page the root\n * covers.\n *\n * An answer is kept after it lands. An element that names a query and\n * arrives after that query's answer — a picker in a new live row, a ghost\n * row a custom element built — is filled from the kept answer at the end of\n * the next landing, so a query need not land again, and need not land after\n * the one whose rows hold it, just to fill what is new.\n *\n * Every custom element landing places is told so once the landing is done,\n * and every one it removes is told so once it is gone — see lb-lifecycle.\n *\n * A `rows` query is placed by its order: the user's, from the choice its\n * element's `lb-order` names, or the one the server declared, or, with\n * neither, the order its rows arrived in. Groups are built from the markup's\n * group templates as the order breaks, and every change to a list — a row\n * created, changed, moved or leaving, a group appearing or leaving — is one\n * a stylesheet can see. A row a filter the user chose does not pass is\n * hidden.\n *\n * A condition is the one other thing landing moves. An element whose\n * `lb-show` column is off stands in the document inside a template, and\n * landing reaches in there as it reaches everywhere else, so a branch that\n * returns is already current. Nothing but landing reaches in.\n */\n\nimport {\n AGGREGATES,\n ATTR_COLUMN,\n ATTR_FILTER,\n ATTR_ORDER,\n CHOICES_QUERY,\n LB_RESERVED_PREFIX,\n ATTR_COLUMN_VALUE,\n ATTR_COUNT,\n ATTR_GROUP,\n ATTR_GROUP_COLUMN,\n ATTR_GROUP_LEAVING,\n ATTR_GROUP_LIVE,\n ATTR_GROUP_VALUE,\n ATTR_KEY_VALUE,\n ATTR_MAX,\n ATTR_MIN,\n ATTR_QUERY,\n ATTR_QUERY_ORDER,\n ATTR_QUERY_ROW_COUNT,\n ATTR_QUERY_UNSORTED_COUNT,\n ATTR_ROW_CHANGED,\n ATTR_ROW_CREATED,\n ATTR_ROW_LEAVING,\n ATTR_ROW_LIVE,\n ATTR_ROW_MOVED,\n ATTR_ROW_REQUESTED,\n ATTR_ROW_UNSORTED,\n ATTR_SHOW,\n ATTR_SUM,\n ATTR_URL_PARM,\n KIND_ROW,\n LIVE_GROUP,\n LIVE_ROW,\n ORDER_DESCENDING,\n REQUESTED_CHANGED,\n REQUESTED_CREATED,\n REQUESTED_MOVED,\n SHOW_NOT,\n ATTR_SELECT,\n ATTR_ROW_SELECTED,\n} from \"../core/lb-constants.js\";\nimport {\n compareRows,\n compareValues,\n isPatch,\n parseFilter,\n parseOrder,\n passes,\n readAs,\n type ColumnType,\n type ColumnTypes,\n type FilterTerm,\n type OrderTerm,\n type Patch,\n type HubLifecycle,\n type ResponseItem,\n type Row,\n type RowsResult,\n} from \"../core/lb-types.js\";\nimport {\n attachPlaced,\n detachRemoved,\n LEAVING,\n PARKED,\n placed,\n upgradeAbsent,\n} from \"./lb-lifecycle.js\";\n\n/** A DocumentFragment's nodeType. Tier 3 has no `Node` global to read it from. */\nconst FRAGMENT_NODE = 11;\n\n/** An Element's nodeType, for the same reason. */\nconst ELEMENT_NODE = 1;\n\n/** A Text node's nodeType, for the same reason. */\nconst TEXT_NODE = 3;\n\n/**\n * The input types whose state is not their `value`, or cannot be set. A\n * checkbox's and a radio button's state is `checked`, and each is a control\n * by its own rule.\n */\nconst UNLANDED_INPUTS = [\"checkbox\", \"radio\", \"file\"];\n\n/** A control's value, whether it is native or a custom element. */\nexport interface Control extends Element {\n value: string;\n}\n\n/**\n * A native control whose state is its `value`: a `<select>`, a\n * `<textarea>`, or an `<input>` of any type but checkbox, radio and file.\n *\n * Told apart by tag name and type rather than by class, so it holds for an\n * element from any document.\n */\nfunction isNativeControl(el: Element): boolean {\n if (el.localName === \"select\" || el.localName === \"textarea\") return true;\n return (\n el.localName === \"input\" &&\n !UNLANDED_INPUTS.includes((el as HTMLInputElement).type)\n );\n}\n\n/**\n * A checkbox, whose state is `checked` rather than `value`. HTML's quirk,\n * and so the hub's: it lands and gathers by its checked state, so every other\n * part of the vocabulary treats it as any control.\n */\nfunction isCheckbox(el: Element): boolean {\n return (\n el.localName === \"input\" && (el as HTMLInputElement).type === \"checkbox\"\n );\n}\n\n/**\n * A radio button, whose state is `checked` as well. It is checked when its\n * own `value` is the value that landed, so a group of them naming one column\n * shows that value, and gathers the one checked.\n */\nexport function isRadio(el: Element): boolean {\n return el.localName === \"input\" && (el as HTMLInputElement).type === \"radio\";\n}\n\n/**\n * A form-associated custom element with a `value` property. HTML marks one\n * with `static formAssociated = true` on its class, and a control has a value.\n */\nexport function isFormAssociated(el: Element): boolean {\n const ctor = el.constructor as { formAssociated?: unknown };\n return ctor.formAssociated === true && \"value\" in el;\n}\n\n/**\n * A control: an `<input>`, `<select>` or `<textarea>`, a checkbox, a radio\n * button, or a\n * form-associated custom element with a `value` property. Landing and\n * gathering draw the same line, so a value read back is the one that landed\n * there.\n */\nexport function isControl(el: Element): el is Control {\n return (\n isNativeControl(el) || isCheckbox(el) || isRadio(el) || isFormAssociated(el)\n );\n}\n\n/**\n * What a control gathers: a checkbox `\"true\"` or `\"false\"`, so unchecked\n * still says so, and any other control its `value`.\n */\nfunction controlValue(el: Control): string {\n return isCheckbox(el) ? String((el as HTMLInputElement).checked) : el.value;\n}\n\n/**\n * Gather a control into `values` under its column. Of the radio buttons\n * naming one column, the one checked gives the value, and `\"\"` stands when\n * none is.\n */\nexport function gatherInto(\n values: Record<string, string>,\n column: string,\n el: Control,\n): void {\n if (isRadio(el) && !(el as HTMLInputElement).checked) {\n values[column] ??= \"\";\n return;\n }\n values[column] = controlValue(el);\n}\n\n/**\n * Set an element from a column. A control's `value` is set. A custom element\n * that is not a control keeps its content, which the builder placed there\n * from its element file, and renders the stamp instead. Any other element's\n * text content is set. Every one carries the value as `lb-column-value`.\n */\nfunction land(el: Element, value: unknown): void {\n // Untouched, whatever the server sent: the browser decides what a\n // non-string looks like. See Row in core/lb-types.ts.\n if (value === null || value === undefined) {\n if (isCheckbox(el) || isRadio(el)) {\n (el as HTMLInputElement).checked = false;\n } else if (isControl(el)) el.value = \"\";\n else if (!el.localName.includes(\"-\") && el.localName !== \"input\") {\n el.textContent = \"\";\n }\n el.removeAttribute(ATTR_COLUMN_VALUE);\n return;\n }\n if (isCheckbox(el)) {\n // Checked by the rule `lb-show` is on by: only null and false are off,\n // and no string is read.\n (el as HTMLInputElement).checked = value !== false;\n } else if (isRadio(el)) {\n (el as HTMLInputElement).checked =\n (el as HTMLInputElement).value === String(value);\n } else if (isControl(el)) {\n el.value = value as string;\n } else if (el.localName === \"input\") {\n console.warn(\n `lb-hub: a value does not land on <input type=\"${(el as HTMLInputElement).type}\">, ignoring`,\n el,\n );\n return;\n } else if (!el.localName.includes(\"-\")) {\n setText(el, String(value));\n }\n setStamp(el, ATTR_COLUMN_VALUE, String(value));\n}\n\n/**\n * Set an element's text, unless it already holds exactly that text. Writing\n * the same text again replaces the text node, which is two mutations and a\n * style check for nothing.\n */\nfunction setText(el: Element, text: string): void {\n const only = el.firstChild;\n const same = only\n ? only === el.lastChild &&\n only.nodeType === TEXT_NODE &&\n (only as Text).data === text\n : text === \"\";\n if (!same) el.textContent = text;\n}\n\n/** Set an attribute, unless it already has that value. */\nfunction setStamp(el: Element, name: string, value: string): void {\n if (el.getAttribute(name) !== value) el.setAttribute(name, value);\n}\n\n/**\n * Whether an element under `root` belongs to root's query, rather than to a\n * query nested inside it.\n *\n * A descendant is root's unless something between it and root carries\n * `lb-query`. The element's own `lb-query` does not count: it names what the\n * element holds, and the row it reads from is its ancestors'. So a picker\n * carrying `lb-query` and `lb-column` is set from the row around it. Root's\n * own attribute does not count either: root is what is being filled.\n *\n * Root may be the content of a template holding an absent branch. The walk\n * up from an element inside it stops at the top of that content, which has\n * no parent, and the template it stands for was in scope already.\n */\nfunction inScope(\n root: Element | DocumentFragment,\n el: Element,\n stop?: string,\n): boolean {\n if (stop && el !== root && el.matches(stop)) return false;\n for (let node = el.parentElement; node && node !== root;) {\n if (node.hasAttribute(ATTR_QUERY)) return false;\n if (stop && node.matches(stop)) return false;\n node = node.parentElement;\n }\n return true;\n}\n\n/**\n * Root if it matches, then every descendant in root's query that does.\n * Gathering finds columns through here. It does not reach into an absent\n * branch, so a live row is read back from the places a row lands that are\n * showing.\n */\nexport function within(root: Element, selector: string): Element[] {\n const found: Element[] = root.matches(selector) ? [root] : [];\n for (const el of root.querySelectorAll(selector)) {\n if (inScope(root, el)) found.push(el);\n }\n return found;\n}\n\n/**\n * Every descendant in root's query that matches, absent branches included.\n *\n * `querySelectorAll` does not enter template content, so an element that is\n * off would otherwise miss everything landed while it was away, and return\n * stale or with its rows empty. A template holding one is in root's query by\n * the ordinary rule, and its content is searched as if it stood there.\n */\nfunction below(\n root: Element | DocumentFragment,\n selector: string,\n stop?: string,\n): Element[] {\n const found: Element[] = [];\n for (const el of root.querySelectorAll(selector)) {\n if (inScope(root, el, stop)) found.push(el);\n }\n for (const parked of root.querySelectorAll(PARKED)) {\n if (inScope(root, parked, stop)) {\n found.push(\n ...below((parked as HTMLTemplateElement).content, selector, stop),\n );\n }\n }\n return found;\n}\n\n/**\n * Every element in root that matches, absent branches included. A query is\n * looked up this way before any row is known, so nothing is filtered out.\n */\nfunction everywhere(root: ParentNode, selector: string): Element[] {\n const found = [...root.querySelectorAll(selector)];\n for (const parked of root.querySelectorAll(PARKED)) {\n const content = (parked as HTMLTemplateElement).content;\n found.push(...everywhere(content, selector));\n }\n return found;\n}\n\n/**\n * Tick or clear an `lb-select` checkbox, and stamp the live row it selects\n * to match.\n */\nexport function select(box: Element, on: boolean): void {\n (box as HTMLInputElement).checked = on;\n box.closest(LIVE_ROW)?.toggleAttribute(ATTR_ROW_SELECTED, on);\n}\n\n/**\n * Put an element in the document or take it out, as its `lb-show` column\n * says.\n *\n * Off is inside a template that stands where the element stood, carrying the\n * same `lb-show`. The element is moved rather than rebuilt, so a custom\n * element keeps its instance and a control keeps what was typed into it. On\n * moves it back and the template goes.\n *\n * Landing reaches into that template, so both it and the element it holds\n * arrive here. The template decides; the element it holds, whose parent is\n * the template's content, is left to it.\n */\nfunction present(el: Element, on: boolean): void {\n if (el.localName === \"template\") {\n const branch = (el as HTMLTemplateElement).content.firstElementChild;\n if (on && branch) el.replaceWith(branch);\n return;\n }\n if (on || el.parentNode?.nodeType === FRAGMENT_NODE) return;\n // A selection hidden is a selection abandoned: a tick kept out of sight\n // would come back stale, and nothing else could clear it.\n for (const box of [el, ...el.querySelectorAll(`[${ATTR_SELECT}]`)]) {\n if (box.hasAttribute(ATTR_SELECT)) select(box, false);\n }\n const parked = el.ownerDocument.createElement(\"template\");\n parked.setAttribute(ATTR_SHOW, el.getAttribute(ATTR_SHOW)!);\n el.replaceWith(parked);\n parked.content.append(el);\n parkedIn.set(el, parked);\n}\n\n/** The template each absent element was last put in. */\nconst parkedIn = new WeakMap<Element, HTMLTemplateElement>();\n\n/**\n * Put a live row's element in the document or take it out, the element\n * itself being known. Its template, while it is in one, decides first, as it\n * does when landing finds both.\n */\nfunction presentPlaced(el: Element, on: boolean): void {\n const parked = parkedIn.get(el);\n if (parked && el.parentNode === parked.content) present(parked, on);\n present(el, on);\n}\n\n/**\n * Where one row's columns land and its conditions show, each list by the\n * attribute's value: `lb-column`'s, and `lb-show`'s with its `!`.\n */\ninterface Places {\n columns: Map<string, Element[]>;\n shows: Map<string, Element[]>;\n /** Every link whose `href` takes parms from the row. */\n links: Element[];\n}\n\nfunction addPlace(map: Map<string, Element[]>, name: string, el: Element): void {\n const list = map.get(name);\n if (list) list.push(el);\n else map.set(name, [el]);\n}\n\n/**\n * Note an element among the places: where its `lb-column` lands, and what\n * its `lb-show` decides. A template holding an absent branch decides for the\n * branch it holds, and is noted as that branch's.\n */\nfunction note(places: Places, el: Element): void {\n const column = el.getAttribute(ATTR_COLUMN);\n if (column !== null) addPlace(places.columns, column, el);\n if (el.hasAttribute(ATTR_URL_PARM)) places.links.push(el);\n const show = el.getAttribute(ATTR_SHOW);\n if (show === null) return;\n if (el.localName === \"template\") {\n const branch = (el as HTMLTemplateElement).content.firstElementChild;\n if (branch) parkedIn.set(branch, el as HTMLTemplateElement);\n return;\n }\n addPlace(places.shows, show, el);\n}\n\nfunction noPlaces(): Places {\n return { columns: new Map(), shows: new Map(), links: [] };\n}\n\n/** An element a row lands on, in any way. */\nconst PLACE = `[${ATTR_COLUMN}], [${ATTR_SHOW}], [${ATTR_URL_PARM}]`;\n\n/**\n * Note a row's root among its places: its own `lb-column` and `lb-url-parm`\n * count, as the row is its own. Its own `lb-show` never does.\n */\nfunction noteRoot(places: Places, root: Element): void {\n if (root.hasAttribute(ATTR_COLUMN)) {\n addPlace(places.columns, root.getAttribute(ATTR_COLUMN)!, root);\n }\n if (root.hasAttribute(ATTR_URL_PARM)) places.links.push(root);\n}\n\n/**\n * The places in root's query, found by searching: root's own `lb-column`\n * when `self`, and every one below it short of `stop`, absent branches\n * included.\n */\nfunction search(root: Element, self: boolean, stop?: string): Places {\n const places = noPlaces();\n if (self) noteRoot(places, root);\n for (const el of below(root, PLACE, stop)) note(places, el);\n return places;\n}\n\n/**\n * A place's position in a row: child indices from the row's root, where a\n * template holding an absent branch counts its content as its children.\n */\ntype Path = number[];\n\nfunction kids(el: Element): HTMLCollection {\n return el.localName === \"template\"\n ? (el as HTMLTemplateElement).content.children\n : el.children;\n}\n\n/**\n * Where every place below a row template's root lies, worked out once for\n * the template and followed in each copy of it. The rule is search()'s: a\n * nested query's own attributes are this row's and what is inside it is not,\n * and template content is entered only for an absent branch.\n */\nfunction compile(row: Element): Path[] {\n const paths: Path[] = [];\n const walk = (el: Element, path: Path): void => {\n const children = kids(el);\n for (let i = 0; i < children.length; i++) {\n const child = children[i]!;\n const at = [...path, i];\n if (child.matches(PLACE)) paths.push(at);\n if (child.hasAttribute(ATTR_QUERY)) continue;\n if (child.localName === \"template\" && !child.hasAttribute(ATTR_SHOW)) {\n continue;\n }\n walk(child, at);\n }\n };\n walk(row, []);\n return paths;\n}\n\n/**\n * A live row's places, by its template's paths: its root's own `lb-column`,\n * and the element at the end of each path. Followed before anything lands,\n * while the copy is as the template made it.\n */\nfunction placesBy(row: Element, paths: Path[]): Places {\n const places = noPlaces();\n noteRoot(places, row);\n for (const path of paths) {\n let el = row;\n for (const i of path) el = kids(el)[i]!;\n note(places, el);\n }\n return places;\n}\n\n/** Whether two column values are the same value. */\nfunction same(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n // Loadbare does not read a non-atomic value, but one may still arrive.\n return (\n typeof a === \"object\" &&\n typeof b === \"object\" &&\n a !== null &&\n b !== null &&\n JSON.stringify(a) === JSON.stringify(b)\n );\n}\n\n/**\n * Land a row on its places: each column's value where it lands, and the\n * conditions it decides.\n *\n * Only null and false are off. A string is never read, so \"false\" is on, and\n * the query spells a condition as a boolean or a null.\n */\nfunction fill(places: Places, row: Row): void {\n for (const [column, value] of Object.entries(row)) {\n for (const el of places.columns.get(column) ?? []) land(el, value);\n const on = value !== null && value !== false;\n for (const el of places.shows.get(column) ?? []) presentPlaced(el, on);\n for (const el of places.shows.get(`${SHOW_NOT}${column}`) ?? []) {\n presentPlaced(el, !on);\n }\n }\n}\n\n/**\n * Fill from one row: every `lb-column` and `lb-show` in root's query.\n *\n * With `self`, root's own `lb-column` counts, as a live row's does:\n * `<option>`'s content model is text, so an option row has to be the column\n * it displays. An element a `row` lands on is not its own ancestor, so its\n * own `lb-column` reads from the row around it and is left alone here. Root's\n * own `lb-show` never counts.\n *\n * `stop` passes over everything matching it and inside it.\n */\nexport function applyRow(\n root: Element,\n row: Row,\n self = false,\n stop?: string,\n): void {\n const places = search(root, self, stop);\n fill(places, row);\n link(places, row);\n}\n\n/** The `href` each link was written with, which every landing starts from. */\nconst bases = new WeakMap<Element, string>();\n\n/** Columns already reported as missing from a row, or as no parm's value. */\nconst unlinked = new Set<string>();\n\n/** The columns an element's `lb-url-parm` names. */\nfunction parmsOf(el: Element): string[] {\n return (el.getAttribute(ATTR_URL_PARM) ?? \"\")\n .split(\",\")\n .map((column) => column.trim())\n .filter((column) => column !== \"\");\n}\n\n/**\n * Write each link's `href` from the whole row: the `href` as written, with\n * each column its `lb-url-parm` names as the parm of the same name. A null,\n * empty or missing column leaves its parm off, as an empty value takes a\n * parm out of the URL.\n */\nfunction link(places: Places, row: Row): void {\n if (places.links.length === 0) return;\n // A row with no values is a blank, not a row missing its columns.\n const real = Object.values(row).some((v) => v !== null && v !== undefined);\n for (const el of places.links) {\n let base = bases.get(el);\n if (base === undefined) {\n base = el.getAttribute(\"href\") ?? \"\";\n bases.set(el, base);\n }\n const hashAt = base.indexOf(\"#\");\n const hash = hashAt < 0 ? \"\" : base.slice(hashAt);\n const rest = hashAt < 0 ? base : base.slice(0, hashAt);\n const queryAt = rest.indexOf(\"?\");\n const path = queryAt < 0 ? rest : rest.slice(0, queryAt);\n const parms = new URLSearchParams(queryAt < 0 ? \"\" : rest.slice(queryAt));\n for (const column of parmsOf(el)) {\n const value = row[column];\n if (value === undefined && real && !unlinked.has(column)) {\n unlinked.add(column);\n console.warn(\n `lb-hub: <a ${ATTR_URL_PARM}> names '${column}', which the row ` +\n `around it does not have`,\n );\n }\n const atomic =\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\";\n if (!atomic && value !== null && value !== undefined) {\n if (!unlinked.has(column)) {\n unlinked.add(column);\n console.warn(\n `lb-hub: '${column}' is no value a query parm can hold, and is ` +\n `left off the link`,\n );\n }\n }\n if (!atomic || value === \"\") parms.delete(column);\n else parms.set(column, String(value));\n }\n const query = parms.toString();\n const href = `${path}${query ? `?${query}` : \"\"}${hash}`;\n if (el.getAttribute(\"href\") !== href) el.setAttribute(\"href\", href);\n }\n}\n\n/**\n * A row naming every column root's query shows, each null: what landing it\n * leaves is root as it stands with no row. Absent branches are counted, so a\n * column only an absent element names is cleared too.\n */\nexport function blankRow(root: Element): Row {\n const row: Row = {};\n for (const el of below(root, `[${ATTR_COLUMN}]`)) {\n row[el.getAttribute(ATTR_COLUMN)!] = null;\n }\n for (const el of below(root, `[${ATTR_SHOW}]`)) {\n const show = el.getAttribute(ATTR_SHOW)!;\n row[show.startsWith(SHOW_NOT) ? show.slice(SHOW_NOT.length) : show] = null;\n }\n return row;\n}\n\n/**\n * The row template: the first `<template>` among the element's descendants,\n * outside any nested `lb-query`. A template holding an absent branch is not a\n * row template: rows land before the row template, so one inside the first\n * live row comes first in document order.\n */\nexport function templateIn(el: Element): HTMLTemplateElement | null {\n const template = within(el, `template:not([${ATTR_SHOW}])`).find(\n (t) => t !== el,\n );\n return (template as HTMLTemplateElement | undefined) ?? null;\n}\n\n/** What can take focus, before asking whether it can be operated. */\nconst FOCUSABLE =\n `a[href], button, input:not([type=\"hidden\"]), select, textarea, ` +\n `summary, [tabindex]:not([tabindex=\"-1\"]), ` +\n `[contenteditable]:not([contenteditable=\"false\"])`;\n\n/**\n * Focus the first element in `root` the user can operate: not disabled, not\n * in a closed dialog, not inert, not hidden, and one that took the focus\n * when asked. Nothing in a `<template>` is a candidate, so an absent\n * `lb-show` branch is passed over.\n */\nexport function focusIn(root: Element): void {\n const doc = root.ownerDocument;\n for (const el of root.querySelectorAll<HTMLElement>(FOCUSABLE)) {\n if (el.matches(\":disabled\")) continue;\n if (el.closest(`dialog:not([open]), [inert], [hidden]`)) continue;\n if (el.checkVisibility?.() === false) continue;\n el.focus();\n if (doc.activeElement === el) return;\n }\n}\n\n/** One live row: its key, its element, where it lands, and what it holds. */\ninterface Entry {\n key: string;\n el: Element;\n places: Places;\n /** Its columns, as landed so far. */\n data: Row;\n /**\n * Its columns as they were when it was last placed by the order, which\n * decide the group it stands in.\n */\n placed: Row;\n /** Whether a filter the user chose hides it. */\n hidden: boolean;\n /** Whether it stands where the order would not put it. */\n unsorted: boolean;\n}\n\n/**\n * One group the hub built from a group template: the nodes its clone put in\n * the document, and the clone of the nested template, which is where its\n * contents go. The root of a list is a group with no nodes, whose slot is the\n * markup's own first template, and whose aggregates are the list's.\n */\ninterface Group {\n /** The column the group breaks on and its value there, as one string. */\n id: string;\n /** Every node the clone put in the document, the slot among them or not. */\n nodes: ChildNode[];\n /** The nested template's clone: contents land immediately before it. */\n slot: HTMLTemplateElement;\n /** The next level's groups, in order, when this is not the innermost. */\n children: Group[];\n /** The live rows, in order, when this is the innermost level. */\n rows: Entry[];\n /** Where each heading element's columns land, found once. */\n heads: Places[];\n /** Every aggregate the group sets, found once. */\n aggregates: Element[];\n /** Whether a filter the user chose hides every row in it. */\n hidden: boolean;\n}\n\n/**\n * What the hub keeps about one element's rows between landings: the\n * templates the markup wrote, each live row by key, and the groups built\n * from them.\n */\ninterface List {\n /** The markup's first template: a group template, or the row template. */\n top: HTMLTemplateElement;\n /** The group templates, outermost first. Empty when the list has none. */\n levels: HTMLTemplateElement[];\n /** The innermost template, which every live row is copied from. */\n rowTemplate: HTMLTemplateElement;\n /** Where the row template's places lie, once a row has been made. */\n paths?: Path[];\n /** Every live row, by key. */\n byKey: Map<string, Entry>;\n root: Group;\n}\n\nconst lists = new WeakMap<Element, List>();\n\n/** Elements already told their group templates outrun their order. */\nconst warned = new WeakSet<Element>();\n\n/**\n * What a group's heading and aggregates stop at: the rows and groups inside\n * it, live or leaving, which are filled from rows of their own.\n */\nconst SCAFFOLD_STOP = `${LIVE_ROW}, ${LIVE_GROUP}, ${LEAVING}`;\n\n/** An element carrying any aggregate. */\nconst AGGREGATE = AGGREGATES.map((name) => `[${name}]`).join(\", \");\n\n/**\n * The template a group's contents go in front of: the first `<template>` in\n * the content outside any nested `lb-query`, and not one holding an absent\n * branch.\n */\nfunction slotIn(root: Element | DocumentFragment): HTMLTemplateElement | null {\n for (const t of root.querySelectorAll(`template:not([${ATTR_SHOW}])`)) {\n if (inScope(root, t)) return t as HTMLTemplateElement;\n }\n return null;\n}\n\n/**\n * The aggregates in root's scaffolding: root itself when `self`, and every\n * one below it that is not inside a row or a group of its own.\n */\nfunction aggregatesIn(root: Element, self: boolean): Element[] {\n const found = below(root, AGGREGATE, SCAFFOLD_STOP);\n if (self && root.matches(AGGREGATE)) found.unshift(root);\n return found;\n}\n\n/**\n * The list an element holds, found from its first template the first time\n * rows land on it, and kept after that: once groups exist, their slots are\n * templates too, and they come first in the document.\n */\nfunction listFor(el: Element, template: HTMLTemplateElement): List | null {\n const found = lists.get(el);\n if (found) return found;\n const levels: HTMLTemplateElement[] = [];\n let at = template;\n while (at.hasAttribute(ATTR_GROUP)) {\n levels.push(at);\n const next = slotIn(at.content);\n if (!next) {\n console.error(\n `lb-hub: a group template in <${el.localName}> holds no nested ` +\n `template for its contents`,\n );\n return null;\n }\n at = next;\n }\n const list: List = {\n top: template,\n levels,\n rowTemplate: at,\n byKey: new Map(),\n root: {\n id: \"\",\n nodes: [],\n slot: template,\n children: [],\n rows: [],\n heads: [],\n aggregates: aggregatesIn(el, false),\n hidden: false,\n },\n };\n // Live rows already in the markup, as a page rendered ahead of its data\n // ships them, are the list's from the start, in the order they stand.\n if (levels.length === 0) {\n for (const row of el.querySelectorAll(LIVE_ROW)) {\n if (!inScope(el, row)) continue;\n const key = row.getAttribute(ATTR_KEY_VALUE)!;\n if (list.byKey.has(key)) {\n console.error(\n `lb-hub: <${el.localName}> shows two rows with the key '${key}'`,\n );\n }\n const entry: Entry = {\n key,\n el: row,\n places: search(row, true),\n data: {},\n placed: {},\n hidden: false,\n unsorted: false,\n };\n list.byKey.set(key, entry);\n list.root.rows.push(entry);\n }\n }\n lists.set(el, list);\n return list;\n}\n\n/** The live rows of a group and everything under it, in order. */\nfunction rowsUnder(group: Group): Entry[] {\n return group.children.length > 0\n ? group.children.flatMap(rowsUnder)\n : group.rows;\n}\n\n/**\n * A new live row for a key, copied from the row template: upgraded, stamped\n * with its key, its places found by the template's paths, and no values yet.\n * It is in no document until it is placed.\n */\nfunction create(list: List, doc: Document, key: string): Entry {\n const template = list.rowTemplate.content.firstElementChild!;\n list.paths ??= compile(template);\n // Imported rather than cloned: template content belongs to a document with\n // no custom element definitions, so a clone would not upgrade until\n // inserted, and a form-associated control would be filled as if it were\n // not one.\n const el = doc.importNode(template, true);\n upgradeAbsent(el, doc);\n placed(el);\n el.setAttribute(ATTR_ROW_LIVE, \"\");\n el.setAttribute(ATTR_KEY_VALUE, key);\n nameRadios(el, key);\n const entry: Entry = {\n key,\n el,\n places: placesBy(el, list.paths),\n data: {},\n placed: {},\n hidden: false,\n unsorted: false,\n };\n list.byKey.set(key, entry);\n return entry;\n}\n\n/**\n * Give each radio button of a new live row a group of its own. The browser\n * groups radio buttons by `name`, and a row template repeats one `name` in\n * every live row, so the hub follows the `name` written, or the column when\n * none is, with the row's key.\n */\nfunction nameRadios(row: Element, key: string): void {\n for (const el of below(row, `input[type=radio][${ATTR_COLUMN}]`)) {\n const name = el.getAttribute(\"name\") || el.getAttribute(ATTR_COLUMN)!;\n el.setAttribute(\"name\", `${name}-${key}`);\n }\n}\n\n/** A group's identity among its siblings: its column and its value there. */\nfunction groupId(column: string, value: unknown): string {\n return `${column}\\u0000${JSON.stringify(value ?? null)}`;\n}\n\n/** A new group, cloned from the group template for its level and stamped. */\nfunction makeGroup(\n doc: Document,\n template: HTMLTemplateElement,\n id: string,\n term: OrderTerm | undefined,\n value: unknown,\n): Group {\n // Imported rather than cloned, for the reason a live row is.\n const fragment = doc.importNode(template.content, true);\n upgradeAbsent(fragment, doc);\n const slot = slotIn(fragment)!;\n const nodes = [...fragment.childNodes];\n const heads: Places[] = [];\n const aggregates: Element[] = [];\n for (const node of nodes) {\n if (node.nodeType !== ELEMENT_NODE || node === slot) continue;\n const el = node as Element;\n placed(el);\n el.setAttribute(ATTR_GROUP_LIVE, \"\");\n if (term) el.setAttribute(ATTR_GROUP_COLUMN, term.column);\n if (value === null || value === undefined) {\n el.removeAttribute(ATTR_GROUP_VALUE);\n } else {\n el.setAttribute(ATTR_GROUP_VALUE, String(value));\n }\n // A heading's own column is filled, as a live row's is, unless it holds\n // the group's contents, which filling it would replace.\n heads.push(search(el, !el.contains(slot), SCAFFOLD_STOP));\n aggregates.push(...aggregatesIn(el, true));\n }\n return {\n id,\n nodes,\n slot,\n children: [],\n rows: [],\n heads,\n aggregates,\n hidden: false,\n };\n}\n\n/**\n * Put a sequence of items in the document in the order given, in front of\n * `end`, where `old` is the order they stood in. The run they share at the\n * start and the run they share at the end stay where they are, and what lies\n * between goes in as one fragment. An item not in `old` is new, and one in\n * `old` that is not given has gone somewhere else, or is leaving.\n */\nfunction placeRun<T>(\n old: T[],\n next: T[],\n end: ChildNode,\n nodesOf: (item: T) => ChildNode[],\n): void {\n const most = Math.min(old.length, next.length);\n let start = 0;\n while (start < most && old[start] === next[start]) start++;\n let tail = 0;\n while (\n tail < most - start &&\n old[old.length - 1 - tail] === next[next.length - 1 - tail]\n ) {\n tail++;\n }\n const middle = next.slice(start, next.length - tail);\n if (middle.length === 0) return;\n const ref = tail > 0 ? nodesOf(next[next.length - tail]!)[0]! : end;\n const fragment = ref.ownerDocument!.createDocumentFragment();\n for (const item of middle) fragment.append(...nodesOf(item));\n ref.parentNode!.insertBefore(fragment, ref);\n}\n\n/**\n * Place a list's live rows in the order given, with groups made where the\n * order breaks, kept while their run goes on, and gone where it no longer\n * does. What leaves is returned, to leave once everything is placed.\n */\nfunction arrange(\n list: List,\n doc: Document,\n order: Entry[],\n terms: OrderTerm[],\n): Group[] {\n const retired: Group[] = [];\n const visit = (parent: Group, level: number, entries: Entry[]): void => {\n if (level === list.levels.length) {\n placeRun(parent.rows, entries, parent.slot, (entry) => [entry.el]);\n parent.rows = entries;\n return;\n }\n const term = terms[level];\n const runs: { id: string; value: unknown; entries: Entry[] }[] = [];\n for (const entry of entries) {\n const value = term ? entry.placed[term.column] : null;\n const id = groupId(term?.column ?? \"\", value);\n const last = runs.at(-1);\n if (last?.id === id) last.entries.push(entry);\n else runs.push({ id, value, entries: [entry] });\n }\n // Each group already here goes on with the first run that has its id.\n const pool = new Map<string, Group[]>();\n for (const child of parent.children) {\n pool.set(child.id, [...(pool.get(child.id) ?? []), child]);\n }\n const next = runs.map(\n (run) =>\n pool.get(run.id)?.shift() ??\n makeGroup(doc, list.levels[level]!, run.id, term, run.value),\n );\n for (const left of pool.values()) retired.push(...left);\n placeRun(parent.children, next, parent.slot, (group) => group.nodes);\n parent.children = next;\n runs.forEach((run, i) => visit(next[i]!, level + 1, run.entries));\n };\n visit(list.root, 0, order);\n return retired;\n}\n\n/**\n * The rows that moved: rows whose values changed, and which now stand\n * somewhere else among the rows whose values did not. A neighbour a moved\n * row passed did not move, and neither did a row whose new values left it\n * where it was.\n */\nfunction movedRows(\n before: Entry[],\n after: Entry[],\n changed: ReadonlySet<Entry>,\n): Set<Entry> {\n const moved = new Set<Entry>();\n if (changed.size === 0) return moved;\n const stayed = new Set(before);\n // For each changed row, the nearest unchanged row on either side of it.\n const anchors = (rows: Entry[]): Map<Entry, (Entry | null)[]> => {\n const around = new Map<Entry, (Entry | null)[]>();\n const kept = rows.filter((row) => stayed.has(row));\n let last: Entry | null = null;\n for (const row of kept) {\n if (changed.has(row)) around.set(row, [last, null]);\n else last = row;\n }\n last = null;\n for (const row of kept.reverse()) {\n if (changed.has(row)) around.get(row)![1] = last;\n else last = row;\n }\n return around;\n };\n const was = anchors(before);\n for (const [row, [prior, following]] of anchors(after)) {\n const [p, f] = was.get(row)!;\n if (p !== prior || f !== following) moved.add(row);\n }\n return moved;\n}\n\n/** Mark an element as leaving: no longer live, and taking no input. */\nfunction leaving(el: Element, live: string, stamp: string): void {\n el.removeAttribute(live);\n el.removeAttribute(ATTR_ROW_REQUESTED);\n el.setAttribute(stamp, \"\");\n el.setAttribute(\"inert\", \"\");\n}\n\n/** A group whose rows are all gone, and every group inside it, leave. */\nfunction leaveGroup(group: Group, nodes: ChildNode[]): void {\n for (const child of group.children) leaveGroup(child, nodes);\n for (const node of group.nodes) {\n if (node.nodeType === ELEMENT_NODE) {\n leaving(node as Element, ATTR_GROUP_LIVE, ATTR_GROUP_LEAVING);\n }\n }\n nodes.push(...group.nodes);\n}\n\n/**\n * Take nodes out of the document once whatever their stylesheet started on\n * them has finished: at once when nothing is running. Asking for the running\n * animations computes the style, so it is asked once, after everything a\n * landing writes, and an animation keyed to the leaving stamp is among them.\n */\nfunction depart(nodes: ChildNode[]): void {\n const running: Animation[] = [];\n for (const node of nodes) {\n if (node.nodeType !== ELEMENT_NODE) continue;\n const el = node as Element & { getAnimations?: Element[\"getAnimations\"] };\n running.push(...(el.getAnimations?.({ subtree: true }) ?? []));\n }\n const go = (): void => {\n for (const node of nodes) node.remove();\n detachRemoved(nodes);\n };\n if (running.length === 0) go();\n else void Promise.allSettled(running.map((a) => a.finished)).then(go);\n}\n\n/**\n * The stamps of what happened to rows, set together: a stamp a row already\n * carries is taken off first and put back after the style has been computed\n * once for all of them, so an animation keyed to it plays again.\n */\nclass Stamps {\n private again: [Element, string][] = [];\n\n set(el: Element, name: string, on: boolean): void {\n const had = el.hasAttribute(name);\n if (had) el.removeAttribute(name);\n if (!on) return;\n if (had) this.again.push([el, name]);\n else el.setAttribute(name, \"\");\n }\n\n done(doc: Document): void {\n if (this.again.length === 0) return;\n void doc.defaultView?.getComputedStyle(this.again[0]![0]).animationName;\n for (const [el, name] of this.again) el.setAttribute(name, \"\");\n }\n}\n\n/** A decimal: the digits as one integer, and how many of them are decimals. */\ninterface Decimal {\n digits: bigint;\n scale: number;\n}\n\n/** A plain decimal number, as JSON or Postgres writes one. */\nconst DECIMAL = /^[+-]?\\d+(\\.\\d+)?$/;\n\nfunction decimalOf(value: unknown): Decimal | null {\n const text = typeof value === \"number\" ? String(value) : value;\n if (typeof text !== \"string\" || !DECIMAL.test(text.trim())) return null;\n const [whole, fraction = \"\"] = text.trim().split(\".\");\n return { digits: BigInt(whole! + fraction), scale: fraction.length };\n}\n\nfunction rescale(d: Decimal, scale: number): bigint {\n return d.digits * 10n ** BigInt(scale - d.scale);\n}\n\nfunction decimalText(digits: bigint, scale: number): string {\n const negative = digits < 0n;\n const text = (negative ? -digits : digits)\n .toString()\n .padStart(scale + 1, \"0\");\n const whole = text.slice(0, text.length - scale);\n const fraction = scale > 0 ? `.${text.slice(text.length - scale)}` : \"\";\n return `${negative ? \"-\" : \"\"}${whole}${fraction}`;\n}\n\n/** Aggregates already warned about, so a bad value is reported once. */\nconst reported = new Set<string>();\n\n/**\n * One aggregate over rows. A sum and an average are exact, carried as\n * decimals with as many places as the most precise value, and an average\n * keeps up to two places more. Null and empty values are left out, as SQL\n * leaves them out; a value that is not a number is left out and reported.\n */\nfunction aggregateOf(\n name: string,\n column: string,\n rows: Row[],\n type?: ColumnType,\n): unknown {\n if (name === ATTR_COUNT) return rows.length;\n const values = rows\n .map((row) => row[column])\n .filter((v) => v !== null && v !== undefined && v !== \"\");\n if (values.length === 0) return null;\n if (name === ATTR_MIN || name === ATTR_MAX) {\n const sign = name === ATTR_MIN ? 1 : -1;\n return values.reduce((a, b) =>\n sign * compareValues(readAs(b, type), readAs(a, type)) < 0 ? b : a,\n );\n }\n const decimals: Decimal[] = [];\n for (const value of values) {\n const d = decimalOf(value);\n if (d) decimals.push(d);\n else if (!reported.has(`${name}:${column}`)) {\n reported.add(`${name}:${column}`);\n console.warn(\n `lb-hub: ${name}=\"${column}\" left out ${JSON.stringify(value)}, ` +\n `which is not a number`,\n );\n }\n }\n if (decimals.length === 0) return null;\n const scale = Math.max(...decimals.map((d) => d.scale));\n const sum = decimals.reduce((total, d) => total + rescale(d, scale), 0n);\n if (name === ATTR_SUM) return decimalText(sum, scale);\n // An average, rounded half away from zero at two places past the values',\n // which are then dropped while they are zeros.\n const scaled = sum * 100n;\n const n = BigInt(decimals.length);\n const sign = scaled < 0n ? -1n : 1n;\n let text = decimalText((2n * scaled + sign * n) / (2n * n), scale + 2);\n for (let i = 0; i < 2 && text.endsWith(\"0\"); i++) text = text.slice(0, -1);\n return text.endsWith(\".\") ? text.slice(0, -1) : text;\n}\n\n/** Set each aggregate element from rows, each column read as its type. */\nfunction aggregate(elements: Element[], rows: Row[], types: ColumnTypes): void {\n for (const el of elements) {\n const name = AGGREGATES.find((a) => el.hasAttribute(a))!;\n const column = el.getAttribute(name) ?? \"\";\n land(el, aggregateOf(name, column, rows, types[column]));\n }\n}\n\n/** Show or hide an element for a filter, saying so only when it changes. */\nfunction hide(el: Element, hidden: boolean): void {\n if (el.hasAttribute(\"hidden\") !== hidden) el.toggleAttribute(\"hidden\", hidden);\n}\n\n/**\n * Finish a group and everything under it, from the rows it shows: each\n * heading filled from the first, as it was when last placed by the order,\n * each aggregate set from all of them, and a group hidden when a filter hides\n * every row in it. The rows it shows are returned.\n */\nfunction finish(group: Group, types: ColumnTypes): Entry[] {\n const shown =\n group.children.length > 0\n ? group.children.flatMap((child) => finish(child, types))\n : group.rows.filter((entry) => !entry.hidden);\n const rows = shown.map((entry) => entry.data);\n const hidden = rows.length === 0 && rowsUnder(group).length > 0;\n if (hidden !== group.hidden) {\n group.hidden = hidden;\n for (const node of group.nodes) {\n if (node.nodeType === ELEMENT_NODE && node !== group.slot) {\n hide(node as Element, hidden);\n }\n }\n }\n if (shown[0]) for (const head of group.heads) fill(head, shown[0].placed);\n aggregate(group.aggregates, rows, types);\n return shown;\n}\n\n/** The order to place rows by, or none when it cannot be read. */\nfunction termsOf(el: Element, order: string | undefined): OrderTerm[] {\n try {\n return parseOrder(order ?? \"\");\n } catch (err) {\n console.error(`lb-hub: <${el.localName}> ${(err as Error).message}`);\n return [];\n }\n}\n\n/** An order's terms written back as its text. */\nfunction orderText(terms: OrderTerm[]): string {\n return terms\n .map((term) => (term.descending ? ORDER_DESCENDING : \"\") + term.column)\n .join(\",\");\n}\n\n/** The user's choice in a column of `lb-choices`, when one is made. */\nfunction choiceIn(choices: Row | undefined, column: string): string | undefined {\n const value = choices?.[column];\n return value === null || value === undefined || value === \"\"\n ? undefined\n : String(value);\n}\n\n/** The columns an element's `lb-filter` names. */\nfunction filtered(el: Element): string[] {\n return (el.getAttribute(ATTR_FILTER) ?? \"\")\n .split(\",\")\n .map((column) => column.trim())\n .filter((column) => column !== \"\");\n}\n\n/**\n * The order an element's rows are placed by: the user's, from the column of\n * `lb-choices` its `lb-order` names, else the one the server declared.\n */\nfunction orderFor(el: Element, options: RowsOptions): string | undefined {\n const column = el.getAttribute(ATTR_ORDER);\n const chosen = column ? choiceIn(options.choices, column) : undefined;\n return chosen ?? options.order;\n}\n\n/**\n * Whether a row passes every filter the user chose for the element: for each\n * column its `lb-filter` names, the filter in the column of `lb-choices` of\n * the same name.\n */\nfunction filterFor(\n el: Element,\n choices: Row | undefined,\n types: ColumnTypes,\n): (row: Row) => boolean {\n const filters: [string, FilterTerm[]][] = [];\n for (const column of filtered(el)) {\n const text = choiceIn(choices, column);\n const terms = text === undefined ? [] : parseFilter(text);\n if (terms.length > 0) filters.push([column, terms]);\n }\n return (row) =>\n filters.every(([column, terms]) => passes(row[column], terms, types[column]));\n}\n\n/**\n * Hide or show a row for a filter. A selection hidden is a selection\n * abandoned, as it is for `lb-show`.\n */\nfunction filterRow(entry: Entry, hidden: boolean): void {\n if (entry.hidden === hidden) return;\n entry.hidden = hidden;\n hide(entry.el, hidden);\n if (!hidden) return;\n for (const box of [entry.el, ...entry.el.querySelectorAll(`[${ATTR_SELECT}]`)]) {\n if (box.hasAttribute(ATTR_SELECT)) select(box, false);\n }\n}\n\n/** Whether a row's columns as landed differ from what they were. */\nfunction differs(before: Row, after: Row): boolean {\n return Object.entries(after).some(\n ([column, value]) => !same(before[column], value),\n );\n}\n\n/** How a list of rows lands: in what order, and whether a request asked. */\nexport interface RowsOptions {\n /** The order the server declared, as an order's text. */\n order?: string;\n /** The column types the server declared. */\n types?: ColumnTypes;\n /** The user's choices: the row of `lb-choices`. */\n choices?: Row;\n /** The landing answers a request from this page. */\n requested?: boolean;\n /**\n * The request it answers was sent from inside this list, where the user\n * is working, so the rows already showing stay where they stand.\n */\n held?: boolean;\n /**\n * Fill every row, changed or not: the element has not been filled for\n * real before, so what its rows show cannot be trusted.\n */\n refill?: boolean;\n}\n\n/**\n * Land rows through a row template.\n *\n * Two loops do the work, on rows in no document. The creation loop makes a\n * live row for each key not yet shown, with its key and no values. The\n * landing loop lands each arriving row's values on its live row, as a `row`\n * lands, passing over a column that already shows its value. Then every live\n * row is placed by the order in one fragment, and the browser styles once.\n *\n * All rows decide membership: a row whose key did not arrive leaves. A patch\n * disturbs only what it names — a row it did not mention keeps its contents,\n * and keeps its place unless a row the patch named now sorts around it.\n *\n * With no order, all rows show in the order they arrived, and a patch's new\n * rows go last. A row that stands where it stood is not touched, so landing\n * the same rows again moves nothing. A row a filter the user chose does not\n * pass is `hidden`.\n *\n * A landing `held` for the user working in the list moves nothing already\n * showing, whole or a patch. A row it changed or created that the order\n * would put elsewhere, or that the filter would hide, stays and is stamped\n * unsorted until the rows are next placed by the order.\n */\nexport function applyRows(\n el: Element,\n template: HTMLTemplateElement,\n keyColumn: string,\n result: RowsResult,\n options: RowsOptions = {},\n): void {\n const list = listFor(el, template);\n if (!list) return;\n const doc = el.ownerDocument;\n const host = el as Element & HubLifecycle;\n const whole = !isPatch(result);\n const shown = rowsUnder(list.root);\n const focused = focusedRow(list, doc);\n\n // What a request did is said by this landing alone.\n for (const entry of shown) entry.el.removeAttribute(ATTR_ROW_REQUESTED);\n\n // The rows arriving, by key.\n const arriving = new Map<string, Row>();\n for (const data of whole ? result : (result.rows ?? [])) {\n if (data[keyColumn] === undefined) {\n console.error(\n `lb-hub: a row for <${el.localName}> has no '${keyColumn}' column`,\n );\n continue;\n }\n // The key is stored on the row as an attribute and read back from\n // there, so it is compared as the string the attribute holds.\n const key = String(data[keyColumn]);\n if (arriving.has(key)) {\n console.error(\n `lb-hub: two rows for <${el.localName}> have the key '${key}'; ` +\n `the last one shows`,\n );\n arriving.delete(key);\n }\n arriving.set(key, data);\n }\n const dropped = whole\n ? []\n : (result.drop ?? []).map((key) => String(key));\n for (const key of dropped) arriving.delete(key);\n const gone = whole\n ? shown.filter((entry) => !arriving.has(entry.key))\n : dropped.flatMap((key) => list.byKey.get(key) ?? []);\n\n // The creation loop.\n const created = new Set<Entry>();\n for (const key of arriving.keys()) {\n if (!list.byKey.has(key)) created.add(create(list, doc, key));\n }\n\n // The landing loop. A row whose values arrive as it already shows them is\n // left as it is, so a control the user has typed into and not committed\n // keeps what was typed. A row whose values changed is filled whole.\n const changed = new Set<Entry>();\n for (const [key, data] of arriving) {\n const entry = list.byKey.get(key)!;\n const fresh = created.has(entry);\n if (!fresh && differs(entry.data, data)) changed.add(entry);\n if (fresh || options.refill || changed.has(entry)) fill(entry.places, data);\n entry.data = { ...entry.data, ...data };\n // A link reads the whole row, which a patch may send only part of.\n if (fresh || options.refill || changed.has(entry)) {\n link(entry.places, entry.data);\n }\n }\n\n for (const entry of gone) {\n list.byKey.delete(entry.key);\n leaving(entry.el, ATTR_ROW_LIVE, ATTR_ROW_LEAVING);\n }\n\n // The order the rows arrived in for all rows, and for a patch the order\n // already showing with what is new after it. A sort keeps rows that\n // compare equal in this order.\n const stayed = shown.filter((entry) => list.byKey.get(entry.key) === entry);\n const terms = termsOf(el, orderFor(el, options));\n if (list.levels.length > terms.length && !warned.has(el)) {\n warned.add(el);\n console.warn(\n `lb-hub: <${el.localName}> has ${list.levels.length} group ` +\n `template(s) and an order of ${terms.length} term(s); a level with ` +\n `no term shows its rows as one group`,\n );\n }\n const sort = (entries: Entry[]): Entry[] =>\n terms.length === 0\n ? entries\n : entries\n .map((entry, i) => ({ entry, i }))\n .sort(\n (a, b) =>\n compareRows(a.entry.data, b.entry.data, terms, options.types) ||\n a.i - b.i,\n )\n .map(({ entry }) => entry);\n const passing = filterFor(el, options.choices, options.types ?? {});\n\n let order: Entry[];\n if (options.held) {\n // The user is working in this list: what already shows stays where it\n // stands, and what is new goes last in the group it belongs to.\n for (const entry of created) entry.placed = entry.data;\n order = heldOrder(stayed, created, groupTerms(list, terms));\n const touched = new Set([...changed, ...created]);\n for (const entry of order) if (entry.unsorted) touched.add(entry);\n const out = movedRows(order, sort(order), touched);\n for (const entry of order) {\n const fails = !passing(entry.data);\n // A row the user just changed does not vanish from under them.\n const kept = touched.has(entry) && !entry.hidden;\n filterRow(entry, fails && !kept);\n // A row stands in the group it was placed in until it is placed again.\n const moves = regrouped(entry, list, terms);\n if (!moves) entry.placed = entry.data;\n entry.unsorted = out.has(entry) || (kept && fails) || moves;\n }\n } else {\n order = sort(\n whole\n ? [...arriving.keys()].map((key) => list.byKey.get(key)!)\n : [...stayed, ...created],\n );\n for (const entry of order) {\n entry.placed = entry.data;\n entry.unsorted = false;\n filterRow(entry, !passing(entry.data));\n }\n }\n\n const moved = movedRows(stayed, order, changed);\n const retired = arrange(list, doc, order, terms);\n refocus(list, focused);\n\n const stamps = new Stamps();\n for (const key of arriving.keys()) {\n const entry = list.byKey.get(key)!;\n const fresh = created.has(entry);\n const went = moved.has(entry);\n stamps.set(entry.el, ATTR_ROW_CREATED, fresh);\n stamps.set(entry.el, ATTR_ROW_CHANGED, changed.has(entry));\n stamps.set(entry.el, ATTR_ROW_MOVED, went);\n const requested = went\n ? REQUESTED_MOVED\n : fresh\n ? REQUESTED_CREATED\n : changed.has(entry)\n ? REQUESTED_CHANGED\n : null;\n if (options.requested && requested) {\n entry.el.setAttribute(ATTR_ROW_REQUESTED, requested);\n }\n }\n stamps.done(doc);\n let unsorted = 0;\n for (const entry of order) {\n if (entry.el.hasAttribute(ATTR_ROW_UNSORTED) !== entry.unsorted) {\n entry.el.toggleAttribute(ATTR_ROW_UNSORTED, entry.unsorted);\n }\n if (entry.unsorted) unsorted++;\n }\n\n const rows = finish(list.root, options.types ?? {});\n // Counted from what the hub holds, which is what the rows show.\n setStamp(el, ATTR_QUERY_ROW_COUNT, String(rows.length));\n setStamp(el, ATTR_QUERY_UNSORTED_COUNT, String(unsorted));\n if (terms.length === 0) el.removeAttribute(ATTR_QUERY_ORDER);\n else setStamp(el, ATTR_QUERY_ORDER, orderText(terms));\n\n const departing: ChildNode[] = gone.map((entry) => entry.el);\n for (const group of retired) leaveGroup(group, departing);\n if (departing.length > 0) depart(departing);\n\n host.lbRowsLanded?.();\n}\n\n/** The order's terms a list's groups break on, outermost first. */\nfunction groupTerms(list: List, terms: OrderTerm[]): OrderTerm[] {\n return terms.slice(0, list.levels.length);\n}\n\n/** The group a row's columns put it in, as one string. */\nfunction groupOf(row: Row, terms: OrderTerm[]): string {\n return terms.map((term) => groupId(term.column, row[term.column])).join(\"\\u0001\");\n}\n\n/** Whether a row's columns now put it in another group than it stands in. */\nfunction regrouped(entry: Entry, list: List, terms: OrderTerm[]): boolean {\n const by = groupTerms(list, terms);\n return groupOf(entry.data, by) !== groupOf(entry.placed, by);\n}\n\n/**\n * The rows of a list the user is working in: those showing where they\n * stand, and each new one after the last row of its group, or last of all\n * when its group shows no row.\n */\nfunction heldOrder(\n stayed: Entry[],\n created: Iterable<Entry>,\n by: OrderTerm[],\n): Entry[] {\n const order = [...stayed];\n for (const entry of created) {\n const group = groupOf(entry.placed, by);\n let at = order.length;\n if (by.length > 0) {\n while (at > 0 && groupOf(order[at - 1]!.placed, by) !== group) at--;\n if (at === 0) at = order.length;\n }\n order.splice(at, 0, entry);\n }\n return order;\n}\n\n/** The live row of a list holding the focus, and the element that has it. */\ninterface Focused {\n entry: Entry;\n active: HTMLElement;\n}\n\nfunction focusedRow(list: List, doc: Document): Focused | null {\n const active = doc.activeElement as HTMLElement | null;\n const row = active?.closest(LIVE_ROW);\n if (!active || !row) return null;\n const entry = list.byKey.get(row.getAttribute(ATTR_KEY_VALUE)!);\n return entry?.el === row ? { entry, active } : null;\n}\n\n/**\n * Keep the focus where the user had it once rows are placed: on the same\n * element, scrolled into view, when its row still shows; otherwise on the\n * first element the user can operate in the first row showing.\n */\nfunction refocus(list: List, focused: Focused | null): void {\n if (!focused) return;\n const { entry, active } = focused;\n const doc = active.ownerDocument;\n if (list.byKey.get(entry.key) === entry && !entry.hidden) {\n if (doc.activeElement === active || !active.isConnected) return;\n active.focus({ preventScroll: true });\n active.scrollIntoView?.({ block: \"nearest\" });\n return;\n }\n const first = rowsUnder(list.root).find((row) => !row.hidden);\n if (first) focusIn(first.el);\n}\n\n/** Land one response item on one element that names its query. */\nfunction landItem(\n el: Element,\n item: ResponseItem,\n options: RowsOptions = {},\n): void {\n const template = lists.get(el)?.top ?? templateIn(el);\n if (item.kind === KIND_ROW) {\n const row = item.row;\n if (template) {\n applyRows(el, template, item.key, row ? [row] : [], options);\n return;\n }\n // No row: every column the element shows lands null, and the element\n // names no row.\n if (!row) {\n applyRow(el, blankRow(el));\n el.removeAttribute(ATTR_KEY_VALUE);\n return;\n }\n applyRow(el, row);\n const key = row[item.key];\n if (key !== undefined && key !== null) {\n setStamp(el, ATTR_KEY_VALUE, String(key));\n }\n return;\n }\n // A `rows` query with no row template lands nothing: an insert form names\n // the query it adds to, and shows none of its rows.\n if (!template) return;\n const result = item.patch ?? item.rows ?? [];\n applyRows(el, template, item.key, result, options);\n}\n\n/**\n * What landing keeps for one root: the last whole answer to each query, and\n * every element an answer has landed on. The user's choices are among the\n * answers, as the answer to `lb-choices`.\n */\ninterface Kept {\n answers: Map<string, ResponseItem>;\n landed: WeakSet<Element>;\n}\n\nconst kept = new WeakMap<ParentNode, Kept>();\n\nfunction keptFor(root: ParentNode): Kept {\n let found = kept.get(root);\n if (!found) {\n found = { answers: new Map(), landed: new WeakSet() };\n kept.set(root, found);\n }\n return found;\n}\n\n/** The answer kept for a query, as all of its rows. */\nexport function keptAnswer(\n root: ParentNode,\n query: string,\n): ResponseItem | undefined {\n return kept.get(root)?.answers.get(query);\n}\n\n/**\n * How a query's rows land: by its order, its column types, and the user's\n * choices. The order and types are the kept answer's, since only the answer\n * that loads the page carries them.\n */\nfunction rowsOptions(state: Kept, item: ResponseItem): RowsOptions {\n const declared = state.answers.get(item.query) ?? item;\n return {\n order: declared.order,\n types: declared.types,\n choices: state.answers.get(CHOICES_QUERY)?.row ?? undefined,\n };\n}\n\n/**\n * Drop what landing kept for a root. The hub calls it when it replaces the\n * page, since another page's query of the same name is another query, and\n * the user's choices were for the page they were made on.\n */\nexport function forget(root: ParentNode): void {\n kept.delete(root);\n}\n\n/**\n * All rows after a patch, as the elements it landed on now show them: a row\n * it names takes the columns it sends and keeps its place, a new one goes\n * last, and a dropped one goes.\n */\nfunction patched(rows: Row[], key: string, patch: Patch): Row[] {\n const byKey = new Map(rows.map((row) => [String(row[key]), row]));\n for (const row of patch.rows ?? []) {\n const k = String(row[key]);\n byKey.set(k, { ...byKey.get(k), ...row });\n }\n for (const k of patch.drop ?? []) byKey.delete(String(k));\n return [...byKey.values()];\n}\n\n/**\n * Keep an answer as all of the query's rows. A patch is applied to the\n * answer already kept; with none, it is not the whole of anything, and\n * nothing is kept.\n *\n * A query's order and column types arrive with the answer that loads the\n * page, and every answer after it, all rows or a patch, keeps them.\n */\nfunction keep(answers: Map<string, ResponseItem>, item: ResponseItem): void {\n const before = answers.get(item.query);\n const declared = {\n ...(before?.order !== undefined && { order: before.order }),\n ...(before?.types !== undefined && { types: before.types }),\n };\n if (!item.patch) {\n answers.set(item.query, { ...declared, ...item });\n return;\n }\n if (!before) return;\n const { patch: _, ...whole } = item;\n answers.set(item.query, {\n ...declared,\n ...whole,\n rows: patched(before.rows ?? [], item.key, item.patch),\n });\n}\n\n/** The columns of `lb-choices` an answer to it changes. */\nfunction chosen(state: Kept, item: ResponseItem): Set<string> {\n const before = state.answers.get(CHOICES_QUERY)?.row ?? {};\n const after = item.row ?? {};\n const columns = new Set<string>();\n for (const column of new Set([...Object.keys(before), ...Object.keys(after)])) {\n if (choiceIn(before, column) !== choiceIn(after, column)) columns.add(column);\n }\n return columns;\n}\n\n/** Whether an element's order or filter reads any of the columns. */\nfunction reads(el: Element, columns: Set<string>): boolean {\n const order = el.getAttribute(ATTR_ORDER);\n return (\n (order !== null && columns.has(order)) ||\n filtered(el).some((column) => columns.has(column))\n );\n}\n\n/**\n * Place again the rows of every element whose order or filter reads a choice\n * that changed. Each lands its query's kept answer again, whole, so it shows\n * what a round trip carrying the choice would have, and the server is asked\n * for nothing.\n */\nfunction rechoose(root: ParentNode, state: Kept, columns: Set<string>): void {\n for (const [query, item] of state.answers) {\n if (item.kind === KIND_ROW) continue;\n for (const el of everywhere(root, `[${ATTR_QUERY}=\"${query}\"]`)) {\n if (!state.landed.has(el) || el.closest(LEAVING)) continue;\n if (reads(el, columns)) landItem(el, item, rowsOptions(state, item));\n }\n }\n}\n\n/**\n * Fill every element that names a kept query and has had nothing land on it.\n * Filling one can build more — a live row holding a picker of its own — so\n * it goes round until a pass finds nothing new.\n */\nfunction fillArrivals(root: ParentNode, state: Kept): void {\n const { answers, landed } = state;\n for (let filled = true; filled;) {\n filled = false;\n for (const [query, item] of answers) {\n for (const el of everywhere(root, `[${ATTR_QUERY}=\"${query}\"]`)) {\n if (landed.has(el) || el.closest(LEAVING)) continue;\n landed.add(el);\n landItem(el, item, { ...rowsOptions(state, item), refill: true });\n filled = true;\n }\n }\n }\n}\n\n/** How response items land. */\nexport interface LandOptions {\n /**\n * Queries that may have nowhere to land without a warning. A query the hub\n * serves, such as `lb-url`, is always one: it lands wherever a chrome or\n * page names it, and nowhere otherwise.\n */\n quiet?: readonly string[];\n /** The items answer a request from this page. */\n requested?: boolean;\n /**\n * The element that sent the request. The list it was sent from inside\n * keeps its rows where they stand.\n */\n origin?: Element;\n}\n\n/**\n * Whether a request from `origin` was sent from inside `el`'s list: `el` is\n * the nearest element carrying `lb-query` around it.\n */\nfunction sentFrom(el: Element, origin: Element | undefined): boolean {\n return origin?.parentElement?.closest(`[${ATTR_QUERY}]`) === el;\n}\n\n/**\n * Land response items. Every answer arrives through here, and is kept for\n * `root`, so that what arrives after it is filled from it — see forget().\n * An answer to `lb-choices` places again the rows its choices change. Once\n * everything has landed, each custom element placed since the last landing\n * is attached.\n */\nexport function applyResponse(\n root: ParentNode,\n items: ResponseItem[],\n options: LandOptions = {},\n): void {\n const state = keptFor(root);\n for (const item of items) {\n const choices =\n item.query === CHOICES_QUERY ? chosen(state, item) : new Set<string>();\n keep(state.answers, item);\n const targets = everywhere(root, `[${ATTR_QUERY}=\"${item.query}\"]`).filter(\n (el) => !el.closest(LEAVING),\n );\n if (\n targets.length === 0 &&\n !item.query.startsWith(LB_RESERVED_PREFIX) &&\n !options.quiet?.includes(item.query)\n ) {\n console.warn(`lb-hub: nothing names '${item.query}', skipping`);\n }\n for (const el of targets) {\n state.landed.add(el);\n landItem(el, item, {\n ...rowsOptions(state, item),\n requested: options.requested,\n held: sentFrom(el, options.origin),\n });\n }\n if (choices.size > 0) rechoose(root, state, choices);\n }\n fillArrivals(root, state);\n attachPlaced();\n}\n\n/**\n * Place an element's rows by the order again, from the answer kept for its\n * query, with no round trip: what the user asks for once an edit has left\n * rows out of order. False when the element shows no rows the hub holds.\n */\nexport function resort(root: ParentNode, el: Element): boolean {\n const state = kept.get(root);\n const item = state?.answers.get(el.getAttribute(ATTR_QUERY) ?? \"\");\n if (!state || !item || item.kind === KIND_ROW || !state.landed.has(el)) {\n return false;\n }\n landItem(el, item, rowsOptions(state, item));\n return true;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"lb-hub.browser.d.ts","sourceRoot":"","sources":["../../hub/lb-hub.browser.ts"],"names":[],"mappings":"AA0EA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"lb-hub.browser.d.ts","sourceRoot":"","sources":["../../hub/lb-hub.browser.ts"],"names":[],"mappings":"AA4EA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC"}
@@ -1,7 +1,7 @@
1
1
  /// <reference lib="dom" />
2
- import { ATTR_COLUMN, ATTR_COLUMN_VALUE, ATTR_KEY_VALUE, ATTR_PAGE, ATTR_PAGE_TITLE, ATTR_QUERY, ATTR_REQUEST, ATTR_REQUEST_ERROR, ATTR_REQUEST_PENDING, ATTR_REQUEST_REFUSED, ATTR_ROW_EDITING, ATTR_SELECT, ATTR_URL_LINK, ATTR_URL_PUSH, ATTR_URL_UNKNOWN, CHOICES_QUERY, COMMAND_EDIT, COMMAND_NEW, COMMAND_RELEASE, HUB_TAG_NAME, KIND_ROW, LB_DONE_EVENT_NAME, LB_ENDPOINT, LB_EVENT_NAME, LB_REFUSAL_STATUS, LB_REQUEST_TIMEOUT_MS, LB_COMMAND_PREFIX, LB_RESERVED_PREFIX, LIVE_ROW, REQUEST_ROW_DELETE, REQUEST_ROW_INSERT, REQUEST_ROW_UPDATE, URL_COLUMN_PAGE_LABEL, URL_COLUMN_PAGE_UNKNOWN, URL_COLUMN_PATH, URL_QUERY, } from "../core/lb-constants.js";
2
+ import { ATTR_COLUMN, ATTR_COLUMN_VALUE, ATTR_KEY_VALUE, ATTR_PAGE, ATTR_PAGE_TITLE, ATTR_QUERY, ATTR_REQUEST, ATTR_REQUEST_ERROR, ATTR_REQUEST_PENDING, ATTR_REQUEST_REFUSED, ATTR_ROW_EDITING, ATTR_SELECT, ATTR_URL_LINK, ATTR_URL_PUSH, ATTR_URL_UNKNOWN, CHOICES_QUERY, COMMAND_EDIT, COMMAND_NEW, COMMAND_RELEASE, COMMAND_SORT, HUB_TAG_NAME, KIND_ROW, LB_DONE_EVENT_NAME, LB_ENDPOINT, LB_EVENT_NAME, LB_REFUSAL_STATUS, LB_REQUEST_TIMEOUT_MS, LB_COMMAND_PREFIX, LB_RESERVED_PREFIX, LIVE_ROW, REQUEST_ROW_DELETE, REQUEST_ROW_INSERT, REQUEST_ROW_UPDATE, URL_COLUMN_PAGE_LABEL, URL_COLUMN_PAGE_UNKNOWN, URL_COLUMN_PATH, URL_QUERY, } from "../core/lb-constants.js";
3
3
  import { isRowRequest, nextLocation, pageNameFor, } from "../core/lb-types.js";
4
- import { applyResponse, applyRow, blankRow, focusIn, gatherInto, select, forget, isControl, isFormAssociated, keptAnswer, within, } from "./lb-apply.js";
4
+ import { applyResponse, applyRow, blankRow, focusIn, gatherInto, select, forget, isControl, isFormAssociated, keptAnswer, resort, within, } from "./lb-apply.js";
5
5
  import { attachPlaced, detachRemoved, placed, requestDone, upgradeAbsent, } from "./lb-lifecycle.js";
6
6
  export { applyResponse, applyRow } from "./lb-apply.js";
7
7
  /** What each request Loadbare provides cannot be issued without. */
@@ -654,13 +654,17 @@ class LbHub extends HTMLElement {
654
654
  this.moveTo(row, true);
655
655
  void this.navigate();
656
656
  });
657
- // A button points a form with HTML's own commandfor and command. The
658
- // command event goes to the form and does not bubble, so it is heard on
659
- // the way down.
657
+ // A button points a form with HTML's own commandfor and command, or asks
658
+ // a list to sort. The command event goes to the element it names and
659
+ // does not bubble, so it is heard on the way down.
660
660
  this.addEventListener("command", (e) => {
661
661
  const { command, source } = e;
662
662
  if (!command?.startsWith(LB_COMMAND_PREFIX))
663
663
  return;
664
+ if (command === COMMAND_SORT) {
665
+ this.sort(e.target);
666
+ return;
667
+ }
664
668
  const form = e.target;
665
669
  if (form.localName !== "form" || !form.hasAttribute(ATTR_QUERY)) {
666
670
  console.error(`lb-hub: '${command}' is for a <form> carrying ${ATTR_QUERY}, ` +
@@ -719,6 +723,22 @@ class LbHub extends HTMLElement {
719
723
  `names no command Loadbare provides, ignoring`);
720
724
  }
721
725
  }
726
+ /**
727
+ * Place a list's rows by the order again, from the rows the hub holds: no
728
+ * round trip, since the user asks only to see what they already have in
729
+ * order.
730
+ */
731
+ sort(el) {
732
+ if (!el.hasAttribute(ATTR_QUERY)) {
733
+ console.error(`lb-hub: '${COMMAND_SORT}' is for an element carrying ` +
734
+ `${ATTR_QUERY}, not <${el.localName}>, ignoring`, el);
735
+ return;
736
+ }
737
+ if (!resort(this, el)) {
738
+ console.error(`lb-hub: '${COMMAND_SORT}' is for an element showing rows the hub ` +
739
+ `holds, ignoring`, el);
740
+ }
741
+ }
722
742
  /**
723
743
  * Send a request to the server and land its answer. An answer naming
724
744
  * `lb-url` moves the URL first; the server has already loaded the page
@@ -745,7 +765,7 @@ class LbHub extends HTMLElement {
745
765
  const load = items.filter((item) => item !== url);
746
766
  landed = load;
747
767
  if (url === undefined) {
748
- applyResponse(this, load, { requested: true });
768
+ applyResponse(this, load, { requested: true, origin });
749
769
  }
750
770
  else
751
771
  landed = await this.follow(url, load, origin);