@dev-blinq/cucumber-js 1.0.124 → 1.0.125-stage

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":"report_generator.js","sourceRoot":"","sources":["../../../src/formatter/helpers/report_generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6DAA8C;AAC9C,4CAAmB;AACnB,gDAAuB;AACvB,qDAAmD;AACnD,uCAAwC;AACxC,0CAA0C;AAC1C,8DAAoC;AAWpC,MAAM,GAAG,GACP,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,KAAK;IAClC,CAAC,CAAC,mCAAmC;IACrC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,OAAO;QACtC,CAAC,CAAC,gCAAgC;QAClC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,OAAO;YACtC,CAAC,CAAC,qCAAqC;YACvC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,MAAM;gBACrC,CAAC,CAAC,+BAA+B;gBACjC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc;oBAC3B,CAAC,CAAC,+BAA+B;oBACjC,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,WAAW,CAAA;AAEtD,MAAM,kBAAkB,GAAG,MAAA,OAAO,CAAC,GAAG,CAAC,kBAAkB,mCAAI,GAAG,CAAA;AAChE,MAAM,UAAU,GAAG,EAAE,CAAA;AACrB,MAAM,WAAW,GAAG,CAAC,CAAA;AACrB,MAAM,oBAAoB,GACxB,MAAA,OAAO,CAAC,GAAG,CAAC,KAAK,mCAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAA;AA+HvD,MAAqB,eAAe;IAApC;QACU,WAAM,GAAe;YAC3B,MAAM,EAAE;gBACN,MAAM,EAAE,SAAS;aAClB;YACD,SAAS,EAAE,EAAwB;YACnC,GAAG,EAAE;gBACH,IAAI,EAAE,EAAE;gBACR,OAAO,EAAE,EAAE;aACZ;SACF,CAAA;QACO,uBAAkB,GAAG,IAAI,GAAG,EAAoC,CAAA;QAChE,YAAO,GAAG,IAAI,GAAG,EAAyB,CAAA;QAC1C,cAAS,GAAG,IAAI,GAAG,EAA2B,CAAA;QAC9C,gBAAW,GAAG,IAAI,GAAG,EAA6B,CAAA;QAClD,gBAAW,GAAG,IAAI,GAAG,EAA6B,CAAA;QAClD,kBAAa,GAAG,IAAI,GAAG,EAAoB,CAAA;QAC3C,sBAAiB,GAAG,IAAI,GAAG,EAA4B,CAAA;QACvD,8BAAyB,GAAG,IAAI,GAAG,EAAkB,CAAA;QACrD,SAAI,GAAa,EAAE,CAAA;QACnB,eAAU,GAAU,EAAE,CAAA;QACtB,aAAQ,GAAa,EAAE,CAAA;QACvB,oBAAe,GAAU,EAAE,CAAA;QAC3B,YAAO,GAAG,EAAE,CAAA;QACZ,iBAAY,GAAG,EAAE,CAAA;QACjB,wBAAmB,GAAG,EAAE,CAAA;QACxB,gBAAW,GAAa,EAAE,CAAA;QAC1B,sBAAiB,GAAY,KAAK,CAAA,CAAC,yCAAyC;QACpF,iBAAY,GAAkB,IAAI,CAAA;QAC1B,kBAAa,GAAG,IAAI,iCAAgB,CAC1C,kBAAkB,EAClB,oBAAoB,CACrB,CAAA;QACO,oBAAe,GAAkB,IAAI,CAAA;QAmoB5B,eAAU,GAAG,CAAC,CAAA;IA8GjC,CAAC;IA/uBC,KAAK,CAAC,aAAa,CACjB,QAAqD,EACrD,OAAgB;QAEhB,IAAI,QAAQ,CAAC,IAAI,IAAI,SAAS,IAAI,QAAQ,CAAC,IAAI,EAAE;YAC/C,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAA;SACrC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAA4B,CAAA;QAChE,QAAQ,IAAI,EAAE;YACZ,wBAAwB;YACxB,0BAA0B;YAC1B,KAAK,YAAY,CAAC,CAAC;gBACjB,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;gBACjC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAA;gBACjC,MAAK;aACN;YACD,KAAK,iBAAiB,CAAC,CAAC;gBACtB,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;gBAC1B,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAA;gBAC3B,MAAK;aACN;YACD,KAAK,QAAQ,CAAC,CAAC;gBACb,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;gBAC7B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;gBACrB,MAAK;aACN;YACD,kCAAkC;YAClC,uCAAuC;YACvC,KAAK,gBAAgB,CAAC,CAAC;gBACrB,MAAM,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;gBACrC,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAA;gBACrC,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;gBAChD,MAAK;aACN;YACD,KAAK,UAAU,CAAC,CAAC;gBACf,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;gBAE/B,6BAA6B;gBAC7B,IAAI,CAAC,WAAW,GAAG,EAAE,CAAA;gBAErB,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;oBAC3B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAA;oBAE7B,oEAAoE;oBACpE,MAAM,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAA;oBAChD,MAAM,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAA;oBAEhD,gCAAgC;oBAChC,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,KAAU,EAAE,GAAG,IAAW,EAAE,EAAE;wBACpD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;wBACvC,OAAO,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,CAAA;oBACjE,CAAC,CAAA;oBAED,gCAAgC;oBAChC,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,KAAU,EAAE,GAAG,IAAW,EAAE,EAAE;wBACpD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;wBACvC,OAAO,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,CAAA;oBACjE,CAAC,CAAA;iBACF;gBAED,6BAA6B;gBAC7B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;gBAEzB,MAAK;aACN;YACD,KAAK,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,eAAe,GAClB,QAAQ,CAAC,IAAI,CAGd,CAAC,eAAe,CAAA;gBACjB,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;gBACtC,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAA;gBACvC,MAAK;aACN;YACD,KAAK,iBAAiB,CAAC,CAAC;gBACtB,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;gBACtC,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAA;gBACvC,MAAK;aACN;YACD,KAAK,YAAY,CAAC,CAAC;gBACjB,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;gBACjC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAA;gBAC7B,MAAK;aACN;YACD,KAAK,kBAAkB,CAAC,CAAC;gBACvB,MAAM,gBAAgB,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;gBACvC,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAA;gBACzC,MAAK;aACN;YACD,KAAK,kBAAkB,CAAC,CAAC;gBACvB,MAAM,gBAAgB,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;gBACvC,IAAI,YAAY,GAAG,IAAI,CAAC,eAAe,CAAA;gBAEvC,IAAI,OAAO,EAAE;oBACX,YAAY,GAAG,OAAO,CAAA;iBACvB;gBAED,qCAAqC;gBACrC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAC1C,gBAAgB,EAChB,YAAY,CACb,CAAA;gBACD,OAAO,MAAM,CAAA;aACd;YACD,sCAAsC;YACtC,KAAK,iBAAiB,CAAC,CAAC;gBACtB,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;gBACtC,MAAM,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAA;gBAC7C,MAAK;aACN;YAED,kCAAkC;YAClC,0CAA0C;SAC3C;IACH,CAAC;IACD,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IACO,gBAAgB,CAAC,UAA+B;QACtD,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,CAAA;QAC9B,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA;QACtC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG;YACnB,MAAM,EAAE,QAAQ;YAChB,SAAS,EAAE,SAAS;YACpB,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE,OAAO;SACjB,CAAA;IACH,CAAC;IAEO,iBAAiB,CAAC,GAA6B;QACrD,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QACzC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACrC,IAAI,KAAK,CAAC,QAAQ,EAAE;gBAClB,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;oBACpC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;gBACjC,CAAC,CAAC,CAAA;aACH;iBAAM,IAAI,KAAK,CAAC,UAAU,EAAE;gBAC3B,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;oBACtC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;gBACjC,CAAC,CAAC,CAAA;aACH;iBAAM,IAAI,KAAK,CAAC,IAAI,EAAE;gBACrB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;oBACpC,IAAI,KAAK,CAAC,QAAQ,EAAE;wBAClB,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;4BACpC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;wBACjC,CAAC,CAAC,CAAA;qBACH;yBAAM,IAAI,KAAK,CAAC,UAAU,EAAE;wBAC3B,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;4BACtC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;wBACjC,CAAC,CAAC,CAAA;qBACH;gBACH,CAAC,CAAC,CAAA;aACH;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IACO,QAAQ,CAAC,MAAuB;QACtC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IACvC,CAAC;IACO,YAAY,CAAC,SAA6B;QAChD,OAAO,SAAS,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,KAAK,GAAG,OAAO,CAAA;IAC7D,CAAC;IACO,gBAAgB,CAAC,cAAuC;QAC9D,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG;YACnB,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,SAAS,CAAC;SACvD,CAAA;IACH,CAAC;IACO,UAAU,CAAC,QAA2B;QAC5C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAA;QAC3C,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YACtC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAA;QAC7C,CAAC,CAAC,CAAA;IACJ,CAAC;IACO,aAAa,CAAC,GAA6B,EAAE,UAAkB;QACrE,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE;YACxC,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE,KAAK,UAAU,EAAE;gBACtD,OAAO,KAAK,CAAC,QAAQ,CAAA;aACtB;YACD,IAAI,KAAK,CAAC,IAAI,EAAE;gBACd,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE;oBAC1C,IAAI,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,UAAU,EAAE;wBAC5D,OAAO,QAAQ,CAAC,QAAQ,CAAA;qBACzB;iBACF;aACF;SACF;QACD,MAAM,IAAI,KAAK,CAAC,aAAa,UAAU,aAAa,CAAC,CAAA;IACvD,CAAC;IACO,cAAc,CAAC,QAA2B,EAAE,SAAiB;QACnE,MAAM,UAAU,GAA2B,EAAE,CAAA;QAC7C,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,UAAU,CAAA;QACrD,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,QAAQ,EAAE;YACxC,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,SAAS,EAAE;gBACzC,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS,EAAE;oBAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;wBAC1D,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;4BAC7C,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;qBAC1B;iBACF;aACF;SACF;QACD,OAAO,UAAU,CAAA;IACnB,CAAC;IACO,iBAAiB,CAAC,eAAyC;QACjE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,eAAe,CAAA;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QACjD,IAAI,QAAQ,KAAK,SAAS;YACxB,MAAM,IAAI,KAAK,CAAC,oBAAoB,UAAU,YAAY,CAAC,CAAA;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QACpD,IAAI,MAAM,KAAK,SAAS;YACtB,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,CAAC,QAAQ,YAAY,CAAC,CAAA;QAElE,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACnD,IAAI,GAAG,KAAK,SAAS;YACnB,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,CAAC,GAAG,YAAY,CAAC,CAAA;QACrE,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAA;QAEpC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;QACpD,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAA;QAClC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;YACnD,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;SAClD;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;QACtE,OAAO,CAAC,GAAG,CACT,oBAAoB,YAAY,cAAc,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAC9E,UAAU,CACX,sBAAsB,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;OACzD,CACF,CAAA;QACD,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAChC,UAAU,EACV,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CACnD,CAAA;QACD,MAAM,KAAK,GAAe,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;YACxD,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;YACvC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YACrC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE;gBACpC,IAAI,EAAE,IAAI,CAAC,WAAW;gBACtB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,QAAQ,EAAE,EAAE;gBACZ,MAAM,EAAE;oBACN,MAAM,EAAE,SAAS;iBAClB;gBACD,WAAW,EAAE,EAAE;gBACf,MAAM,EAAE,EAAE;gBACV,IAAI,EAAE,EAAE;gBACR,YAAY,EAAE,IAAI,CAAC,YAAY;aAChC,CAAC,CAAA;YACF,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;QAC9C,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,EAAE;YAC7B,EAAE;YACF,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,WAAW;YACX,YAAY;YACZ,UAAU;YACV,KAAK;YACL,MAAM,EAAE;gBACN,MAAM,EAAE,SAAS;gBACjB,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;aACxC;YACD,MAAM,EAAE,EAAE;YACV,UAAU,EAAE,EAAE;YACd,GAAG,EAAE;gBACH,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI;gBAC1B,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO;aACjC;SACF,CAAC,CAAA;QACF,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IAC5D,CAAC;IACO,iBAAiB,CAAC,eAAyC;QACjE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,eAAe,CAAA;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QACjD,IAAI,QAAQ,KAAK,SAAS;YACxB,MAAM,IAAI,KAAK,CAAC,oBAAoB,UAAU,YAAY,CAAC,CAAA;QAC7D,IAAI,QAAQ,CAAC,YAAY,KAAK,SAAS;YAAE,OAAM;QAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;QACjE,WAAW,CAAC,MAAM,GAAG;YACnB,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;SACxC,CAAA;IACH,CAAC;IACO,YAAY,CAAC,UAA+B;QAClD,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,UAAU,CAAA;QAClD,IAAI,SAAS,KAAK,YAAY,EAAE;YAC9B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;YAC9C,OAAM;SACP;QACD,IAAI,SAAS,KAAK,kCAAkC,EAAE;YACpD,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAA;YAC/B,OAAM;SACP;QACD,IAAI,SAAS,KAAK,iCAAiC,EAAE;YACnD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;YACxB,OAAM;SACP;QACD,IAAI,SAAS,KAAK,sBAAsB,EAAE;YACxC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAA;YACtB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACrC,QAAQ,CAAC,GAAG,GAAG,IAAI,CAAA;gBACnB,OAAO,QAAQ,CAAA;YACjB,CAAC,CAAC,CAAA;SACH;QACD,IAAI,SAAS,KAAK,sBAAsB,EAAE;YACxC,MAAM,GAAG,GAAW,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACpC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE;gBAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACnB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;aACxB;SACF;QACD,IAAI,SAAS,KAAK,0BAA0B,EAAE;YAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACnC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,IAAI;gBAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YACnE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;SACtC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QACjD,IAAI,QAAQ,CAAC,YAAY,KAAK,SAAS;YAAE,OAAM;QAE/C,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;QACjE,IAAI,SAAS,KAAK,kBAAkB,EAAE;YACpC,MAAM,OAAO,GAAgB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAC7C,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;SACnC;aAAM,IAAI,SAAS,KAAK,wBAAwB,EAAE;YACjD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAC7B,WAAW,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAA;SAC/C;QAED,IAAI,SAAS,KAAK,wBAAwB,EAAE;YAC1C,IAAI;gBACF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBAC7B,WAAW,CAAC,SAAS,GAAG,IAAI,CAAA;aAC7B;YAAC,OAAO,KAAK,EAAE;gBACd,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAA;aAClD;SACF;QAED,IAAI,SAAS,KAAK,oCAAoC,EAAE;YACtD,IAAI;gBACF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBAC7B,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAA;aACpC;YAAC,OAAO,KAAK,EAAE;gBACd,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAA;aACzD;SACF;IACH,CAAC;IACO,uBAAuB,CAAC,EAC9B,QAAQ,EACR,SAAS,EACT,OAAO,EACP,MAAM,GAMP;QACC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;YAC9B,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE;gBACtC,OAAO;oBACL,MAAM,EAAE,QAAQ;oBAChB,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO;oBAC/B,SAAS;oBACT,OAAO;iBACC,CAAA;aACX;SACF;QACD,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,SAAS;YACT,OAAO;YACP,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAA;IACH,CAAC;IACO,kBAAkB,CAAC,gBAA2C;QACpE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,gBAAgB,CAAA;QAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QACjD,IAAI,QAAQ,CAAC,YAAY,KAAK,SAAS,EAAE;YACvC,IAAI,cAAc,CAAC,MAAM,KAAK,QAAQ,EAAE;gBACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CACzC,gBAAgB,CAAC,iBAAiB,CACnC,CAAA;gBACD,MAAM,IAAI,GACR,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAA;gBAEpE,MAAM,QAAQ,GAAa;oBACzB,YAAY,EAAE,IAAI;oBAClB,QAAQ,EAAE,EAAE;oBACZ,OAAO,EAAE,IAAI;oBACb,IAAI,EAAE,EAAE;oBACR,WAAW,EAAE,EAAE;oBACf,MAAM,EAAE;wBACN,MAAM,EAAE,QAAQ;wBAChB,OAAO,EAAE,cAAc,CAAC,OAAO;wBAC/B,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;wBACvC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;qBACtC;oBACD,IAAI,EAAE,aAAa;oBACnB,IAAI;oBACJ,MAAM,EAAE,EAAE;iBACX,CAAA;gBAED,IAAI,IAAI,KAAK,QAAQ,EAAE;oBACrB,QAAQ,CAAC,KAAK,GAAG,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;iBAC/C;qBAAM;oBACL,QAAQ,CAAC,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;iBAC/C;gBAED,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAA;gBACxE,OAAO,CAAC,KAAK,CACX,0CAA0C,cAAc,CAAC,OAAO,EAAE,CACnE,CAAA;aACF;YACD,OAAM;SACP;QACD,IAAI,cAAc,CAAC,MAAM,KAAK,WAAW,EAAE;YACzC,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;YAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAA;YACzE,MAAM,gBAAgB,GAAwB;gBAC5C,UAAU,EAAE,UAAU;gBACtB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,kBAAkB,GAAG,QAAQ;oBACnC,MAAM,EAAE;wBACN,MAAM,EAAE,QAAQ;wBAChB,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;wBACvC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;qBACtC;iBACF,CAAC;gBACF,SAAS,EAAE,kBAAkB;gBAC7B,eAAe,EAAE,QAAQ,CAAC,yBAAyB,CAAC,QAAQ;aAC7D,CAAA;YACD,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAA;SACpC;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;QACjE,MAAM,cAAc,GAAG,WAAW,CAAC,MAGlC,CAAA;QACD,IAAI,IAAI,GAAG,EAAE,CAAA;QACb,IAAI;YACF,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAA;YACtC,IAAI,YAAY,KAAK,IAAI,EAAE;gBACzB,MAAM,IAAI,KAAK,CACb,oHAAoH,CACrH,CAAA;aACF;YACD,IAAI,YAAE,CAAC,UAAU,CAAC,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,EAAE;gBACvD,IAAI,GAAG,IAAI,CAAC,KAAK,CACf,YAAE,CAAC,YAAY,CAAC,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,CAC9D,CAAA;aACF;SACF;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;SACvC;QACD,IAAI,cAAc,CAAC,MAAM,KAAK,QAAQ,EAAE;YACtC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,uBAAuB,CAAC;gBAChD,QAAQ,EAAE,WAAW,CAAC,QAAQ;gBAC9B,SAAS,EAAE,cAAc,CAAC,SAAS;gBACnC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;gBACrC,MAAM,EAAE,cAAc;aACvB,CAAC,CAAA;SACH;aAAM;YACL,WAAW,CAAC,MAAM,GAAG;gBACnB,MAAM,EAAE,cAAc,CAAC,MAAM;gBAC7B,SAAS,EAAE,cAAc,CAAC,SAAS;gBACnC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;aACtC,CAAA;SACF;QAED,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAA;QAClC,WAAW,CAAC,WAAW,GAAG,IAAI,CAAC,eAAe,CAAA;QAC9C,WAAW,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAA;QAC5C,IAAI,CAAC,YAAY,GAAG,EAAE,CAAA;QACtB,IAAI,CAAC,eAAe,GAAG,EAAE,CAAA;QACzB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;QAClB,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;YAChC,WAAW,CAAC,IAAI,GAAG,IAAI,CAAA;YACvB,MAAM,EAAE,GAAG,gBAAgB,CAAC,iBAAiB,CAAA;YAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,UAAU,CAAA;YAC5D,MAAM,WAAW,GAAsB,EAAE,CAAA;YACzC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;;gBAClC,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAA;gBAC7C,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;oBAC5D,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;oBAC/C,IAAI,KAAK,GAAG,MAAM,CAAC,MAAA,qBAAU,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,mCAAI,UAAU,CAAC,CAAA;oBAC5D,IAAI,KAAK,EAAE;wBACT,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;4BAC/B,KAAK,GAAG,aAAa,CAAA;yBACtB;6BAAM,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;4BACpC,KAAK,GAAG,WAAW,CAAA;yBACpB;6BAAM,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;4BACpC,KAAK,GAAG,WAAW,CAAA;yBACpB;wBACD,WAAW,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;qBACzB;iBACF;qBAAM;oBACL,WAAW,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAA;iBACnC;YACH,CAAC,CAAC,CAAA;YACF,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACtC,OAAO,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAA;YAC3B,CAAC,CAAC,CAAC,UAAU,GAAG,WAAW,CAAA;SAC5B;QAED,iDAAiD;QACjD,gEAAgE;QAChE,6CAA6C;QAC7C,sCAAsC;QACtC,MAAM;QACN,sCAAsC;QACtC,yBAAyB;QACzB,oBAAoB;QACpB,MAAM;QACN,wEAAwE;QACxE,qBAAqB;QACrB,gBAAgB;QAChB,+DAA+D;QAC/D,IAAI;IACN,CAAC;IACD,iBAAiB;QACf,IAAI,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;QAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE;YAC5B,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAA;SACvC;QACD,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;QACvD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;YAC7B,OAAO,EAAE,CAAA;SACV;QACD,IAAI,MAAM,GAAG,CAAC,CAAA;QACd,OAAO,YAAE,CAAC,UAAU,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,MAAM,OAAO,CAAC,CAAC,EAAE;YAC5D,MAAM,EAAE,CAAA;SACT;QACD,IAAI,MAAM,KAAK,CAAC,EAAE;YAChB,OAAO,EAAE,CAAA;SACV;QACD,IAAI;YACF,MAAM,cAAc,GAAG,YAAE,CAAC,YAAY,CACpC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,EAC1C,MAAM,CACP,CAAA;YACD,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;SAClC;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,EAAE,CAAA;SACV;IACH,CAAC;IACO,iBAAiB,CAAC,KAAiB;QACzC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE;YACpD,OAAO;gBACL,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,6CAA6C;aAC9C,CAAA;SACX;QACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;gBAC1B,KAAK,QAAQ;oBACX,OAAO;wBACL,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;wBAC1B,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;wBAC5B,oCAAoC;qBAC5B,CAAA;gBACZ,KAAK,WAAW,CAAC;gBACjB,KAAK,WAAW,CAAC;gBACjB,KAAK,SAAS;oBACZ,OAAO;wBACL,MAAM,EAAE,QAAQ;wBAChB,OAAO,EAAE,SAAS,IAAI,CAAC,IAAI,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;qBAC/C,CAAA;aACb;SACF;QACD,OAAO;YACL,MAAM,EAAE,QAAQ;SACR,CAAA;IACZ,CAAC;IACO,KAAK,CAAC,kBAAkB,CAC9B,gBAA2C,EAC3C,OAAgB;QAEhB,MAAM,EAAE,iBAAiB,EAAE,SAAS,EAAE,GAAG,gBAAgB,CAAA;QACzD,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;QAClE,MAAM,UAAU,GAAG,YAAY,CAAC,MAG/B,CAAA;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAA;QAC5C,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,EAAE;YACzC,IAAI,CAAC,aAAa,CAAC,sBAAsB,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;SAClE;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;QAC5C,YAAY,CAAC,MAAM,GAAG;YACpB,GAAG,MAAM;YACT,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,OAAO;SACR,CAAA;QACD,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAA;QAC/B,YAAY,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAA;QACzC,YAAY,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAA;QAC3D,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAA;QAC7B,IAAI,CAAC,UAAU,GAAG,EAAE,CAAA;QACpB,IAAI,CAAC,IAAI,GAAG,EAAE,CAAA;QAEd,IACE,IAAI,CAAC,WAAW;YAChB,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;YAC3B,CAAC,YAAY,CAAC,SAAS,EACvB;YACA,4BAA4B;YAC5B,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAA;YAC1D,MAAM,QAAQ,GAAG,eAAe,iBAAiB,MAAM,CAAA;YACvD,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;YAE7C,mCAAmC;YACnC,YAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YAE1C,6BAA6B;YAC7B,YAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;YAE/D,uEAAuE;YACvE,YAAY,CAAC,SAAS,GAAG,iBAAiB,CAAA;SAC3C;QACD,IAAI,CAAC,WAAW,GAAG,EAAE,CAAA;QAErB,IAAI,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE;YAC3C,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAA;YAC3D,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;gBACrC,YAAE,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;aAChC;YACD,MAAM,cAAc,GAAG,cAAI,CAAC,IAAI,CAC9B,IAAI,CAAC,YAAY,EACjB,GAAG,OAAO,IAAI,YAAY,CAAC,YAAY,OAAO,CAC/C,CAAA;YACD,IAAA,wBAAa,EAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YACpE,OAAO,SAAS,CAAA;SACjB;aAAM;YACL,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;SACxD;IACH,CAAC;IAGO,KAAK,CAAC,cAAc,CAAC,QAA0B,EAAE,OAAgB;QACvE,IAAI,IAAI,GAAG,IAAI,CAAA;QACf,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE;YAC3D,IAAI;gBACF,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;gBAC9C,MAAK;aACN;YAAC,OAAO,CAAC,EAAE;gBACV,OAAO,CAAC,KAAK,CAAC,WAAW,OAAO,6BAA6B,EAAE,CAAC,CAAC,CAAA;gBACjE,IAAI,OAAO,KAAK,IAAI,CAAC,UAAU,EAAE;oBAC/B,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAA;iBACvE;qBAAM;oBACL,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAA,CAAC,sCAAsC;oBACjF,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAA;iBAClD;aACF;SACF;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,QAA0B,EAAE,OAAgB;QAClE,IAAI,KAAK,GAAG,EAAE,CAAA;QACd,IAAI,SAAS,GAAG,EAAE,CAAA;QAClB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE;YACpC,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,IAAI,CAAA;SACvC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAa,CAAA;QACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QACxD,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACxB,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;QAC3D,IAAI;YACF,IACE,OAAO,CAAC,GAAG,CAAC,MAAM;gBAClB,OAAO,CAAC,GAAG,CAAC,UAAU;gBACtB,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,EACjC;gBACA,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAA;gBAC1B,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAA;aACnC;iBAAM;gBACL,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,iBAAiB,CACvD,IAAI,CAAC,OAAO,EACZ,QAAQ,CAAC,GAAG,CACb,CAAA;gBACD,KAAK,GAAG,MAAM,CAAC,GAAG,CAAA;gBAClB,SAAS,GAAG,MAAM,CAAC,UAAU,CAAA;gBAC7B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE;oBACrC,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,CAAA;oBAC1B,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,SAAS,CAAA;iBACnC;aACF;YACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAClD,QAAQ,EACR,KAAK,EACL,SAAS,EACT,IAAI,CAAC,YAAY,EACjB,OAAO,CACR,CAAA;YACD,IAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAA;YACxC,OAAO,IAAI,CAAA;SACZ;gBAAS;YACR,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAa,CAAA;YACtE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA;YAC1C,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;SACzD;IACH,CAAC;IAEO,yBAAyB,CAAC,QAA0B;;QAC1D,MAAM,YAAY,GAChB,MAAA,IAAI,CAAC,YAAY,mCAAI,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAA;QAC9D,IAAI,CAAC,YAAY,EAAE;YACjB,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAA;YAC7C,OAAM;SACP;QACD,IAAI;YACF,IAAI,CAAC,GAAG,CAAC,CAAA;YACT,OAAO,YAAE,CAAC,UAAU,CAAC,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE;gBACrD,CAAC,EAAE,CAAA;aACJ;YACD,YAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;YAC7C,2CAA2C;YAC3C,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAA;YACtC,OAAO,QAAQ,CAAC,UAAU,CAAA;YAC1B,YAAE,CAAC,aAAa,CACd,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,EAAE,EAAE,aAAa,CAAC,EAC9C,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAClC,CAAA;YACD,YAAE,CAAC,aAAa,CACd,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,EAAE,EAAE,cAAc,CAAC,EAC/C,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CACpC,CAAA;SACF;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAA;SAChE;IACH,CAAC;IACO,KAAK,CAAC,iBAAiB,CAAC,eAAyC;QACvE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,eAAe,CAAA;QACvD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,MAG9B,CAAA;QACD,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG;YACnB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;YACrC,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;YACrC,OAAO;YACP,aAAa;SACd,CAAA;QACD,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;IACtE,CAAC;CACF;AAlxBD,kCAkxBC","sourcesContent":["import * as messages from '@cucumber/messages'\nimport fs from 'fs'\nimport path from 'path'\nimport { RunUploadService } from './upload_serivce'\nimport { writeFileSync } from 'fs-extra'\n// type JsonException = messages.Exception\nimport objectPath from 'object-path'\ntype JsonTimestamp = number //messages.Timestamp\ntype JsonStepType =\n | 'Unknown'\n | 'Context'\n | 'Action'\n | 'Outcome'\n | 'Conjunction'\n | 'After'\n | 'Before'\n\nconst URL =\n process.env.NODE_ENV_BLINQ === 'dev'\n ? 'https://dev.api.blinq.io/api/runs'\n : process.env.NODE_ENV_BLINQ === 'local'\n ? 'http://localhost:5001/api/runs'\n : process.env.NODE_ENV_BLINQ === 'stage'\n ? 'https://stage.api.blinq.io/api/runs'\n : process.env.NODE_ENV_BLINQ === 'prod'\n ? 'https://api.blinq.io/api/runs'\n : !process.env.NODE_ENV_BLINQ\n ? 'https://api.blinq.io/api/runs'\n : `${process.env.NODE_ENV_BLINQ}/api/runs`\n\nconst REPORT_SERVICE_URL = process.env.REPORT_SERVICE_URL ?? URL\nconst BATCH_SIZE = 10\nconst MAX_RETRIES = 3\nconst REPORT_SERVICE_TOKEN =\n process.env.TOKEN ?? process.env.REPORT_SERVICE_TOKEN\nexport type JsonResultUnknown = {\n status: 'UNKNOWN'\n}\ntype JsonResultSkipped = {\n status: 'SKIPPED'\n}\ntype JsonResultUndefined = {\n status: 'UNDEFINED'\n}\ntype JsonResultAmbiguous = {\n status: 'AMBIGUOUS'\n}\nexport type JsonResultStarted = {\n status: 'STARTED'\n startTime: JsonTimestamp\n}\ntype JsonResultPending = {\n status: 'PENDING'\n startTime: JsonTimestamp\n endTime: JsonTimestamp\n}\nexport type JsonResultPassed = {\n status: 'PASSED'\n startTime: JsonTimestamp\n endTime: JsonTimestamp\n}\nexport type JsonResultFailed = {\n status: 'FAILED'\n startTime: JsonTimestamp\n endTime: JsonTimestamp\n message?: string\n // exception?: JsonException\n}\nexport type JsonFixedByAi = {\n status: 'FIXED_BY_AI'\n startTime: JsonTimestamp\n endTime: JsonTimestamp\n}\n\ntype JsonCommandResult = JsonResultPassed | JsonResultFailed\ntype JsonStepResult =\n | JsonResultUnknown\n | JsonResultSkipped\n | JsonResultUndefined\n | JsonResultAmbiguous\n | JsonResultStarted\n | JsonResultPending\n | JsonResultPassed\n | JsonResultFailed\n | JsonFixedByAi\nexport type JsonTestResult =\n | JsonResultUnknown\n | JsonResultStarted\n | JsonResultPassed\n | JsonResultFailed\n | JsonFixedByAi\ntype JsonReportResult = JsonTestResult\n\ntype JsonCommand = {\n type: string\n value?: string\n text: string\n screenshotId?: string\n result: JsonCommandResult\n netWorkLog?: any[]\n}\ntype webLog = {\n type: string\n text: string\n location: string\n time: string\n}\nexport type JsonStep = {\n keyword: string\n type: JsonStepType\n text: string\n commands: JsonCommand[]\n result: JsonStepResult\n webLog: webLog[]\n networkData: any[]\n data?: any\n ariaSnapshot: string\n traceFilePath?: string\n brunoData?: any\n interceptResults?: any\n}\nexport type RetrainStats = {\n result: JsonTestResult\n totalSteps: number\n upload_id: string\n local_id: number\n}\nexport type JsonTestProgress = {\n id: string\n featureName: string\n uri: string\n scenarioName: string\n parameters: Record<string, string>\n steps: JsonStep[]\n result: JsonTestResult\n retrainStats?: RetrainStats\n initialAriaSnapshot?: string\n webLog: any\n networkLog: any\n logFileId?: string\n env: {\n name: string\n baseUrl: string\n }\n}\n\nexport type JsonReport = {\n testCases: JsonTestProgress[]\n result: JsonReportResult\n env: {\n name: string\n baseUrl: string\n }\n}\n\ninterface MetaMessage extends messages.Meta {\n runName: string\n}\ninterface EnvelopeWithMetaMessage extends messages.Envelope {\n meta: MetaMessage\n}\nexport default class ReportGenerator {\n private report: JsonReport = {\n result: {\n status: 'UNKNOWN',\n },\n testCases: [] as JsonTestProgress[],\n env: {\n name: '',\n baseUrl: '',\n },\n }\n private gherkinDocumentMap = new Map<string, messages.GherkinDocument>()\n private stepMap = new Map<string, messages.Step>()\n private pickleMap = new Map<string, messages.Pickle>()\n private testCaseMap = new Map<string, messages.TestCase>()\n private testStepMap = new Map<string, messages.TestStep>()\n private stepReportMap = new Map<string, JsonStep>()\n private testCaseReportMap = new Map<string, JsonTestProgress>()\n private scenarioIterationCountMap = new Map<string, number>()\n private logs: webLog[] = []\n private networkLog: any[] = []\n private stepLogs: webLog[] = []\n private stepNetworkLogs: any[] = []\n private runName = ''\n private ariaSnapshot = ''\n private initialAriaSnapshot = ''\n private testCaseLog: string[] = []\n private loggingOverridden: boolean = false // Flag to track if logging is overridden\n reportFolder: null | string = null\n private uploadService = new RunUploadService(\n REPORT_SERVICE_URL,\n REPORT_SERVICE_TOKEN\n )\n private retryTestCaseId: string | null = null\n\n async handleMessage(\n envelope: EnvelopeWithMetaMessage | messages.Envelope,\n reRunId?: string\n ): Promise<any> {\n if (envelope.meta && 'runName' in envelope.meta) {\n this.runName = envelope.meta.runName\n }\n const type = Object.keys(envelope)[0] as keyof messages.Envelope\n switch (type) {\n // case \"meta\": { break}\n // case \"source\": { break}\n case 'parseError': {\n const parseError = envelope[type]\n this.handleParseError(parseError)\n break\n }\n case 'gherkinDocument': {\n const doc = envelope[type]\n this.onGherkinDocument(doc)\n break\n }\n case 'pickle': {\n const pickle = envelope[type]\n this.onPickle(pickle)\n break\n }\n // case \"stepDefinition\": { break}\n // case \"hook\": { break} // Before Hook\n case 'testRunStarted': {\n const testRunStarted = envelope[type]\n this.onTestRunStarted(testRunStarted)\n await this.uploadService.createStatus('running')\n break\n }\n case 'testCase': {\n const testCase = envelope[type]\n\n // Initialize the log storage\n this.testCaseLog = []\n\n if (!this.loggingOverridden) {\n this.loggingOverridden = true\n\n // Store the original process.stdout.write, and process.stderr.write\n const originalStdoutWrite = process.stdout.write\n const originalStderrWrite = process.stderr.write\n\n // Override process.stdout.write\n process.stdout.write = (chunk: any, ...args: any[]) => {\n this.testCaseLog.push(chunk.toString())\n return originalStdoutWrite.call(process.stdout, chunk, ...args)\n }\n\n // Override process.stderr.write\n process.stderr.write = (chunk: any, ...args: any[]) => {\n this.testCaseLog.push(chunk.toString())\n return originalStderrWrite.call(process.stderr, chunk, ...args)\n }\n }\n\n // Call the onTestCase method\n this.onTestCase(testCase)\n\n break\n }\n case 'testCaseStarted': {\n this.retryTestCaseId = (\n envelope[type] as messages.TestCaseStarted & {\n retryTestCaseId?: string\n }\n ).retryTestCaseId\n const testCaseStarted = envelope[type]\n this.onTestCaseStarted(testCaseStarted)\n break\n }\n case 'testStepStarted': {\n const testStepStarted = envelope[type]\n this.onTestStepStarted(testStepStarted)\n break\n }\n case 'attachment': {\n const attachment = envelope[type]\n this.onAttachment(attachment)\n break\n }\n case 'testStepFinished': {\n const testStepFinished = envelope[type]\n this.onTestStepFinished(testStepFinished)\n break\n }\n case 'testCaseFinished': {\n const testCaseFinished = envelope[type]\n let reRunIdFinal = this.retryTestCaseId\n\n if (reRunId) {\n reRunIdFinal = reRunId\n }\n\n // Call the onTestCaseFinished method\n const result = await this.onTestCaseFinished(\n testCaseFinished,\n reRunIdFinal\n )\n return result\n }\n // case \"hook\": { break} // After Hook\n case 'testRunFinished': {\n const testRunFinished = envelope[type]\n await this.onTestRunFinished(testRunFinished)\n break\n }\n\n // case \"parameterType\" : { break}\n // case \"undefinedParameterType\": { break}\n }\n }\n getReport() {\n return this.report\n }\n private handleParseError(parseError: messages.ParseError) {\n const { message } = parseError\n const timestamp = new Date().getTime()\n this.report.result = {\n status: 'FAILED',\n startTime: timestamp,\n endTime: timestamp,\n message: message,\n }\n }\n\n private onGherkinDocument(doc: messages.GherkinDocument) {\n this.gherkinDocumentMap.set(doc.uri, doc)\n doc.feature.children.forEach((child) => {\n if (child.scenario) {\n child.scenario.steps.forEach((step) => {\n this.stepMap.set(step.id, step)\n })\n } else if (child.background) {\n child.background.steps.forEach((step) => {\n this.stepMap.set(step.id, step)\n })\n } else if (child.rule) {\n child.rule.children.forEach((child) => {\n if (child.scenario) {\n child.scenario.steps.forEach((step) => {\n this.stepMap.set(step.id, step)\n })\n } else if (child.background) {\n child.background.steps.forEach((step) => {\n this.stepMap.set(step.id, step)\n })\n }\n })\n }\n })\n }\n private onPickle(pickle: messages.Pickle) {\n this.pickleMap.set(pickle.id, pickle)\n }\n private getTimeStamp(timestamp: messages.Timestamp) {\n return timestamp.seconds * 1000 + timestamp.nanos / 1000000\n }\n private onTestRunStarted(testRunStarted: messages.TestRunStarted) {\n this.report.result = {\n status: 'STARTED',\n startTime: this.getTimeStamp(testRunStarted.timestamp),\n }\n }\n private onTestCase(testCase: messages.TestCase) {\n this.testCaseMap.set(testCase.id, testCase)\n testCase.testSteps.forEach((testStep) => {\n this.testStepMap.set(testStep.id, testStep)\n })\n }\n private _findScenario(doc: messages.GherkinDocument, scenarioId: string) {\n for (const child of doc.feature.children) {\n if (child.scenario && child.scenario.id === scenarioId) {\n return child.scenario\n }\n if (child.rule) {\n for (const scenario of child.rule.children) {\n if (scenario.scenario && scenario.scenario.id === scenarioId) {\n return scenario.scenario\n }\n }\n }\n }\n throw new Error(`scenario \"${scenarioId}\" not found`)\n }\n private _getParameters(scenario: messages.Scenario, exampleId: string) {\n const parameters: Record<string, string> = {}\n if (scenario.examples.length === 0) return parameters\n for (const examples of scenario.examples) {\n for (const tableRow of examples.tableBody) {\n if (tableRow.id === exampleId) {\n for (let i = 0; i < examples.tableHeader.cells.length; i++) {\n parameters[examples.tableHeader.cells[i].value] =\n tableRow.cells[i].value\n }\n }\n }\n }\n return parameters\n }\n private onTestCaseStarted(testCaseStarted: messages.TestCaseStarted) {\n const { testCaseId, id, timestamp } = testCaseStarted\n const testCase = this.testCaseMap.get(testCaseId)\n if (testCase === undefined)\n throw new Error(`testCase with id ${testCaseId} not found`)\n const pickle = this.pickleMap.get(testCase.pickleId)\n if (pickle === undefined)\n throw new Error(`pickle with id ${testCase.pickleId} not found`)\n\n const doc = this.gherkinDocumentMap.get(pickle.uri)\n if (doc === undefined)\n throw new Error(`gherkinDocument with uri ${pickle.uri} not found`)\n const featureName = doc.feature.name\n\n const scenarioId = pickle.astNodeIds[0]\n const scenario = this._findScenario(doc, scenarioId)\n const scenarioName = scenario.name\n if (!this.scenarioIterationCountMap.has(scenarioId)) {\n this.scenarioIterationCountMap.set(scenarioId, 1)\n }\n const parameters = this._getParameters(scenario, pickle.astNodeIds[1])\n console.log(\n `Running scenario ${scenarioName} iteration ${this.scenarioIterationCountMap.get(\n scenarioId\n )} with parameters:\\n${JSON.stringify(parameters, null, 4)}\\n \n `\n )\n this.scenarioIterationCountMap.set(\n scenarioId,\n this.scenarioIterationCountMap.get(scenarioId) + 1\n )\n const steps: JsonStep[] = pickle.steps.map((pickleStep) => {\n const stepId = pickleStep.astNodeIds[0]\n const step = this.stepMap.get(stepId)\n this.stepReportMap.set(pickleStep.id, {\n type: step.keywordType,\n keyword: step.keyword,\n text: step.text,\n commands: [],\n result: {\n status: 'UNKNOWN',\n },\n networkData: [],\n webLog: [],\n data: {},\n ariaSnapshot: this.ariaSnapshot,\n })\n return this.stepReportMap.get(pickleStep.id)\n })\n this.testCaseReportMap.set(id, {\n id,\n uri: pickle.uri,\n featureName,\n scenarioName,\n parameters,\n steps,\n result: {\n status: 'STARTED',\n startTime: this.getTimeStamp(timestamp),\n },\n webLog: [],\n networkLog: [],\n env: {\n name: this.report.env.name,\n baseUrl: this.report.env.baseUrl,\n },\n })\n this.report.testCases.push(this.testCaseReportMap.get(id))\n }\n private onTestStepStarted(testStepStarted: messages.TestStepStarted) {\n const { testStepId, timestamp } = testStepStarted\n const testStep = this.testStepMap.get(testStepId)\n if (testStep === undefined)\n throw new Error(`testStep with id ${testStepId} not found`)\n if (testStep.pickleStepId === undefined) return\n const stepProgess = this.stepReportMap.get(testStep.pickleStepId)\n stepProgess.result = {\n status: 'STARTED',\n startTime: this.getTimeStamp(timestamp),\n }\n }\n private onAttachment(attachment: messages.Attachment) {\n const { testStepId, body, mediaType } = attachment\n if (mediaType === 'text/plain') {\n this.reportFolder = body.replaceAll('\\\\', '/')\n return\n }\n if (mediaType === 'application/json+snapshot-before') {\n this.initialAriaSnapshot = body\n return\n }\n if (mediaType === 'application/json+snapshot-after') {\n this.ariaSnapshot = body\n return\n }\n if (mediaType === 'application/json+env') {\n const data = JSON.parse(body)\n this.report.env = data\n this.report.testCases.map((testCase) => {\n testCase.env = data\n return testCase\n })\n }\n if (mediaType === 'application/json+log') {\n const log: webLog = JSON.parse(body)\n if (this.logs.length < 1000) {\n this.logs.push(log)\n this.stepLogs.push(log)\n }\n }\n if (mediaType === 'application/json+network') {\n const networkLog = JSON.parse(body)\n if (this.networkLog.length < 1000) this.networkLog.push(networkLog)\n this.stepNetworkLogs.push(networkLog)\n }\n const testStep = this.testStepMap.get(testStepId)\n if (testStep.pickleStepId === undefined) return\n\n const stepProgess = this.stepReportMap.get(testStep.pickleStepId)\n if (mediaType === 'application/json') {\n const command: JsonCommand = JSON.parse(body)\n stepProgess.commands.push(command)\n } else if (mediaType === 'application/json+trace') {\n const data = JSON.parse(body)\n stepProgess.traceFilePath = data.traceFilePath\n }\n\n if (mediaType === 'application/json+bruno') {\n try {\n const data = JSON.parse(body)\n stepProgess.brunoData = data\n } catch (error) {\n console.error('Error parsing bruno data:', error)\n }\n }\n\n if (mediaType === 'application/json+intercept-results') {\n try {\n const data = JSON.parse(body)\n stepProgess.interceptResults = data\n } catch (error) {\n console.error('Error parsing intercept results:', error)\n }\n }\n }\n private getFailedTestStepResult({\n commands,\n startTime,\n endTime,\n result,\n }: {\n commands: JsonCommand[]\n startTime: number\n endTime: number\n result: messages.TestStepResult\n }): JsonStepResult {\n for (const command of commands) {\n if (command.result.status === 'FAILED') {\n return {\n status: 'FAILED',\n message: command.result.message,\n startTime,\n endTime,\n } as const\n }\n }\n return {\n status: 'FAILED',\n startTime,\n endTime,\n message: result.message,\n }\n }\n private onTestStepFinished(testStepFinished: messages.TestStepFinished) {\n const { testStepId, testStepResult, timestamp } = testStepFinished\n const testStep = this.testStepMap.get(testStepId)\n if (testStep.pickleStepId === undefined) {\n if (testStepResult.status === 'FAILED') {\n const testCase = this.testCaseReportMap.get(\n testStepFinished.testCaseStartedId\n )\n const type =\n testCase.steps[0].result.status === 'UNKNOWN' ? 'Before' : 'After'\n\n const hookStep: JsonStep = {\n ariaSnapshot: null,\n commands: [],\n keyword: type,\n data: {},\n networkData: [],\n result: {\n status: 'FAILED',\n message: testStepResult.message,\n startTime: this.getTimeStamp(timestamp),\n endTime: this.getTimeStamp(timestamp),\n },\n text: 'Failed hook',\n type,\n webLog: [],\n }\n\n if (type === 'Before') {\n testCase.steps = [hookStep, ...testCase.steps]\n } else {\n testCase.steps = [...testCase.steps, hookStep]\n }\n\n this.testCaseReportMap.set(testStepFinished.testCaseStartedId, testCase)\n console.error(\n `Before/After hook failed with message: ${testStepResult.message}`\n )\n }\n return\n }\n if (testStepResult.status === 'UNDEFINED') {\n const step = this.stepReportMap.get(testStep.pickleStepId)\n const stepName = step ? step.keyword + ' ' + step.text : 'Undefined step'\n const undefinedCommand: messages.Attachment = {\n testStepId: testStepId,\n body: JSON.stringify({\n type: 'error',\n text: 'Undefined step: ' + stepName,\n result: {\n status: 'FAILED',\n startTime: this.getTimeStamp(timestamp),\n endTime: this.getTimeStamp(timestamp),\n },\n }),\n mediaType: 'application/json',\n contentEncoding: messages.AttachmentContentEncoding.IDENTITY,\n }\n this.onAttachment(undefinedCommand)\n }\n const stepProgess = this.stepReportMap.get(testStep.pickleStepId)\n const prevStepResult = stepProgess.result as {\n status: 'STARTED'\n startTime: JsonTimestamp\n }\n let data = {}\n try {\n const reportFolder = this.reportFolder\n if (reportFolder === null) {\n throw new Error(\n '\"reportFolder\" is \"null\". Failed to run BVT hooks. Please retry after running \"Generate All\" or \"Record Scenario\" '\n )\n }\n if (fs.existsSync(path.join(reportFolder, 'data.json'))) {\n data = JSON.parse(\n fs.readFileSync(path.join(reportFolder, 'data.json'), 'utf8')\n )\n }\n } catch (error) {\n console.log('Error reading data.json')\n }\n if (testStepResult.status === 'FAILED') {\n stepProgess.result = this.getFailedTestStepResult({\n commands: stepProgess.commands,\n startTime: prevStepResult.startTime,\n endTime: this.getTimeStamp(timestamp),\n result: testStepResult,\n })\n } else {\n stepProgess.result = {\n status: testStepResult.status,\n startTime: prevStepResult.startTime,\n endTime: this.getTimeStamp(timestamp),\n }\n }\n\n stepProgess.webLog = this.stepLogs\n stepProgess.networkData = this.stepNetworkLogs\n stepProgess.ariaSnapshot = this.ariaSnapshot\n this.ariaSnapshot = ''\n this.stepNetworkLogs = []\n this.stepLogs = []\n if (Object.keys(data).length > 0) {\n stepProgess.data = data\n const id = testStepFinished.testCaseStartedId\n const parameters = this.testCaseReportMap.get(id).parameters\n const _parameters: typeof parameters = {}\n Object.keys(parameters).map((key) => {\n const valueParam = parameters[key].toString()\n if (valueParam.startsWith('{{') && valueParam.endsWith('}}')) {\n const path = valueParam.slice(2, -2).split('.')\n let value = String(objectPath.get(data, path) ?? valueParam)\n if (value) {\n if (value.startsWith('secret:')) {\n value = 'secret:****'\n } else if (value.startsWith('totp:')) {\n value = 'totp:****'\n } else if (value.startsWith('mask:')) {\n value = 'mask:****'\n }\n _parameters[key] = value\n }\n } else {\n _parameters[key] = parameters[key]\n }\n })\n this.report.testCases.find((testCase) => {\n return testCase.id === id\n }).parameters = _parameters\n }\n\n // if (process.env.TESTCASE_REPORT_FOLDER_PATH) {\n // this.reportFolder = process.env.TESTCASE_REPORT_FOLDER_PATH\n // if (!fs.existsSync(this.reportFolder)) {\n // fs.mkdirSync(this.reportFolder)\n // }\n // const reportFilePath = path.join(\n // this.reportFolder,\n // `report.json`\n // )\n // writeFileSync(reportFilePath, JSON.stringify(this.report, null, 2))\n // return undefined\n // // } else {\n // // return await this.uploadTestCase(testProgress, reRunId)\n // }\n }\n getLogFileContent() {\n let projectPath = process.cwd()\n if (process.env.PROJECT_PATH) {\n projectPath = process.env.PROJECT_PATH\n }\n const logFolder = path.join(projectPath, 'logs', 'web')\n if (!fs.existsSync(logFolder)) {\n return []\n }\n let nextId = 1\n while (fs.existsSync(path.join(logFolder, `${nextId}.json`))) {\n nextId++\n }\n if (nextId === 1) {\n return []\n }\n try {\n const logFileContent = fs.readFileSync(\n path.join(logFolder, `${nextId - 1}.json`),\n 'utf8'\n )\n return JSON.parse(logFileContent)\n } catch (error) {\n return []\n }\n }\n private getTestCaseResult(steps: JsonStep[]) {\n if (steps[0] && steps[0].result.status === 'SKIPPED') {\n return {\n status: 'FAILED',\n message: 'Test skipped due to failure in before hooks',\n } as const\n }\n for (const step of steps) {\n switch (step.result.status) {\n case 'FAILED':\n return {\n status: step.result.status,\n message: step.result.message,\n // exception: step.result.exception,\n } as const\n case 'AMBIGUOUS':\n case 'UNDEFINED':\n case 'PENDING':\n return {\n status: 'FAILED',\n message: `step \"${step.text}\" is ${step.result.status}`,\n } as const\n }\n }\n return {\n status: 'PASSED',\n } as const\n }\n private async onTestCaseFinished(\n testCaseFinished: messages.TestCaseFinished,\n reRunId?: string\n ) {\n const { testCaseStartedId, timestamp } = testCaseFinished\n const testProgress = this.testCaseReportMap.get(testCaseStartedId)\n const prevResult = testProgress.result as {\n status: 'STARTED'\n startTime: JsonTimestamp\n }\n const steps = Object.values(testProgress.steps)\n const result = this.getTestCaseResult(steps)\n if (result.status === 'PASSED' && reRunId) {\n this.uploadService.updateProjectAnalytics(process.env.PROJECT_ID)\n }\n const endTime = this.getTimeStamp(timestamp)\n testProgress.result = {\n ...result,\n startTime: prevResult.startTime,\n endTime,\n }\n testProgress.webLog = this.logs\n testProgress.networkLog = this.networkLog\n testProgress.initialAriaSnapshot = this.initialAriaSnapshot\n this.initialAriaSnapshot = ''\n this.networkLog = []\n this.logs = []\n\n if (\n this.testCaseLog &&\n this.testCaseLog.length > 0 &&\n !testProgress.logFileId\n ) {\n // Create the logs directory\n const logsDir = path.join(this.reportFolder, 'editorLogs')\n const fileName = `testCaseLog_${testCaseStartedId}.log`\n const filePath = path.join(logsDir, fileName)\n\n // Ensure the logs directory exists\n fs.mkdirSync(logsDir, { recursive: true })\n\n // Write the logs to the file\n fs.writeFileSync(filePath, this.testCaseLog.join('\\n'), 'utf8')\n\n // Store this ID in the testProgress object so it can be accessed later\n testProgress.logFileId = testCaseStartedId\n }\n this.testCaseLog = []\n\n if (process.env.TESTCASE_REPORT_FOLDER_PATH) {\n this.reportFolder = process.env.TESTCASE_REPORT_FOLDER_PATH\n if (!fs.existsSync(this.reportFolder)) {\n fs.mkdirSync(this.reportFolder)\n }\n const reportFilePath = path.join(\n this.reportFolder,\n `${endTime}_${testProgress.scenarioName}.json`\n )\n writeFileSync(reportFilePath, JSON.stringify(testProgress, null, 2))\n return undefined\n } else {\n return await this.uploadTestCase(testProgress, reRunId)\n }\n }\n private readonly retryCount = 3\n\n private async uploadTestCase(testCase: JsonTestProgress, rerunId?: string) {\n let data = null\n for (let attempt = 1; attempt <= this.retryCount; attempt++) {\n try {\n data = await this.tryUpload(testCase, rerunId)\n break\n } catch (e) {\n console.error(`Attempt ${attempt} to upload testcase failed:`, e)\n if (attempt === this.retryCount) {\n console.error('All retry attempts failed, failed to upload testcase.')\n } else {\n const waitTime = 1000 * 2 ** (attempt - 1) //? exponential backoff: 1s, 2s, 4s...\n await new Promise((r) => setTimeout(r, waitTime))\n }\n }\n }\n return data\n }\n\n private async tryUpload(testCase: JsonTestProgress, rerunId?: string) {\n let runId = ''\n let projectId = ''\n if (!process.env.UPLOADING_TEST_CASE) {\n process.env.UPLOADING_TEST_CASE = '[]'\n }\n const anyRemArr = JSON.parse(process.env.UPLOADING_TEST_CASE) as string[]\n const randomID = Math.random().toString(36).substring(7)\n anyRemArr.push(randomID)\n process.env.UPLOADING_TEST_CASE = JSON.stringify(anyRemArr)\n try {\n if (\n process.env.RUN_ID &&\n process.env.PROJECT_ID &&\n !process.env.IGNORE_ENV_VARIABLES\n ) {\n runId = process.env.RUN_ID\n projectId = process.env.PROJECT_ID\n } else {\n const runDoc = await this.uploadService.createRunDocument(\n this.runName,\n testCase.env\n )\n runId = runDoc._id\n projectId = runDoc.project_id\n if (!process.env.IGNORE_ENV_VARIABLES) {\n process.env.RUN_ID = runId\n process.env.PROJECT_ID = projectId\n }\n }\n const data = await this.uploadService.uploadTestCase(\n testCase,\n runId,\n projectId,\n this.reportFolder,\n rerunId\n )\n this.writeTestCaseReportToDisk(testCase)\n return data\n } finally {\n const arrRem = JSON.parse(process.env.UPLOADING_TEST_CASE) as string[]\n arrRem.splice(arrRem.indexOf(randomID), 1)\n process.env.UPLOADING_TEST_CASE = JSON.stringify(arrRem)\n }\n }\n\n private writeTestCaseReportToDisk(testCase: JsonTestProgress) {\n const reportFolder =\n this.reportFolder ?? process.env.TESTCASE_REPORT_FOLDER_PATH\n if (!reportFolder) {\n console.error('Report folder is not defined')\n return\n }\n try {\n let i = 0\n while (fs.existsSync(path.join(reportFolder, `${i}`))) {\n i++\n }\n fs.mkdirSync(path.join(reportFolder, `${i}`))\n //exclude network log from the saved report\n const networkLog = testCase.networkLog\n delete testCase.networkLog\n fs.writeFileSync(\n path.join(reportFolder, `${i}`, `report.json`),\n JSON.stringify(testCase, null, 2)\n )\n fs.writeFileSync(\n path.join(reportFolder, `${i}`, `network.json`),\n JSON.stringify(networkLog, null, 2)\n )\n } catch (error) {\n console.error('Error writing test case report to disk:', error)\n }\n }\n private async onTestRunFinished(testRunFinished: messages.TestRunFinished) {\n const { timestamp, success, message } = testRunFinished\n const prevResult = this.report.result as {\n status: 'STARTED'\n startTime: JsonTimestamp\n }\n this.report.result = {\n status: success ? 'PASSED' : 'FAILED',\n startTime: prevResult.startTime,\n endTime: this.getTimeStamp(timestamp),\n message,\n // exception,\n }\n await this.uploadService.createStatus(success ? 'passed' : 'failed')\n }\n}\n"]}
1
+ {"version":3,"file":"report_generator.js","sourceRoot":"","sources":["../../../src/formatter/helpers/report_generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6DAA8C;AAC9C,4CAAmB;AACnB,gDAAuB;AACvB,qDAAmD;AACnD,uCAAwC;AACxC,0CAA0C;AAC1C,8DAAoC;AAWpC,MAAM,GAAG,GACP,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,KAAK;IAClC,CAAC,CAAC,mCAAmC;IACrC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,OAAO;QACtC,CAAC,CAAC,gCAAgC;QAClC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,OAAO;YACtC,CAAC,CAAC,qCAAqC;YACvC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,MAAM;gBACrC,CAAC,CAAC,+BAA+B;gBACjC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc;oBAC3B,CAAC,CAAC,+BAA+B;oBACjC,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,WAAW,CAAA;AAEtD,MAAM,kBAAkB,GAAG,MAAA,OAAO,CAAC,GAAG,CAAC,kBAAkB,mCAAI,GAAG,CAAA;AAChE,MAAM,UAAU,GAAG,EAAE,CAAA;AACrB,MAAM,WAAW,GAAG,CAAC,CAAA;AACrB,MAAM,oBAAoB,GACxB,MAAA,OAAO,CAAC,GAAG,CAAC,KAAK,mCAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAA;AAiIvD,MAAqB,eAAe;IAApC;QACU,WAAM,GAAe;YAC3B,MAAM,EAAE;gBACN,MAAM,EAAE,SAAS;aAClB;YACD,SAAS,EAAE,EAAwB;YACnC,GAAG,EAAE;gBACH,IAAI,EAAE,EAAE;gBACR,OAAO,EAAE,EAAE;aACZ;SACF,CAAA;QACO,uBAAkB,GAAG,IAAI,GAAG,EAAoC,CAAA;QAChE,YAAO,GAAG,IAAI,GAAG,EAAyB,CAAA;QAC1C,cAAS,GAAG,IAAI,GAAG,EAA2B,CAAA;QAC9C,gBAAW,GAAG,IAAI,GAAG,EAA6B,CAAA;QAClD,gBAAW,GAAG,IAAI,GAAG,EAA6B,CAAA;QAClD,kBAAa,GAAG,IAAI,GAAG,EAAoB,CAAA;QAC3C,sBAAiB,GAAG,IAAI,GAAG,EAA4B,CAAA;QACvD,8BAAyB,GAAG,IAAI,GAAG,EAAkB,CAAA;QACrD,SAAI,GAAa,EAAE,CAAA;QACnB,eAAU,GAAU,EAAE,CAAA;QACtB,aAAQ,GAAa,EAAE,CAAA;QACvB,oBAAe,GAAU,EAAE,CAAA;QAC3B,YAAO,GAAG,EAAE,CAAA;QACZ,iBAAY,GAAG,EAAE,CAAA;QACjB,wBAAmB,GAAG,EAAE,CAAA;QACxB,gBAAW,GAAa,EAAE,CAAA;QAC1B,sBAAiB,GAAY,KAAK,CAAA,CAAC,yCAAyC;QACpF,iBAAY,GAAkB,IAAI,CAAA;QAC1B,kBAAa,GAAG,IAAI,iCAAgB,CAC1C,kBAAkB,EAClB,oBAAoB,CACrB,CAAA;QACO,oBAAe,GAAkB,IAAI,CAAA;QA2oB5B,eAAU,GAAG,CAAC,CAAA;IA+GjC,CAAC;IAxvBC,KAAK,CAAC,aAAa,CACjB,QAAqD,EACrD,OAAgB;QAEhB,IAAI,QAAQ,CAAC,IAAI,IAAI,SAAS,IAAI,QAAQ,CAAC,IAAI,EAAE;YAC/C,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAA;SACrC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAA4B,CAAA;QAChE,QAAQ,IAAI,EAAE;YACZ,wBAAwB;YACxB,0BAA0B;YAC1B,KAAK,YAAY,CAAC,CAAC;gBACjB,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;gBACjC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAA;gBACjC,MAAK;aACN;YACD,KAAK,iBAAiB,CAAC,CAAC;gBACtB,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;gBAC1B,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAA;gBAC3B,MAAK;aACN;YACD,KAAK,QAAQ,CAAC,CAAC;gBACb,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;gBAC7B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;gBACrB,MAAK;aACN;YACD,kCAAkC;YAClC,uCAAuC;YACvC,KAAK,gBAAgB,CAAC,CAAC;gBACrB,MAAM,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;gBACrC,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAA;gBACrC,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;gBAChD,MAAK;aACN;YACD,KAAK,UAAU,CAAC,CAAC;gBACf,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;gBAE/B,6BAA6B;gBAC7B,IAAI,CAAC,WAAW,GAAG,EAAE,CAAA;gBAErB,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;oBAC3B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAA;oBAE7B,oEAAoE;oBACpE,MAAM,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAA;oBAChD,MAAM,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAA;oBAEhD,gCAAgC;oBAChC,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,KAAU,EAAE,GAAG,IAAW,EAAE,EAAE;wBACpD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;wBACvC,OAAO,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,CAAA;oBACjE,CAAC,CAAA;oBAED,gCAAgC;oBAChC,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,KAAU,EAAE,GAAG,IAAW,EAAE,EAAE;wBACpD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;wBACvC,OAAO,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,CAAA;oBACjE,CAAC,CAAA;iBACF;gBAED,6BAA6B;gBAC7B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;gBAEzB,MAAK;aACN;YACD,KAAK,iBAAiB,CAAC,CAAC;gBACtB,IAAI,CAAC,eAAe,GAClB,QAAQ,CAAC,IAAI,CAGd,CAAC,eAAe,CAAA;gBACjB,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;gBACtC,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAA;gBACvC,MAAK;aACN;YACD,KAAK,iBAAiB,CAAC,CAAC;gBACtB,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;gBACtC,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAA;gBACvC,MAAK;aACN;YACD,KAAK,YAAY,CAAC,CAAC;gBACjB,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;gBACjC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAA;gBAC7B,MAAK;aACN;YACD,KAAK,kBAAkB,CAAC,CAAC;gBACvB,MAAM,gBAAgB,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;gBACvC,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAA;gBACzC,MAAK;aACN;YACD,KAAK,kBAAkB,CAAC,CAAC;gBACvB,MAAM,gBAAgB,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;gBACvC,IAAI,YAAY,GAAG,IAAI,CAAC,eAAe,CAAA;gBAEvC,IAAI,OAAO,EAAE;oBACX,YAAY,GAAG,OAAO,CAAA;iBACvB;gBAED,qCAAqC;gBACrC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAC1C,gBAAgB,EAChB,YAAY,CACb,CAAA;gBACD,OAAO,MAAM,CAAA;aACd;YACD,sCAAsC;YACtC,KAAK,iBAAiB,CAAC,CAAC;gBACtB,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;gBACtC,MAAM,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAA;gBAC7C,MAAK;aACN;YAED,kCAAkC;YAClC,0CAA0C;SAC3C;IACH,CAAC;IACD,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IACO,gBAAgB,CAAC,UAA+B;QACtD,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,CAAA;QAC9B,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA;QACtC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG;YACnB,MAAM,EAAE,QAAQ;YAChB,SAAS,EAAE,SAAS;YACpB,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE,OAAO;SACjB,CAAA;IACH,CAAC;IAEO,iBAAiB,CAAC,GAA6B;QACrD,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QACzC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACrC,IAAI,KAAK,CAAC,QAAQ,EAAE;gBAClB,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;oBACpC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;gBACjC,CAAC,CAAC,CAAA;aACH;iBAAM,IAAI,KAAK,CAAC,UAAU,EAAE;gBAC3B,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;oBACtC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;gBACjC,CAAC,CAAC,CAAA;aACH;iBAAM,IAAI,KAAK,CAAC,IAAI,EAAE;gBACrB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;oBACpC,IAAI,KAAK,CAAC,QAAQ,EAAE;wBAClB,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;4BACpC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;wBACjC,CAAC,CAAC,CAAA;qBACH;yBAAM,IAAI,KAAK,CAAC,UAAU,EAAE;wBAC3B,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;4BACtC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;wBACjC,CAAC,CAAC,CAAA;qBACH;gBACH,CAAC,CAAC,CAAA;aACH;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IACO,QAAQ,CAAC,MAAuB;QACtC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IACvC,CAAC;IACO,YAAY,CAAC,SAA6B;QAChD,OAAO,SAAS,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,KAAK,GAAG,OAAO,CAAA;IAC7D,CAAC;IACO,gBAAgB,CAAC,cAAuC;QAC9D,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG;YACnB,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,SAAS,CAAC;SACvD,CAAA;IACH,CAAC;IACO,UAAU,CAAC,QAA2B;QAC5C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAA;QAC3C,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YACtC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAA;QAC7C,CAAC,CAAC,CAAA;IACJ,CAAC;IACO,aAAa,CAAC,GAA6B,EAAE,UAAkB;QACrE,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE;YACxC,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE,KAAK,UAAU,EAAE;gBACtD,OAAO,KAAK,CAAC,QAAQ,CAAA;aACtB;YACD,IAAI,KAAK,CAAC,IAAI,EAAE;gBACd,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE;oBAC1C,IAAI,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,UAAU,EAAE;wBAC5D,OAAO,QAAQ,CAAC,QAAQ,CAAA;qBACzB;iBACF;aACF;SACF;QACD,MAAM,IAAI,KAAK,CAAC,aAAa,UAAU,aAAa,CAAC,CAAA;IACvD,CAAC;IACO,cAAc,CAAC,QAA2B,EAAE,SAAiB;QACnE,MAAM,UAAU,GAA2B,EAAE,CAAA;QAC7C,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,UAAU,CAAA;QACrD,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,QAAQ,EAAE;YACxC,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,SAAS,EAAE;gBACzC,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS,EAAE;oBAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;wBAC1D,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;4BAC7C,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;qBAC1B;iBACF;aACF;SACF;QACD,OAAO,UAAU,CAAA;IACnB,CAAC;IACO,iBAAiB,CAAC,eAAyC;QACjE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,eAAe,CAAA;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QACjD,IAAI,QAAQ,KAAK,SAAS;YACxB,MAAM,IAAI,KAAK,CAAC,oBAAoB,UAAU,YAAY,CAAC,CAAA;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QACpD,IAAI,MAAM,KAAK,SAAS;YACtB,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,CAAC,QAAQ,YAAY,CAAC,CAAA;QAElE,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACnD,IAAI,GAAG,KAAK,SAAS;YACnB,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,CAAC,GAAG,YAAY,CAAC,CAAA;QACrE,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAA;QAEpC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;QACpD,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAA;QAClC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;YACnD,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;SAClD;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;QACtE,OAAO,CAAC,GAAG,CACT,oBAAoB,YAAY,cAAc,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAC9E,UAAU,CACX,sBAAsB,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;OACzD,CACF,CAAA;QACD,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAChC,UAAU,EACV,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CACnD,CAAA;QACD,MAAM,KAAK,GAAe,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;YACxD,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;YACvC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YACrC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE;gBACpC,IAAI,EAAE,IAAI,CAAC,WAAW;gBACtB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,QAAQ,EAAE,EAAE;gBACZ,MAAM,EAAE;oBACN,MAAM,EAAE,SAAS;iBAClB;gBACD,WAAW,EAAE,EAAE;gBACf,MAAM,EAAE,EAAE;gBACV,IAAI,EAAE,EAAE;gBACR,YAAY,EAAE,IAAI,CAAC,YAAY;aAChC,CAAC,CAAA;YACF,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;QAC9C,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,EAAE;YAC7B,EAAE;YACF,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,WAAW;YACX,YAAY;YACZ,UAAU;YACV,KAAK;YACL,MAAM,EAAE;gBACN,MAAM,EAAE,SAAS;gBACjB,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;aACxC;YACD,MAAM,EAAE,EAAE;YACV,UAAU,EAAE,EAAE;YACd,GAAG,EAAE;gBACH,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI;gBAC1B,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO;aACjC;SACF,CAAC,CAAA;QACF,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IAC5D,CAAC;IACO,iBAAiB,CAAC,eAAyC;QACjE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,eAAe,CAAA;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QACjD,IAAI,QAAQ,KAAK,SAAS;YACxB,MAAM,IAAI,KAAK,CAAC,oBAAoB,UAAU,YAAY,CAAC,CAAA;QAC7D,IAAI,QAAQ,CAAC,YAAY,KAAK,SAAS;YAAE,OAAM;QAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;QACjE,WAAW,CAAC,MAAM,GAAG;YACnB,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;SACxC,CAAA;IACH,CAAC;IACO,YAAY,CAAC,UAA+B;QAClD,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,UAAU,CAAA;QAClD,IAAI,SAAS,KAAK,YAAY,EAAE;YAC9B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;YAC9C,OAAM;SACP;QACD,IAAI,SAAS,KAAK,kCAAkC,EAAE;YACpD,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAA;YAC/B,OAAM;SACP;QACD,IAAI,SAAS,KAAK,iCAAiC,EAAE;YACnD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;YACxB,OAAM;SACP;QACD,IAAI,SAAS,KAAK,sBAAsB,EAAE;YACxC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAA;YACtB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACrC,QAAQ,CAAC,GAAG,GAAG,IAAI,CAAA;gBACnB,OAAO,QAAQ,CAAA;YACjB,CAAC,CAAC,CAAA;SACH;QACD,IAAI,SAAS,KAAK,sBAAsB,EAAE;YACxC,MAAM,GAAG,GAAW,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACpC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE;gBAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACnB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;aACxB;SACF;QACD,IAAI,SAAS,KAAK,0BAA0B,EAAE;YAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACnC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,IAAI;gBAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YACnE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;SACtC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QACjD,IAAI,QAAQ,CAAC,YAAY,KAAK,SAAS;YAAE,OAAM;QAE/C,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;QACjE,IAAI,SAAS,KAAK,kBAAkB,EAAE;YACpC,MAAM,OAAO,GAAgB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAC7C,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;SACnC;aAAM,IAAI,SAAS,KAAK,wBAAwB,EAAE;YACjD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAC7B,WAAW,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAA;SAC/C;QAED,IAAI,SAAS,KAAK,wBAAwB,EAAE;YAC1C,IAAI;gBACF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBAC7B,WAAW,CAAC,SAAS,GAAG,IAAI,CAAA;aAC7B;YAAC,OAAO,KAAK,EAAE;gBACd,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAA;aAClD;SACF;QAED,IAAI,SAAS,KAAK,oCAAoC,EAAE;YACtD,IAAI;gBACF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBAC7B,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAA;aACpC;YAAC,OAAO,KAAK,EAAE;gBACd,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAA;aACzD;SACF;IACH,CAAC;IACO,uBAAuB,CAAC,EAC9B,QAAQ,EACR,SAAS,EACT,OAAO,EACP,MAAM,EACN,QAAQ,GAOT;QACC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;YAC9B,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE;gBACtC,OAAO;oBACL,MAAM,EAAE,QAAQ;oBAChB,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO;oBAC/B,IAAI,EAAE,QAAQ;oBACd,SAAS;oBACT,OAAO;iBACC,CAAA;aACX;SACF;QACD,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,SAAS;YACT,OAAO;YACP,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EAAE,QAAQ;SACf,CAAA;IACH,CAAC;IACO,kBAAkB,CAAC,gBAA2C;QACpE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,gBAAgB,CAAA;QAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QACjD,IAAI,QAAQ,CAAC,YAAY,KAAK,SAAS,EAAE;YACvC,IAAI,cAAc,CAAC,MAAM,KAAK,QAAQ,EAAE;gBACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CACzC,gBAAgB,CAAC,iBAAiB,CACnC,CAAA;gBACD,MAAM,IAAI,GACR,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAA;gBAEpE,MAAM,QAAQ,GAAa;oBACzB,YAAY,EAAE,IAAI;oBAClB,QAAQ,EAAE,EAAE;oBACZ,OAAO,EAAE,IAAI;oBACb,IAAI,EAAE,EAAE;oBACR,WAAW,EAAE,EAAE;oBACf,MAAM,EAAE;wBACN,MAAM,EAAE,QAAQ;wBAChB,OAAO,EAAE,cAAc,CAAC,OAAO;wBAC/B,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;wBACvC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;qBACtC;oBACD,IAAI,EAAE,aAAa;oBACnB,IAAI;oBACJ,MAAM,EAAE,EAAE;iBACX,CAAA;gBAED,IAAI,IAAI,KAAK,QAAQ,EAAE;oBACrB,QAAQ,CAAC,KAAK,GAAG,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;iBAC/C;qBAAM;oBACL,QAAQ,CAAC,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;iBAC/C;gBAED,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAA;gBACxE,OAAO,CAAC,KAAK,CACX,0CAA0C,cAAc,CAAC,OAAO,EAAE,CACnE,CAAA;aACF;YACD,OAAM;SACP;QACD,IAAI,cAAc,CAAC,MAAM,KAAK,WAAW,EAAE;YACzC,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;YAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAA;YACzE,MAAM,gBAAgB,GAAwB;gBAC5C,UAAU,EAAE,UAAU;gBACtB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,kBAAkB,GAAG,QAAQ;oBACnC,MAAM,EAAE;wBACN,MAAM,EAAE,QAAQ;wBAChB,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;wBACvC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;qBACtC;iBACF,CAAC;gBACF,SAAS,EAAE,kBAAkB;gBAC7B,eAAe,EAAE,QAAQ,CAAC,yBAAyB,CAAC,QAAQ;aAC7D,CAAA;YACD,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAA;SACpC;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;QACjE,MAAM,cAAc,GAAG,WAAW,CAAC,MAGlC,CAAA;QACD,IAAI,IAAI,GAAG,EAAE,CAAA;QACb,IAAI;YACF,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAA;YACtC,IAAI,YAAY,KAAK,IAAI,EAAE;gBACzB,MAAM,IAAI,KAAK,CACb,oHAAoH,CACrH,CAAA;aACF;YACD,IAAI,YAAE,CAAC,UAAU,CAAC,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,EAAE;gBACvD,IAAI,GAAG,IAAI,CAAC,KAAK,CACf,YAAE,CAAC,YAAY,CAAC,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,CAC9D,CAAA;aACF;SACF;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;SACvC;QACD,IAAI,cAAc,CAAC,MAAM,KAAK,QAAQ,EAAE;YACtC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,uBAAuB,CAAC;gBAChD,QAAQ,EAAE,WAAW,CAAC,QAAQ;gBAC9B,SAAS,EAAE,cAAc,CAAC,SAAS;gBACnC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;gBACrC,MAAM,EAAE,cAAc;gBACtB,QAAQ,EAAE,WAAW,CAAC,IAAI;aAC3B,CAAC,CAAA;SACH;aAAM;YACL,WAAW,CAAC,MAAM,GAAG;gBACnB,MAAM,EAAE,cAAc,CAAC,MAAM;gBAC7B,SAAS,EAAE,cAAc,CAAC,SAAS;gBACnC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;aACtC,CAAA;SACF;QAED,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAA;QAClC,WAAW,CAAC,WAAW,GAAG,IAAI,CAAC,eAAe,CAAA;QAC9C,WAAW,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAA;QAC5C,IAAI,CAAC,YAAY,GAAG,EAAE,CAAA;QACtB,IAAI,CAAC,eAAe,GAAG,EAAE,CAAA;QACzB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;QAClB,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;YAChC,WAAW,CAAC,IAAI,GAAG,IAAI,CAAA;YACvB,MAAM,EAAE,GAAG,gBAAgB,CAAC,iBAAiB,CAAA;YAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,UAAU,CAAA;YAC5D,MAAM,WAAW,GAAsB,EAAE,CAAA;YACzC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;;gBAClC,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAA;gBAC7C,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;oBAC5D,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;oBAC/C,IAAI,KAAK,GAAG,MAAM,CAAC,MAAA,qBAAU,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,mCAAI,UAAU,CAAC,CAAA;oBAC5D,IAAI,KAAK,EAAE;wBACT,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;4BAC/B,KAAK,GAAG,aAAa,CAAA;yBACtB;6BAAM,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;4BACpC,KAAK,GAAG,WAAW,CAAA;yBACpB;6BAAM,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;4BACpC,KAAK,GAAG,WAAW,CAAA;yBACpB;wBACD,WAAW,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;qBACzB;iBACF;qBAAM;oBACL,WAAW,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAA;iBACnC;YACH,CAAC,CAAC,CAAA;YACF,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACtC,OAAO,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAA;YAC3B,CAAC,CAAC,CAAC,UAAU,GAAG,WAAW,CAAA;SAC5B;QAED,iDAAiD;QACjD,gEAAgE;QAChE,6CAA6C;QAC7C,sCAAsC;QACtC,MAAM;QACN,sCAAsC;QACtC,yBAAyB;QACzB,oBAAoB;QACpB,MAAM;QACN,wEAAwE;QACxE,qBAAqB;QACrB,gBAAgB;QAChB,+DAA+D;QAC/D,IAAI;IACN,CAAC;IACD,iBAAiB;QACf,IAAI,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;QAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE;YAC5B,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAA;SACvC;QACD,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;QACvD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;YAC7B,OAAO,EAAE,CAAA;SACV;QACD,IAAI,MAAM,GAAG,CAAC,CAAA;QACd,OAAO,YAAE,CAAC,UAAU,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,MAAM,OAAO,CAAC,CAAC,EAAE;YAC5D,MAAM,EAAE,CAAA;SACT;QACD,IAAI,MAAM,KAAK,CAAC,EAAE;YAChB,OAAO,EAAE,CAAA;SACV;QACD,IAAI;YACF,MAAM,cAAc,GAAG,YAAE,CAAC,YAAY,CACpC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,EAC1C,MAAM,CACP,CAAA;YACD,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;SAClC;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,EAAE,CAAA;SACV;IACH,CAAC;IACO,iBAAiB,CAAC,KAAiB;QACzC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE;YACpD,OAAO;gBACL,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,6CAA6C;aAC9C,CAAA;SACX;QACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;gBAC1B,KAAK,QAAQ;oBACX,OAAO;wBACL,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;wBAC1B,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;wBAC5B,oCAAoC;qBAC5B,CAAA;gBACZ,KAAK,WAAW,CAAC;gBACjB,KAAK,WAAW,CAAC;gBACjB,KAAK,SAAS;oBACZ,OAAO;wBACL,MAAM,EAAE,QAAQ;wBAChB,OAAO,EAAE,SAAS,IAAI,CAAC,IAAI,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;qBAC/C,CAAA;aACb;SACF;QACD,OAAO;YACL,MAAM,EAAE,QAAQ;SACR,CAAA;IACZ,CAAC;IACO,KAAK,CAAC,kBAAkB,CAC9B,gBAA2C,EAC3C,OAAgB;QAEhB,MAAM,EAAE,iBAAiB,EAAE,SAAS,EAAE,GAAG,gBAAgB,CAAA;QACzD,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;QAClE,MAAM,UAAU,GAAG,YAAY,CAAC,MAG/B,CAAA;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAA;QAC5C,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,EAAE;YACzC,IAAI,CAAC,aAAa,CAAC,sBAAsB,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;SAClE;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;QAC5C,YAAY,CAAC,MAAM,GAAG;YACpB,GAAG,MAAM;YACT,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,OAAO;SACR,CAAA;QACD,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAA;QAC/B,YAAY,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAA;QACzC,YAAY,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAA;QAC3D,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE;YACrB,YAAY,CAAC,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,iBAAiB,MAAM,CAAC,CAAA;SACvE;QACD,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAA;QAC7B,IAAI,CAAC,UAAU,GAAG,EAAE,CAAA;QACpB,IAAI,CAAC,IAAI,GAAG,EAAE,CAAA;QAEd,IACE,IAAI,CAAC,WAAW;YAChB,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;YAC3B,CAAC,YAAY,CAAC,SAAS,EACvB;YACA,4BAA4B;YAC5B,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAA;YAC1D,MAAM,QAAQ,GAAG,eAAe,iBAAiB,MAAM,CAAA;YACvD,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;YAE7C,mCAAmC;YACnC,YAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YAE1C,6BAA6B;YAC7B,YAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;YAE/D,uEAAuE;YACvE,YAAY,CAAC,SAAS,GAAG,iBAAiB,CAAA;SAC3C;QACD,IAAI,CAAC,WAAW,GAAG,EAAE,CAAA;QAErB,IAAI,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE;YAC3C,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAA;YAC3D,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;gBACrC,YAAE,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;aAChC;YACD,MAAM,cAAc,GAAG,cAAI,CAAC,IAAI,CAC9B,IAAI,CAAC,YAAY,EACjB,GAAG,OAAO,IAAI,YAAY,CAAC,YAAY,OAAO,CAC/C,CAAA;YACD,IAAA,wBAAa,EAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YACpE,OAAO,SAAS,CAAA;SACjB;aAAM;YACL,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;SACxD;IACH,CAAC;IAGO,KAAK,CAAC,cAAc,CAAC,QAA0B,EAAE,OAAgB;QACvE,IAAI,IAAI,GAAG,IAAI,CAAA;QACf,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE;YAC3D,IAAI;gBACF,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;gBAC9C,MAAK;aACN;YAAC,OAAO,CAAC,EAAE;gBACV,OAAO,CAAC,KAAK,CAAC,WAAW,OAAO,6BAA6B,EAAE,CAAC,CAAC,CAAA;gBACjE,IAAI,OAAO,KAAK,IAAI,CAAC,UAAU,EAAE;oBAC/B,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAA;iBACvE;qBAAM;oBACL,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAA,CAAC,sCAAsC;oBACjF,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAA;iBAClD;aACF;SACF;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,QAA0B,EAAE,OAAgB;QAClE,IAAI,KAAK,GAAG,EAAE,CAAA;QACd,IAAI,SAAS,GAAG,EAAE,CAAA;QAClB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE;YACpC,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,IAAI,CAAA;SACvC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAa,CAAA;QACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QACxD,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACxB,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;QAC3D,IAAI;YACF,IACE,OAAO,CAAC,GAAG,CAAC,MAAM;gBAClB,OAAO,CAAC,GAAG,CAAC,UAAU;gBACtB,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,EACjC;gBACA,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAA;gBAC1B,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAA;aACnC;iBAAM;gBACL,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,iBAAiB,CACvD,IAAI,CAAC,OAAO,EACZ,QAAQ,CAAC,GAAG,CACb,CAAA;gBACD,KAAK,GAAG,MAAM,CAAC,GAAG,CAAA;gBAClB,SAAS,GAAG,MAAM,CAAC,UAAU,CAAA;gBAC7B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE;oBACrC,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,CAAA;oBAC1B,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,SAAS,CAAA;iBACnC;aACF;YACD,IAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAA;YACxC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAClD,QAAQ,EACR,KAAK,EACL,SAAS,EACT,IAAI,CAAC,YAAY,EACjB,OAAO,CACR,CAAA;YACD,OAAO,IAAI,CAAA;SACZ;gBAAS;YACR,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAa,CAAA;YACtE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA;YAC1C,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;SACzD;IACH,CAAC;IAEO,yBAAyB,CAAC,QAA0B;;QAC1D,MAAM,YAAY,GAChB,MAAA,IAAI,CAAC,YAAY,mCAAI,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAA;QAC9D,IAAI,CAAC,YAAY,EAAE;YACjB,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAA;YAC7C,OAAM;SACP;QACD,IAAI;YACF,IAAI,CAAC,GAAG,CAAC,CAAA;YACT,OAAO,YAAE,CAAC,UAAU,CAAC,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE;gBACrD,CAAC,EAAE,CAAA;aACJ;YACD,YAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;YAC7C,2CAA2C;YAC3C,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAA;YACtC,OAAO,QAAQ,CAAC,UAAU,CAAA;YAC1B,OAAO,QAAQ,CAAC,MAAM,CAAA;YACtB,YAAE,CAAC,aAAa,CACd,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,EAAE,EAAE,aAAa,CAAC,EAC9C,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAClC,CAAA;YACD,YAAE,CAAC,aAAa,CACd,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,EAAE,EAAE,cAAc,CAAC,EAC/C,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CACpC,CAAA;SACF;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAA;SAChE;IACH,CAAC;IACO,KAAK,CAAC,iBAAiB,CAAC,eAAyC;QACvE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,eAAe,CAAA;QACvD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,MAG9B,CAAA;QACD,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG;YACnB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;YACrC,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;YACrC,OAAO;YACP,aAAa;SACd,CAAA;QACD,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;IACtE,CAAC;CACF;AA3xBD,kCA2xBC","sourcesContent":["import * as messages from '@cucumber/messages'\nimport fs from 'fs'\nimport path from 'path'\nimport { RunUploadService } from './upload_serivce'\nimport { writeFileSync } from 'fs-extra'\n// type JsonException = messages.Exception\nimport objectPath from 'object-path'\ntype JsonTimestamp = number //messages.Timestamp\ntype JsonStepType =\n | 'Unknown'\n | 'Context'\n | 'Action'\n | 'Outcome'\n | 'Conjunction'\n | 'After'\n | 'Before'\n\nconst URL =\n process.env.NODE_ENV_BLINQ === 'dev'\n ? 'https://dev.api.blinq.io/api/runs'\n : process.env.NODE_ENV_BLINQ === 'local'\n ? 'http://localhost:5001/api/runs'\n : process.env.NODE_ENV_BLINQ === 'stage'\n ? 'https://stage.api.blinq.io/api/runs'\n : process.env.NODE_ENV_BLINQ === 'prod'\n ? 'https://api.blinq.io/api/runs'\n : !process.env.NODE_ENV_BLINQ\n ? 'https://api.blinq.io/api/runs'\n : `${process.env.NODE_ENV_BLINQ}/api/runs`\n\nconst REPORT_SERVICE_URL = process.env.REPORT_SERVICE_URL ?? URL\nconst BATCH_SIZE = 10\nconst MAX_RETRIES = 3\nconst REPORT_SERVICE_TOKEN =\n process.env.TOKEN ?? process.env.REPORT_SERVICE_TOKEN\nexport type JsonResultUnknown = {\n status: 'UNKNOWN'\n}\ntype JsonResultSkipped = {\n status: 'SKIPPED'\n}\ntype JsonResultUndefined = {\n status: 'UNDEFINED'\n}\ntype JsonResultAmbiguous = {\n status: 'AMBIGUOUS'\n}\nexport type JsonResultStarted = {\n status: 'STARTED'\n startTime: JsonTimestamp\n}\ntype JsonResultPending = {\n status: 'PENDING'\n startTime: JsonTimestamp\n endTime: JsonTimestamp\n}\nexport type JsonResultPassed = {\n status: 'PASSED'\n startTime: JsonTimestamp\n endTime: JsonTimestamp\n}\nexport type JsonResultFailed = {\n status: 'FAILED'\n startTime: JsonTimestamp\n endTime: JsonTimestamp\n message?: string\n name?: string\n // exception?: JsonException\n}\nexport type JsonFixedByAi = {\n status: 'FIXED_BY_AI'\n startTime: JsonTimestamp\n endTime: JsonTimestamp\n}\n\ntype JsonCommandResult = JsonResultPassed | JsonResultFailed\ntype JsonStepResult =\n | JsonResultUnknown\n | JsonResultSkipped\n | JsonResultUndefined\n | JsonResultAmbiguous\n | JsonResultStarted\n | JsonResultPending\n | JsonResultPassed\n | JsonResultFailed\n | JsonFixedByAi\nexport type JsonTestResult =\n | JsonResultUnknown\n | JsonResultStarted\n | JsonResultPassed\n | JsonResultFailed\n | JsonFixedByAi\ntype JsonReportResult = JsonTestResult\n\ntype JsonCommand = {\n type: string\n value?: string\n text: string\n screenshotId?: string\n result: JsonCommandResult\n netWorkLog?: any[]\n}\ntype webLog = {\n type: string\n text: string\n location: string\n time: string\n}\nexport type JsonStep = {\n keyword: string\n type: JsonStepType\n text: string\n commands: JsonCommand[]\n result: JsonStepResult\n webLog: webLog[]\n networkData: any[]\n data?: any\n ariaSnapshot: string\n traceFilePath?: string\n brunoData?: any\n interceptResults?: any\n}\nexport type RetrainStats = {\n result: JsonTestResult\n totalSteps: number\n upload_id: string\n local_id: number\n}\nexport type JsonTestProgress = {\n id: string\n featureName: string\n uri: string\n scenarioName: string\n parameters: Record<string, string>\n steps: JsonStep[]\n result: JsonTestResult\n retrainStats?: RetrainStats\n initialAriaSnapshot?: string\n webLog: any\n networkLog: any\n logFileId?: string\n env: {\n name: string\n baseUrl: string\n }\n traceFileId?: string\n}\n\nexport type JsonReport = {\n testCases: JsonTestProgress[]\n result: JsonReportResult\n env: {\n name: string\n baseUrl: string\n }\n}\n\ninterface MetaMessage extends messages.Meta {\n runName: string\n}\ninterface EnvelopeWithMetaMessage extends messages.Envelope {\n meta: MetaMessage\n}\nexport default class ReportGenerator {\n private report: JsonReport = {\n result: {\n status: 'UNKNOWN',\n },\n testCases: [] as JsonTestProgress[],\n env: {\n name: '',\n baseUrl: '',\n },\n }\n private gherkinDocumentMap = new Map<string, messages.GherkinDocument>()\n private stepMap = new Map<string, messages.Step>()\n private pickleMap = new Map<string, messages.Pickle>()\n private testCaseMap = new Map<string, messages.TestCase>()\n private testStepMap = new Map<string, messages.TestStep>()\n private stepReportMap = new Map<string, JsonStep>()\n private testCaseReportMap = new Map<string, JsonTestProgress>()\n private scenarioIterationCountMap = new Map<string, number>()\n private logs: webLog[] = []\n private networkLog: any[] = []\n private stepLogs: webLog[] = []\n private stepNetworkLogs: any[] = []\n private runName = ''\n private ariaSnapshot = ''\n private initialAriaSnapshot = ''\n private testCaseLog: string[] = []\n private loggingOverridden: boolean = false // Flag to track if logging is overridden\n reportFolder: null | string = null\n private uploadService = new RunUploadService(\n REPORT_SERVICE_URL,\n REPORT_SERVICE_TOKEN\n )\n private retryTestCaseId: string | null = null\n\n async handleMessage(\n envelope: EnvelopeWithMetaMessage | messages.Envelope,\n reRunId?: string\n ): Promise<any> {\n if (envelope.meta && 'runName' in envelope.meta) {\n this.runName = envelope.meta.runName\n }\n const type = Object.keys(envelope)[0] as keyof messages.Envelope\n switch (type) {\n // case \"meta\": { break}\n // case \"source\": { break}\n case 'parseError': {\n const parseError = envelope[type]\n this.handleParseError(parseError)\n break\n }\n case 'gherkinDocument': {\n const doc = envelope[type]\n this.onGherkinDocument(doc)\n break\n }\n case 'pickle': {\n const pickle = envelope[type]\n this.onPickle(pickle)\n break\n }\n // case \"stepDefinition\": { break}\n // case \"hook\": { break} // Before Hook\n case 'testRunStarted': {\n const testRunStarted = envelope[type]\n this.onTestRunStarted(testRunStarted)\n await this.uploadService.createStatus('running')\n break\n }\n case 'testCase': {\n const testCase = envelope[type]\n\n // Initialize the log storage\n this.testCaseLog = []\n\n if (!this.loggingOverridden) {\n this.loggingOverridden = true\n\n // Store the original process.stdout.write, and process.stderr.write\n const originalStdoutWrite = process.stdout.write\n const originalStderrWrite = process.stderr.write\n\n // Override process.stdout.write\n process.stdout.write = (chunk: any, ...args: any[]) => {\n this.testCaseLog.push(chunk.toString())\n return originalStdoutWrite.call(process.stdout, chunk, ...args)\n }\n\n // Override process.stderr.write\n process.stderr.write = (chunk: any, ...args: any[]) => {\n this.testCaseLog.push(chunk.toString())\n return originalStderrWrite.call(process.stderr, chunk, ...args)\n }\n }\n\n // Call the onTestCase method\n this.onTestCase(testCase)\n\n break\n }\n case 'testCaseStarted': {\n this.retryTestCaseId = (\n envelope[type] as messages.TestCaseStarted & {\n retryTestCaseId?: string\n }\n ).retryTestCaseId\n const testCaseStarted = envelope[type]\n this.onTestCaseStarted(testCaseStarted)\n break\n }\n case 'testStepStarted': {\n const testStepStarted = envelope[type]\n this.onTestStepStarted(testStepStarted)\n break\n }\n case 'attachment': {\n const attachment = envelope[type]\n this.onAttachment(attachment)\n break\n }\n case 'testStepFinished': {\n const testStepFinished = envelope[type]\n this.onTestStepFinished(testStepFinished)\n break\n }\n case 'testCaseFinished': {\n const testCaseFinished = envelope[type]\n let reRunIdFinal = this.retryTestCaseId\n\n if (reRunId) {\n reRunIdFinal = reRunId\n }\n\n // Call the onTestCaseFinished method\n const result = await this.onTestCaseFinished(\n testCaseFinished,\n reRunIdFinal\n )\n return result\n }\n // case \"hook\": { break} // After Hook\n case 'testRunFinished': {\n const testRunFinished = envelope[type]\n await this.onTestRunFinished(testRunFinished)\n break\n }\n\n // case \"parameterType\" : { break}\n // case \"undefinedParameterType\": { break}\n }\n }\n getReport() {\n return this.report\n }\n private handleParseError(parseError: messages.ParseError) {\n const { message } = parseError\n const timestamp = new Date().getTime()\n this.report.result = {\n status: 'FAILED',\n startTime: timestamp,\n endTime: timestamp,\n message: message,\n }\n }\n\n private onGherkinDocument(doc: messages.GherkinDocument) {\n this.gherkinDocumentMap.set(doc.uri, doc)\n doc.feature.children.forEach((child) => {\n if (child.scenario) {\n child.scenario.steps.forEach((step) => {\n this.stepMap.set(step.id, step)\n })\n } else if (child.background) {\n child.background.steps.forEach((step) => {\n this.stepMap.set(step.id, step)\n })\n } else if (child.rule) {\n child.rule.children.forEach((child) => {\n if (child.scenario) {\n child.scenario.steps.forEach((step) => {\n this.stepMap.set(step.id, step)\n })\n } else if (child.background) {\n child.background.steps.forEach((step) => {\n this.stepMap.set(step.id, step)\n })\n }\n })\n }\n })\n }\n private onPickle(pickle: messages.Pickle) {\n this.pickleMap.set(pickle.id, pickle)\n }\n private getTimeStamp(timestamp: messages.Timestamp) {\n return timestamp.seconds * 1000 + timestamp.nanos / 1000000\n }\n private onTestRunStarted(testRunStarted: messages.TestRunStarted) {\n this.report.result = {\n status: 'STARTED',\n startTime: this.getTimeStamp(testRunStarted.timestamp),\n }\n }\n private onTestCase(testCase: messages.TestCase) {\n this.testCaseMap.set(testCase.id, testCase)\n testCase.testSteps.forEach((testStep) => {\n this.testStepMap.set(testStep.id, testStep)\n })\n }\n private _findScenario(doc: messages.GherkinDocument, scenarioId: string) {\n for (const child of doc.feature.children) {\n if (child.scenario && child.scenario.id === scenarioId) {\n return child.scenario\n }\n if (child.rule) {\n for (const scenario of child.rule.children) {\n if (scenario.scenario && scenario.scenario.id === scenarioId) {\n return scenario.scenario\n }\n }\n }\n }\n throw new Error(`scenario \"${scenarioId}\" not found`)\n }\n private _getParameters(scenario: messages.Scenario, exampleId: string) {\n const parameters: Record<string, string> = {}\n if (scenario.examples.length === 0) return parameters\n for (const examples of scenario.examples) {\n for (const tableRow of examples.tableBody) {\n if (tableRow.id === exampleId) {\n for (let i = 0; i < examples.tableHeader.cells.length; i++) {\n parameters[examples.tableHeader.cells[i].value] =\n tableRow.cells[i].value\n }\n }\n }\n }\n return parameters\n }\n private onTestCaseStarted(testCaseStarted: messages.TestCaseStarted) {\n const { testCaseId, id, timestamp } = testCaseStarted\n const testCase = this.testCaseMap.get(testCaseId)\n if (testCase === undefined)\n throw new Error(`testCase with id ${testCaseId} not found`)\n const pickle = this.pickleMap.get(testCase.pickleId)\n if (pickle === undefined)\n throw new Error(`pickle with id ${testCase.pickleId} not found`)\n\n const doc = this.gherkinDocumentMap.get(pickle.uri)\n if (doc === undefined)\n throw new Error(`gherkinDocument with uri ${pickle.uri} not found`)\n const featureName = doc.feature.name\n\n const scenarioId = pickle.astNodeIds[0]\n const scenario = this._findScenario(doc, scenarioId)\n const scenarioName = scenario.name\n if (!this.scenarioIterationCountMap.has(scenarioId)) {\n this.scenarioIterationCountMap.set(scenarioId, 1)\n }\n const parameters = this._getParameters(scenario, pickle.astNodeIds[1])\n console.log(\n `Running scenario ${scenarioName} iteration ${this.scenarioIterationCountMap.get(\n scenarioId\n )} with parameters:\\n${JSON.stringify(parameters, null, 4)}\\n \n `\n )\n this.scenarioIterationCountMap.set(\n scenarioId,\n this.scenarioIterationCountMap.get(scenarioId) + 1\n )\n const steps: JsonStep[] = pickle.steps.map((pickleStep) => {\n const stepId = pickleStep.astNodeIds[0]\n const step = this.stepMap.get(stepId)\n this.stepReportMap.set(pickleStep.id, {\n type: step.keywordType,\n keyword: step.keyword,\n text: step.text,\n commands: [],\n result: {\n status: 'UNKNOWN',\n },\n networkData: [],\n webLog: [],\n data: {},\n ariaSnapshot: this.ariaSnapshot,\n })\n return this.stepReportMap.get(pickleStep.id)\n })\n this.testCaseReportMap.set(id, {\n id,\n uri: pickle.uri,\n featureName,\n scenarioName,\n parameters,\n steps,\n result: {\n status: 'STARTED',\n startTime: this.getTimeStamp(timestamp),\n },\n webLog: [],\n networkLog: [],\n env: {\n name: this.report.env.name,\n baseUrl: this.report.env.baseUrl,\n },\n })\n this.report.testCases.push(this.testCaseReportMap.get(id))\n }\n private onTestStepStarted(testStepStarted: messages.TestStepStarted) {\n const { testStepId, timestamp } = testStepStarted\n const testStep = this.testStepMap.get(testStepId)\n if (testStep === undefined)\n throw new Error(`testStep with id ${testStepId} not found`)\n if (testStep.pickleStepId === undefined) return\n const stepProgess = this.stepReportMap.get(testStep.pickleStepId)\n stepProgess.result = {\n status: 'STARTED',\n startTime: this.getTimeStamp(timestamp),\n }\n }\n private onAttachment(attachment: messages.Attachment) {\n const { testStepId, body, mediaType } = attachment\n if (mediaType === 'text/plain') {\n this.reportFolder = body.replaceAll('\\\\', '/')\n return\n }\n if (mediaType === 'application/json+snapshot-before') {\n this.initialAriaSnapshot = body\n return\n }\n if (mediaType === 'application/json+snapshot-after') {\n this.ariaSnapshot = body\n return\n }\n if (mediaType === 'application/json+env') {\n const data = JSON.parse(body)\n this.report.env = data\n this.report.testCases.map((testCase) => {\n testCase.env = data\n return testCase\n })\n }\n if (mediaType === 'application/json+log') {\n const log: webLog = JSON.parse(body)\n if (this.logs.length < 1000) {\n this.logs.push(log)\n this.stepLogs.push(log)\n }\n }\n if (mediaType === 'application/json+network') {\n const networkLog = JSON.parse(body)\n if (this.networkLog.length < 1000) this.networkLog.push(networkLog)\n this.stepNetworkLogs.push(networkLog)\n }\n const testStep = this.testStepMap.get(testStepId)\n if (testStep.pickleStepId === undefined) return\n\n const stepProgess = this.stepReportMap.get(testStep.pickleStepId)\n if (mediaType === 'application/json') {\n const command: JsonCommand = JSON.parse(body)\n stepProgess.commands.push(command)\n } else if (mediaType === 'application/json+trace') {\n const data = JSON.parse(body)\n stepProgess.traceFilePath = data.traceFilePath\n }\n\n if (mediaType === 'application/json+bruno') {\n try {\n const data = JSON.parse(body)\n stepProgess.brunoData = data\n } catch (error) {\n console.error('Error parsing bruno data:', error)\n }\n }\n\n if (mediaType === 'application/json+intercept-results') {\n try {\n const data = JSON.parse(body)\n stepProgess.interceptResults = data\n } catch (error) {\n console.error('Error parsing intercept results:', error)\n }\n }\n }\n private getFailedTestStepResult({\n commands,\n startTime,\n endTime,\n result,\n stepName,\n }: {\n commands: JsonCommand[]\n startTime: number\n endTime: number\n result: messages.TestStepResult\n stepName: string\n }): JsonStepResult {\n for (const command of commands) {\n if (command.result.status === 'FAILED') {\n return {\n status: 'FAILED',\n message: command.result.message,\n name: stepName,\n startTime,\n endTime,\n } as const\n }\n }\n return {\n status: 'FAILED',\n startTime,\n endTime,\n message: result.message,\n name: stepName,\n }\n }\n private onTestStepFinished(testStepFinished: messages.TestStepFinished) {\n const { testStepId, testStepResult, timestamp } = testStepFinished\n const testStep = this.testStepMap.get(testStepId)\n if (testStep.pickleStepId === undefined) {\n if (testStepResult.status === 'FAILED') {\n const testCase = this.testCaseReportMap.get(\n testStepFinished.testCaseStartedId\n )\n const type =\n testCase.steps[0].result.status === 'UNKNOWN' ? 'Before' : 'After'\n\n const hookStep: JsonStep = {\n ariaSnapshot: null,\n commands: [],\n keyword: type,\n data: {},\n networkData: [],\n result: {\n status: 'FAILED',\n message: testStepResult.message,\n startTime: this.getTimeStamp(timestamp),\n endTime: this.getTimeStamp(timestamp),\n },\n text: 'Failed hook',\n type,\n webLog: [],\n }\n\n if (type === 'Before') {\n testCase.steps = [hookStep, ...testCase.steps]\n } else {\n testCase.steps = [...testCase.steps, hookStep]\n }\n\n this.testCaseReportMap.set(testStepFinished.testCaseStartedId, testCase)\n console.error(\n `Before/After hook failed with message: ${testStepResult.message}`\n )\n }\n return\n }\n if (testStepResult.status === 'UNDEFINED') {\n const step = this.stepReportMap.get(testStep.pickleStepId)\n const stepName = step ? step.keyword + ' ' + step.text : 'Undefined step'\n const undefinedCommand: messages.Attachment = {\n testStepId: testStepId,\n body: JSON.stringify({\n type: 'error',\n text: 'Undefined step: ' + stepName,\n result: {\n status: 'FAILED',\n startTime: this.getTimeStamp(timestamp),\n endTime: this.getTimeStamp(timestamp),\n },\n }),\n mediaType: 'application/json',\n contentEncoding: messages.AttachmentContentEncoding.IDENTITY,\n }\n this.onAttachment(undefinedCommand)\n }\n const stepProgess = this.stepReportMap.get(testStep.pickleStepId)\n const prevStepResult = stepProgess.result as {\n status: 'STARTED'\n startTime: JsonTimestamp\n }\n let data = {}\n try {\n const reportFolder = this.reportFolder\n if (reportFolder === null) {\n throw new Error(\n '\"reportFolder\" is \"null\". Failed to run BVT hooks. Please retry after running \"Generate All\" or \"Record Scenario\" '\n )\n }\n if (fs.existsSync(path.join(reportFolder, 'data.json'))) {\n data = JSON.parse(\n fs.readFileSync(path.join(reportFolder, 'data.json'), 'utf8')\n )\n }\n } catch (error) {\n console.log('Error reading data.json')\n }\n if (testStepResult.status === 'FAILED') {\n stepProgess.result = this.getFailedTestStepResult({\n commands: stepProgess.commands,\n startTime: prevStepResult.startTime,\n endTime: this.getTimeStamp(timestamp),\n result: testStepResult,\n stepName: stepProgess.text,\n })\n } else {\n stepProgess.result = {\n status: testStepResult.status,\n startTime: prevStepResult.startTime,\n endTime: this.getTimeStamp(timestamp),\n }\n }\n\n stepProgess.webLog = this.stepLogs\n stepProgess.networkData = this.stepNetworkLogs\n stepProgess.ariaSnapshot = this.ariaSnapshot\n this.ariaSnapshot = ''\n this.stepNetworkLogs = []\n this.stepLogs = []\n if (Object.keys(data).length > 0) {\n stepProgess.data = data\n const id = testStepFinished.testCaseStartedId\n const parameters = this.testCaseReportMap.get(id).parameters\n const _parameters: typeof parameters = {}\n Object.keys(parameters).map((key) => {\n const valueParam = parameters[key].toString()\n if (valueParam.startsWith('{{') && valueParam.endsWith('}}')) {\n const path = valueParam.slice(2, -2).split('.')\n let value = String(objectPath.get(data, path) ?? valueParam)\n if (value) {\n if (value.startsWith('secret:')) {\n value = 'secret:****'\n } else if (value.startsWith('totp:')) {\n value = 'totp:****'\n } else if (value.startsWith('mask:')) {\n value = 'mask:****'\n }\n _parameters[key] = value\n }\n } else {\n _parameters[key] = parameters[key]\n }\n })\n this.report.testCases.find((testCase) => {\n return testCase.id === id\n }).parameters = _parameters\n }\n\n // if (process.env.TESTCASE_REPORT_FOLDER_PATH) {\n // this.reportFolder = process.env.TESTCASE_REPORT_FOLDER_PATH\n // if (!fs.existsSync(this.reportFolder)) {\n // fs.mkdirSync(this.reportFolder)\n // }\n // const reportFilePath = path.join(\n // this.reportFolder,\n // `report.json`\n // )\n // writeFileSync(reportFilePath, JSON.stringify(this.report, null, 2))\n // return undefined\n // // } else {\n // // return await this.uploadTestCase(testProgress, reRunId)\n // }\n }\n getLogFileContent() {\n let projectPath = process.cwd()\n if (process.env.PROJECT_PATH) {\n projectPath = process.env.PROJECT_PATH\n }\n const logFolder = path.join(projectPath, 'logs', 'web')\n if (!fs.existsSync(logFolder)) {\n return []\n }\n let nextId = 1\n while (fs.existsSync(path.join(logFolder, `${nextId}.json`))) {\n nextId++\n }\n if (nextId === 1) {\n return []\n }\n try {\n const logFileContent = fs.readFileSync(\n path.join(logFolder, `${nextId - 1}.json`),\n 'utf8'\n )\n return JSON.parse(logFileContent)\n } catch (error) {\n return []\n }\n }\n private getTestCaseResult(steps: JsonStep[]) {\n if (steps[0] && steps[0].result.status === 'SKIPPED') {\n return {\n status: 'FAILED',\n message: 'Test skipped due to failure in before hooks',\n } as const\n }\n for (const step of steps) {\n switch (step.result.status) {\n case 'FAILED':\n return {\n status: step.result.status,\n message: step.result.message,\n // exception: step.result.exception,\n } as const\n case 'AMBIGUOUS':\n case 'UNDEFINED':\n case 'PENDING':\n return {\n status: 'FAILED',\n message: `step \"${step.text}\" is ${step.result.status}`,\n } as const\n }\n }\n return {\n status: 'PASSED',\n } as const\n }\n private async onTestCaseFinished(\n testCaseFinished: messages.TestCaseFinished,\n reRunId?: string\n ) {\n const { testCaseStartedId, timestamp } = testCaseFinished\n const testProgress = this.testCaseReportMap.get(testCaseStartedId)\n const prevResult = testProgress.result as {\n status: 'STARTED'\n startTime: JsonTimestamp\n }\n const steps = Object.values(testProgress.steps)\n const result = this.getTestCaseResult(steps)\n if (result.status === 'PASSED' && reRunId) {\n this.uploadService.updateProjectAnalytics(process.env.PROJECT_ID)\n }\n const endTime = this.getTimeStamp(timestamp)\n testProgress.result = {\n ...result,\n startTime: prevResult.startTime,\n endTime,\n }\n testProgress.webLog = this.logs\n testProgress.networkLog = this.networkLog\n testProgress.initialAriaSnapshot = this.initialAriaSnapshot\n if (process.env.TRACE) {\n testProgress.traceFileId = path.join(`trace-${testCaseStartedId}.zip`)\n }\n this.initialAriaSnapshot = ''\n this.networkLog = []\n this.logs = []\n\n if (\n this.testCaseLog &&\n this.testCaseLog.length > 0 &&\n !testProgress.logFileId\n ) {\n // Create the logs directory\n const logsDir = path.join(this.reportFolder, 'editorLogs')\n const fileName = `testCaseLog_${testCaseStartedId}.log`\n const filePath = path.join(logsDir, fileName)\n\n // Ensure the logs directory exists\n fs.mkdirSync(logsDir, { recursive: true })\n\n // Write the logs to the file\n fs.writeFileSync(filePath, this.testCaseLog.join('\\n'), 'utf8')\n\n // Store this ID in the testProgress object so it can be accessed later\n testProgress.logFileId = testCaseStartedId\n }\n this.testCaseLog = []\n\n if (process.env.TESTCASE_REPORT_FOLDER_PATH) {\n this.reportFolder = process.env.TESTCASE_REPORT_FOLDER_PATH\n if (!fs.existsSync(this.reportFolder)) {\n fs.mkdirSync(this.reportFolder)\n }\n const reportFilePath = path.join(\n this.reportFolder,\n `${endTime}_${testProgress.scenarioName}.json`\n )\n writeFileSync(reportFilePath, JSON.stringify(testProgress, null, 2))\n return undefined\n } else {\n return await this.uploadTestCase(testProgress, reRunId)\n }\n }\n private readonly retryCount = 3\n\n private async uploadTestCase(testCase: JsonTestProgress, rerunId?: string) {\n let data = null\n for (let attempt = 1; attempt <= this.retryCount; attempt++) {\n try {\n data = await this.tryUpload(testCase, rerunId)\n break\n } catch (e) {\n console.error(`Attempt ${attempt} to upload testcase failed:`, e)\n if (attempt === this.retryCount) {\n console.error('All retry attempts failed, failed to upload testcase.')\n } else {\n const waitTime = 1000 * 2 ** (attempt - 1) //? exponential backoff: 1s, 2s, 4s...\n await new Promise((r) => setTimeout(r, waitTime))\n }\n }\n }\n return data\n }\n\n private async tryUpload(testCase: JsonTestProgress, rerunId?: string) {\n let runId = ''\n let projectId = ''\n if (!process.env.UPLOADING_TEST_CASE) {\n process.env.UPLOADING_TEST_CASE = '[]'\n }\n const anyRemArr = JSON.parse(process.env.UPLOADING_TEST_CASE) as string[]\n const randomID = Math.random().toString(36).substring(7)\n anyRemArr.push(randomID)\n process.env.UPLOADING_TEST_CASE = JSON.stringify(anyRemArr)\n try {\n if (\n process.env.RUN_ID &&\n process.env.PROJECT_ID &&\n !process.env.IGNORE_ENV_VARIABLES\n ) {\n runId = process.env.RUN_ID\n projectId = process.env.PROJECT_ID\n } else {\n const runDoc = await this.uploadService.createRunDocument(\n this.runName,\n testCase.env\n )\n runId = runDoc._id\n projectId = runDoc.project_id\n if (!process.env.IGNORE_ENV_VARIABLES) {\n process.env.RUN_ID = runId\n process.env.PROJECT_ID = projectId\n }\n }\n this.writeTestCaseReportToDisk(testCase)\n const data = await this.uploadService.uploadTestCase(\n testCase,\n runId,\n projectId,\n this.reportFolder,\n rerunId\n )\n return data\n } finally {\n const arrRem = JSON.parse(process.env.UPLOADING_TEST_CASE) as string[]\n arrRem.splice(arrRem.indexOf(randomID), 1)\n process.env.UPLOADING_TEST_CASE = JSON.stringify(arrRem)\n }\n }\n\n private writeTestCaseReportToDisk(testCase: JsonTestProgress) {\n const reportFolder =\n this.reportFolder ?? process.env.TESTCASE_REPORT_FOLDER_PATH\n if (!reportFolder) {\n console.error('Report folder is not defined')\n return\n }\n try {\n let i = 0\n while (fs.existsSync(path.join(reportFolder, `${i}`))) {\n i++\n }\n fs.mkdirSync(path.join(reportFolder, `${i}`))\n //exclude network log from the saved report\n const networkLog = testCase.networkLog\n delete testCase.networkLog\n delete testCase.webLog\n fs.writeFileSync(\n path.join(reportFolder, `${i}`, `report.json`),\n JSON.stringify(testCase, null, 2)\n )\n fs.writeFileSync(\n path.join(reportFolder, `${i}`, `network.json`),\n JSON.stringify(networkLog, null, 2)\n )\n } catch (error) {\n console.error('Error writing test case report to disk:', error)\n }\n }\n private async onTestRunFinished(testRunFinished: messages.TestRunFinished) {\n const { timestamp, success, message } = testRunFinished\n const prevResult = this.report.result as {\n status: 'STARTED'\n startTime: JsonTimestamp\n }\n this.report.result = {\n status: success ? 'PASSED' : 'FAILED',\n startTime: prevResult.startTime,\n endTime: this.getTimeStamp(timestamp),\n message,\n // exception,\n }\n await this.uploadService.createStatus(success ? 'passed' : 'failed')\n }\n}\n"]}
@@ -19,11 +19,14 @@ declare class RunUploadService {
19
19
  updateProjectAnalytics(projectId: string): Promise<void>;
20
20
  upload(formData: FormData): Promise<void>;
21
21
  getPreSignedUrls(fileUris: string[], runId: string): Promise<any>;
22
- uploadTestCase(testCaseReport: JsonTestProgress, runId: string, projectId: string, reportFolder: string, rerunId?: string): Promise<FinishTestCaseResponse>;
22
+ uploadTestCase(testCaseReport: JsonTestProgress, runId: string, projectId: string, reportFolder: string, rerunId?: string): Promise<any>;
23
23
  /**
24
+ * Improving error logging
24
25
  * 🔧 Sanitizes Axios errors to avoid dumping Cloudflare HTML (524, 502, etc.)
25
26
  */
26
27
  private sanitizeError;
28
+ uploadFileWithRetries(filePath: string, presignedUrl: string): Promise<boolean>;
29
+ uploadFilesInBatches(fileUris: string[], reportFolder: string, preSignedUrls: Record<string, string>): Promise<void>;
27
30
  uploadFile(filePath: string, preSignedUrl: string): Promise<boolean>;
28
31
  uploadComplete(runId: string, projectId: string): Promise<void>;
29
32
  modifyTestCase(runId: string, projectId: string, testProgressReport: JsonTestProgress): Promise<void>;
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.RunUploadService = void 0;
8
8
  const fs_1 = require("fs");
9
9
  const promises_1 = __importDefault(require("fs/promises"));
10
+ const p_limit_1 = __importDefault(require("p-limit"));
10
11
  const axios_client_1 = require("../../configuration/axios_client");
11
12
  const path_1 = __importDefault(require("path"));
12
13
  const bvt_analysis_formatter_1 = require("../bvt_analysis_formatter");
@@ -125,61 +126,36 @@ class RunUploadService {
125
126
  return response.data.uploadUrls;
126
127
  }
127
128
  async uploadTestCase(testCaseReport, runId, projectId, reportFolder, rerunId) {
128
- if (process.env.UPLOADREPORTS === 'false') {
129
+ var _a, _b, _c, _d;
130
+ if (process.env.UPLOADREPORTS === 'false')
129
131
  return null;
130
- }
131
132
  const fileUris = [];
132
- // Collect screenshot + trace + logs
133
+ // Collect screenshot + trace + logs + report
133
134
  for (const step of testCaseReport.steps) {
134
135
  for (const command of step.commands) {
135
- if (command.screenshotId) {
136
- fileUris.push(`screenshots/${String(command.screenshotId)}.png`);
137
- }
136
+ if (command.screenshotId)
137
+ fileUris.push(`screenshots/${command.screenshotId}.png`);
138
138
  }
139
- if (step.traceFilePath) {
139
+ if (step.traceFilePath)
140
140
  fileUris.push(`trace/${step.traceFilePath}`);
141
- }
142
141
  }
143
- if (testCaseReport.logFileId) {
142
+ if (testCaseReport.logFileId)
144
143
  fileUris.push(`editorLogs/testCaseLog_${testCaseReport.logFileId}.log`);
145
- }
146
- //
147
- // 🔹 UPLOAD FILES (presigned URLs)
148
- //
144
+ if (testCaseReport.traceFileId)
145
+ fileUris.push(`trace/${testCaseReport.traceFileId}`);
146
+ fileUris.push(`reports/report-${testCaseReport.id}.json`);
147
+ // 🔹 UPLOAD FILES
149
148
  try {
150
149
  const preSignedUrls = await this.getPreSignedUrls(fileUris, runId);
151
- for (let i = 0; i < fileUris.length; i += BATCH_SIZE) {
152
- const batch = fileUris.slice(i, Math.min(i + BATCH_SIZE, fileUris.length));
153
- await Promise.all(batch
154
- .filter((fileUri) => preSignedUrls[fileUri])
155
- .map(async (fileUri) => {
156
- for (let j = 0; j < MAX_RETRIES; j++) {
157
- try {
158
- const filePath = path_1.default.join(reportFolder, fileUri);
159
- if ((0, fs_1.existsSync)(filePath)) {
160
- const ok = await this.uploadFile(filePath, preSignedUrls[fileUri]);
161
- if (ok)
162
- return;
163
- }
164
- const ok = await this.uploadFile(filePath, preSignedUrls[fileUri]);
165
- if (ok)
166
- return;
167
- }
168
- catch (err) {
169
- // Retry silently
170
- }
171
- }
172
- console.error(`Failed to upload file after retries: ${fileUri}`);
173
- }));
174
- }
150
+ await this.uploadFilesInBatches(fileUris, reportFolder, preSignedUrls);
175
151
  }
176
152
  catch (error) {
177
- const sanitized = this.sanitizeError(error);
178
- console.error('Error uploading files:', sanitized);
153
+ console.error('🟥 Error uploading files:', {
154
+ message: error === null || error === void 0 ? void 0 : error.message,
155
+ stack: error === null || error === void 0 ? void 0 : error.stack,
156
+ });
179
157
  }
180
- //
181
- // 🔹 UPLOAD FINAL TEST REPORT (JSON metadata)
182
- //
158
+ // 🔹 UPLOAD FINAL TEST REPORT
183
159
  try {
184
160
  const mode = process.env.MODE === 'cloud'
185
161
  ? 'cloud'
@@ -187,13 +163,11 @@ class RunUploadService {
187
163
  ? 'executions'
188
164
  : 'local';
189
165
  let rerunIdFinal = process.env.RETRY_ID || null;
190
- if (rerunId) {
166
+ if (rerunId)
191
167
  rerunIdFinal = rerunId.includes(runId) ? rerunId : `${runId}${rerunId}`;
192
- }
193
- if (mode === 'executions') {
168
+ if (mode === 'executions')
194
169
  testCaseReport.id = process.env.VIDEO_ID || testCaseReport.id;
195
- }
196
- const { data } = await axios_client_1.axiosClient.post(`${this.runsApiBaseURL}/cucumber-runs/createNewTestCase`, {
170
+ const payload = {
197
171
  runId,
198
172
  projectId,
199
173
  testProgressReport: testCaseReport,
@@ -201,50 +175,94 @@ class RunUploadService {
201
175
  mode,
202
176
  rerunId: rerunIdFinal,
203
177
  video_id: process.env.VIDEO_ID,
204
- }, {
205
- headers: {
206
- Authorization: 'Bearer ' + this.accessToken,
207
- 'x-source': 'cucumber_js',
208
- },
209
- });
210
- // optional event — keep original logic
211
- try {
212
- await axios_client_1.axiosClient.post(`${constants_1.SERVICES_URI.STORAGE}/event`, { event: constants_1.ActionEvents.upload_report }, {
213
- headers: {
214
- Authorization: 'Bearer ' + this.accessToken,
215
- 'x-source': 'cucumber_js',
216
- 'x-bvt-project-id': projectId,
217
- },
218
- });
219
- }
220
- catch (_a) { }
178
+ };
179
+ const data = await (0, bvt_analysis_formatter_1.createNewTestCase)(payload, this.runsApiBaseURL, this.accessToken);
180
+ await (0, bvt_analysis_formatter_1.postUploadReportEvent)(projectId, this.accessToken);
221
181
  (0, bvt_analysis_formatter_1.logReportLink)(runId, projectId, testCaseReport.result);
222
182
  return data;
223
183
  }
224
184
  catch (e) {
225
- const sanitized = this.sanitizeError(e);
226
- console.error(`failed to upload the test case: ${testCaseReport.id} ${sanitized}`);
185
+ console.error('🟥 Failed to upload test case:', {
186
+ testCaseId: testCaseReport.id,
187
+ message: e === null || e === void 0 ? void 0 : e.message,
188
+ status: (_a = e === null || e === void 0 ? void 0 : e.response) === null || _a === void 0 ? void 0 : _a.status,
189
+ responseSnippet: (_d = (_c = (_b = e === null || e === void 0 ? void 0 : e.response) === null || _b === void 0 ? void 0 : _b.data) === null || _c === void 0 ? void 0 : _c.toString()) === null || _d === void 0 ? void 0 : _d.slice(0, 300),
190
+ stack: e === null || e === void 0 ? void 0 : e.stack,
191
+ });
227
192
  return null;
228
193
  }
229
194
  }
230
195
  /**
196
+ * Improving error logging
231
197
  * 🔧 Sanitizes Axios errors to avoid dumping Cloudflare HTML (524, 502, etc.)
232
198
  */
233
199
  sanitizeError(error) {
234
- // Axios-style error with response
200
+ // Handle Axios-style errors with response
235
201
  if (error === null || error === void 0 ? void 0 : error.response) {
236
- const data = error.response.data;
202
+ const { data, status } = error.response;
237
203
  // If Cloudflare or HTML error page → return a short meaningful message
238
204
  if (typeof data === 'string' && data.includes('<!DOCTYPE html')) {
239
- return `[HTML_ERROR_PAGE] status=${error.response.status} - likely Cloudflare timeout or proxy error`;
205
+ return `[HTML_ERROR_PAGE] status=${status} - likely Cloudflare timeout or proxy error`;
240
206
  }
241
- // if JSON or string, return it trimmed
242
- return data;
207
+ // If data is a JSON object, stringify it with indentation for readability
208
+ if (typeof data === 'object') {
209
+ return JSON.stringify(data, null, 2); // Pretty-print the JSON response
210
+ }
211
+ // If response is a string (could be an error message), return it trimmed
212
+ return (data === null || data === void 0 ? void 0 : data.trim()) || `Unknown response data (status: ${status})`;
243
213
  }
244
- // system / network errors
245
- if (error === null || error === void 0 ? void 0 : error.message)
214
+ // System / network errors (e.g., if Axios cannot reach the server)
215
+ if (error === null || error === void 0 ? void 0 : error.message) {
246
216
  return error.message;
247
- return String(error);
217
+ }
218
+ // If the error has a stack (for debugging purposes)
219
+ if (error === null || error === void 0 ? void 0 : error.stack) {
220
+ return `${error.message}\n${error.stack}`;
221
+ }
222
+ // If it's a generic error object, attempt to stringify it in a readable format
223
+ return JSON.stringify(error, (key, value) => {
224
+ // Avoid circular references or sensitive data
225
+ if (key === 'password' || key === 'accessToken')
226
+ return '[REDACTED]';
227
+ return value;
228
+ }, 2); // Pretty-print the error object with indentation
229
+ }
230
+ async uploadFileWithRetries(filePath, presignedUrl) {
231
+ const MAX_RETRIES = 3;
232
+ const RETRY_DELAY_MS = 1000;
233
+ for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
234
+ try {
235
+ const ok = await this.uploadFile(filePath, presignedUrl);
236
+ if (ok)
237
+ return true;
238
+ }
239
+ catch (err) {
240
+ console.error(`Upload attempt #${attempt} failed for ${filePath}:`, {
241
+ message: err === null || err === void 0 ? void 0 : err.message,
242
+ stack: err === null || err === void 0 ? void 0 : err.stack,
243
+ });
244
+ if (attempt < MAX_RETRIES) {
245
+ await new Promise((r) => setTimeout(r, RETRY_DELAY_MS * attempt));
246
+ }
247
+ }
248
+ }
249
+ console.error(`Failed to upload file after ${MAX_RETRIES} retries: ${filePath}`);
250
+ return false;
251
+ }
252
+ async uploadFilesInBatches(fileUris, reportFolder, preSignedUrls) {
253
+ const MAX_CONCURRENCY = 5;
254
+ const limit = (0, p_limit_1.default)(MAX_CONCURRENCY);
255
+ const tasks = fileUris
256
+ .filter((uri) => preSignedUrls[uri])
257
+ .map((uri) => limit(async () => {
258
+ const filePath = uri.includes('reports')
259
+ ? path_1.default.join(reportFolder, '0', 'report.json')
260
+ : path_1.default.join(reportFolder, uri);
261
+ if ((0, fs_1.existsSync)(filePath)) {
262
+ await this.uploadFileWithRetries(filePath, preSignedUrls[uri]);
263
+ }
264
+ }));
265
+ await Promise.all(tasks);
248
266
  }
249
267
  async uploadFile(filePath, preSignedUrl) {
250
268
  if (process.env.UPLOADREPORTS === 'false') {
@@ -263,8 +281,9 @@ class RunUploadService {
263
281
  });
264
282
  }
265
283
  catch (error) {
266
- if (process.env.NODE_ENV_BLINQ === 'dev') {
267
- console.error('Error uploading file:', error);
284
+ if (process.env.MODE === 'executions') {
285
+ const sanitized = this.sanitizeError(error);
286
+ console.error('❌ Error uploading file at:', filePath, 'due to', sanitized);
268
287
  }
269
288
  success = false;
270
289
  }