git-hash-art 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"mappings":";;AAAA;;;;;ACAA;;;;;;;;;;;;;;;;;;;AEAA,CAWA,iCAAiC;;;ACX1B,SAAS,0CAAc,OAAe;IAC3C,OAAO,SAAS,QAAQ,KAAK,CAAC,GAAG,IAAI;AACvC;AAMO,SAAS,0CAAU,IAAY;IACpC,IAAI,IAAI,OAAO;IACf,OAAO;QACL,IAAI,AAAC,IAAI,aAAc;QACvB,IAAI,IAAI,KAAK,IAAI,CAAC,IAAK,MAAM,IAAK,IAAI;QACtC,IAAI,AAAC,IAAI,KAAK,IAAI,CAAC,IAAK,MAAM,GAAI,KAAK,KAAM;QAC7C,OAAO,AAAC,CAAA,AAAC,CAAA,IAAK,MAAM,EAAE,MAAO,CAAA,IAAK;IACpC;AACF;AAMO,SAAS,0CAAa,IAAY,EAAE,SAAS,CAAC;IACnD,IAAI,IAAI;IACR,IAAK,IAAI,IAAI,GAAG,IAAI,KAAK,MAAM,EAAE,IAC/B,IAAI,AAAC,KAAK,IAAI,CAAC,IAAI,KAAK,KAAK,UAAU,CAAC,KAAM;IAEhD,OAAO,AAAC,IAAI,SAAU;AACxB;AAMO,SAAS,0CACd,IAAY,EACZ,KAAa,EACb,GAAW,EACX,GAAW;IAEX,MAAM,MAAM,0CAAU,0CAAa,MAAM;IACzC,OAAO,MAAM,QAAS,CAAA,MAAM,GAAE;AAChC;AAGO,MAAM,4CAAc;IACzB,cAAc;IACd,eAAe,KAAK,IAAI,CAAC;IACzB,eAAe,KAAK,IAAI,CAAC;IACzB,eAAe,KAAK,IAAI,CAAC;IACzB,IAAI,KAAK,EAAE;IACX,KAAK,AAAC,CAAA,IAAI,KAAK,IAAI,CAAC,EAAC,IAAK;AAC5B;AAkBO,MAAM;IACX,OAAO,oBAAoB,QAAgB,EAAE,UAAkB,EAAU;QACvE,OAAO,WAAW;IACpB;IAEA,OAAO,cACL,GAA6B,EAC7B,KAAa,EACb,MAAc,EACR;QACN,IAAI,SAAS,CAAC,QAAQ,GAAG,SAAS;IACpC;IAEA,4DAA4D;IAC5D,OAAO,cACL,GAA6B,EAC7B,QAAmB,EACnB,MAAmB,EACb;QACN,MAAM,YACJ,QAAQ,eACR,cAAc,uBACd,mBAAmB,qBACnB,iBAAiB,mBACjB,iBAAiB,gBAClB,GAAG;QAEJ,SAAS,OAAO,CAAC,CAAC,SAAS;YACzB,MAAM,OAAO,IAAI,CAAC,mBAAmB,CACnC,UACA,KAAK,GAAG,CAAC,yCAAW,CAAC,eAAe,EAAE;YAExC,MAAM,UAAU,KAAK,GAAG,CAAC,KAAK,cAAc,QAAQ;YACpD,MAAM,WAAW,iBAAiB;YAElC,IAAI,IAAI;YACR,IAAI,WAAW,GAAG;YAClB,IAAI,MAAM,CAAC,AAAC,WAAW,KAAK,EAAE,GAAI;YAElC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,MAAM,QAAQ,MAAM;YAC9C,IAAI,OAAO;QACb;IACF;AACF;;;AF5GA,uEAAuE;AACvE,yEAAyE;AACzE,wCAAwC;AAExC,MAAM,yCAAmB;IACvB;IACA;IACA;IACA;IACA;IACA;CACD;AAGD;;CAEC,GACD,SAAS,oCAAc,IAAY;IACjC,OAAO,sCAAgB,CAAC,KAAK,GAAG,CAAC,QAAQ,uCAAiB,MAAM,CAAC;AACnE;AAEA;;;CAGC,GACD,MAAM,qCAAe;IACnB;IACA;IACA;IACA;IACA;CACD;AAGD,SAAS,qCAAe,IAAY;IAClC,OAAO,kCAAY,CAAC,KAAK,GAAG,CAAC,QAAQ,KAAK,mCAAa,MAAM,CAAC;AAChE;AAUA,SAAS,kCAAY,GAAW;IAC9B,IAAI,AAAC,OAAO,KAAK,OAAO,MAAO,OAAO,KAAK,OAAO;IAClD,IAAI,OAAO,OAAO,OAAO,KAAK,OAAO;IACrC,OAAO;AACT;AAEA;;;CAGC,GACD,SAAS,qCAAe,GAAW,EAAE,MAAuB,EAAE,MAAc;IAC1E,IAAI,WAAW,QAAQ;QACrB,8CAA8C;QAC9C,MAAM,aAAa;QACnB,MAAM,OAAO,AAAE,CAAA,aAAa,MAAM,GAAE,IAAK,MAAO;QAChD,OAAO,AAAC,CAAA,MAAM,OAAO,SAAS,GAAE,IAAK;IACvC,OAAO;QACL,6CAA6C;QAC7C,MAAM,aAAa;QACnB,MAAM,OAAO,AAAE,CAAA,aAAa,MAAM,GAAE,IAAK,MAAO;QAChD,OAAO,AAAC,CAAA,MAAM,OAAO,SAAS,GAAE,IAAK;IACvC;AACF;AAGO,MAAM;IAUX,YAAY,OAAe,CAAE;QAC3B,IAAI,CAAC,IAAI,GAAG,CAAA,GAAA,yCAAY,EAAE;QAC1B,IAAI,CAAC,GAAG,GAAG,CAAA,GAAA,yCAAQ,EAAE,CAAA,GAAA,yCAAW,EAAE,SAAS;QAC3C,8DAA8D;QAC9D,IAAI,CAAC,SAAS,GAAG,oCAAc,IAAI,CAAC,IAAI;QACxC,IAAI,CAAC,UAAU,GAAG,qCAAe,IAAI,CAAC,IAAI;QAC1C,iEAAiE;QACjE,MAAM,WAAW,IAAI,CAAC,GAAG;QACzB,IAAI,CAAC,eAAe,GAAG,WAAW,MAAM,YAAY,WAAW,MAAM,YAAY;QACjF,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,kBAAkB;QACzC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,2BAA2B;QAC3D,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,qBAAqB;IACjD;IAEQ,qBAA+B;QACrC,MAAM,SAAS,IAAI,CAAA,GAAA,kBAAU;QAC7B,OAAO,OACJ,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,KACrB,MAAM,CAAC,IAAI,CAAC,UAAU,EACtB,SAAS,CAAC,IAAI,CAAC,SAAS,EACxB,MAAM,GACN,GAAG,CAAC,CAAC,MAAgB,CAAC,CAAC,EAAE,IAAI,CAAC;IACnC;IAEQ,8BAAwC;QAC9C,MAAM,mBAAmB,AAAC,CAAA,IAAI,CAAC,IAAI,GAAG,GAAE,IAAK;QAC7C,yDAAyD;QACzD,MAAM,gBACJ,IAAI,CAAC,SAAS,KAAK,SAAS,SAAS,IAAI,CAAC,SAAS,KAAK,SAAS,UAAU,IAAI,CAAC,SAAS;QAC3F,MAAM,SAAS,IAAI,CAAA,GAAA,kBAAU;QAC7B,OAAO,OACJ,QAAQ,CAAC,kBACT,MAAM,CAAC,QACP,SAAS,CAAC,eACV,MAAM,GACN,GAAG,CAAC,CAAC,MAAgB,CAAC,CAAC,EAAE,IAAI,CAAC;IACnC;IAEQ,wBAAkC;QACxC,MAAM,aAAa,AAAC,CAAA,IAAI,CAAC,IAAI,GAAG,GAAE,IAAK;QACvC,MAAM,SAAS,IAAI,CAAA,GAAA,kBAAU;QAC7B,OAAO,OACJ,QAAQ,CAAC,YACT,MAAM,CAAC,UACP,SAAS,CAAC,IAAI,CAAC,SAAS,EACxB,MAAM,GACN,GAAG,CAAC,CAAC,MAAgB,CAAC,CAAC,EAAE,IAAI,CAAC;IACnC;IAEA;;;;GAIC,GACD,YAAsB;QACpB,wCAAwC;QACxC,MAAM,MAAM;eACP,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG;eACzB,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,GAAG;eAClC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG;SAChC;QACD,OAAO;eAAI,IAAI,IAAI;SAAK;IAC1B;IAEA;;;GAGC,GACD,gBAAgB,IAAY,EAAY;QACtC,MAAM,UAAU,IAAI,CAAC,IAAI,GAAG;QAC5B,OAAQ;YACN,KAAK;gBAAc;oBACjB,gCAAgC;oBAChC,MAAM,IAAI,MAAM,IAAI,CAAC,GAAG,KAAK;oBAC7B,OAAO;wBAAC;wBAAM;wBAAK;wBAAM;wBAAK;qBAAK,CAAC,GAAG,CAAC,CAAC,IACvC,+BAAS,SAAS,GAAG;gBAEzB;YACA,KAAK;gBAAW;oBACd,iCAAiC;oBACjC,MAAM,OAAO,AAAC,CAAA,UAAU,MAAM,IAAI,CAAC,GAAG,KAAK,EAAC,IAAK;oBACjD,OAAO;wBACL,+BAAS,SAAS,KAAK;wBACvB,+BAAS,SAAS,KAAK;wBACvB,+BAAS,MAAM,KAAK;wBACpB,+BAAS,MAAM,KAAK;qBACrB;gBACH;YACA,KAAK;gBAAQ;oBACX,gCAAgC;oBAChC,MAAM,OAAO;wBAAC;wBAAU,CAAA,UAAU,EAAC,IAAK;wBAAM,CAAA,UAAU,GAAE,IAAK;wBAAM,CAAA,UAAU,GAAE,IAAK;qBAAI;oBAC1F,OAAO,KAAK,GAAG,CAAC,CAAC,IAAM,+BAAS,GAAG,KAAK,OAAO,IAAI,CAAC,GAAG,KAAK;gBAC9D;YACA,KAAK;gBAAgB;oBACnB,eAAe;oBACf,MAAM,OAAO;wBAAC;wBAAU,CAAA,UAAU,EAAC,IAAK;wBAAM,CAAA,UAAU,GAAE,IAAK;wBAAM,CAAA,UAAU,GAAE,IAAK;qBAAI;oBAC1F,OAAO,KAAK,GAAG,CAAC,CAAC,IAAM,+BAAS,GAAG,MAAM,IAAI,CAAC,GAAG,KAAK,KAAK,OAAO,IAAI,CAAC,GAAG,KAAK;gBACjF;YACA,KAAK;gBAAS;oBACZ,wDAAwD;oBACxD,MAAM,YAAY;wBAAC;wBAAI;wBAAI;wBAAI;wBAAI;qBAAI,EAAE,gCAAgC;oBACzE,OAAO,UAAU,GAAG,CAAC,CAAC,IACpB,+BAAS,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,KAAK,OAAO,IAAI,CAAC,GAAG,KAAK;gBAE/E;YACA,KAAK;gBAAiB;oBACpB,qCAAqC;oBACrC,MAAM,SAAS,+BAAS,SAAS,KAAK;oBACtC,OAAO;wBAAC;wBAAW;wBAAW;wBAAQ,+BAAS,SAAS,KAAK;qBAAM;gBACrE;YACA,KAAK;YACL;gBACE,OAAO,IAAI,CAAC,SAAS;QACzB;IACF;IAEA;;GAEC,GACD,0BAA0B,IAAY,EAAoB;QACxD,OAAQ;YACN,KAAK;gBACH,OAAO;oBAAC,+BAAS,IAAI,CAAC,IAAI,GAAG,KAAK,MAAM;oBAAO,+BAAS,AAAC,CAAA,IAAI,CAAC,IAAI,GAAG,EAAC,IAAK,KAAK,KAAK;iBAAM;YAC7F,KAAK;YACL,KAAK;gBACH,OAAO;oBAAC;oBAAW;iBAAU;YAC/B,KAAK;gBACH,OAAO;oBAAC;oBAAW;iBAAU;YAC/B,KAAK;gBACH,OAAO;oBAAC,IAAI,CAAC,MAAM,CAAC,+BAAS,IAAI,KAAK,OAAO;oBAAM,IAAI,CAAC,MAAM,CAAC,+BAAS,IAAI,MAAM,MAAM;iBAAK;YAC/F;gBACE,OAAO,IAAI,CAAC,mBAAmB;QACnC;IACF;IAEA;;;GAGC,GACD,sBAAwC;QACtC,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE;QAC5B,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE;QAE5B,IAAI,IAAI,CAAC,eAAe,KAAK,WAAW;YACtC,MAAM,SAAS,IAAI,CAAC,eAAe,KAAK,YAAY,SAAS;YAC7D,MAAM,IAAI,CAAC,qBAAqB,CAAC,KAAK,QAAQ;YAC9C,MAAM,IAAI,CAAC,qBAAqB,CAAC,KAAK,QAAQ;QAChD;QAEA,OAAO;YAAC,IAAI,CAAC,MAAM,CAAC,KAAK;YAAO,IAAI,CAAC,MAAM,CAAC,KAAK;SAAM;IACzD;IAEA;;;GAGC,GACD,qBAAsC;QACpC,OAAO,IAAI,CAAC,eAAe;IAC7B;IAEA;;GAEC,GACD,AAAQ,sBAAsB,GAAW,EAAE,MAAuB,EAAE,MAAc,EAAU;QAC1F,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,+BAAS;QAC3B,MAAM,UAAU,qCAAe,GAAG,QAAQ;QAC1C,OAAO,+BAAS,SAAS,GAAG;IAC9B;IAEA;;GAEC,GACD,AAAQ,OAAO,GAAW,EAAE,MAAc,EAAU;QAClD,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK;QAC3B,MAAM,IAAI,KAAK,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,IAAI,MAAM;QACvD,MAAM,IAAI,KAAK,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,IAAI,MAAM;QACvD,MAAM,IAAI,KAAK,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,IAAI,MAAM;QACvD,OAAO,CAAC,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,QAAQ,CAAC,GAAG,KAAK,EAAE,EAAE,QAAQ,CAAC,IAAI,QAAQ,CAAC,GAAG,KAAK,EAAE,EAAE,QAAQ,CAAC,IAAI,QAAQ,CAAC,GAAG,KAAK,CAAC;IAClH;AACF;AAEA,uEAAuE;AAEvE,sDAAsD,GACtD,SAAS,+BAAS,GAAW;IAC3B,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK;IAC3B,OAAO;QACL,SAAS,EAAE,SAAS,CAAC,GAAG,IAAI;QAC5B,SAAS,EAAE,SAAS,CAAC,GAAG,IAAI;QAC5B,SAAS,EAAE,SAAS,CAAC,GAAG,IAAI;KAC7B;AACH;AAEA,sCAAsC,GACtC,SAAS,+BAAS,CAAS,EAAE,CAAS,EAAE,CAAS;IAC/C,MAAM,QAAQ,CAAC,IAAc,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC;IAClE,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,IAAI,QAAQ,CAAC,GAAG,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC,IAAI,QAAQ,CAAC,GAAG,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC,IAAI,QAAQ,CAAC,GAAG,KAAK,CAAC;AACvI;AAEA,gDAAgD,GAChD,SAAS,+BAAS,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,+BAAS,KAAK,GAAG,CAAC,CAAC,IAAM,IAAI;IAC/C,MAAM,MAAM,KAAK,GAAG,CAAC,GAAG,GAAG;IAC3B,MAAM,MAAM,KAAK,GAAG,CAAC,GAAG,GAAG;IAC3B,MAAM,IAAI,AAAC,CAAA,MAAM,GAAE,IAAK;IACxB,IAAI,QAAQ,KAAK,OAAO;QAAC;QAAG;QAAG;KAAE;IACjC,MAAM,IAAI,MAAM;IAChB,MAAM,IAAI,IAAI,MAAM,IAAK,CAAA,IAAI,MAAM,GAAE,IAAK,IAAK,CAAA,MAAM,GAAE;IACvD,IAAI,IAAI;IACR,IAAI,QAAQ,GAAG,IAAI,AAAC,CAAA,AAAC,CAAA,IAAI,CAAA,IAAK,IAAK,CAAA,IAAI,IAAI,IAAI,CAAA,CAAC,IAAK;SAChD,IAAI,QAAQ,GAAG,IAAI,AAAC,CAAA,AAAC,CAAA,IAAI,CAAA,IAAK,IAAI,CAAA,IAAK;SACvC,IAAI,AAAC,CAAA,AAAC,CAAA,IAAI,CAAA,IAAK,IAAI,CAAA,IAAK;IAC7B,OAAO;QAAC,IAAI;QAAK;QAAG;KAAE;AACxB;AAEA,qDAAqD,GACrD,SAAS,+BAAS,CAAS,EAAE,CAAS,EAAE,CAAS;IAC/C,IAAI,AAAC,CAAA,AAAC,IAAI,MAAO,GAAE,IAAK;IACxB,MAAM,IAAI,AAAC,CAAA,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,EAAC,IAAK;IACtC,MAAM,IAAI,IAAK,CAAA,IAAI,KAAK,GAAG,CAAC,AAAE,IAAI,KAAM,IAAK,EAAC;IAC9C,MAAM,IAAI,IAAI,IAAI;IAClB,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI;IACtB,IAAI,IAAI,IAAI;QAAE,IAAI;QAAG,IAAI;IAAG,OACvB,IAAI,IAAI,KAAK;QAAE,IAAI;QAAG,IAAI;IAAG,OAC7B,IAAI,IAAI,KAAK;QAAE,IAAI;QAAG,IAAI;IAAG,OAC7B,IAAI,IAAI,KAAK;QAAE,IAAI;QAAG,IAAI;IAAG,OAC7B,IAAI,IAAI,KAAK;QAAE,IAAI;QAAG,IAAI;IAAG,OAC7B;QAAE,IAAI;QAAG,IAAI;IAAG;IACrB,OAAO,+BAAS,AAAC,CAAA,IAAI,CAAA,IAAK,KAAK,AAAC,CAAA,IAAI,CAAA,IAAK,KAAK,AAAC,CAAA,IAAI,CAAA,IAAK;AAC1D;AAMO,SAAS,0CAAa,GAAW,EAAE,KAAa;IACrD,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,+BAAS;IAC3B,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;AACnD;AAMO,SAAS,0CACd,GAAW,EACX,GAAiB,EACjB,SAAS,GAAG;IAEZ,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,+BAAS;IAC3B,MAAM,MAAM,IAAM,AAAC,CAAA,QAAQ,GAAE,IAAK,IAAI,SAAS;IAC/C,OAAO,+BAAS,IAAI,OAAO,IAAI,OAAO,IAAI;AAC5C;AAMO,SAAS,yCAAW,GAAW,EAAE,MAAc;IACpD,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,+BAAS;IAC3B,MAAM,OAAO,QAAQ,IAAI,QAAQ,IAAI,QAAQ;IAC7C,MAAM,MAAM,CAAC,IAAc,IAAI,AAAC,CAAA,OAAO,CAAA,IAAK;IAC5C,OAAO,+BAAS,IAAI,IAAI,IAAI,IAAI,IAAI;AACtC;AAMO,SAAS,0CAAiB,GAAW,EAAE,MAAuB,EAAE,MAAc;IACnF,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,+BAAS;IAC3B,OAAO,+BAAS,qCAAe,GAAG,QAAQ,SAAS,GAAG;AACxD;AAMO,SAAS,0CAAU,GAAW;IACnC,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,+BAAS,KAAK,GAAG,CAAC,CAAC;QACnC,MAAM,IAAI,IAAI;QACd,OAAO,KAAK,UAAU,IAAI,QAAQ,KAAK,GAAG,CAAC,AAAC,CAAA,IAAI,KAAI,IAAK,OAAO;IAClE;IACA,OAAO,SAAS,IAAI,SAAS,IAAI,SAAS;AAC5C;AAUO,SAAS,0CACd,KAAa,EACb,WAAmB,EACnB,cAAc,IAAI;IAElB,MAAM,QAAQ,0CAAU;IACxB,MAAM,OAAO,KAAK,GAAG,CAAC,QAAQ;IAE9B,IAAI,QAAQ,aAAa,OAAO;IAEhC,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,+BAAS;IAE3B,IAAI,cAAc,KAAK;QACrB,iDAAiD;QACjD,MAAM,UAAU,KAAK,GAAG,CAAC,MAAM,IAAI,AAAC,CAAA,cAAc,IAAG,IAAK;QAC1D,MAAM,UAAU,KAAK,GAAG,CAAC,GAAG,IAAI;QAChC,OAAO,+BAAS,GAAG,SAAS;IAC9B,OAAO;QACL,iDAAiD;QACjD,MAAM,UAAU,KAAK,GAAG,CAAC,MAAM,IAAI,AAAC,CAAA,cAAc,IAAG,IAAK;QAC1D,MAAM,UAAU,KAAK,GAAG,CAAC,GAAG,IAAI;QAChC,OAAO,+BAAS,GAAG,SAAS;IAC9B;AACF;;CDjYC;;AMhBM,MAAM,4CAA2B,CAAC,KAAK;IAC5C,IAAI,SAAS;IACb,IAAI,GAAG,CAAC,GAAG,GAAG,OAAO,GAAG,GAAG,KAAK,EAAE,GAAG;AACvC;AAEO,MAAM,4CAA2B,CAAC,KAAK;IAC5C,IAAI,SAAS;IACb,IAAI,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,OAAO,GAAG,MAAM;AACvC;AAEO,MAAM,4CAA6B,CAAC,KAAK;IAC9C,IAAI,SAAS;IACb,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO;IACtB,IAAI,MAAM,CAAC,CAAC,OAAO,GAAG,OAAO;IAC7B,IAAI,MAAM,CAAC,OAAO,GAAG,OAAO;IAC5B,IAAI,SAAS;AACf;AAEO,MAAM,4CAA4B,CAAC,KAAK;IAC7C,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IAAK;QAC1B,MAAM,QAAQ,AAAE,KAAK,EAAE,GAAG,IAAK,IAAK;QACpC,MAAM,IAAI,AAAC,OAAO,IAAK,KAAK,GAAG,CAAC;QAChC,MAAM,IAAI,AAAC,OAAO,IAAK,KAAK,GAAG,CAAC;QAChC,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG;aACtB,IAAI,MAAM,CAAC,GAAG;IACrB;IACA,IAAI,SAAS;AACf;AAEO,MAAM,2CAAyB,CAAC,KAAK;IAC1C,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,IAAI,IAAI,IAAK;QAC3B,MAAM,QAAQ,KAAK,EAAE,GAAG,IAAI,AAAC,KAAK,EAAE,GAAG,IAAK,IAAI;QAChD,MAAM,SAAS,IAAI,MAAM,IAAI,OAAO,IAAI,OAAO;QAC/C,MAAM,IAAI,SAAS,KAAK,GAAG,CAAC;QAC5B,MAAM,IAAI,SAAS,KAAK,GAAG,CAAC;QAC5B,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG;aACtB,IAAI,MAAM,CAAC,GAAG;IACrB;IACA,IAAI,SAAS;AACf;AAEO,MAAM,4CAA+B,CAAC,KAAK;IAChD,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,IAAI,IAAI,IAAK;QAC3B,MAAM,QAAQ,KAAK,EAAE,GAAG,KAAK,AAAC,KAAK,EAAE,GAAG,KAAM,IAAI;QAClD,MAAM,SAAS,IAAI,MAAM,IAAI,OAAO,IAAI,OAAO;QAC/C,MAAM,IAAI,SAAS,KAAK,GAAG,CAAC;QAC5B,MAAM,IAAI,SAAS,KAAK,GAAG,CAAC;QAC5B,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG;aACtB,IAAI,MAAM,CAAC,GAAG;IACrB;IACA,IAAI,SAAS;AACf;AAEO,MAAM,4CAA0B,CAAC,KAAK;IAC3C,IAAI,SAAS;IACb,IAAI,MAAM,CAAC,GAAG,OAAO;IACrB,IAAI,gBAAgB,CAAC,OAAO,GAAG,OAAO,GAAG,GAAG,CAAC,OAAO;IACpD,IAAI,gBAAgB,CAAC,CAAC,OAAO,GAAG,OAAO,GAAG,GAAG,OAAO;AACtD;AAEO,MAAM,2CAA4B,CAAC,KAAK;IAC7C,IAAI,SAAS;IACb,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO;IACtB,IAAI,MAAM,CAAC,OAAO,GAAG;IACrB,IAAI,MAAM,CAAC,GAAG,OAAO;IACrB,IAAI,MAAM,CAAC,CAAC,OAAO,GAAG;IACtB,IAAI,SAAS;AACf;AAEO,MAAM,4CAAyB,CAAC,KAAK;IAC1C,IAAI,SAAS;IACb,IAAI,MAAM,CAAC,CAAC,OAAO,GAAG,CAAC,OAAO;IAC9B,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC,OAAO;IAC7B,IAAI,MAAM,CAAC,OAAO,GAAG,OAAO;IAC5B,IAAI,MAAM,CAAC,CAAC,OAAO,GAAG,OAAO;IAC7B,IAAI,SAAS;AACf;AAGO,MAAM,4CAA4C;IACvD,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,SAAS;IACT,MAAM;IACN,eAAe;IACf,OAAO;IACP,SAAS;IACT,MAAM;AACR;;;AE9FA,2CAA2C;AA2BpC,MAAM,2CAAmB;IAC9B,uCAAuC;IACvC,OAAO;QACL,MAAM;QACN,OAAO;QACP,QAAQ;IACV;IACA,SAAS;QACP,MAAM;QACN,OAAO;QACP,QAAQ;QACR,UAAU;IACZ;IACA,yBAAyB;IACzB,QAAQ;QACN,MAAM;QACN,OAAO;QACP,QAAQ;QACR,UAAU;QACV,gBAAgB;IAClB;IACA,WAAW;QACT,MAAM;QACN,OAAO;QACP,QAAQ;QACR,UAAU;QACV,gBAAgB;IAClB;IACA,qBAAqB;IACrB,oBAAoB;QAClB,MAAM;QACN,OAAO;QACP,QAAQ;IACV;IACA,mBAAmB;QACjB,MAAM;QACN,OAAO;QACP,QAAQ;QACR,UAAU;QACV,QAAQ;IACV;IACA,kBAAkB;QAChB,MAAM;QACN,OAAO;QACP,QAAQ;QACR,UAAU;QACV,gBAAgB;IAClB;IACA,mBAAmB;QACjB,MAAM;QACN,OAAO;QACP,QAAQ;QACR,UAAU;QACV,gBAAgB;IAClB;IACA,eAAe;IACf,mBAAmB;QACjB,MAAM;QACN,OAAO;QACP,QAAQ;QACR,UAAU;QACV,QAAQ;IACV;IACA,oBAAoB;QAClB,MAAM;QACN,OAAO;QACP,QAAQ;QACR,UAAU;QACV,QAAQ;IACV;IACA,yBAAyB;IACzB,SAAS;QACP,MAAM;QACN,OAAO;QACP,QAAQ;QACR,QAAQ;QACR,aAAa;QACb,gBAAgB;IAClB;IACA,SAAS;QACP,MAAM;QACN,OAAO;QACP,QAAQ;QACR,UAAU;QACV,QAAQ;QACR,gBAAgB;QAChB,cAAc;QACd,cAAc;IAChB;AACF;AAGO,MAAM,4CAAkC;IAC7C,aAAa;IACb,WAAW;IACX,WAAW;IACX,UAAU;IACV,YAAY;IACZ,SAAS;AACX;AAGO,MAAM,4CAAmB;IAC9B,OAAO;IACP,UAAU;IACV,UAAU;AACZ;AAGO,MAAM,4CAAc;IACzB,cAAc;IACd,eAAe,KAAK,IAAI,CAAC;IACzB,eAAe,KAAK,IAAI,CAAC;IACzB,eAAe,KAAK,IAAI,CAAC;IACzB,IAAI,KAAK,EAAE;IACX,KAAK,AAAC,CAAA,IAAI,KAAK,IAAI,CAAC,EAAC,IAAK;AAC5B;AAGO,MAAM,4CAAiB;IAC5B,qBAAqB,CAAC,OAAiB;YACrC,8CAA8C;YAC9C;gBAAE,MAAM;gBAAW,QAAQ;oBAAE,MAAM,OAAO;gBAAI;YAAE;YAChD;gBAAE,MAAM;gBAAa,QAAQ;oBAAE,MAAM,OAAO;gBAAI;YAAE;SACnD;IAED,qBAAqB,CAAC,OAAiB;YACrC;gBAAE,MAAM;gBAAiB,QAAQ;0BAAE;oBAAM,MAAM;gBAAc;YAAE;YAC/D;gBAAE,MAAM;gBAAiB,QAAQ;oBAAE,MAAM,OAAO;oBAAK,MAAM;gBAAO;YAAE;YACpE;gBAAE,MAAM;gBAAiB,QAAQ;oBAAE,MAAM,OAAO;oBAAK,MAAM;gBAAa;YAAE;SAC3E;IAED,YAAY,CAAC,OAAiB;YAC5B,4CAA4C;YAC5C;gBAAE,MAAM;gBAAmB,QAAQ;oBAAE,MAAM,OAAO;gBAAI;YAAE;YACxD;gBAAE,MAAM;gBAAiB,QAAQ;oBAAE,MAAM,OAAO;gBAAI;YAAE;SACvD;AACH;;;ACjJO,MAAM,4CAAW,CAAC,UAA4B,AAAC,UAAU,KAAK,EAAE,GAAI;AAEpE,MAAM,4CAAkB,CAC7B,KACA,MACA;IAEA,IAAI,IAAI;IACR,IAAI,SAAS,CAAC,GAAG;IACjB,IAAI,OAAO,QAAQ,EACjB,IAAI,MAAM,CAAC,0CAAS,OAAO,QAAQ;IAErC,IAAI,SAAS,GAAG,OAAO,SAAS;IAChC,IAAI,WAAW,GAAG,OAAO,WAAW;IACpC,IAAI,SAAS,GAAG,OAAO,SAAS;AAClC;AAEO,MAAM,4CAAiB,CAAC;IAC7B,IAAI,OAAO;AACb;AAGO,MAAM,4CAAwB,CAAC,OAAmC,CAAA;QACvE,SAAS;QACT,UAAU;QACV,QAAQ;cACR;IAEF,CAAA;AAEO,MAAM,4CAAqB,CAChC,IACA,IACA,QACA;IAEA,MAAM,SAAkB,EAAE;IAC1B,IAAK,IAAI,IAAI,GAAG,IAAI,UAAU,IAAK;QACjC,MAAM,QAAQ,AAAC,IAAI,WAAY,KAAK,EAAE,GAAG;QACzC,OAAO,IAAI,CAAC;YACV,GAAG,KAAK,KAAK,GAAG,CAAC,SAAS;YAC1B,GAAG,KAAK,KAAK,GAAG,CAAC,SAAS;QAC5B;IACF;IACA,OAAO;AACT;;;AF9CO,MAAM,4CAAe;IAC1B,UAAU;QACR,aAAa;YAAE,UAAU;YAAG,OAAO;QAAE;QACrC,MAAM;YAAE,UAAU;YAAG,OAAO;QAAE;QAC9B,YAAY;YAAE,UAAU;YAAG,OAAO;QAAE;QACpC,cAAc;YAAE,UAAU;YAAI,OAAO;QAAG;QACxC,aAAa;YAAE,UAAU;YAAI,OAAO;QAAG;IACzC;IACA,WAAW;QACT,YAAY;QACZ,cAAc;IAChB;IACA,aAAa;QACX,YAAY;QACZ,OAAO;IACT;AACF;AAkBO,MAAM,4CAAkC,CAAC,KAAK,MAAM,SAAS,CAAC,CAAC;IACpE,MAAM,cAAc;QAAE,GAAG,CAAA,GAAA,yCAAiB,CAAC;QAAE,GAAG,MAAM;IAAC;IACvD,CAAA,GAAA,yCAAc,EAAE,KAAK,MAAM;IAE3B,MAAM,YAAY,OAAO,IAAI;IAC7B,MAAM,cACJ,0CAAa,QAAQ,CAAC,UAAU,IAAI,0CAAa,QAAQ,CAAC,WAAW;IACvE,MAAM,YACJ,QAAQ,EAET,GAAG;IACJ,MAAM,SAAS,OAAO;IAEtB,kDAAkD;IAClD,MAAM,SAAS,CAAA,GAAA,yCAAiB,EAAE,GAAG,GAAG,QAAQ;IAEhD,IAAI,SAAS;IACb,8BAA8B;IAC9B,OAAO,OAAO,CAAC,CAAC,IAAI;QAClB,OAAO,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC;YAC3B,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;YACrB,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;QACvB;IACF;IAEA,IAAI,YAAY,SAAS,KAAK,eAC5B,IAAI,IAAI;IAEV,IAAI,MAAM;IACV,CAAA,GAAA,yCAAa,EAAE;AACjB;AAEO,MAAM,4CAAoC,CAAC,KAAK,MAAM,SAAS,CAAC,CAAC;IACtE,MAAM,cAAc;QAClB,GAAG,CAAA,GAAA,yCAAiB,CAAC;QACrB,GAAG,0CAAa,SAAS;QACzB,GAAG,MAAM;IACX;IACA,CAAA,GAAA,yCAAc,EAAE,KAAK,MAAM;IAE3B,IAAI,UAAU;IACd,IAAI,WAAW;IACf,IAAI,QAAQ,OAAO,KAAK,GAAG,CAAC,YAAY,YAAY,EAAE,YAAY,UAAU;IAE5E,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,IAAI,YAAY,UAAU,EAAE,IAAK;QAC/C,MAAM,SAAS,QAAQ;QACvB,MAAM,UAAU,SAAS;QACzB,MAAM,UAAU,SAAS;QAEzB,IAAI,GAAG,CAAC,SAAS,SAAS,QAAQ,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG;QAErD,kCAAkC;QAClC,MAAM,OAAO,UAAU;QACvB,WAAW;QACX,UAAU;QAEV,+BAA+B;QAC/B,IAAI,SAAS,CAAC,QAAQ;QACtB,IAAI,MAAM,CAAC,KAAK,EAAE,GAAG;IACvB;IAEA,IAAI,MAAM;IACV,CAAA,GAAA,yCAAa,EAAE;AACjB;AAEO,MAAM,4CAAmC,CAAC,KAAK,MAAM,SAAS,CAAC,CAAC;IACrE,MAAM,cAAc;QAAE,GAAG,CAAA,GAAA,yCAAiB,CAAC;QAAE,GAAG,MAAM;IAAC;IACvD,CAAA,GAAA,yCAAc,EAAE,KAAK,MAAM;IAE3B,MAAM,WAAW;IACjB,MAAM,OAAO,OAAO;IAEpB,IAAI,SAAS;IACb,mBAAmB;IACnB,IAAK,IAAI,IAAI,GAAG,KAAK,UAAU,IAC7B,IAAK,IAAI,IAAI,GAAG,KAAK,UAAU,IAAK;QAClC,MAAM,IAAI,AAAC,CAAA,IAAI,WAAW,CAAA,IAAK;QAC/B,MAAM,IAAI,AAAC,CAAA,IAAI,WAAW,CAAA,IAAK;QAE/B,yCAAyC;QACzC,MAAM,SAAS,OAAO;QACtB,IAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IAAK;YAC1B,MAAM,QAAQ,AAAC,KAAK,EAAE,GAAG,IAAK;YAC9B,MAAM,KAAK,IAAI,SAAS,KAAK,GAAG,CAAC;YACjC,MAAM,KAAK,IAAI,SAAS,KAAK,GAAG,CAAC;YACjC,MAAM,KAAK,IAAI,SAAS,KAAK,GAAG,CAAC,QAAQ,KAAK,EAAE,GAAG;YACnD,MAAM,KAAK,IAAI,SAAS,KAAK,GAAG,CAAC,QAAQ,KAAK,EAAE,GAAG;YACnD,IAAI,MAAM,CAAC,IAAI;YACf,IAAI,MAAM,CAAC,IAAI;QACjB;IACF;IAGF,IAAI,MAAM;IACV,CAAA,GAAA,yCAAa,EAAE;AACjB;AAEO,MAAM,4CAA+B,CAAC,KAAK,MAAM,SAAS,CAAC,CAAC;IACjE,MAAM,cAAc;QAAE,GAAG,CAAA,GAAA,yCAAiB,CAAC;QAAE,GAAG,MAAM;IAAC;IACvD,CAAA,GAAA,yCAAc,EAAE,KAAK,MAAM;IAE3B,MAAM,WAAW;IACjB,MAAM,OAAO,OAAO;IAEpB,MAAM,kBAAkB,CAAC,GAAW,GAAW;QAC7C,IAAI,SAAS;QACb,OAAQ;YACN,KAAK;gBACH,IAAI,MAAM,CAAC,GAAG;gBACd,IAAI,aAAa,CACf,IAAI,OAAO,GACX,GACA,IAAI,OAAO,GACX,IAAI,MACJ,IAAI,MACJ,IAAI;gBAEN;YACF,KAAK;gBACH,IAAI,MAAM,CAAC,GAAG,IAAI;gBAClB,IAAI,aAAa,CAAC,IAAI,OAAO,GAAG,IAAI,MAAM,IAAI,OAAO,GAAG,GAAG,IAAI,MAAM;gBACrE;QACJ;QACA,IAAI,MAAM;IACZ;IAEA,sBAAsB;IACtB,IAAK,IAAI,IAAI,GAAG,IAAI,UAAU,IAC5B,IAAK,IAAI,IAAI,GAAG,IAAI,UAAU,IAAK;QACjC,MAAM,IAAI,AAAC,CAAA,IAAI,WAAW,CAAA,IAAK;QAC/B,MAAM,IAAI,AAAC,CAAA,IAAI,WAAW,CAAA,IAAK;QAC/B,gBAAgB,GAAG,GAAG,AAAC,CAAA,IAAI,CAAA,IAAK,MAAM,IAAI,SAAS;IACrD;IAGF,CAAA,GAAA,yCAAa,EAAE;AACjB;AAEO,MAAM,4CAA4B,CAAC,KAAK,MAAM,SAAS,CAAC,CAAC;IAC9D,MAAM,cAAc;QAAE,GAAG,CAAA,GAAA,yCAAiB,CAAC;QAAE,GAAG,MAAM;IAAC;IACvD,CAAA,GAAA,yCAAc,EAAE,KAAK,MAAM;IAE3B,MAAM,SAAS,OAAO;IAEtB,mCAAmC;IACnC,IAAI,SAAS;IACb,oBAAoB;IACpB,MAAM,UAAU,CAAA,GAAA,yCAAiB,EAAE,GAAG,GAAG,QAAQ;IACjD,QAAQ,OAAO,CAAC,CAAC,IAAI;QACnB,QAAQ,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC;YAC5B,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;YACrB,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;QACvB;IACF;IAEA,+BAA+B;IAC/B,IAAI,MAAM,CAAC,KAAK,EAAE,GAAG;IACrB,MAAM,UAAU,CAAA,GAAA,yCAAiB,EAAE,GAAG,GAAG,QAAQ;IACjD,QAAQ,OAAO,CAAC,CAAC,IAAI;QACnB,QAAQ,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC;YAC5B,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;YACrB,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;QACvB;IACF;IAEA,IAAI,YAAY,SAAS,KAAK,eAC5B,IAAI,IAAI;IAEV,IAAI,MAAM;IACV,CAAA,GAAA,yCAAa,EAAE;AACjB;AAEO,MAAM,4CAA4B,CAAC,KAAK,MAAM,SAAS,CAAC,CAAC;IAC9D,MAAM,cAAc;QAAE,GAAG,CAAA,GAAA,yCAAiB,CAAC;QAAE,GAAG,MAAM;IAAC;IACvD,CAAA,GAAA,yCAAc,EAAE,KAAK,MAAM;IAE3B,MAAM,aAAa;IACnB,MAAM,YAAY;IAClB,MAAM,SAAS,OAAO;IAEtB,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,KAAK,YAAY,IAAK;QACpC,MAAM,eAAe,AAAC,SAAS,aAAc;QAC7C,IAAI,MAAM,CAAC,cAAc;QACzB,IAAI,GAAG,CAAC,GAAG,GAAG,cAAc,GAAG,KAAK,EAAE,GAAG;QAEzC,IAAK,IAAI,IAAI,GAAG,IAAI,WAAW,IAAK;YAClC,MAAM,QAAQ,AAAC,KAAK,EAAE,GAAG,IAAI,IAAK;YAClC,MAAM,IAAI,eAAe,KAAK,GAAG,CAAC;YAClC,MAAM,IAAI,eAAe,KAAK,GAAG,CAAC;YAClC,IAAI,MAAM,CAAC,GAAG;YACd,IAAI,MAAM,CAAC,GAAG;QAChB;IACF;IAEA,IAAI,MAAM;IACV,CAAA,GAAA,yCAAa,EAAE;AACjB;AAEO,MAAM,4CAA4B,CAAC,KAAK,MAAM,SAAS,CAAC,CAAC;IAC9D,MAAM,cAAc;QAAE,GAAG,CAAA,GAAA,yCAAiB,CAAC;QAAE,GAAG,MAAM;QAAE,YAAY;IAAE;IACtE,CAAA,GAAA,yCAAc,EAAE,KAAK,MAAM;IAE3B,MAAM,aAAa,CACjB,GACA,GACA,QACA,OACA;QAEA,IAAI,UAAU,GAAG;QAEjB,MAAM,OAAO,IAAI,SAAS,KAAK,GAAG,CAAC;QACnC,MAAM,OAAO,IAAI,SAAS,KAAK,GAAG,CAAC;QAEnC,IAAI,SAAS;QACb,IAAI,MAAM,CAAC,GAAG;QACd,IAAI,MAAM,CAAC,MAAM;QACjB,IAAI,MAAM;QAEV,WAAW,MAAM,MAAM,SAAS,KAAK,QAAQ,KAAK,EAAE,GAAG,GAAG,QAAQ;QAClE,WAAW,MAAM,MAAM,SAAS,KAAK,QAAQ,KAAK,EAAE,GAAG,GAAG,QAAQ;IACpE;IAEA,WAAW,GAAG,OAAO,GAAG,OAAO,GAAG,CAAC,KAAK,EAAE,GAAG,GAAG,YAAY,UAAU;IACtE,CAAA,GAAA,yCAAa,EAAE;AACjB;AAEO,MAAM,4CAA8C;IACzD,eAAe;IACf,iBAAiB;IACjB,gBAAgB;IAChB,YAAY;IACZ,SAAS;IACT,SAAS;IACT,SAAS;AACX;;;;AGxRO,MAAM,4CAAiC,CAAC,KAAK;IAClD,MAAM,SAAS,OAAO;IACtB,MAAM,UAAmB;QACvB;YAAE,GAAG;YAAG,GAAG;QAAE;QACb;YAAE,GAAG,SAAS,KAAK,IAAI,CAAC;YAAI,GAAG;QAAE;QACjC;YAAE,GAAG,AAAC,SAAS,KAAK,IAAI,CAAC,KAAM;YAAG,GAAG,MAAM;QAAO;QAClD;YAAE,GAAG,AAAC,CAAC,SAAS,KAAK,IAAI,CAAC,KAAM;YAAG,GAAG,MAAM;QAAO;QACnD;YAAE,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC;YAAI,GAAG;QAAE;QAClC;YAAE,GAAG,AAAC,CAAC,SAAS,KAAK,IAAI,CAAC,KAAM;YAAG,GAAG,OAAO;QAAO;QACpD;YAAE,GAAG,AAAC,SAAS,KAAK,IAAI,CAAC,KAAM;YAAG,GAAG,OAAO;QAAO;KACpD;IAED,IAAI,SAAS;IACb,QAAQ,OAAO,CAAC,CAAC;QACf,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,OAAO,CAAC;QACtC,IAAI,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,EAAE,GAAG;IACnD;AACF;AAEO,MAAM,4CAA+B,CAAC,KAAK;IAChD,MAAM,SAAS,OAAO;IACtB,MAAM,UAAU,SAAS;IAEzB,0CAA0C;IAC1C,MAAM,YAAqB;QACzB;YAAE,GAAG;YAAG,GAAG,CAAC,UAAU;QAAE;QACxB;YAAE,GAAG,CAAC;YAAS,GAAG,CAAC;QAAQ;QAC3B;YAAE,GAAG;YAAS,GAAG,CAAC;QAAQ;QAC1B;YAAE,GAAG,CAAC;YAAS,GAAG;QAAE;QACpB;YAAE,GAAG;YAAS,GAAG;QAAE;QACnB;YAAE,GAAG;YAAG,GAAG;QAAE;QACb;YAAE,GAAG,CAAC;YAAS,GAAG;QAAQ;QAC1B;YAAE,GAAG;YAAS,GAAG;QAAQ;QACzB;YAAE,GAAG;YAAG,GAAG,UAAU;QAAE;QACvB;YAAE,GAAG;YAAG,GAAG,UAAU;QAAE;KACxB;IAED,eAAe;IACf,IAAI,SAAS;IACb,UAAU,OAAO,CAAC,CAAC;QACjB,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,IAAI,CAAC;QAChC,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,KAAK,EAAE,GAAG;IAC7C;IAEA,wBAAwB;IACxB,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;IACzC,UAAU,OAAO,CAAC,CAAC,KAAK;QACtB,IAAI,IAAI,GACN,UAAU,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC;YAC9B,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;YACvB,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACjC;IAEJ;AACF;AAEO,MAAM,4CAAkC,CAAC,KAAK;IACnD,MAAM,SAAS,OAAO;IAEtB,kEAAkE;IAElE,sDAAsD;IAEtD,MAAM,WAAoB;QACxB;YAAE,GAAG;YAAG,GAAG;QAAE;WACV,CAAA,GAAA,yCAAiB,EAAE,GAAG,GAAG,QAAQ;WACjC,CAAA,GAAA,yCAAiB,EAAE,GAAG,GAAG,SAAS,KAAK;KAC3C;IAED,IAAI,SAAS;IACb,4BAA4B;IAC5B,SAAS,OAAO,CAAC,CAAC,IAAI;QACpB,SAAS,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC;YAC7B,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;YACrB,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;QACvB;IACF;AACF;AAEO,MAAM,4CAA8B,CAAC,KAAK;IAC/C,MAAM,SAAS,OAAO;IACtB,IAAI,SAAS;IAEb,uBAAuB;IACvB,IAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IAAK;QAC1B,MAAM,QAAQ,AAAC,IAAI,IAAK,KAAK,EAAE,GAAG;QAClC,MAAM,KAAK,KAAK,GAAG,CAAC,SAAS;QAC7B,MAAM,KAAK,KAAK,GAAG,CAAC,SAAS;QAC7B,MAAM,KAAK,KAAK,GAAG,CAAC,QAAQ,KAAK,EAAE,GAAG,KAAK;QAC3C,MAAM,KAAK,KAAK,GAAG,CAAC,QAAQ,KAAK,EAAE,GAAG,KAAK;QAE3C,IAAI,MAAM,CAAC,GAAG;QACd,IAAI,MAAM,CAAC,IAAI;QACf,IAAI,MAAM,CAAC,IAAI;QACf,IAAI,MAAM,CAAC,GAAG;IAChB;IAEA,uBAAuB;IACvB,MAAM,cAAc,SAAS;IAC7B,IAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IAAK;QAC1B,MAAM,QAAQ,AAAC,IAAI,IAAK,KAAK,EAAE,GAAG,IAAI,KAAK,EAAE,GAAG;QAChD,MAAM,KAAK,KAAK,GAAG,CAAC,SAAS;QAC7B,MAAM,KAAK,KAAK,GAAG,CAAC,SAAS;QAC7B,MAAM,KAAK,KAAK,GAAG,CAAC,QAAQ,KAAK,EAAE,GAAG,KAAK;QAC3C,MAAM,KAAK,KAAK,GAAG,CAAC,QAAQ,KAAK,EAAE,GAAG,KAAK;QAE3C,IAAI,MAAM,CAAC,GAAG;QACd,IAAI,MAAM,CAAC,IAAI;QACf,IAAI,MAAM,CAAC,IAAI;QACf,IAAI,MAAM,CAAC,GAAG;IAChB;AACF;AAEO,MAAM,4CAA+B,CAAC,KAAK;IAChD,MAAM,SAAS,OAAO;IACtB,MAAM,UAAmB;QACvB;YAAE,GAAG;YAAG,GAAG;QAAE;QACb;YAAE,GAAG,SAAS,KAAK,IAAI,CAAC;YAAI,GAAG;QAAE;QACjC;YAAE,GAAG,AAAC,SAAS,KAAK,IAAI,CAAC,KAAM;YAAG,GAAG,MAAM;QAAO;QAClD;YAAE,GAAG,AAAC,CAAC,SAAS,KAAK,IAAI,CAAC,KAAM;YAAG,GAAG,MAAM;QAAO;QACnD;YAAE,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC;YAAI,GAAG;QAAE;QAClC;YAAE,GAAG,AAAC,CAAC,SAAS,KAAK,IAAI,CAAC,KAAM;YAAG,GAAG,OAAO;QAAO;QACpD;YAAE,GAAG,AAAC,SAAS,KAAK,IAAI,CAAC,KAAM;YAAG,GAAG,OAAO;QAAO;KACpD;IAED,IAAI,SAAS;IACb,QAAQ,OAAO,CAAC,CAAC;QACf,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,OAAO,CAAC;QACtC,IAAI,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,EAAE,GAAG;IACnD;AACF;AAEO,MAAM,4CAAiC,CAAC,KAAK;IAClD,MAAM,SAAS,OAAO;IACtB,IAAI,SAAS;IACb,IAAI,GAAG,CAAC,CAAC,SAAS,GAAG,GAAG,QAAQ,GAAG,KAAK,EAAE,GAAG;IAC7C,IAAI,GAAG,CAAC,SAAS,GAAG,GAAG,QAAQ,GAAG,KAAK,EAAE,GAAG;AAC9C;AAEO,MAAM,4CAA0B,CAAC,KAAK;IAC3C,MAAM,cAAc,OAAO;IAC3B,MAAM,cAAc,OAAO;IAC3B,MAAM,QAAQ;IAEd,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,IAAI,OAAO,IAAK;QAC9B,MAAM,SAAS,AAAC,IAAI,QAAS,KAAK,EAAE,GAAG;QACvC,kDAAkD;QAElD,IAAK,IAAI,IAAI,GAAG,IAAI,OAAO,IAAK;YAC9B,MAAM,OAAO,AAAC,IAAI,QAAS,KAAK,EAAE,GAAG;YACrC,MAAM,OAAO,AAAE,CAAA,IAAI,CAAA,IAAK,QAAS,KAAK,EAAE,GAAG;YAE3C,MAAM,KACJ,AAAC,CAAA,cAAc,cAAc,KAAK,GAAG,CAAC,KAAI,IAAK,KAAK,GAAG,CAAC;YAC1D,MAAM,KACJ,AAAC,CAAA,cAAc,cAAc,KAAK,GAAG,CAAC,KAAI,IAAK,KAAK,GAAG,CAAC;YAC1D,MAAM,KACJ,AAAC,CAAA,cAAc,cAAc,KAAK,GAAG,CAAC,KAAI,IAAK,KAAK,GAAG,CAAC;YAC1D,MAAM,KACJ,AAAC,CAAA,cAAc,cAAc,KAAK,GAAG,CAAC,KAAI,IAAK,KAAK,GAAG,CAAC;YAE1D,IAAI,MAAM,CAAC,IAAI;YACf,IAAI,MAAM,CAAC,IAAI;QACjB;IACF;AACF;AAEO,MAAM,4CAA8B,CAAC,KAAK;IAC/C,MAAM,SAAS,OAAO;IACtB,MAAM,UAAmB;QACvB;YAAE,GAAG;YAAG,GAAG;QAAE;QACb;YAAE,GAAG,SAAS;YAAG,GAAG;QAAE;QACtB;YAAE,GAAG;YAAQ,GAAG,SAAS,KAAK,IAAI,CAAC;QAAG;QACtC;YAAE,GAAG,CAAC;YAAQ,GAAG,SAAS,KAAK,IAAI,CAAC;QAAG;QACvC;YAAE,GAAG,CAAC,SAAS;YAAG,GAAG;QAAE;QACvB;YAAE,GAAG,CAAC;YAAQ,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC;QAAG;QACxC;YAAE,GAAG;YAAQ,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC;QAAG;KACxC;IAED,IAAI,SAAS;IACb,QAAQ,OAAO,CAAC,CAAC;QACf,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,OAAO,CAAC;QACtC,IAAI,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,EAAE,GAAG;IACnD;AACF;AAEO,MAAM,4CAA6C;IACxD,cAAc;IACd,YAAY;IACZ,eAAe;IACf,WAAW;IACX,YAAY;IACZ,cAAc;IACd,OAAO;IACP,WAAW;AACb;;;AC7MA;;;;;;;CAOC,GAYM,MAAM,4CAAyB,CAAC,KAAK,MAAM;IAChD,MAAM,MAAoB,QAAQ,OAAO,KAAK,MAAM;IACpD,MAAM,IAAI,OAAO;IACjB,MAAM,YAAY,IAAI,KAAK,KAAK,CAAC,QAAQ,IAAI,YAAY;IACzD,MAAM,SAA0C,EAAE;IAElD,IAAK,IAAI,IAAI,GAAG,IAAI,WAAW,IAAK;QAClC,MAAM,QAAQ,AAAC,IAAI,YAAa,KAAK,EAAE,GAAG;QAC1C,MAAM,SAAS,MAAM,QAAQ,KAAK,wBAAwB;QAC1D,OAAO,IAAI,CAAC;YACV,GAAG,KAAK,GAAG,CAAC,SAAS,IAAI;YACzB,GAAG,KAAK,GAAG,CAAC,SAAS,IAAI;QAC3B;IACF;IAEA,IAAI,SAAS;IACb,iDAAiD;IACjD,MAAM,OAAO,MAAM,CAAC,OAAO,MAAM,GAAG,EAAE;IACtC,MAAM,QAAQ,MAAM,CAAC,EAAE;IACvB,IAAI,MAAM,CAAC,AAAC,CAAA,KAAK,CAAC,GAAG,MAAM,CAAC,AAAD,IAAK,GAAG,AAAC,CAAA,KAAK,CAAC,GAAG,MAAM,CAAC,AAAD,IAAK;IAExD,IAAK,IAAI,IAAI,GAAG,IAAI,WAAW,IAAK;QAClC,MAAM,OAAO,MAAM,CAAC,EAAE;QACtB,MAAM,OAAO,MAAM,CAAC,AAAC,CAAA,IAAI,CAAA,IAAK,UAAU;QACxC,MAAM,OAAO,AAAC,CAAA,KAAK,CAAC,GAAG,KAAK,CAAC,AAAD,IAAK;QACjC,MAAM,OAAO,AAAC,CAAA,KAAK,CAAC,GAAG,KAAK,CAAC,AAAD,IAAK;QACjC,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM;IAC7C;IACA,IAAI,SAAS;AACf;AAMO,MAAM,4CAAyB,CAAC,KAAK,MAAM;IAChD,MAAM,MAAoB,QAAQ,OAAO,KAAK,MAAM;IACpD,MAAM,IAAI,OAAO;IACjB,MAAM,QAAQ,IAAI,KAAK,KAAK,CAAC,QAAQ,KAAK,aAAa;IACvD,MAAM,eAAe,MAAM,QAAQ,KAAK,6BAA6B;IAErE,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,IAAI,OAAO,IAAK;QAC9B,MAAM,QAAQ,AAAC,IAAI,QAAS,KAAK,EAAE,GAAG,IAAI,KAAK,EAAE,GAAG;QACpD,MAAM,eAAe,IAAI,eAAe,QAAQ,eAAe;QAC/D,MAAM,IAAI,KAAK,GAAG,CAAC,SAAS,IAAI;QAChC,MAAM,IAAI,KAAK,GAAG,CAAC,SAAS,IAAI;QAChC,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG;aACtB,IAAI,MAAM,CAAC,GAAG;IACrB;IACA,IAAI,SAAS;AACf;AAKO,MAAM,4CAA8B,CAAC,KAAK,MAAM;IACrD,MAAM,MAAoB,QAAQ,OAAO,KAAK,MAAM;IACpD,MAAM,IAAI,OAAO;IACjB,kEAAkE;IAClE,MAAM,QAAQ,IAAI,KAAK,KAAK,CAAC,QAAQ,IAAI,MAAM;IAC/C,MAAM,QAAQ,IAAI,KAAK,KAAK,CAAC,QAAQ,IAAI,MAAM;IAC/C,MAAM,QAAQ,QAAQ,KAAK,EAAE,EAAE,eAAe;IAC9C,MAAM,QAAQ;IAEd,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,KAAK,OAAO,IAAK;QAC/B,MAAM,IAAI,AAAC,IAAI,QAAS,KAAK,EAAE,GAAG;QAClC,MAAM,IAAI,KAAK,GAAG,CAAC,QAAQ,IAAI,SAAS;QACxC,MAAM,IAAI,KAAK,GAAG,CAAC,QAAQ,KAAK;QAChC,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG;aACtB,IAAI,MAAM,CAAC,GAAG;IACrB;IACA,IAAI,SAAS;AACf;AAKO,MAAM,4CAAiC,CAAC,KAAK,MAAM;IACxD,MAAM,MAAoB,QAAQ,OAAO,KAAK,MAAM;IACpD,MAAM,IAAI,OAAO;IACjB,+DAA+D;IAC/D,MAAM,IAAI,MAAM,QAAQ;IACxB,MAAM,QAAQ;IAEd,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,KAAK,OAAO,IAAK;QAC/B,MAAM,IAAI,AAAC,IAAI,QAAS,KAAK,EAAE,GAAG;QAClC,MAAM,OAAO,KAAK,GAAG,CAAC;QACtB,MAAM,OAAO,KAAK,GAAG,CAAC;QACtB,+BAA+B;QAC/B,MAAM,IAAI,KAAK,IAAI,CAAC,QAAQ,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,OAAO,IAAI,KAAK;QAC9D,MAAM,IAAI,KAAK,IAAI,CAAC,QAAQ,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,OAAO,IAAI,KAAK;QAC9D,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG;aACtB,IAAI,MAAM,CAAC,GAAG;IACrB;IACA,IAAI,SAAS;AACf;AAKO,MAAM,4CAA+B,CAAC,KAAK,MAAM;IACtD,MAAM,MAAoB,QAAQ,OAAO,KAAK,MAAM;IACpD,MAAM,QAAQ,OAAO;IACrB,yEAAyE;IACzE,MAAM,IAAI;IACV,MAAM,IAAI,MAAM,QAAQ,KAAK,UAAU;IACvC,MAAM,IAAI,MAAM,QAAQ,KAAK,UAAU;IACvC,qDAAqD;IACrD,MAAM,MAAM,CAAC,GAAW;QACtB,MAAM,KAAK,KAAK,KAAK,CAAC,IAAI;QAC1B,MAAM,KAAK,KAAK,KAAK,CAAC,IAAI;QAC1B,MAAM,IAAI,CAAC,GAAW,IAAuB,MAAM,IAAI,IAAI,EAAE,GAAG,IAAI;QACpE,OAAO,EAAE,IAAI,MAAM;IACrB;IACA,MAAM,SAAS,IAAI,IAAI,GAAG;IAC1B,MAAM,OAAO,KAAK,GAAG,CAAC,QAAQ,MAAM,KAAK,EAAE,GAAG,GAAG,sBAAsB;IACvE,MAAM,QAAQ,KAAK,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO;IAE9C,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,KAAK,OAAO,IAAK;QAC/B,MAAM,IAAI,AAAC,IAAI,QAAS;QACxB,MAAM,IAAI,AAAC,CAAA,AAAC,CAAA,IAAI,CAAA,IAAK,KAAK,GAAG,CAAC,KAAK,IAAI,KAAK,GAAG,CAAC,AAAE,CAAA,IAAI,CAAA,IAAK,IAAK,EAAC,IAAK,QAAS,CAAA,IAAI,CAAA;QACnF,MAAM,IAAI,AAAC,CAAA,AAAC,CAAA,IAAI,CAAA,IAAK,KAAK,GAAG,CAAC,KAAK,IAAI,KAAK,GAAG,CAAC,AAAE,CAAA,IAAI,CAAA,IAAK,IAAK,EAAC,IAAK,QAAS,CAAA,IAAI,CAAA;QACnF,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG;aACtB,IAAI,MAAM,CAAC,GAAG;IACrB;IACA,IAAI,SAAS;AACf;AAKO,MAAM,4CAA6B,CAAC,KAAK,MAAM;IACpD,MAAM,MAAoB,QAAQ,OAAO,KAAK,MAAM;IACpD,MAAM,IAAI,OAAO;IACjB,MAAM,QAAQ,IAAI,KAAK,KAAK,CAAC,QAAQ,IAAI,YAAY;IACrD,MAAM,OAAO,IAAI,KAAK,KAAK,CAAC,QAAQ,KAAK,sBAAsB;IAC/D,MAAM,MAAM,OAAO,QAAQ,MAAM,kBAAkB;IAEnD,IAAI,SAAS;IACb,IAAK,IAAI,OAAO,GAAG,OAAO,OAAO,OAAQ;QACvC,MAAM,QAAQ,IAAK,CAAA,MAAM,AAAC,OAAO,QAAS,GAAE;QAC5C,MAAM,QAAQ;QACd,IAAK,IAAI,IAAI,GAAG,KAAK,OAAO,IAAK;YAC/B,MAAM,IAAI,AAAC,IAAI,QAAS,KAAK,EAAE,GAAG;YAClC,MAAM,OAAO,KAAK,GAAG,CAAC,IAAI,OAAO,OAAO,OAAO,QAAQ;YACvD,MAAM,IAAI,KAAK,GAAG,CAAC,KAAM,CAAA,QAAQ,IAAG;YACpC,MAAM,IAAI,KAAK,GAAG,CAAC,KAAM,CAAA,QAAQ,IAAG;YACpC,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG;iBACtB,IAAI,MAAM,CAAC,GAAG;QACrB;IACF;AACF;AAKO,MAAM,4CAAyB,CAAC,KAAK,MAAM;IAChD,MAAM,MAAoB,QAAQ,OAAO,KAAK,MAAM;IACpD,MAAM,IAAI,OAAO;IACjB,MAAM,IAAI,IAAI,KAAK,KAAK,CAAC,QAAQ,IAAI,sBAAsB;IAC3D,MAAM,QAAQ;IAEd,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,KAAK,OAAO,IAAK;QAC/B,MAAM,QAAQ,AAAC,IAAI,QAAS,KAAK,EAAE,GAAG,IAAK,CAAA,IAAI,MAAM,IAAI,IAAI,CAAA;QAC7D,MAAM,KAAK,KAAK,GAAG,CAAC,IAAI,SAAS;QACjC,MAAM,IAAI,KAAK,KAAK,GAAG,CAAC;QACxB,MAAM,IAAI,KAAK,KAAK,GAAG,CAAC;QACxB,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG;aACtB,IAAI,MAAM,CAAC,GAAG;IACrB;IACA,IAAI,SAAS;AACf;AAKO,MAAM,4CAAiD;IAC5D,MAAM;IACN,MAAM;IACN,WAAW;IACX,cAAc;IACd,YAAY;IACZ,UAAU;IACV,MAAM;AACR;;;ANrMO,MAAM,4CAAuC;IAClD,GAAG,CAAA,GAAA,yCAAU,CAAC;IACd,GAAG,CAAA,GAAA,yCAAY,CAAC;IAChB,GAAG,CAAA,GAAA,yCAAW,CAAC;IACf,GAAG,CAAA,GAAA,yCAAe,CAAC;AACrB;;;ADTO,MAAM,4CAA0C;IACrD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AAMM,SAAS,0CAAc,GAAiB;IAC7C,IAAI,QAAQ,KAAK,OAAO;IACxB,OAAO,yCAAW,CAAC,IAAI,KAAK,KAAK,CAAC,QAAS,CAAA,0CAAY,MAAM,GAAG,CAAA,GAAI;AACtE;AAcA,MAAM,sCAA+B;IACnC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AAEM,SAAS,0CAAgB,GAAiB;IAC/C,OAAO,mCAAa,CAAC,KAAK,KAAK,CAAC,QAAQ,oCAAc,MAAM,EAAE;AAChE;AA4BO,SAAS,0CACd,GAA6B,EAC7B,KAAa,EACb,CAAS,EACT,CAAS,EACT,MAAuB;IAEvB,MAAM,aAAE,SAAS,eAAE,WAAW,eAAE,WAAW,QAAE,IAAI,YAAE,QAAQ,EAAE,GAAG;IAChE,IAAI,IAAI;IACR,IAAI,SAAS,CAAC,GAAG;IACjB,IAAI,MAAM,CAAC,AAAC,WAAW,KAAK,EAAE,GAAI;IAClC,IAAI,SAAS,GAAG;IAChB,IAAI,WAAW,GAAG;IAClB,IAAI,SAAS,GAAG;IAEhB,MAAM,eAAe,CAAA,GAAA,yCAAK,CAAC,CAAC,MAAM;IAClC,IAAI,cAAc;QAChB,aAAa,KAAK;QAClB,IAAI,IAAI;QACR,IAAI,MAAM;IACZ;IAEA,IAAI,OAAO;AACb;AAEA;;CAEC,GACD,SAAS,uCACP,GAA6B,EAC7B,KAAkB,EAClB,SAAiB,EACjB,WAAmB,EACnB,WAAmB,EACnB,IAAY,EACZ,GAAkB;IAElB,OAAQ;QACN,KAAK;YACH,IAAI,IAAI;YACR;QAEF,KAAK;YACH,IAAI,IAAI,IAAI,sCAAsC;YAClD,IAAI,WAAW,IAAI,KAAK,aAAa;YACrC,IAAI,IAAI;YACR,IAAI,WAAW,IAAI;YACnB,IAAI,MAAM;YACV;QAEF,KAAK;YACH,IAAI,IAAI;YACR,eAAe;YACf,IAAI,SAAS,GAAG,cAAc;YAC9B,IAAI,WAAW,IAAI;YACnB,IAAI,MAAM;YACV,IAAI,WAAW,IAAI;YACnB,eAAe;YACf,IAAI,SAAS,GAAG,cAAc;YAC9B,IAAI,WAAW,GAAG;YAClB,IAAI,MAAM;YACV;QAGF,KAAK;YACH,IAAI,IAAI;YACR,IAAI,WAAW,CAAC;gBAAC,OAAO;gBAAM,OAAO;aAAK;YAC1C,IAAI,MAAM;YACV,IAAI,WAAW,CAAC,EAAE;YAClB;QAEF,KAAK;YAAc;gBACjB,oEAAoE;gBACpE,MAAM,SAAS,IAAK,CAAA,MAAM,KAAK,KAAK,CAAC,QAAQ,KAAK,CAAA;gBAClD,MAAM,aAAa,IAAI,WAAW;gBAClC,IAAI,WAAW,GAAG,aAAc,CAAA,MAAM,SAAS,CAAA;gBAC/C,IAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,IAAK;oBAC/B,MAAM,KAAK,MAAM,AAAC,CAAA,QAAQ,GAAE,IAAK,OAAO,OAAO;oBAC/C,MAAM,KAAK,MAAM,AAAC,CAAA,QAAQ,GAAE,IAAK,OAAO,OAAO;oBAC/C,IAAI,IAAI;oBACR,IAAI,SAAS,CAAC,IAAI;oBAClB,IAAI,IAAI;oBACR,IAAI,OAAO;gBACb;gBACA,IAAI,WAAW,GAAG;gBAClB,sBAAsB;gBACtB,IAAI,WAAW,IAAI;gBACnB,IAAI,MAAM;gBACV,IAAI,WAAW,IAAI;gBACnB;YACF;QAEA,KAAK;YAAW;gBACd,mEAAmE;gBACnE,MAAM,cAAc,IAAI,WAAW;gBACnC,IAAI,WAAW,GAAG,cAAc;gBAChC,IAAI,IAAI;gBACR,IAAI,WAAW,GAAG;gBAElB,uCAAuC;gBACvC,IAAI,IAAI;gBACR,IAAI,IAAI;gBACR,MAAM,eAAe,KAAK,GAAG,CAAC,GAAG,OAAO;gBACxC,MAAM,aAAa,MAAM,QAAQ,KAAK,EAAE,GAAG,KAAK,EAAE,GAAG;gBACrD,IAAI,SAAS,GAAG,KAAK,GAAG,CAAC,KAAK,cAAc;gBAC5C,IAAI,WAAW,GAAG,cAAc;gBAEhC,8CAA8C;gBAC9C,MAAM,SAAS,OAAO;gBACtB,MAAM,MAAM,KAAK,GAAG,CAAC;gBACrB,MAAM,MAAM,KAAK,GAAG,CAAC;gBACrB,IAAK,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,KAAK,aAAc;oBACpD,IAAI,SAAS;oBACb,IAAI,MAAM,CAAC,IAAI,MAAM,SAAS,KAAK,IAAI,MAAM,SAAS;oBACtD,IAAI,MAAM,CAAC,IAAI,MAAM,SAAS,KAAK,IAAI,MAAM,SAAS;oBACtD,IAAI,MAAM;gBACZ;gBACA,mEAAmE;gBACnE,IAAI,CAAC,OAAO,QAAQ,KAAK;oBACvB,MAAM,aAAa,aAAa,KAAK,EAAE,GAAG;oBAC1C,MAAM,OAAO,KAAK,GAAG,CAAC;oBACtB,MAAM,OAAO,KAAK,GAAG,CAAC;oBACtB,IAAI,WAAW,GAAG,cAAc;oBAChC,IAAK,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,KAAK,eAAe,IAAK;wBAC1D,IAAI,SAAS;wBACb,IAAI,MAAM,CAAC,IAAI,OAAO,SAAS,MAAM,IAAI,OAAO,SAAS;wBACzD,IAAI,MAAM,CAAC,IAAI,OAAO,SAAS,MAAM,IAAI,OAAO,SAAS;wBACzD,IAAI,MAAM;oBACZ;gBACF;gBACA,IAAI,OAAO;gBACX,IAAI,WAAW,GAAG;gBAClB,iBAAiB;gBACjB,IAAI,WAAW,IAAI;gBACnB,IAAI,MAAM;gBACV,IAAI,WAAW,IAAI;gBACnB;YACF;QAEA,KAAK;YAAc;gBACjB,0DAA0D;gBAC1D,6CAA6C;gBAC7C,MAAM,cAAc,IAAI,WAAW;gBACnC,IAAI,WAAW,GAAG,cAAc;gBAChC,IAAI,IAAI;gBACR,IAAI,WAAW,GAAG;gBAElB,kEAAkE;gBAClE,MAAM,eAAe,MAAM,MAAM,QAAQ,OAAO,KAAK,SAAS;gBAC9D,MAAM,SAAS,OAAO;gBACtB,MAAM,SAAS,SAAU,CAAA,AAAC,CAAA,IAAI,YAAW,IAAK,YAAW;gBACzD,IAAI,WAAW,CAAC;oBAAC;oBAAQ;iBAAO;gBAChC,4DAA4D;gBAC5D,IAAI,cAAc,GAAG,MAAM,QAAQ,SAAS,IAAI;gBAChD,8CAA8C;gBAC9C,IAAI,SAAS,GAAG,cAAc;gBAC9B,IAAI,MAAM;gBACV,IAAI,WAAW,CAAC,EAAE;gBAClB,IAAI,cAAc,GAAG;gBACrB;YACF;QAEA,KAAK;QACL;YACE,IAAI,IAAI;YACR,IAAI,MAAM;YACV;IACJ;AACF;AAMO,SAAS,0CACd,GAA6B,EAC7B,KAAa,EACb,CAAS,EACT,CAAS,EACT,MAA0B;IAE1B,MAAM,aACJ,SAAS,eACT,WAAW,eACX,WAAW,QACX,IAAI,YACJ,QAAQ,YACR,WAAW,EAAE,kBACb,iBAAiB,6BACjB,cAAc,uBACd,mBAAmB,iBACnB,aAAa,cACb,SAAS,mBACT,eAAe,eACf,cAAc,wBACd,GAAG,EACJ,GAAG;IAEJ,IAAI,IAAI;IACR,IAAI,SAAS,CAAC,GAAG;IACjB,IAAI,MAAM,CAAC,AAAC,WAAW,KAAK,EAAE,GAAI;IAElC,uBAAuB;IACvB,IAAI,aAAa,GAAG;QAClB,IAAI,UAAU,GAAG;QACjB,IAAI,WAAW,GAAG,aAAa;QAC/B,IAAI,aAAa,GAAG;QACpB,IAAI,aAAa,GAAG;IACtB;IAEA,6BAA6B;IAC7B,IAAI,iBAAiB;QACnB,MAAM,OAAO,IAAI,oBAAoB,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,OAAO;QAC5D,KAAK,YAAY,CAAC,GAAG;QACrB,KAAK,YAAY,CAAC,GAAG;QACrB,IAAI,SAAS,GAAG;IAClB,OACE,IAAI,SAAS,GAAG;IAGlB,IAAI,WAAW,GAAG;IAClB,IAAI,SAAS,GAAG;IAEhB,MAAM,eAAe,CAAA,GAAA,yCAAK,CAAC,CAAC,MAAM;IAClC,IAAI,cAAc;QAChB,aAAa,KAAK,MAAM;iBAAE;QAAI;QAC9B,uCAAiB,KAAK,aAAa,WAAW,aAAa,aAAa,MAAM;IAChF;IAEA,gDAAgD;IAChD,IAAI,aAAa,GACf,IAAI,UAAU,GAAG;IAGnB,yCAAyC;IACzC,IAAI,SAAS,MAAM,GAAG,GACpB,CAAA,GAAA,yCAAc,EAAE,aAAa,CAAC,KAAK,UAAU;QAC3C,UAAU;qBACV;0BACA;wBACA;IACF;IAGF,IAAI,OAAO;AACb;;;;;AQtUA;;CAEC,GAsBM,MAAM,4CAAmC;IAC9C,OAAO;IACP,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,cAAc;IACd,cAAc;IACd,aAAa;IACb,kBAAkB;IAClB,gBAAgB;AAClB;;;AClCA;;;;;;CAMC,GA2DD,uEAAuE;AAEvE,MAAM,mCAA0B;IAC9B;QACE,MAAM;QACN,UAAU;QACV,QAAQ;QACR,aAAa;QACb,kBAAkB;QAClB,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,aAAa;QACb,iBAAiB;YAAC;YAAmB;YAAc;SAAY;QAC/D,oBAAoB;QACpB,WAAW;QACX,gBAAgB;QAChB,WAAW;QACX,kBAAkB;IACpB;IACA;QACE,MAAM;QACN,UAAU;QACV,QAAQ;QACR,aAAa;QACb,kBAAkB;QAClB,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,aAAa;QACb,iBAAiB;YAAC;YAAmB;YAAe;SAAa;QACjE,oBAAoB;QACpB,WAAW;QACX,gBAAgB;QAChB,WAAW;QACX,kBAAkB;IACpB;IACA;QACE,MAAM;QACN,UAAU;QACV,QAAQ;QACR,aAAa;QACb,kBAAkB;QAClB,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,aAAa;QACb,iBAAiB;YAAC;YAAc;YAAa;SAAa;QAC1D,oBAAoB;QACpB,WAAW;QACX,gBAAgB;QAChB,WAAW;QACX,kBAAkB;IACpB;IACA;QACE,MAAM;QACN,UAAU;QACV,QAAQ;QACR,aAAa;QACb,kBAAkB;QAClB,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,aAAa;QACb,iBAAiB;YAAC;YAAe;YAAU;YAAiB;SAAU;QACtE,oBAAoB;QACpB,WAAW;QACX,gBAAgB;QAChB,WAAW;QACX,kBAAkB;IACpB;IACA;QACE,MAAM;QACN,UAAU;QACV,QAAQ;QACR,aAAa;QACb,kBAAkB;QAClB,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,aAAa;QACb,iBAAiB;YAAC;YAAc;YAAc;SAAY;QAC1D,oBAAoB;QACpB,WAAW;QACX,gBAAgB;QAChB,WAAW;QACX,kBAAkB;IACpB;IACA;QACE,MAAM;QACN,UAAU;QACV,QAAQ;QACR,aAAa;QACb,kBAAkB;QAClB,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,aAAa;QACb,iBAAiB;YAAC;YAAmB;SAAgB;QACrD,oBAAoB;QACpB,WAAW;QACX,gBAAgB;QAChB,WAAW;QACX,kBAAkB;IACpB;IACA;QACE,MAAM;QACN,UAAU;QACV,QAAQ;QACR,aAAa;QACb,kBAAkB;QAClB,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,aAAa;QACb,iBAAiB;YAAC;YAAe;YAAiB;SAAS;QAC3D,oBAAoB;QACpB,WAAW;QACX,gBAAgB;QAChB,WAAW;QACX,kBAAkB;IACpB;IACA;QACE,MAAM;QACN,UAAU;QACV,QAAQ;QACR,aAAa;QACb,kBAAkB;QAClB,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,aAAa;QACb,iBAAiB;YAAC;YAAW;YAAc;YAAe;SAAS;QACnE,oBAAoB;QACpB,WAAW;QACX,gBAAgB;QAChB,WAAW;QACX,kBAAkB;IACpB;IACA;QACE,MAAM;QACN,UAAU;QACV,QAAQ;QACR,aAAa;QACb,kBAAkB;QAClB,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,aAAa;QACb,iBAAiB;YAAC;YAAa;YAAc;SAAkB;QAC/D,oBAAoB;QACpB,WAAW;QACX,gBAAgB;QAChB,WAAW;QACX,kBAAkB;IACpB;IACA;QACE,MAAM;QACN,UAAU;QACV,QAAQ;QACR,aAAa;QACb,kBAAkB;QAClB,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,aAAa;QACb,iBAAiB;YAAC;YAAmB;YAAc;SAAY;QAC/D,oBAAoB;QACpB,WAAW;QACX,gBAAgB;QAChB,WAAW;QACX,kBAAkB;IACpB;CACD;AAOM,SAAS,0CAAgB,GAAiB;IAC/C,OAAO,gCAAU,CAAC,KAAK,KAAK,CAAC,QAAQ,iCAAW,MAAM,EAAE;AAC1D;;;AbhNA,uEAAuE;AAEvE,MAAM,qCAAe;IACnB;IACA;IACA;IACA;IACA;IACA;CACD;AACD,MAAM,uCAAiB;IACrB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AACD,MAAM,sCAAgB;IACpB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AACD,MAAM,0CAAoB;IACxB;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AAWD,MAAM,0CAAuC;IAC3C;IACA;IACA;IACA;IACA;CACD;AAED,uEAAuE;AAEvE,SAAS,gCACP,GAAiB,EACjB,UAAkB,EAClB,UAAoB;IAEpB,MAAM,SAAS,IAAI,aAAa;IAChC,MAAM,WAAW,MAAM,aAAa;IACpC,MAAM,UAAU,MAAM,aAAa;IACnC,MAAM,cAAc,OAAO,aAAa,KAAK,mCAAmC;IAChF,MAAM,QAAQ,SAAS,WAAW,UAAU;IAC5C,MAAM,OAAO,QAAQ;IAErB,IAAI;IACJ,IAAI,OAAO,QAAQ,OAAO;SACrB,IAAI,OAAO,SAAS,UAAU,OAAO;SACrC,IAAI,OAAO,SAAS,WAAW,SAAS,OAAO;SAC/C,OAAO;IAEZ,MAAM,YAAY,KAAK,MAAM,CAAC,CAAC,IAAM,WAAW,QAAQ,CAAC;IACzD,IAAI,UAAU,MAAM,KAAK,GACvB,OAAO,UAAU,CAAC,KAAK,KAAK,CAAC,QAAQ,WAAW,MAAM,EAAE;IAE1D,OAAO,SAAS,CAAC,KAAK,KAAK,CAAC,QAAQ,UAAU,MAAM,EAAE;AACxD;AAEA,uEAAuE;AAEvE,SAAS,6CACP,IAAqB,EACrB,GAAiB,EACjB,KAAa,EACb,MAAc,EACd,UAAkB,EAClB,WAAmB,EACnB,EAAU,EACV,EAAU;IAEV,OAAQ;QACN,KAAK;YAAU;gBACb,MAAM,QAAQ,QAAQ,KAAK,EAAE,GAAG;gBAChC,MAAM,OAAO,KAAK,GAAG,CAAC,OAAO,UAAU;gBACvC,MAAM,IAAI,KAAK,GAAG,CAAC,OAAO,OAAO;gBACjC,OAAO;oBAAE,GAAG,KAAK,KAAK,GAAG,CAAC,SAAS;oBAAG,GAAG,KAAK,KAAK,GAAG,CAAC,SAAS;gBAAE;YACpE;QACA,KAAK;YAAU;gBACb,MAAM,IAAI,aAAa;gBACvB,MAAM,QAAQ,IAAI,QAAQ;gBAC1B,MAAM,QAAQ,IAAI,KAAK,EAAE,GAAG,IAAI;gBAChC,MAAM,OAAO,KAAK,GAAG,CAAC,OAAO,UAAU;gBACvC,MAAM,IAAI,IAAI,OAAO,AAAC,CAAA,QAAQ,GAAE,IAAK,OAAO;gBAC5C,OAAO;oBAAE,GAAG,KAAK,KAAK,GAAG,CAAC,SAAS;oBAAG,GAAG,KAAK,KAAK,GAAG,CAAC,SAAS;gBAAE;YACpE;QACA,KAAK;YAAoB;gBACvB,MAAM,QAAQ,IAAI,KAAK,KAAK,CAAC,QAAQ;gBACrC,MAAM,QAAQ,QAAQ;gBACtB,MAAM,QAAQ,SAAS;gBACvB,MAAM,KAAK,KAAK,KAAK,CAAC,QAAQ;gBAC9B,MAAM,KAAK,KAAK,KAAK,CAAC,QAAQ;gBAC9B,OAAO;oBACL,GAAG,KAAK,QAAQ,QAAQ;oBACxB,GAAG,KAAK,QAAQ,QAAQ;gBAC1B;YACF;QACA,KAAK;YAAa;gBAChB,MAAM,cAAc,IAAI,KAAK,KAAK,CAAC,QAAQ;gBAC3C,MAAM,KAAK,KAAK,KAAK,CAAC,QAAQ;gBAC9B,MAAM,aAAa,CAAA,GAAA,yCAAQ,EAAE,CAAA,GAAA,yCAAW,EAAE,OAAO,KAAK;gBACtD,MAAM,MAAM,QAAS,CAAA,OAAO,eAAe,GAAE;gBAC7C,MAAM,MAAM,SAAU,CAAA,OAAO,eAAe,GAAE;gBAC9C,MAAM,SAAS,KAAK,GAAG,CAAC,OAAO,UAAU;gBACzC,OAAO;oBACL,GAAG,MAAM,AAAC,CAAA,QAAQ,GAAE,IAAK,SAAS;oBAClC,GAAG,MAAM,AAAC,CAAA,QAAQ,GAAE,IAAK,SAAS;gBACpC;YACF;QACA,KAAK;QACL;YACE,OAAO;gBAAE,GAAG,QAAQ;gBAAO,GAAG,QAAQ;YAAO;IAEjD;AACF;AAEA,uEAAuE;AAEvE,SAAS,yCACP,CAAS,EACT,CAAS,EACT,KAAa,EACb,MAAc,EACd,MAAgB,EAChB,GAAiB;IAEjB,MAAM,KAAK,IAAI;IACf,MAAM,KAAK,IAAI;IACf,MAAM,WAAW,AAAC,CAAA,KAAK,MAAM,KAAK,GAAE,IAAM,CAAA,OAAO,MAAM,GAAG,CAAA;IAC1D,MAAM,UAAU,KAAK,KAAK,CAAC,YAAY,OAAO,MAAM;IACpD,OAAO,CAAA,GAAA,yCAAU,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK;AAC3C;AAEA,uEAAuE;AAEvE,SAAS,mCACP,CAAS,EACT,CAAS,EACT,SAA0D;IAE1D,KAAK,MAAM,QAAQ,UAAW;QAC5B,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,OAAO;IAC/D;IACA,OAAO;AACT;AAEA,uEAAuE;AAEvE,SAAS,mCACP,CAAS,EACT,CAAS,EACT,SAAwD,EACxD,MAAc;IAEd,IAAI,QAAQ;IACZ,KAAK,MAAM,KAAK,UACd,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,QAAQ;IAE7C,OAAO;AACT;AAEA,uEAAuE;AAEvE,SAAS,qCACP,GAA6B,EAC7B,KAAsB,EACtB,OAAe,EACf,KAAa,EACb,KAAa,EACb,MAAc,EACd,EAAU,EACV,EAAU,EACV,QAAgB,EAChB,GAAiB,EACjB,MAAgB;IAEhB,OAAQ;QACN,KAAK;YAAgB;gBACnB,MAAM,OAAO,IAAI,oBAAoB,CAAC,IAAI,IAAI,GAAG,IAAI,IAAI;gBACzD,KAAK,YAAY,CAAC,GAAG;gBACrB,KAAK,YAAY,CAAC,GAAG;gBACrB,IAAI,SAAS,GAAG;gBAChB,IAAI,QAAQ,CAAC,GAAG,GAAG,OAAO;gBAC1B;YACF;QACA,KAAK;YAAqB;gBACxB,MAAM,OAAO,IAAI,oBAAoB,CAAC,GAAG,GAAG,OAAO;gBACnD,KAAK,YAAY,CAAC,GAAG;gBACrB,KAAK,YAAY,CAAC,GAAG;gBACrB,IAAI,SAAS,GAAG;gBAChB,IAAI,QAAQ,CAAC,GAAG,GAAG,OAAO;gBAC1B;YACF;QACA,KAAK;YAAmB;gBACtB,MAAM,OAAO,IAAI,oBAAoB,CAAC,GAAG,GAAG,OAAO;gBACnD,KAAK,YAAY,CAAC,GAAG;gBACrB,KAAK,YAAY,CAAC,KAAK;gBACvB,KAAK,YAAY,CAAC,GAAG;gBACrB,IAAI,SAAS,GAAG;gBAChB,IAAI,QAAQ,CAAC,GAAG,GAAG,OAAO;gBAC1B;YACF;QACA,KAAK;YACH,IAAI,SAAS,GAAG;YAChB,IAAI,QAAQ,CAAC,GAAG,GAAG,OAAO;YAC1B;QAEF,KAAK;YACH,IAAI,SAAS,GAAG;YAChB,IAAI,QAAQ,CAAC,GAAG,GAAG,OAAO;YAC1B;QAEF,KAAK;YAAc;gBACjB,MAAM,OAAO,IAAI,oBAAoB,CAAC,GAAG,GAAG,QAAQ,KAAK;gBACzD,KAAK,YAAY,CAAC,GAAG;gBACrB,KAAK,YAAY,CAAC,MAAM;gBACxB,IAAI,OAAO,MAAM,GAAG,GAAG;oBACrB,MAAM,WAAW,CAAA,GAAA,yCAAW,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,mCAAmC,CAAC,GAAG,GAAG,GAAG;wBAC/F,MAAM,SAAS,CAAC,IAAc,KAAK,KAAK,CAAC,SAAS,KAAK,KAAK,QAAQ,CAAC,IAAI,QAAQ,CAAC,GAAG;wBACrF,OAAO,CAAC,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,GAAG,EAAE,OAAO,GAAG,CAAC;oBAChD;oBACA,KAAK,YAAY,CAAC,MAAM;gBAC1B;gBACA,KAAK,YAAY,CAAC,GAAG;gBACrB,IAAI,SAAS,GAAG;gBAChB,IAAI,QAAQ,CAAC,GAAG,GAAG,OAAO;gBAC1B;YACF;QACA,KAAK;QACL;YAAS;gBACP,MAAM,OAAO,IAAI,oBAAoB,CAAC,IAAI,IAAI,GAAG,IAAI,IAAI;gBACzD,KAAK,YAAY,CAAC,GAAG;gBACrB,KAAK,YAAY,CAAC,GAAG;gBACrB,IAAI,SAAS,GAAG;gBAChB,IAAI,QAAQ,CAAC,GAAG,GAAG,OAAO;gBAC1B;YACF;IACF;AACF;AAIO,SAAS,0CACd,GAA6B,EAC7B,OAAe,EACf,SAAoC,CAAC,CAAC;IAEtC,MAAM,cAAgC;QAAE,GAAG,CAAA,GAAA,yCAAa,CAAC;QAAE,GAAG,MAAM;IAAC;IAErE,MAAM,MAAM,CAAA,GAAA,yCAAQ,EAAE,CAAA,GAAA,yCAAW,EAAE;IAEnC,yEAAyE;IACzE,MAAM,YAAY,CAAA,GAAA,yCAAc,EAAE;IAElC,8DAA8D;IAC9D,MAAM,SACJ,KAAK,UACL,MAAM,EACP,GAAG;IACJ,MAAM,WAAW,OAAO,QAAQ,IAAI,UAAU,QAAQ;IACtD,MAAM,SAAS,OAAO,MAAM,IAAI,UAAU,MAAM;IAChD,MAAM,eAAe,OAAO,YAAY,IAAI,UAAU,YAAY;IAClE,MAAM,eAAe,OAAO,YAAY,IAAI,UAAU,YAAY;IAClE,MAAM,cAAc,OAAO,WAAW,IAAI,UAAU,WAAW;IAC/D,MAAM,mBAAmB,OAAO,gBAAgB,IAAI,UAAU,gBAAgB;IAE9E,MAAM,iBACJ,YAAY,cAAc,IAAI,KAAK,KAAK,CAAC,WAAW,WAAW;IAEjE,MAAM,cAAc,IAAI,CAAA,GAAA,yCAAgB,EAAE;IAC1C,MAAM,SAAS,YAAY,eAAe,CAAC,UAAU,WAAW;IAChE,MAAM,CAAC,SAAS,MAAM,GAAG,YAAY,yBAAyB,CAAC,UAAU,WAAW;IACpF,MAAM,WAAW,YAAY,kBAAkB;IAC/C,MAAM,eACJ,aAAa,YAAY,SAAS,aAAa,YAAY,SAAS;IAEtE,MAAM,aAAa,OAAO,IAAI,CAAC,CAAA,GAAA,yCAAK;IACpC,MAAM,cAAc,KAAK,GAAG,CAAC,OAAO,UAAU;IAC9C,MAAM,kBAAkB,eAAe;IACvC,MAAM,kBAAkB,eAAe;IAEvC,MAAM,KAAK,QAAQ;IACnB,MAAM,KAAK,SAAS;IAEpB,kEAAkE;IAClE,MAAM,WAAW,KAAK,KAAK,CAAC,IAAI;IAChC,qCAAe,KAAK,UAAU,eAAe,EAAE,SAAS,OAAO,OAAO,QAAQ,IAAI,IAAI,UAAU,KAAK;IAErG,gEAAgE;IAChE,MAAM,QAAQ,AAAC,CAAA,CAAA,GAAA,yCAAQ,EAAE,WAAW,CAAA,GAAA,yCAAQ,EAAE,MAAK,IAAK;IAExD,kEAAkE;IAClE,+DAA+D;IAC/D,MAAM,eAAe,IAAI,KAAK,KAAK,CAAC,QAAQ;IAC5C,IAAI,wBAAwB,GAAG;IAC/B,IAAK,IAAI,IAAI,GAAG,IAAI,cAAc,IAAK;QACrC,MAAM,KAAK,QAAQ;QACnB,MAAM,KAAK,QAAQ;QACnB,MAAM,QAAS,QAAQ,MAAM,QAAQ,QAAQ;QAC7C,MAAM,SAAS,MAAM,CAAC,KAAK,KAAK,CAAC,QAAQ,OAAO,MAAM,EAAE;QACxD,IAAI,WAAW,GAAG,OAAO,QAAQ;QACjC,IAAI,SAAS,GAAG,CAAA,GAAA,yCAAW,EAAE,QAAQ;QACrC,IAAI,SAAS;QACb,IAAI,GAAG,CAAC,IAAI,IAAI,QAAQ,GAAG,GAAG,KAAK,EAAE,GAAG;QACxC,IAAI,IAAI;IACV;IACA,sCAAsC;IACtC,MAAM,YAAY,IAAI,KAAK,KAAK,CAAC,QAAQ;IACzC,IAAI,WAAW,GAAG,OAAO,QAAQ;IACjC,IAAI,WAAW,GAAG,CAAA,GAAA,yCAAW,EAAE,MAAM,CAAC,EAAE,EAAE;IAC1C,IAAI,SAAS,GAAG,IAAI;IACpB,IAAK,IAAI,IAAI,GAAG,KAAK,WAAW,IAAK;QACnC,MAAM,IAAI,AAAC,KAAK,GAAG,CAAC,OAAO,UAAU,OAAQ;QAC7C,IAAI,SAAS;QACb,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,GAAG,KAAK,EAAE,GAAG;QAChC,IAAI,MAAM;IACZ;IACA,IAAI,wBAAwB,GAAG;IAE/B,kEAAkE;IAClE,MAAM,kBACJ,uCAAiB,CAAC,KAAK,KAAK,CAAC,QAAQ,wCAAkB,MAAM,EAAE;IAIjE,MAAM,UAAU;IAChB,MAAM,eACJ,UAAU,OAAO,gBACjB,UAAU,OAAO,gBACjB,UAAU,OAAO,SAAS;IAE5B,kEAAkE;IAClE,iEAAiE;IACjE,MAAM,gBAAgB;QACpB;YAAE,GAAG,IAAI;YAAG,GAAG,IAAI;QAAE;QACrB;YAAE,GAAG,IAAI;YAAG,GAAG,IAAI;QAAE;QACrB;YAAE,GAAG,IAAI;YAAG,GAAG,IAAI;QAAE;QACrB;YAAE,GAAG,IAAI;YAAG,GAAG,IAAI;QAAE;KACtB;IACD,MAAM,WAAW,IAAI,KAAK,KAAK,CAAC,QAAQ;IACxC,MAAM,cAAiE,EAAE;IACzE,IAAK,IAAI,IAAI,GAAG,IAAI,UAAU,IAC5B,mEAAmE;IACnE,IAAI,QAAQ,KAAK;QACf,MAAM,KAAK,aAAa,CAAC,KAAK,KAAK,CAAC,QAAQ,cAAc,MAAM,EAAE;QAClE,2DAA2D;QAC3D,YAAY,IAAI,CAAC;YACf,GAAG,QAAS,CAAA,GAAG,CAAC,GAAG,AAAC,CAAA,QAAQ,GAAE,IAAK,IAAG;YACtC,GAAG,SAAU,CAAA,GAAG,CAAC,GAAG,AAAC,CAAA,QAAQ,GAAE,IAAK,IAAG;YACvC,UAAU,MAAM,QAAQ;QAC1B;IACF,OACE,YAAY,IAAI,CAAC;QACf,GAAG,QAAS,CAAA,MAAM,QAAQ,GAAE;QAC5B,GAAG,SAAU,CAAA,MAAM,QAAQ,GAAE;QAC7B,UAAU,MAAM,QAAQ;IAC1B;IAIJ,qEAAqE;IACrE,MAAM,WAAW,KAAK,KAAK,CAAC,QAAQ,KAAK;IACzC,MAAM,YAA6D,EAAE;IACrE,IAAK,IAAI,IAAI,GAAG,IAAI,UAAU,IAC5B,UAAU,IAAI,CAAC;QACb,GAAG,QAAS,CAAA,OAAO,QAAQ,GAAE;QAC7B,GAAG,SAAU,CAAA,OAAO,QAAQ,GAAE;QAC9B,QAAQ,KAAK,GAAG,CAAC,OAAO,UAAW,CAAA,OAAO,QAAQ,GAAE;IACtD;IAGF,SAAS,eAAe,EAAU,EAAE,EAAU;QAC5C,IAAI,UAAU,WAAW,CAAC,EAAE;QAC5B,IAAI,UAAU;QACd,KAAK,MAAM,MAAM,YAAa;YAC5B,MAAM,IAAI,KAAK,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC;YACzC,IAAI,IAAI,SAAS;gBACf,UAAU;gBACV,UAAU;YACZ;QACF;QACA,MAAM,OAAO,QAAQ,QAAQ,GAAG,QAAQ;QACxC,OAAO;YAAC,KAAK,AAAC,CAAA,QAAQ,CAAC,GAAG,EAAC,IAAK;YAAM,KAAK,AAAC,CAAA,QAAQ,CAAC,GAAG,EAAC,IAAK;SAAK;IACrE;IAEA,kEAAkE;IAClE,MAAM,iBAAiB,QAAQ,KAAK,EAAE,GAAG;IACzC,MAAM,YAAY,MAAM,QAAQ;IAEhC,SAAS,UAAU,CAAS,EAAE,CAAS;QACrC,OACE,iBACA,KAAK,GAAG,CAAC,AAAC,IAAI,QAAS,YAAY,KAAK,EAAE,GAAG,KAAK,KAAK,EAAE,GAAG,MAC5D,KAAK,GAAG,CAAC,AAAC,IAAI,SAAU,YAAY,KAAK,EAAE,GAAG,KAAK,KAAK,EAAE,GAAG;IAEjE;IAEA,mEAAmE;IACnE,MAAM,iBAAgE,EAAE;IAExE,mEAAmE;IACnE,IAAI,UAAU,SAAS,IAAI,QAAQ,KAAK;QACtC,MAAM,YAAY,WAAW,CAAC,EAAE;QAChC,MAAM,WAAW;eAAI;YAAe;YAAmB;YAAW;SAAU;QAC5E,MAAM,YACJ,SAAS,MAAM,CAAC,CAAC,IAAM,WAAW,QAAQ,CAAC,GAAG,CAC5C,KAAK,KAAK,CAAC,QAAQ,SAAS,MAAM,CAAC,CAAC,IAAM,WAAW,QAAQ,CAAC,IAAI,MAAM,EACzE,IAAI,UAAU,CAAC,KAAK,KAAK,CAAC,QAAQ,WAAW,MAAM,EAAE;QAExD,MAAM,WAAW,kBAAmB,CAAA,MAAM,QAAQ,GAAE;QACpD,MAAM,eAAe,QAAQ;QAC7B,MAAM,WAAW,CAAA,GAAA,yCAAW,EAC1B,CAAA,GAAA,yCAAc,EAAE,CAAA,GAAA,yCAAU,EAAE,MAAM,CAAC,KAAK,KAAK,CAAC,QAAQ,OAAO,MAAM,EAAE,EAAE,KAAK,OAAO,QACnF,OAAO,QAAQ;QAEjB,MAAM,aAAa,CAAA,GAAA,yCAAc,EAAE,CAAA,GAAA,yCAAU,EAAE,MAAM,CAAC,KAAK,KAAK,CAAC,QAAQ,OAAO,MAAM,EAAE,EAAE,KAAK,OAAO;QAEtG,IAAI,WAAW,GAAG,MAAM,QAAQ;QAChC,CAAA,GAAA,yCAAqB,EAAE,KAAK,WAAW,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE;YAC/D,WAAW;YACX,aAAa;YACb,aAAa,AAAC,CAAA,MAAM,QAAQ,CAAA,IAAK;YACjC,MAAM;YACN,UAAU;YACV,gBAAgB;YAChB,YAAY,AAAC,CAAA,KAAK,QAAQ,EAAC,IAAK;YAChC,WAAW,CAAA,GAAA,yCAAW,EAAE,YAAY;YACpC,iBAAiB,CAAA,GAAA,yCAAU,EAAE,MAAM,CAAC,KAAK,KAAK,CAAC,QAAQ,OAAO,MAAM,EAAE,EAAE,KAAK;YAC7E,aAAa,QAAQ,MAAM,eAAe;iBAC1C;QACF;QAEA,eAAe,IAAI,CAAC;YAAE,GAAG,UAAU,CAAC;YAAE,GAAG,UAAU,CAAC;YAAE,MAAM;QAAS;IACvE;IAEA,kEAAkE;IAClE,MAAM,qBAAqB,KAAK,GAAG,CAAC,OAAO,UAAU;IACrD,MAAM,kBAAkB,KAAK,IAAI,CAAC,iBAAiB;IAEnD,IAAK,IAAI,QAAQ,GAAG,QAAQ,QAAQ,QAAS;QAC3C,MAAM,aAAa,SAAS,IAAI,QAAS,CAAA,SAAS,CAAA,IAAK;QACvD,MAAM,YACJ,iBACA,KAAK,KAAK,CAAC,QAAQ,iBAAiB;QACtC,MAAM,eAAe,KAAK,GAAG,CAAC,MAAM,cAAc,QAAQ;QAC1D,MAAM,iBAAiB,IAAI,QAAQ;QAEnC,kCAAkC;QAClC,MAAM,aAAa,CAAA,GAAA,yCAAY,EAAE;QACjC,IAAI,wBAAwB,GAAG;QAE/B,mEAAmE;QACnE,MAAM,mBAAgC,QAAQ,MAC1C,UAAU,eAAe,CAAC,KAAK,KAAK,CAAC,QAAQ,UAAU,eAAe,CAAC,MAAM,EAAE,GAC/E,CAAA,GAAA,yCAAc,EAAE;QAEpB,uDAAuD;QACvD,MAAM,mBAAmB,aAAa,KAAK,wCAAwC;QAEnF,IAAK,IAAI,IAAI,GAAG,IAAI,WAAW,IAAK;YAClC,kDAAkD;YAClD,MAAM,SAAS,6CACb,iBACA,KACA,OACA,QACA,GACA,WACA,IACA;YAEF,MAAM,CAAC,GAAG,EAAE,GAAG,eAAe,OAAO,CAAC,EAAE,OAAO,CAAC;YAEhD,8DAA8D;YAC9D,IAAI,mCAAa,GAAG,GAAG,YAAY;gBACjC,uDAAuD;gBACvD,IAAI,QAAQ,MAAM;YACpB;YACA,IAAI,mCAAa,GAAG,GAAG,gBAAgB,sBAAsB,iBAAiB;gBAC5E,IAAI,QAAQ,KAAK,UAAU,uBAAuB;YACpD;YAEA,2BAA2B;YAC3B,MAAM,QAAQ,gCAAU,KAAK,YAAY;YAEzC,6DAA6D;YAC7D,MAAM,QAAQ,KAAK,GAAG,CAAC,OAAO,UAAU,SAAS;YACjD,MAAM,OACJ,AAAC,CAAA,kBAAkB,QAAS,CAAA,kBAAkB,eAAc,CAAC,IAC7D;YAEF,2DAA2D;YAC3D,MAAM,WACJ,oBAAoB,eAChB,AAAC,UAAU,GAAG,KAAK,MAAO,KAAK,EAAE,GAAG,AAAC,CAAA,QAAQ,GAAE,IAAK,KACpD,QAAQ;YAEd,qCAAqC;YACrC,IAAI,WAAW,yCAAmB,GAAG,GAAG,OAAO,QAAQ,QAAQ;YAC/D,MAAM,aAAa,MAAM,CAAC,KAAK,KAAK,CAAC,QAAQ,OAAO,MAAM,EAAE;YAE5D,yDAAyD;YACzD,IAAI,mBAAmB,GACrB,WAAW,CAAA,GAAA,wCAAS,EAAE,UAAU;YAGlC,uEAAuE;YACvE,IAAI,cACF,WAAW,CAAA,GAAA,yCAAe,EAAE,UAAU,cAAc,OAAO,aAAa;YAG1E,MAAM,YAAY,CAAA,GAAA,yCAAc,EAAE,CAAA,GAAA,yCAAU,EAAE,UAAU,KAAK,OAAO;YACpE,MAAM,cAAc,CAAA,GAAA,yCAAc,EAAE,CAAA,GAAA,yCAAU,EAAE,YAAY,KAAK,OAAO;YAExE,wBAAwB;YACxB,MAAM,YAAY,MAAM,QAAQ;YAChC,MAAM,kBAAkB,CAAA,GAAA,yCAAW,EAAE,WAAW;YAEhD,MAAM,cAAc,AAAC,CAAA,MAAM,QAAQ,GAAE,IAAK;YAE1C,IAAI,WAAW,GAAG,eAAgB,CAAA,MAAM,QAAQ,GAAE;YAElD,yDAAyD;YACzD,MAAM,WAAW,oCAAc,QAAQ,CAAC;YACxC,MAAM,iBAAiB,WAAW,OAAO;YACzC,MAAM,aAAa,iBAAiB,UAAU,cAAc;YAC5D,MAAM,UAAU,QAAQ;YACxB,MAAM,aAAa,UAAU,AAAC,CAAA,IAAI,QAAQ,EAAC,IAAK,cAAc;YAE9D,wBAAwB;YACxB,MAAM,cAAc,QAAQ;YAC5B,MAAM,cAAc,cAChB,CAAA,GAAA,yCAAU,EAAE,MAAM,CAAC,KAAK,KAAK,CAAC,QAAQ,OAAO,MAAM,EAAE,EAAE,KAAK,OAC5D;YAEJ,8EAA8E;YAC9E,MAAM,mBACJ,QAAQ,MAAM,mBAAmB,CAAA,GAAA,yCAAc,EAAE;YAEnD,kFAAkF;YAClF,MAAM,kBAAkB,QAAQ,QAAQ,qBAAqB;YAC7D,MAAM,mBAAmB,kBAAkB,eAAe;YAE1D,CAAA,GAAA,yCAAqB,EAAE,KAAK,OAAO,GAAG,GAAG;gBACvC,WAAW;6BACX;6BACA;sBACA;0BACA;gBACA,gBAAgB;4BAChB;gBACA,WAAW,UAAU,CAAA,GAAA,yCAAW,EAAE,WAAW,OAAO;gBACpD,iBAAiB;gBACjB,aAAa;qBACb;YACF;YAEA,eAAe,IAAI,CAAC;mBAAE;mBAAG;sBAAG;YAAK;YAEjC,8DAA8D;YAC9D,IAAI,OAAO,kBAAkB,OAAO,QAAQ,MAAM;gBAChD,MAAM,aAAa,IAAI,KAAK,KAAK,CAAC,QAAQ;gBAC1C,IAAK,IAAI,IAAI,GAAG,IAAI,YAAY,IAAK;oBACnC,MAAM,aAAa,gCACjB,KACA,KAAK,GAAG,CAAC,GAAG,aAAa,MACzB;oBAEF,MAAM,YAAY,OAAQ,CAAA,OAAO,QAAQ,IAAG;oBAC5C,MAAM,YAAY,AAAC,CAAA,QAAQ,GAAE,IAAK,OAAO;oBACzC,MAAM,YAAY,AAAC,CAAA,QAAQ,GAAE,IAAK,OAAO;oBACzC,MAAM,WAAW,QAAQ;oBACzB,MAAM,YAAY,CAAA,GAAA,yCAAW,EAC3B,CAAA,GAAA,yCAAU,EAAE,MAAM,CAAC,KAAK,KAAK,CAAC,QAAQ,OAAO,MAAM,EAAE,EAAE,KAAK,MAC5D,MAAM,QAAQ;oBAGhB,IAAI,WAAW,GAAG,eAAe;oBACjC,CAAA,GAAA,yCAAqB,EACnB,KACA,YACA,IAAI,WACJ,IAAI,WACJ;wBACE,WAAW;wBACX,aAAa,CAAA,GAAA,yCAAW,EAAE,aAAa;wBACvC,aAAa,cAAc;wBAC3B,MAAM;wBACN,UAAU;wBACV,gBAAgB;wBAChB,aAAa;6BACb;oBACF;gBAEJ;YACF;QACF;IACF;IAEA,8CAA8C;IAC9C,IAAI,wBAAwB,GAAG;IAE/B,kEAAkE;IAClE,MAAM,gBAAgB,IAAI,KAAK,KAAK,CAAC,QAAQ;IAC7C,MAAM,eAAe,KAAK,KAAK,CAAC,gBAAgB,UAAU,kBAAkB;IAC5E,IAAK,IAAI,IAAI,GAAG,IAAI,cAAc,IAAK;QACrC,IAAI,KAAK,QAAQ;QACjB,IAAI,KAAK,QAAQ;QACjB,MAAM,QAAQ,KAAK,KAAK,KAAK,CAAC,QAAQ;QACtC,MAAM,UAAU,AAAC,CAAA,IAAI,QAAQ,CAAA,IAAK;QAClC,MAAM,aAAa,AAAC,CAAA,IAAI,QAAQ,CAAA,IAAK;QAErC,MAAM,YAAY,CAAA,GAAA,yCAAW,EAC3B,CAAA,GAAA,yCAAc,EAAE,MAAM,CAAC,KAAK,KAAK,CAAC,QAAQ,OAAO,MAAM,EAAE,EAAE,QAC3D;QAEF,MAAM,YAAY,OAAO,QAAQ;QAEjC,kDAAkD;QAClD,IAAI,QAAQ;QACZ,IAAI,QAAQ;QACZ,IAAK,IAAI,IAAI,GAAG,IAAI,OAAO,IAAK;YAC9B,MAAM,QAAQ,UAAU,IAAI,MAAM,AAAC,CAAA,QAAQ,GAAE,IAAK;YAClD,MAAM,KAAK,GAAG,CAAC,SAAS;YACxB,MAAM,KAAK,GAAG,CAAC,SAAS;YAExB,IAAI,KAAK,KAAK,KAAK,SAAS,KAAK,KAAK,KAAK,QAAQ;YAEnD,qCAAqC;YACrC,MAAM,QAAQ,IAAI,AAAC,IAAI,QAAS;YAChC,IAAI,WAAW,GAAG,YAAY;YAC9B,IAAI,WAAW,GAAG;YAClB,IAAI,SAAS,GAAG,aAAa;YAC7B,IAAI,OAAO,GAAG;YAEd,IAAI,SAAS;YACb,IAAI,MAAM,CAAC,OAAO;YAClB,IAAI,MAAM,CAAC,IAAI;YACf,IAAI,MAAM;YAEV,QAAQ;YACR,QAAQ;QACV;IACF;IAEA,oEAAoE;IACpE,4EAA4E;IAC5E,kFAAkF;IAClF,IAAI,iBAAiB,QAAQ;QAC3B,MAAM,SAAS,IAAI,MAAM;QACzB,IAAI,IAAI;QACR,IAAI,iBAAiB,iBAAiB,iBAAiB,QAAQ;YAC7D,mCAAmC;YACnC,IAAI,IAAI;YACR,IAAI,SAAS,CAAC,OAAO;YACrB,IAAI,KAAK,CAAC,IAAI;YACd,4DAA4D;YAC5D,IAAI,SAAS,CAAC,QAAQ,GAAG,GAAG,KAAK,IAAI,CAAC,KAAK,QAAQ,GAAG,GAAG,KAAK,IAAI,CAAC,KAAK;YACxE,IAAI,OAAO;QACb;QACA,IAAI,iBAAiB,iBAAiB,iBAAiB,QAAQ;YAC7D,mCAAmC;YACnC,IAAI,IAAI;YACR,IAAI,SAAS,CAAC,GAAG;YACjB,IAAI,KAAK,CAAC,GAAG;YACb,IAAI,SAAS,CAAC,QAAQ,GAAG,GAAG,OAAO,KAAK,IAAI,CAAC,KAAK,GAAG,GAAG,OAAO,KAAK,IAAI,CAAC;YACzE,IAAI,OAAO;QACb;QACA,IAAI,OAAO;IACb;IAEA,kEAAkE;IAClE,MAAM,WAAW,CAAA,GAAA,yCAAQ,EAAE,CAAA,GAAA,yCAAW,EAAE,SAAS;IACjD,MAAM,eAAe,KAAK,KAAK,CAAC,AAAC,QAAQ,SAAU;IACnD,IAAK,IAAI,IAAI,GAAG,IAAI,cAAc,IAAK;QACrC,MAAM,KAAK,aAAa;QACxB,MAAM,KAAK,aAAa;QACxB,MAAM,aAAa,aAAa,MAAM,MAAM;QAC5C,MAAM,QAAQ,OAAO,aAAa;QAClC,IAAI,WAAW,GAAG;QAClB,IAAI,SAAS,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,CAAC;QACnE,IAAI,QAAQ,CAAC,IAAI,IAAI,IAAI,aAAa,IAAI;IAC5C;IAEA,mEAAmE;IACnE,IAAI,WAAW,GAAG;IAClB,MAAM,mBAAmB,OAAO,QAAQ,KAAK,wBAAwB;IACrE,MAAM,UAAU,IAAI,oBAAoB,CAAC,IAAI,IAAI,KAAK,GAAG,CAAC,OAAO,UAAU,KAAK,IAAI,IAAI;IACxF,QAAQ,YAAY,CAAC,GAAG;IACxB,QAAQ,YAAY,CAAC,KAAK;IAC1B,QAAQ,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,iBAAiB,OAAO,CAAC,GAAG,CAAC,CAAC;IACpE,IAAI,SAAS,GAAG;IAChB,IAAI,QAAQ,CAAC,GAAG,GAAG,OAAO;IAE1B,kEAAkE;IAClE,IAAI,eAAe,MAAM,GAAG,GAAG;QAC7B,MAAM,YAAY,KAAK,KAAK,CAAC,AAAC,IAAK,CAAA,QAAQ,MAAK,IAAO;QACvD,IAAI,SAAS,GAAG,MAAM;QAEtB,IAAK,IAAI,IAAI,GAAG,IAAI,WAAW,IAAK;YAClC,MAAM,OAAO,KAAK,KAAK,CAAC,QAAQ,eAAe,MAAM;YACrD,MAAM,SACJ,IAAI,KAAK,KAAK,CAAC,QAAQ,KAAK,GAAG,CAAC,GAAG,eAAe,MAAM,GAAG;YAC7D,MAAM,OAAO,AAAC,CAAA,OAAO,MAAK,IAAK,eAAe,MAAM;YAEpD,MAAM,IAAI,cAAc,CAAC,KAAK;YAC9B,MAAM,IAAI,cAAc,CAAC,KAAK;YAE9B,MAAM,KAAK,AAAC,CAAA,EAAE,CAAC,GAAG,EAAE,CAAC,AAAD,IAAK;YACzB,MAAM,KAAK,AAAC,CAAA,EAAE,CAAC,GAAG,EAAE,CAAC,AAAD,IAAK;YACzB,MAAM,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC;YACpB,MAAM,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC;YACpB,MAAM,OAAO,KAAK,KAAK,CAAC,IAAI;YAC5B,MAAM,QAAQ,AAAC,CAAA,QAAQ,GAAE,IAAK,OAAO;YAErC,MAAM,MAAM,KAAK,AAAC,CAAC,KAAM,CAAA,QAAQ,CAAA,IAAM;YACvC,MAAM,MAAM,KAAK,AAAC,KAAM,CAAA,QAAQ,CAAA,IAAM;YAEtC,IAAI,WAAW,GAAG,OAAO,QAAQ;YACjC,IAAI,WAAW,GAAG,CAAA,GAAA,yCAAW,EAC3B,CAAA,GAAA,yCAAc,EAAE,MAAM,CAAC,KAAK,KAAK,CAAC,QAAQ,OAAO,MAAM,EAAE,EAAE,QAC3D;YAGF,IAAI,SAAS;YACb,IAAI,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACnB,IAAI,gBAAgB,CAAC,KAAK,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,IAAI,MAAM;QACZ;IACF;IAEA,IAAI,WAAW,GAAG;AACpB;;CDzxBC;;;AAKD;;;;;;;;;CASC,GACD,SAAS,0CACP,MAA2C,EAC3C,OAAe,EACf,SAAoC,CAAC,CAAC;IAEtC,MAAM,MAAM,OAAO,UAAU,CAAC;IAC9B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM;IAGlB,MAAM,cAAyC;QAC7C,OAAO,OAAO,KAAK;QACnB,QAAQ,OAAO,MAAM;QACrB,GAAG,MAAM;IACX;IAEA,CAAA,GAAA,yCAAY,EAAE,KAAK,SAAS;AAC9B;AAEA;;;;;;CAMC,GACD,eAAe,0CACb,OAAe,EACf,SAAoC,CAAC,CAAC;IAEtC,MAAM,cAAgC;QAAE,GAAG,CAAA,GAAA,yCAAa,CAAC;QAAE,GAAG,MAAM;IAAC;IACrE,MAAM,SAAE,KAAK,UAAE,MAAM,EAAE,GAAG;IAE1B,MAAM,SAAS,IAAI,gBAAgB,OAAO;IAC1C,MAAM,MAAM,OAAO,UAAU,CAAC;IAC9B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM;IAGlB,CAAA,GAAA,yCAAY,EACV,KACA,SACA;IAGF,OAAO,OAAO,aAAa,CAAC;QAAE,MAAM;IAAY;AAClD;AAEA;;;;;;CAMC,GACD,SAAS,0CACP,OAAe,EACf,SAAoC,CAAC,CAAC;IAEtC,MAAM,cAAgC;QAAE,GAAG,CAAA,GAAA,yCAAa,CAAC;QAAE,GAAG,MAAM;IAAC;IACrE,MAAM,SAAE,KAAK,UAAE,MAAM,EAAE,GAAG;IAE1B,MAAM,SAAS,SAAS,aAAa,CAAC;IACtC,OAAO,KAAK,GAAG;IACf,OAAO,MAAM,GAAG;IAEhB,MAAM,MAAM,OAAO,UAAU,CAAC;IAC9B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM;IAGlB,CAAA,GAAA,yCAAY,EAAE,KAAK,SAAS;IAE5B,OAAO,OAAO,SAAS,CAAC;AAC1B","sources":["src/browser.ts","src/lib/render.ts","src/lib/canvas/colors.ts","global.d.ts","src/lib/utils.ts","src/lib/canvas/draw.ts","src/lib/canvas/shapes/index.ts","src/lib/canvas/shapes/basic.ts","src/lib/canvas/shapes/complex.ts","src/lib/constants.ts","src/lib/canvas/shapes/utils.ts","src/lib/canvas/shapes/sacred.ts","src/lib/canvas/shapes/procedural.ts","src/types.ts","src/lib/archetypes.ts"],"sourcesContent":["/**\n * Browser entry point for git-hash-art.\n *\n * This module has zero Node.js dependencies — it works with a standard\n * HTMLCanvasElement or OffscreenCanvas and the native Canvas 2D API.\n */\nimport { renderHashArt } from \"./lib/render\";\nimport type { GenerationConfig } from \"./types\";\nimport { DEFAULT_CONFIG } from \"./types\";\n\n/**\n * Render hash-derived art directly onto an HTMLCanvasElement.\n *\n * The canvas should already have the desired width/height set.\n * Config width/height will be inferred from the canvas if not provided.\n *\n * @param canvas - An HTMLCanvasElement (or OffscreenCanvas)\n * @param gitHash - Hex hash string used as the deterministic seed\n * @param config - Partial generation config (merged with defaults)\n */\nfunction renderToCanvas(\n canvas: HTMLCanvasElement | OffscreenCanvas,\n gitHash: string,\n config: Partial<GenerationConfig> = {},\n): void {\n const ctx = canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n if (!ctx) {\n throw new Error(\"Failed to get 2D rendering context from canvas\");\n }\n\n const finalConfig: Partial<GenerationConfig> = {\n width: canvas.width,\n height: canvas.height,\n ...config,\n };\n\n renderHashArt(ctx, gitHash, finalConfig);\n}\n\n/**\n * Render hash-derived art and return it as a Blob (browser-native).\n *\n * @param gitHash - Hex hash string used as the deterministic seed\n * @param config - Partial generation config (merged with defaults)\n * @returns A Promise that resolves to a PNG Blob\n */\nasync function generateImageBlob(\n gitHash: string,\n config: Partial<GenerationConfig> = {},\n): Promise<Blob> {\n const finalConfig: GenerationConfig = { ...DEFAULT_CONFIG, ...config };\n const { width, height } = finalConfig;\n\n const canvas = new OffscreenCanvas(width, height);\n const ctx = canvas.getContext(\"2d\") as OffscreenCanvasRenderingContext2D;\n if (!ctx) {\n throw new Error(\"Failed to get 2D rendering context from OffscreenCanvas\");\n }\n\n renderHashArt(\n ctx as unknown as CanvasRenderingContext2D,\n gitHash,\n finalConfig,\n );\n\n return canvas.convertToBlob({ type: \"image/png\" });\n}\n\n/**\n * Render hash-derived art and return it as a data URL string.\n *\n * @param gitHash - Hex hash string used as the deterministic seed\n * @param config - Partial generation config (merged with defaults)\n * @returns A data:image/png;base64,… string\n */\nfunction generateDataURL(\n gitHash: string,\n config: Partial<GenerationConfig> = {},\n): string {\n const finalConfig: GenerationConfig = { ...DEFAULT_CONFIG, ...config };\n const { width, height } = finalConfig;\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"Failed to get 2D rendering context\");\n }\n\n renderHashArt(ctx, gitHash, finalConfig);\n\n return canvas.toDataURL(\"image/png\");\n}\n\nexport { renderToCanvas, generateImageBlob, generateDataURL, renderHashArt };\nexport { PRESETS } from \"./lib/constants\";\nexport type { GenerationConfig } from \"./types\";\nexport { DEFAULT_CONFIG } from \"./types\";\n","/**\n * Pure rendering logic — environment-agnostic.\n *\n * Uses only the standard CanvasRenderingContext2D API so it works\n * identically in Node (@napi-rs/canvas) and browsers.\n *\n * Generation pipeline:\n * 1. Background — radial gradient from hash-derived dark palette\n * 1b. Layered background — large faint shapes / subtle pattern for depth\n * 2. Composition mode — hash selects: radial, flow-field, spiral, grid-subdivision, or clustered\n * 3. Focal points + void zones (negative space)\n * 4. Flow field seed values\n * 5. Shape layers — blend modes, render styles, weighted selection,\n * focal-point placement, atmospheric depth, organic edges\n * 5b. Recursive nesting\n * 6. Flow-line pass — tapered brush-stroke curves\n * 7. Noise texture overlay\n * 8. Organic connecting curves\n */\nimport {\n SacredColorScheme,\n hexWithAlpha,\n jitterColor,\n desaturate,\n shiftTemperature,\n luminance,\n enforceContrast,\n} from \"./canvas/colors\";\nimport {\n enhanceShapeGeneration,\n pickBlendMode,\n pickRenderStyle,\n type RenderStyle,\n} from \"./canvas/draw\";\nimport { shapes } from \"./canvas/shapes\";\nimport { createRng, seedFromHash } from \"./utils\";\nimport { DEFAULT_CONFIG, type GenerationConfig } from \"../types\";\nimport { selectArchetype, type BackgroundStyle } from \"./archetypes\";\n\n// ── Shape categories for weighted selection ─────────────────────────\n\nconst BASIC_SHAPES = [\n \"circle\",\n \"square\",\n \"triangle\",\n \"hexagon\",\n \"diamond\",\n \"cube\",\n];\nconst COMPLEX_SHAPES = [\n \"star\",\n \"jacked-star\",\n \"heart\",\n \"platonicSolid\",\n \"fibonacciSpiral\",\n \"islamicPattern\",\n \"celticKnot\",\n \"merkaba\",\n \"fractal\",\n];\nconst SACRED_SHAPES = [\n \"mandala\",\n \"flowerOfLife\",\n \"treeOfLife\",\n \"metatronsCube\",\n \"sriYantra\",\n \"seedOfLife\",\n \"vesicaPiscis\",\n \"torus\",\n \"eggOfLife\",\n];\nconst PROCEDURAL_SHAPES = [\n \"blob\",\n \"ngon\",\n \"lissajous\",\n \"superellipse\",\n \"spirograph\",\n \"waveRing\",\n \"rose\",\n];\n\n// ── Composition modes ───────────────────────────────────────────────\n\ntype CompositionMode =\n | \"radial\"\n | \"flow-field\"\n | \"spiral\"\n | \"grid-subdivision\"\n | \"clustered\";\n\nconst COMPOSITION_MODES: CompositionMode[] = [\n \"radial\",\n \"flow-field\",\n \"spiral\",\n \"grid-subdivision\",\n \"clustered\",\n];\n\n// ── Helper: pick shape with layer-aware weighting ───────────────────\n\nfunction pickShape(\n rng: () => number,\n layerRatio: number,\n shapeNames: string[],\n): string {\n const basicW = 1 - layerRatio * 0.6;\n const complexW = 0.3 + layerRatio * 0.3;\n const sacredW = 0.1 + layerRatio * 0.4;\n const proceduralW = 0.25 + layerRatio * 0.2; // always present, grows with depth\n const total = basicW + complexW + sacredW + proceduralW;\n const roll = rng() * total;\n\n let pool: string[];\n if (roll < basicW) pool = BASIC_SHAPES;\n else if (roll < basicW + complexW) pool = COMPLEX_SHAPES;\n else if (roll < basicW + complexW + sacredW) pool = SACRED_SHAPES;\n else pool = PROCEDURAL_SHAPES;\n\n const available = pool.filter((s) => shapeNames.includes(s));\n if (available.length === 0) {\n return shapeNames[Math.floor(rng() * shapeNames.length)];\n }\n return available[Math.floor(rng() * available.length)];\n}\n\n// ── Helper: get position based on composition mode ──────────────────\n\nfunction getCompositionPosition(\n mode: CompositionMode,\n rng: () => number,\n width: number,\n height: number,\n shapeIndex: number,\n totalShapes: number,\n cx: number,\n cy: number,\n): { x: number; y: number } {\n switch (mode) {\n case \"radial\": {\n const angle = rng() * Math.PI * 2;\n const maxR = Math.min(width, height) * 0.45;\n const r = Math.pow(rng(), 0.7) * maxR;\n return { x: cx + Math.cos(angle) * r, y: cy + Math.sin(angle) * r };\n }\n case \"spiral\": {\n const t = shapeIndex / totalShapes;\n const turns = 3 + rng() * 2;\n const angle = t * Math.PI * 2 * turns;\n const maxR = Math.min(width, height) * 0.42;\n const r = t * maxR + (rng() - 0.5) * maxR * 0.15;\n return { x: cx + Math.cos(angle) * r, y: cy + Math.sin(angle) * r };\n }\n case \"grid-subdivision\": {\n const cells = 3 + Math.floor(rng() * 3);\n const cellW = width / cells;\n const cellH = height / cells;\n const gx = Math.floor(rng() * cells);\n const gy = Math.floor(rng() * cells);\n return {\n x: gx * cellW + rng() * cellW,\n y: gy * cellH + rng() * cellH,\n };\n }\n case \"clustered\": {\n const numClusters = 3 + Math.floor(rng() * 3);\n const ci = Math.floor(rng() * numClusters);\n const clusterRng = createRng(seedFromHash(String(ci), 999));\n const clx = width * (0.15 + clusterRng() * 0.7);\n const cly = height * (0.15 + clusterRng() * 0.7);\n const spread = Math.min(width, height) * 0.18;\n return {\n x: clx + (rng() - 0.5) * spread * 2,\n y: cly + (rng() - 0.5) * spread * 2,\n };\n }\n case \"flow-field\":\n default: {\n return { x: rng() * width, y: rng() * height };\n }\n }\n}\n\n// ── Helper: positional color blending ───────────────────────────────\n\nfunction getPositionalColor(\n x: number,\n y: number,\n width: number,\n height: number,\n colors: string[],\n rng: () => number,\n): string {\n const nx = x / width;\n const ny = y / height;\n const posIndex = (nx * 0.6 + ny * 0.4) * (colors.length - 1);\n const baseIdx = Math.floor(posIndex) % colors.length;\n return jitterColor(colors[baseIdx], rng, 0.08);\n}\n\n// ── Helper: check if a position is inside a void zone (Feature E) ───\n\nfunction isInVoidZone(\n x: number,\n y: number,\n voidZones: Array<{ x: number; y: number; radius: number }>,\n): boolean {\n for (const zone of voidZones) {\n if (Math.hypot(x - zone.x, y - zone.y) < zone.radius) return true;\n }\n return false;\n}\n\n// ── Helper: density check for negative space (Feature E) ────────────\n\nfunction localDensity(\n x: number,\n y: number,\n positions: Array<{ x: number; y: number; size: number }>,\n radius: number,\n): number {\n let count = 0;\n for (const p of positions) {\n if (Math.hypot(x - p.x, y - p.y) < radius) count++;\n }\n return count;\n}\n\n// ── Helper: draw background based on archetype style ────────────────\n\nfunction drawBackground(\n ctx: CanvasRenderingContext2D,\n style: BackgroundStyle,\n bgStart: string,\n bgEnd: string,\n width: number,\n height: number,\n cx: number,\n cy: number,\n bgRadius: number,\n rng: () => number,\n colors: string[],\n): void {\n switch (style) {\n case \"radial-light\": {\n const grad = ctx.createRadialGradient(cx, cy, 0, cx, cy, bgRadius);\n grad.addColorStop(0, \"#f0ece4\");\n grad.addColorStop(1, bgStart);\n ctx.fillStyle = grad;\n ctx.fillRect(0, 0, width, height);\n break;\n }\n case \"linear-horizontal\": {\n const grad = ctx.createLinearGradient(0, 0, width, 0);\n grad.addColorStop(0, bgStart);\n grad.addColorStop(1, bgEnd);\n ctx.fillStyle = grad;\n ctx.fillRect(0, 0, width, height);\n break;\n }\n case \"linear-diagonal\": {\n const grad = ctx.createLinearGradient(0, 0, width, height);\n grad.addColorStop(0, bgStart);\n grad.addColorStop(0.5, bgEnd);\n grad.addColorStop(1, bgStart);\n ctx.fillStyle = grad;\n ctx.fillRect(0, 0, width, height);\n break;\n }\n case \"solid-dark\": {\n ctx.fillStyle = bgStart;\n ctx.fillRect(0, 0, width, height);\n break;\n }\n case \"solid-light\": {\n ctx.fillStyle = \"#f5f2eb\";\n ctx.fillRect(0, 0, width, height);\n break;\n }\n case \"multi-stop\": {\n const grad = ctx.createLinearGradient(0, 0, width * 0.7, height);\n grad.addColorStop(0, bgStart);\n grad.addColorStop(0.33, bgEnd);\n if (colors.length > 0) {\n const midColor = hexWithAlpha(colors[0], 1).replace(/rgba\\((\\d+),(\\d+),(\\d+),[^)]+\\)/, (_, r, g, b) => {\n const darken = (v: string) => Math.round(parseInt(v) * 0.4).toString(16).padStart(2, \"0\");\n return `#${darken(r)}${darken(g)}${darken(b)}`;\n });\n grad.addColorStop(0.66, midColor);\n }\n grad.addColorStop(1, bgStart);\n ctx.fillStyle = grad;\n ctx.fillRect(0, 0, width, height);\n break;\n }\n case \"radial-dark\":\n default: {\n const grad = ctx.createRadialGradient(cx, cy, 0, cx, cy, bgRadius);\n grad.addColorStop(0, bgStart);\n grad.addColorStop(1, bgEnd);\n ctx.fillStyle = grad;\n ctx.fillRect(0, 0, width, height);\n break;\n }\n }\n}\n\n// ── Main render function ────────────────────────────────────────────\n\nexport function renderHashArt(\n ctx: CanvasRenderingContext2D,\n gitHash: string,\n config: Partial<GenerationConfig> = {},\n): void {\n const finalConfig: GenerationConfig = { ...DEFAULT_CONFIG, ...config };\n\n const rng = createRng(seedFromHash(gitHash));\n\n // ── 0. Select archetype — fundamentally different visual personality ──\n const archetype = selectArchetype(rng);\n\n // Archetype overrides defaults, but explicit user config wins\n const {\n width,\n height,\n } = finalConfig;\n const gridSize = config.gridSize ?? archetype.gridSize;\n const layers = config.layers ?? archetype.layers;\n const minShapeSize = config.minShapeSize ?? archetype.minShapeSize;\n const maxShapeSize = config.maxShapeSize ?? archetype.maxShapeSize;\n const baseOpacity = config.baseOpacity ?? archetype.baseOpacity;\n const opacityReduction = config.opacityReduction ?? archetype.opacityReduction;\n\n const shapesPerLayer =\n finalConfig.shapesPerLayer || Math.floor(gridSize * gridSize * 1.5);\n\n const colorScheme = new SacredColorScheme(gitHash);\n const colors = colorScheme.getColorsByMode(archetype.paletteMode);\n const [bgStart, bgEnd] = colorScheme.getBackgroundColorsByMode(archetype.paletteMode);\n const tempMode = colorScheme.getTemperatureMode();\n const fgTempTarget: \"warm\" | \"cool\" | null =\n tempMode === \"warm-bg\" ? \"cool\" : tempMode === \"cool-bg\" ? \"warm\" : null;\n\n const shapeNames = Object.keys(shapes);\n const scaleFactor = Math.min(width, height) / 1024;\n const adjustedMinSize = minShapeSize * scaleFactor;\n const adjustedMaxSize = maxShapeSize * scaleFactor;\n\n const cx = width / 2;\n const cy = height / 2;\n\n // ── 1. Background ──────────────────────────────────────────────\n const bgRadius = Math.hypot(cx, cy);\n drawBackground(ctx, archetype.backgroundStyle, bgStart, bgEnd, width, height, cx, cy, bgRadius, rng, colors);\n\n // Compute average background luminance for contrast enforcement\n const bgLum = (luminance(bgStart) + luminance(bgEnd)) / 2;\n\n // ── 1b. Layered background (Feature G) ─────────────────────────\n // Draw large, very faint shapes to give the background texture\n const bgShapeCount = 3 + Math.floor(rng() * 4);\n ctx.globalCompositeOperation = \"soft-light\";\n for (let i = 0; i < bgShapeCount; i++) {\n const bx = rng() * width;\n const by = rng() * height;\n const bSize = (width * 0.3 + rng() * width * 0.5);\n const bColor = colors[Math.floor(rng() * colors.length)];\n ctx.globalAlpha = 0.03 + rng() * 0.05;\n ctx.fillStyle = hexWithAlpha(bColor, 0.15);\n ctx.beginPath();\n ctx.arc(bx, by, bSize / 2, 0, Math.PI * 2);\n ctx.fill();\n }\n // Subtle concentric rings from center\n const ringCount = 2 + Math.floor(rng() * 3);\n ctx.globalAlpha = 0.02 + rng() * 0.03;\n ctx.strokeStyle = hexWithAlpha(colors[0], 0.1);\n ctx.lineWidth = 1 * scaleFactor;\n for (let i = 1; i <= ringCount; i++) {\n const r = (Math.min(width, height) * 0.15) * i;\n ctx.beginPath();\n ctx.arc(cx, cy, r, 0, Math.PI * 2);\n ctx.stroke();\n }\n ctx.globalCompositeOperation = \"source-over\";\n\n // ── 2. Composition mode ────────────────────────────────────────\n const compositionMode =\n COMPOSITION_MODES[Math.floor(rng() * COMPOSITION_MODES.length)];\n\n // ── 2b. Symmetry mode — ~25% of hashes trigger mirroring ──────\n type SymmetryMode = \"none\" | \"bilateral-x\" | \"bilateral-y\" | \"quad\";\n const symRoll = rng();\n const symmetryMode: SymmetryMode =\n symRoll < 0.10 ? \"bilateral-x\" :\n symRoll < 0.20 ? \"bilateral-y\" :\n symRoll < 0.25 ? \"quad\" : \"none\";\n\n // ── 3. Focal points + void zones ───────────────────────────────\n // Rule-of-thirds intersection points for intentional composition\n const THIRDS_POINTS = [\n { x: 1 / 3, y: 1 / 3 },\n { x: 2 / 3, y: 1 / 3 },\n { x: 1 / 3, y: 2 / 3 },\n { x: 2 / 3, y: 2 / 3 },\n ];\n const numFocal = 1 + Math.floor(rng() * 2);\n const focalPoints: Array<{ x: number; y: number; strength: number }> = [];\n for (let f = 0; f < numFocal; f++) {\n // 70% chance to snap to a rule-of-thirds point, 30% free placement\n if (rng() < 0.7) {\n const tp = THIRDS_POINTS[Math.floor(rng() * THIRDS_POINTS.length)];\n // Small jitter around the thirds point so it's not robotic\n focalPoints.push({\n x: width * (tp.x + (rng() - 0.5) * 0.08),\n y: height * (tp.y + (rng() - 0.5) * 0.08),\n strength: 0.3 + rng() * 0.4,\n });\n } else {\n focalPoints.push({\n x: width * (0.2 + rng() * 0.6),\n y: height * (0.2 + rng() * 0.6),\n strength: 0.3 + rng() * 0.4,\n });\n }\n }\n\n // Feature E: 1-2 void zones where shapes are sparse (negative space)\n const numVoids = Math.floor(rng() * 2) + 1;\n const voidZones: Array<{ x: number; y: number; radius: number }> = [];\n for (let v = 0; v < numVoids; v++) {\n voidZones.push({\n x: width * (0.15 + rng() * 0.7),\n y: height * (0.15 + rng() * 0.7),\n radius: Math.min(width, height) * (0.06 + rng() * 0.1),\n });\n }\n\n function applyFocalBias(rx: number, ry: number): [number, number] {\n let nearest = focalPoints[0];\n let minDist = Infinity;\n for (const fp of focalPoints) {\n const d = Math.hypot(rx - fp.x, ry - fp.y);\n if (d < minDist) {\n minDist = d;\n nearest = fp;\n }\n }\n const pull = nearest.strength * rng() * 0.5;\n return [rx + (nearest.x - rx) * pull, ry + (nearest.y - ry) * pull];\n }\n\n // ── 4. Flow field seed values ──────────────────────────────────\n const fieldAngleBase = rng() * Math.PI * 2;\n const fieldFreq = 0.5 + rng() * 2;\n\n function flowAngle(x: number, y: number): number {\n return (\n fieldAngleBase +\n Math.sin((x / width) * fieldFreq * Math.PI * 2) * Math.PI * 0.5 +\n Math.cos((y / height) * fieldFreq * Math.PI * 2) * Math.PI * 0.5\n );\n }\n\n // Track all placed shapes for density checks and connecting curves\n const shapePositions: Array<{ x: number; y: number; size: number }> = [];\n\n // ── 4b. Hero shape — a dominant focal element ───────────────────\n if (archetype.heroShape && rng() < 0.6) {\n const heroFocal = focalPoints[0];\n const heroPool = [...SACRED_SHAPES, \"fibonacciSpiral\", \"merkaba\", \"fractal\"];\n const heroShape =\n heroPool.filter((s) => shapeNames.includes(s))[\n Math.floor(rng() * heroPool.filter((s) => shapeNames.includes(s)).length)\n ] || shapeNames[Math.floor(rng() * shapeNames.length)];\n\n const heroSize = adjustedMaxSize * (0.8 + rng() * 0.5);\n const heroRotation = rng() * 360;\n const heroFill = hexWithAlpha(\n enforceContrast(jitterColor(colors[Math.floor(rng() * colors.length)], rng, 0.05), bgLum),\n 0.15 + rng() * 0.2,\n );\n const heroStroke = enforceContrast(jitterColor(colors[Math.floor(rng() * colors.length)], rng, 0.05), bgLum);\n\n ctx.globalAlpha = 0.5 + rng() * 0.2;\n enhanceShapeGeneration(ctx, heroShape, heroFocal.x, heroFocal.y, {\n fillColor: heroFill,\n strokeColor: heroStroke,\n strokeWidth: (1.5 + rng() * 2) * scaleFactor,\n size: heroSize,\n rotation: heroRotation,\n proportionType: \"GOLDEN_RATIO\",\n glowRadius: (12 + rng() * 20) * scaleFactor,\n glowColor: hexWithAlpha(heroStroke, 0.4),\n gradientFillEnd: jitterColor(colors[Math.floor(rng() * colors.length)], rng, 0.1),\n renderStyle: rng() < 0.4 ? \"watercolor\" : \"fill-and-stroke\",\n rng,\n });\n\n shapePositions.push({ x: heroFocal.x, y: heroFocal.y, size: heroSize });\n }\n\n // ── 5. Shape layers ────────────────────────────────────────────\n const densityCheckRadius = Math.min(width, height) * 0.08;\n const maxLocalDensity = Math.ceil(shapesPerLayer * 0.15);\n\n for (let layer = 0; layer < layers; layer++) {\n const layerRatio = layers > 1 ? layer / (layers - 1) : 0;\n const numShapes =\n shapesPerLayer +\n Math.floor(rng() * shapesPerLayer * 0.3);\n const layerOpacity = Math.max(0.15, baseOpacity - layer * opacityReduction);\n const layerSizeScale = 1 - layer * 0.15;\n\n // Feature B: per-layer blend mode\n const layerBlend = pickBlendMode(rng);\n ctx.globalCompositeOperation = layerBlend;\n\n // Feature C: per-layer render style bias — prefer archetype styles\n const layerRenderStyle: RenderStyle = rng() < 0.6\n ? archetype.preferredStyles[Math.floor(rng() * archetype.preferredStyles.length)]\n : pickRenderStyle(rng);\n\n // Feature D: atmospheric desaturation for later layers\n const atmosphericDesat = layerRatio * 0.3; // 0 for first layer, up to 0.3 for last\n\n for (let i = 0; i < numShapes; i++) {\n // Position from composition mode, then focal bias\n const rawPos = getCompositionPosition(\n compositionMode,\n rng,\n width,\n height,\n i,\n numShapes,\n cx,\n cy,\n );\n const [x, y] = applyFocalBias(rawPos.x, rawPos.y);\n\n // Feature E: skip shapes in void zones, reduce in dense areas\n if (isInVoidZone(x, y, voidZones)) {\n // 85% chance to skip — allows a few shapes to bleed in\n if (rng() < 0.85) continue;\n }\n if (localDensity(x, y, shapePositions, densityCheckRadius) > maxLocalDensity) {\n if (rng() < 0.6) continue; // thin out dense areas\n }\n\n // Weighted shape selection\n const shape = pickShape(rng, layerRatio, shapeNames);\n\n // Power distribution for size — archetype controls the curve\n const sizeT = Math.pow(rng(), archetype.sizePower);\n const size =\n (adjustedMinSize + sizeT * (adjustedMaxSize - adjustedMinSize)) *\n layerSizeScale;\n\n // Flow-field rotation in flow-field mode, random otherwise\n const rotation =\n compositionMode === \"flow-field\"\n ? (flowAngle(x, y) * 180) / Math.PI + (rng() - 0.5) * 30\n : rng() * 360;\n\n // Positional color blending + jitter\n let fillBase = getPositionalColor(x, y, width, height, colors, rng);\n const strokeBase = colors[Math.floor(rng() * colors.length)];\n\n // Feature D: desaturate colors on later layers for depth\n if (atmosphericDesat > 0) {\n fillBase = desaturate(fillBase, atmosphericDesat);\n }\n\n // Temperature contrast: shift foreground shapes opposite to background\n if (fgTempTarget) {\n fillBase = shiftTemperature(fillBase, fgTempTarget, 0.15 + layerRatio * 0.1);\n }\n\n const fillColor = enforceContrast(jitterColor(fillBase, rng, 0.06), bgLum);\n const strokeColor = enforceContrast(jitterColor(strokeBase, rng, 0.05), bgLum);\n\n // Semi-transparent fill\n const fillAlpha = 0.2 + rng() * 0.5;\n const transparentFill = hexWithAlpha(fillColor, fillAlpha);\n\n const strokeWidth = (0.5 + rng() * 2.0) * scaleFactor;\n\n ctx.globalAlpha = layerOpacity * (0.5 + rng() * 0.5);\n\n // Glow on sacred shapes more often — scaled by archetype\n const isSacred = SACRED_SHAPES.includes(shape);\n const baseGlowChance = isSacred ? 0.45 : 0.2;\n const glowChance = baseGlowChance * archetype.glowMultiplier;\n const hasGlow = rng() < glowChance;\n const glowRadius = hasGlow ? (8 + rng() * 20) * scaleFactor : 0;\n\n // Gradient fill on ~30%\n const hasGradient = rng() < 0.3;\n const gradientEnd = hasGradient\n ? jitterColor(colors[Math.floor(rng() * colors.length)], rng, 0.1)\n : undefined;\n\n // Feature C: per-shape render style (70% use layer style, 30% pick their own)\n const shapeRenderStyle =\n rng() < 0.7 ? layerRenderStyle : pickRenderStyle(rng);\n\n // Feature F: organic edge jitter — applied via watercolor style on ~15% of shapes\n const useOrganicEdges = rng() < 0.15 && shapeRenderStyle === \"fill-and-stroke\";\n const finalRenderStyle = useOrganicEdges ? \"watercolor\" : shapeRenderStyle;\n\n enhanceShapeGeneration(ctx, shape, x, y, {\n fillColor: transparentFill,\n strokeColor,\n strokeWidth,\n size,\n rotation,\n proportionType: \"GOLDEN_RATIO\",\n glowRadius,\n glowColor: hasGlow ? hexWithAlpha(fillColor, 0.6) : undefined,\n gradientFillEnd: gradientEnd,\n renderStyle: finalRenderStyle,\n rng,\n });\n\n shapePositions.push({ x, y, size });\n\n // ── 5b. Recursive nesting ──────────────────────────────────\n if (size > adjustedMaxSize * 0.4 && rng() < 0.15) {\n const innerCount = 1 + Math.floor(rng() * 3);\n for (let n = 0; n < innerCount; n++) {\n const innerShape = pickShape(\n rng,\n Math.min(1, layerRatio + 0.3),\n shapeNames,\n );\n const innerSize = size * (0.15 + rng() * 0.25);\n const innerOffX = (rng() - 0.5) * size * 0.4;\n const innerOffY = (rng() - 0.5) * size * 0.4;\n const innerRot = rng() * 360;\n const innerFill = hexWithAlpha(\n jitterColor(colors[Math.floor(rng() * colors.length)], rng, 0.1),\n 0.3 + rng() * 0.4,\n );\n\n ctx.globalAlpha = layerOpacity * 0.7;\n enhanceShapeGeneration(\n ctx,\n innerShape,\n x + innerOffX,\n y + innerOffY,\n {\n fillColor: innerFill,\n strokeColor: hexWithAlpha(strokeColor, 0.5),\n strokeWidth: strokeWidth * 0.6,\n size: innerSize,\n rotation: innerRot,\n proportionType: \"GOLDEN_RATIO\",\n renderStyle: shapeRenderStyle,\n rng,\n },\n );\n }\n }\n }\n }\n\n // Reset blend mode for post-processing passes\n ctx.globalCompositeOperation = \"source-over\";\n\n // ── 6. Flow-line pass (Feature H: tapered brush strokes) ───────\n const baseFlowLines = 6 + Math.floor(rng() * 10);\n const numFlowLines = Math.round(baseFlowLines * archetype.flowLineMultiplier);\n for (let i = 0; i < numFlowLines; i++) {\n let fx = rng() * width;\n let fy = rng() * height;\n const steps = 30 + Math.floor(rng() * 40);\n const stepLen = (3 + rng() * 5) * scaleFactor;\n const startWidth = (1 + rng() * 3) * scaleFactor;\n\n const lineColor = hexWithAlpha(\n enforceContrast(colors[Math.floor(rng() * colors.length)], bgLum),\n 0.4,\n );\n const lineAlpha = 0.06 + rng() * 0.1;\n\n // Draw as individual segments with tapering width\n let prevX = fx;\n let prevY = fy;\n for (let s = 0; s < steps; s++) {\n const angle = flowAngle(fx, fy) + (rng() - 0.5) * 0.3;\n fx += Math.cos(angle) * stepLen;\n fy += Math.sin(angle) * stepLen;\n\n if (fx < 0 || fx > width || fy < 0 || fy > height) break;\n\n // Taper: thick at start, thin at end\n const taper = 1 - (s / steps) * 0.8;\n ctx.globalAlpha = lineAlpha * taper;\n ctx.strokeStyle = lineColor;\n ctx.lineWidth = startWidth * taper;\n ctx.lineCap = \"round\";\n\n ctx.beginPath();\n ctx.moveTo(prevX, prevY);\n ctx.lineTo(fx, fy);\n ctx.stroke();\n\n prevX = fx;\n prevY = fy;\n }\n }\n\n // ── 6b. Apply symmetry mirroring ─────────────────────────────────\n // Mirror the rendered content (shapes + flow lines) before post-processing.\n // Uses ctx.canvas which is available in both Node (@napi-rs/canvas) and browsers.\n if (symmetryMode !== \"none\") {\n const canvas = ctx.canvas;\n ctx.save();\n if (symmetryMode === \"bilateral-x\" || symmetryMode === \"quad\") {\n // Mirror left half onto right half\n ctx.save();\n ctx.translate(width, 0);\n ctx.scale(-1, 1);\n // Draw the left half (0 to cx) onto the mirrored right side\n ctx.drawImage(canvas, 0, 0, Math.ceil(cx), height, 0, 0, Math.ceil(cx), height);\n ctx.restore();\n }\n if (symmetryMode === \"bilateral-y\" || symmetryMode === \"quad\") {\n // Mirror top half onto bottom half\n ctx.save();\n ctx.translate(0, height);\n ctx.scale(1, -1);\n ctx.drawImage(canvas, 0, 0, width, Math.ceil(cy), 0, 0, width, Math.ceil(cy));\n ctx.restore();\n }\n ctx.restore();\n }\n\n // ── 7. Noise texture overlay ───────────────────────────────────\n const noiseRng = createRng(seedFromHash(gitHash, 777));\n const noiseDensity = Math.floor((width * height) / 800);\n for (let i = 0; i < noiseDensity; i++) {\n const nx = noiseRng() * width;\n const ny = noiseRng() * height;\n const brightness = noiseRng() > 0.5 ? 255 : 0;\n const alpha = 0.01 + noiseRng() * 0.03;\n ctx.globalAlpha = alpha;\n ctx.fillStyle = `rgba(${brightness},${brightness},${brightness},1)`;\n ctx.fillRect(nx, ny, 1 * scaleFactor, 1 * scaleFactor);\n }\n\n // ── 8. Vignette — darken edges to draw the eye inward ───────────\n ctx.globalAlpha = 1;\n const vignetteStrength = 0.25 + rng() * 0.2; // 25-45% edge darkening\n const vigGrad = ctx.createRadialGradient(cx, cy, Math.min(width, height) * 0.3, cx, cy, bgRadius);\n vigGrad.addColorStop(0, \"rgba(0,0,0,0)\");\n vigGrad.addColorStop(0.6, \"rgba(0,0,0,0)\");\n vigGrad.addColorStop(1, `rgba(0,0,0,${vignetteStrength.toFixed(3)})`);\n ctx.fillStyle = vigGrad;\n ctx.fillRect(0, 0, width, height);\n\n // ── 9. Organic connecting curves ───────────────────────────────\n if (shapePositions.length > 1) {\n const numCurves = Math.floor((8 * (width * height)) / (1024 * 1024));\n ctx.lineWidth = 0.8 * scaleFactor;\n\n for (let i = 0; i < numCurves; i++) {\n const idxA = Math.floor(rng() * shapePositions.length);\n const offset =\n 1 + Math.floor(rng() * Math.min(5, shapePositions.length - 1));\n const idxB = (idxA + offset) % shapePositions.length;\n\n const a = shapePositions[idxA];\n const b = shapePositions[idxB];\n\n const mx = (a.x + b.x) / 2;\n const my = (a.y + b.y) / 2;\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const dist = Math.hypot(dx, dy);\n const bulge = (rng() - 0.5) * dist * 0.4;\n\n const cpx = mx + (-dy / (dist || 1)) * bulge;\n const cpy = my + (dx / (dist || 1)) * bulge;\n\n ctx.globalAlpha = 0.06 + rng() * 0.1;\n ctx.strokeStyle = hexWithAlpha(\n enforceContrast(colors[Math.floor(rng() * colors.length)], bgLum),\n 0.3,\n );\n\n ctx.beginPath();\n ctx.moveTo(a.x, a.y);\n ctx.quadraticCurveTo(cpx, cpy, b.x, b.y);\n ctx.stroke();\n }\n }\n\n ctx.globalAlpha = 1;\n}\n","import ColorScheme from \"color-scheme\";\nimport \"../../../global.d\";\n\nimport { gitHashToSeed, createRng, seedFromHash } from \"../utils\";\n\n// ── Color variation modes ───────────────────────────────────────────\n// The hash deterministically selects a variation, producing dramatically\n// different palettes from the same hue.\n\nconst COLOR_VARIATIONS = [\n \"soft\",\n \"hard\",\n \"pastel\",\n \"light\",\n \"pale\",\n \"default\",\n] as const;\ntype ColorVariation = (typeof COLOR_VARIATIONS)[number];\n\n/**\n * Pick a color variation mode deterministically from a seed.\n */\nfunction pickVariation(seed: number): ColorVariation {\n return COLOR_VARIATIONS[Math.abs(seed) % COLOR_VARIATIONS.length];\n}\n\n/**\n * Scheme type also varies — some hashes get near-monochromatic palettes,\n * others get high-contrast complementary schemes.\n */\nconst SCHEME_TYPES = [\n \"analogic\",\n \"mono\",\n \"contrast\",\n \"triade\",\n \"tetrade\",\n] as const;\ntype SchemeType = (typeof SCHEME_TYPES)[number];\n\nfunction pickSchemeType(seed: number): SchemeType {\n return SCHEME_TYPES[Math.abs(seed >> 4) % SCHEME_TYPES.length];\n}\n\n\n// ── Temperature contrast ─────────────────────────────────────────\n// Warm hues: 0-60 (red-yellow) and 300-360 (magenta-red)\n// Cool hues: 150-270 (cyan-blue-purple)\n// Neutral: everything else\n\ntype TemperatureMode = \"warm-bg\" | \"cool-bg\" | \"neutral\";\n\nfunction classifyHue(hue: number): \"warm\" | \"cool\" | \"neutral\" {\n if ((hue >= 0 && hue <= 60) || hue >= 300) return \"warm\";\n if (hue >= 150 && hue <= 270) return \"cool\";\n return \"neutral\";\n}\n\n/**\n * Shift a hue toward a target temperature zone.\n * Returns a new hue biased warm or cool.\n */\nfunction shiftHueToward(hue: number, target: \"warm\" | \"cool\", amount: number): number {\n if (target === \"warm\") {\n // Pull toward 30 (orange) — the warmest point\n const warmTarget = 30;\n const diff = ((warmTarget - hue + 540) % 360) - 180;\n return (hue + diff * amount + 360) % 360;\n } else {\n // Pull toward 210 (blue) — the coolest point\n const coolTarget = 210;\n const diff = ((coolTarget - hue + 540) % 360) - 180;\n return (hue + diff * amount + 360) % 360;\n }\n}\n\n// Enhanced color scheme generation for sacred geometry\nexport class SacredColorScheme {\n private seed: number;\n private rng: () => number;\n private variation: ColorVariation;\n private schemeType: SchemeType;\n private temperatureMode: TemperatureMode;\n public baseScheme: string[];\n private complementaryScheme: string[];\n private triadicScheme: string[];\n\n constructor(gitHash: string) {\n this.seed = gitHashToSeed(gitHash);\n this.rng = createRng(seedFromHash(gitHash, 42));\n // Hash-driven variation and scheme type for palette diversity\n this.variation = pickVariation(this.seed);\n this.schemeType = pickSchemeType(this.seed);\n // ~40% warm-bg, ~40% cool-bg, ~20% neutral (no temperature bias)\n const tempRoll = this.rng();\n this.temperatureMode = tempRoll < 0.4 ? \"warm-bg\" : tempRoll < 0.8 ? \"cool-bg\" : \"neutral\";\n this.baseScheme = this.generateBaseScheme();\n this.complementaryScheme = this.generateComplementaryScheme();\n this.triadicScheme = this.generateTriadicScheme();\n }\n\n private generateBaseScheme(): string[] {\n const scheme = new ColorScheme();\n return scheme\n .from_hue(this.seed % 360)\n .scheme(this.schemeType)\n .variation(this.variation)\n .colors()\n .map((hex: string) => `#${hex}`);\n }\n\n private generateComplementaryScheme(): string[] {\n const complementaryHue = (this.seed + 180) % 360;\n // Complementary uses a contrasting variation for tension\n const compVariation =\n this.variation === \"soft\" ? \"hard\" : this.variation === \"pale\" ? \"light\" : this.variation;\n const scheme = new ColorScheme();\n return scheme\n .from_hue(complementaryHue)\n .scheme(\"mono\")\n .variation(compVariation)\n .colors()\n .map((hex: string) => `#${hex}`);\n }\n\n private generateTriadicScheme(): string[] {\n const triadicHue = (this.seed + 120) % 360;\n const scheme = new ColorScheme();\n return scheme\n .from_hue(triadicHue)\n .scheme(\"triade\")\n .variation(this.variation)\n .colors()\n .map((hex: string) => `#${hex}`);\n }\n\n /**\n * Returns a flat array of hash-derived colors suitable for art generation.\n * Combines base analogic, complementary, and triadic schemes for variety\n * while maintaining color harmony.\n */\n getColors(): string[] {\n // Deduplicate and return a rich palette\n const all = [\n ...this.baseScheme.slice(0, 4),\n ...this.complementaryScheme.slice(0, 2),\n ...this.triadicScheme.slice(0, 2),\n ];\n return [...new Set(all)];\n }\n\n /**\n * Returns a palette shaped by the given palette mode.\n * Falls back to getColors() for \"harmonious\".\n */\n getColorsByMode(mode: string): string[] {\n const baseHue = this.seed % 360;\n switch (mode) {\n case \"monochrome\": {\n // Single hue, 5 lightness steps\n const s = 0.5 + this.rng() * 0.3;\n return [0.15, 0.3, 0.45, 0.6, 0.75].map((l) =>\n hslToHex(baseHue, s, l),\n );\n }\n case \"duotone\": {\n // Two contrasting colors + tints\n const hue2 = (baseHue + 150 + this.rng() * 60) % 360;\n return [\n hslToHex(baseHue, 0.7, 0.5),\n hslToHex(baseHue, 0.6, 0.7),\n hslToHex(hue2, 0.7, 0.5),\n hslToHex(hue2, 0.6, 0.7),\n ];\n }\n case \"neon\": {\n // High saturation, vivid colors\n const hues = [baseHue, (baseHue + 90) % 360, (baseHue + 180) % 360, (baseHue + 270) % 360];\n return hues.map((h) => hslToHex(h, 1.0, 0.55 + this.rng() * 0.1));\n }\n case \"pastel-light\": {\n // Soft pastels\n const hues = [baseHue, (baseHue + 60) % 360, (baseHue + 120) % 360, (baseHue + 200) % 360];\n return hues.map((h) => hslToHex(h, 0.4 + this.rng() * 0.2, 0.75 + this.rng() * 0.1));\n }\n case \"earth\": {\n // Warm muted naturals: browns, olives, terracotta, sage\n const earthHues = [25, 35, 45, 80, 150]; // orange-brown to olive to sage\n return earthHues.map((h) =>\n hslToHex(h + this.rng() * 15, 0.25 + this.rng() * 0.2, 0.35 + this.rng() * 0.2),\n );\n }\n case \"high-contrast\": {\n // Black, white, and one accent color\n const accent = hslToHex(baseHue, 0.9, 0.5);\n return [\"#111111\", \"#eeeeee\", accent, hslToHex(baseHue, 0.7, 0.35)];\n }\n case \"harmonious\":\n default:\n return this.getColors();\n }\n }\n\n /**\n * Returns background colors appropriate for the given palette mode.\n */\n getBackgroundColorsByMode(mode: string): [string, string] {\n switch (mode) {\n case \"pastel-light\":\n return [hslToHex(this.seed % 360, 0.15, 0.92), hslToHex((this.seed + 30) % 360, 0.1, 0.88)];\n case \"high-contrast\":\n case \"monochrome-ink\":\n return [\"#f5f5f0\", \"#e8e8e0\"];\n case \"neon\":\n return [\"#0a0a12\", \"#050510\"];\n case \"earth\":\n return [this.darken(hslToHex(35, 0.3, 0.25), 0.8), this.darken(hslToHex(25, 0.25, 0.2), 0.7)];\n default:\n return this.getBackgroundColors();\n }\n }\n\n /**\n * Returns two background colors derived from the hash — darker variants\n * of the base scheme, temperature-shifted for warm/cool contrast.\n */\n getBackgroundColors(): [string, string] {\n let bg0 = this.baseScheme[0];\n let bg1 = this.baseScheme[1];\n\n if (this.temperatureMode !== \"neutral\") {\n const bgTemp = this.temperatureMode === \"warm-bg\" ? \"warm\" : \"cool\";\n bg0 = this.shiftColorTemperature(bg0, bgTemp, 0.3);\n bg1 = this.shiftColorTemperature(bg1, bgTemp, 0.25);\n }\n\n return [this.darken(bg0, 0.65), this.darken(bg1, 0.55)];\n }\n\n /**\n * Returns the temperature mode so the renderer can apply\n * contrasting temperature to foreground elements.\n */\n getTemperatureMode(): TemperatureMode {\n return this.temperatureMode;\n }\n\n /**\n * Shift a hex color's hue toward warm or cool.\n */\n private shiftColorTemperature(hex: string, target: \"warm\" | \"cool\", amount: number): string {\n const [h, s, l] = hexToHsl(hex);\n const shifted = shiftHueToward(h, target, amount);\n return hslToHex(shifted, s, l);\n }\n\n /**\n * Simple hex color darkening by a factor (0 = black, 1 = unchanged).\n */\n private darken(hex: string, factor: number): string {\n const c = hex.replace(\"#\", \"\");\n const r = Math.round(parseInt(c.substring(0, 2), 16) * factor);\n const g = Math.round(parseInt(c.substring(2, 4), 16) * factor);\n const b = Math.round(parseInt(c.substring(4, 6), 16) * factor);\n return `#${r.toString(16).padStart(2, \"0\")}${g.toString(16).padStart(2, \"0\")}${b.toString(16).padStart(2, \"0\")}`;\n }\n}\n\n// ── Standalone color utilities ──────────────────────────────────────\n\n/** Parse a hex color (#RRGGBB) into [r, g, b] 0-255. */\nfunction hexToRgb(hex: string): [number, number, number] {\n const c = hex.replace(\"#\", \"\");\n return [\n parseInt(c.substring(0, 2), 16),\n parseInt(c.substring(2, 4), 16),\n parseInt(c.substring(4, 6), 16),\n ];\n}\n\n/** Format [r, g, b] back to #RRGGBB. */\nfunction rgbToHex(r: number, g: number, b: number): string {\n const clamp = (v: number) => Math.max(0, Math.min(255, Math.round(v)));\n return `#${clamp(r).toString(16).padStart(2, \"0\")}${clamp(g).toString(16).padStart(2, \"0\")}${clamp(b).toString(16).padStart(2, \"0\")}`;\n}\n\n/** Convert hex to HSL [h 0-360, s 0-1, l 0-1]. */\nfunction hexToHsl(hex: string): [number, number, number] {\n const [r, g, b] = hexToRgb(hex).map((v) => v / 255);\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n if (max === min) return [0, 0, l];\n const d = max - min;\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n let h = 0;\n if (max === r) h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n else if (max === g) h = ((b - r) / d + 2) / 6;\n else h = ((r - g) / d + 4) / 6;\n return [h * 360, s, l];\n}\n\n/** Convert HSL [h 0-360, s 0-1, l 0-1] back to hex. */\nfunction hslToHex(h: number, s: number, l: number): string {\n h = ((h % 360) + 360) % 360;\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = l - c / 2;\n let r = 0, g = 0, b = 0;\n if (h < 60) { r = c; g = x; }\n else if (h < 120) { r = x; g = c; }\n else if (h < 180) { g = c; b = x; }\n else if (h < 240) { g = x; b = c; }\n else if (h < 300) { r = x; b = c; }\n else { r = c; b = x; }\n return rgbToHex((r + m) * 255, (g + m) * 255, (b + m) * 255);\n}\n\n/**\n * Return a hex color with an alpha component as an rgba() CSS string.\n * `alpha` is 0-1.\n */\nexport function hexWithAlpha(hex: string, alpha: number): string {\n const [r, g, b] = hexToRgb(hex);\n return `rgba(${r},${g},${b},${alpha.toFixed(3)})`;\n}\n\n/**\n * Apply slight hue/saturation/lightness jitter to a hex color.\n * `rng` should return a float in [0,1). `amount` controls intensity (0-1, default 0.1).\n */\nexport function jitterColor(\n hex: string,\n rng: () => number,\n amount = 0.1,\n): string {\n const [r, g, b] = hexToRgb(hex);\n const jit = () => (rng() - 0.5) * 2 * amount * 255;\n return rgbToHex(r + jit(), g + jit(), b + jit());\n}\n\n/**\n * Desaturate a hex color by blending toward its luminance gray.\n * `amount` 0 = unchanged, 1 = fully gray.\n */\nexport function desaturate(hex: string, amount: number): string {\n const [r, g, b] = hexToRgb(hex);\n const gray = 0.299 * r + 0.587 * g + 0.114 * b;\n const mix = (c: number) => c + (gray - c) * amount;\n return rgbToHex(mix(r), mix(g), mix(b));\n}\n\n/**\n * Shift a hex color's hue toward warm (orange) or cool (blue).\n * `amount` 0 = unchanged, 1 = fully shifted.\n */\nexport function shiftTemperature(hex: string, target: \"warm\" | \"cool\", amount: number): string {\n const [h, s, l] = hexToHsl(hex);\n return hslToHex(shiftHueToward(h, target, amount), s, l);\n}\n\n/**\n * Compute relative luminance of a hex color (0 = black, 1 = white).\n * Uses the sRGB luminance formula from WCAG.\n */\nexport function luminance(hex: string): number {\n const [r, g, b] = hexToRgb(hex).map((c) => {\n const s = c / 255;\n return s <= 0.03928 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);\n });\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n}\n\n/**\n * Enforce minimum contrast between a foreground color and a background\n * luminance. On light backgrounds, darkens/saturates the foreground.\n * On dark backgrounds, lightens/saturates the foreground.\n *\n * `bgLuminance` is 0-1 (pre-computed from the background color).\n * `minContrast` is the minimum luminance difference to enforce (default 0.15).\n */\nexport function enforceContrast(\n fgHex: string,\n bgLuminance: number,\n minContrast = 0.15,\n): string {\n const fgLum = luminance(fgHex);\n const diff = Math.abs(fgLum - bgLuminance);\n\n if (diff >= minContrast) return fgHex;\n\n const [h, s, l] = hexToHsl(fgHex);\n\n if (bgLuminance > 0.5) {\n // Light background — darken and boost saturation\n const targetL = Math.max(0.08, l - (minContrast - diff) * 1.5);\n const targetS = Math.min(1, s + 0.2);\n return hslToHex(h, targetS, targetL);\n } else {\n // Dark background — lighten and boost saturation\n const targetL = Math.min(0.92, l + (minContrast - diff) * 1.5);\n const targetS = Math.min(1, s + 0.15);\n return hslToHex(h, targetS, targetL);\n }\n}\n","declare module 'color-scheme' {\n class ColorScheme {\n from_hue(hue: number): this;\n scheme(name: string): this;\n variation(name: string): this;\n colors(): string[];\n }\n\n export = ColorScheme;\n}\n\n// declare module 'color-scheme';\n","export function gitHashToSeed(gitHash: string): number {\n return parseInt(gitHash.slice(0, 8), 16);\n}\n\n/**\n * Mulberry32 — a fast, high-quality 32-bit seeded PRNG.\n * Returns a function that produces deterministic floats in [0, 1).\n */\nexport function createRng(seed: number): () => number {\n let s = seed | 0;\n return () => {\n s = (s + 0x6d2b79f5) | 0;\n let t = Math.imul(s ^ (s >>> 15), 1 | s);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\n/**\n * Derive a deterministic seed from a hash string and an extra index\n * so each call-site gets its own independent stream.\n */\nexport function seedFromHash(hash: string, offset = 0): number {\n let h = 0;\n for (let i = 0; i < hash.length; i++) {\n h = (Math.imul(31, h) + hash.charCodeAt(i)) | 0;\n }\n return (h + offset) | 0;\n}\n\n/**\n * Legacy helper kept for backward compat — now backed by mulberry32.\n * Prefer createRng() + rng() for new code.\n */\nexport function getRandomFromHash(\n hash: string,\n index: number,\n min: number,\n max: number,\n): number {\n const rng = createRng(seedFromHash(hash, index));\n return min + rng() * (max - min);\n}\n\n// Golden ratio and other important proportions\nexport const Proportions = {\n GOLDEN_RATIO: 1.618034,\n SQUARE_ROOT_2: Math.sqrt(2),\n SQUARE_ROOT_3: Math.sqrt(3),\n SQUARE_ROOT_5: Math.sqrt(5),\n PI: Math.PI,\n PHI: (1 + Math.sqrt(5)) / 2,\n};\n\nexport type ProportionType = keyof typeof Proportions;\n\ninterface Pattern {\n type: string;\n config: any;\n}\n\ninterface LayerConfig {\n baseSize: number;\n baseOpacity?: number;\n opacityReduction?: number;\n rotationOffset?: number;\n proportionType?: ProportionType;\n}\n\n// Pattern combination utilities\nexport class PatternCombiner {\n static getProportionalSize(baseSize: number, proportion: number): number {\n return baseSize * proportion;\n }\n\n static centerPattern(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n ): void {\n ctx.translate(width / 2, height / 2);\n }\n\n // Combines sacred geometry patterns with proper proportions\n static layerPatterns(\n ctx: CanvasRenderingContext2D,\n patterns: Pattern[],\n config: LayerConfig,\n ): void {\n const {\n baseSize,\n baseOpacity = 0.6,\n opacityReduction = 0.1,\n rotationOffset = 0,\n proportionType = \"GOLDEN_RATIO\",\n } = config;\n\n patterns.forEach((pattern, index) => {\n const size = this.getProportionalSize(\n baseSize,\n Math.pow(Proportions[proportionType], index),\n );\n const opacity = Math.max(0.1, baseOpacity - index * opacityReduction);\n const rotation = rotationOffset * index;\n\n ctx.save();\n ctx.globalAlpha = opacity;\n ctx.rotate((rotation * Math.PI) / 180);\n\n shapes[pattern.type](ctx, size, pattern.config);\n ctx.restore();\n });\n }\n}\n","import { PatternCombiner, ProportionType } from \"../utils\";\nimport { shapes } from \"./shapes\";\n\n// ── Blend modes for layer-level compositing (Feature B) ─────────────\n// These are all standard Canvas 2D globalCompositeOperation values,\n// safe in both Node (@napi-rs/canvas) and browsers.\n\nexport const BLEND_MODES: GlobalCompositeOperation[] = [\n \"source-over\", // default — safe fallback\n \"screen\",\n \"multiply\",\n \"overlay\",\n \"soft-light\",\n \"color-dodge\",\n \"color-burn\",\n \"lighter\",\n];\n\n/**\n * Pick a blend mode deterministically from the RNG.\n * ~40% chance of default source-over to keep some images clean.\n */\nexport function pickBlendMode(rng: () => number): GlobalCompositeOperation {\n if (rng() < 0.4) return \"source-over\";\n return BLEND_MODES[1 + Math.floor(rng() * (BLEND_MODES.length - 1))];\n}\n\n// ── Shape rendering styles (Feature C) ──────────────────────────────\n\nexport type RenderStyle =\n | \"fill-and-stroke\" // classic (current behavior)\n | \"fill-only\" // soft, no outline\n | \"stroke-only\" // wireframe\n | \"double-stroke\" // inner + outer stroke\n | \"dashed\" // dashed outline\n | \"watercolor\" // multiple offset passes at low opacity\n | \"hatched\" // cross-hatch texture fill\n | \"incomplete\"; // draw only 60-85% of the stroke path\n\nconst RENDER_STYLES: RenderStyle[] = [\n \"fill-and-stroke\",\n \"fill-and-stroke\", // weighted: appears twice for higher probability\n \"fill-only\",\n \"stroke-only\",\n \"double-stroke\",\n \"dashed\",\n \"watercolor\",\n \"hatched\",\n \"incomplete\",\n];\n\nexport function pickRenderStyle(rng: () => number): RenderStyle {\n return RENDER_STYLES[Math.floor(rng() * RENDER_STYLES.length)];\n}\n\n// ── Config interfaces ───────────────────────────────────────────────\n\ninterface DrawShapeConfig {\n fillColor: string;\n strokeColor: string;\n strokeWidth: number;\n size: number;\n rotation: number;\n}\n\ninterface EnhanceShapeConfig extends DrawShapeConfig {\n patterns?: Array<{ type: string; config: any }>;\n proportionType?: ProportionType;\n baseOpacity?: number;\n opacityReduction?: number;\n /** If provided, applies a glow (shadowBlur) effect. */\n glowRadius?: number;\n glowColor?: string;\n /** If provided, fills with a radial gradient between two colors. */\n gradientFillEnd?: string;\n /** Rendering style — controls fill/stroke treatment. */\n renderStyle?: RenderStyle;\n /** RNG for watercolor jitter (required for \"watercolor\" style). */\n rng?: () => number;\n}\n\nexport function drawShape(\n ctx: CanvasRenderingContext2D,\n shape: string,\n x: number,\n y: number,\n config: DrawShapeConfig,\n) {\n const { fillColor, strokeColor, strokeWidth, size, rotation } = config;\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate((rotation * Math.PI) / 180);\n ctx.fillStyle = fillColor;\n ctx.strokeStyle = strokeColor;\n ctx.lineWidth = strokeWidth;\n\n const drawFunction = shapes[shape];\n if (drawFunction) {\n drawFunction(ctx, size);\n ctx.fill();\n ctx.stroke();\n }\n\n ctx.restore();\n}\n\n/**\n * Apply the chosen render style to the current path.\n */\nfunction applyRenderStyle(\n ctx: CanvasRenderingContext2D,\n style: RenderStyle,\n fillColor: string,\n strokeColor: string,\n strokeWidth: number,\n size: number,\n rng?: () => number,\n): void {\n switch (style) {\n case \"fill-only\":\n ctx.fill();\n break;\n\n case \"stroke-only\":\n ctx.fill(); // transparent fill to define the path\n ctx.globalAlpha *= 0.3; // ghost fill\n ctx.fill();\n ctx.globalAlpha /= 0.3;\n ctx.stroke();\n break;\n\n case \"double-stroke\": {\n ctx.fill();\n // Outer stroke\n ctx.lineWidth = strokeWidth * 2;\n ctx.globalAlpha *= 0.5;\n ctx.stroke();\n ctx.globalAlpha /= 0.5;\n // Inner stroke\n ctx.lineWidth = strokeWidth * 0.5;\n ctx.strokeStyle = fillColor;\n ctx.stroke();\n break;\n }\n\n case \"dashed\":\n ctx.fill();\n ctx.setLineDash([size * 0.05, size * 0.03]);\n ctx.stroke();\n ctx.setLineDash([]);\n break;\n\n case \"watercolor\": {\n // Draw 3-4 slightly offset passes at low opacity for a bleed effect\n const passes = 3 + (rng ? Math.floor(rng() * 2) : 0);\n const savedAlpha = ctx.globalAlpha;\n ctx.globalAlpha = savedAlpha * (0.3 / passes * 2);\n for (let p = 0; p < passes; p++) {\n const jx = rng ? (rng() - 0.5) * size * 0.06 : 0;\n const jy = rng ? (rng() - 0.5) * size * 0.06 : 0;\n ctx.save();\n ctx.translate(jx, jy);\n ctx.fill();\n ctx.restore();\n }\n ctx.globalAlpha = savedAlpha;\n // Light stroke on top\n ctx.globalAlpha *= 0.4;\n ctx.stroke();\n ctx.globalAlpha /= 0.4;\n break;\n }\n\n case \"hatched\": {\n // Fill normally at reduced opacity, then overlay cross-hatch lines\n const savedAlphaH = ctx.globalAlpha;\n ctx.globalAlpha = savedAlphaH * 0.3;\n ctx.fill();\n ctx.globalAlpha = savedAlphaH;\n\n // Clip to shape, then draw hatch lines\n ctx.save();\n ctx.clip();\n const hatchSpacing = Math.max(3, size * 0.06);\n const hatchAngle = rng ? rng() * Math.PI : Math.PI / 4;\n ctx.lineWidth = Math.max(0.5, strokeWidth * 0.4);\n ctx.globalAlpha = savedAlphaH * 0.6;\n\n // Draw parallel lines across the bounding box\n const extent = size * 0.8;\n const cos = Math.cos(hatchAngle);\n const sin = Math.sin(hatchAngle);\n for (let d = -extent; d <= extent; d += hatchSpacing) {\n ctx.beginPath();\n ctx.moveTo(d * cos - extent * sin, d * sin + extent * cos);\n ctx.lineTo(d * cos + extent * sin, d * sin - extent * cos);\n ctx.stroke();\n }\n // Second pass at perpendicular angle for cross-hatch (~50% chance)\n if (!rng || rng() < 0.5) {\n const crossAngle = hatchAngle + Math.PI / 2;\n const cos2 = Math.cos(crossAngle);\n const sin2 = Math.sin(crossAngle);\n ctx.globalAlpha = savedAlphaH * 0.35;\n for (let d = -extent; d <= extent; d += hatchSpacing * 1.4) {\n ctx.beginPath();\n ctx.moveTo(d * cos2 - extent * sin2, d * sin2 + extent * cos2);\n ctx.lineTo(d * cos2 + extent * sin2, d * sin2 - extent * cos2);\n ctx.stroke();\n }\n }\n ctx.restore();\n ctx.globalAlpha = savedAlphaH;\n // Outline stroke\n ctx.globalAlpha *= 0.5;\n ctx.stroke();\n ctx.globalAlpha /= 0.5;\n break;\n }\n\n case \"incomplete\": {\n // Draw the fill at low opacity, then a dashed stroke that\n // simulates drawing only part of the outline\n const savedAlphaI = ctx.globalAlpha;\n ctx.globalAlpha = savedAlphaI * 0.25;\n ctx.fill();\n ctx.globalAlpha = savedAlphaI;\n\n // Use a long dash pattern where gaps create the \"incomplete\" look\n const completeness = rng ? 0.6 + rng() * 0.25 : 0.7; // 60-85%\n const segLen = size * 0.12;\n const gapLen = segLen * ((1 - completeness) / completeness);\n ctx.setLineDash([segLen, gapLen]);\n // Offset the dash so each shape starts at a different point\n ctx.lineDashOffset = rng ? rng() * segLen * 4 : 0;\n // Slightly thicker stroke for hand-drawn feel\n ctx.lineWidth = strokeWidth * 1.3;\n ctx.stroke();\n ctx.setLineDash([]);\n ctx.lineDashOffset = 0;\n break;\n }\n\n case \"fill-and-stroke\":\n default:\n ctx.fill();\n ctx.stroke();\n break;\n }\n}\n\n/**\n * Enhanced shape drawing with glow, gradient fills, blend modes,\n * render style variety, and pattern layering.\n */\nexport function enhanceShapeGeneration(\n ctx: CanvasRenderingContext2D,\n shape: string,\n x: number,\n y: number,\n config: EnhanceShapeConfig,\n) {\n const {\n fillColor,\n strokeColor,\n strokeWidth,\n size,\n rotation,\n patterns = [],\n proportionType = \"GOLDEN_RATIO\",\n baseOpacity = 0.6,\n opacityReduction = 0.1,\n glowRadius = 0,\n glowColor,\n gradientFillEnd,\n renderStyle = \"fill-and-stroke\",\n rng,\n } = config;\n\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate((rotation * Math.PI) / 180);\n\n // Glow / shadow effect\n if (glowRadius > 0) {\n ctx.shadowBlur = glowRadius;\n ctx.shadowColor = glowColor || fillColor;\n ctx.shadowOffsetX = 0;\n ctx.shadowOffsetY = 0;\n }\n\n // Gradient fill or flat fill\n if (gradientFillEnd) {\n const grad = ctx.createRadialGradient(0, 0, 0, 0, 0, size / 2);\n grad.addColorStop(0, fillColor);\n grad.addColorStop(1, gradientFillEnd);\n ctx.fillStyle = grad;\n } else {\n ctx.fillStyle = fillColor;\n }\n\n ctx.strokeStyle = strokeColor;\n ctx.lineWidth = strokeWidth;\n\n const drawFunction = shapes[shape];\n if (drawFunction) {\n drawFunction(ctx, size, { rng });\n applyRenderStyle(ctx, renderStyle, fillColor, strokeColor, strokeWidth, size, rng);\n }\n\n // Reset shadow so patterns aren't double-glowed\n if (glowRadius > 0) {\n ctx.shadowBlur = 0;\n }\n\n // Layer additional patterns if specified\n if (patterns.length > 0) {\n PatternCombiner.layerPatterns(ctx, patterns, {\n baseSize: size,\n baseOpacity,\n opacityReduction,\n proportionType,\n });\n }\n\n ctx.restore();\n}\n","import { basicShapes } from \"./basic\";\nimport { complexShapes } from \"./complex\";\nimport { sacredShapes } from \"./sacred\";\nimport { proceduralShapes } from \"./procedural\";\n\ntype DrawFunction = (\n ctx: CanvasRenderingContext2D,\n size: number,\n config?: any,\n) => void;\n\nexport const shapes: Record<string, DrawFunction> = {\n ...basicShapes,\n ...complexShapes,\n ...sacredShapes,\n ...proceduralShapes,\n};\n","type DrawFunction = (ctx: CanvasRenderingContext2D, size: number) => void;\n\nexport const drawCircle: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.arc(0, 0, size / 2, 0, Math.PI * 2);\n};\n\nexport const drawSquare: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.rect(-size / 2, -size / 2, size, size);\n};\n\nexport const drawTriangle: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.moveTo(0, -size / 2);\n ctx.lineTo(-size / 2, size / 2);\n ctx.lineTo(size / 2, size / 2);\n ctx.closePath();\n};\n\nexport const drawHexagon: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n for (let i = 0; i < 6; i++) {\n const angle = ((Math.PI * 2) / 6) * i;\n const x = (size / 2) * Math.cos(angle);\n const y = (size / 2) * Math.sin(angle);\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\nexport const drawStar: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n for (let i = 0; i < 10; i++) {\n const angle = Math.PI / 5 + (Math.PI / 5) * i * 3;\n const radius = i % 2 === 0 ? size / 2 : size / 4;\n const x = radius * Math.cos(angle);\n const y = radius * Math.sin(angle);\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\nexport const drawJackedStar: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n for (let i = 0; i < 10; i++) {\n const angle = Math.PI / 30 + (Math.PI / 30) * i * 8;\n const radius = i % 2 === 0 ? size / 2 : size / 8;\n const x = radius * Math.cos(angle);\n const y = radius * Math.sin(angle);\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\nexport const drawHeart: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.moveTo(0, size / 4);\n ctx.quadraticCurveTo(size / 2, size / 4, 0, -size / 4);\n ctx.quadraticCurveTo(-size / 2, size / 4, 0, size / 4);\n};\n\nexport const drawDiamond: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.moveTo(0, -size / 2);\n ctx.lineTo(size / 2, 0);\n ctx.lineTo(0, size / 2);\n ctx.lineTo(-size / 2, 0);\n ctx.closePath();\n};\n\nexport const drawCube: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.moveTo(-size / 2, -size / 2);\n ctx.lineTo(size / 2, -size / 2);\n ctx.lineTo(size / 2, size / 2);\n ctx.lineTo(-size / 2, size / 2);\n ctx.closePath();\n};\n\n// Optional: Create a shape map for easier lookup\nexport const basicShapes: Record<string, DrawFunction> = {\n circle: drawCircle,\n square: drawSquare,\n triangle: drawTriangle,\n hexagon: drawHexagon,\n star: drawStar,\n \"jacked-star\": drawJackedStar,\n heart: drawHeart,\n diamond: drawDiamond,\n cube: drawCube,\n};\n","import { defaultShapeConfig } from \"../../constants\";\nimport { applyTransforms, createCirclePoints, restoreContext } from \"./utils\";\n\ninterface PlatonicSolidConfig {\n vertices: number;\n faces: number;\n}\n\ninterface FibonacciConfig {\n iterations: number;\n growthFactor: number;\n}\n\ninterface GoldenRatioConfig {\n iterations: number;\n ratio: number;\n}\n\nexport const ShapeConfigs = {\n platonic: {\n tetrahedron: { vertices: 4, faces: 4 },\n cube: { vertices: 8, faces: 6 },\n octahedron: { vertices: 6, faces: 8 },\n dodecahedron: { vertices: 20, faces: 12 },\n icosahedron: { vertices: 12, faces: 20 },\n } as Record<string, PlatonicSolidConfig>,\n fibonacci: {\n iterations: 13,\n growthFactor: 1.618034, // Golden ratio\n } as FibonacciConfig,\n goldenRatio: {\n iterations: 8,\n ratio: 1.618034,\n } as GoldenRatioConfig,\n};\n\ninterface ShapeConfig {\n fillStyle?: string;\n strokeStyle?: string;\n lineWidth?: number;\n rotation?: number;\n iterations?: number;\n animate?: boolean;\n type?: string;\n}\n\ntype DrawFunction = (\n ctx: CanvasRenderingContext2D,\n size: number,\n config?: ShapeConfig,\n) => void;\n\nexport const drawPlatonicSolid: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config };\n applyTransforms(ctx, size, finalConfig);\n\n const solidType = config.type as keyof typeof ShapeConfigs.platonic;\n const solidConfig =\n ShapeConfigs.platonic[solidType] ?? ShapeConfigs.platonic.icosahedron;\n const {\n vertices,\n // faces\n } = solidConfig;\n const radius = size / 2;\n\n // Calculate vertices based on platonic solid type\n const points = createCirclePoints(0, 0, radius, vertices);\n\n ctx.beginPath();\n // Draw edges between vertices\n points.forEach((p1, i) => {\n points.slice(i + 1).forEach((p2) => {\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n });\n });\n\n if (finalConfig.fillStyle !== \"transparent\") {\n ctx.fill();\n }\n ctx.stroke();\n restoreContext(ctx);\n};\n\nexport const drawFibonacciSpiral: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = {\n ...defaultShapeConfig,\n ...ShapeConfigs.fibonacci,\n ...config,\n };\n applyTransforms(ctx, size, finalConfig);\n\n let current = 1;\n let previous = 1;\n let scale = size / Math.pow(finalConfig.growthFactor, finalConfig.iterations);\n\n ctx.beginPath();\n for (let i = 0; i < finalConfig.iterations; i++) {\n const radius = scale * current;\n const centerX = radius / 2;\n const centerY = radius / 2;\n\n ctx.arc(centerX, centerY, radius, Math.PI, Math.PI * 1.5);\n\n // Calculate next Fibonacci number\n const next = current + previous;\n previous = current;\n current = next;\n\n // Transform for next iteration\n ctx.translate(radius, 0);\n ctx.rotate(Math.PI / 2);\n }\n\n ctx.stroke();\n restoreContext(ctx);\n};\n\nexport const drawIslamicPattern: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config };\n applyTransforms(ctx, size, finalConfig);\n\n const gridSize = 8;\n const unit = size / gridSize;\n\n ctx.beginPath();\n // Create base grid\n for (let i = 0; i <= gridSize; i++) {\n for (let j = 0; j <= gridSize; j++) {\n const x = (i - gridSize / 2) * unit;\n const y = (j - gridSize / 2) * unit;\n\n // Draw star pattern at each intersection\n const radius = unit / 2;\n for (let k = 0; k < 8; k++) {\n const angle = (Math.PI / 4) * k;\n const x1 = x + radius * Math.cos(angle);\n const y1 = y + radius * Math.sin(angle);\n const x2 = x + radius * Math.cos(angle + Math.PI / 4);\n const y2 = y + radius * Math.sin(angle + Math.PI / 4);\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n }\n }\n }\n\n ctx.stroke();\n restoreContext(ctx);\n};\n\nexport const drawCelticKnot: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config };\n applyTransforms(ctx, size, finalConfig);\n\n const gridSize = 4;\n const unit = size / gridSize;\n\n const drawKnotSegment = (x: number, y: number, type: string) => {\n ctx.beginPath();\n switch (type) {\n case \"over\":\n ctx.moveTo(x, y);\n ctx.bezierCurveTo(\n x + unit / 2,\n y,\n x + unit / 2,\n y + unit,\n x + unit,\n y + unit,\n );\n break;\n case \"under\":\n ctx.moveTo(x, y + unit);\n ctx.bezierCurveTo(x + unit / 2, y + unit, x + unit / 2, y, x + unit, y);\n break;\n }\n ctx.stroke();\n };\n\n // Create knot pattern\n for (let i = 0; i < gridSize; i++) {\n for (let j = 0; j < gridSize; j++) {\n const x = (i - gridSize / 2) * unit;\n const y = (j - gridSize / 2) * unit;\n drawKnotSegment(x, y, (i + j) % 2 === 0 ? \"over\" : \"under\");\n }\n }\n\n restoreContext(ctx);\n};\n\nexport const drawMerkaba: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config };\n applyTransforms(ctx, size, finalConfig);\n\n const radius = size / 2;\n\n // Draw two intersecting tetrahedra\n ctx.beginPath();\n // First tetrahedron\n const points1 = createCirclePoints(0, 0, radius, 3);\n points1.forEach((p1, i) => {\n points1.slice(i + 1).forEach((p2) => {\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n });\n });\n\n // Second tetrahedron (rotated)\n ctx.rotate(Math.PI / 6);\n const points2 = createCirclePoints(0, 0, radius, 3);\n points2.forEach((p1, i) => {\n points2.slice(i + 1).forEach((p2) => {\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n });\n });\n\n if (finalConfig.fillStyle !== \"transparent\") {\n ctx.fill();\n }\n ctx.stroke();\n restoreContext(ctx);\n};\n\nexport const drawMandala: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config };\n applyTransforms(ctx, size, finalConfig);\n\n const numCircles = 8;\n const numPoints = 16;\n const radius = size / 2;\n\n ctx.beginPath();\n for (let i = 1; i <= numCircles; i++) {\n const circleRadius = (radius / numCircles) * i;\n ctx.moveTo(circleRadius, 0);\n ctx.arc(0, 0, circleRadius, 0, Math.PI * 2);\n\n for (let j = 0; j < numPoints; j++) {\n const angle = (Math.PI * 2 * j) / numPoints;\n const x = circleRadius * Math.cos(angle);\n const y = circleRadius * Math.sin(angle);\n ctx.moveTo(0, 0);\n ctx.lineTo(x, y);\n }\n }\n\n ctx.stroke();\n restoreContext(ctx);\n};\n\nexport const drawFractal: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config, iterations: 5 };\n applyTransforms(ctx, size, finalConfig);\n\n const drawBranch = (\n x: number,\n y: number,\n length: number,\n angle: number,\n depth: number,\n ) => {\n if (depth === 0) return;\n\n const endX = x + length * Math.cos(angle);\n const endY = y + length * Math.sin(angle);\n\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(endX, endY);\n ctx.stroke();\n\n drawBranch(endX, endY, length * 0.7, angle - Math.PI / 6, depth - 1);\n drawBranch(endX, endY, length * 0.7, angle + Math.PI / 6, depth - 1);\n };\n\n drawBranch(0, size / 2, size / 4, -Math.PI / 2, finalConfig.iterations);\n restoreContext(ctx);\n};\n\nexport const complexShapes: Record<string, DrawFunction> = {\n platonicSolid: drawPlatonicSolid,\n fibonacciSpiral: drawFibonacciSpiral,\n islamicPattern: drawIslamicPattern,\n celticKnot: drawCelticKnot,\n merkaba: drawMerkaba,\n mandala: drawMandala,\n fractal: drawFractal,\n};\n","// Define interfaces for our configurations\ninterface PresetConfig {\n hash: string;\n width: number;\n height: number;\n gridSize?: number;\n shapesPerLayer?: number;\n layers?: number;\n baseOpacity?: number;\n minShapeSize?: number;\n maxShapeSize?: number;\n}\n\ninterface ShapeConfig {\n strokeStyle: string;\n fillStyle: string;\n lineWidth: number;\n rotation: number;\n iterations: number;\n animate: boolean;\n}\n\n// Define the type for PRESETS\ntype Presets = {\n [key: string]: PresetConfig;\n};\n\nexport const PRESETS: Presets = {\n // Standard sizes with different hashes\n react: {\n hash: \"46192e59d42f741c761cbea79462a8b3815dd905\",\n width: 1024,\n height: 1024,\n },\n angular: {\n hash: \"f31a6c3e94420f43c0cd323a5a6a99376ee59ff8\",\n width: 1024,\n height: 1024,\n gridSize: 6, // Higher density grid\n },\n // Wide format variations\n banner: {\n hash: \"d847ffd4269b22c54d6e85ad3c1892a298e961fb\",\n width: 1920,\n height: 480,\n gridSize: 8, // More horizontal cells for wide format\n shapesPerLayer: 40,\n },\n ultrawide: {\n hash: \"a3e126e537ed2cd11ddf3a96c37066e97c7afee6\",\n width: 3440,\n height: 1440,\n gridSize: 12, // Extra wide needs more cells\n shapesPerLayer: 60,\n },\n // Social media sizes\n \"instagram-square\": {\n hash: \"ff00ff00ff00ff00ff00ff00ff00ff00ff00ff0\",\n width: 1080,\n height: 1080,\n },\n \"instagram-story\": {\n hash: \"abc123def456abc123def456abc123def456abc1\",\n width: 1080,\n height: 1920,\n gridSize: 6,\n layers: 6,\n },\n \"twitter-header\": {\n hash: \"7777777777777777777777777777777777777777\",\n width: 1500,\n height: 500,\n gridSize: 8,\n shapesPerLayer: 35,\n },\n \"linkedin-banner\": {\n hash: \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n width: 1584,\n height: 396,\n gridSize: 8,\n shapesPerLayer: 35,\n },\n // Mobile sizes\n \"phone-wallpaper\": {\n hash: \"ffffffffffffffffffffffffffffffffaaaaaaaa\",\n width: 1170,\n height: 2532, // iPhone 13 Pro size\n gridSize: 5,\n layers: 6,\n },\n \"tablet-wallpaper\": {\n hash: \"123456789abcdef0123456789abcdef012345678\",\n width: 2048,\n height: 2732, // iPad Pro size\n gridSize: 7,\n layers: 6,\n },\n // Special configurations\n minimal: {\n hash: \"000000000000000000000000000000000fffffff\",\n width: 1024,\n height: 1024,\n layers: 3,\n baseOpacity: 0.8,\n shapesPerLayer: 15,\n },\n complex: {\n hash: \"deadbeefdeadbeefdeadbeefdeadbeefdeadbeef\",\n width: 2048,\n height: 2048,\n gridSize: 8,\n layers: 7,\n shapesPerLayer: 50,\n minShapeSize: 30,\n maxShapeSize: 250,\n },\n};\n\n// Basic configuration that applies to all shapes\nexport const defaultShapeConfig: ShapeConfig = {\n strokeStyle: \"#000000\",\n fillStyle: \"transparent\",\n lineWidth: 1,\n rotation: 0,\n iterations: 1,\n animate: false, // For future use\n};\n\n// Base configuration types that can be extended per shape\nexport const ShapeConfigTypes = {\n BASIC: \"basic\",\n DETAILED: \"detailed\",\n ANIMATED: \"animated\",\n};\n\n// Golden ratio and other important proportions\nexport const Proportions = {\n GOLDEN_RATIO: 1.618034,\n SQUARE_ROOT_2: Math.sqrt(2),\n SQUARE_ROOT_3: Math.sqrt(3),\n SQUARE_ROOT_5: Math.sqrt(5),\n PI: Math.PI,\n PHI: (1 + Math.sqrt(5)) / 2,\n};\n\n// Helper for creating common sacred geometry combinations\nexport const PatternPresets = {\n flowerOfLifeMandala: (size: number) => [\n // { type: \"flowerOfLife\", config: { size } },\n { type: \"merkaba\", config: { size: size * 0.8 } },\n { type: \"sriYantra\", config: { size: size * 0.5 } },\n ],\n\n platonicProgression: (size: number) => [\n { type: \"platonicSolid\", config: { size, type: \"tetrahedron\" } },\n { type: \"platonicSolid\", config: { size: size * 0.8, type: \"cube\" } },\n { type: \"platonicSolid\", config: { size: size * 0.6, type: \"octahedron\" } },\n ],\n\n cosmicTree: (size: number) => [\n // { type: \"treeOfLife\", config: { size } },\n { type: \"fibonacciSpiral\", config: { size: size * 0.9 } },\n { type: \"metatronsCube\", config: { size: size * 0.7 } },\n ],\n};\n","interface Point {\n x: number;\n y: number;\n}\n\ninterface ShapeConfig {\n rotation?: number;\n lineWidth: number;\n strokeStyle: string;\n fillStyle: string;\n}\n\ninterface AnimationConfig {\n enabled: boolean;\n duration: number;\n easing: string;\n type: string;\n}\n\nexport const degToRad = (degrees: number): number => (degrees * Math.PI) / 180;\n\nexport const applyTransforms = (\n ctx: CanvasRenderingContext2D,\n size: number,\n config: ShapeConfig,\n): void => {\n ctx.save();\n ctx.translate(0, 0);\n if (config.rotation) {\n ctx.rotate(degToRad(config.rotation));\n }\n ctx.lineWidth = config.lineWidth;\n ctx.strokeStyle = config.strokeStyle;\n ctx.fillStyle = config.fillStyle;\n};\n\nexport const restoreContext = (ctx: CanvasRenderingContext2D): void => {\n ctx.restore();\n};\n\n// Animation configuration stub for future use\nexport const createAnimationConfig = (type: string): AnimationConfig => ({\n enabled: false,\n duration: 1000,\n easing: \"linear\",\n type,\n // Add more animation-specific properties as needed\n});\n\nexport const createCirclePoints = (\n cx: number,\n cy: number,\n radius: number,\n segments: number,\n): Point[] => {\n const points: Point[] = [];\n for (let i = 0; i < segments; i++) {\n const angle = (i / segments) * Math.PI * 2;\n points.push({\n x: cx + Math.cos(angle) * radius,\n y: cy + Math.sin(angle) * radius,\n });\n }\n return points;\n};\n","import { createCirclePoints } from \"./utils\";\n\ntype DrawFunction = (ctx: CanvasRenderingContext2D, size: number) => void;\n\ninterface Point {\n x: number;\n y: number;\n}\n\nexport const drawFlowerOfLife: DrawFunction = (ctx, size) => {\n const radius = size / 6;\n const centers: Point[] = [\n { x: 0, y: 0 },\n { x: radius * Math.sqrt(3), y: 0 },\n { x: (radius * Math.sqrt(3)) / 2, y: 1.5 * radius },\n { x: (-radius * Math.sqrt(3)) / 2, y: 1.5 * radius },\n { x: -radius * Math.sqrt(3), y: 0 },\n { x: (-radius * Math.sqrt(3)) / 2, y: -1.5 * radius },\n { x: (radius * Math.sqrt(3)) / 2, y: -1.5 * radius },\n ];\n\n ctx.beginPath();\n centers.forEach((center) => {\n ctx.moveTo(center.x + radius, center.y);\n ctx.arc(center.x, center.y, radius, 0, Math.PI * 2);\n });\n};\n\nexport const drawTreeOfLife: DrawFunction = (ctx, size) => {\n const radius = size / 12;\n const spacing = radius * 2.5;\n\n // Sephirot positions (traditional layout)\n const positions: Point[] = [\n { x: 0, y: -spacing * 2 }, // Kether\n { x: -spacing, y: -spacing }, // Chokmah\n { x: spacing, y: -spacing }, // Binah\n { x: -spacing, y: 0 }, // Chesed\n { x: spacing, y: 0 }, // Geburah\n { x: 0, y: 0 }, // Tiphereth\n { x: -spacing, y: spacing }, // Netzach\n { x: spacing, y: spacing }, // Hod\n { x: 0, y: spacing * 2 }, // Yesod\n { x: 0, y: spacing * 3 }, // Malkuth\n ];\n\n // Draw circles\n ctx.beginPath();\n positions.forEach((pos) => {\n ctx.moveTo(pos.x + radius, pos.y);\n ctx.arc(pos.x, pos.y, radius, 0, Math.PI * 2);\n });\n\n // Draw connecting lines\n ctx.moveTo(positions[0].x, positions[0].y);\n positions.forEach((pos, i) => {\n if (i > 0) {\n positions.slice(i + 1).forEach((nextPos) => {\n ctx.moveTo(pos.x, pos.y);\n ctx.lineTo(nextPos.x, nextPos.y);\n });\n }\n });\n};\n\nexport const drawMetatronsCube: DrawFunction = (ctx, size) => {\n const radius = size / 3;\n\n // Create 13 points - one center and 12 vertices of an icosahedron\n\n // const phi = (1 + Math.sqrt(5)) / 2; // Golden ratio\n\n const vertices: Point[] = [\n { x: 0, y: 0 }, // Center point\n ...createCirclePoints(0, 0, radius, 6), // Inner hexagon\n ...createCirclePoints(0, 0, radius * 1.5, 6), // Outer hexagon\n ];\n\n ctx.beginPath();\n // Draw all connecting lines\n vertices.forEach((v1, i) => {\n vertices.slice(i + 1).forEach((v2) => {\n ctx.moveTo(v1.x, v1.y);\n ctx.lineTo(v2.x, v2.y);\n });\n });\n};\n\nexport const drawSriYantra: DrawFunction = (ctx, size) => {\n const radius = size / 2;\n ctx.beginPath();\n\n // Draw outer triangles\n for (let i = 0; i < 9; i++) {\n const angle = (i / 9) * Math.PI * 2;\n const x1 = Math.cos(angle) * radius;\n const y1 = Math.sin(angle) * radius;\n const x2 = Math.cos(angle + Math.PI / 9) * radius;\n const y2 = Math.sin(angle + Math.PI / 9) * radius;\n\n ctx.moveTo(0, 0);\n ctx.lineTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.lineTo(0, 0);\n }\n\n // Draw inner triangles\n const innerRadius = radius * 0.6;\n for (let i = 0; i < 9; i++) {\n const angle = (i / 9) * Math.PI * 2 + Math.PI / 18;\n const x1 = Math.cos(angle) * innerRadius;\n const y1 = Math.sin(angle) * innerRadius;\n const x2 = Math.cos(angle + Math.PI / 9) * innerRadius;\n const y2 = Math.sin(angle + Math.PI / 9) * innerRadius;\n\n ctx.moveTo(0, 0);\n ctx.lineTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.lineTo(0, 0);\n }\n};\n\nexport const drawSeedOfLife: DrawFunction = (ctx, size) => {\n const radius = size / 6;\n const centers: Point[] = [\n { x: 0, y: 0 },\n { x: radius * Math.sqrt(3), y: 0 },\n { x: (radius * Math.sqrt(3)) / 2, y: 1.5 * radius },\n { x: (-radius * Math.sqrt(3)) / 2, y: 1.5 * radius },\n { x: -radius * Math.sqrt(3), y: 0 },\n { x: (-radius * Math.sqrt(3)) / 2, y: -1.5 * radius },\n { x: (radius * Math.sqrt(3)) / 2, y: -1.5 * radius },\n ];\n\n ctx.beginPath();\n centers.forEach((center) => {\n ctx.moveTo(center.x + radius, center.y);\n ctx.arc(center.x, center.y, radius, 0, Math.PI * 2);\n });\n};\n\nexport const drawVesicaPiscis: DrawFunction = (ctx, size) => {\n const radius = size / 4;\n ctx.beginPath();\n ctx.arc(-radius / 2, 0, radius, 0, Math.PI * 2);\n ctx.arc(radius / 2, 0, radius, 0, Math.PI * 2);\n};\n\nexport const drawTorus: DrawFunction = (ctx, size) => {\n const outerRadius = size / 2;\n const innerRadius = size / 4;\n const steps = 36;\n\n ctx.beginPath();\n for (let i = 0; i < steps; i++) {\n const angle1 = (i / steps) * Math.PI * 2;\n // const angle2 = ((i + 1) / steps) * Math.PI * 2;\n\n for (let j = 0; j < steps; j++) {\n const phi1 = (j / steps) * Math.PI * 2;\n const phi2 = ((j + 1) / steps) * Math.PI * 2;\n\n const x1 =\n (outerRadius + innerRadius * Math.cos(phi1)) * Math.cos(angle1);\n const y1 =\n (outerRadius + innerRadius * Math.cos(phi1)) * Math.sin(angle1);\n const x2 =\n (outerRadius + innerRadius * Math.cos(phi2)) * Math.cos(angle1);\n const y2 =\n (outerRadius + innerRadius * Math.cos(phi2)) * Math.sin(angle1);\n\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n }\n }\n};\n\nexport const drawEggOfLife: DrawFunction = (ctx, size) => {\n const radius = size / 8;\n const centers: Point[] = [\n { x: 0, y: 0 },\n { x: radius * 2, y: 0 },\n { x: radius, y: radius * Math.sqrt(3) },\n { x: -radius, y: radius * Math.sqrt(3) },\n { x: -radius * 2, y: 0 },\n { x: -radius, y: -radius * Math.sqrt(3) },\n { x: radius, y: -radius * Math.sqrt(3) },\n ];\n\n ctx.beginPath();\n centers.forEach((center) => {\n ctx.moveTo(center.x + radius, center.y);\n ctx.arc(center.x, center.y, radius, 0, Math.PI * 2);\n });\n};\n\nexport const sacredShapes: Record<string, DrawFunction> = {\n flowerOfLife: drawFlowerOfLife,\n treeOfLife: drawTreeOfLife,\n metatronsCube: drawMetatronsCube,\n sriYantra: drawSriYantra,\n seedOfLife: drawSeedOfLife,\n vesicaPiscis: drawVesicaPiscis,\n torus: drawTorus,\n eggOfLife: drawEggOfLife,\n};\n","/**\n * Procedural shape generators — hash-derived shapes that are unique\n * per generation. Unlike the fixed shape library, these produce geometry\n * that doesn't repeat across hashes.\n *\n * All draw functions accept an RNG via the config parameter so the\n * shapes are deterministic from the hash.\n */\n\ntype DrawFunction = (\n ctx: CanvasRenderingContext2D,\n size: number,\n config?: any,\n) => void;\n\n// ── Blob: organic closed curve via cubic bezier ─────────────────────\n// Generates 5-9 control points around a circle with hash-derived\n// radius jitter, then connects them with smooth cubic beziers.\n\nexport const drawBlob: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const numPoints = 5 + Math.floor(rng() * 5); // 5-9 lobes\n const points: Array<{ x: number; y: number }> = [];\n\n for (let i = 0; i < numPoints; i++) {\n const angle = (i / numPoints) * Math.PI * 2;\n const jitter = 0.5 + rng() * 0.5; // radius varies 50-100%\n points.push({\n x: Math.cos(angle) * r * jitter,\n y: Math.sin(angle) * r * jitter,\n });\n }\n\n ctx.beginPath();\n // Start at midpoint between last and first point\n const last = points[points.length - 1];\n const first = points[0];\n ctx.moveTo((last.x + first.x) / 2, (last.y + first.y) / 2);\n\n for (let i = 0; i < numPoints; i++) {\n const curr = points[i];\n const next = points[(i + 1) % numPoints];\n const midX = (curr.x + next.x) / 2;\n const midY = (curr.y + next.y) / 2;\n ctx.quadraticCurveTo(curr.x, curr.y, midX, midY);\n }\n ctx.closePath();\n};\n\n// ── Ngon: irregular polygon with hash-controlled vertices ───────────\n// Vertex count 3-12, each vertex has independent radius jitter\n// producing irregular, organic polygons.\n\nexport const drawNgon: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const sides = 3 + Math.floor(rng() * 10); // 3-12 sides\n const jitterAmount = 0.1 + rng() * 0.4; // 10-50% vertex displacement\n\n ctx.beginPath();\n for (let i = 0; i < sides; i++) {\n const angle = (i / sides) * Math.PI * 2 - Math.PI / 2;\n const radiusJitter = 1 - jitterAmount + rng() * jitterAmount * 2;\n const x = Math.cos(angle) * r * radiusJitter;\n const y = Math.sin(angle) * r * radiusJitter;\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\n// ── Lissajous: parametric curves with hash-derived frequency ratios ─\n// Produces figure-8s, knots, and complex looping curves.\n\nexport const drawLissajous: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n // Frequency ratios — small integers produce recognizable patterns\n const freqA = 1 + Math.floor(rng() * 5); // 1-5\n const freqB = 1 + Math.floor(rng() * 5); // 1-5\n const phase = rng() * Math.PI; // phase offset\n const steps = 120;\n\n ctx.beginPath();\n for (let i = 0; i <= steps; i++) {\n const t = (i / steps) * Math.PI * 2;\n const x = Math.sin(freqA * t + phase) * r;\n const y = Math.sin(freqB * t) * r;\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\n// ── Superellipse: |x|^n + |y|^n = 1 with hash-derived exponent ─────\n// n=2 is circle, n>2 is squircle, n<1 is astroid/star-like.\n\nexport const drawSuperellipse: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n // Exponent range: 0.3 (spiky astroid) to 5 (rounded rectangle)\n const n = 0.3 + rng() * 4.7;\n const steps = 120;\n\n ctx.beginPath();\n for (let i = 0; i <= steps; i++) {\n const t = (i / steps) * Math.PI * 2;\n const cosT = Math.cos(t);\n const sinT = Math.sin(t);\n // Superellipse parametric form\n const x = Math.sign(cosT) * Math.pow(Math.abs(cosT), 2 / n) * r;\n const y = Math.sign(sinT) * Math.pow(Math.abs(sinT), 2 / n) * r;\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\n// ── Spirograph: hypotrochoid curves ─────────────────────────────────\n// Inner/outer radius ratios from hash produce unique looping patterns.\n\nexport const drawSpirograph: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const scale = size / 2;\n // R = outer radius, r = inner radius, d = pen distance from inner center\n const R = 1;\n const r = 0.2 + rng() * 0.6; // 0.2-0.8\n const d = 0.3 + rng() * 0.7; // 0.3-1.0\n // Number of full rotations needed to close the curve\n const gcd = (a: number, b: number): number => {\n const ai = Math.round(a * 1000);\n const bi = Math.round(b * 1000);\n const g = (x: number, y: number): number => (y === 0 ? x : g(y, x % y));\n return g(ai, bi) / 1000;\n };\n const period = r / gcd(R, r);\n const maxT = Math.min(period, 10) * Math.PI * 2; // cap at 10 rotations\n const steps = Math.min(600, Math.floor(maxT * 20));\n\n ctx.beginPath();\n for (let i = 0; i <= steps; i++) {\n const t = (i / steps) * maxT;\n const x = ((R - r) * Math.cos(t) + d * Math.cos(((R - r) / r) * t)) * scale / (1 + d);\n const y = ((R - r) * Math.sin(t) - d * Math.sin(((R - r) / r) * t)) * scale / (1 + d);\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\n// ── Wave ring: concentric ring with sinusoidal displacement ─────────\n// Hash controls frequency, amplitude, and number of rings.\n\nexport const drawWaveRing: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const rings = 2 + Math.floor(rng() * 4); // 2-5 rings\n const freq = 3 + Math.floor(rng() * 12); // 3-14 waves per ring\n const amp = 0.05 + rng() * 0.15; // 5-20% of radius\n\n ctx.beginPath();\n for (let ring = 0; ring < rings; ring++) {\n const baseR = r * (0.3 + (ring / rings) * 0.7);\n const steps = 80;\n for (let i = 0; i <= steps; i++) {\n const t = (i / steps) * Math.PI * 2;\n const wave = Math.sin(t * freq + ring * 1.5) * baseR * amp;\n const x = Math.cos(t) * (baseR + wave);\n const y = Math.sin(t) * (baseR + wave);\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n }\n};\n\n// ── Rose curve: polar rose r = cos(k*theta) ────────────────────────\n// k determines petal count. Integer k = k petals (odd) or 2k petals (even).\n\nexport const drawRose: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const k = 2 + Math.floor(rng() * 6); // 2-7 petal parameter\n const steps = 200;\n\n ctx.beginPath();\n for (let i = 0; i <= steps; i++) {\n const theta = (i / steps) * Math.PI * 2 * (k % 2 === 0 ? 1 : 2);\n const rr = Math.cos(k * theta) * r;\n const x = rr * Math.cos(theta);\n const y = rr * Math.sin(theta);\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\n\n// ── Shape registry ──────────────────────────────────────────────────\n\nexport const proceduralShapes: Record<string, DrawFunction> = {\n blob: drawBlob,\n ngon: drawNgon,\n lissajous: drawLissajous,\n superellipse: drawSuperellipse,\n spirograph: drawSpirograph,\n waveRing: drawWaveRing,\n rose: drawRose,\n};\n","/**\n * Configuration options for image generation.\n */\nexport interface GenerationConfig {\n /** Canvas width in pixels (default: 2048) */\n width: number;\n /** Canvas height in pixels (default: 2048) */\n height: number;\n /** Controls base shape count per layer — gridSize² × 1.5 (default: 5) */\n gridSize: number;\n /** Number of layers to generate (default: 4) */\n layers: number;\n /** Minimum shape size in pixels, scaled to canvas (default: 30) */\n minShapeSize: number;\n /** Maximum shape size in pixels, scaled to canvas (default: 400) */\n maxShapeSize: number;\n /** Starting opacity for the first layer (default: 0.7) */\n baseOpacity: number;\n /** Opacity reduction per layer (default: 0.12) */\n opacityReduction: number;\n /** Base shapes per layer — defaults to gridSize² × 1.5 when 0 */\n shapesPerLayer: number;\n}\n\nexport const DEFAULT_CONFIG: GenerationConfig = {\n width: 2048,\n height: 2048,\n gridSize: 5,\n layers: 4,\n minShapeSize: 30,\n maxShapeSize: 400,\n baseOpacity: 0.7,\n opacityReduction: 0.12,\n shapesPerLayer: 0,\n};\n","/**\n * Visual archetypes — fundamentally different rendering personalities\n * selected deterministically from the hash.\n *\n * Each archetype overrides key rendering parameters to produce images\n * that look like they came from different generators entirely.\n */\nimport type { RenderStyle } from \"./canvas/draw\";\n\n// ── Background types ────────────────────────────────────────────────\n\nexport type BackgroundStyle =\n | \"radial-dark\" // current default: dark radial gradient\n | \"radial-light\" // light center, medium edges\n | \"linear-horizontal\" // left-to-right gradient\n | \"linear-diagonal\" // corner-to-corner gradient\n | \"solid-dark\" // flat dark color\n | \"solid-light\" // flat light/white color\n | \"multi-stop\"; // 3-4 color gradient\n\n// ── Palette modes ───────────────────────────────────────────────────\n\nexport type PaletteMode =\n | \"harmonious\" // current default: full palette\n | \"monochrome\" // single hue, varying lightness\n | \"duotone\" // two colors only\n | \"neon\" // high saturation on dark\n | \"pastel-light\" // soft pastels on light background\n | \"earth\" // muted warm naturals\n | \"high-contrast\"; // black + white + one accent\n\n// ── Archetype definition ────────────────────────────────────────────\n\nexport interface Archetype {\n name: string;\n /** Override gridSize (controls shape count) */\n gridSize: number;\n /** Override layer count */\n layers: number;\n /** Override base opacity */\n baseOpacity: number;\n /** Override opacity reduction per layer */\n opacityReduction: number;\n /** Override min shape size */\n minShapeSize: number;\n /** Override max shape size */\n maxShapeSize: number;\n /** Background rendering style */\n backgroundStyle: BackgroundStyle;\n /** Color palette mode */\n paletteMode: PaletteMode;\n /** Preferred render styles (weighted toward these) */\n preferredStyles: RenderStyle[];\n /** Flow line count multiplier (1 = default) */\n flowLineMultiplier: number;\n /** Whether to draw the hero shape */\n heroShape: boolean;\n /** Glow probability multiplier */\n glowMultiplier: number;\n /** Shape size power curve exponent (higher = more small shapes) */\n sizePower: number;\n /** Whether to invert colors (light shapes on dark, or dark on light) */\n invertForeground: boolean;\n}\n\n// ── Archetype definitions ───────────────────────────────────────────\n\nconst ARCHETYPES: Archetype[] = [\n {\n name: \"dense-chaotic\",\n gridSize: 9,\n layers: 5,\n baseOpacity: 0.5,\n opacityReduction: 0.06,\n minShapeSize: 10,\n maxShapeSize: 200,\n backgroundStyle: \"radial-dark\",\n paletteMode: \"harmonious\",\n preferredStyles: [\"fill-and-stroke\", \"watercolor\", \"fill-only\"],\n flowLineMultiplier: 2.5,\n heroShape: false,\n glowMultiplier: 0.5,\n sizePower: 1.2,\n invertForeground: false,\n },\n {\n name: \"minimal-spacious\",\n gridSize: 2,\n layers: 2,\n baseOpacity: 0.85,\n opacityReduction: 0.05,\n minShapeSize: 150,\n maxShapeSize: 600,\n backgroundStyle: \"solid-light\",\n paletteMode: \"duotone\",\n preferredStyles: [\"fill-and-stroke\", \"stroke-only\", \"incomplete\"],\n flowLineMultiplier: 0.3,\n heroShape: true,\n glowMultiplier: 0,\n sizePower: 0.8,\n invertForeground: false,\n },\n {\n name: \"organic-flow\",\n gridSize: 4,\n layers: 3,\n baseOpacity: 0.4,\n opacityReduction: 0.08,\n minShapeSize: 20,\n maxShapeSize: 250,\n backgroundStyle: \"radial-dark\",\n paletteMode: \"earth\",\n preferredStyles: [\"watercolor\", \"fill-only\", \"incomplete\"],\n flowLineMultiplier: 4,\n heroShape: false,\n glowMultiplier: 0.3,\n sizePower: 1.5,\n invertForeground: false,\n },\n {\n name: \"geometric-precision\",\n gridSize: 6,\n layers: 3,\n baseOpacity: 0.9,\n opacityReduction: 0.15,\n minShapeSize: 40,\n maxShapeSize: 300,\n backgroundStyle: \"solid-dark\",\n paletteMode: \"high-contrast\",\n preferredStyles: [\"stroke-only\", \"dashed\", \"double-stroke\", \"hatched\"],\n flowLineMultiplier: 0,\n heroShape: false,\n glowMultiplier: 0,\n sizePower: 1.0,\n invertForeground: false,\n },\n {\n name: \"ethereal\",\n gridSize: 7,\n layers: 5,\n baseOpacity: 0.3,\n opacityReduction: 0.03,\n minShapeSize: 50,\n maxShapeSize: 500,\n backgroundStyle: \"radial-light\",\n paletteMode: \"pastel-light\",\n preferredStyles: [\"watercolor\", \"incomplete\", \"fill-only\"],\n flowLineMultiplier: 1.5,\n heroShape: true,\n glowMultiplier: 2,\n sizePower: 1.4,\n invertForeground: false,\n },\n {\n name: \"bold-graphic\",\n gridSize: 2,\n layers: 2,\n baseOpacity: 0.95,\n opacityReduction: 0.1,\n minShapeSize: 200,\n maxShapeSize: 800,\n backgroundStyle: \"linear-diagonal\",\n paletteMode: \"duotone\",\n preferredStyles: [\"fill-and-stroke\", \"double-stroke\"],\n flowLineMultiplier: 0,\n heroShape: true,\n glowMultiplier: 0,\n sizePower: 0.5,\n invertForeground: false,\n },\n {\n name: \"neon-glow\",\n gridSize: 5,\n layers: 4,\n baseOpacity: 0.6,\n opacityReduction: 0.1,\n minShapeSize: 20,\n maxShapeSize: 350,\n backgroundStyle: \"solid-dark\",\n paletteMode: \"neon\",\n preferredStyles: [\"stroke-only\", \"double-stroke\", \"dashed\"],\n flowLineMultiplier: 2,\n heroShape: true,\n glowMultiplier: 3,\n sizePower: 1.6,\n invertForeground: false,\n },\n {\n name: \"monochrome-ink\",\n gridSize: 6,\n layers: 3,\n baseOpacity: 0.7,\n opacityReduction: 0.15,\n minShapeSize: 15,\n maxShapeSize: 350,\n backgroundStyle: \"solid-light\",\n paletteMode: \"monochrome\",\n preferredStyles: [\"hatched\", \"incomplete\", \"stroke-only\", \"dashed\"],\n flowLineMultiplier: 1.5,\n heroShape: false,\n glowMultiplier: 0,\n sizePower: 1.8,\n invertForeground: false,\n },\n {\n name: \"cosmic\",\n gridSize: 8,\n layers: 5,\n baseOpacity: 0.5,\n opacityReduction: 0.06,\n minShapeSize: 5,\n maxShapeSize: 300,\n backgroundStyle: \"radial-dark\",\n paletteMode: \"neon\",\n preferredStyles: [\"fill-only\", \"watercolor\", \"fill-and-stroke\"],\n flowLineMultiplier: 3,\n heroShape: true,\n glowMultiplier: 2.5,\n sizePower: 2.5,\n invertForeground: false,\n },\n {\n name: \"classic\",\n gridSize: 5,\n layers: 4,\n baseOpacity: 0.7,\n opacityReduction: 0.12,\n minShapeSize: 30,\n maxShapeSize: 400,\n backgroundStyle: \"radial-dark\",\n paletteMode: \"harmonious\",\n preferredStyles: [\"fill-and-stroke\", \"watercolor\", \"fill-only\"],\n flowLineMultiplier: 1,\n heroShape: true,\n glowMultiplier: 1,\n sizePower: 1.8,\n invertForeground: false,\n },\n];\n\n/**\n * Select an archetype deterministically from the hash.\n * The \"classic\" archetype preserves the original look for backward compat\n * but only gets ~10% of hashes.\n */\nexport function selectArchetype(rng: () => number): Archetype {\n return ARCHETYPES[Math.floor(rng() * ARCHETYPES.length)];\n}\n"],"names":[],"version":3,"file":"browser.js.map"}
1
+ {"mappings":"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","sources":["src/browser.ts","src/lib/render.ts","src/lib/canvas/colors.ts","global.d.ts","src/lib/utils.ts","src/lib/canvas/draw.ts","src/lib/canvas/shapes/index.ts","src/lib/canvas/shapes/basic.ts","src/lib/canvas/shapes/complex.ts","src/lib/constants.ts","src/lib/canvas/shapes/utils.ts","src/lib/canvas/shapes/sacred.ts","src/lib/canvas/shapes/procedural.ts","src/lib/canvas/shapes/affinity.ts","src/types.ts","src/lib/archetypes.ts"],"sourcesContent":["/**\n * Browser entry point for git-hash-art.\n *\n * This module has zero Node.js dependencies — it works with a standard\n * HTMLCanvasElement or OffscreenCanvas and the native Canvas 2D API.\n */\nimport { renderHashArt } from \"./lib/render\";\nimport type { GenerationConfig } from \"./types\";\nimport { DEFAULT_CONFIG } from \"./types\";\n\n/**\n * Render hash-derived art directly onto an HTMLCanvasElement.\n *\n * The canvas should already have the desired width/height set.\n * Config width/height will be inferred from the canvas if not provided.\n *\n * @param canvas - An HTMLCanvasElement (or OffscreenCanvas)\n * @param gitHash - Hex hash string used as the deterministic seed\n * @param config - Partial generation config (merged with defaults)\n */\nfunction renderToCanvas(\n canvas: HTMLCanvasElement | OffscreenCanvas,\n gitHash: string,\n config: Partial<GenerationConfig> = {},\n): void {\n const ctx = canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n if (!ctx) {\n throw new Error(\"Failed to get 2D rendering context from canvas\");\n }\n\n const finalConfig: Partial<GenerationConfig> = {\n width: canvas.width,\n height: canvas.height,\n ...config,\n };\n\n renderHashArt(ctx, gitHash, finalConfig);\n}\n\n/**\n * Render hash-derived art and return it as a Blob (browser-native).\n *\n * @param gitHash - Hex hash string used as the deterministic seed\n * @param config - Partial generation config (merged with defaults)\n * @returns A Promise that resolves to a PNG Blob\n */\nasync function generateImageBlob(\n gitHash: string,\n config: Partial<GenerationConfig> = {},\n): Promise<Blob> {\n const finalConfig: GenerationConfig = { ...DEFAULT_CONFIG, ...config };\n const { width, height } = finalConfig;\n\n const canvas = new OffscreenCanvas(width, height);\n const ctx = canvas.getContext(\"2d\") as OffscreenCanvasRenderingContext2D;\n if (!ctx) {\n throw new Error(\"Failed to get 2D rendering context from OffscreenCanvas\");\n }\n\n renderHashArt(\n ctx as unknown as CanvasRenderingContext2D,\n gitHash,\n finalConfig,\n );\n\n return canvas.convertToBlob({ type: \"image/png\" });\n}\n\n/**\n * Render hash-derived art and return it as a data URL string.\n *\n * @param gitHash - Hex hash string used as the deterministic seed\n * @param config - Partial generation config (merged with defaults)\n * @returns A data:image/png;base64,… string\n */\nfunction generateDataURL(\n gitHash: string,\n config: Partial<GenerationConfig> = {},\n): string {\n const finalConfig: GenerationConfig = { ...DEFAULT_CONFIG, ...config };\n const { width, height } = finalConfig;\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"Failed to get 2D rendering context\");\n }\n\n renderHashArt(ctx, gitHash, finalConfig);\n\n return canvas.toDataURL(\"image/png\");\n}\n\nexport { renderToCanvas, generateImageBlob, generateDataURL, renderHashArt };\nexport { PRESETS } from \"./lib/constants\";\nexport type { GenerationConfig } from \"./types\";\nexport { DEFAULT_CONFIG } from \"./types\";\n","/**\n * Pure rendering logic — environment-agnostic.\n *\n * Uses only the standard CanvasRenderingContext2D API so it works\n * identically in Node (@napi-rs/canvas) and browsers.\n *\n * Generation pipeline:\n * 0. Archetype selection + shape palette + color hierarchy\n * 1. Background — style from archetype, gradient mesh for depth\n * 1b. Layered background — archetype-coherent shapes\n * 2. Composition mode + symmetry\n * 3. Focal points + void zones + hero avoidance field\n * 4. Flow field\n * 4b. Hero shape\n * 5. Shape layers — palette-driven selection, affinity-aware styles,\n * size echo, tangent placement, atmospheric depth\n * 5b. Recursive nesting\n * 6. Flow lines — variable color, branching, pressure simulation\n * 6b. Symmetry mirroring\n * 7. Noise texture\n * 8. Vignette\n * 9. Organic connecting curves\n * 10. Post-processing — color grading, chromatic aberration, bloom\n */\nimport {\n SacredColorScheme,\n hexWithAlpha, jitterColorHSL,\n desaturate,\n shiftTemperature,\n luminance,\n enforceContrast,\n buildColorHierarchy,\n pickHierarchyColor, pickColorGrade,\n type ColorHierarchy\n} from \"./canvas/colors\";\nimport {\n enhanceShapeGeneration,\n pickBlendMode,\n pickRenderStyle,\n type RenderStyle,\n} from \"./canvas/draw\";\nimport { shapes } from \"./canvas/shapes\";\nimport {\n buildShapePalette,\n pickShapeFromPalette,\n pickStyleForShape,\n SHAPE_PROFILES\n} from \"./canvas/shapes/affinity\";\nimport { createRng, seedFromHash } from \"./utils\";\nimport { DEFAULT_CONFIG, type GenerationConfig } from \"../types\";\nimport { selectArchetype, type BackgroundStyle } from \"./archetypes\";\n\n\n// ── Shape categories for weighted selection (legacy fallback) ───────\n\nconst SACRED_SHAPES = [\n \"mandala\",\n \"flowerOfLife\",\n \"treeOfLife\",\n \"metatronsCube\",\n \"sriYantra\",\n \"seedOfLife\",\n \"vesicaPiscis\",\n \"torus\",\n \"eggOfLife\",\n];\n\n// ── Composition modes ───────────────────────────────────────────────\n\ntype CompositionMode =\n | \"radial\"\n | \"flow-field\"\n | \"spiral\"\n | \"grid-subdivision\"\n | \"clustered\";\n\nconst COMPOSITION_MODES: CompositionMode[] = [\n \"radial\",\n \"flow-field\",\n \"spiral\",\n \"grid-subdivision\",\n \"clustered\",\n];\n\n// ── Helper: get position based on composition mode ──────────────────\n\nfunction getCompositionPosition(\n mode: CompositionMode,\n rng: () => number,\n width: number,\n height: number,\n shapeIndex: number,\n totalShapes: number,\n cx: number,\n cy: number,\n): { x: number; y: number } {\n switch (mode) {\n case \"radial\": {\n const angle = rng() * Math.PI * 2;\n const maxR = Math.min(width, height) * 0.45;\n const r = Math.pow(rng(), 0.7) * maxR;\n return { x: cx + Math.cos(angle) * r, y: cy + Math.sin(angle) * r };\n }\n case \"spiral\": {\n const t = shapeIndex / totalShapes;\n const turns = 3 + rng() * 2;\n const angle = t * Math.PI * 2 * turns;\n const maxR = Math.min(width, height) * 0.42;\n const r = t * maxR + (rng() - 0.5) * maxR * 0.15;\n return { x: cx + Math.cos(angle) * r, y: cy + Math.sin(angle) * r };\n }\n case \"grid-subdivision\": {\n const cells = 3 + Math.floor(rng() * 3);\n const cellW = width / cells;\n const cellH = height / cells;\n const gx = Math.floor(rng() * cells);\n const gy = Math.floor(rng() * cells);\n return {\n x: gx * cellW + rng() * cellW,\n y: gy * cellH + rng() * cellH,\n };\n }\n case \"clustered\": {\n const numClusters = 3 + Math.floor(rng() * 3);\n const ci = Math.floor(rng() * numClusters);\n const clusterRng = createRng(seedFromHash(String(ci), 999));\n const clx = width * (0.15 + clusterRng() * 0.7);\n const cly = height * (0.15 + clusterRng() * 0.7);\n const spread = Math.min(width, height) * 0.18;\n return {\n x: clx + (rng() - 0.5) * spread * 2,\n y: cly + (rng() - 0.5) * spread * 2,\n };\n }\n case \"flow-field\":\n default: {\n return { x: rng() * width, y: rng() * height };\n }\n }\n}\n\n// ── Helper: positional color from hierarchy ─────────────────────────\n\nfunction getPositionalColor(\n x: number,\n y: number,\n width: number,\n height: number,\n hierarchy: ColorHierarchy,\n rng: () => number,\n): string {\n // Blend position into color selection — shapes near center lean dominant\n const distFromCenter = Math.hypot(x - width / 2, y - height / 2) /\n Math.hypot(width / 2, height / 2);\n // Center = more dominant, edges = more accent\n if (distFromCenter < 0.35) {\n return jitterColorHSL(hierarchy.dominant, rng, 10, 0.08);\n } else if (distFromCenter < 0.7) {\n return jitterColorHSL(pickHierarchyColor(hierarchy, rng), rng, 8, 0.06);\n } else {\n // Edges: bias toward secondary/accent\n const roll = rng();\n const color = roll < 0.4 ? hierarchy.secondary : roll < 0.75 ? hierarchy.accent : hierarchy.dominant;\n return jitterColorHSL(color, rng, 12, 0.08);\n }\n}\n\n// ── Helper: check if a position is inside a void zone ───────────────\n\nfunction isInVoidZone(\n x: number,\n y: number,\n voidZones: Array<{ x: number; y: number; radius: number }>,\n): boolean {\n for (const zone of voidZones) {\n if (Math.hypot(x - zone.x, y - zone.y) < zone.radius) return true;\n }\n return false;\n}\n\n// ── Helper: density check ───────────────────────────────────────────\n\nfunction localDensity(\n x: number,\n y: number,\n positions: Array<{ x: number; y: number; size: number }>,\n radius: number,\n): number {\n let count = 0;\n for (const p of positions) {\n if (Math.hypot(x - p.x, y - p.y) < radius) count++;\n }\n return count;\n}\n\n// ── Helper: draw background based on archetype style ────────────────\n\nfunction drawBackground(\n ctx: CanvasRenderingContext2D,\n style: BackgroundStyle,\n bgStart: string,\n bgEnd: string,\n width: number,\n height: number,\n cx: number,\n cy: number,\n bgRadius: number,\n rng: () => number,\n colors: string[],\n): void {\n switch (style) {\n case \"radial-light\": {\n const grad = ctx.createRadialGradient(cx, cy, 0, cx, cy, bgRadius);\n grad.addColorStop(0, \"#f0ece4\");\n grad.addColorStop(1, bgStart);\n ctx.fillStyle = grad;\n ctx.fillRect(0, 0, width, height);\n break;\n }\n case \"linear-horizontal\": {\n const grad = ctx.createLinearGradient(0, 0, width, 0);\n grad.addColorStop(0, bgStart);\n grad.addColorStop(1, bgEnd);\n ctx.fillStyle = grad;\n ctx.fillRect(0, 0, width, height);\n break;\n }\n case \"linear-diagonal\": {\n const grad = ctx.createLinearGradient(0, 0, width, height);\n grad.addColorStop(0, bgStart);\n grad.addColorStop(0.5, bgEnd);\n grad.addColorStop(1, bgStart);\n ctx.fillStyle = grad;\n ctx.fillRect(0, 0, width, height);\n break;\n }\n case \"solid-dark\": {\n ctx.fillStyle = bgStart;\n ctx.fillRect(0, 0, width, height);\n break;\n }\n case \"solid-light\": {\n ctx.fillStyle = \"#f5f2eb\";\n ctx.fillRect(0, 0, width, height);\n break;\n }\n case \"multi-stop\": {\n const grad = ctx.createLinearGradient(0, 0, width * 0.7, height);\n grad.addColorStop(0, bgStart);\n grad.addColorStop(0.33, bgEnd);\n if (colors.length > 0) {\n const midColor = hexWithAlpha(colors[0], 1).replace(/rgba\\((\\d+),(\\d+),(\\d+),[^)]+\\)/, (_, r, g, b) => {\n const darken = (v: string) => Math.round(parseInt(v) * 0.4).toString(16).padStart(2, \"0\");\n return `#${darken(r)}${darken(g)}${darken(b)}`;\n });\n grad.addColorStop(0.66, midColor);\n }\n grad.addColorStop(1, bgStart);\n ctx.fillStyle = grad;\n ctx.fillRect(0, 0, width, height);\n break;\n }\n case \"radial-dark\":\n default: {\n const grad = ctx.createRadialGradient(cx, cy, 0, cx, cy, bgRadius);\n grad.addColorStop(0, bgStart);\n grad.addColorStop(1, bgEnd);\n ctx.fillStyle = grad;\n ctx.fillRect(0, 0, width, height);\n break;\n }\n }\n}\n\n// ── Main render function ────────────────────────────────────────────\n\nexport function renderHashArt(\n ctx: CanvasRenderingContext2D,\n gitHash: string,\n config: Partial<GenerationConfig> = {},\n): void {\n const finalConfig: GenerationConfig = { ...DEFAULT_CONFIG, ...config };\n\n const rng = createRng(seedFromHash(gitHash));\n\n // ── 0. Select archetype — fundamentally different visual personality ──\n const archetype = selectArchetype(rng);\n\n // Archetype overrides defaults, but explicit user config wins\n const {\n width,\n height,\n } = finalConfig;\n const gridSize = config.gridSize ?? archetype.gridSize;\n const layers = config.layers ?? archetype.layers;\n const minShapeSize = config.minShapeSize ?? archetype.minShapeSize;\n const maxShapeSize = config.maxShapeSize ?? archetype.maxShapeSize;\n const baseOpacity = config.baseOpacity ?? archetype.baseOpacity;\n const opacityReduction = config.opacityReduction ?? archetype.opacityReduction;\n\n const shapesPerLayer =\n finalConfig.shapesPerLayer || Math.floor(gridSize * gridSize * 1.5);\n\n const colorScheme = new SacredColorScheme(gitHash);\n const colors = colorScheme.getColorsByMode(archetype.paletteMode);\n const [bgStart, bgEnd] = colorScheme.getBackgroundColorsByMode(archetype.paletteMode);\n const tempMode = colorScheme.getTemperatureMode();\n const fgTempTarget: \"warm\" | \"cool\" | null =\n tempMode === \"warm-bg\" ? \"cool\" : tempMode === \"cool-bg\" ? \"warm\" : null;\n\n // ── 0b. Color hierarchy — dominant/secondary/accent weighting ──\n const colorHierarchy = buildColorHierarchy(colors, rng);\n\n // ── 0c. Shape palette — curated shapes that work well together ──\n const shapeNames = Object.keys(shapes);\n const shapePalette = buildShapePalette(rng, shapeNames, archetype.name);\n\n // ── 0d. Color grading — unified tone for the whole image ───────\n const colorGrade = pickColorGrade(rng);\n\n // ── 0e. Light direction — consistent shadow angle ──────────────\n const lightAngle = rng() * Math.PI * 2;\n\n const scaleFactor = Math.min(width, height) / 1024;\n const adjustedMinSize = minShapeSize * scaleFactor;\n const adjustedMaxSize = maxShapeSize * scaleFactor;\n\n const cx = width / 2;\n const cy = height / 2;\n\n // ── 1. Background ──────────────────────────────────────────────\n const bgRadius = Math.hypot(cx, cy);\n drawBackground(ctx, archetype.backgroundStyle, bgStart, bgEnd, width, height, cx, cy, bgRadius, rng, colors);\n\n // Gradient mesh overlay — 3-4 color control points for richer backgrounds\n const meshPoints = 3 + Math.floor(rng() * 2);\n ctx.globalCompositeOperation = \"soft-light\";\n for (let i = 0; i < meshPoints; i++) {\n const mx = rng() * width;\n const my = rng() * height;\n const mRadius = Math.min(width, height) * (0.3 + rng() * 0.4);\n const mColor = pickHierarchyColor(colorHierarchy, rng);\n const grad = ctx.createRadialGradient(mx, my, 0, mx, my, mRadius);\n grad.addColorStop(0, hexWithAlpha(mColor, 0.08 + rng() * 0.06));\n grad.addColorStop(1, \"rgba(0,0,0,0)\");\n ctx.globalAlpha = 1;\n ctx.fillStyle = grad;\n ctx.fillRect(0, 0, width, height);\n }\n ctx.globalCompositeOperation = \"source-over\";\n\n // Compute average background luminance for contrast enforcement\n const bgLum = (luminance(bgStart) + luminance(bgEnd)) / 2;\n\n // ── 1b. Layered background — archetype-coherent shapes ─────────\n const bgShapeCount = 3 + Math.floor(rng() * 4);\n ctx.globalCompositeOperation = \"soft-light\";\n for (let i = 0; i < bgShapeCount; i++) {\n const bx = rng() * width;\n const by = rng() * height;\n const bSize = (width * 0.3 + rng() * width * 0.5);\n const bColor = pickHierarchyColor(colorHierarchy, rng);\n ctx.globalAlpha = 0.03 + rng() * 0.05;\n ctx.fillStyle = hexWithAlpha(bColor, 0.15);\n ctx.beginPath();\n // Use archetype-appropriate background shapes\n if (archetype.name === \"geometric-precision\" || archetype.name === \"op-art\") {\n // Rectangular shapes for geometric archetypes\n ctx.rect(bx - bSize / 2, by - bSize / 2, bSize, bSize * (0.5 + rng() * 0.5));\n } else {\n ctx.arc(bx, by, bSize / 2, 0, Math.PI * 2);\n }\n ctx.fill();\n }\n // Subtle concentric rings from center\n const ringCount = 2 + Math.floor(rng() * 3);\n ctx.globalAlpha = 0.02 + rng() * 0.03;\n ctx.strokeStyle = hexWithAlpha(colorHierarchy.dominant, 0.1);\n ctx.lineWidth = 1 * scaleFactor;\n for (let i = 1; i <= ringCount; i++) {\n const r = (Math.min(width, height) * 0.15) * i;\n ctx.beginPath();\n ctx.arc(cx, cy, r, 0, Math.PI * 2);\n ctx.stroke();\n }\n ctx.globalCompositeOperation = \"source-over\";\n\n // ── 2. Composition mode ────────────────────────────────────────\n const compositionMode =\n COMPOSITION_MODES[Math.floor(rng() * COMPOSITION_MODES.length)];\n\n // ── 2b. Symmetry mode — ~25% of hashes trigger mirroring ──────\n type SymmetryMode = \"none\" | \"bilateral-x\" | \"bilateral-y\" | \"quad\";\n const symRoll = rng();\n const symmetryMode: SymmetryMode =\n symRoll < 0.10 ? \"bilateral-x\" :\n symRoll < 0.20 ? \"bilateral-y\" :\n symRoll < 0.25 ? \"quad\" : \"none\";\n\n // ── 3. Focal points + void zones ───────────────────────────────\n const THIRDS_POINTS = [\n { x: 1 / 3, y: 1 / 3 },\n { x: 2 / 3, y: 1 / 3 },\n { x: 1 / 3, y: 2 / 3 },\n { x: 2 / 3, y: 2 / 3 },\n ];\n const numFocal = 1 + Math.floor(rng() * 2);\n const focalPoints: Array<{ x: number; y: number; strength: number }> = [];\n for (let f = 0; f < numFocal; f++) {\n if (rng() < 0.7) {\n const tp = THIRDS_POINTS[Math.floor(rng() * THIRDS_POINTS.length)];\n focalPoints.push({\n x: width * (tp.x + (rng() - 0.5) * 0.08),\n y: height * (tp.y + (rng() - 0.5) * 0.08),\n strength: 0.3 + rng() * 0.4,\n });\n } else {\n focalPoints.push({\n x: width * (0.2 + rng() * 0.6),\n y: height * (0.2 + rng() * 0.6),\n strength: 0.3 + rng() * 0.4,\n });\n }\n }\n\n const numVoids = Math.floor(rng() * 2) + 1;\n const voidZones: Array<{ x: number; y: number; radius: number }> = [];\n for (let v = 0; v < numVoids; v++) {\n voidZones.push({\n x: width * (0.15 + rng() * 0.7),\n y: height * (0.15 + rng() * 0.7),\n radius: Math.min(width, height) * (0.06 + rng() * 0.1),\n });\n }\n\n function applyFocalBias(rx: number, ry: number): [number, number] {\n let nearest = focalPoints[0];\n let minDist = Infinity;\n for (const fp of focalPoints) {\n const d = Math.hypot(rx - fp.x, ry - fp.y);\n if (d < minDist) {\n minDist = d;\n nearest = fp;\n }\n }\n const pull = nearest.strength * rng() * 0.5;\n return [rx + (nearest.x - rx) * pull, ry + (nearest.y - ry) * pull];\n }\n\n // ── 4. Flow field seed values ──────────────────────────────────\n const fieldAngleBase = rng() * Math.PI * 2;\n const fieldFreq = 0.5 + rng() * 2;\n\n function flowAngle(x: number, y: number): number {\n return (\n fieldAngleBase +\n Math.sin((x / width) * fieldFreq * Math.PI * 2) * Math.PI * 0.5 +\n Math.cos((y / height) * fieldFreq * Math.PI * 2) * Math.PI * 0.5\n );\n }\n\n // Track all placed shapes for density checks and connecting curves\n const shapePositions: Array<{ x: number; y: number; size: number; shape: string }> = [];\n\n // Hero avoidance radius — shapes near the hero orient toward it\n let heroCenter: { x: number; y: number; size: number } | null = null;\n\n // ── 4b. Hero shape — a dominant focal element ───────────────────\n if (archetype.heroShape && rng() < 0.6) {\n const heroFocal = focalPoints[0];\n // Use shape palette hero candidates\n const heroPool = [...shapePalette.primary, ...shapePalette.supporting]\n .filter((s) => SHAPE_PROFILES[s]?.heroCandidate && shapeNames.includes(s));\n const heroShape = heroPool.length > 0\n ? heroPool[Math.floor(rng() * heroPool.length)]\n : shapeNames[Math.floor(rng() * shapeNames.length)];\n\n const heroSize = adjustedMaxSize * (0.8 + rng() * 0.5);\n const heroRotation = rng() * 360;\n const heroFill = hexWithAlpha(\n enforceContrast(jitterColorHSL(colorHierarchy.dominant, rng, 6, 0.05), bgLum),\n 0.15 + rng() * 0.2,\n );\n const heroStroke = enforceContrast(jitterColorHSL(colorHierarchy.accent, rng, 6, 0.05), bgLum);\n\n // Get best style for this hero shape\n const heroProfile = SHAPE_PROFILES[heroShape];\n const heroStyle: RenderStyle = heroProfile\n ? (heroProfile.bestStyles[Math.floor(rng() * heroProfile.bestStyles.length)] as RenderStyle)\n : (rng() < 0.4 ? \"watercolor\" : \"fill-and-stroke\");\n\n ctx.globalAlpha = 0.5 + rng() * 0.2;\n enhanceShapeGeneration(ctx, heroShape, heroFocal.x, heroFocal.y, {\n fillColor: heroFill,\n strokeColor: heroStroke,\n strokeWidth: (1.5 + rng() * 2) * scaleFactor,\n size: heroSize,\n rotation: heroRotation,\n proportionType: \"GOLDEN_RATIO\",\n glowRadius: (12 + rng() * 20) * scaleFactor,\n glowColor: hexWithAlpha(heroStroke, 0.4),\n gradientFillEnd: jitterColorHSL(colorHierarchy.secondary, rng, 10, 0.1),\n renderStyle: heroStyle,\n rng,\n });\n\n heroCenter = { x: heroFocal.x, y: heroFocal.y, size: heroSize };\n shapePositions.push({ x: heroFocal.x, y: heroFocal.y, size: heroSize, shape: heroShape });\n }\n\n\n // ── 5. Shape layers ────────────────────────────────────────────\n const densityCheckRadius = Math.min(width, height) * 0.08;\n const maxLocalDensity = Math.ceil(shapesPerLayer * 0.15);\n\n for (let layer = 0; layer < layers; layer++) {\n const layerRatio = layers > 1 ? layer / (layers - 1) : 0;\n const numShapes =\n shapesPerLayer +\n Math.floor(rng() * shapesPerLayer * 0.3);\n const layerOpacity = Math.max(0.15, baseOpacity - layer * opacityReduction);\n const layerSizeScale = 1 - layer * 0.15;\n\n // Per-layer blend mode\n const layerBlend = pickBlendMode(rng);\n ctx.globalCompositeOperation = layerBlend;\n\n // Per-layer render style bias — prefer archetype styles\n const layerRenderStyle: RenderStyle = rng() < 0.6\n ? archetype.preferredStyles[Math.floor(rng() * archetype.preferredStyles.length)]\n : pickRenderStyle(rng);\n\n // Atmospheric desaturation for later layers\n const atmosphericDesat = layerRatio * 0.3;\n\n for (let i = 0; i < numShapes; i++) {\n // Position from composition mode, then focal bias\n const rawPos = getCompositionPosition(\n compositionMode,\n rng,\n width,\n height,\n i,\n numShapes,\n cx,\n cy,\n );\n const [x, y] = applyFocalBias(rawPos.x, rawPos.y);\n\n // Skip shapes in void zones, reduce in dense areas\n if (isInVoidZone(x, y, voidZones)) {\n if (rng() < 0.85) continue;\n }\n if (localDensity(x, y, shapePositions, densityCheckRadius) > maxLocalDensity) {\n if (rng() < 0.6) continue;\n }\n\n // Power distribution for size — archetype controls the curve\n const sizeT = Math.pow(rng(), archetype.sizePower);\n const size =\n (adjustedMinSize + sizeT * (adjustedMaxSize - adjustedMinSize)) *\n layerSizeScale;\n\n // Size fraction for affinity-aware shape selection\n const sizeFraction = size / adjustedMaxSize;\n\n // Palette-driven shape selection (replaces naive pickShape)\n const shape = pickShapeFromPalette(shapePalette, rng, sizeFraction);\n\n // Flow-field rotation in flow-field mode, random otherwise\n let rotation =\n compositionMode === \"flow-field\"\n ? (flowAngle(x, y) * 180) / Math.PI + (rng() - 0.5) * 30\n : rng() * 360;\n\n // Hero avoidance: shapes near the hero orient toward it\n if (heroCenter) {\n const distToHero = Math.hypot(x - heroCenter.x, y - heroCenter.y);\n const heroInfluence = heroCenter.size * 1.5;\n if (distToHero < heroInfluence && distToHero > 0) {\n const angleToHero = Math.atan2(heroCenter.y - y, heroCenter.x - x) * 180 / Math.PI;\n const blendFactor = 1 - (distToHero / heroInfluence);\n rotation = rotation + (angleToHero - rotation) * blendFactor * 0.4;\n }\n }\n\n // Positional color from hierarchy + jitter\n let fillBase = getPositionalColor(x, y, width, height, colorHierarchy, rng);\n const strokeBase = pickHierarchyColor(colorHierarchy, rng);\n\n // Desaturate colors on later layers for depth\n if (atmosphericDesat > 0) {\n fillBase = desaturate(fillBase, atmosphericDesat);\n }\n\n // Temperature contrast: shift foreground shapes opposite to background\n if (fgTempTarget) {\n fillBase = shiftTemperature(fillBase, fgTempTarget, 0.15 + layerRatio * 0.1);\n }\n\n const fillColor = enforceContrast(jitterColorHSL(fillBase, rng, 6, 0.05), bgLum);\n const strokeColor = enforceContrast(jitterColorHSL(strokeBase, rng, 5, 0.04), bgLum);\n\n // Semi-transparent fill\n const fillAlpha = 0.2 + rng() * 0.5;\n const transparentFill = hexWithAlpha(fillColor, fillAlpha);\n\n const strokeWidth = (0.5 + rng() * 2.0) * scaleFactor;\n\n ctx.globalAlpha = layerOpacity * (0.5 + rng() * 0.5);\n\n // Glow on sacred shapes more often — scaled by archetype\n const isSacred = SACRED_SHAPES.includes(shape);\n const baseGlowChance = isSacred ? 0.45 : 0.2;\n const glowChance = baseGlowChance * archetype.glowMultiplier;\n const hasGlow = rng() < glowChance;\n const glowRadius = hasGlow ? (8 + rng() * 20) * scaleFactor : 0;\n\n // Gradient fill on ~30%\n const hasGradient = rng() < 0.3;\n const gradientEnd = hasGradient\n ? jitterColorHSL(pickHierarchyColor(colorHierarchy, rng), rng, 10, 0.1)\n : undefined;\n\n // Affinity-aware render style selection\n const shapeRenderStyle = pickStyleForShape(shape, layerRenderStyle, rng) as RenderStyle;\n\n // Organic edge jitter — applied via watercolor style on ~15% of shapes\n const useOrganicEdges = rng() < 0.15 && shapeRenderStyle === \"fill-and-stroke\";\n const finalRenderStyle = useOrganicEdges ? \"watercolor\" as RenderStyle : shapeRenderStyle;\n\n // Consistent light direction — subtle shadow offset\n const shadowDist = hasGlow ? 0 : (size * 0.02);\n const shadowOffX = shadowDist * Math.cos(lightAngle);\n const shadowOffY = shadowDist * Math.sin(lightAngle);\n\n enhanceShapeGeneration(ctx, shape, x, y, {\n fillColor: transparentFill,\n strokeColor,\n strokeWidth,\n size,\n rotation,\n proportionType: \"GOLDEN_RATIO\",\n glowRadius: glowRadius || (shadowDist > 0 ? shadowDist * 2 : 0),\n glowColor: hasGlow\n ? hexWithAlpha(fillColor, 0.6)\n : (shadowDist > 0 ? \"rgba(0,0,0,0.08)\" : undefined),\n gradientFillEnd: gradientEnd,\n renderStyle: finalRenderStyle,\n rng,\n });\n\n shapePositions.push({ x, y, size, shape });\n\n // ── 5b. Size echo — large shapes spawn trailing smaller copies ──\n if (size > adjustedMaxSize * 0.5 && rng() < 0.2) {\n const echoCount = 2 + Math.floor(rng() * 2);\n const echoAngle = rng() * Math.PI * 2;\n for (let e = 0; e < echoCount; e++) {\n const echoScale = 0.3 - e * 0.08;\n const echoDist = size * (0.6 + e * 0.4);\n const echoX = x + Math.cos(echoAngle) * echoDist;\n const echoY = y + Math.sin(echoAngle) * echoDist;\n const echoSize = size * Math.max(0.1, echoScale);\n\n if (echoX < 0 || echoX > width || echoY < 0 || echoY > height) continue;\n\n ctx.globalAlpha = layerOpacity * (0.4 - e * 0.1);\n enhanceShapeGeneration(ctx, shape, echoX, echoY, {\n fillColor: hexWithAlpha(fillColor, fillAlpha * 0.6),\n strokeColor: hexWithAlpha(strokeColor, 0.4),\n strokeWidth: strokeWidth * 0.6,\n size: echoSize,\n rotation: rotation + (e + 1) * 15,\n proportionType: \"GOLDEN_RATIO\",\n renderStyle: finalRenderStyle,\n rng,\n });\n shapePositions.push({ x: echoX, y: echoY, size: echoSize, shape });\n }\n }\n\n // ── 5c. Recursive nesting ──────────────────────────────────\n if (size > adjustedMaxSize * 0.4 && rng() < 0.15) {\n const innerCount = 1 + Math.floor(rng() * 3);\n for (let n = 0; n < innerCount; n++) {\n // Pick inner shape from palette affinities\n const innerSizeFraction = (size * 0.25) / adjustedMaxSize;\n const innerShape = pickShapeFromPalette(shapePalette, rng, innerSizeFraction);\n const innerSize = size * (0.15 + rng() * 0.25);\n const innerOffX = (rng() - 0.5) * size * 0.4;\n const innerOffY = (rng() - 0.5) * size * 0.4;\n const innerRot = rng() * 360;\n const innerFill = hexWithAlpha(\n jitterColorHSL(pickHierarchyColor(colorHierarchy, rng), rng, 10, 0.1),\n 0.3 + rng() * 0.4,\n );\n\n ctx.globalAlpha = layerOpacity * 0.7;\n enhanceShapeGeneration(\n ctx,\n innerShape,\n x + innerOffX,\n y + innerOffY,\n {\n fillColor: innerFill,\n strokeColor: hexWithAlpha(strokeColor, 0.5),\n strokeWidth: strokeWidth * 0.6,\n size: innerSize,\n rotation: innerRot,\n proportionType: \"GOLDEN_RATIO\",\n renderStyle: pickStyleForShape(innerShape, layerRenderStyle, rng) as RenderStyle,\n rng,\n },\n );\n }\n }\n }\n }\n\n // Reset blend mode for post-processing passes\n ctx.globalCompositeOperation = \"source-over\";\n\n\n // ── 6. Flow-line pass — variable color, branching, pressure ────\n const baseFlowLines = 6 + Math.floor(rng() * 10);\n const numFlowLines = Math.round(baseFlowLines * archetype.flowLineMultiplier);\n\n for (let i = 0; i < numFlowLines; i++) {\n let fx = rng() * width;\n let fy = rng() * height;\n const steps = 30 + Math.floor(rng() * 40);\n const stepLen = (3 + rng() * 5) * scaleFactor;\n const startWidth = (1 + rng() * 3) * scaleFactor;\n\n // Variable color: interpolate between two hierarchy colors along the stroke\n const lineColorStart = enforceContrast(pickHierarchyColor(colorHierarchy, rng), bgLum);\n const lineColorEnd = enforceContrast(pickHierarchyColor(colorHierarchy, rng), bgLum);\n const lineAlpha = 0.06 + rng() * 0.1;\n\n // Pressure simulation: sinusoidal width variation\n const pressureFreq = 2 + rng() * 4;\n const pressurePhase = rng() * Math.PI * 2;\n\n let prevX = fx;\n let prevY = fy;\n for (let s = 0; s < steps; s++) {\n const angle = flowAngle(fx, fy) + (rng() - 0.5) * 0.3;\n fx += Math.cos(angle) * stepLen;\n fy += Math.sin(angle) * stepLen;\n\n if (fx < 0 || fx > width || fy < 0 || fy > height) break;\n\n const t = s / steps;\n // Taper + pressure\n const taper = 1 - t * 0.8;\n const pressure = 0.6 + 0.4 * Math.sin(t * pressureFreq * Math.PI + pressurePhase);\n\n ctx.globalAlpha = lineAlpha * taper;\n // Interpolate color along stroke\n const lineColor = t < 0.5\n ? hexWithAlpha(lineColorStart, 0.4 + t * 0.2)\n : hexWithAlpha(lineColorEnd, 0.4 + (1 - t) * 0.2);\n ctx.strokeStyle = lineColor;\n ctx.lineWidth = startWidth * taper * pressure;\n ctx.lineCap = \"round\";\n\n ctx.beginPath();\n ctx.moveTo(prevX, prevY);\n ctx.lineTo(fx, fy);\n ctx.stroke();\n\n // Branching: ~12% chance per step to spawn a thinner child stroke\n if (rng() < 0.12 && s > 5 && s < steps - 10) {\n const branchAngle = angle + (rng() < 0.5 ? 1 : -1) * (0.3 + rng() * 0.5);\n let bx = fx;\n let by = fy;\n let bPrevX = fx;\n let bPrevY = fy;\n const branchSteps = 5 + Math.floor(rng() * 10);\n const branchWidth = startWidth * taper * 0.4;\n for (let bs = 0; bs < branchSteps; bs++) {\n const bAngle = branchAngle + (rng() - 0.5) * 0.2;\n bx += Math.cos(bAngle) * stepLen * 0.8;\n by += Math.sin(bAngle) * stepLen * 0.8;\n if (bx < 0 || bx > width || by < 0 || by > height) break;\n const bTaper = 1 - (bs / branchSteps) * 0.9;\n ctx.globalAlpha = lineAlpha * taper * bTaper * 0.6;\n ctx.lineWidth = branchWidth * bTaper;\n ctx.beginPath();\n ctx.moveTo(bPrevX, bPrevY);\n ctx.lineTo(bx, by);\n ctx.stroke();\n bPrevX = bx;\n bPrevY = by;\n }\n }\n\n prevX = fx;\n prevY = fy;\n }\n }\n\n // ── 6b. Apply symmetry mirroring ─────────────────────────────────\n if (symmetryMode !== \"none\") {\n const canvas = ctx.canvas;\n ctx.save();\n if (symmetryMode === \"bilateral-x\" || symmetryMode === \"quad\") {\n ctx.save();\n ctx.translate(width, 0);\n ctx.scale(-1, 1);\n ctx.drawImage(canvas, 0, 0, Math.ceil(cx), height, 0, 0, Math.ceil(cx), height);\n ctx.restore();\n }\n if (symmetryMode === \"bilateral-y\" || symmetryMode === \"quad\") {\n ctx.save();\n ctx.translate(0, height);\n ctx.scale(1, -1);\n ctx.drawImage(canvas, 0, 0, width, Math.ceil(cy), 0, 0, width, Math.ceil(cy));\n ctx.restore();\n }\n ctx.restore();\n }\n\n\n // ── 7. Noise texture overlay ───────────────────────────────────\n const noiseRng = createRng(seedFromHash(gitHash, 777));\n const noiseDensity = Math.floor((width * height) / 800);\n for (let i = 0; i < noiseDensity; i++) {\n const nx = noiseRng() * width;\n const ny = noiseRng() * height;\n const brightness = noiseRng() > 0.5 ? 255 : 0;\n const alpha = 0.01 + noiseRng() * 0.03;\n ctx.globalAlpha = alpha;\n ctx.fillStyle = `rgba(${brightness},${brightness},${brightness},1)`;\n ctx.fillRect(nx, ny, 1 * scaleFactor, 1 * scaleFactor);\n }\n\n // ── 8. Vignette — darken edges to draw the eye inward ───────────\n ctx.globalAlpha = 1;\n const vignetteStrength = 0.25 + rng() * 0.2;\n const vigGrad = ctx.createRadialGradient(cx, cy, Math.min(width, height) * 0.3, cx, cy, bgRadius);\n vigGrad.addColorStop(0, \"rgba(0,0,0,0)\");\n vigGrad.addColorStop(0.6, \"rgba(0,0,0,0)\");\n vigGrad.addColorStop(1, `rgba(0,0,0,${vignetteStrength.toFixed(3)})`);\n ctx.fillStyle = vigGrad;\n ctx.fillRect(0, 0, width, height);\n\n // ── 9. Organic connecting curves ───────────────────────────────\n if (shapePositions.length > 1) {\n const numCurves = Math.floor((8 * (width * height)) / (1024 * 1024));\n ctx.lineWidth = 0.8 * scaleFactor;\n\n for (let i = 0; i < numCurves; i++) {\n const idxA = Math.floor(rng() * shapePositions.length);\n const offset =\n 1 + Math.floor(rng() * Math.min(5, shapePositions.length - 1));\n const idxB = (idxA + offset) % shapePositions.length;\n\n const a = shapePositions[idxA];\n const b = shapePositions[idxB];\n\n const mx = (a.x + b.x) / 2;\n const my = (a.y + b.y) / 2;\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const dist = Math.hypot(dx, dy);\n const bulge = (rng() - 0.5) * dist * 0.4;\n\n const cpx = mx + (-dy / (dist || 1)) * bulge;\n const cpy = my + (dx / (dist || 1)) * bulge;\n\n ctx.globalAlpha = 0.06 + rng() * 0.1;\n ctx.strokeStyle = hexWithAlpha(\n enforceContrast(pickHierarchyColor(colorHierarchy, rng), bgLum),\n 0.3,\n );\n\n ctx.beginPath();\n ctx.moveTo(a.x, a.y);\n ctx.quadraticCurveTo(cpx, cpy, b.x, b.y);\n ctx.stroke();\n }\n }\n\n // ── 10. Post-processing ────────────────────────────────────────\n\n // 10a. Color grading — unified tone across the whole image\n // Apply as a semi-transparent overlay in the grade hue\n ctx.globalAlpha = colorGrade.intensity * 0.25;\n ctx.globalCompositeOperation = \"soft-light\";\n const gradeHsl = `hsl(${Math.round(colorGrade.hue)}, 40%, 50%)`;\n ctx.fillStyle = gradeHsl;\n ctx.fillRect(0, 0, width, height);\n ctx.globalCompositeOperation = \"source-over\";\n\n // 10b. Chromatic aberration — subtle RGB channel offset at edges\n // Only apply for neon/cosmic/ethereal archetypes where it fits\n const chromaArchetypes = [\"neon-glow\", \"cosmic\", \"ethereal\"];\n if (chromaArchetypes.includes(archetype.name)) {\n const chromaOffset = Math.ceil(2 * scaleFactor);\n const canvas = ctx.canvas;\n // Shift red channel slightly\n ctx.globalAlpha = 0.03;\n ctx.globalCompositeOperation = \"screen\";\n ctx.drawImage(canvas, chromaOffset, 0, width, height, 0, 0, width, height);\n // Shift blue channel opposite\n ctx.drawImage(canvas, -chromaOffset, 0, width, height, 0, 0, width, height);\n ctx.globalCompositeOperation = \"source-over\";\n }\n\n // 10c. Bloom — soft glow on bright areas for neon/cosmic archetypes\n const bloomArchetypes = [\"neon-glow\", \"cosmic\"];\n if (bloomArchetypes.includes(archetype.name)) {\n const canvas = ctx.canvas;\n ctx.globalAlpha = 0.08;\n ctx.globalCompositeOperation = \"screen\";\n // Draw the image slightly scaled up and blurred via shadow\n ctx.save();\n ctx.shadowBlur = 30 * scaleFactor;\n ctx.shadowColor = \"rgba(255,255,255,0.3)\";\n ctx.drawImage(canvas, 0, 0, width, height);\n ctx.restore();\n ctx.globalCompositeOperation = \"source-over\";\n }\n\n ctx.globalAlpha = 1;\n\n}\n","import ColorScheme from \"color-scheme\";\nimport \"../../../global.d\";\n\nimport { gitHashToSeed, createRng, seedFromHash } from \"../utils\";\n\n// ── Color variation modes ───────────────────────────────────────────\n// The hash deterministically selects a variation, producing dramatically\n// different palettes from the same hue.\n\nconst COLOR_VARIATIONS = [\n \"soft\",\n \"hard\",\n \"pastel\",\n \"light\",\n \"pale\",\n \"default\",\n] as const;\ntype ColorVariation = (typeof COLOR_VARIATIONS)[number];\n\n/**\n * Pick a color variation mode deterministically from a seed.\n */\nfunction pickVariation(seed: number): ColorVariation {\n return COLOR_VARIATIONS[Math.abs(seed) % COLOR_VARIATIONS.length];\n}\n\n/**\n * Scheme type also varies — some hashes get near-monochromatic palettes,\n * others get high-contrast complementary schemes.\n */\nconst SCHEME_TYPES = [\n \"analogic\",\n \"mono\",\n \"contrast\",\n \"triade\",\n \"tetrade\",\n] as const;\ntype SchemeType = (typeof SCHEME_TYPES)[number];\n\nfunction pickSchemeType(seed: number): SchemeType {\n return SCHEME_TYPES[Math.abs(seed >> 4) % SCHEME_TYPES.length];\n}\n\n\n// ── Temperature contrast ─────────────────────────────────────────\n// Warm hues: 0-60 (red-yellow) and 300-360 (magenta-red)\n// Cool hues: 150-270 (cyan-blue-purple)\n// Neutral: everything else\n\ntype TemperatureMode = \"warm-bg\" | \"cool-bg\" | \"neutral\";\n\nfunction classifyHue(hue: number): \"warm\" | \"cool\" | \"neutral\" {\n if ((hue >= 0 && hue <= 60) || hue >= 300) return \"warm\";\n if (hue >= 150 && hue <= 270) return \"cool\";\n return \"neutral\";\n}\n\n/**\n * Shift a hue toward a target temperature zone.\n * Returns a new hue biased warm or cool.\n */\nfunction shiftHueToward(hue: number, target: \"warm\" | \"cool\", amount: number): number {\n if (target === \"warm\") {\n // Pull toward 30 (orange) — the warmest point\n const warmTarget = 30;\n const diff = ((warmTarget - hue + 540) % 360) - 180;\n return (hue + diff * amount + 360) % 360;\n } else {\n // Pull toward 210 (blue) — the coolest point\n const coolTarget = 210;\n const diff = ((coolTarget - hue + 540) % 360) - 180;\n return (hue + diff * amount + 360) % 360;\n }\n}\n\n// Enhanced color scheme generation for sacred geometry\nexport class SacredColorScheme {\n private seed: number;\n private rng: () => number;\n private variation: ColorVariation;\n private schemeType: SchemeType;\n private temperatureMode: TemperatureMode;\n public baseScheme: string[];\n private complementaryScheme: string[];\n private triadicScheme: string[];\n\n constructor(gitHash: string) {\n this.seed = gitHashToSeed(gitHash);\n this.rng = createRng(seedFromHash(gitHash, 42));\n // Hash-driven variation and scheme type for palette diversity\n this.variation = pickVariation(this.seed);\n this.schemeType = pickSchemeType(this.seed);\n // ~40% warm-bg, ~40% cool-bg, ~20% neutral (no temperature bias)\n const tempRoll = this.rng();\n this.temperatureMode = tempRoll < 0.4 ? \"warm-bg\" : tempRoll < 0.8 ? \"cool-bg\" : \"neutral\";\n this.baseScheme = this.generateBaseScheme();\n this.complementaryScheme = this.generateComplementaryScheme();\n this.triadicScheme = this.generateTriadicScheme();\n }\n\n private generateBaseScheme(): string[] {\n const scheme = new ColorScheme();\n return scheme\n .from_hue(this.seed % 360)\n .scheme(this.schemeType)\n .variation(this.variation)\n .colors()\n .map((hex: string) => `#${hex}`);\n }\n\n private generateComplementaryScheme(): string[] {\n const complementaryHue = (this.seed + 180) % 360;\n // Complementary uses a contrasting variation for tension\n const compVariation =\n this.variation === \"soft\" ? \"hard\" : this.variation === \"pale\" ? \"light\" : this.variation;\n const scheme = new ColorScheme();\n return scheme\n .from_hue(complementaryHue)\n .scheme(\"mono\")\n .variation(compVariation)\n .colors()\n .map((hex: string) => `#${hex}`);\n }\n\n private generateTriadicScheme(): string[] {\n const triadicHue = (this.seed + 120) % 360;\n const scheme = new ColorScheme();\n return scheme\n .from_hue(triadicHue)\n .scheme(\"triade\")\n .variation(this.variation)\n .colors()\n .map((hex: string) => `#${hex}`);\n }\n\n /**\n * Returns a flat array of hash-derived colors suitable for art generation.\n * Combines base analogic, complementary, and triadic schemes for variety\n * while maintaining color harmony.\n */\n getColors(): string[] {\n // Deduplicate and return a rich palette\n const all = [\n ...this.baseScheme.slice(0, 4),\n ...this.complementaryScheme.slice(0, 2),\n ...this.triadicScheme.slice(0, 2),\n ];\n return [...new Set(all)];\n }\n\n /**\n * Returns a palette shaped by the given palette mode.\n * Falls back to getColors() for \"harmonious\".\n */\n getColorsByMode(mode: string): string[] {\n const baseHue = this.seed % 360;\n switch (mode) {\n case \"monochrome\": {\n // Single hue, 5 lightness steps\n const s = 0.5 + this.rng() * 0.3;\n return [0.15, 0.3, 0.45, 0.6, 0.75].map((l) =>\n hslToHex(baseHue, s, l),\n );\n }\n case \"duotone\": {\n // Two contrasting colors + tints\n const hue2 = (baseHue + 150 + this.rng() * 60) % 360;\n return [\n hslToHex(baseHue, 0.7, 0.5),\n hslToHex(baseHue, 0.6, 0.7),\n hslToHex(hue2, 0.7, 0.5),\n hslToHex(hue2, 0.6, 0.7),\n ];\n }\n case \"neon\": {\n // High saturation, vivid colors\n const hues = [baseHue, (baseHue + 90) % 360, (baseHue + 180) % 360, (baseHue + 270) % 360];\n return hues.map((h) => hslToHex(h, 1.0, 0.55 + this.rng() * 0.1));\n }\n case \"pastel-light\": {\n // Soft pastels\n const hues = [baseHue, (baseHue + 60) % 360, (baseHue + 120) % 360, (baseHue + 200) % 360];\n return hues.map((h) => hslToHex(h, 0.4 + this.rng() * 0.2, 0.75 + this.rng() * 0.1));\n }\n case \"earth\": {\n // Warm muted naturals: browns, olives, terracotta, sage\n const earthHues = [25, 35, 45, 80, 150]; // orange-brown to olive to sage\n return earthHues.map((h) =>\n hslToHex(h + this.rng() * 15, 0.25 + this.rng() * 0.2, 0.35 + this.rng() * 0.2),\n );\n }\n case \"high-contrast\": {\n // Black, white, and one accent color\n const accent = hslToHex(baseHue, 0.9, 0.5);\n return [\"#111111\", \"#eeeeee\", accent, hslToHex(baseHue, 0.7, 0.35)];\n }\n case \"harmonious\":\n default:\n return this.getColors();\n }\n }\n\n /**\n * Returns background colors appropriate for the given palette mode.\n */\n getBackgroundColorsByMode(mode: string): [string, string] {\n switch (mode) {\n case \"pastel-light\":\n return [hslToHex(this.seed % 360, 0.15, 0.92), hslToHex((this.seed + 30) % 360, 0.1, 0.88)];\n case \"high-contrast\":\n case \"monochrome-ink\":\n return [\"#f5f5f0\", \"#e8e8e0\"];\n case \"neon\":\n return [\"#0a0a12\", \"#050510\"];\n case \"earth\":\n return [this.darken(hslToHex(35, 0.3, 0.25), 0.8), this.darken(hslToHex(25, 0.25, 0.2), 0.7)];\n default:\n return this.getBackgroundColors();\n }\n }\n\n /**\n * Returns two background colors derived from the hash — darker variants\n * of the base scheme, temperature-shifted for warm/cool contrast.\n */\n getBackgroundColors(): [string, string] {\n let bg0 = this.baseScheme[0];\n let bg1 = this.baseScheme[1];\n\n if (this.temperatureMode !== \"neutral\") {\n const bgTemp = this.temperatureMode === \"warm-bg\" ? \"warm\" : \"cool\";\n bg0 = this.shiftColorTemperature(bg0, bgTemp, 0.3);\n bg1 = this.shiftColorTemperature(bg1, bgTemp, 0.25);\n }\n\n return [this.darken(bg0, 0.65), this.darken(bg1, 0.55)];\n }\n\n /**\n * Returns the temperature mode so the renderer can apply\n * contrasting temperature to foreground elements.\n */\n getTemperatureMode(): TemperatureMode {\n return this.temperatureMode;\n }\n\n /**\n * Shift a hex color's hue toward warm or cool.\n */\n private shiftColorTemperature(hex: string, target: \"warm\" | \"cool\", amount: number): string {\n const [h, s, l] = hexToHsl(hex);\n const shifted = shiftHueToward(h, target, amount);\n return hslToHex(shifted, s, l);\n }\n\n /**\n * Simple hex color darkening by a factor (0 = black, 1 = unchanged).\n */\n private darken(hex: string, factor: number): string {\n const c = hex.replace(\"#\", \"\");\n const r = Math.round(parseInt(c.substring(0, 2), 16) * factor);\n const g = Math.round(parseInt(c.substring(2, 4), 16) * factor);\n const b = Math.round(parseInt(c.substring(4, 6), 16) * factor);\n return `#${r.toString(16).padStart(2, \"0\")}${g.toString(16).padStart(2, \"0\")}${b.toString(16).padStart(2, \"0\")}`;\n }\n}\n\n// ── Standalone color utilities ──────────────────────────────────────\n\n/** Parse a hex color (#RRGGBB) into [r, g, b] 0-255. */\nfunction hexToRgb(hex: string): [number, number, number] {\n const c = hex.replace(\"#\", \"\");\n return [\n parseInt(c.substring(0, 2), 16),\n parseInt(c.substring(2, 4), 16),\n parseInt(c.substring(4, 6), 16),\n ];\n}\n\n/** Format [r, g, b] back to #RRGGBB. */\nfunction rgbToHex(r: number, g: number, b: number): string {\n const clamp = (v: number) => Math.max(0, Math.min(255, Math.round(v)));\n return `#${clamp(r).toString(16).padStart(2, \"0\")}${clamp(g).toString(16).padStart(2, \"0\")}${clamp(b).toString(16).padStart(2, \"0\")}`;\n}\n\n/** Convert hex to HSL [h 0-360, s 0-1, l 0-1]. */\nfunction hexToHsl(hex: string): [number, number, number] {\n const [r, g, b] = hexToRgb(hex).map((v) => v / 255);\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n if (max === min) return [0, 0, l];\n const d = max - min;\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n let h = 0;\n if (max === r) h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n else if (max === g) h = ((b - r) / d + 2) / 6;\n else h = ((r - g) / d + 4) / 6;\n return [h * 360, s, l];\n}\n\n/** Convert HSL [h 0-360, s 0-1, l 0-1] back to hex. */\nfunction hslToHex(h: number, s: number, l: number): string {\n h = ((h % 360) + 360) % 360;\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = l - c / 2;\n let r = 0, g = 0, b = 0;\n if (h < 60) { r = c; g = x; }\n else if (h < 120) { r = x; g = c; }\n else if (h < 180) { g = c; b = x; }\n else if (h < 240) { g = x; b = c; }\n else if (h < 300) { r = x; b = c; }\n else { r = c; b = x; }\n return rgbToHex((r + m) * 255, (g + m) * 255, (b + m) * 255);\n}\n\n/**\n * Return a hex color with an alpha component as an rgba() CSS string.\n * `alpha` is 0-1.\n */\nexport function hexWithAlpha(hex: string, alpha: number): string {\n const [r, g, b] = hexToRgb(hex);\n return `rgba(${r},${g},${b},${alpha.toFixed(3)})`;\n}\n\n/**\n * Color hierarchy — assigns dominant/secondary/accent roles to a palette.\n * Dominant gets ~60% of usage, secondary ~25%, accent ~15%.\n */\nexport interface ColorHierarchy {\n dominant: string;\n secondary: string;\n accent: string;\n all: string[];\n}\n\nexport function buildColorHierarchy(colors: string[], rng: () => number): ColorHierarchy {\n if (colors.length < 3) {\n return {\n dominant: colors[0] || \"#888888\",\n secondary: colors[1] || colors[0] || \"#888888\",\n accent: colors[colors.length - 1] || \"#888888\",\n all: colors,\n };\n }\n // Pick dominant as the color closest to the palette's average hue\n const hsls = colors.map((c) => hexToHsl(c));\n const avgHue = hsls.reduce((s, h) => s + h[0], 0) / hsls.length;\n let dominantIdx = 0;\n let minDist = 360;\n for (let i = 0; i < hsls.length; i++) {\n const d = Math.min(Math.abs(hsls[i][0] - avgHue), 360 - Math.abs(hsls[i][0] - avgHue));\n if (d < minDist) { minDist = d; dominantIdx = i; }\n }\n // Accent is the color most distant from dominant in hue\n let accentIdx = 0;\n let maxDist = 0;\n for (let i = 0; i < hsls.length; i++) {\n if (i === dominantIdx) continue;\n const d = Math.min(Math.abs(hsls[i][0] - hsls[dominantIdx][0]), 360 - Math.abs(hsls[i][0] - hsls[dominantIdx][0]));\n if (d > maxDist) { maxDist = d; accentIdx = i; }\n }\n // Secondary is the remaining color with highest saturation\n let secondaryIdx = 0;\n let maxSat = -1;\n for (let i = 0; i < hsls.length; i++) {\n if (i === dominantIdx || i === accentIdx) continue;\n if (hsls[i][1] > maxSat) { maxSat = hsls[i][1]; secondaryIdx = i; }\n }\n if (secondaryIdx === dominantIdx) secondaryIdx = accentIdx === 0 ? 1 : 0;\n\n return {\n dominant: colors[dominantIdx],\n secondary: colors[secondaryIdx],\n accent: colors[accentIdx],\n all: colors,\n };\n}\n\n/**\n * Pick a color from the hierarchy with weighted probability.\n * ~60% dominant, ~25% secondary, ~15% accent.\n */\nexport function pickHierarchyColor(hierarchy: ColorHierarchy, rng: () => number): string {\n const roll = rng();\n if (roll < 0.60) return hierarchy.dominant;\n if (roll < 0.85) return hierarchy.secondary;\n return hierarchy.accent;\n}\n\n/**\n * HSL-space color jitter — preserves vibrancy better than RGB jitter.\n * Applies small hue wobble + saturation/lightness variation.\n */\nexport function jitterColorHSL(\n hex: string,\n rng: () => number,\n hueAmount = 8,\n slAmount = 0.06,\n): string {\n const [h, s, l] = hexToHsl(hex);\n const newH = (h + (rng() - 0.5) * hueAmount * 2 + 360) % 360;\n const newS = Math.max(0, Math.min(1, s + (rng() - 0.5) * slAmount * 2));\n const newL = Math.max(0, Math.min(1, l + (rng() - 0.5) * slAmount * 2));\n return hslToHex(newH, newS, newL);\n}\n\nexport function jitterColor(\n hex: string,\n rng: () => number,\n amount = 0.1,\n): string {\n const [r, g, b] = hexToRgb(hex);\n const jit = () => (rng() - 0.5) * 2 * amount * 255;\n return rgbToHex(r + jit(), g + jit(), b + jit());\n}\n\n/**\n * Desaturate a hex color by blending toward its luminance gray.\n * `amount` 0 = unchanged, 1 = fully gray.\n */\nexport function desaturate(hex: string, amount: number): string {\n const [r, g, b] = hexToRgb(hex);\n const gray = 0.299 * r + 0.587 * g + 0.114 * b;\n const mix = (c: number) => c + (gray - c) * amount;\n return rgbToHex(mix(r), mix(g), mix(b));\n}\n\n/**\n * Shift a hex color's hue toward warm (orange) or cool (blue).\n * `amount` 0 = unchanged, 1 = fully shifted.\n */\nexport function shiftTemperature(hex: string, target: \"warm\" | \"cool\", amount: number): string {\n const [h, s, l] = hexToHsl(hex);\n return hslToHex(shiftHueToward(h, target, amount), s, l);\n}\n\n/**\n * Compute relative luminance of a hex color (0 = black, 1 = white).\n * Uses the sRGB luminance formula from WCAG.\n */\nexport function luminance(hex: string): number {\n const [r, g, b] = hexToRgb(hex).map((c) => {\n const s = c / 255;\n return s <= 0.03928 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);\n });\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n}\n\n/**\n * Enforce minimum contrast between a foreground color and a background\n * luminance. On light backgrounds, darkens/saturates the foreground.\n * On dark backgrounds, lightens/saturates the foreground.\n *\n * `bgLuminance` is 0-1 (pre-computed from the background color).\n * `minContrast` is the minimum luminance difference to enforce (default 0.15).\n */\nexport function enforceContrast(\n fgHex: string,\n bgLuminance: number,\n minContrast = 0.15,\n): string {\n const fgLum = luminance(fgHex);\n const diff = Math.abs(fgLum - bgLuminance);\n\n if (diff >= minContrast) return fgHex;\n\n const [h, s, l] = hexToHsl(fgHex);\n\n if (bgLuminance > 0.5) {\n // Light background — darken and boost saturation\n const targetL = Math.max(0.08, l - (minContrast - diff) * 1.5);\n const targetS = Math.min(1, s + 0.2);\n return hslToHex(h, targetS, targetL);\n } else {\n // Dark background — lighten and boost saturation\n const targetL = Math.min(0.92, l + (minContrast - diff) * 1.5);\n const targetS = Math.min(1, s + 0.15);\n return hslToHex(h, targetS, targetL);\n }\n}\n\n/**\n * Apply a unified color grade to a hex color — shifts the entire image\n * toward a cohesive tone. This is the \"Instagram filter\" effect.\n */\nexport function applyColorGrade(\n hex: string,\n gradeHue: number,\n intensity: number,\n): string {\n const [h, s, l] = hexToHsl(hex);\n // Blend hue toward the grade hue\n const hueDiff = ((gradeHue - h + 540) % 360) - 180;\n const newH = (h + hueDiff * intensity * 0.3 + 360) % 360;\n // Slightly unify saturation\n const newS = Math.max(0, Math.min(1, s + (0.5 - s) * intensity * 0.15));\n return hslToHex(newH, newS, l);\n}\n\n/**\n * Compute a deterministic color grade from the hash.\n * Returns a hue (0-360) and intensity (0.15-0.4).\n */\nexport function pickColorGrade(rng: () => number): { hue: number; intensity: number } {\n // Warm golden, cool blue, rosy, teal, amber\n const GRADE_HUES = [40, 220, 340, 175, 30];\n const hue = GRADE_HUES[Math.floor(rng() * GRADE_HUES.length)] + (rng() - 0.5) * 20;\n const intensity = 0.15 + rng() * 0.25;\n return { hue: (hue + 360) % 360, intensity };\n}\n","declare module 'color-scheme' {\n class ColorScheme {\n from_hue(hue: number): this;\n scheme(name: string): this;\n variation(name: string): this;\n colors(): string[];\n }\n\n export = ColorScheme;\n}\n\n// declare module 'color-scheme';\n","export function gitHashToSeed(gitHash: string): number {\n return parseInt(gitHash.slice(0, 8), 16);\n}\n\n/**\n * Mulberry32 — a fast, high-quality 32-bit seeded PRNG.\n * Returns a function that produces deterministic floats in [0, 1).\n */\nexport function createRng(seed: number): () => number {\n let s = seed | 0;\n return () => {\n s = (s + 0x6d2b79f5) | 0;\n let t = Math.imul(s ^ (s >>> 15), 1 | s);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\n/**\n * Derive a deterministic seed from a hash string and an extra index\n * so each call-site gets its own independent stream.\n */\nexport function seedFromHash(hash: string, offset = 0): number {\n let h = 0;\n for (let i = 0; i < hash.length; i++) {\n h = (Math.imul(31, h) + hash.charCodeAt(i)) | 0;\n }\n return (h + offset) | 0;\n}\n\n/**\n * Legacy helper kept for backward compat — now backed by mulberry32.\n * Prefer createRng() + rng() for new code.\n */\nexport function getRandomFromHash(\n hash: string,\n index: number,\n min: number,\n max: number,\n): number {\n const rng = createRng(seedFromHash(hash, index));\n return min + rng() * (max - min);\n}\n\n// Golden ratio and other important proportions\nexport const Proportions = {\n GOLDEN_RATIO: 1.618034,\n SQUARE_ROOT_2: Math.sqrt(2),\n SQUARE_ROOT_3: Math.sqrt(3),\n SQUARE_ROOT_5: Math.sqrt(5),\n PI: Math.PI,\n PHI: (1 + Math.sqrt(5)) / 2,\n};\n\nexport type ProportionType = keyof typeof Proportions;\n\ninterface Pattern {\n type: string;\n config: any;\n}\n\ninterface LayerConfig {\n baseSize: number;\n baseOpacity?: number;\n opacityReduction?: number;\n rotationOffset?: number;\n proportionType?: ProportionType;\n}\n\n// Pattern combination utilities\nexport class PatternCombiner {\n static getProportionalSize(baseSize: number, proportion: number): number {\n return baseSize * proportion;\n }\n\n static centerPattern(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n ): void {\n ctx.translate(width / 2, height / 2);\n }\n\n // Combines sacred geometry patterns with proper proportions\n static layerPatterns(\n ctx: CanvasRenderingContext2D,\n patterns: Pattern[],\n config: LayerConfig,\n ): void {\n const {\n baseSize,\n baseOpacity = 0.6,\n opacityReduction = 0.1,\n rotationOffset = 0,\n proportionType = \"GOLDEN_RATIO\",\n } = config;\n\n patterns.forEach((pattern, index) => {\n const size = this.getProportionalSize(\n baseSize,\n Math.pow(Proportions[proportionType], index),\n );\n const opacity = Math.max(0.1, baseOpacity - index * opacityReduction);\n const rotation = rotationOffset * index;\n\n ctx.save();\n ctx.globalAlpha = opacity;\n ctx.rotate((rotation * Math.PI) / 180);\n\n shapes[pattern.type](ctx, size, pattern.config);\n ctx.restore();\n });\n }\n}\n","import { PatternCombiner, ProportionType } from \"../utils\";\nimport { shapes } from \"./shapes\";\n\n// ── Blend modes for layer-level compositing (Feature B) ─────────────\n// These are all standard Canvas 2D globalCompositeOperation values,\n// safe in both Node (@napi-rs/canvas) and browsers.\n\nexport const BLEND_MODES: GlobalCompositeOperation[] = [\n \"source-over\", // default — safe fallback\n \"screen\",\n \"multiply\",\n \"overlay\",\n \"soft-light\",\n \"color-dodge\",\n \"color-burn\",\n \"lighter\",\n];\n\n/**\n * Pick a blend mode deterministically from the RNG.\n * ~40% chance of default source-over to keep some images clean.\n */\nexport function pickBlendMode(rng: () => number): GlobalCompositeOperation {\n if (rng() < 0.4) return \"source-over\";\n return BLEND_MODES[1 + Math.floor(rng() * (BLEND_MODES.length - 1))];\n}\n\n// ── Shape rendering styles (Feature C) ──────────────────────────────\n\nexport type RenderStyle =\n | \"fill-and-stroke\" // classic (current behavior)\n | \"fill-only\" // soft, no outline\n | \"stroke-only\" // wireframe\n | \"double-stroke\" // inner + outer stroke\n | \"dashed\" // dashed outline\n | \"watercolor\" // multiple offset passes at low opacity\n | \"hatched\" // cross-hatch texture fill\n | \"incomplete\"; // draw only 60-85% of the stroke path\n\nconst RENDER_STYLES: RenderStyle[] = [\n \"fill-and-stroke\",\n \"fill-and-stroke\", // weighted: appears twice for higher probability\n \"fill-only\",\n \"stroke-only\",\n \"double-stroke\",\n \"dashed\",\n \"watercolor\",\n \"hatched\",\n \"incomplete\",\n];\n\nexport function pickRenderStyle(rng: () => number): RenderStyle {\n return RENDER_STYLES[Math.floor(rng() * RENDER_STYLES.length)];\n}\n\n// ── Config interfaces ───────────────────────────────────────────────\n\ninterface DrawShapeConfig {\n fillColor: string;\n strokeColor: string;\n strokeWidth: number;\n size: number;\n rotation: number;\n}\n\ninterface EnhanceShapeConfig extends DrawShapeConfig {\n patterns?: Array<{ type: string; config: any }>;\n proportionType?: ProportionType;\n baseOpacity?: number;\n opacityReduction?: number;\n /** If provided, applies a glow (shadowBlur) effect. */\n glowRadius?: number;\n glowColor?: string;\n /** If provided, fills with a radial gradient between two colors. */\n gradientFillEnd?: string;\n /** Rendering style — controls fill/stroke treatment. */\n renderStyle?: RenderStyle;\n /** RNG for watercolor jitter (required for \"watercolor\" style). */\n rng?: () => number;\n}\n\nexport function drawShape(\n ctx: CanvasRenderingContext2D,\n shape: string,\n x: number,\n y: number,\n config: DrawShapeConfig,\n) {\n const { fillColor, strokeColor, strokeWidth, size, rotation } = config;\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate((rotation * Math.PI) / 180);\n ctx.fillStyle = fillColor;\n ctx.strokeStyle = strokeColor;\n ctx.lineWidth = strokeWidth;\n\n const drawFunction = shapes[shape];\n if (drawFunction) {\n drawFunction(ctx, size);\n ctx.fill();\n ctx.stroke();\n }\n\n ctx.restore();\n}\n\n/**\n * Apply the chosen render style to the current path.\n */\nfunction applyRenderStyle(\n ctx: CanvasRenderingContext2D,\n style: RenderStyle,\n fillColor: string,\n strokeColor: string,\n strokeWidth: number,\n size: number,\n rng?: () => number,\n): void {\n switch (style) {\n case \"fill-only\":\n ctx.fill();\n break;\n\n case \"stroke-only\":\n ctx.fill(); // transparent fill to define the path\n ctx.globalAlpha *= 0.3; // ghost fill\n ctx.fill();\n ctx.globalAlpha /= 0.3;\n ctx.stroke();\n break;\n\n case \"double-stroke\": {\n ctx.fill();\n // Outer stroke\n ctx.lineWidth = strokeWidth * 2;\n ctx.globalAlpha *= 0.5;\n ctx.stroke();\n ctx.globalAlpha /= 0.5;\n // Inner stroke\n ctx.lineWidth = strokeWidth * 0.5;\n ctx.strokeStyle = fillColor;\n ctx.stroke();\n break;\n }\n\n case \"dashed\":\n ctx.fill();\n ctx.setLineDash([size * 0.05, size * 0.03]);\n ctx.stroke();\n ctx.setLineDash([]);\n break;\n\n case \"watercolor\": {\n // Improved watercolor: edge darkening + radial bleed + layered washes\n const passes = 4 + (rng ? Math.floor(rng() * 2) : 0);\n const savedAlpha = ctx.globalAlpha;\n\n // Pass 1: Base wash — large, soft fill at low opacity\n ctx.globalAlpha = savedAlpha * 0.15;\n ctx.save();\n const baseScale = 1.08 + (rng ? rng() * 0.04 : 0);\n ctx.scale(baseScale, baseScale);\n ctx.fill();\n ctx.restore();\n\n // Pass 2: Multiple offset washes with radial displacement\n ctx.globalAlpha = savedAlpha * (0.25 / passes * 2);\n for (let p = 0; p < passes; p++) {\n // Radial outward displacement (not uniform) for organic bleed\n const angle = rng ? rng() * Math.PI * 2 : p * Math.PI / 2;\n const dist = rng ? rng() * size * 0.05 : size * 0.02;\n const jx = Math.cos(angle) * dist;\n const jy = Math.sin(angle) * dist;\n ctx.save();\n ctx.translate(jx, jy);\n ctx.fill();\n ctx.restore();\n }\n\n // Pass 3: Edge darkening — draw a slightly smaller shape with lighter fill\n // to simulate pigment pooling at boundaries\n ctx.globalAlpha = savedAlpha * 0.35;\n ctx.save();\n const innerScale = 0.85 + (rng ? rng() * 0.08 : 0);\n ctx.scale(innerScale, innerScale);\n // Lighten the fill for the inner area\n const origFill = ctx.fillStyle;\n if (typeof fillColor === \"string\") {\n ctx.fillStyle = fillColor.replace(/[\\d.]+\\)$/, (m) => {\n const v = parseFloat(m);\n return Math.min(1, v * 1.4).toFixed(2) + \")\";\n });\n }\n ctx.fill();\n ctx.fillStyle = origFill;\n ctx.restore();\n\n ctx.globalAlpha = savedAlpha;\n // Soft stroke on top — thinner than normal for delicacy\n ctx.globalAlpha *= 0.25;\n ctx.lineWidth = strokeWidth * 0.6;\n ctx.stroke();\n ctx.globalAlpha /= 0.25;\n break;\n }\n\n case \"hatched\": {\n // Fill normally at reduced opacity, then overlay cross-hatch lines\n const savedAlphaH = ctx.globalAlpha;\n ctx.globalAlpha = savedAlphaH * 0.3;\n ctx.fill();\n ctx.globalAlpha = savedAlphaH;\n\n // Clip to shape, then draw hatch lines\n ctx.save();\n ctx.clip();\n const hatchSpacing = Math.max(3, size * 0.06);\n const hatchAngle = rng ? rng() * Math.PI : Math.PI / 4;\n ctx.lineWidth = Math.max(0.5, strokeWidth * 0.4);\n ctx.globalAlpha = savedAlphaH * 0.6;\n\n // Draw parallel lines across the bounding box\n const extent = size * 0.8;\n const cos = Math.cos(hatchAngle);\n const sin = Math.sin(hatchAngle);\n for (let d = -extent; d <= extent; d += hatchSpacing) {\n ctx.beginPath();\n ctx.moveTo(d * cos - extent * sin, d * sin + extent * cos);\n ctx.lineTo(d * cos + extent * sin, d * sin - extent * cos);\n ctx.stroke();\n }\n // Second pass at perpendicular angle for cross-hatch (~50% chance)\n if (!rng || rng() < 0.5) {\n const crossAngle = hatchAngle + Math.PI / 2;\n const cos2 = Math.cos(crossAngle);\n const sin2 = Math.sin(crossAngle);\n ctx.globalAlpha = savedAlphaH * 0.35;\n for (let d = -extent; d <= extent; d += hatchSpacing * 1.4) {\n ctx.beginPath();\n ctx.moveTo(d * cos2 - extent * sin2, d * sin2 + extent * cos2);\n ctx.lineTo(d * cos2 + extent * sin2, d * sin2 - extent * cos2);\n ctx.stroke();\n }\n }\n ctx.restore();\n ctx.globalAlpha = savedAlphaH;\n // Outline stroke\n ctx.globalAlpha *= 0.5;\n ctx.stroke();\n ctx.globalAlpha /= 0.5;\n break;\n }\n\n case \"incomplete\": {\n // Draw the fill at low opacity, then a dashed stroke that\n // simulates drawing only part of the outline\n const savedAlphaI = ctx.globalAlpha;\n ctx.globalAlpha = savedAlphaI * 0.25;\n ctx.fill();\n ctx.globalAlpha = savedAlphaI;\n\n // Use a long dash pattern where gaps create the \"incomplete\" look\n const completeness = rng ? 0.6 + rng() * 0.25 : 0.7; // 60-85%\n const segLen = size * 0.12;\n const gapLen = segLen * ((1 - completeness) / completeness);\n ctx.setLineDash([segLen, gapLen]);\n // Offset the dash so each shape starts at a different point\n ctx.lineDashOffset = rng ? rng() * segLen * 4 : 0;\n // Slightly thicker stroke for hand-drawn feel\n ctx.lineWidth = strokeWidth * 1.3;\n ctx.stroke();\n ctx.setLineDash([]);\n ctx.lineDashOffset = 0;\n break;\n }\n\n case \"fill-and-stroke\":\n default:\n ctx.fill();\n ctx.stroke();\n break;\n }\n}\n\n/**\n * Enhanced shape drawing with glow, gradient fills, blend modes,\n * render style variety, and pattern layering.\n */\nexport function enhanceShapeGeneration(\n ctx: CanvasRenderingContext2D,\n shape: string,\n x: number,\n y: number,\n config: EnhanceShapeConfig,\n) {\n const {\n fillColor,\n strokeColor,\n strokeWidth,\n size,\n rotation,\n patterns = [],\n proportionType = \"GOLDEN_RATIO\",\n baseOpacity = 0.6,\n opacityReduction = 0.1,\n glowRadius = 0,\n glowColor,\n gradientFillEnd,\n renderStyle = \"fill-and-stroke\",\n rng,\n } = config;\n\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate((rotation * Math.PI) / 180);\n\n // Glow / shadow effect\n if (glowRadius > 0) {\n ctx.shadowBlur = glowRadius;\n ctx.shadowColor = glowColor || fillColor;\n ctx.shadowOffsetX = 0;\n ctx.shadowOffsetY = 0;\n }\n\n // Gradient fill or flat fill\n if (gradientFillEnd) {\n const grad = ctx.createRadialGradient(0, 0, 0, 0, 0, size / 2);\n grad.addColorStop(0, fillColor);\n grad.addColorStop(1, gradientFillEnd);\n ctx.fillStyle = grad;\n } else {\n ctx.fillStyle = fillColor;\n }\n\n ctx.strokeStyle = strokeColor;\n ctx.lineWidth = strokeWidth;\n\n const drawFunction = shapes[shape];\n if (drawFunction) {\n drawFunction(ctx, size, { rng });\n applyRenderStyle(ctx, renderStyle, fillColor, strokeColor, strokeWidth, size, rng);\n }\n\n // Reset shadow so patterns aren't double-glowed\n if (glowRadius > 0) {\n ctx.shadowBlur = 0;\n }\n\n // Layer additional patterns if specified\n if (patterns.length > 0) {\n PatternCombiner.layerPatterns(ctx, patterns, {\n baseSize: size,\n baseOpacity,\n opacityReduction,\n proportionType,\n });\n }\n\n ctx.restore();\n}\n","import { basicShapes } from \"./basic\";\nimport { complexShapes } from \"./complex\";\nimport { sacredShapes } from \"./sacred\";\nimport { proceduralShapes } from \"./procedural\";\n\ntype DrawFunction = (\n ctx: CanvasRenderingContext2D,\n size: number,\n config?: any,\n) => void;\n\nexport const shapes: Record<string, DrawFunction> = {\n ...basicShapes,\n ...complexShapes,\n ...sacredShapes,\n ...proceduralShapes,\n};\n","type DrawFunction = (ctx: CanvasRenderingContext2D, size: number) => void;\n\nexport const drawCircle: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.arc(0, 0, size / 2, 0, Math.PI * 2);\n};\n\nexport const drawSquare: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.rect(-size / 2, -size / 2, size, size);\n};\n\nexport const drawTriangle: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.moveTo(0, -size / 2);\n ctx.lineTo(-size / 2, size / 2);\n ctx.lineTo(size / 2, size / 2);\n ctx.closePath();\n};\n\nexport const drawHexagon: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n for (let i = 0; i < 6; i++) {\n const angle = ((Math.PI * 2) / 6) * i;\n const x = (size / 2) * Math.cos(angle);\n const y = (size / 2) * Math.sin(angle);\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\nexport const drawStar: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n for (let i = 0; i < 10; i++) {\n const angle = Math.PI / 5 + (Math.PI / 5) * i * 3;\n const radius = i % 2 === 0 ? size / 2 : size / 4;\n const x = radius * Math.cos(angle);\n const y = radius * Math.sin(angle);\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\nexport const drawJackedStar: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n for (let i = 0; i < 10; i++) {\n const angle = Math.PI / 30 + (Math.PI / 30) * i * 8;\n const radius = i % 2 === 0 ? size / 2 : size / 8;\n const x = radius * Math.cos(angle);\n const y = radius * Math.sin(angle);\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\nexport const drawHeart: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.moveTo(0, size / 4);\n ctx.quadraticCurveTo(size / 2, size / 4, 0, -size / 4);\n ctx.quadraticCurveTo(-size / 2, size / 4, 0, size / 4);\n};\n\nexport const drawDiamond: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.moveTo(0, -size / 2);\n ctx.lineTo(size / 2, 0);\n ctx.lineTo(0, size / 2);\n ctx.lineTo(-size / 2, 0);\n ctx.closePath();\n};\n\nexport const drawCube: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.moveTo(-size / 2, -size / 2);\n ctx.lineTo(size / 2, -size / 2);\n ctx.lineTo(size / 2, size / 2);\n ctx.lineTo(-size / 2, size / 2);\n ctx.closePath();\n};\n\n// Optional: Create a shape map for easier lookup\nexport const basicShapes: Record<string, DrawFunction> = {\n circle: drawCircle,\n square: drawSquare,\n triangle: drawTriangle,\n hexagon: drawHexagon,\n star: drawStar,\n \"jacked-star\": drawJackedStar,\n heart: drawHeart,\n diamond: drawDiamond,\n cube: drawCube,\n};\n","import { defaultShapeConfig } from \"../../constants\";\nimport { applyTransforms, createCirclePoints, restoreContext } from \"./utils\";\n\ninterface PlatonicSolidConfig {\n vertices: number;\n faces: number;\n}\n\ninterface FibonacciConfig {\n iterations: number;\n growthFactor: number;\n}\n\ninterface GoldenRatioConfig {\n iterations: number;\n ratio: number;\n}\n\nexport const ShapeConfigs = {\n platonic: {\n tetrahedron: { vertices: 4, faces: 4 },\n cube: { vertices: 8, faces: 6 },\n octahedron: { vertices: 6, faces: 8 },\n dodecahedron: { vertices: 20, faces: 12 },\n icosahedron: { vertices: 12, faces: 20 },\n } as Record<string, PlatonicSolidConfig>,\n fibonacci: {\n iterations: 13,\n growthFactor: 1.618034, // Golden ratio\n } as FibonacciConfig,\n goldenRatio: {\n iterations: 8,\n ratio: 1.618034,\n } as GoldenRatioConfig,\n};\n\ninterface ShapeConfig {\n fillStyle?: string;\n strokeStyle?: string;\n lineWidth?: number;\n rotation?: number;\n iterations?: number;\n animate?: boolean;\n type?: string;\n}\n\ntype DrawFunction = (\n ctx: CanvasRenderingContext2D,\n size: number,\n config?: ShapeConfig,\n) => void;\n\nexport const drawPlatonicSolid: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config };\n applyTransforms(ctx, size, finalConfig);\n\n const solidType = config.type as keyof typeof ShapeConfigs.platonic;\n const solidConfig =\n ShapeConfigs.platonic[solidType] ?? ShapeConfigs.platonic.icosahedron;\n const {\n vertices,\n // faces\n } = solidConfig;\n const radius = size / 2;\n\n // Calculate vertices based on platonic solid type\n const points = createCirclePoints(0, 0, radius, vertices);\n\n ctx.beginPath();\n // Draw edges between vertices\n points.forEach((p1, i) => {\n points.slice(i + 1).forEach((p2) => {\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n });\n });\n\n if (finalConfig.fillStyle !== \"transparent\") {\n ctx.fill();\n }\n ctx.stroke();\n restoreContext(ctx);\n};\n\nexport const drawFibonacciSpiral: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = {\n ...defaultShapeConfig,\n ...ShapeConfigs.fibonacci,\n ...config,\n };\n applyTransforms(ctx, size, finalConfig);\n\n let current = 1;\n let previous = 1;\n let scale = size / Math.pow(finalConfig.growthFactor, finalConfig.iterations);\n\n ctx.beginPath();\n for (let i = 0; i < finalConfig.iterations; i++) {\n const radius = scale * current;\n const centerX = radius / 2;\n const centerY = radius / 2;\n\n ctx.arc(centerX, centerY, radius, Math.PI, Math.PI * 1.5);\n\n // Calculate next Fibonacci number\n const next = current + previous;\n previous = current;\n current = next;\n\n // Transform for next iteration\n ctx.translate(radius, 0);\n ctx.rotate(Math.PI / 2);\n }\n\n ctx.stroke();\n restoreContext(ctx);\n};\n\nexport const drawIslamicPattern: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config };\n applyTransforms(ctx, size, finalConfig);\n\n const gridSize = 8;\n const unit = size / gridSize;\n\n ctx.beginPath();\n // Create base grid\n for (let i = 0; i <= gridSize; i++) {\n for (let j = 0; j <= gridSize; j++) {\n const x = (i - gridSize / 2) * unit;\n const y = (j - gridSize / 2) * unit;\n\n // Draw star pattern at each intersection\n const radius = unit / 2;\n for (let k = 0; k < 8; k++) {\n const angle = (Math.PI / 4) * k;\n const x1 = x + radius * Math.cos(angle);\n const y1 = y + radius * Math.sin(angle);\n const x2 = x + radius * Math.cos(angle + Math.PI / 4);\n const y2 = y + radius * Math.sin(angle + Math.PI / 4);\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n }\n }\n }\n\n ctx.stroke();\n restoreContext(ctx);\n};\n\nexport const drawCelticKnot: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config };\n applyTransforms(ctx, size, finalConfig);\n\n const gridSize = 4;\n const unit = size / gridSize;\n\n const drawKnotSegment = (x: number, y: number, type: string) => {\n ctx.beginPath();\n switch (type) {\n case \"over\":\n ctx.moveTo(x, y);\n ctx.bezierCurveTo(\n x + unit / 2,\n y,\n x + unit / 2,\n y + unit,\n x + unit,\n y + unit,\n );\n break;\n case \"under\":\n ctx.moveTo(x, y + unit);\n ctx.bezierCurveTo(x + unit / 2, y + unit, x + unit / 2, y, x + unit, y);\n break;\n }\n ctx.stroke();\n };\n\n // Create knot pattern\n for (let i = 0; i < gridSize; i++) {\n for (let j = 0; j < gridSize; j++) {\n const x = (i - gridSize / 2) * unit;\n const y = (j - gridSize / 2) * unit;\n drawKnotSegment(x, y, (i + j) % 2 === 0 ? \"over\" : \"under\");\n }\n }\n\n restoreContext(ctx);\n};\n\nexport const drawMerkaba: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config };\n applyTransforms(ctx, size, finalConfig);\n\n const radius = size / 2;\n\n // Draw two intersecting tetrahedra\n ctx.beginPath();\n // First tetrahedron\n const points1 = createCirclePoints(0, 0, radius, 3);\n points1.forEach((p1, i) => {\n points1.slice(i + 1).forEach((p2) => {\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n });\n });\n\n // Second tetrahedron (rotated)\n ctx.rotate(Math.PI / 6);\n const points2 = createCirclePoints(0, 0, radius, 3);\n points2.forEach((p1, i) => {\n points2.slice(i + 1).forEach((p2) => {\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n });\n });\n\n if (finalConfig.fillStyle !== \"transparent\") {\n ctx.fill();\n }\n ctx.stroke();\n restoreContext(ctx);\n};\n\nexport const drawMandala: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config };\n applyTransforms(ctx, size, finalConfig);\n\n const numCircles = 8;\n const numPoints = 16;\n const radius = size / 2;\n\n ctx.beginPath();\n for (let i = 1; i <= numCircles; i++) {\n const circleRadius = (radius / numCircles) * i;\n ctx.moveTo(circleRadius, 0);\n ctx.arc(0, 0, circleRadius, 0, Math.PI * 2);\n\n for (let j = 0; j < numPoints; j++) {\n const angle = (Math.PI * 2 * j) / numPoints;\n const x = circleRadius * Math.cos(angle);\n const y = circleRadius * Math.sin(angle);\n ctx.moveTo(0, 0);\n ctx.lineTo(x, y);\n }\n }\n\n ctx.stroke();\n restoreContext(ctx);\n};\n\nexport const drawFractal: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config, iterations: 5 };\n applyTransforms(ctx, size, finalConfig);\n\n const drawBranch = (\n x: number,\n y: number,\n length: number,\n angle: number,\n depth: number,\n ) => {\n if (depth === 0) return;\n\n const endX = x + length * Math.cos(angle);\n const endY = y + length * Math.sin(angle);\n\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(endX, endY);\n ctx.stroke();\n\n drawBranch(endX, endY, length * 0.7, angle - Math.PI / 6, depth - 1);\n drawBranch(endX, endY, length * 0.7, angle + Math.PI / 6, depth - 1);\n };\n\n drawBranch(0, size / 2, size / 4, -Math.PI / 2, finalConfig.iterations);\n restoreContext(ctx);\n};\n\nexport const complexShapes: Record<string, DrawFunction> = {\n platonicSolid: drawPlatonicSolid,\n fibonacciSpiral: drawFibonacciSpiral,\n islamicPattern: drawIslamicPattern,\n celticKnot: drawCelticKnot,\n merkaba: drawMerkaba,\n mandala: drawMandala,\n fractal: drawFractal,\n};\n","// Define interfaces for our configurations\ninterface PresetConfig {\n hash: string;\n width: number;\n height: number;\n gridSize?: number;\n shapesPerLayer?: number;\n layers?: number;\n baseOpacity?: number;\n minShapeSize?: number;\n maxShapeSize?: number;\n}\n\ninterface ShapeConfig {\n strokeStyle: string;\n fillStyle: string;\n lineWidth: number;\n rotation: number;\n iterations: number;\n animate: boolean;\n}\n\n// Define the type for PRESETS\ntype Presets = {\n [key: string]: PresetConfig;\n};\n\nexport const PRESETS: Presets = {\n // Standard sizes with different hashes\n react: {\n hash: \"46192e59d42f741c761cbea79462a8b3815dd905\",\n width: 1024,\n height: 1024,\n },\n angular: {\n hash: \"f31a6c3e94420f43c0cd323a5a6a99376ee59ff8\",\n width: 1024,\n height: 1024,\n gridSize: 6, // Higher density grid\n },\n // Wide format variations\n banner: {\n hash: \"d847ffd4269b22c54d6e85ad3c1892a298e961fb\",\n width: 1920,\n height: 480,\n gridSize: 8, // More horizontal cells for wide format\n shapesPerLayer: 40,\n },\n ultrawide: {\n hash: \"a3e126e537ed2cd11ddf3a96c37066e97c7afee6\",\n width: 3440,\n height: 1440,\n gridSize: 12, // Extra wide needs more cells\n shapesPerLayer: 60,\n },\n // Social media sizes\n \"instagram-square\": {\n hash: \"ff00ff00ff00ff00ff00ff00ff00ff00ff00ff0\",\n width: 1080,\n height: 1080,\n },\n \"instagram-story\": {\n hash: \"abc123def456abc123def456abc123def456abc1\",\n width: 1080,\n height: 1920,\n gridSize: 6,\n layers: 6,\n },\n \"twitter-header\": {\n hash: \"7777777777777777777777777777777777777777\",\n width: 1500,\n height: 500,\n gridSize: 8,\n shapesPerLayer: 35,\n },\n \"linkedin-banner\": {\n hash: \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n width: 1584,\n height: 396,\n gridSize: 8,\n shapesPerLayer: 35,\n },\n // Mobile sizes\n \"phone-wallpaper\": {\n hash: \"ffffffffffffffffffffffffffffffffaaaaaaaa\",\n width: 1170,\n height: 2532, // iPhone 13 Pro size\n gridSize: 5,\n layers: 6,\n },\n \"tablet-wallpaper\": {\n hash: \"123456789abcdef0123456789abcdef012345678\",\n width: 2048,\n height: 2732, // iPad Pro size\n gridSize: 7,\n layers: 6,\n },\n // Special configurations\n minimal: {\n hash: \"000000000000000000000000000000000fffffff\",\n width: 1024,\n height: 1024,\n layers: 3,\n baseOpacity: 0.8,\n shapesPerLayer: 15,\n },\n complex: {\n hash: \"deadbeefdeadbeefdeadbeefdeadbeefdeadbeef\",\n width: 2048,\n height: 2048,\n gridSize: 8,\n layers: 7,\n shapesPerLayer: 50,\n minShapeSize: 30,\n maxShapeSize: 250,\n },\n};\n\n// Basic configuration that applies to all shapes\nexport const defaultShapeConfig: ShapeConfig = {\n strokeStyle: \"#000000\",\n fillStyle: \"transparent\",\n lineWidth: 1,\n rotation: 0,\n iterations: 1,\n animate: false, // For future use\n};\n\n// Base configuration types that can be extended per shape\nexport const ShapeConfigTypes = {\n BASIC: \"basic\",\n DETAILED: \"detailed\",\n ANIMATED: \"animated\",\n};\n\n// Golden ratio and other important proportions\nexport const Proportions = {\n GOLDEN_RATIO: 1.618034,\n SQUARE_ROOT_2: Math.sqrt(2),\n SQUARE_ROOT_3: Math.sqrt(3),\n SQUARE_ROOT_5: Math.sqrt(5),\n PI: Math.PI,\n PHI: (1 + Math.sqrt(5)) / 2,\n};\n\n// Helper for creating common sacred geometry combinations\nexport const PatternPresets = {\n flowerOfLifeMandala: (size: number) => [\n // { type: \"flowerOfLife\", config: { size } },\n { type: \"merkaba\", config: { size: size * 0.8 } },\n { type: \"sriYantra\", config: { size: size * 0.5 } },\n ],\n\n platonicProgression: (size: number) => [\n { type: \"platonicSolid\", config: { size, type: \"tetrahedron\" } },\n { type: \"platonicSolid\", config: { size: size * 0.8, type: \"cube\" } },\n { type: \"platonicSolid\", config: { size: size * 0.6, type: \"octahedron\" } },\n ],\n\n cosmicTree: (size: number) => [\n // { type: \"treeOfLife\", config: { size } },\n { type: \"fibonacciSpiral\", config: { size: size * 0.9 } },\n { type: \"metatronsCube\", config: { size: size * 0.7 } },\n ],\n};\n","interface Point {\n x: number;\n y: number;\n}\n\ninterface ShapeConfig {\n rotation?: number;\n lineWidth: number;\n strokeStyle: string;\n fillStyle: string;\n}\n\ninterface AnimationConfig {\n enabled: boolean;\n duration: number;\n easing: string;\n type: string;\n}\n\nexport const degToRad = (degrees: number): number => (degrees * Math.PI) / 180;\n\nexport const applyTransforms = (\n ctx: CanvasRenderingContext2D,\n size: number,\n config: ShapeConfig,\n): void => {\n ctx.save();\n ctx.translate(0, 0);\n if (config.rotation) {\n ctx.rotate(degToRad(config.rotation));\n }\n ctx.lineWidth = config.lineWidth;\n ctx.strokeStyle = config.strokeStyle;\n ctx.fillStyle = config.fillStyle;\n};\n\nexport const restoreContext = (ctx: CanvasRenderingContext2D): void => {\n ctx.restore();\n};\n\n// Animation configuration stub for future use\nexport const createAnimationConfig = (type: string): AnimationConfig => ({\n enabled: false,\n duration: 1000,\n easing: \"linear\",\n type,\n // Add more animation-specific properties as needed\n});\n\nexport const createCirclePoints = (\n cx: number,\n cy: number,\n radius: number,\n segments: number,\n): Point[] => {\n const points: Point[] = [];\n for (let i = 0; i < segments; i++) {\n const angle = (i / segments) * Math.PI * 2;\n points.push({\n x: cx + Math.cos(angle) * radius,\n y: cy + Math.sin(angle) * radius,\n });\n }\n return points;\n};\n","import { createCirclePoints } from \"./utils\";\n\ntype DrawFunction = (ctx: CanvasRenderingContext2D, size: number) => void;\n\ninterface Point {\n x: number;\n y: number;\n}\n\nexport const drawFlowerOfLife: DrawFunction = (ctx, size) => {\n const radius = size / 6;\n const centers: Point[] = [\n { x: 0, y: 0 },\n { x: radius * Math.sqrt(3), y: 0 },\n { x: (radius * Math.sqrt(3)) / 2, y: 1.5 * radius },\n { x: (-radius * Math.sqrt(3)) / 2, y: 1.5 * radius },\n { x: -radius * Math.sqrt(3), y: 0 },\n { x: (-radius * Math.sqrt(3)) / 2, y: -1.5 * radius },\n { x: (radius * Math.sqrt(3)) / 2, y: -1.5 * radius },\n ];\n\n ctx.beginPath();\n centers.forEach((center) => {\n ctx.moveTo(center.x + radius, center.y);\n ctx.arc(center.x, center.y, radius, 0, Math.PI * 2);\n });\n};\n\nexport const drawTreeOfLife: DrawFunction = (ctx, size) => {\n const radius = size / 12;\n const spacing = radius * 2.5;\n\n // Sephirot positions (traditional layout)\n const positions: Point[] = [\n { x: 0, y: -spacing * 2 }, // Kether\n { x: -spacing, y: -spacing }, // Chokmah\n { x: spacing, y: -spacing }, // Binah\n { x: -spacing, y: 0 }, // Chesed\n { x: spacing, y: 0 }, // Geburah\n { x: 0, y: 0 }, // Tiphereth\n { x: -spacing, y: spacing }, // Netzach\n { x: spacing, y: spacing }, // Hod\n { x: 0, y: spacing * 2 }, // Yesod\n { x: 0, y: spacing * 3 }, // Malkuth\n ];\n\n // Draw circles\n ctx.beginPath();\n positions.forEach((pos) => {\n ctx.moveTo(pos.x + radius, pos.y);\n ctx.arc(pos.x, pos.y, radius, 0, Math.PI * 2);\n });\n\n // Draw connecting lines\n ctx.moveTo(positions[0].x, positions[0].y);\n positions.forEach((pos, i) => {\n if (i > 0) {\n positions.slice(i + 1).forEach((nextPos) => {\n ctx.moveTo(pos.x, pos.y);\n ctx.lineTo(nextPos.x, nextPos.y);\n });\n }\n });\n};\n\nexport const drawMetatronsCube: DrawFunction = (ctx, size) => {\n const radius = size / 3;\n\n // Create 13 points - one center and 12 vertices of an icosahedron\n\n // const phi = (1 + Math.sqrt(5)) / 2; // Golden ratio\n\n const vertices: Point[] = [\n { x: 0, y: 0 }, // Center point\n ...createCirclePoints(0, 0, radius, 6), // Inner hexagon\n ...createCirclePoints(0, 0, radius * 1.5, 6), // Outer hexagon\n ];\n\n ctx.beginPath();\n // Draw all connecting lines\n vertices.forEach((v1, i) => {\n vertices.slice(i + 1).forEach((v2) => {\n ctx.moveTo(v1.x, v1.y);\n ctx.lineTo(v2.x, v2.y);\n });\n });\n};\n\nexport const drawSriYantra: DrawFunction = (ctx, size) => {\n const radius = size / 2;\n ctx.beginPath();\n\n // Draw outer triangles\n for (let i = 0; i < 9; i++) {\n const angle = (i / 9) * Math.PI * 2;\n const x1 = Math.cos(angle) * radius;\n const y1 = Math.sin(angle) * radius;\n const x2 = Math.cos(angle + Math.PI / 9) * radius;\n const y2 = Math.sin(angle + Math.PI / 9) * radius;\n\n ctx.moveTo(0, 0);\n ctx.lineTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.lineTo(0, 0);\n }\n\n // Draw inner triangles\n const innerRadius = radius * 0.6;\n for (let i = 0; i < 9; i++) {\n const angle = (i / 9) * Math.PI * 2 + Math.PI / 18;\n const x1 = Math.cos(angle) * innerRadius;\n const y1 = Math.sin(angle) * innerRadius;\n const x2 = Math.cos(angle + Math.PI / 9) * innerRadius;\n const y2 = Math.sin(angle + Math.PI / 9) * innerRadius;\n\n ctx.moveTo(0, 0);\n ctx.lineTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.lineTo(0, 0);\n }\n};\n\nexport const drawSeedOfLife: DrawFunction = (ctx, size) => {\n const radius = size / 6;\n const centers: Point[] = [\n { x: 0, y: 0 },\n { x: radius * Math.sqrt(3), y: 0 },\n { x: (radius * Math.sqrt(3)) / 2, y: 1.5 * radius },\n { x: (-radius * Math.sqrt(3)) / 2, y: 1.5 * radius },\n { x: -radius * Math.sqrt(3), y: 0 },\n { x: (-radius * Math.sqrt(3)) / 2, y: -1.5 * radius },\n { x: (radius * Math.sqrt(3)) / 2, y: -1.5 * radius },\n ];\n\n ctx.beginPath();\n centers.forEach((center) => {\n ctx.moveTo(center.x + radius, center.y);\n ctx.arc(center.x, center.y, radius, 0, Math.PI * 2);\n });\n};\n\nexport const drawVesicaPiscis: DrawFunction = (ctx, size) => {\n const radius = size / 4;\n ctx.beginPath();\n ctx.arc(-radius / 2, 0, radius, 0, Math.PI * 2);\n ctx.arc(radius / 2, 0, radius, 0, Math.PI * 2);\n};\n\nexport const drawTorus: DrawFunction = (ctx, size) => {\n const outerRadius = size / 2;\n const innerRadius = size / 4;\n const steps = 36;\n\n ctx.beginPath();\n for (let i = 0; i < steps; i++) {\n const angle1 = (i / steps) * Math.PI * 2;\n // const angle2 = ((i + 1) / steps) * Math.PI * 2;\n\n for (let j = 0; j < steps; j++) {\n const phi1 = (j / steps) * Math.PI * 2;\n const phi2 = ((j + 1) / steps) * Math.PI * 2;\n\n const x1 =\n (outerRadius + innerRadius * Math.cos(phi1)) * Math.cos(angle1);\n const y1 =\n (outerRadius + innerRadius * Math.cos(phi1)) * Math.sin(angle1);\n const x2 =\n (outerRadius + innerRadius * Math.cos(phi2)) * Math.cos(angle1);\n const y2 =\n (outerRadius + innerRadius * Math.cos(phi2)) * Math.sin(angle1);\n\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n }\n }\n};\n\nexport const drawEggOfLife: DrawFunction = (ctx, size) => {\n const radius = size / 8;\n const centers: Point[] = [\n { x: 0, y: 0 },\n { x: radius * 2, y: 0 },\n { x: radius, y: radius * Math.sqrt(3) },\n { x: -radius, y: radius * Math.sqrt(3) },\n { x: -radius * 2, y: 0 },\n { x: -radius, y: -radius * Math.sqrt(3) },\n { x: radius, y: -radius * Math.sqrt(3) },\n ];\n\n ctx.beginPath();\n centers.forEach((center) => {\n ctx.moveTo(center.x + radius, center.y);\n ctx.arc(center.x, center.y, radius, 0, Math.PI * 2);\n });\n};\n\nexport const sacredShapes: Record<string, DrawFunction> = {\n flowerOfLife: drawFlowerOfLife,\n treeOfLife: drawTreeOfLife,\n metatronsCube: drawMetatronsCube,\n sriYantra: drawSriYantra,\n seedOfLife: drawSeedOfLife,\n vesicaPiscis: drawVesicaPiscis,\n torus: drawTorus,\n eggOfLife: drawEggOfLife,\n};\n","/**\n * Procedural shape generators — hash-derived shapes that are unique\n * per generation. Unlike the fixed shape library, these produce geometry\n * that doesn't repeat across hashes.\n *\n * All draw functions accept an RNG via the config parameter so the\n * shapes are deterministic from the hash.\n */\n\ntype DrawFunction = (\n ctx: CanvasRenderingContext2D,\n size: number,\n config?: any,\n) => void;\n\n// ── Blob: organic closed curve via cubic bezier ─────────────────────\n// Generates 5-9 control points around a circle with hash-derived\n// radius jitter, then connects them with smooth cubic beziers.\n\nexport const drawBlob: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const numPoints = 5 + Math.floor(rng() * 5); // 5-9 lobes\n const points: Array<{ x: number; y: number }> = [];\n\n for (let i = 0; i < numPoints; i++) {\n const angle = (i / numPoints) * Math.PI * 2;\n const jitter = 0.5 + rng() * 0.5; // radius varies 50-100%\n points.push({\n x: Math.cos(angle) * r * jitter,\n y: Math.sin(angle) * r * jitter,\n });\n }\n\n ctx.beginPath();\n // Start at midpoint between last and first point\n const last = points[points.length - 1];\n const first = points[0];\n ctx.moveTo((last.x + first.x) / 2, (last.y + first.y) / 2);\n\n for (let i = 0; i < numPoints; i++) {\n const curr = points[i];\n const next = points[(i + 1) % numPoints];\n const midX = (curr.x + next.x) / 2;\n const midY = (curr.y + next.y) / 2;\n ctx.quadraticCurveTo(curr.x, curr.y, midX, midY);\n }\n ctx.closePath();\n};\n\n// ── Ngon: irregular polygon with hash-controlled vertices ───────────\n// Vertex count 3-12, each vertex has independent radius jitter\n// producing irregular, organic polygons.\n\nexport const drawNgon: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const sides = 3 + Math.floor(rng() * 10); // 3-12 sides\n const jitterAmount = 0.1 + rng() * 0.4; // 10-50% vertex displacement\n\n ctx.beginPath();\n for (let i = 0; i < sides; i++) {\n const angle = (i / sides) * Math.PI * 2 - Math.PI / 2;\n const radiusJitter = 1 - jitterAmount + rng() * jitterAmount * 2;\n const x = Math.cos(angle) * r * radiusJitter;\n const y = Math.sin(angle) * r * radiusJitter;\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\n// ── Lissajous: parametric curves with hash-derived frequency ratios ─\n// Produces figure-8s, knots, and complex looping curves.\n\nexport const drawLissajous: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n // Frequency ratios — small integers produce recognizable patterns\n const freqA = 1 + Math.floor(rng() * 5); // 1-5\n const freqB = 1 + Math.floor(rng() * 5); // 1-5\n const phase = rng() * Math.PI; // phase offset\n const steps = 120;\n\n ctx.beginPath();\n for (let i = 0; i <= steps; i++) {\n const t = (i / steps) * Math.PI * 2;\n const x = Math.sin(freqA * t + phase) * r;\n const y = Math.sin(freqB * t) * r;\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\n// ── Superellipse: |x|^n + |y|^n = 1 with hash-derived exponent ─────\n// n=2 is circle, n>2 is squircle, n<1 is astroid/star-like.\n\nexport const drawSuperellipse: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n // Exponent range: 0.3 (spiky astroid) to 5 (rounded rectangle)\n const n = 0.3 + rng() * 4.7;\n const steps = 120;\n\n ctx.beginPath();\n for (let i = 0; i <= steps; i++) {\n const t = (i / steps) * Math.PI * 2;\n const cosT = Math.cos(t);\n const sinT = Math.sin(t);\n // Superellipse parametric form\n const x = Math.sign(cosT) * Math.pow(Math.abs(cosT), 2 / n) * r;\n const y = Math.sign(sinT) * Math.pow(Math.abs(sinT), 2 / n) * r;\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\n// ── Spirograph: hypotrochoid curves ─────────────────────────────────\n// Inner/outer radius ratios from hash produce unique looping patterns.\n\nexport const drawSpirograph: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const scale = size / 2;\n // R = outer radius, r = inner radius, d = pen distance from inner center\n const R = 1;\n const r = 0.2 + rng() * 0.6; // 0.2-0.8\n const d = 0.3 + rng() * 0.7; // 0.3-1.0\n // Number of full rotations needed to close the curve\n const gcd = (a: number, b: number): number => {\n const ai = Math.round(a * 1000);\n const bi = Math.round(b * 1000);\n const g = (x: number, y: number): number => (y === 0 ? x : g(y, x % y));\n return g(ai, bi) / 1000;\n };\n const period = r / gcd(R, r);\n const maxT = Math.min(period, 10) * Math.PI * 2; // cap at 10 rotations\n const steps = Math.min(600, Math.floor(maxT * 20));\n\n ctx.beginPath();\n for (let i = 0; i <= steps; i++) {\n const t = (i / steps) * maxT;\n const x = ((R - r) * Math.cos(t) + d * Math.cos(((R - r) / r) * t)) * scale / (1 + d);\n const y = ((R - r) * Math.sin(t) - d * Math.sin(((R - r) / r) * t)) * scale / (1 + d);\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\n// ── Wave ring: concentric ring with sinusoidal displacement ─────────\n// Hash controls frequency, amplitude, and number of rings.\n\nexport const drawWaveRing: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const rings = 2 + Math.floor(rng() * 4); // 2-5 rings\n const freq = 3 + Math.floor(rng() * 12); // 3-14 waves per ring\n const amp = 0.05 + rng() * 0.15; // 5-20% of radius\n\n ctx.beginPath();\n for (let ring = 0; ring < rings; ring++) {\n const baseR = r * (0.3 + (ring / rings) * 0.7);\n const steps = 80;\n for (let i = 0; i <= steps; i++) {\n const t = (i / steps) * Math.PI * 2;\n const wave = Math.sin(t * freq + ring * 1.5) * baseR * amp;\n const x = Math.cos(t) * (baseR + wave);\n const y = Math.sin(t) * (baseR + wave);\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n }\n};\n\n// ── Rose curve: polar rose r = cos(k*theta) ────────────────────────\n// k determines petal count. Integer k = k petals (odd) or 2k petals (even).\n\nexport const drawRose: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const k = 2 + Math.floor(rng() * 6); // 2-7 petal parameter\n const steps = 200;\n\n ctx.beginPath();\n for (let i = 0; i <= steps; i++) {\n const theta = (i / steps) * Math.PI * 2 * (k % 2 === 0 ? 1 : 2);\n const rr = Math.cos(k * theta) * r;\n const x = rr * Math.cos(theta);\n const y = rr * Math.sin(theta);\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\n\n// ── Shape registry ──────────────────────────────────────────────────\n\nexport const proceduralShapes: Record<string, DrawFunction> = {\n blob: drawBlob,\n ngon: drawNgon,\n lissajous: drawLissajous,\n superellipse: drawSuperellipse,\n spirograph: drawSpirograph,\n waveRing: drawWaveRing,\n rose: drawRose,\n};\n","/**\n * Shape affinity system — controls which shapes look good together,\n * quality tiers for different rendering contexts, and size preferences.\n *\n * This replaces the naive \"pick any shape\" approach with intentional\n * curation that produces more cohesive compositions.\n */\n\n// ── Quality tiers ───────────────────────────────────────────────────\n// Not all shapes render equally well at all sizes or in all contexts.\n// Tier 1 shapes are visually strong at any size; Tier 3 shapes need\n// specific conditions to look good.\n\nexport type ShapeTier = 1 | 2 | 3;\n\nexport interface ShapeProfile {\n /** Visual quality tier (1 = always good, 3 = situational) */\n tier: ShapeTier;\n /** Minimum size (as fraction of maxShapeSize) before shape looks bad */\n minSizeFraction: number;\n /** Maximum size fraction — some shapes look bad when huge */\n maxSizeFraction: number;\n /** Which shapes this one composes well with */\n affinities: string[];\n /** Category for grouping */\n category: \"basic\" | \"complex\" | \"sacred\" | \"procedural\";\n /** Whether this shape works well as a hero/focal element */\n heroCandidate: boolean;\n /** Best render styles for this shape */\n bestStyles: string[];\n}\n\nexport const SHAPE_PROFILES: Record<string, ShapeProfile> = {\n // ── Basic shapes ──────────────────────────────────────────────\n circle: {\n tier: 1,\n minSizeFraction: 0.05,\n maxSizeFraction: 1.0,\n affinities: [\"circle\", \"blob\", \"hexagon\", \"flowerOfLife\", \"seedOfLife\"],\n category: \"basic\",\n heroCandidate: false,\n bestStyles: [\"fill-only\", \"watercolor\", \"fill-and-stroke\"],\n },\n square: {\n tier: 2,\n minSizeFraction: 0.08,\n maxSizeFraction: 0.7,\n affinities: [\"square\", \"diamond\", \"superellipse\", \"islamicPattern\"],\n category: \"basic\",\n heroCandidate: false,\n bestStyles: [\"fill-and-stroke\", \"stroke-only\", \"hatched\"],\n },\n triangle: {\n tier: 1,\n minSizeFraction: 0.06,\n maxSizeFraction: 0.9,\n affinities: [\"triangle\", \"diamond\", \"hexagon\", \"merkaba\", \"sriYantra\"],\n category: \"basic\",\n heroCandidate: false,\n bestStyles: [\"fill-and-stroke\", \"fill-only\", \"watercolor\"],\n },\n hexagon: {\n tier: 1,\n minSizeFraction: 0.05,\n maxSizeFraction: 1.0,\n affinities: [\"hexagon\", \"circle\", \"flowerOfLife\", \"metatronsCube\", \"triangle\"],\n category: \"basic\",\n heroCandidate: false,\n bestStyles: [\"fill-only\", \"fill-and-stroke\", \"watercolor\"],\n },\n star: {\n tier: 2,\n minSizeFraction: 0.08,\n maxSizeFraction: 0.6,\n affinities: [\"star\", \"circle\", \"mandala\", \"spirograph\"],\n category: \"basic\",\n heroCandidate: false,\n bestStyles: [\"fill-and-stroke\", \"stroke-only\", \"dashed\"],\n },\n \"jacked-star\": {\n tier: 3,\n minSizeFraction: 0.1,\n maxSizeFraction: 0.4,\n affinities: [\"star\", \"circle\"],\n category: \"basic\",\n heroCandidate: false,\n bestStyles: [\"stroke-only\", \"dashed\"],\n },\n heart: {\n tier: 3,\n minSizeFraction: 0.1,\n maxSizeFraction: 0.5,\n affinities: [\"circle\", \"blob\"],\n category: \"basic\",\n heroCandidate: false,\n bestStyles: [\"fill-only\", \"watercolor\"],\n },\n diamond: {\n tier: 2,\n minSizeFraction: 0.06,\n maxSizeFraction: 0.8,\n affinities: [\"diamond\", \"triangle\", \"square\", \"merkaba\"],\n category: \"basic\",\n heroCandidate: false,\n bestStyles: [\"fill-and-stroke\", \"fill-only\", \"double-stroke\"],\n },\n cube: {\n tier: 3,\n minSizeFraction: 0.08,\n maxSizeFraction: 0.5,\n affinities: [\"square\", \"diamond\"],\n category: \"basic\",\n heroCandidate: false,\n bestStyles: [\"stroke-only\", \"fill-and-stroke\"],\n },\n\n // ── Complex shapes ────────────────────────────────────────────\n platonicSolid: {\n tier: 2,\n minSizeFraction: 0.15,\n maxSizeFraction: 0.8,\n affinities: [\"metatronsCube\", \"merkaba\", \"hexagon\", \"triangle\"],\n category: \"complex\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"double-stroke\", \"dashed\"],\n },\n fibonacciSpiral: {\n tier: 1,\n minSizeFraction: 0.2,\n maxSizeFraction: 1.0,\n affinities: [\"circle\", \"rose\", \"spirograph\", \"flowerOfLife\"],\n category: \"complex\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"incomplete\", \"watercolor\"],\n },\n islamicPattern: {\n tier: 2,\n minSizeFraction: 0.25,\n maxSizeFraction: 0.9,\n affinities: [\"square\", \"hexagon\", \"star\", \"mandala\"],\n category: \"complex\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"dashed\", \"hatched\"],\n },\n celticKnot: {\n tier: 2,\n minSizeFraction: 0.2,\n maxSizeFraction: 0.7,\n affinities: [\"circle\", \"lissajous\", \"spirograph\"],\n category: \"complex\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"double-stroke\"],\n },\n merkaba: {\n tier: 1,\n minSizeFraction: 0.15,\n maxSizeFraction: 1.0,\n affinities: [\"triangle\", \"diamond\", \"sriYantra\", \"metatronsCube\"],\n category: \"complex\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"fill-and-stroke\", \"double-stroke\"],\n },\n mandala: {\n tier: 1,\n minSizeFraction: 0.2,\n maxSizeFraction: 1.0,\n affinities: [\"circle\", \"flowerOfLife\", \"spirograph\", \"rose\"],\n category: \"complex\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"dashed\", \"incomplete\"],\n },\n fractal: {\n tier: 2,\n minSizeFraction: 0.2,\n maxSizeFraction: 0.8,\n affinities: [\"blob\", \"lissajous\", \"circle\"],\n category: \"complex\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"incomplete\"],\n },\n\n // ── Sacred shapes ─────────────────────────────────────────────\n flowerOfLife: {\n tier: 1,\n minSizeFraction: 0.2,\n maxSizeFraction: 1.0,\n affinities: [\"circle\", \"hexagon\", \"seedOfLife\", \"eggOfLife\", \"metatronsCube\"],\n category: \"sacred\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"watercolor\", \"incomplete\"],\n },\n treeOfLife: {\n tier: 2,\n minSizeFraction: 0.25,\n maxSizeFraction: 0.9,\n affinities: [\"circle\", \"flowerOfLife\", \"metatronsCube\"],\n category: \"sacred\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"double-stroke\"],\n },\n metatronsCube: {\n tier: 1,\n minSizeFraction: 0.2,\n maxSizeFraction: 1.0,\n affinities: [\"hexagon\", \"flowerOfLife\", \"platonicSolid\", \"merkaba\"],\n category: \"sacred\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"dashed\", \"incomplete\"],\n },\n sriYantra: {\n tier: 1,\n minSizeFraction: 0.2,\n maxSizeFraction: 1.0,\n affinities: [\"triangle\", \"merkaba\", \"mandala\", \"diamond\"],\n category: \"sacred\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"fill-and-stroke\", \"double-stroke\"],\n },\n seedOfLife: {\n tier: 1,\n minSizeFraction: 0.15,\n maxSizeFraction: 0.9,\n affinities: [\"circle\", \"flowerOfLife\", \"eggOfLife\", \"hexagon\"],\n category: \"sacred\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"watercolor\", \"fill-only\"],\n },\n vesicaPiscis: {\n tier: 2,\n minSizeFraction: 0.15,\n maxSizeFraction: 0.7,\n affinities: [\"circle\", \"seedOfLife\", \"flowerOfLife\"],\n category: \"sacred\",\n heroCandidate: false,\n bestStyles: [\"stroke-only\", \"watercolor\"],\n },\n torus: {\n tier: 3,\n minSizeFraction: 0.2,\n maxSizeFraction: 0.6,\n affinities: [\"circle\", \"spirograph\", \"waveRing\"],\n category: \"sacred\",\n heroCandidate: false,\n bestStyles: [\"stroke-only\", \"dashed\"],\n },\n eggOfLife: {\n tier: 2,\n minSizeFraction: 0.15,\n maxSizeFraction: 0.8,\n affinities: [\"circle\", \"seedOfLife\", \"flowerOfLife\"],\n category: \"sacred\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"watercolor\"],\n },\n\n // ── Procedural shapes ─────────────────────────────────────────\n blob: {\n tier: 1,\n minSizeFraction: 0.05,\n maxSizeFraction: 1.0,\n affinities: [\"blob\", \"circle\", \"superellipse\", \"waveRing\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"fill-only\", \"watercolor\", \"fill-and-stroke\"],\n },\n ngon: {\n tier: 2,\n minSizeFraction: 0.06,\n maxSizeFraction: 0.8,\n affinities: [\"hexagon\", \"triangle\", \"diamond\", \"superellipse\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"fill-and-stroke\", \"fill-only\", \"hatched\"],\n },\n lissajous: {\n tier: 2,\n minSizeFraction: 0.15,\n maxSizeFraction: 0.8,\n affinities: [\"spirograph\", \"rose\", \"celticKnot\", \"fibonacciSpiral\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"stroke-only\", \"incomplete\", \"dashed\"],\n },\n superellipse: {\n tier: 1,\n minSizeFraction: 0.05,\n maxSizeFraction: 1.0,\n affinities: [\"circle\", \"square\", \"blob\", \"hexagon\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"fill-only\", \"watercolor\", \"fill-and-stroke\"],\n },\n spirograph: {\n tier: 1,\n minSizeFraction: 0.15,\n maxSizeFraction: 0.9,\n affinities: [\"rose\", \"lissajous\", \"mandala\", \"flowerOfLife\"],\n category: \"procedural\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"incomplete\", \"dashed\"],\n },\n waveRing: {\n tier: 2,\n minSizeFraction: 0.1,\n maxSizeFraction: 0.8,\n affinities: [\"circle\", \"blob\", \"torus\", \"spirograph\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"stroke-only\", \"dashed\", \"incomplete\"],\n },\n rose: {\n tier: 1,\n minSizeFraction: 0.1,\n maxSizeFraction: 0.9,\n affinities: [\"spirograph\", \"mandala\", \"flowerOfLife\", \"circle\"],\n category: \"procedural\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"fill-only\", \"watercolor\"],\n },\n};\n\n// ── Shape palette: curated sets of shapes that work well together ────\n\nexport interface ShapePalette {\n /** Primary shapes — used most often */\n primary: string[];\n /** Supporting shapes — used less frequently */\n supporting: string[];\n /** Accent shapes — rare, for visual punctuation */\n accents: string[];\n}\n\n/**\n * Build a curated shape palette from a seed shape.\n * Uses affinity data to select shapes that compose well together,\n * filtering out low-tier shapes that don't work at the current scale.\n */\nexport function buildShapePalette(\n rng: () => number,\n shapeNames: string[],\n archetypeName: string,\n): ShapePalette {\n const available = shapeNames.filter((s) => SHAPE_PROFILES[s]);\n\n // Pick a seed shape — tier 1 shapes that are hero candidates\n const heroPool = available.filter(\n (s) => SHAPE_PROFILES[s].tier === 1 && SHAPE_PROFILES[s].heroCandidate,\n );\n const seedShape = heroPool.length > 0\n ? heroPool[Math.floor(rng() * heroPool.length)]\n : available[Math.floor(rng() * available.length)];\n\n const seedProfile = SHAPE_PROFILES[seedShape];\n\n // Primary: seed shape + its direct affinities (tier 1-2 only)\n const primaryCandidates = [seedShape, ...seedProfile.affinities]\n .filter((s) => available.includes(s))\n .filter((s) => SHAPE_PROFILES[s].tier <= 2);\n const primary = [...new Set(primaryCandidates)].slice(0, 5);\n\n // Supporting: affinities of affinities, plus same-category shapes\n const supportingSet = new Set<string>();\n for (const p of primary) {\n const profile = SHAPE_PROFILES[p];\n if (!profile) continue;\n for (const aff of profile.affinities) {\n if (available.includes(aff) && !primary.includes(aff)) {\n supportingSet.add(aff);\n }\n }\n }\n // Add same-category tier 1-2 shapes\n for (const s of available) {\n const p = SHAPE_PROFILES[s];\n if (p.category === seedProfile.category && p.tier <= 2 && !primary.includes(s)) {\n supportingSet.add(s);\n }\n }\n const supporting = [...supportingSet].slice(0, 6);\n\n // Accents: tier 1 shapes from other categories for contrast\n const usedCategories = new Set(\n [...primary, ...supporting].map((s) => SHAPE_PROFILES[s]?.category),\n );\n const accentCandidates = available.filter(\n (s) =>\n !primary.includes(s) &&\n !supporting.includes(s) &&\n SHAPE_PROFILES[s].tier <= 2 &&\n !usedCategories.has(SHAPE_PROFILES[s].category),\n );\n // Shuffle and take a few\n const accents: string[] = [];\n const shuffled = [...accentCandidates];\n for (let i = shuffled.length - 1; i > 0; i--) {\n const j = Math.floor(rng() * (i + 1));\n [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];\n }\n accents.push(...shuffled.slice(0, 3));\n\n // For certain archetypes, bias the palette\n if (archetypeName === \"geometric-precision\") {\n // Remove blobs and organic shapes from primary\n return {\n primary: primary.filter((s) => SHAPE_PROFILES[s]?.category !== \"procedural\" || s === \"ngon\"),\n supporting: supporting.filter((s) => s !== \"blob\"),\n accents,\n };\n }\n if (archetypeName === \"organic-flow\") {\n // Boost procedural/organic shapes\n const organicBoost = available.filter(\n (s) => [\"blob\", \"superellipse\", \"waveRing\", \"rose\"].includes(s) && !primary.includes(s),\n );\n return {\n primary: [...primary, ...organicBoost.slice(0, 2)],\n supporting,\n accents,\n };\n }\n\n return { primary, supporting, accents };\n}\n\n/**\n * Pick a shape from the palette with weighted probability.\n * Primary: ~60%, Supporting: ~30%, Accent: ~10%.\n * Also respects size constraints from the shape profile.\n */\nexport function pickShapeFromPalette(\n palette: ShapePalette,\n rng: () => number,\n sizeFraction: number,\n): string {\n // Filter each tier by size constraints\n const validPrimary = palette.primary.filter((s) => {\n const p = SHAPE_PROFILES[s];\n return p && sizeFraction >= p.minSizeFraction && sizeFraction <= p.maxSizeFraction;\n });\n const validSupporting = palette.supporting.filter((s) => {\n const p = SHAPE_PROFILES[s];\n return p && sizeFraction >= p.minSizeFraction && sizeFraction <= p.maxSizeFraction;\n });\n const validAccents = palette.accents.filter((s) => {\n const p = SHAPE_PROFILES[s];\n return p && sizeFraction >= p.minSizeFraction && sizeFraction <= p.maxSizeFraction;\n });\n\n const roll = rng();\n if (roll < 0.60 && validPrimary.length > 0) {\n return validPrimary[Math.floor(rng() * validPrimary.length)];\n }\n if (roll < 0.90 && validSupporting.length > 0) {\n return validSupporting[Math.floor(rng() * validSupporting.length)];\n }\n if (validAccents.length > 0) {\n return validAccents[Math.floor(rng() * validAccents.length)];\n }\n // Fallback: any valid primary or supporting\n const fallback = [...validPrimary, ...validSupporting];\n if (fallback.length > 0) return fallback[Math.floor(rng() * fallback.length)];\n // Ultimate fallback\n return palette.primary[0] || \"circle\";\n}\n\n/**\n * Get the best render style for a shape, with some randomness.\n * 70% chance of using one of the shape's best styles,\n * 30% chance of using the layer's style.\n */\nexport function pickStyleForShape(\n shapeName: string,\n layerStyle: string,\n rng: () => number,\n): string {\n const profile = SHAPE_PROFILES[shapeName];\n if (!profile || rng() > 0.7) return layerStyle;\n return profile.bestStyles[Math.floor(rng() * profile.bestStyles.length)];\n}\n","/**\n * Configuration options for image generation.\n */\nexport interface GenerationConfig {\n /** Canvas width in pixels (default: 2048) */\n width: number;\n /** Canvas height in pixels (default: 2048) */\n height: number;\n /** Controls base shape count per layer — gridSize² × 1.5 (default: 5) */\n gridSize: number;\n /** Number of layers to generate (default: 4) */\n layers: number;\n /** Minimum shape size in pixels, scaled to canvas (default: 30) */\n minShapeSize: number;\n /** Maximum shape size in pixels, scaled to canvas (default: 400) */\n maxShapeSize: number;\n /** Starting opacity for the first layer (default: 0.7) */\n baseOpacity: number;\n /** Opacity reduction per layer (default: 0.12) */\n opacityReduction: number;\n /** Base shapes per layer — defaults to gridSize² × 1.5 when 0 */\n shapesPerLayer: number;\n}\n\nexport const DEFAULT_CONFIG: GenerationConfig = {\n width: 2048,\n height: 2048,\n gridSize: 5,\n layers: 4,\n minShapeSize: 30,\n maxShapeSize: 400,\n baseOpacity: 0.7,\n opacityReduction: 0.12,\n shapesPerLayer: 0,\n};\n","/**\n * Visual archetypes — fundamentally different rendering personalities\n * selected deterministically from the hash.\n *\n * Each archetype overrides key rendering parameters to produce images\n * that look like they came from different generators entirely.\n */\nimport type { RenderStyle } from \"./canvas/draw\";\n\n// ── Background types ────────────────────────────────────────────────\n\nexport type BackgroundStyle =\n | \"radial-dark\" // current default: dark radial gradient\n | \"radial-light\" // light center, medium edges\n | \"linear-horizontal\" // left-to-right gradient\n | \"linear-diagonal\" // corner-to-corner gradient\n | \"solid-dark\" // flat dark color\n | \"solid-light\" // flat light/white color\n | \"multi-stop\"; // 3-4 color gradient\n\n// ── Palette modes ───────────────────────────────────────────────────\n\nexport type PaletteMode =\n | \"harmonious\" // current default: full palette\n | \"monochrome\" // single hue, varying lightness\n | \"duotone\" // two colors only\n | \"neon\" // high saturation on dark\n | \"pastel-light\" // soft pastels on light background\n | \"earth\" // muted warm naturals\n | \"high-contrast\"; // black + white + one accent\n\n// ── Archetype definition ────────────────────────────────────────────\n\nexport interface Archetype {\n name: string;\n /** Override gridSize (controls shape count) */\n gridSize: number;\n /** Override layer count */\n layers: number;\n /** Override base opacity */\n baseOpacity: number;\n /** Override opacity reduction per layer */\n opacityReduction: number;\n /** Override min shape size */\n minShapeSize: number;\n /** Override max shape size */\n maxShapeSize: number;\n /** Background rendering style */\n backgroundStyle: BackgroundStyle;\n /** Color palette mode */\n paletteMode: PaletteMode;\n /** Preferred render styles (weighted toward these) */\n preferredStyles: RenderStyle[];\n /** Flow line count multiplier (1 = default) */\n flowLineMultiplier: number;\n /** Whether to draw the hero shape */\n heroShape: boolean;\n /** Glow probability multiplier */\n glowMultiplier: number;\n /** Shape size power curve exponent (higher = more small shapes) */\n sizePower: number;\n /** Whether to invert colors (light shapes on dark, or dark on light) */\n invertForeground: boolean;\n}\n\n// ── Archetype definitions ───────────────────────────────────────────\n\nconst ARCHETYPES: Archetype[] = [\n {\n name: \"dense-chaotic\",\n gridSize: 9,\n layers: 5,\n baseOpacity: 0.5,\n opacityReduction: 0.06,\n minShapeSize: 10,\n maxShapeSize: 200,\n backgroundStyle: \"radial-dark\",\n paletteMode: \"harmonious\",\n preferredStyles: [\"fill-and-stroke\", \"watercolor\", \"fill-only\"],\n flowLineMultiplier: 2.5,\n heroShape: false,\n glowMultiplier: 0.5,\n sizePower: 1.2,\n invertForeground: false,\n },\n {\n name: \"minimal-spacious\",\n gridSize: 2,\n layers: 2,\n baseOpacity: 0.85,\n opacityReduction: 0.05,\n minShapeSize: 150,\n maxShapeSize: 600,\n backgroundStyle: \"solid-light\",\n paletteMode: \"duotone\",\n preferredStyles: [\"fill-and-stroke\", \"stroke-only\", \"incomplete\"],\n flowLineMultiplier: 0.3,\n heroShape: true,\n glowMultiplier: 0,\n sizePower: 0.8,\n invertForeground: false,\n },\n {\n name: \"organic-flow\",\n gridSize: 4,\n layers: 3,\n baseOpacity: 0.4,\n opacityReduction: 0.08,\n minShapeSize: 20,\n maxShapeSize: 250,\n backgroundStyle: \"radial-dark\",\n paletteMode: \"earth\",\n preferredStyles: [\"watercolor\", \"fill-only\", \"incomplete\"],\n flowLineMultiplier: 4,\n heroShape: false,\n glowMultiplier: 0.3,\n sizePower: 1.5,\n invertForeground: false,\n },\n {\n name: \"geometric-precision\",\n gridSize: 6,\n layers: 3,\n baseOpacity: 0.9,\n opacityReduction: 0.15,\n minShapeSize: 40,\n maxShapeSize: 300,\n backgroundStyle: \"solid-dark\",\n paletteMode: \"high-contrast\",\n preferredStyles: [\"stroke-only\", \"dashed\", \"double-stroke\", \"hatched\"],\n flowLineMultiplier: 0,\n heroShape: false,\n glowMultiplier: 0,\n sizePower: 1.0,\n invertForeground: false,\n },\n {\n name: \"ethereal\",\n gridSize: 7,\n layers: 5,\n baseOpacity: 0.3,\n opacityReduction: 0.03,\n minShapeSize: 50,\n maxShapeSize: 500,\n backgroundStyle: \"radial-light\",\n paletteMode: \"pastel-light\",\n preferredStyles: [\"watercolor\", \"incomplete\", \"fill-only\"],\n flowLineMultiplier: 1.5,\n heroShape: true,\n glowMultiplier: 2,\n sizePower: 1.4,\n invertForeground: false,\n },\n {\n name: \"bold-graphic\",\n gridSize: 2,\n layers: 2,\n baseOpacity: 0.95,\n opacityReduction: 0.1,\n minShapeSize: 200,\n maxShapeSize: 800,\n backgroundStyle: \"linear-diagonal\",\n paletteMode: \"duotone\",\n preferredStyles: [\"fill-and-stroke\", \"double-stroke\"],\n flowLineMultiplier: 0,\n heroShape: true,\n glowMultiplier: 0,\n sizePower: 0.5,\n invertForeground: false,\n },\n {\n name: \"neon-glow\",\n gridSize: 5,\n layers: 4,\n baseOpacity: 0.6,\n opacityReduction: 0.1,\n minShapeSize: 20,\n maxShapeSize: 350,\n backgroundStyle: \"solid-dark\",\n paletteMode: \"neon\",\n preferredStyles: [\"stroke-only\", \"double-stroke\", \"dashed\"],\n flowLineMultiplier: 2,\n heroShape: true,\n glowMultiplier: 3,\n sizePower: 1.6,\n invertForeground: false,\n },\n {\n name: \"monochrome-ink\",\n gridSize: 6,\n layers: 3,\n baseOpacity: 0.7,\n opacityReduction: 0.15,\n minShapeSize: 15,\n maxShapeSize: 350,\n backgroundStyle: \"solid-light\",\n paletteMode: \"monochrome\",\n preferredStyles: [\"hatched\", \"incomplete\", \"stroke-only\", \"dashed\"],\n flowLineMultiplier: 1.5,\n heroShape: false,\n glowMultiplier: 0,\n sizePower: 1.8,\n invertForeground: false,\n },\n {\n name: \"cosmic\",\n gridSize: 8,\n layers: 5,\n baseOpacity: 0.5,\n opacityReduction: 0.06,\n minShapeSize: 5,\n maxShapeSize: 300,\n backgroundStyle: \"radial-dark\",\n paletteMode: \"neon\",\n preferredStyles: [\"fill-only\", \"watercolor\", \"fill-and-stroke\"],\n flowLineMultiplier: 3,\n heroShape: true,\n glowMultiplier: 2.5,\n sizePower: 2.5,\n invertForeground: false,\n },\n {\n name: \"watercolor-wash\",\n gridSize: 3,\n layers: 3,\n baseOpacity: 0.25,\n opacityReduction: 0.03,\n minShapeSize: 200,\n maxShapeSize: 700,\n backgroundStyle: \"radial-light\",\n paletteMode: \"harmonious\",\n preferredStyles: [\"watercolor\", \"fill-only\", \"incomplete\"],\n flowLineMultiplier: 0.5,\n heroShape: false,\n glowMultiplier: 0.3,\n sizePower: 0.6,\n invertForeground: false,\n },\n {\n name: \"op-art\",\n gridSize: 8,\n layers: 2,\n baseOpacity: 0.95,\n opacityReduction: 0.05,\n minShapeSize: 20,\n maxShapeSize: 200,\n backgroundStyle: \"solid-light\",\n paletteMode: \"high-contrast\",\n preferredStyles: [\"fill-and-stroke\", \"stroke-only\", \"dashed\"],\n flowLineMultiplier: 0,\n heroShape: false,\n glowMultiplier: 0,\n sizePower: 0.4,\n invertForeground: false,\n },\n {\n name: \"collage\",\n gridSize: 4,\n layers: 3,\n baseOpacity: 0.9,\n opacityReduction: 0.08,\n minShapeSize: 80,\n maxShapeSize: 500,\n backgroundStyle: \"solid-light\",\n paletteMode: \"duotone\",\n preferredStyles: [\"fill-and-stroke\", \"fill-only\", \"double-stroke\"],\n flowLineMultiplier: 0,\n heroShape: true,\n glowMultiplier: 0,\n sizePower: 0.7,\n invertForeground: false,\n },\n {\n name: \"classic\",\n gridSize: 5,\n layers: 4,\n baseOpacity: 0.7,\n opacityReduction: 0.12,\n minShapeSize: 30,\n maxShapeSize: 400,\n backgroundStyle: \"radial-dark\",\n paletteMode: \"harmonious\",\n preferredStyles: [\"fill-and-stroke\", \"watercolor\", \"fill-only\"],\n flowLineMultiplier: 1,\n heroShape: true,\n glowMultiplier: 1,\n sizePower: 1.8,\n invertForeground: false,\n },\n];\n\n/**\n * Select an archetype deterministically from the hash.\n * The \"classic\" archetype preserves the original look for backward compat\n * but only gets ~10% of hashes.\n */\nexport function selectArchetype(rng: () => number): Archetype {\n return ARCHETYPES[Math.floor(rng() * ARCHETYPES.length)];\n}\n"],"names":[],"version":3,"file":"browser.js.map"}