@icure/api 8.6.7 → 8.6.9

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.
Files changed (43) hide show
  1. package/icc-api/api/IccAccesslogApi.d.ts +14 -0
  2. package/icc-api/api/IccAccesslogApi.js +31 -0
  3. package/icc-api/api/IccAccesslogApi.js.map +1 -1
  4. package/icc-api/model/AbstractFilterAccessLog.d.ts +15 -0
  5. package/icc-api/model/AbstractFilterAccessLog.js +21 -0
  6. package/icc-api/model/AbstractFilterAccessLog.js.map +1 -0
  7. package/icc-api/model/ChapterParagraph.d.ts +16 -0
  8. package/icc-api/model/ChapterParagraph.js +21 -0
  9. package/icc-api/model/ChapterParagraph.js.map +1 -0
  10. package/icc-api/model/Reimbursement.d.ts +2 -0
  11. package/icc-api/model/Reimbursement.js.map +1 -1
  12. package/icc-x-api/crypto/ExtendedApisUtilsImpl.js +2 -2
  13. package/icc-x-api/crypto/ExtendedApisUtilsImpl.js.map +1 -1
  14. package/icc-x-api/filters/AccessLogByDataOwnerPatientDateFilter.d.ts +22 -0
  15. package/icc-x-api/filters/AccessLogByDataOwnerPatientDateFilter.js +24 -0
  16. package/icc-x-api/filters/AccessLogByDataOwnerPatientDateFilter.js.map +1 -0
  17. package/icc-x-api/filters/AccessLogByDateFilter.d.ts +20 -0
  18. package/icc-x-api/filters/AccessLogByDateFilter.js +24 -0
  19. package/icc-x-api/filters/AccessLogByDateFilter.js.map +1 -0
  20. package/icc-x-api/filters/AccessLogByUserIdUserTypeDateFilter.d.ts +21 -0
  21. package/icc-x-api/filters/AccessLogByUserIdUserTypeDateFilter.js +24 -0
  22. package/icc-x-api/filters/AccessLogByUserIdUserTypeDateFilter.js.map +1 -0
  23. package/icc-x-api/icc-contact-x-api.js +3 -3
  24. package/icc-x-api/icc-contact-x-api.js.map +1 -1
  25. package/icc-x-api/index.d.ts +3 -2
  26. package/icc-x-api/index.js +4 -0
  27. package/icc-x-api/index.js.map +1 -1
  28. package/icc-x-api/utils/crypto-utils.d.ts +2 -1
  29. package/icc-x-api/utils/crypto-utils.js +57 -6
  30. package/icc-x-api/utils/crypto-utils.js.map +1 -1
  31. package/package.json +1 -1
  32. package/test/icc-x-api/crypto/anonymous-delegations-test.js +1 -1
  33. package/test/icc-x-api/crypto/anonymous-delegations-test.js.map +1 -1
  34. package/test/icc-x-api/crypto/cryptoTest.js +99 -1
  35. package/test/icc-x-api/crypto/cryptoTest.js.map +1 -1
  36. package/test/icc-x-api/crypto/legacy-metadata-migration-test.js +3 -3
  37. package/test/icc-x-api/crypto/legacy-metadata-migration-test.js.map +1 -1
  38. package/test/icc-x-api/entity-with-attachments-api-test.js +2 -2
  39. package/test/icc-x-api/entity-with-attachments-api-test.js.map +1 -1
  40. package/test/icc-x-api/icc-user-x-api-test.js +1 -1
  41. package/test/icc-x-api/icc-user-x-api-test.js.map +1 -1
  42. package/test/support/CSM-243.js +5 -5
  43. package/test/support/CSM-243.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"anonymous-delegations-test.js","sourceRoot":"","sources":["../../../../test/icc-x-api/crypto/anonymous-delegations-test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,+BAA6B;AAC7B,iCAA8B;AAC9B,uDAAoI;AACpI,mCAAkC;AAClC,4BAAyB;AACzB,kDAAwG;AACxG,sDAAkD;AAClD,4DAAwD;AAExD,4EAAwE;AACxE,+BAAiC;AACjC,iDAA6C;AAE7C,kGAA8F;AAC9F,8GAA0G;AAC1G,8FAA0F;AAC1F,2FAAuF;AAEvF,4BAA2B;AAC3B,mDAAmE;AACnE,8EAA0E;AAE1E,gFAA4E;AAE5E,6GAAyG;AACzG,IAAO,aAAa,GAAG,sBAAS,CAAC,aAAa,CAAA;AAC9C,IAAO,uBAAuB,GAAG,uCAAkB,CAAC,uBAAuB,CAAA;AAC3E,IAAO,eAAe,GAAG,mCAAgB,CAAC,eAAe,CAAA;AAEzD,MAAM,UAAU,GAAG,uBAAuB,CAAC,UAAU,CAAA;AACrD,MAAM,SAAS,GAAG,uBAAuB,CAAC,SAAS,CAAA;AAEnD,IAAA,4BAAe,EAAC,KAAK,CAAC,CAAA;AAKtB,MAAM,gBAAgB,GAAqC;IACzD,CAAC,UAAU,EAAE,UAAU,CAAC;IACxB,CAAC,WAAW,EAAE,UAAU,CAAC;IACzB,CAAC,UAAU,EAAE,WAAW,CAAC;IACzB,CAAC,WAAW,EAAE,WAAW,CAAC;CAC3B,CAAA;AACD,IAAI,GAAa,CAAA;AACjB,IAAI,SAAe,CAAA;AACnB,IAAI,UAAgB,CAAA;AACpB,MAAM,UAAU,GAAG,IAAI,+BAAmB,CAAC,kBAAgB,CAAC,CAAA;AAE5D,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,IAAA,cAAM,EAAC;;YACL,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;YACrB,MAAM,WAAW,GAAG,MAAM,IAAA,sCAAyB,GAAE,CAAA;YACrD,GAAG,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,IAAA,uBAAe,GAAE,CAAC,CAAA;YAClD,SAAS,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAA;YACpC,UAAU,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,cAAc,EAAE,CAAA;QACvD,CAAC;KAAA,CAAC,CAAA;IAEF,SAAe,gBAAgB,CAAC,QAAuB;;YACrD,MAAM,SAAS,GACb,QAAQ,KAAK,UAAU;gBACrB,CAAC,CAAC,MAAM,SAAS,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,IAAI,iCAAe,CAAC,EAAE,EAAE,EAAE,IAAA,SAAI,GAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;gBACpI,CAAC,CAAC,MAAM,SAAS,CAAC,UAAU,CAAC,qBAAqB,CAC9C,UAAU,EACV,MAAM,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,iBAAO,CAAC,EAAE,EAAE,EAAE,IAAA,SAAI,GAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CACrH,CAAA;YACP,MAAM,KAAK,GAAG,IAAA,SAAI,GAAE,CAAA;YACpB,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,UAAU,CAC7C,IAAI,WAAI,CAAC;gBACP,EAAE,EAAE,KAAK;gBACT,IAAI,EAAE,KAAK;gBACX,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,IAAA,yBAAY,GAAE;gBACrB,MAAM,EAAE,QAAQ;gBAChB,iBAAiB,EAAE,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;gBACrE,SAAS,EAAE,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;aAC/D,CAAC,CACH,CAAA;YACD,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAG,EAAE,IAAA,SAAI,GAAE,CAAC,CAAA;YAC7D,OAAO;gBACL,GAAG,EAAE,MAAM,IAAA,iBAAO,EAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,kBAAgB,CAAC;gBAC7D,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,SAAS,CAAC,EAAG,EAAE;aACnD,CAAA;QACH,CAAC;KAAA;IAED,SAAe,qBAAqB,CAAC,IAAU,EAAE,WAAmB,EAAE,UAAwC;;YAC5G,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAA;YACzF,IAAI,cAAc,EAAE,CAAC;gBACnB,OAAO,cAAc,CAAA;YACvB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,WAAW,CAAC,CAAA;YACtB,CAAC;QACH,CAAC;KAAA;IAED,SAAe,wBAAwB,CAAC,gBAA0B,EAAE,mBAAyB,EAAE,oBAA8B;;YAC3H,MAAM,gBAAgB,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA;YAC7C,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,sBAAU,CAAC,MAAM,CAAC,CAAA;YAC1E,MAAM,MAAM,GAAG,MAAM,IAAA,iBAAO,EAAC,GAAG,CAAC,QAAQ,EAAE,gBAAgB,CAAC,IAAI,CAAC,KAAM,EAAE,gBAAgB,CAAC,EAAE,EAAE,kBAAgB,EAAE,UAAU,EAAE;gBAC1H,8BAA8B,EAAE,KAAK;aACtC,CAAC,CAAA;YACF,MAAM,MAAM,CAAC,uBAAuB,CAAC,mCAAmC,CAAC,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE;gBAC1G,qCAAiB,CAAC,OAAO;gBACzB,qCAAiB,CAAC,GAAG;aACtB,CAAC,CAAA;YACF,MAAM,mBAAmB,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;YACjD,MAAM,SAAS,GAAG,MAAM,qBAAqB,CAAC,mBAAmB,EAAE,oBAAoB,CAAC,WAAW,EAAE,wCAA4B,CAAC,eAAe,CAAC,CAAA;YAClJ,MAAM,qBAAqB,GAAG,MAAM,SAAS;iBAC1C,MAAM,CAAC,CAAO,GAAG,EAAE,QAAQ,EAAE,EAAE;gBAC9B,MAAM,UAAU,GAAG,MAAM,GAAG,CAAA;gBAC5B,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,kBAAkB,CAAC,gCAAgC,CAC9F,oBAAoB,CAAC,IAAI,EACzB,SAAS,EACT,SAAS,EACT,IAAI,uDAA0B,CAAC;oBAC7B,MAAM,EAAE,IAAI,+DAA8B,CAAC;wBACzC,IAAI,EAAE,gBAAgB;wBACtB,iBAAiB,EAAE,QAAQ;qBAC5B,CAAC;iBACH,CAAC,CACH,CAAA;gBACD,OAAO,CAAC,GAAG,UAAU,EAAE,GAAG,UAAU,CAAC,IAAK,CAAC,CAAA;YAC7C,CAAC,CAAA,EAAE,OAAO,CAAC,OAAO,CAAC,EAAuB,CAAC,CAAC;iBAC3C,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,2CAAoB,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACvF,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,oBAAoB,KAAK,gBAAgB,CAAC,WAAW,CAAC,CAAA;YACrH,IAAA,aAAM,EAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;YAC1C,MAAM,mBAAmB,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;YACzF,MAAM,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;YACpC,OAAO,MAAM,CAAA;QACf,CAAC;KAAA;IAED,SAAe,kBAAkB,CAC/B,WAAiB,EACjB,WAAqB,EACrB,YAAsB;;YAEtB,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,qBAAqB,CAC9D,UAAU,EACV,MAAM,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,iBAAO,CAAC,EAAE,EAAE,EAAE,IAAA,SAAI,GAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,CAC3I,CAAA;YACD,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAA;YACxE,MAAM,eAAe,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;YAC/I,MAAM,WAAW,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;YACzC,MAAM,eAAe,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE;gBACnH,oBAAoB,EAAE,UAAU;aACjC,CAAC,CAAA;YACF,MAAM,cAAc,GAAoB,EAAE,CAAA;YAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,oBAAoB,CAAC,2BAA2B,CAC3E,WAAW,CAAC,IAAI,EAChB,MAAM,WAAW,CAAC,oBAAoB,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,yBAAyB,CAAC,EAAE,EAAE,CAAC,CAC9H,CAAA;gBACD,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,oBAAoB,CAAC,SAAS,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;gBACrI,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC/B,CAAC;YACD,IAAA,aAAM,EAAC,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;YAChD,KAAK,MAAM,EAAE,IAAI,cAAc,EAAE,CAAC;gBAChC,IAAA,aAAM,EAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;YACrC,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,CAAA;QACrD,CAAC;KAAA;IAED,SAAe,sBAAsB,CAAC,IAAU,EAAE,QAA+D;;YAC/G,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAA;YAChD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAG,CAAC,CAAA;YACpF,IAAA,aAAM,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACpD,MAAM,SAAS,GAAG,MAAM,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,wCAA4B,CAAC,aAAa,CAAC,CAAA;YACzI,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAA;YACrE,IAAA,aAAM,EAAC,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAA;YACnC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAC1C,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CACtC,MAAM,SAAS,CAAC,MAAM,CAAC,CAAO,GAAG,EAAE,QAAQ,EAAE,EAAE;gBAC7C,MAAM,UAAU,GAAG,MAAM,GAAG,CAAA;gBAC5B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,+BAA+B,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;gBAClG,OAAO,CAAC,GAAG,UAAU,EAAE,GAAG,UAAU,CAAC,CAAA;YACvC,CAAC,CAAA,EAAE,OAAO,CAAC,OAAO,CAAC,EAAqB,CAAC,CAAC,EAC1C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CACZ,CAAA;YACD,IAAA,aAAM,EAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;YAC/E,KAAK,MAAM,UAAU,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;gBACjD,MAAM,WAAW,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,CAAC,CAAA;gBAC/E,IAAA,aAAM,EAAC,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;gBACvC,IAAA,aAAM,EAAC,WAAY,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;YACrD,CAAC;QACH,CAAC;KAAA;IAED,SAAe,eAAe,CAC5B,gBAAwH,EACxH,4BAAwE,EACxE,qCAA8C;;YAE9C,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAA;YACzH,IAAA,aAAM,EAAC,gBAAgB,CAAC,6BAA6B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAA;YACtG,KAAK,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC,EAAE,CAAC;gBACxF,IAAA,aAAM,EAAC,gBAAgB,CAAC,wBAAwB,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;YACxF,CAAC;QACH,CAAC;KAAA;IAED,EAAE,CAAC,8JAA8J,EAAE,GAAS,EAAE;QAC5K,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAA;QACjD,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAA;QACjD,IAAI,MAAM,GAAiB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,6BAA6B,CACrF,IAAI,CAAC,QAAQ,CAAC,IAAI,EAClB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAC/F,CAAA;QACD;;WAEG;QACH,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK,EAAE,EACtD,KAAK,CACN,CAAA;QACD,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC1H;;WAEG;QACH,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACnD,EACD,KAAK,CACN,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACnD,EACD,KAAK,CACN,CAAA;QACD;;;WAGG;QACH,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC3H,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QACvC,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACpD,EACD,KAAK,CACN,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACnD,EACD,IAAI,CACL,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EACjE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACpD,EACD,KAAK,CACN,CAAA;QACD;;;WAGG;QACH,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,SAAS,EAAE,CAAC,CAAA;QAC1H,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QACvC,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACpD,EACD,IAAI,CACL,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,IAAI;SACnD,EACD,IAAI,CACL,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EACjE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACpD,EACD,KAAK,CACN,CAAA;QACD;;;WAGG;QACH,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,SAAS,EAAE,CAAC,CAAA;QAC3H,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QACvC,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACpD,EACD,IAAI,CACL,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,IAAI;SACnD,EACD,IAAI,CACL,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EACjE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YACnD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,IAAI;SACnD,EACD,KAAK,CACN,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EACjE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,IAAI,EAAE,4CAA4C;YAChG,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,IAAI;SACnD,EACD,IAAI,CACL,CAAA;QACD;;;;WAIG;QACH,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC3H,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QACvC,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YACnD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACpD,EACD,IAAI,CACL,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,IAAI;SACnD,EACD,IAAI,CACL,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EACjE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YACnD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,IAAI;SACnD,EACD,IAAI,CACL,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EACjE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,IAAI,EAAE,4CAA4C;YAChG,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACpD,EACD,IAAI,CACL,CAAA;IACH,CAAC,CAAA,CAAC,CAAA;IAEF,EAAE,CAAC,qKAAqK,EAAE,GAAS,EAAE;QACnL,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,IAAA,mCAAsB,EAAC,GAAG,CAAC,CAAA,CAAC,uCAAuC;QAC5K,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAA;QACvD,IAAI,MAAM,GAAY,MAAM,SAAS,CAAC,UAAU,CAAC,aAAa,CAC5D,MAAM,SAAS,CAAC,UAAU,CAAC,sBAAsB,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CACrG,CAAA;QACD,MAAM,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QACjI,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QAC7C,MAAM,cAAc,GAAG;YACrB,6EAA6E;YAC7E,CAAC,UAAU,CAAC,iBAAkB,CAAC,EAAE,eAAe,CAAC,KAAK;YACtD,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SAC1D,CAAA;QACD,MAAM,eAAe,CAAC,MAAM,QAAQ,CAAC,UAAU,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QACzG,MAAM,eAAe,CAAC,MAAM,SAAS,CAAC,UAAU,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QAC1G,MAAM,eAAe,CAAC,MAAM,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;IAClH,CAAC,CAAA,CAAC,CAAA;IAEF,EAAE,CAAC,oIAAoI,EAAE,GAAS,EAAE;QAClJ,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAA;QACjD,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAA;QACjD,IAAI,MAAM,GAAiB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,6BAA6B,CACrF,IAAI,CAAC,QAAQ,CAAC,IAAI,EAClB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAC/F,CAAA;QACD,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC1H,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC3H,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,SAAS,EAAE,CAAC,CAAA;QAC1H,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QACvC,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,SAAS,EAAE,CAAC,CAAA;QAC3H,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC3H;;;;WAIG;QACH,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,0BAA0B,CAAC,iCAAiC,CACnF,EAAE,MAAM,EAAE,IAAI,EAAE,wCAA4B,CAAC,YAAY,EAAE,EAC3D,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CACpF,CAAA;QACD;;;;;WAKG;QACH,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QACvC,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QACvC,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YACnD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACpD,EACD,IAAI,CACL,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YACnD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACpD,EACD,IAAI,CACL,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EACjE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YACnD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACpD,EACD,KAAK,CACN,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EACjE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YACnD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACpD,EACD,IAAI,CACL,CAAA;QACD,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,0BAA0B,CAAC,iCAAiC,CACpF,EAAE,MAAM,EAAE,IAAI,EAAE,wCAA4B,CAAC,YAAY,EAAE,EAC3D,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CACnF,CAAA;QACD;;;;WAIG;QACH,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QACvC,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QACvC,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YACnD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACpD,EACD,KAAK,CACN,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YACnD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACpD,EACD,KAAK,CACN,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EACjE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YACnD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACpD,EACD,KAAK,CACN,CAAA;QACD,MAAM,eAAe,CACnB,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EACjE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YACnD,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACpD,EACD,KAAK,CACN,CAAA;IACH,CAAC,CAAA,CAAC,CAAA;IAEF,EAAE,CAAC,gEAAgE,EAAE,GAAS,EAAE;QAC9E,MAAM,SAAS,GAAG,MAAM,IAAA,mCAAsB,EAAC,GAAG,CAAC,CAAA;QACnD,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAA;QACvD,IAAI,MAAM,GAAiB,MAAM,SAAS,CAAC,SAAS,CAAC,eAAe,CAAC,6BAA6B,CAChG,SAAS,CAAC,UAAU,EACpB,MAAM,SAAS,CAAC,SAAS,CAAC,eAAe,CAAC,WAAW,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAC5G,CAAA,CAAC,8DAA8D;QAChE,MAAM,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,eAAe,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC5I,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,0BAA0B,CAAC,iCAAiC,CAC9F,EAAE,MAAM,EAAE,IAAI,EAAE,wCAA4B,CAAC,YAAY,EAAE,EAC3D,CAAC,SAAS,CAAC,SAAS,CAAC,iBAAkB,CAAC,CACzC,CAAA;QACD,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QAC7C,MAAM,cAAc,GAAG;YACrB,CAAC,SAAS,CAAC,UAAU,CAAC,iBAAkB,CAAC,EAAE,eAAe,CAAC,KAAK;YAChE,CAAC,SAAS,CAAC,SAAS,CAAC,iBAAkB,CAAC,EAAE,eAAe,CAAC,KAAK;YAC/D,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SAC1D,CAAA;QACD,MAAM,eAAe,CAAC,MAAM,SAAS,CAAC,SAAS,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QACzH,MAAM,eAAe,CAAC,MAAM,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QACxH,MAAM,eAAe,CAAC,MAAM,SAAS,CAAC,SAAS,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QACzH,MAAM,eAAe,CAAC,MAAM,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;IACvH,CAAC,CAAA,CAAC,CAAA;IAEF,EAAE,CAAC,uGAAuG,EAAE,GAAS,EAAE;QACrH,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAA;QAChD,IAAI,MAAM,GAAiB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,6BAA6B,CACrF,IAAI,CAAC,QAAQ,CAAC,IAAI,EAClB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAC/F,CAAA;QACD,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC1H,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC1H,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,0BAA0B,CAAC,iCAAiC,CACnF,EAAE,MAAM,EAAE,IAAI,EAAE,wCAA4B,CAAC,YAAY,EAAE,EAC3D,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CACvD,CAAA;QACD,MAAM,yBAAyB,GAAG,IAAI,2DAA4B,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAA;QACpI,MAAM,uBAAuB,GAAG,MAAM,yBAAyB,CAAC,mBAAmB,CACjF,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAiB,CAAC,iBAAkB,CAAC,EAAE,EACjE,EAAE,CACH,CAAA;QACD,IAAA,aAAM,EAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA,CAAC,2CAA2C;QAC7F,IAAA,aAAM,EAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAA;QAC5D,IAAA,aAAM,EAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAA;QAC3D,MAAM,sBAAsB,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAiB,CAAC,iBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAE,CAAC,CAAC,CAAC,CAAA;QACzI,IAAA,aAAM,EAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;QAClD,IAAA,aAAM,EAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAA;QAC9C,IAAA,aAAM,EAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAA;IACnF,CAAC,CAAA,CAAC,CAAA;IAEF,EAAE,CAAC,oFAAoF,EAAE,GAAS,EAAE;QAClG,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAA;QAChD,IAAI,OAAO,GAAiB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,6BAA6B,CACtF,IAAI,CAAC,QAAQ,CAAC,IAAI,EAClB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAC/F,CAAA;QACD,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC5H,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC5H,IAAI,OAAO,GAAiB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,6BAA6B,CACtF,IAAI,CAAC,QAAQ,CAAC,IAAI,EAClB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAC/F,CAAA;QACD,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC5H,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC5H,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,0BAA0B,CAAC,iCAAiC,CACnF,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,wCAA4B,CAAC,YAAY,EAAE,EACpE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC5B,CAAA;QACD,MAAM,cAAc,GAAG;YACrB,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACnD,CAAA;QACD,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QACtC,MAAM,eAAe,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QAC/G,MAAM,eAAe,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QAC/G,MAAM,eAAe,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QAC/G,MAAM,eAAe,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QAC/G,MAAM,eAAe,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QAC/G,MAAM,eAAe,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;IACjH,CAAC,CAAA,CAAC,CAAA;IAEF,EAAE,CAAC,qIAAqI,EAAE,GAAS,EAAE;QACnJ,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAA;QACjD,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAA;QACjD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC/C,IAAI,MAAM,GAAiB,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,6BAA6B,CACtF,KAAK,CAAC,QAAQ,CAAC,IAAI,EACnB,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CACjG,CAAA;QACD,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC5H,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC3H,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,0BAA0B,CAAC,iCAAiC,CACpF,EAAE,MAAM,EAAE,IAAI,EAAE,wCAA4B,CAAC,YAAY,EAAE,EAC3D,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CACxD,CAAA;QACD,MAAM,mBAAmB,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAiB,CAAC,iBAAkB,CAAC,CAAC,IAAI,CAC1F,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC,iBAAiB,KAAK,SAAS,CACtG,CAAC,CAAC,CAAC,CAAA;QACL,IAAA,aAAM,EAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;QAC/C,IAAA,aAAM,EAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAA;QAC3C,MAAM,gBAAgB,GAAG,IAAI,2DAA4B,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAA;QAC3H,MAAM,wCAAwC,GAAG,CAAC,MAAM,gBAAgB,CAAC,mBAAmB,CAAC,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACpI,IAAA,aAAM,EAAC,wCAAwC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;QACpE,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,gBAAiB,CAAC,iBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QACpH,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,0BAA0B,CAAC,iCAAiC,CACnF,EAAE,MAAM,EAAE,IAAI,EAAE,wCAA4B,CAAC,YAAY,EAAE,EAC3D,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CACzD,CAAA;QACD,MAAM,uCAAuC,GAAG,CAAC,MAAM,gBAAgB,CAAC,mBAAmB,CAAC,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACnI,IAAA,aAAM,EAAC,uCAAuC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;QACnE,IAAA,aAAM,EAAC,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,gBAAiB,CAAC,iBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QACnH,IAAA,aAAM,EAAC,uCAAuC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,wCAAwC,CAAC,GAAG,CAAC,CAAA;IAC5G,CAAC,CAAA,CAAC,CAAA;IAEF,EAAE,CAAC,2EAA2E,EAAE,GAAS,EAAE;QACzF,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAA;QAChD,IAAI,MAAM,GAAiB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,6BAA6B,CACrF,IAAI,CAAC,QAAQ,CAAC,IAAI,EAClB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAC/F,CAAA;QACD,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC1H,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC1H,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QAC1H,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,0BAA0B,CAAC,iCAAiC,CACnF,EAAE,MAAM,EAAE,IAAI,EAAE,wCAA4B,CAAC,YAAY,EAAE,EAC3D,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC5B,CAAA;QACD,MAAM,cAAc,GAAG;YACrB,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACnD,CAAA;QACD,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QACtC,MAAM,eAAe,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QAC9G,MAAM,eAAe,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QAC9G,MAAM,eAAe,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QAC9G,4FAA4F;QAC5F,MAAM,eAAe,CACnB,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAChE;YACE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACnD,EACD,IAAI,CACL,CAAA;IACH,CAAC,CAAA,CAAC,CAAA;IAEF,EAAE,CAAC,uIAAuI,EAAE,GAAS,EAAE;QACrJ,MAAM,SAAS,GAAG,MAAM,IAAA,mCAAsB,EAAC,GAAG,CAAC,CAAA;QACnD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAA;QAChD,uBAAuB;QACvB,IAAI,MAAM,GAAiB,MAAM,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,6BAA6B,CAC/F,SAAS,CAAC,SAAS,EACnB,MAAM,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,WAAW,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAC1G,CAAA;QACD,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QACpI,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QACpI,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QACpI,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAA;QACpI,kCAAkC;QAClC,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,0BAA0B,CAAC,iCAAiC,CAC9F,EAAE,MAAM,EAAE,IAAI,EAAE,wCAA4B,CAAC,YAAY,EAAE,EAC3D,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC5B,CAAA;QACD,kBAAkB;QAClB,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QACtC,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,0BAA0B,CAAC,iCAAiC,CACnF,EAAE,MAAM,EAAE,IAAI,EAAE,wCAA4B,CAAC,YAAY,EAAE,EAC3D,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC5B,CAAA;QACD,uBAAuB;QACvB,MAAM,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,0BAA0B,CAAC,iCAAiC,CAC7F,EAAE,MAAM,EAAE,IAAI,EAAE,wCAA4B,CAAC,YAAY,EAAE,EAC3D,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC5B,CAAA;QACD,MAAM,cAAc,GAAG;YACrB,CAAC,SAAS,CAAC,SAAS,CAAC,iBAAkB,CAAC,EAAE,eAAe,CAAC,KAAK;YAC/D,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;YAClD,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,KAAK;SACnD,CAAA;QACD,MAAM,eAAe,CAAC,MAAM,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QACxH,MAAM,eAAe,CAAC,MAAM,SAAS,CAAC,SAAS,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QACzH,MAAM,eAAe,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QAC9G,MAAM,eAAe,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QAC9G,MAAM,eAAe,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QAC9G,MAAM,eAAe,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAA;QAC9G,MAAM,mBAAmB,GAAG,IAAI,2DAA4B,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAA;QACxI,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAiB,CAAC,iBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAE,CAAC,CAAC,CAAC,CAAA;QACnI,IAAA,aAAM,EAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAA;QAC5C,IAAA,aAAM,EAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAA;QACxC,MAAM,iBAAiB,GAAG,MAAM,mBAAmB,CAAC,mBAAmB,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAiB,CAAC,iBAAkB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QAC9I,IAAA,aAAM,EAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA,CAAC,uCAAuC;IACrF,CAAC,CAAA,CAAC,CAAA;IAEF,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,EAAE,YAAY,CAAC,EAAE,EAAE;QACzD,EAAE,CAAC,wEAAwE,aAAa,KAAK,YAAY,GAAG,EAAE,GAAS,EAAE;YACvH,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,aAAa,CAAC,CAAA;YAC1D,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,YAAY,CAAC,CAAA;YACxD,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAA;YACpG,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;YAC7C,MAAM,sBAAsB,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;YACnD,MAAM,sBAAsB,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QACtD,CAAC,CAAA,CAAC,CAAA;QAEF,EAAE,CAAC,mGAAmG,aAAa,KAAK,YAAY,GAAG,EAAE;;gBACvI,IAAI,aAAa,IAAI,YAAY,IAAI,aAAa,IAAI,UAAU,EAAE,CAAC;oBACjE,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,aAAa,CAAC,CAAA;oBAC1D,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,YAAY,CAAC,CAAA;oBACxD,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAA;oBACpG,MAAM,+BAA+B,GAAG,MAAM,wBAAwB,CAAC,YAAY,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAA;oBACpI,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;oBAC7C,MAAM,sBAAsB,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;oBACnD,MAAM,sBAAsB,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;oBACpD,MAAM,sBAAsB,CAAC,+BAA+B,EAAE,IAAI,CAAC,CAAA;gBACrE,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAA;gBAC5D,CAAC;YACH,CAAC;SAAA,CAAC,CAAA;QAEF,EAAE,CAAC,+FAA+F,aAAa,KAAK,YAAY,GAAG,EAAE;;gBACnI,IAAI,aAAa,IAAI,YAAY,IAAI,YAAY,IAAI,UAAU,EAAE,CAAC;oBAChE,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,aAAa,CAAC,CAAA;oBAC1D,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,YAAY,CAAC,CAAA;oBACxD,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAA;oBACpG,MAAM,8BAA8B,GAAG,MAAM,wBAAwB,CAAC,WAAW,CAAC,QAAQ,EAAE,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAA;oBACpI,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;oBAC7C,MAAM,sBAAsB,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;oBACnD,MAAM,sBAAsB,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;oBACpD,MAAM,sBAAsB,CAAC,8BAA8B,EAAE,IAAI,CAAC,CAAA;gBACpE,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAA;gBAC5D,CAAC;YACH,CAAC;SAAA,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA","sourcesContent":["import { expect } from 'chai'\nimport { before } from 'mocha'\nimport { createHcpHierarchyApis, getEnvironmentInitializer, getTempEmail, setLocalStorage, TestUtils } from '../../utils/test_utils'\nimport { webcrypto } from 'crypto'\nimport 'isomorphic-fetch'\nimport { Apis, WebCryptoPrimitives, EntityWithDelegationTypeName, ShaVersion } from '../../../icc-x-api'\nimport { User } from '../../../icc-api/model/User'\nimport { Patient } from '../../../icc-api/model/Patient'\nimport { HealthElement } from '../../../icc-api/model/HealthElement'\nimport { HealthcareParty } from '../../../icc-api/model/HealthcareParty'\nimport { v4 as uuid } from 'uuid'\nimport { TestApi } from '../../utils/TestApi'\nimport { CryptoPrimitives } from '../../../icc-x-api/crypto/CryptoPrimitives'\nimport { FilterChainMaintenanceTask } from '../../../icc-api/model/FilterChainMaintenanceTask'\nimport { MaintenanceTaskAfterDateFilter } from '../../../icc-x-api/filters/MaintenanceTaskAfterDateFilter'\nimport { KeyPairUpdateRequest } from '../../../icc-x-api/maintenance/KeyPairUpdateRequest'\nimport { EntityShareRequest } from '../../../icc-api/model/requests/EntityShareRequest'\nimport { MaintenanceTask } from '../../../icc-api/model/MaintenanceTask'\nimport * as _ from 'lodash'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { SecureDelegation } from '../../../icc-api/model/SecureDelegation'\nimport { CalendarItem } from '../../../icc-api/model/CalendarItem'\nimport { DataOwnerTypeEnum } from '../../../icc-api/model/DataOwnerTypeEnum'\nimport { Message } from '../../../icc-api/model/Message'\nimport { IccSecureDelegationKeyMapApi } from '../../../icc-api/api/internal/IccSecureDelegationKeyMapApi'\nimport initMasterApi = TestUtils.initMasterApi\nimport RequestedPermissionEnum = EntityShareRequest.RequestedPermissionEnum\nimport AccessLevelEnum = SecureDelegation.AccessLevelEnum\n\nconst FULL_WRITE = RequestedPermissionEnum.FULL_WRITE\nconst FULL_READ = RequestedPermissionEnum.FULL_READ\n\nsetLocalStorage(fetch)\n\ntype DataOwnerType = 'explicit' | 'anonymous'\ntype UserInfo = { user: User; pw: string; dataOwnerId: string }\n\nconst typeCombinations: [DataOwnerType, DataOwnerType][] = [\n ['explicit', 'explicit'],\n ['anonymous', 'explicit'],\n ['explicit', 'anonymous'],\n ['anonymous', 'anonymous'],\n]\nlet env: TestVars\nlet masterApi: Apis\nlet masterUser: User\nconst primitives = new WebCryptoPrimitives(webcrypto as any)\n\ndescribe('Anonymous delegations', () => {\n before(async function () {\n this.timeout(6000000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n masterApi = await initMasterApi(env)\n masterUser = await masterApi.userApi.getCurrentUser()\n })\n\n async function createUserAndApi(userType: DataOwnerType): Promise<{ api: Apis; userInfo: UserInfo }> {\n const dataOwner =\n userType === 'explicit'\n ? await masterApi.healthcarePartyApi.createHealthcareParty(new HealthcareParty({ id: uuid(), firstName: 'test', lastName: 'test' }))\n : await masterApi.patientApi.createPatientWithUser(\n masterUser,\n await masterApi.patientApi.newInstance(masterUser, new Patient({ id: uuid(), firstName: 'test', lastName: 'test' }))\n )\n const login = uuid()\n const user = await masterApi.userApi.createUser(\n new User({\n id: login,\n name: login,\n login: login,\n email: getTempEmail(),\n status: 'ACTIVE',\n healthcarePartyId: userType === 'explicit' ? dataOwner.id : undefined,\n patientId: userType === 'anonymous' ? dataOwner.id : undefined,\n })\n )\n const pw = await masterApi.userApi.getToken(user.id!, uuid())\n return {\n api: await TestApi(env.iCureUrl, login, pw, webcrypto as any),\n userInfo: { user, pw, dataOwnerId: dataOwner.id! },\n }\n }\n\n async function dataOwnerIdsForSearch(apis: Apis, dataOwnerId: string, entityType: EntityWithDelegationTypeName): Promise<string[]> {\n const delegationKeys = await apis.cryptoApi.exchangeData.getAllDelegationKeys(entityType)\n if (delegationKeys) {\n return delegationKeys\n } else {\n return [dataOwnerId]\n }\n }\n\n async function loseKeyAndGiveAccessBack(userThatLosesKey: UserInfo, apiToGiveAccessBack: Apis, userGivingAccessBack: UserInfo): Promise<Apis> {\n const timeBeforeNewKey = new Date().getTime()\n const newKeyPair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const newApi = await TestApi(env.iCureUrl, userThatLosesKey.user.login!, userThatLosesKey.pw, webcrypto as any, newKeyPair, {\n createMaintenanceTasksOnNewKey: false,\n })\n await newApi.icureMaintenanceTaskApi.createMaintenanceTasksForNewKeypair(userThatLosesKey.user, newKeyPair, [\n DataOwnerTypeEnum.Patient,\n DataOwnerTypeEnum.Hcp,\n ])\n await apiToGiveAccessBack.cryptoApi.forceReload()\n const searchIds = await dataOwnerIdsForSearch(apiToGiveAccessBack, userGivingAccessBack.dataOwnerId, EntityWithDelegationTypeName.MaintenanceTask)\n const keyPairUpdateRequests = await searchIds\n .reduce(async (acc, searchId) => {\n const awaitedAcc = await acc\n const currResult = await apiToGiveAccessBack.maintenanceTaskApi.filterMaintenanceTasksByWithUser(\n userGivingAccessBack.user,\n undefined,\n undefined,\n new FilterChainMaintenanceTask({\n filter: new MaintenanceTaskAfterDateFilter({\n date: timeBeforeNewKey,\n healthcarePartyId: searchId,\n }),\n })\n )\n return [...awaitedAcc, ...currResult.rows!]\n }, Promise.resolve([] as MaintenanceTask[]))\n .then((tasks) => tasks.map((task) => KeyPairUpdateRequest.fromMaintenanceTask(task)))\n const concernedRequest = keyPairUpdateRequests.filter((x) => x.concernedDataOwnerId === userThatLosesKey.dataOwnerId)\n expect(concernedRequest).to.have.length(1)\n await apiToGiveAccessBack.icureMaintenanceTaskApi.applyKeyPairUpdate(concernedRequest[0])\n await newApi.cryptoApi.forceReload()\n return newApi\n }\n\n async function createAndShareData(\n creatorApis: Apis,\n creatorInfo: UserInfo,\n delegateInfo: UserInfo\n ): Promise<{ patient: Patient; healthElements: HealthElement[] }> {\n const patient = await masterApi.patientApi.createPatientWithUser(\n masterUser,\n await masterApi.patientApi.newInstance(masterUser, new Patient({ id: uuid(), firstName: 'test', lastName: 'test', note: 'Patient note' }))\n )\n const secretIds = await masterApi.patientApi.decryptSecretIdsOf(patient)\n const updatedPatient1 = await masterApi.patientApi.shareWith(creatorInfo.dataOwnerId, patient, secretIds, { requestedPermissions: FULL_WRITE })\n await creatorApis.cryptoApi.forceReload()\n const updatedPatient2 = await creatorApis.patientApi.shareWith(delegateInfo.dataOwnerId, updatedPatient1, secretIds, {\n requestedPermissions: FULL_WRITE,\n })\n const healthElements: HealthElement[] = []\n for (let i = 0; i < 5; i++) {\n const he = await creatorApis.healthcareElementApi.createHealthElementWithUser(\n creatorInfo.user,\n await creatorApis.healthcareElementApi.newInstance(creatorInfo.user, updatedPatient2, { note: `Health element note - ${i}` })\n )\n const sharedHe = await creatorApis.healthcareElementApi.shareWith(delegateInfo.dataOwnerId, he, { requestedPermissions: FULL_WRITE })\n healthElements.push(sharedHe)\n }\n expect(updatedPatient2.note).to.not.be.undefined\n for (const he of healthElements) {\n expect(he.note).to.not.be.undefined\n }\n return { patient: updatedPatient2, healthElements }\n }\n\n async function checkCanFindAndDecrypt(apis: Apis, expected: { patient: Patient; healthElements: HealthElement[] }) {\n const user = await apis.userApi.getCurrentUser()\n const patient = await apis.patientApi.getPatientWithUser(user, expected.patient.id!)\n expect(patient.note).to.equal(expected.patient.note)\n const searchIds = await dataOwnerIdsForSearch(apis, apis.dataOwnerApi.getDataOwnerIdOf(user), EntityWithDelegationTypeName.HealthElement)\n const patientKeys = await apis.patientApi.decryptSecretIdsOf(patient)\n expect(patientKeys).to.not.be.empty\n const sfks = _.uniq(patientKeys).join(',')\n const retrievedHealthElements = _.uniqBy(\n await searchIds.reduce(async (acc, searchId) => {\n const awaitedAcc = await acc\n const currResult = await apis.healthcareElementApi.findByHCPartyPatientSecretFKeys(searchId, sfks)\n return [...awaitedAcc, ...currResult]\n }, Promise.resolve([] as HealthElement[])),\n (x) => x.id\n )\n expect(retrievedHealthElements.length).to.equal(expected.healthElements.length)\n for (const expectedHe of expected.healthElements) {\n const retrievedHe = retrievedHealthElements.find((x) => x.id === expectedHe.id)\n expect(retrievedHe).to.not.be.undefined\n expect(retrievedHe!.note).to.equal(expectedHe.note)\n }\n }\n\n async function checkAccessInfo(\n actualAccessInfo: { permissionsByDataOwnerId: { [p: string]: AccessLevelEnum }; hasUnknownAnonymousDataOwners: boolean },\n expectedDataOwnersWithAccess: { [dataOwnerId: string]: AccessLevelEnum },\n expectedHasUnknownAnonymousDataOwners: boolean\n ) {\n expect(Object.keys(actualAccessInfo.permissionsByDataOwnerId)).to.have.members(Object.keys(expectedDataOwnersWithAccess))\n expect(actualAccessInfo.hasUnknownAnonymousDataOwners).to.equal(expectedHasUnknownAnonymousDataOwners)\n for (const [dataOwnerId, expectedLevel] of Object.entries(expectedDataOwnersWithAccess)) {\n expect(actualAccessInfo.permissionsByDataOwnerId[dataOwnerId]).to.equal(expectedLevel)\n }\n }\n\n it('without de-anonymisation metadata the data owners should be able to identify anonymous delegates only if they are part of the delegation with that delegate.', async () => {\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiP1 = await createUserAndApi('anonymous')\n const apiP2 = await createUserAndApi('anonymous')\n let entity: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n /*\n * A->A\n */\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n { [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE },\n false\n )\n entity = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n /*\n * A->A A->B\n */\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n /*\n * A->A A->B\n * A->P1\n */\n entity = await apiA.api.calendarItemApi.shareWith(apiP1.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await apiP1.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n /*\n * A->A A->B B->P1\n * A->P1\n */\n entity = await apiB.api.calendarItemApi.shareWith(apiP1.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_READ })\n await apiP1.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n true\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n /*\n * A->A A->B B->P1\n * A->P1 P1->P2\n */\n entity = await apiP1.api.calendarItemApi.shareWith(apiP2.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_READ })\n await apiP2.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n true\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n false\n )\n await checkAccessInfo(\n await apiP2.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.READ, // P2 is only aware of the P1->P2 delegation\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n true\n )\n /*\n * A->A A->B B->P1\n * A->P1 P1->P2\n * A->P2\n */\n entity = await apiA.api.calendarItemApi.shareWith(apiP2.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await apiP2.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n true\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n true\n )\n await checkAccessInfo(\n await apiP2.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.READ, // P2 is only aware of the P1->P2 delegation\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n })\n\n it('without de-anonymisation metadata the data owners should be able to identify anonymous delegates only if their parent is part of the delegation with that delegate.', async () => {\n const { parentApi: childApi, parentUser: childUser, grandApi: parentApi, grandUser: parentUser } = await createHcpHierarchyApis(env) // Want to use only hcp with one parent\n const patientInfo = await createUserAndApi('anonymous')\n let entity: Message = await parentApi.messageApi.createMessage(\n await parentApi.messageApi.newInstanceWithPatient(parentUser, null, { subject: 'A simple subject' })\n )\n entity = await parentApi.messageApi.shareWith(patientInfo.userInfo.dataOwnerId, entity, [], { requestedPermissions: FULL_WRITE })\n await patientInfo.api.cryptoApi.forceReload()\n const expectedAccess = {\n // No child user: has no direct access, only access through parent delegation\n [parentUser.healthcarePartyId!]: AccessLevelEnum.WRITE,\n [patientInfo.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n }\n await checkAccessInfo(await childApi.messageApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await parentApi.messageApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await patientInfo.api.messageApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n })\n\n it('de-anonymisation metadata should allow data owners that are not part of a delegation to figure out the members of that delegation.', async () => {\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiP1 = await createUserAndApi('anonymous')\n const apiP2 = await createUserAndApi('anonymous')\n let entity: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n entity = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiA.api.calendarItemApi.shareWith(apiP1.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiB.api.calendarItemApi.shareWith(apiP1.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_READ })\n await apiP1.api.cryptoApi.forceReload()\n entity = await apiP1.api.calendarItemApi.shareWith(apiP2.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_READ })\n entity = await apiA.api.calendarItemApi.shareWith(apiP2.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n /*\n * A->A A->B B->?P1\n * A->?P1 P1->?P2\n * A->?P2\n */\n await apiA.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId, apiP1.userInfo.dataOwnerId, apiP2.userInfo.dataOwnerId]\n )\n /*\n * A can create de-anonymization metadata for his delegations.\n * A->A A->B B->?P1\n * A->P1 P1->?P2\n * A->P2\n */\n await apiP1.api.cryptoApi.forceReload()\n await apiP2.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiP2.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await apiP1.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId, apiA.userInfo.dataOwnerId, apiP2.userInfo.dataOwnerId]\n )\n /* Both delegator and delegate can create de-anonymization metadata for a delegation.\n * A->A A->B B->P1\n * A->P1 P1->P2\n * A->P2\n */\n await apiP1.api.cryptoApi.forceReload()\n await apiP2.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiP2.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n })\n\n it('Hcp should be able to use de-anonymization metadata for parent', async () => {\n const hierarchy = await createHcpHierarchyApis(env)\n const patientInfo = await createUserAndApi('anonymous')\n let entity: CalendarItem = await hierarchy.parentApi.calendarItemApi.createCalendarItemWithHcParty(\n hierarchy.parentUser,\n await hierarchy.parentApi.calendarItemApi.newInstance(hierarchy.parentUser, { note: 'Calendar item note' })\n ) // Auto-shared with grandApi, but no de-anonymization metadata\n entity = await hierarchy.parentApi.calendarItemApi.shareWith(patientInfo.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await hierarchy.parentApi.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [hierarchy.grandUser.healthcarePartyId!]\n )\n await patientInfo.api.cryptoApi.forceReload()\n const expectedAccess = {\n [hierarchy.parentUser.healthcarePartyId!]: AccessLevelEnum.WRITE,\n [hierarchy.grandUser.healthcarePartyId!]: AccessLevelEnum.WRITE,\n [patientInfo.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n }\n await checkAccessInfo(await hierarchy.parentApi.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await hierarchy.grandApi.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await hierarchy.child2Api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await patientInfo.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n })\n\n it('De-anonymization metadata should encrypt delegator and delegate, and its creation should be optimised', async () => {\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiP = await createUserAndApi('anonymous')\n let entity: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n entity = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiA.api.calendarItemApi.shareWith(apiP.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await apiA.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId, apiP.userInfo.dataOwnerId]\n )\n const secureDelegationKeyMapApi = new IccSecureDelegationKeyMapApi(env.iCureUrl, {}, apiA.api.authApi.authenticationProvider, fetch)\n const secureDelegationKeyMaps = await secureDelegationKeyMapApi.getByDelegationKeys(\n { ids: Object.keys(entity.securityMetadata!.secureDelegations!) },\n []\n )\n expect(secureDelegationKeyMaps).to.have.length(1) // Only 1 is necessary -> only 1 is created\n expect(secureDelegationKeyMaps[0].delegator).to.be.undefined\n expect(secureDelegationKeyMaps[0].delegate).to.be.undefined\n const delegationKeyToPatient = Object.entries(entity.securityMetadata!.secureDelegations!).find(([_, v]) => v.delegate === undefined)![0]\n expect(delegationKeyToPatient).to.not.be.undefined\n expect(delegationKeyToPatient).to.not.be.empty\n expect(secureDelegationKeyMaps[0].delegationKey).to.equal(delegationKeyToPatient)\n })\n\n it('De-anonymization metadata should be usable for different entities of the same type', async () => {\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiP = await createUserAndApi('anonymous')\n let entity1: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n entity1 = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity1, { requestedPermissions: FULL_WRITE })\n entity1 = await apiA.api.calendarItemApi.shareWith(apiP.userInfo.dataOwnerId, entity1, { requestedPermissions: FULL_WRITE })\n let entity2: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n entity2 = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity2, { requestedPermissions: FULL_WRITE })\n entity2 = await apiA.api.calendarItemApi.shareWith(apiP.userInfo.dataOwnerId, entity2, { requestedPermissions: FULL_WRITE })\n await apiA.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity: entity1, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId]\n )\n const expectedAccess = {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n }\n await apiP.api.cryptoApi.forceReload()\n await checkAccessInfo(await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity1), expectedAccess, false)\n await checkAccessInfo(await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity1), expectedAccess, false)\n await checkAccessInfo(await apiP.api.calendarItemApi.getDataOwnersWithAccessTo(entity1), expectedAccess, false)\n await checkAccessInfo(await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity2), expectedAccess, false)\n await checkAccessInfo(await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity2), expectedAccess, false)\n await checkAccessInfo(await apiP.api.calendarItemApi.getDataOwnersWithAccessTo(entity2), expectedAccess, false)\n })\n\n it('De-anonymization metadata optimization: the metadata should not be re-shared with the anonymous delegator/delegate by third parties', async () => {\n const apiP1 = await createUserAndApi('anonymous')\n const apiP2 = await createUserAndApi('anonymous')\n const apiA = await createUserAndApi('explicit')\n let entity: CalendarItem = await apiP1.api.calendarItemApi.createCalendarItemWithHcParty(\n apiP1.userInfo.user,\n await apiP1.api.calendarItemApi.newInstance(apiP1.userInfo.user, { note: 'Calendar item note' })\n )\n entity = await apiP1.api.calendarItemApi.shareWith(apiP2.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiP1.api.calendarItemApi.shareWith(apiA.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await apiP1.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiP2.userInfo.dataOwnerId, apiA.userInfo.dataOwnerId]\n )\n const p1ToP2DelegationKey = Object.entries(entity.securityMetadata!.secureDelegations!).find(\n ([_, v]) => v.delegate === undefined && v.delegator === undefined && v.parentDelegations !== undefined\n )![0]\n expect(p1ToP2DelegationKey).to.not.be.undefined\n expect(p1ToP2DelegationKey).to.not.be.empty\n const delegationMapApi = new IccSecureDelegationKeyMapApi(env.iCureUrl, {}, apiA.api.authApi.authenticationProvider, fetch)\n const delegationMapBeforeAttemptedResharingByA = (await delegationMapApi.getByDelegationKeys({ ids: [p1ToP2DelegationKey] }, []))[0]\n expect(delegationMapBeforeAttemptedResharingByA).to.not.be.undefined\n expect(Object.keys(delegationMapBeforeAttemptedResharingByA.securityMetadata!.secureDelegations!)).to.have.length(3)\n await apiA.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiP2.userInfo.dataOwnerId, apiP1.userInfo.dataOwnerId]\n )\n const delegationMapAfterAttemptedResharingByA = (await delegationMapApi.getByDelegationKeys({ ids: [p1ToP2DelegationKey] }, []))[0]\n expect(delegationMapAfterAttemptedResharingByA).to.not.be.undefined\n expect(Object.keys(delegationMapAfterAttemptedResharingByA.securityMetadata!.secureDelegations!)).to.have.length(3)\n expect(delegationMapAfterAttemptedResharingByA.rev).to.equal(delegationMapBeforeAttemptedResharingByA.rev)\n })\n\n it('De-anonymization metadata should be shared only with selected data owners', async () => {\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiC = await createUserAndApi('explicit')\n const apiP = await createUserAndApi('anonymous')\n let entity: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n entity = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiA.api.calendarItemApi.shareWith(apiC.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiA.api.calendarItemApi.shareWith(apiP.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await apiA.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId]\n )\n const expectedAccess = {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiC.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n }\n await apiP.api.cryptoApi.forceReload()\n await checkAccessInfo(await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiP.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n // Except C does not know about P, because he was not given access to the relevant metadata.\n await checkAccessInfo(\n await apiC.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiC.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n })\n\n it('A member of a delegation should be able to update the corresponding de-anonymization metadata even if he was not the original creator', async () => {\n const hierarchy = await createHcpHierarchyApis(env)\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiC = await createUserAndApi('explicit')\n const apiP = await createUserAndApi('anonymous')\n // Parent -> A, B, C, P\n let entity: CalendarItem = await hierarchy.grandApi.calendarItemApi.createCalendarItemWithHcParty(\n hierarchy.grandUser,\n await hierarchy.grandApi.calendarItemApi.newInstance(hierarchy.grandUser, { note: 'Calendar item note' })\n )\n entity = await hierarchy.grandApi.calendarItemApi.shareWith(apiA.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await hierarchy.grandApi.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await hierarchy.grandApi.calendarItemApi.shareWith(apiC.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await hierarchy.grandApi.calendarItemApi.shareWith(apiP.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n // Child shares deanon info with A\n await hierarchy.parentApi.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiA.userInfo.dataOwnerId]\n )\n // P shares with B\n await apiP.api.cryptoApi.forceReload()\n await apiP.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId]\n )\n // Parent shares with C\n await hierarchy.grandApi.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiC.userInfo.dataOwnerId]\n )\n const expectedAccess = {\n [hierarchy.grandUser.healthcarePartyId!]: AccessLevelEnum.WRITE,\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiC.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n }\n await checkAccessInfo(await hierarchy.grandApi.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await hierarchy.parentApi.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiC.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiP.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n const delegationKeyMapApi = new IccSecureDelegationKeyMapApi(env.iCureUrl, {}, hierarchy.grandApi.authApi.authenticationProvider, fetch)\n const delegationKeyToP = Object.entries(entity.securityMetadata!.secureDelegations!).find(([_, v]) => v.delegate === undefined)![0]\n expect(delegationKeyToP).to.not.be.undefined\n expect(delegationKeyToP).to.not.be.empty\n const delegationKeyMaps = await delegationKeyMapApi.getByDelegationKeys({ ids: Object.keys(entity.securityMetadata!.secureDelegations!) }, [])\n expect(delegationKeyMaps).to.have.length(1) // Only 1 anonymous, shared by everyone\n })\n\n typeCombinations.forEach(([delegatorType, delegateType]) => {\n it(`should allow delegate to find and decrypt an entity shared with him (${delegatorType}->${delegateType})`, async () => {\n const delegatorApi = await createUserAndApi(delegatorType)\n const delegateApi = await createUserAndApi(delegateType)\n const data = await createAndShareData(delegatorApi.api, delegatorApi.userInfo, delegateApi.userInfo)\n await delegateApi.api.cryptoApi.forceReload()\n await checkCanFindAndDecrypt(delegateApi.api, data)\n await checkCanFindAndDecrypt(delegatorApi.api, data)\n })\n\n it(`should allow delegator to find and decrypt an entity shared with others after give-access-back (${delegatorType}->${delegateType})`, async function () {\n if (delegatorType == delegateType || delegatorType != 'explicit') {\n const delegatorApi = await createUserAndApi(delegatorType)\n const delegateApi = await createUserAndApi(delegateType)\n const data = await createAndShareData(delegatorApi.api, delegatorApi.userInfo, delegateApi.userInfo)\n const delegatorApiAfterGiveAccessBack = await loseKeyAndGiveAccessBack(delegatorApi.userInfo, delegateApi.api, delegateApi.userInfo)\n await delegateApi.api.cryptoApi.forceReload()\n await checkCanFindAndDecrypt(delegateApi.api, data)\n await checkCanFindAndDecrypt(delegatorApi.api, data)\n await checkCanFindAndDecrypt(delegatorApiAfterGiveAccessBack, data)\n } else {\n console.warn('Currently not supported, will be in future')\n }\n })\n\n it(`should allow delegate to find and decrypt an entity shared with him after give-access-back (${delegatorType}->${delegateType})`, async function () {\n if (delegatorType == delegateType || delegateType != 'explicit') {\n const delegatorApi = await createUserAndApi(delegatorType)\n const delegateApi = await createUserAndApi(delegateType)\n const data = await createAndShareData(delegatorApi.api, delegatorApi.userInfo, delegateApi.userInfo)\n const delegateApiAfterGiveAccessBack = await loseKeyAndGiveAccessBack(delegateApi.userInfo, delegatorApi.api, delegatorApi.userInfo)\n await delegateApi.api.cryptoApi.forceReload()\n await checkCanFindAndDecrypt(delegateApi.api, data)\n await checkCanFindAndDecrypt(delegatorApi.api, data)\n await checkCanFindAndDecrypt(delegateApiAfterGiveAccessBack, data)\n } else {\n console.warn('Currently not supported, will be in future')\n }\n })\n })\n})\n"]}
1
+ {"version":3,"file":"anonymous-delegations-test.js","sourceRoot":"","sources":["../../../../test/icc-x-api/crypto/anonymous-delegations-test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from 'chai'\nimport { before } from 'mocha'\nimport { createHcpHierarchyApis, getEnvironmentInitializer, getTempEmail, setLocalStorage, TestUtils } from '../../utils/test_utils'\nimport { webcrypto } from 'crypto'\nimport 'isomorphic-fetch'\nimport { Apis, WebCryptoPrimitives, EntityWithDelegationTypeName, ShaVersion } from '../../../icc-x-api'\nimport { User } from '../../../icc-api/model/User'\nimport { Patient } from '../../../icc-api/model/Patient'\nimport { HealthElement } from '../../../icc-api/model/HealthElement'\nimport { HealthcareParty } from '../../../icc-api/model/HealthcareParty'\nimport { v4 as uuid } from 'uuid'\nimport { TestApi } from '../../utils/TestApi'\nimport { CryptoPrimitives } from '../../../icc-x-api/crypto/CryptoPrimitives'\nimport { FilterChainMaintenanceTask } from '../../../icc-api/model/FilterChainMaintenanceTask'\nimport { MaintenanceTaskAfterDateFilter } from '../../../icc-x-api/filters/MaintenanceTaskAfterDateFilter'\nimport { KeyPairUpdateRequest } from '../../../icc-x-api/maintenance/KeyPairUpdateRequest'\nimport { EntityShareRequest } from '../../../icc-api/model/requests/EntityShareRequest'\nimport { MaintenanceTask } from '../../../icc-api/model/MaintenanceTask'\nimport * as _ from 'lodash'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { SecureDelegation } from '../../../icc-api/model/SecureDelegation'\nimport { CalendarItem } from '../../../icc-api/model/CalendarItem'\nimport { DataOwnerTypeEnum } from '../../../icc-api/model/DataOwnerTypeEnum'\nimport { Message } from '../../../icc-api/model/Message'\nimport { IccSecureDelegationKeyMapApi } from '../../../icc-api/api/internal/IccSecureDelegationKeyMapApi'\nimport initMasterApi = TestUtils.initMasterApi\nimport RequestedPermissionEnum = EntityShareRequest.RequestedPermissionEnum\nimport AccessLevelEnum = SecureDelegation.AccessLevelEnum\n\nconst FULL_WRITE = RequestedPermissionEnum.FULL_WRITE\nconst FULL_READ = RequestedPermissionEnum.FULL_READ\n\nsetLocalStorage(fetch)\n\ntype DataOwnerType = 'explicit' | 'anonymous'\ntype UserInfo = { user: User; pw: string; dataOwnerId: string }\n\nconst typeCombinations: [DataOwnerType, DataOwnerType][] = [\n ['explicit', 'explicit'],\n ['anonymous', 'explicit'],\n ['explicit', 'anonymous'],\n ['anonymous', 'anonymous'],\n]\nlet env: TestVars\nlet masterApi: Apis\nlet masterUser: User\nconst primitives = new WebCryptoPrimitives(webcrypto as any)\n\ndescribe('Anonymous delegations', () => {\n before(async function () {\n this.timeout(6000000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n masterApi = await initMasterApi(env)\n masterUser = await masterApi.userApi.getCurrentUser()\n })\n\n async function createUserAndApi(userType: DataOwnerType): Promise<{ api: Apis; userInfo: UserInfo }> {\n const dataOwner =\n userType === 'explicit'\n ? await masterApi.healthcarePartyApi.createHealthcareParty(new HealthcareParty({ id: uuid(), firstName: 'test', lastName: 'test' }))\n : await masterApi.patientApi.createPatientWithUser(\n masterUser,\n await masterApi.patientApi.newInstance(masterUser, new Patient({ id: uuid(), firstName: 'test', lastName: 'test' }))\n )\n const login = uuid()\n const user = await masterApi.userApi.createUser(\n new User({\n id: login,\n name: login,\n login: login,\n email: getTempEmail(),\n status: 'ACTIVE',\n healthcarePartyId: userType === 'explicit' ? dataOwner.id : undefined,\n patientId: userType === 'anonymous' ? dataOwner.id : undefined,\n })\n )\n const pw = await masterApi.userApi.getToken(user.id!, uuid())\n return {\n api: await TestApi(env.iCureUrl, login, pw, webcrypto as any),\n userInfo: { user, pw, dataOwnerId: dataOwner.id! },\n }\n }\n\n async function dataOwnerIdsForSearch(apis: Apis, dataOwnerId: string, entityType: EntityWithDelegationTypeName): Promise<string[]> {\n const delegationKeys = await apis.cryptoApi.exchangeData.getAllDelegationKeys(entityType)\n if (delegationKeys) {\n return delegationKeys\n } else {\n return [dataOwnerId]\n }\n }\n\n async function loseKeyAndGiveAccessBack(userThatLosesKey: UserInfo, apiToGiveAccessBack: Apis, userGivingAccessBack: UserInfo): Promise<Apis> {\n const timeBeforeNewKey = new Date().getTime()\n const newKeyPair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const newApi = await TestApi(env.iCureUrl, userThatLosesKey.user.login!, userThatLosesKey.pw, webcrypto as any, newKeyPair, {\n createMaintenanceTasksOnNewKey: false,\n })\n await newApi.icureMaintenanceTaskApi.createMaintenanceTasksForNewKeypair(userThatLosesKey.user, newKeyPair, [\n DataOwnerTypeEnum.Patient,\n DataOwnerTypeEnum.Hcp,\n ])\n await apiToGiveAccessBack.cryptoApi.forceReload()\n const searchIds = await dataOwnerIdsForSearch(apiToGiveAccessBack, userGivingAccessBack.dataOwnerId, EntityWithDelegationTypeName.MaintenanceTask)\n const keyPairUpdateRequests = await searchIds\n .reduce(async (acc, searchId) => {\n const awaitedAcc = await acc\n const currResult = await apiToGiveAccessBack.maintenanceTaskApi.filterMaintenanceTasksByWithUser(\n userGivingAccessBack.user,\n undefined,\n undefined,\n new FilterChainMaintenanceTask({\n filter: new MaintenanceTaskAfterDateFilter({\n date: timeBeforeNewKey,\n healthcarePartyId: searchId,\n }),\n })\n )\n return [...awaitedAcc, ...currResult.rows!]\n }, Promise.resolve([] as MaintenanceTask[]))\n .then((tasks) => tasks.map((task) => KeyPairUpdateRequest.fromMaintenanceTask(task)))\n const concernedRequest = keyPairUpdateRequests.filter((x) => x.concernedDataOwnerId === userThatLosesKey.dataOwnerId)\n expect(concernedRequest).to.have.length(1)\n await apiToGiveAccessBack.icureMaintenanceTaskApi.applyKeyPairUpdate(concernedRequest[0])\n await newApi.cryptoApi.forceReload()\n return newApi\n }\n\n async function createAndShareData(\n creatorApis: Apis,\n creatorInfo: UserInfo,\n delegateInfo: UserInfo\n ): Promise<{ patient: Patient; healthElements: HealthElement[] }> {\n const patient = await masterApi.patientApi.createPatientWithUser(\n masterUser,\n await masterApi.patientApi.newInstance(masterUser, new Patient({ id: uuid(), firstName: 'test', lastName: 'test', note: 'Patient note' }))\n )\n const secretIds = await masterApi.patientApi.decryptSecretIdsOf(patient)\n const updatedPatient1 = await masterApi.patientApi.shareWith(creatorInfo.dataOwnerId, patient, secretIds, { requestedPermissions: FULL_WRITE })\n await creatorApis.cryptoApi.forceReload()\n const updatedPatient2 = await creatorApis.patientApi.shareWith(delegateInfo.dataOwnerId, updatedPatient1, secretIds, {\n requestedPermissions: FULL_WRITE,\n })\n const healthElements: HealthElement[] = []\n for (let i = 0; i < 5; i++) {\n const he = await creatorApis.healthcareElementApi.createHealthElementWithUser(\n creatorInfo.user,\n await creatorApis.healthcareElementApi.newInstance(creatorInfo.user, updatedPatient2, { note: `Health element note - ${i}` })\n )\n const sharedHe = await creatorApis.healthcareElementApi.shareWith(delegateInfo.dataOwnerId, he, { requestedPermissions: FULL_WRITE })\n healthElements.push(sharedHe)\n }\n expect(updatedPatient2.note).to.not.be.undefined\n for (const he of healthElements) {\n expect(he.note).to.not.be.undefined\n }\n return { patient: updatedPatient2, healthElements }\n }\n\n async function checkCanFindAndDecrypt(apis: Apis, expected: { patient: Patient; healthElements: HealthElement[] }) {\n const user = await apis.userApi.getCurrentUser()\n const patient = await apis.patientApi.getPatientWithUser(user, expected.patient.id!)\n expect(patient.note).to.equal(expected.patient.note)\n const searchIds = await dataOwnerIdsForSearch(apis, apis.dataOwnerApi.getDataOwnerIdOf(user), EntityWithDelegationTypeName.HealthElement)\n const patientKeys = await apis.patientApi.decryptSecretIdsOf(patient)\n expect(patientKeys).to.not.be.empty\n const sfks = _.uniq(patientKeys).join(',')\n const retrievedHealthElements = _.uniqBy(\n await searchIds.reduce(async (acc, searchId) => {\n const awaitedAcc = await acc\n const currResult = await apis.healthcareElementApi.findByHCPartyPatientSecretFKeys(searchId, sfks)\n return [...awaitedAcc, ...currResult]\n }, Promise.resolve([] as HealthElement[])),\n (x) => x.id\n )\n expect(retrievedHealthElements.length).to.equal(expected.healthElements.length)\n for (const expectedHe of expected.healthElements) {\n const retrievedHe = retrievedHealthElements.find((x) => x.id === expectedHe.id)\n expect(retrievedHe).to.not.be.undefined\n expect(retrievedHe!.note).to.equal(expectedHe.note)\n }\n }\n\n async function checkAccessInfo(\n actualAccessInfo: { permissionsByDataOwnerId: { [p: string]: AccessLevelEnum }; hasUnknownAnonymousDataOwners: boolean },\n expectedDataOwnersWithAccess: { [dataOwnerId: string]: AccessLevelEnum },\n expectedHasUnknownAnonymousDataOwners: boolean\n ) {\n expect(Object.keys(actualAccessInfo.permissionsByDataOwnerId)).to.have.members(Object.keys(expectedDataOwnersWithAccess))\n expect(actualAccessInfo.hasUnknownAnonymousDataOwners).to.equal(expectedHasUnknownAnonymousDataOwners)\n for (const [dataOwnerId, expectedLevel] of Object.entries(expectedDataOwnersWithAccess)) {\n expect(actualAccessInfo.permissionsByDataOwnerId[dataOwnerId]).to.equal(expectedLevel)\n }\n }\n\n it('without de-anonymisation metadata the data owners should be able to identify anonymous delegates only if they are part of the delegation with that delegate.', async () => {\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiP1 = await createUserAndApi('anonymous')\n const apiP2 = await createUserAndApi('anonymous')\n let entity: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n /*\n * A->A\n */\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n { [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE },\n false\n )\n entity = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n /*\n * A->A A->B\n */\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n /*\n * A->A A->B\n * A->P1\n */\n entity = await apiA.api.calendarItemApi.shareWith(apiP1.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await apiP1.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n /*\n * A->A A->B B->P1\n * A->P1\n */\n entity = await apiB.api.calendarItemApi.shareWith(apiP1.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_READ })\n await apiP1.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n true\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n /*\n * A->A A->B B->P1\n * A->P1 P1->P2\n */\n entity = await apiP1.api.calendarItemApi.shareWith(apiP2.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_READ })\n await apiP2.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n true\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n false\n )\n await checkAccessInfo(\n await apiP2.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.READ, // P2 is only aware of the P1->P2 delegation\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n true\n )\n /*\n * A->A A->B B->P1\n * A->P1 P1->P2\n * A->P2\n */\n entity = await apiA.api.calendarItemApi.shareWith(apiP2.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await apiP2.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n true\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.READ,\n },\n true\n )\n await checkAccessInfo(\n await apiP2.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.READ, // P2 is only aware of the P1->P2 delegation\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n })\n\n it('without de-anonymisation metadata the data owners should be able to identify anonymous delegates only if their parent is part of the delegation with that delegate.', async () => {\n const { parentApi: childApi, parentUser: childUser, grandApi: parentApi, grandUser: parentUser } = await createHcpHierarchyApis(env) // Want to use only hcp with one parent\n const patientInfo = await createUserAndApi('anonymous')\n let entity: Message = await parentApi.messageApi.createMessageWithUser(\n parentUser,\n await parentApi.messageApi.newInstanceWithPatient(parentUser, null, { subject: 'A simple subject' })\n )\n entity = await parentApi.messageApi.shareWith(patientInfo.userInfo.dataOwnerId, entity, [], { requestedPermissions: FULL_WRITE })\n await patientInfo.api.cryptoApi.forceReload()\n const expectedAccess = {\n // No child user: has no direct access, only access through parent delegation\n [parentUser.healthcarePartyId!]: AccessLevelEnum.WRITE,\n [patientInfo.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n }\n await checkAccessInfo(await childApi.messageApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await parentApi.messageApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await patientInfo.api.messageApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n })\n\n it('de-anonymisation metadata should allow data owners that are not part of a delegation to figure out the members of that delegation.', async () => {\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiP1 = await createUserAndApi('anonymous')\n const apiP2 = await createUserAndApi('anonymous')\n let entity: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n entity = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiA.api.calendarItemApi.shareWith(apiP1.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiB.api.calendarItemApi.shareWith(apiP1.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_READ })\n await apiP1.api.cryptoApi.forceReload()\n entity = await apiP1.api.calendarItemApi.shareWith(apiP2.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_READ })\n entity = await apiA.api.calendarItemApi.shareWith(apiP2.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n /*\n * A->A A->B B->?P1\n * A->?P1 P1->?P2\n * A->?P2\n */\n await apiA.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId, apiP1.userInfo.dataOwnerId, apiP2.userInfo.dataOwnerId]\n )\n /*\n * A can create de-anonymization metadata for his delegations.\n * A->A A->B B->?P1\n * A->P1 P1->?P2\n * A->P2\n */\n await apiP1.api.cryptoApi.forceReload()\n await apiP2.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiP2.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n await apiP1.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId, apiA.userInfo.dataOwnerId, apiP2.userInfo.dataOwnerId]\n )\n /* Both delegator and delegate can create de-anonymization metadata for a delegation.\n * A->A A->B B->P1\n * A->P1 P1->P2\n * A->P2\n */\n await apiP1.api.cryptoApi.forceReload()\n await apiP2.api.cryptoApi.forceReload()\n await checkAccessInfo(\n await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiP1.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n await checkAccessInfo(\n await apiP2.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP1.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP2.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n false\n )\n })\n\n it('Hcp should be able to use de-anonymization metadata for parent', async () => {\n const hierarchy = await createHcpHierarchyApis(env)\n const patientInfo = await createUserAndApi('anonymous')\n let entity: CalendarItem = await hierarchy.parentApi.calendarItemApi.createCalendarItemWithHcParty(\n hierarchy.parentUser,\n await hierarchy.parentApi.calendarItemApi.newInstance(hierarchy.parentUser, { note: 'Calendar item note' })\n ) // Auto-shared with grandApi, but no de-anonymization metadata\n entity = await hierarchy.parentApi.calendarItemApi.shareWith(patientInfo.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await hierarchy.parentApi.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [hierarchy.grandUser.healthcarePartyId!]\n )\n await patientInfo.api.cryptoApi.forceReload()\n const expectedAccess = {\n [hierarchy.parentUser.healthcarePartyId!]: AccessLevelEnum.WRITE,\n [hierarchy.grandUser.healthcarePartyId!]: AccessLevelEnum.WRITE,\n [patientInfo.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n }\n await checkAccessInfo(await hierarchy.parentApi.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await hierarchy.grandApi.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await hierarchy.child2Api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await patientInfo.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n })\n\n it('De-anonymization metadata should encrypt delegator and delegate, and its creation should be optimised', async () => {\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiP = await createUserAndApi('anonymous')\n let entity: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n entity = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiA.api.calendarItemApi.shareWith(apiP.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await apiA.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId, apiP.userInfo.dataOwnerId]\n )\n const secureDelegationKeyMapApi = new IccSecureDelegationKeyMapApi(env.iCureUrl, {}, apiA.api.authApi.authenticationProvider, fetch)\n const secureDelegationKeyMaps = await secureDelegationKeyMapApi.getByDelegationKeys(\n { ids: Object.keys(entity.securityMetadata!.secureDelegations!) },\n []\n )\n expect(secureDelegationKeyMaps).to.have.length(1) // Only 1 is necessary -> only 1 is created\n expect(secureDelegationKeyMaps[0].delegator).to.be.undefined\n expect(secureDelegationKeyMaps[0].delegate).to.be.undefined\n const delegationKeyToPatient = Object.entries(entity.securityMetadata!.secureDelegations!).find(([_, v]) => v.delegate === undefined)![0]\n expect(delegationKeyToPatient).to.not.be.undefined\n expect(delegationKeyToPatient).to.not.be.empty\n expect(secureDelegationKeyMaps[0].delegationKey).to.equal(delegationKeyToPatient)\n })\n\n it('De-anonymization metadata should be usable for different entities of the same type', async () => {\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiP = await createUserAndApi('anonymous')\n let entity1: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n entity1 = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity1, { requestedPermissions: FULL_WRITE })\n entity1 = await apiA.api.calendarItemApi.shareWith(apiP.userInfo.dataOwnerId, entity1, { requestedPermissions: FULL_WRITE })\n let entity2: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n entity2 = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity2, { requestedPermissions: FULL_WRITE })\n entity2 = await apiA.api.calendarItemApi.shareWith(apiP.userInfo.dataOwnerId, entity2, { requestedPermissions: FULL_WRITE })\n await apiA.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity: entity1, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId]\n )\n const expectedAccess = {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n }\n await apiP.api.cryptoApi.forceReload()\n await checkAccessInfo(await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity1), expectedAccess, false)\n await checkAccessInfo(await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity1), expectedAccess, false)\n await checkAccessInfo(await apiP.api.calendarItemApi.getDataOwnersWithAccessTo(entity1), expectedAccess, false)\n await checkAccessInfo(await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity2), expectedAccess, false)\n await checkAccessInfo(await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity2), expectedAccess, false)\n await checkAccessInfo(await apiP.api.calendarItemApi.getDataOwnersWithAccessTo(entity2), expectedAccess, false)\n })\n\n it('De-anonymization metadata optimization: the metadata should not be re-shared with the anonymous delegator/delegate by third parties', async () => {\n const apiP1 = await createUserAndApi('anonymous')\n const apiP2 = await createUserAndApi('anonymous')\n const apiA = await createUserAndApi('explicit')\n let entity: CalendarItem = await apiP1.api.calendarItemApi.createCalendarItemWithHcParty(\n apiP1.userInfo.user,\n await apiP1.api.calendarItemApi.newInstance(apiP1.userInfo.user, { note: 'Calendar item note' })\n )\n entity = await apiP1.api.calendarItemApi.shareWith(apiP2.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiP1.api.calendarItemApi.shareWith(apiA.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await apiP1.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiP2.userInfo.dataOwnerId, apiA.userInfo.dataOwnerId]\n )\n const p1ToP2DelegationKey = Object.entries(entity.securityMetadata!.secureDelegations!).find(\n ([_, v]) => v.delegate === undefined && v.delegator === undefined && v.parentDelegations !== undefined\n )![0]\n expect(p1ToP2DelegationKey).to.not.be.undefined\n expect(p1ToP2DelegationKey).to.not.be.empty\n const delegationMapApi = new IccSecureDelegationKeyMapApi(env.iCureUrl, {}, apiA.api.authApi.authenticationProvider, fetch)\n const delegationMapBeforeAttemptedResharingByA = (await delegationMapApi.getByDelegationKeys({ ids: [p1ToP2DelegationKey] }, []))[0]\n expect(delegationMapBeforeAttemptedResharingByA).to.not.be.undefined\n expect(Object.keys(delegationMapBeforeAttemptedResharingByA.securityMetadata!.secureDelegations!)).to.have.length(3)\n await apiA.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiP2.userInfo.dataOwnerId, apiP1.userInfo.dataOwnerId]\n )\n const delegationMapAfterAttemptedResharingByA = (await delegationMapApi.getByDelegationKeys({ ids: [p1ToP2DelegationKey] }, []))[0]\n expect(delegationMapAfterAttemptedResharingByA).to.not.be.undefined\n expect(Object.keys(delegationMapAfterAttemptedResharingByA.securityMetadata!.secureDelegations!)).to.have.length(3)\n expect(delegationMapAfterAttemptedResharingByA.rev).to.equal(delegationMapBeforeAttemptedResharingByA.rev)\n })\n\n it('De-anonymization metadata should be shared only with selected data owners', async () => {\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiC = await createUserAndApi('explicit')\n const apiP = await createUserAndApi('anonymous')\n let entity: CalendarItem = await apiA.api.calendarItemApi.createCalendarItemWithHcParty(\n apiA.userInfo.user,\n await apiA.api.calendarItemApi.newInstance(apiA.userInfo.user, { note: 'Calendar item note' })\n )\n entity = await apiA.api.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiA.api.calendarItemApi.shareWith(apiC.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await apiA.api.calendarItemApi.shareWith(apiP.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n await apiA.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId]\n )\n const expectedAccess = {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiC.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n }\n await apiP.api.cryptoApi.forceReload()\n await checkAccessInfo(await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiP.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n // Except C does not know about P, because he was not given access to the relevant metadata.\n await checkAccessInfo(\n await apiC.api.calendarItemApi.getDataOwnersWithAccessTo(entity),\n {\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiC.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n },\n true\n )\n })\n\n it('A member of a delegation should be able to update the corresponding de-anonymization metadata even if he was not the original creator', async () => {\n const hierarchy = await createHcpHierarchyApis(env)\n const apiA = await createUserAndApi('explicit')\n const apiB = await createUserAndApi('explicit')\n const apiC = await createUserAndApi('explicit')\n const apiP = await createUserAndApi('anonymous')\n // Parent -> A, B, C, P\n let entity: CalendarItem = await hierarchy.grandApi.calendarItemApi.createCalendarItemWithHcParty(\n hierarchy.grandUser,\n await hierarchy.grandApi.calendarItemApi.newInstance(hierarchy.grandUser, { note: 'Calendar item note' })\n )\n entity = await hierarchy.grandApi.calendarItemApi.shareWith(apiA.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await hierarchy.grandApi.calendarItemApi.shareWith(apiB.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await hierarchy.grandApi.calendarItemApi.shareWith(apiC.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n entity = await hierarchy.grandApi.calendarItemApi.shareWith(apiP.userInfo.dataOwnerId, entity, { requestedPermissions: FULL_WRITE })\n // Child shares deanon info with A\n await hierarchy.parentApi.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiA.userInfo.dataOwnerId]\n )\n // P shares with B\n await apiP.api.cryptoApi.forceReload()\n await apiP.api.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiB.userInfo.dataOwnerId]\n )\n // Parent shares with C\n await hierarchy.grandApi.cryptoApi.delegationsDeAnonymization.createOrUpdateDeAnonymizationInfo(\n { entity, type: EntityWithDelegationTypeName.CalendarItem },\n [apiC.userInfo.dataOwnerId]\n )\n const expectedAccess = {\n [hierarchy.grandUser.healthcarePartyId!]: AccessLevelEnum.WRITE,\n [apiA.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiB.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiC.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n [apiP.userInfo.dataOwnerId]: AccessLevelEnum.WRITE,\n }\n await checkAccessInfo(await hierarchy.grandApi.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await hierarchy.parentApi.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiA.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiB.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiC.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n await checkAccessInfo(await apiP.api.calendarItemApi.getDataOwnersWithAccessTo(entity), expectedAccess, false)\n const delegationKeyMapApi = new IccSecureDelegationKeyMapApi(env.iCureUrl, {}, hierarchy.grandApi.authApi.authenticationProvider, fetch)\n const delegationKeyToP = Object.entries(entity.securityMetadata!.secureDelegations!).find(([_, v]) => v.delegate === undefined)![0]\n expect(delegationKeyToP).to.not.be.undefined\n expect(delegationKeyToP).to.not.be.empty\n const delegationKeyMaps = await delegationKeyMapApi.getByDelegationKeys({ ids: Object.keys(entity.securityMetadata!.secureDelegations!) }, [])\n expect(delegationKeyMaps).to.have.length(1) // Only 1 anonymous, shared by everyone\n })\n\n typeCombinations.forEach(([delegatorType, delegateType]) => {\n it(`should allow delegate to find and decrypt an entity shared with him (${delegatorType}->${delegateType})`, async () => {\n const delegatorApi = await createUserAndApi(delegatorType)\n const delegateApi = await createUserAndApi(delegateType)\n const data = await createAndShareData(delegatorApi.api, delegatorApi.userInfo, delegateApi.userInfo)\n await delegateApi.api.cryptoApi.forceReload()\n await checkCanFindAndDecrypt(delegateApi.api, data)\n await checkCanFindAndDecrypt(delegatorApi.api, data)\n })\n\n it(`should allow delegator to find and decrypt an entity shared with others after give-access-back (${delegatorType}->${delegateType})`, async function () {\n if (delegatorType == delegateType || delegatorType != 'explicit') {\n const delegatorApi = await createUserAndApi(delegatorType)\n const delegateApi = await createUserAndApi(delegateType)\n const data = await createAndShareData(delegatorApi.api, delegatorApi.userInfo, delegateApi.userInfo)\n const delegatorApiAfterGiveAccessBack = await loseKeyAndGiveAccessBack(delegatorApi.userInfo, delegateApi.api, delegateApi.userInfo)\n await delegateApi.api.cryptoApi.forceReload()\n await checkCanFindAndDecrypt(delegateApi.api, data)\n await checkCanFindAndDecrypt(delegatorApi.api, data)\n await checkCanFindAndDecrypt(delegatorApiAfterGiveAccessBack, data)\n } else {\n console.warn('Currently not supported, will be in future')\n }\n })\n\n it(`should allow delegate to find and decrypt an entity shared with him after give-access-back (${delegatorType}->${delegateType})`, async function () {\n if (delegatorType == delegateType || delegateType != 'explicit') {\n const delegatorApi = await createUserAndApi(delegatorType)\n const delegateApi = await createUserAndApi(delegateType)\n const data = await createAndShareData(delegatorApi.api, delegatorApi.userInfo, delegateApi.userInfo)\n const delegateApiAfterGiveAccessBack = await loseKeyAndGiveAccessBack(delegateApi.userInfo, delegatorApi.api, delegatorApi.userInfo)\n await delegateApi.api.cryptoApi.forceReload()\n await checkCanFindAndDecrypt(delegateApi.api, data)\n await checkCanFindAndDecrypt(delegatorApi.api, data)\n await checkCanFindAndDecrypt(delegateApiAfterGiveAccessBack, data)\n } else {\n console.warn('Currently not supported, will be in future')\n }\n })\n })\n})\n"]}
@@ -9,7 +9,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- const icc_api_1 = require("../../../icc-api");
13
12
  require("isomorphic-fetch");
14
13
  const chai_1 = require("chai");
15
14
  require("mocha");
@@ -20,6 +19,8 @@ const icc_x_api_1 = require("../../../icc-x-api");
20
19
  var initApi = test_utils_1.TestUtils.initApi;
21
20
  const SecretIdUseOption_1 = require("../../../icc-x-api/crypto/SecretIdUseOption");
22
21
  var UseAnyConfidential = SecretIdUseOption_1.SecretIdUseOption.UseAnyConfidential;
22
+ const icc_api_1 = require("../../../icc-api");
23
+ const crypto_1 = require("crypto");
23
24
  (0, chai_1.use)(require('chai-as-promised'));
24
25
  let env;
25
26
  (0, test_utils_1.setLocalStorage)(fetch);
@@ -52,6 +53,103 @@ describe('Create a patient from scratch', () => {
52
53
  (0, chai_1.expect)(fetchedWithoutDecryption.note).to.be.undefined;
53
54
  }));
54
55
  });
56
+ describe('Entity encryption', () => __awaiter(void 0, void 0, void 0, function* () {
57
+ it('encrypted self should not change after re-encryption if encrypted data do not change', () => __awaiter(void 0, void 0, void 0, function* () {
58
+ const api = yield initApi(env, test_utils_1.hcp1Username);
59
+ const user = yield api.userApi.getCurrentUser();
60
+ const note = 'A secured note that is encrypted';
61
+ const patient = yield api.patientApi.createPatientWithUser(user, yield api.patientApi.newInstance(user, new Patient_1.Patient({
62
+ lastName: 'Biden',
63
+ firstName: 'Joe',
64
+ note,
65
+ })));
66
+ (0, chai_1.expect)(patient.note).to.equal(note);
67
+ (0, chai_1.expect)(patient.encryptedSelf).to.not.be.empty;
68
+ const updatedPatient = yield api.patientApi.modifyPatientWithUser(user, Object.assign(Object.assign({}, patient), { firstName: 'John' }));
69
+ (0, chai_1.expect)(updatedPatient === null || updatedPatient === void 0 ? void 0 : updatedPatient.firstName).to.equal('John');
70
+ (0, chai_1.expect)(updatedPatient === null || updatedPatient === void 0 ? void 0 : updatedPatient.note).to.equal(patient.note);
71
+ (0, chai_1.expect)(updatedPatient === null || updatedPatient === void 0 ? void 0 : updatedPatient.encryptedSelf).to.equal(patient.encryptedSelf);
72
+ const contactWithBasicContent = (yield api.contactApi.createContactWithUser(user, yield api.contactApi.newInstance(user, patient, {
73
+ services: [
74
+ {
75
+ id: (0, crypto_1.randomUUID)(),
76
+ valueDate: 20250101000000,
77
+ content: {
78
+ en: {
79
+ stringValue: 'A service with only basic content',
80
+ numberValue: 1234,
81
+ },
82
+ },
83
+ },
84
+ ],
85
+ descr: 'Demo',
86
+ })));
87
+ (0, chai_1.expect)(contactWithBasicContent.encryptedSelf).to.not.be.empty;
88
+ (0, chai_1.expect)(contactWithBasicContent.services[0].encryptedSelf).to.not.be.empty;
89
+ const updatedContactWithBasicContent = yield api.contactApi.modifyContactWithUser(user, Object.assign(Object.assign({}, contactWithBasicContent), { services: [
90
+ Object.assign(Object.assign({}, contactWithBasicContent.services[0]), { valueDate: 20250101120000 }),
91
+ ] }));
92
+ (0, chai_1.expect)(updatedContactWithBasicContent === null || updatedContactWithBasicContent === void 0 ? void 0 : updatedContactWithBasicContent.services[0].valueDate).to.equal(20250101120000);
93
+ (0, chai_1.expect)(updatedContactWithBasicContent === null || updatedContactWithBasicContent === void 0 ? void 0 : updatedContactWithBasicContent.services[0].encryptedSelf).to.equal(contactWithBasicContent.services[0].encryptedSelf);
94
+ (0, chai_1.expect)(updatedContactWithBasicContent === null || updatedContactWithBasicContent === void 0 ? void 0 : updatedContactWithBasicContent.encryptedSelf).to.equal(contactWithBasicContent.encryptedSelf);
95
+ const contactWithCompoundContent = (yield api.contactApi.createContactWithUser(user, yield api.contactApi.newInstance(user, patient, {
96
+ services: [
97
+ {
98
+ id: (0, crypto_1.randomUUID)(),
99
+ valueDate: 20250101000000,
100
+ content: {
101
+ en: {
102
+ compoundValue: [
103
+ {
104
+ id: (0, crypto_1.randomUUID)(),
105
+ content: {
106
+ en: {
107
+ stringValue: 'Compound service sub 1',
108
+ numberValue: 1,
109
+ },
110
+ },
111
+ comment: 'A comment on the compound service sub 1',
112
+ },
113
+ {
114
+ id: (0, crypto_1.randomUUID)(),
115
+ content: {
116
+ en: {
117
+ stringValue: 'Compound service sub 2',
118
+ numberValue: 2,
119
+ },
120
+ },
121
+ comment: 'A comment on the compound service sub 2',
122
+ },
123
+ ],
124
+ },
125
+ },
126
+ },
127
+ ],
128
+ descr: 'Demo 2',
129
+ })));
130
+ (0, chai_1.expect)(contactWithCompoundContent.encryptedSelf).to.not.be.empty;
131
+ (0, chai_1.expect)(contactWithCompoundContent.services[0].encryptedSelf).to.not.be.empty; // Still going to encrypt {}
132
+ (0, chai_1.expect)(contactWithCompoundContent.services[0].content.en.compoundValue[0].encryptedSelf).to.not.be.empty;
133
+ (0, chai_1.expect)(contactWithCompoundContent.services[0].content.en.compoundValue[1].encryptedSelf).to.not.be.empty;
134
+ // Modify compound values comment and check that encryptedSelf does not change since the content does not change
135
+ const updatedContactWithCompoundContent = (yield api.contactApi.modifyContactWithUser(user, Object.assign(Object.assign({}, contactWithCompoundContent), { services: [
136
+ Object.assign(Object.assign({}, contactWithCompoundContent.services[0]), { content: {
137
+ en: {
138
+ compoundValue: [
139
+ Object.assign(Object.assign({}, contactWithCompoundContent.services[0].content.en.compoundValue[0]), { comment: 'An updated comment on the compound service sub 1' }),
140
+ Object.assign(Object.assign({}, contactWithCompoundContent.services[0].content.en.compoundValue[1]), { comment: 'An updated comment on the compound service sub 2' }),
141
+ ],
142
+ },
143
+ } }),
144
+ ] })));
145
+ (0, chai_1.expect)(updatedContactWithCompoundContent.services[0].content.en.compoundValue[0].comment).to.equal('An updated comment on the compound service sub 1');
146
+ (0, chai_1.expect)(updatedContactWithCompoundContent.services[0].content.en.compoundValue[1].comment).to.equal('An updated comment on the compound service sub 2');
147
+ (0, chai_1.expect)(updatedContactWithCompoundContent.encryptedSelf).to.equal(contactWithCompoundContent.encryptedSelf);
148
+ (0, chai_1.expect)(updatedContactWithCompoundContent.services[0].encryptedSelf).to.equal(contactWithCompoundContent.services[0].encryptedSelf);
149
+ (0, chai_1.expect)(updatedContactWithCompoundContent.services[0].content.en.compoundValue[0].encryptedSelf).to.equal(contactWithCompoundContent.services[0].content.en.compoundValue[0].encryptedSelf);
150
+ (0, chai_1.expect)(updatedContactWithCompoundContent.services[0].content.en.compoundValue[1].encryptedSelf).to.equal(contactWithCompoundContent.services[0].content.en.compoundValue[1].encryptedSelf);
151
+ }));
152
+ }));
55
153
  describe('Init confidential delegation in patient', () => {
56
154
  before(function () {
57
155
  return __awaiter(this, void 0, void 0, function* () {