{"version":3,"sources":["../src/rest/endpoints.ts","../src/rest/RESTManager.ts","../src/routes/Attachments.ts","../src/structures/Attachment.ts","../src/util/Relations.ts","../src/routes/Assignments.ts","../src/structures/Assignment.ts","../src/structures/Lesson.ts","../src/structures/TimetableDay.ts","../src/routes/Agenda.ts","../src/structures/AttendanceItem.ts","../src/util/Constants.ts","../src/routes/Attendance.ts","../src/structures/Grade.ts","../src/structures/Period.ts","../src/structures/SkillLevel.ts","../src/structures/Subject.ts","../src/routes/Grades.ts","../src/structures/Mail.ts","../src/structures/Message.ts","../src/routes/Mail.ts","../src/util/URL.ts","../src/routes/OIDC.ts","../src/structures/News.ts","../src/util/Verifier.ts","../src/structures/Skolengo.ts","../src/util/JWT.ts","../src/routes/User.ts","../src/structures/OIDC.ts","../src/structures/School.ts","../src/routes/School.ts","../src/structures/MailFolder.ts","../src/util/Refresh.ts"],"names":["responseData","manager","Permissions","Services","ChallengeMethod","AttendanceItemType","AttendanceItemState","SkillLevels","MailFolderType","Kind"],"mappings":";AACO,IAAM,WAAW,MAAM,6CAAA;AAEvB,IAAM,iBAAiB,MAAM,SAAA;AAC7B,IAAM,cAAc,MAAM,cAAA;AAE1B,IAAM,SAAA,GAAY,CAAC,MAAA,KAAmB,aAAgB,GAAA,MAAA;AACtD,IAAM,mBAAmB,MAAM,sBAAA;AAC/B,IAAM,eAAA,GAAkB,CAAC,EAAA,KAAe,uBAA0B,GAAA,EAAA;AAClE,IAAM,cAAc,MAAM,SAAA;AAC1B,IAAM,uBAAuB,MAAM,sBAAA;AACnC,IAAM,mBAAmB,MAAM,qBAAA;AAC/B,IAAM,gBAAgB,MAAM,qBAAA;AAE5B,IAAM,mBAAmB,MAAM,eAAA;AAE/B,IAAM,OAAO,MAAM,gBAAA;AACnB,IAAM,mBAAsB,GAAA,CAAC,MAAmB,KAAA,iBAAA,GAAoB,MAAS,GAAA,iBAAA;AAC7E,IAAM,aAAA,GAAgB,CAAC,MAAA,KAAmB,sBAAyB,GAAA,MAAA;;;ACdnE,IAAM,cAAN,MAAkB;AAAA,EAGrB,YAAY,OAAiB,EAAA;AACzB,IAAA,IAAA,CAAK,OAAU,GAAA,OAAA;AAAA;AACnB,EAEA,MAAc,YAAe,OAAqC,EAAA;AAC9D,IAAA,MAAM,EAAE,MAAA,EAAQ,IAAM,EAAA,IAAA,EAAM,SAAY,GAAA,OAAA;AACxC,IAAA,MAAM,GAAM,GAAA,CAAA,EAAG,IAAK,CAAA,OAAO,IAAI,IAAI,CAAA,CAAA;AAEnC,IAAA,IAAI,WAAuB,GAAA,MAAA;AAC3B,IAAA,IAAI,cAAyC,GAAA;AAAA,MAC3C,YAAc,EAAA,yBAAA;AAAA,MACd,GAAG;AAAA,KACL;AAEA,IAAA,IAAI,gBAAgB,eAAiB,EAAA;AACnC,MAAA,WAAA,GAAc,KAAK,QAAS,EAAA;AAC5B,MAAA,cAAA,CAAe,cAAc,CAAI,GAAA,mCAAA;AAAA,eACxB,IAAM,EAAA;AACf,MAAc,WAAA,GAAA,IAAA,CAAK,UAAU,IAAI,CAAA;AACjC,MAAA,cAAA,CAAe,cAAc,CAAI,GAAA,kBAAA;AAAA;AAGnC,IAAM,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,GAAK,EAAA;AAAA,MAC9B,MAAA;AAAA,MACA,IAAM,EAAA,WAAA;AAAA,MACN,OAAS,EAAA;AAAA,KACZ,CAAA;AAED,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AACd,MAAMA,MAAAA,aAAAA,GAAe,MAAM,QAAA,CAAS,IAAK,EAAA;AACzC,MAAM,MAAA,IAAI,KAAM,CAAA,CAAA,EAAG,QAAS,CAAA,MAAM,KAAK,IAAK,CAAA,SAAA,CAAUA,aAAY,CAAC,CAAE,CAAA,CAAA;AAAA;AAGzE,IAAM,MAAA,YAAA,GAAe,MAAM,QAAA,CAAS,IAAK,EAAA;AACzC,IAAO,OAAA,YAAA;AAAA;AACX,EAEA,MAAM,MAAA,CAAU,IAAc,EAAA,MAAA,EAA8B,OAAsC,EAAA;AAC9F,IAAA,MAAM,SAAY,GAAA,IAAI,eAAgB,CAAA,MAAM,EAAE,QAAS,EAAA;AACvD,IAAA,MAAM,UAAU,SAAY,GAAA,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,SAAS,CAAK,CAAA,GAAA,IAAA;AACrD,IAAA,OAAO,KAAK,WAAe,CAAA;AAAA,MACvB,MAAS,EAAA,QAAA;AAAA,MACT,IAAS,EAAA,OAAA;AAAA,MACT,SAAS,OAAS,EAAA;AAAA,KACrB,CAAA;AAAA;AACL,EACA,MAAM,GAAA,CAAO,IAAc,EAAA,MAAA,EAA8B,OAA8C,EAAA;AACnG,IAAA,MAAM,SAAY,GAAA,IAAI,eAAgB,CAAA,MAAM,EAAE,QAAS,EAAA;AACvD,IAAA,MAAM,UAAU,SAAY,GAAA,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,SAAS,CAAK,CAAA,GAAA,IAAA;AACrD,IAAA,OAAO,KAAK,WAAe,CAAA;AAAA,MACvB,MAAQ,EAAA,KAAA;AAAA,MACR,IAAQ,EAAA,OAAA;AAAA,MACR;AAAA,KACH,CAAA;AAAA;AACL,EAEA,MAAM,IAAA,CAAQ,IAAc,EAAA,IAAA,EAAW,QAA8B,OAAsC,EAAA;AACvG,IAAA,MAAM,SAAY,GAAA,IAAI,eAAgB,CAAA,MAAM,EAAE,QAAS,EAAA;AACvD,IAAA,MAAM,UAAU,SAAY,GAAA,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,SAAS,CAAK,CAAA,GAAA,IAAA;AACrD,IAAA,OAAO,KAAK,WAAe,CAAA;AAAA,MACvB,MAAS,EAAA,MAAA;AAAA,MACT,IAAM,EAAA,OAAA;AAAA,MACN,IAAA;AAAA,MACA,SAAS,OAAS,EAAA;AAAA,KACrB,CAAA;AAAA;AACL,EAEA,MAAM,GAAA,CAAO,IAAc,EAAA,IAAA,EAAW,OAAsC,EAAA;AACxE,IAAA,OAAO,KAAK,WAAe,CAAA;AAAA,MACvB,MAAS,EAAA,KAAA;AAAA,MACT,IAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAS,OAAS,EAAA;AAAA,KACrB,CAAA;AAAA;AACL,EAEA,MAAM,KAAA,CAAS,IAAc,EAAA,IAAA,EAAW,QAA8B,OAAsC,EAAA;AACxG,IAAA,MAAM,SAAY,GAAA,IAAI,eAAgB,CAAA,MAAM,EAAE,QAAS,EAAA;AACvD,IAAA,MAAM,UAAU,SAAY,GAAA,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,SAAS,CAAK,CAAA,GAAA,IAAA;AACrD,IAAA,OAAO,KAAK,WAAe,CAAA;AAAA,MACvB,MAAS,EAAA,OAAA;AAAA,MACT,IAAM,EAAA,OAAA;AAAA,MACN,IAAA;AAAA,MACA,SAAS,OAAS,EAAA;AAAA,KACrB,CAAA;AAAA;AAET,CAAA;;;AC7Fa,IAAA,kBAAA,GAAqB,OAAM,GAAA,EAAa,WAA0C,KAAA;AAC3F,EAAM,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,GAAK,EAAA;AAAA,IAC9B,MAAS,EAAA,KAAA;AAAA,IACT,OAAA,EAAS,cAAc,EAAE,aAAA,EAAe,UAAU,WAAW,CAAA,CAAA,KAAO;AAAC,GACxE,CAAA;AAED,EAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AACd,IAAA,MAAM,IAAI,KAAA,CAAM,CAAuB,oBAAA,EAAA,QAAA,CAAS,MAAM,CAAE,CAAA,CAAA;AAAA;AAG5D,EAAM,MAAA,WAAA,GAAc,MAAM,QAAA,CAAS,WAAY,EAAA;AAC/C,EAAM,MAAA,MAAA,GAAS,MAAO,CAAA,IAAA,CAAK,WAAW,CAAA;AAEtC,EAAO,OAAA,MAAA;AACX;;;ACTO,IAAM,aAAN,MAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWpB,YACc,WACH,EAAA,EAAA,EACA,KACA,QACA,EAAA,IAAA,EACA,WACA,IACV,EAAA;AAPa,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACH,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA;AACT;AAAA;AAAA;AAAA;AAAA,EAMF,qBAAyC,GAAA;AACrC,IAAA,OAAO,kBAAmB,CAAA,IAAA,CAAK,GAAK,EAAA,IAAA,CAAK,WAAW,CAAA;AAAA;AAE5D;;;AC7BO,SAAS,kBACZ,GAC6B,EAAA;AAC7B,EAAO,OAAA,GAAA,IAAO,CAAC,KAAM,CAAA,OAAA,CAAQ,IAAI,IAAI,CAAA,GAAI,IAAI,IAAO,GAAA,MAAA;AACxD;AAEa,IAAA,oBAAA,GAAuB,CAChC,GAAA,KAC2B,GAAO,IAAA,KAAA,CAAM,OAAQ,CAAA,GAAA,CAAI,IAAI,CAAA,GAAI,GAAI,CAAA,IAAA,GAAO;;;ACJ3E,IAAM,OAAU,GAAA,IAAI,WAAY,CAAA,QAAA,EAAU,CAAA;AAE7B,IAAA,cAAA,GAAiB,OAC1B,MAAA,EACA,WACA,EAAA,OAAA,EACA,UACA,WAAc,mBAAA,IAAI,IAAK,EAAA,EACvB,SAAY,GAAA,IAAI,sBAAS,IAAA,IAAA,EAAO,EAAA,QAAA,CAAA,iBAAa,IAAA,IAAA,IAAO,QAAS,EAAA,GAAI,CAAC,CAAC,CACtC,KAAA;AAC7B,EAAM,MAAA,UAAA,GAAa,CAAC,IAChB,KAAA,IAAA,CAAK,aAAc,CAAA,KAAA,CAAM,GAAG,EAAE,CAAA;AAElC,EAAA,MAAM,QAAW,GAAA,MAAM,OAAQ,CAAA,GAAA,CAAkB,kBAAoB,EAAA;AAAA,IACjE,oBAAuB,EAAA,MAAA;AAAA,IACvB,qBAAA,EAAuB,WAAW,WAAW,CAAA;AAAA,IAC7C,qBAAA,EAAuB,WAAW,SAAS,CAAA;AAAA,IAC3C,SAAuB,EAAA,0MAAA;AAAA,IACvB,kBAAuB,EAAA,iEAAA;AAAA,IACvB,iBAAuB,EAAA;AAAA,GACxB,EAAA;AAAA,IACC,eAAA,EAAwB,UAAU,WAAW,CAAA,CAAA;AAAA,IAC7C,qBAAwB,EAAA,OAAA;AAAA,IACxB,sBAAwB,EAAA;AAAA,GAC3B,CAAA;AAED,EAAM,MAAA,WAAA,uBAAkB,GAAqB,EAAA;AAC7C,EAAA,KAAA,MAAW,IAAQ,IAAA,QAAA,CAAS,QAAY,IAAA,EAAI,EAAA;AACxC,IAAY,WAAA,CAAA,GAAA,CAAI,GAAG,IAAK,CAAA,IAAI,IAAI,IAAK,CAAA,EAAE,IAAI,IAAI,CAAA;AAAA;AAGnD,EAAA,OAAA,CAAQ,MAAM,OAAQ,CAAA,QAAA,CAAS,IAAI,CAAA,GAAI,SAAS,IAAO,GAAA,EAClD,EAAA,MAAA,CAAO,CAAC,IAAmE,KAAA,IAAA,CAAK,SAAS,UAAU,CAAA,CACnG,IAAI,CAAc,UAAA,KAAA;AACf,IAAA,MAAM,SAAY,GAAA,iBAAA,CAAkB,UAAW,CAAA,aAAA,CAAc,OAAO,CAAG,EAAA,EAAA;AACvE,IAAA,MAAM,UAAU,SAAY,GAAA,WAAA,CAAY,IAAI,CAAW,QAAA,EAAA,SAAS,EAAE,CAAuB,GAAA,IAAA;AACzF,IAAA,MAAM,SAAY,GAAA,iBAAA,CAAkB,UAAW,CAAA,aAAA,CAAc,OAAO,CAAG,EAAA,EAAA;AACvE,IAAA,MAAM,UAAU,SAAY,GAAA,WAAA,CAAY,IAAI,CAAW,QAAA,EAAA,SAAS,EAAE,CAAuB,GAAA,IAAA;AAEzF,IAAA,OAAO,IAAI,UAAA;AAAA,MACP,WAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAW,CAAA,EAAA;AAAA,MACX,UAAA,CAAW,YAAY,IAAQ,IAAA,KAAA;AAAA,MAC/B,UAAA,CAAW,YAAY,KAAS,IAAA,EAAA;AAAA,MAChC,UAAA,CAAW,YAAY,IAAQ,IAAA,EAAA;AAAA,MAC/B,IAAI,IAAA,CAAK,UAAW,CAAA,UAAA,EAAY,eAAe,EAAE,CAAA;AAAA,MACjD,UAAA,CAAW,YAAY,iBAAqB,IAAA,KAAA;AAAA,MAC5C,UAAA,CAAW,YAAY,gBAAoB,IAAA,EAAA;AAAA,MAC3C;AAAA,QACI,IAAO,SAA+B,IAAA,EAAA;AAAA,QACtC,KAAA,EAAO,OAAS,EAAA,UAAA,EAAY,KAAU,IAAA,EAAA;AAAA,QACtC,KAAA,EAAO,OAAS,EAAA,UAAA,EAAY,KAAU,IAAA;AAAA,OAC1C;AAAA,MACA;AAAA,QACI,IAAW,SAAkC,IAAA,EAAA;AAAA,QAC7C,KAAA,EAAW,OAAS,EAAA,UAAA,EAAY,KAAa,IAAA,EAAA;AAAA,QAC7C,SAAA,EAAW,OAAS,EAAA,UAAA,EAAY,SAAa,IAAA,EAAA;AAAA,QAC7C,QAAA,EAAW,OAAS,EAAA,UAAA,EAAY,QAAa,IAAA,EAAA;AAAA,QAC7C,QAAA,EAAW,OAAS,EAAA,UAAA,EAAY,QAAa,IAAA;AAAA;AACjD,KACJ;AAAA,GACH,CAAA;AACT;AAEO,IAAM,2BAA2B,OAAO,YAAA,EAAsB,MAAgB,EAAA,QAAA,EAAkB,aAAqB,OAAgD,KAAA;AACxK,EAAA,MAAM,WAAW,MAAM,OAAA,CAAQ,GAAkB,CAAA,eAAA,CAAgB,YAAY,CAAG,EAAA;AAAA,IAC5E,oBAAsB,EAAA,MAAA;AAAA,IACtB,SAAsB,EAAA,aAAA;AAAA,IACtB,oBAAsB,EAAA;AAAA,GACvB,EAAA;AAAA,IACC,eAAA,EAAwB,UAAU,WAAW,CAAA,CAAA;AAAA,IAC7C,qBAAwB,EAAA,OAAA;AAAA,IACxB,sBAAwB,EAAA;AAAA,GAC3B,CAAA;AAED,EAAM,MAAA,WAAA,uBAAkB,GAAqB,EAAA;AAC7C,EAAA,KAAA,MAAW,IAAQ,IAAA,QAAA,CAAS,QAAY,IAAA,EAAI,EAAA;AACxC,IAAY,WAAA,CAAA,GAAA,CAAI,GAAG,IAAK,CAAA,IAAI,IAAI,IAAK,CAAA,EAAE,IAAI,IAAI,CAAA;AAAA;AAGnD,EAAO,OAAA,KAAA,CAAM,KAAK,WAAY,CAAA,OAAA,EAAS,CAClC,CAAA,MAAA,CAAO,CAAC,CAAC,GAAG,MAAM,GAAI,CAAA,UAAA,CAAW,aAAa,CAAC,CAAA,CAC/C,IAAI,CAAC,GAAG,KAAK,CAAM,KAAA;AAChB,IAAA,MAAM,UAAa,GAAA,KAAA;AACnB,IAAA,OAAO,IAAI,UAAA;AAAA,MACP,WAAA;AAAA,MACA,UAAW,CAAA,EAAA;AAAA,MACX,UAAA,CAAW,YAAY,GAAO,IAAA,EAAA;AAAA,MAC9B,UAAA,CAAW,YAAY,IAAQ,IAAA,EAAA;AAAA,MAC/B,UAAA,CAAW,YAAY,QAAY,IAAA,EAAA;AAAA,MACnC,UAAA,CAAW,YAAY,aAAiB,IAAA,EAAA;AAAA,MACxC,UAAA,CAAW,YAAY,IAAQ,IAAA;AAAA,KACnC;AAAA,GACH,CAAA;AACT;AAEO,IAAM,0BAA0B,OACnC,YAAA,EACA,QACA,SACA,EAAA,QAAA,EACA,aACA,OACsB,KAAA;AACtB,EAAM,MAAA,QAAA,GAAW,MAAM,OAAQ,CAAA,KAAA;AAAA,IAC3B,gBAAgB,YAAY,CAAA;AAAA,IAC5B,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,UAAW,EAAA,EAAA,EAAI,YAAa,EAAA,UAAA,EAAY,EAAE,IAAA,EAAM,SAAU,EAAA,EAAI,EAAA;AAAA,IAC9E;AAAA,MACI,oBAAsB,EAAA,MAAA;AAAA,MACtB,SAAsB,EAAA,aAAA;AAAA,MACtB,oBAAsB,EAAA;AAAA,KAC1B;AAAA,IACA;AAAA,MACI,OAAS,EAAA;AAAA,QACL,eAAA,EAAwB,UAAU,WAAW,CAAA,CAAA;AAAA,QAC7C,qBAAwB,EAAA,OAAA;AAAA,QACxB,sBAAwB,EAAA;AAAA;AAC5B;AACJ,GACJ;AAEA,EAAM,MAAA,WAAA,uBAAkB,GAAqB,EAAA;AAC7C,EAAA,KAAA,MAAW,IAAQ,IAAA,QAAA,CAAS,QAAY,IAAA,EAAI,EAAA;AACxC,IAAY,WAAA,CAAA,GAAA,CAAI,GAAG,IAAK,CAAA,IAAI,IAAI,IAAK,CAAA,EAAE,IAAI,IAAI,CAAA;AAAA;AAEnD,EAAA,MAAM,OAAO,QAAS,CAAA,IAAA;AACtB,EAAA,MAAM,SAAY,GAAA,iBAAA,CAAkB,IAAK,CAAA,aAAA,CAAc,OAAO,CAAG,EAAA,EAAA;AACjE,EAAA,MAAM,SAAY,GAAA,iBAAA,CAAkB,IAAK,CAAA,aAAA,CAAc,OAAO,CAAG,EAAA,EAAA;AACjE,EAAA,MAAM,UAAU,SAAY,GAAA,WAAA,CAAY,GAAI,CAAA,UAAA,GAAa,SAAS,CAAuB,GAAA,IAAA;AACzF,EAAA,MAAM,UAAU,SAAY,GAAA,WAAA,CAAY,GAAI,CAAA,UAAA,GAAa,SAAS,CAAuB,GAAA,IAAA;AAEzF,EAAA,OAAO,IAAI,UAAA;AAAA,IACP,WAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA,IAAA,CAAK,YAAY,KAAS,IAAA,EAAA;AAAA,IAC1B,IAAA,CAAK,YAAY,IAAQ,IAAA,EAAA;AAAA,IACzB,IAAI,IAAA,CAAK,IAAK,CAAA,UAAA,EAAY,eAAe,EAAE,CAAA;AAAA,IAC3C,IAAA,CAAK,YAAY,iBAAqB,IAAA,KAAA;AAAA,IACtC,IAAA,CAAK,YAAY,gBAAoB,IAAA,EAAA;AAAA,IACrC;AAAA,MACI,EAAA,EAAO,SAAS,EAAqB,IAAA,EAAA;AAAA,MACrC,KAAA,EAAO,OAAS,EAAA,UAAA,EAAY,KAAS,IAAA,EAAA;AAAA,MACrC,KAAA,EAAO,OAAS,EAAA,UAAA,EAAY,KAAS,IAAA;AAAA,KACzC;AAAA,IACA;AAAA,MACI,EAAA,EAAW,SAAS,EAAyB,IAAA,EAAA;AAAA,MAC7C,KAAA,EAAW,OAAS,EAAA,UAAA,EAAY,KAAa,IAAA,EAAA;AAAA,MAC7C,SAAA,EAAW,OAAS,EAAA,UAAA,EAAY,SAAa,IAAA,EAAA;AAAA,MAC7C,QAAA,EAAW,OAAS,EAAA,UAAA,EAAY,QAAa,IAAA,EAAA;AAAA,MAC7C,QAAA,EAAW,OAAS,EAAA,UAAA,EAAY,QAAa,IAAA;AAAA;AACjD,GACJ;AACJ;;;AChKO,IAAM,aAAN,MAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBpB,WACc,CAAA,WAAA,EACH,MACA,EAAA,QAAA,EACA,OACA,EAAA,EAAA,EACA,IACA,EAAA,KAAA,EACA,IACA,EAAA,WAAA,EACA,iBACA,EAAA,gBAAA,EACA,SACA,OACT,EAAA;AAbY,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACH,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,iBAAA,GAAA,iBAAA;AACA,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA;AACR;AAAA;AAAA;AAAA;AAAA,EAMH,MAAM,cAA6C,GAAA;AAC/C,IAAO,OAAA,wBAAA;AAAA,MACH,IAAK,CAAA,EAAA;AAAA,MACL,IAAK,CAAA,MAAA;AAAA,MACL,IAAK,CAAA,QAAA;AAAA,MACL,IAAK,CAAA,WAAA;AAAA,MACL,IAAK,CAAA;AAAA,KACT;AAAA;AACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAc,SAA0C,EAAA;AAC1D,IAAM,MAAA,YAAA,GAAe,SAAa,IAAA,CAAC,IAAK,CAAA,IAAA;AACxC,IAAO,OAAA,uBAAA;AAAA,MACH,IAAK,CAAA,EAAA;AAAA,MACL,IAAK,CAAA,MAAA;AAAA,MACL,YAAA;AAAA,MACA,IAAK,CAAA,QAAA;AAAA,MACL,IAAK,CAAA,WAAA;AAAA,MACL,IAAK,CAAA;AAAA,KACT;AAAA;AAER;;;ACnEO,IAAM,SAAN,MAAa;AAAA,EAChB,WAAA,CACW,EACA,EAAA,aAAA,EACA,WACA,EAAA,IAAA,EACA,UACA,UACA,EAAA,2BAAA,EACA,6BACA,EAAA,OAAA,EACA,OACV,EAAA;AAVU,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,2BAAA,GAAA,2BAAA;AACA,IAAA,IAAA,CAAA,6BAAA,GAAA,6BAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA;AAEf;;;ACZO,IAAM,eAAN,MAAmB;AAAA,EACtB,WAAA,CACW,IACA,EAAA,OAAA,EACA,WACV,EAAA;AAHU,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAAA;AAEf;;;ACCA,IAAMC,QAAU,GAAA,IAAI,WAAY,CAAA,QAAA,EAAU,CAAA;AAE7B,IAAA,sBAAA,GAAyB,OAAO,MAAA,EAAgB,QAAkB,EAAA,OAAA,EAAiB,WAAqB,EAAA,WAAA,mBAAkB,IAAA,IAAA,EAAQ,EAAA,SAAA,GAAY,IAAI,IAAA,CAAA,qBAAS,IAAK,EAAA,EAAE,QAAS,CAAA,iBAAA,IAAI,IAAK,EAAA,EAAE,QAAS,EAAA,GAAI,CAAC,CAAC,CAAG,EAAA,KAAA,GAAQ,EAAqC,KAAA;AAC9P,EAAM,MAAA,UAAA,GAAa,CAAC,IAChB,KAAA,IAAA,CAAK,aAAc,CAAA,KAAA,CAAM,GAAG,EAAE,CAAA;AAElC,EAAA,MAAM,QAAW,GAAA,MAAMA,QAAQ,CAAA,GAAA,CAAkB,aAAe,EAAA;AAAA,IAC5D,oBAA2B,EAAA,MAAA;AAAA,IAC3B,kBAAA,EAA2B,WAAW,WAAW,CAAA;AAAA,IACjD,kBAAA,EAA2B,WAAW,SAAS,CAAA;AAAA,IAC/C,SAA2B,EAAA,0FAAA;AAAA,IAC3B,gBAA2B,EAAA,yIAAA;AAAA,IAC3B,kBAA2B,EAAA,yEAAA;AAAA,IAC3B,yBAA2B,EAAA,iCAAA;AAAA,IAC3B,iBAA2B,EAAA,0BAAA;AAAA,IAC3B,iBAA2B,EAAA,aAAA;AAAA,IAC3B,aAA2B,EAAA;AAAA,GAC5B,EAAA;AAAA,IACC,eAAA,EAAwB,UAAU,WAAW,CAAA,CAAA;AAAA,IAC7C,qBAAwB,EAAA,OAAA;AAAA,IACxB,sBAAwB,EAAA;AAAA,GAC3B,CAAA;AAED,EAAM,MAAA,WAAA,uBAAkB,GAAqB,EAAA;AAC7C,EAAA,KAAA,MAAW,IAAQ,IAAA,QAAA,CAAS,QAAY,IAAA,EAAI,EAAA;AACxC,IAAY,WAAA,CAAA,GAAA,CAAI,GAAG,IAAK,CAAA,IAAI,IAAI,IAAK,CAAA,EAAE,IAAI,IAAI,CAAA;AAAA;AAGnD,EAAA,MAAM,SAA8B,EAAC;AACrC,EAAA,MAAM,OAAO,QAAS,CAAA,IAAA;AAEtB,EAAA,KAAA,MAAW,OAAO,IAAM,EAAA;AACpB,IAAA,MAAM,UAAyB,EAAC;AAChC,IAAA,MAAM,UAAa,GAAA,oBAAA,CAAqB,GAAI,CAAA,aAAA,CAAc,OAAO,CAAA;AAEjE,IAAA,MAAM,cAAiC,EAAC;AACxC,IAAA,MAAM,cAAiB,GAAA,oBAAA,CAAqB,GAAI,CAAA,aAAA,CAAc,mBAAmB,CAAA;AAEjF,IAAA,KAAA,MAAW,cAAc,cAAgB,EAAA;AACrC,MAAA,MAAM,cAAiB,GAAA,WAAA,CAAY,GAAI,CAAA,WAAA,GAAc,WAAW,EAAE,CAAA;AAClE,MAAA,MAAM,mBAAsB,GAAA,iBAAA,CAAkB,cAAe,CAAA,aAAA,EAAe,OAAO,CAAG,EAAA,EAAA;AACtF,MAAA,MAAM,oBAAoB,mBAAsB,GAAA,WAAA,CAAY,GAAI,CAAA,UAAA,GAAa,mBAAmB,CAAuB,GAAA,IAAA;AACvH,MAAA,WAAA,CAAY,KAAK,IAAI,UAAA;AAAA,QACjB,WAAA;AAAA,QACA,MAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA;AAAA,QACA,UAAW,CAAA,EAAA;AAAA,QACX,cAAA,CAAe,YAAY,IAAQ,IAAA,KAAA;AAAA,QACnC,cAAA,CAAe,YAAY,KAAS,IAAA,EAAA;AAAA,QACpC,cAAA,CAAe,YAAY,IAAQ,IAAA,EAAA;AAAA,QACnC,IAAI,IAAA,CAAK,cAAe,CAAA,UAAA,EAAY,eAAe,EAAE,CAAA;AAAA,QACrD,cAAA,CAAe,YAAY,iBAAqB,IAAA,KAAA;AAAA,QAChD,cAAA,CAAe,YAAY,gBAAoB,IAAA,EAAA;AAAA,QAC/C;AAAA,UACI,IAAO,mBAAuB,IAAA,EAAA;AAAA,UAC9B,KAAA,EAAO,iBAAmB,EAAA,UAAA,EAAY,KAAS,IAAA,EAAA;AAAA,UAC/C,KAAA,EAAO,iBAAmB,EAAA,UAAA,EAAY,KAAS,IAAA;AAAA;AACnD,OAAE,CAAA;AAAA;AAEV,IAAA,KAAA,MAAW,aAAa,UAAY,EAAA;AAChC,MAAM,MAAA,MAAA,GAAS,UAAU,EAAK,GAAA,WAAA,CAAY,IAAI,SAAY,GAAA,SAAA,CAAU,EAAE,CAAsB,GAAA,IAAA;AAE5F,MAAA,MAAM,SAAY,GAAA,iBAAA,CAAkB,MAAQ,EAAA,aAAA,EAAe,OAAO,CAAG,EAAA,EAAA;AACrE,MAAA,MAAM,UAAU,SAAY,GAAA,WAAA,CAAY,GAAI,CAAA,UAAA,GAAa,SAAS,CAAuB,GAAA,IAAA;AAEzF,MAAA,MAAM,WAA2B,EAAC;AAClC,MAAA,MAAM,WAAc,GAAA,oBAAA,CAAqB,MAAQ,EAAA,aAAA,EAAe,QAAQ,CAAA;AACxE,MAAA,KAAA,MAAW,WAAW,WAAa,EAAA;AAC/B,QAAA,MAAM,WAAc,GAAA,WAAA,CAAY,GAAI,CAAA,UAAA,GAAa,QAAQ,EAAE,CAAA;AAC3D,QAAA,QAAA,CAAS,IAAK,CAAA;AAAA,UACV,IAAW,OAAQ,CAAA,EAAA;AAAA,UACnB,KAAA,EAAW,WAAY,CAAA,UAAA,EAAY,KAAS,IAAA,EAAA;AAAA,UAC5C,SAAA,EAAW,WAAY,CAAA,UAAA,EAAY,SAAa,IAAA,EAAA;AAAA,UAChD,QAAA,EAAW,WAAY,CAAA,UAAA,EAAY,QAAY,IAAA,EAAA;AAAA,UAC/C,QAAA,EAAW,WAAY,CAAA,UAAA,EAAY,QAAY,IAAA;AAAA,SAClD,CAAA;AAAA;AAEL,MAAA,OAAA,CAAQ,KAAK,IAAI,MAAA;AAAA,QACb,SAAU,CAAA,EAAA;AAAA,QACV,IAAI,IAAA,CAAK,MAAQ,EAAA,UAAA,EAAY,iBAAiB,EAAE,CAAA;AAAA,QAChD,IAAI,IAAA,CAAK,MAAQ,EAAA,UAAA,EAAY,eAAe,EAAE,CAAA;AAAA,QAC9C,MAAA,EAAQ,YAAY,QAAY,IAAA,EAAA;AAAA,QAChC,MAAA,EAAQ,YAAY,QAAY,IAAA,KAAA;AAAA,QAChC,MAAA,EAAQ,YAAY,UAAc,IAAA,KAAA;AAAA,QAClC,MAAA,EAAQ,YAAY,2BAA+B,IAAA,KAAA;AAAA,QACnD,MAAA,EAAQ,YAAY,6BAAiC,IAAA,KAAA;AAAA,QACrD;AAAA,UACI,EAAA,EAAO,SAAS,EAAM,IAAA,EAAA;AAAA,UACtB,KAAA,EAAO,OAAS,EAAA,UAAA,EAAY,KAAS,IAAA,EAAA;AAAA,UACrC,KAAA,EAAO,OAAS,EAAA,UAAA,EAAY,KAAS,IAAA;AAAA,SACzC;AAAA,QACA;AAAA,OACH,CAAA;AAAA;AAGL,IAAA,MAAA,CAAO,KAAK,IAAI,YAAA;AAAA,MACZ,IAAI,IAAA,CAAK,GAAI,CAAA,UAAA,EAAY,QAAQ,EAAE,CAAA;AAAA,MACnC,OAAA;AAAA,MACA;AAAA,KACH,CAAA;AAAA;AAGL,EAAO,OAAA,MAAA;AACX;;;AChHO,IAAM,iBAAN,MAAqB;AAAA,EACxB,YACW,EACA,EAAA,YAAA,EACA,WACA,OACA,EAAA,IAAA,EACA,OACA,MACV,EAAA;AAPU,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA;AAEf;;;ACZO,IAAM,cAAiB,GAAA;AACvB,IAAM,kBAAqB,GAAA;AAC3B,IAAM,YAAe,GAAA;AAEhB,IAAA,WAAA,qBAAAC,YAAL,KAAA;AACH,EAAAA,aAAA,kBAAmB,CAAA,GAAA,kBAAA;AACnB,EAAAA,aAAA,oBAAqB,CAAA,GAAA,oBAAA;AACrB,EAAAA,aAAA,eAAgB,CAAA,GAAA,eAAA;AAChB,EAAAA,aAAA,gBAAiB,CAAA,GAAA,gBAAA;AACjB,EAAAA,aAAA,cAAe,CAAA,GAAA,cAAA;AACf,EAAAA,aAAA,kBAAmB,CAAA,GAAA,2BAAA;AACnB,EAAAA,aAAA,yBAA0B,CAAA,GAAA,kCAAA;AAPlB,EAAAA,OAAAA,YAAAA;AAAA,CAAA,EAAA,WAAA,IAAA,EAAA;AAUA,IAAA,QAAA,qBAAAC,SAAL,KAAA;AACH,EAAAA,UAAA,UAAW,CAAA,GAAA,KAAA;AACX,EAAAA,UAAA,WAAY,CAAA,GAAA,KAAA;AACZ,EAAAA,UAAA,KAAM,CAAA,GAAA,QAAA;AACN,EAAAA,UAAA,UAAW,CAAA,GAAA,KAAA;AACX,EAAAA,UAAA,UAAW,CAAA,GAAA,KAAA;AACX,EAAAA,UAAA,UAAW,CAAA,GAAA,KAAA;AACX,EAAAA,UAAA,aAAc,CAAA,GAAA,MAAA;AACd,EAAAA,UAAA,eAAgB,CAAA,GAAA,MAAA;AARR,EAAAA,OAAAA,SAAAA;AAAA,CAAA,EAAA,QAAA,IAAA,EAAA;AAWA,IAAA,eAAA,qBAAAC,gBAAL,KAAA;AACH,EAAAA,iBAAA,OAAQ,CAAA,GAAA,OAAA;AACR,EAAAA,iBAAA,MAAO,CAAA,GAAA,MAAA;AAFC,EAAAA,OAAAA,gBAAAA;AAAA,CAAA,EAAA,eAAA,IAAA,EAAA;AAKA,IAAA,kBAAA,qBAAAC,mBAAL,KAAA;AACH,EAAAA,oBAAA,UAAW,CAAA,GAAA,UAAA;AACX,EAAAA,oBAAA,SAAU,CAAA,GAAA,SAAA;AAFF,EAAAA,OAAAA,mBAAAA;AAAA,CAAA,EAAA,kBAAA,IAAA,EAAA;AAKA,IAAA,mBAAA,qBAAAC,oBAAL,KAAA;AACH,EAAAA,qBAAA,QAAS,CAAA,GAAA,QAAA;AACT,EAAAA,qBAAA,MAAO,CAAA,GAAA,MAAA;AAFC,EAAAA,OAAAA,oBAAAA;AAAA,CAAA,EAAA,mBAAA,IAAA,EAAA;AAKA,IAAA,WAAA,qBAAAC,YAAL,KAAA;AACH,EAAAA,aAAA,MAAO,CAAA,GAAA,MAAA;AACP,EAAAA,aAAA,sBAAuB,CAAA,GAAA,sBAAA;AACvB,EAAAA,aAAA,aAAc,CAAA,GAAA,aAAA;AACd,EAAAA,aAAA,sBAAuB,CAAA,GAAA,sBAAA;AACvB,EAAAA,aAAA,mBAAoB,CAAA,GAAA,mBAAA;AALZ,EAAAA,OAAAA,YAAAA;AAAA,CAAA,EAAA,WAAA,IAAA,EAAA;AAQA,IAAA,cAAA,qBAAAC,eAAL,KAAA;AACH,EAAAA,gBAAA,OAAQ,CAAA,GAAA,OAAA;AACR,EAAAA,gBAAA,MAAO,CAAA,GAAA,MAAA;AACP,EAAAA,gBAAA,UAAW,CAAA,GAAA,UAAA;AACX,EAAAA,gBAAA,OAAQ,CAAA,GAAA,OAAA;AAJA,EAAAA,OAAAA,eAAAA;AAAA,CAAA,EAAA,cAAA,IAAA,EAAA;AAOA,IAAA,IAAA,qBAAAC,KAAL,KAAA;AACH,EAAAA,KAAA,CAAA,KAAA,CAAA,SAAA,CAAA,GAAA,CAAA,CAAA,GAAA,SAAA;AACA,EAAAA,KAAA,CAAA,KAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAA;AAFQ,EAAAA,OAAAA,KAAAA;AAAA,CAAA,EAAA,IAAA,IAAA,EAAA;;;AC/CZ,IAAMR,QAAU,GAAA,IAAI,WAAY,CAAA,QAAA,EAAU,CAAA;AAEnC,IAAM,kBAAqB,GAAA,OAAO,MAAgB,EAAA,QAAA,EAAkB,SAAiB,WAAwD,KAAA;AAChJ,EAAA,MAAM,QAAW,GAAA,MAAMA,QAAQ,CAAA,GAAA,CAAkB,kBAAoB,EAAA;AAAA,IACjE,oBAAoC,EAAA,MAAA;AAAA,IACpC,kCAAoC,EAAA,mBAAA;AAAA,IACpC,qBAAoC,EAAA,cAAA;AAAA,IACpC,SAAoC,EAAA,wEAAA;AAAA,IACpC,0BAAoC,EAAA,wHAAA;AAAA,IACpC,uBAAoC,EAAA;AAAA,GACrC,EAAA;AAAA,IACC,eAAA,EAAwB,UAAU,WAAW,CAAA,CAAA;AAAA,IAC7C,qBAAwB,EAAA,OAAA;AAAA,IACxB,sBAAwB,EAAA;AAAA,GAC3B,CAAA;AAED,EAAM,MAAA,WAAA,uBAAkB,GAAqB,EAAA;AAC7C,EAAA,KAAA,MAAW,IAAQ,IAAA,QAAA,CAAS,QAAY,IAAA,EAAI,EAAA;AACxC,IAAY,WAAA,CAAA,GAAA,CAAI,GAAG,IAAK,CAAA,IAAI,IAAI,IAAK,CAAA,EAAE,IAAI,IAAI,CAAA;AAAA;AAGnD,EAAA,OAAA,CAAQ,MAAM,OAAQ,CAAA,QAAA,CAAS,IAAI,CAAA,GAAI,SAAS,IAAO,GAAA,EAClD,EAAA,MAAA,CAAO,CAAC,IAAkD,KAAA,IAAA,CAAK,SAAS,aAAa,CAAA,CACrF,IAAI,CAAe,WAAA,KAAA;AAChB,IAAA,MAAM,MAAS,GAAA,iBAAA,CAAkB,WAAY,CAAA,aAAA,CAAc,YAAY,CAAG,EAAA,EAAA;AAC1E,IAAA,MAAM,OAAO,MAAS,GAAA,WAAA,CAAY,GAAI,CAAA,mBAAA,GAAsB,MAAM,CAAgC,GAAA,IAAA;AAClG,IAAA,MAAM,QAAW,GAAA,iBAAA,CAAkB,IAAM,EAAA,aAAA,EAAe,aAAa,CAAG,EAAA,EAAA;AACxE,IAAA,MAAM,SAAS,QAAW,GAAA,WAAA,CAAY,GAAI,CAAA,gBAAA,GAAmB,QAAQ,CAA6B,GAAA,IAAA;AAClG,IAAA,OAAO,IAAI,cAAA;AAAA,MACP,WAAY,CAAA,EAAA;AAAA,MACZ,IAAI,IAAA,CAAK,IAAM,EAAA,UAAA,EAAY,oBAAoB,EAAE,CAAA;AAAA,MACjD,IAAI,IAAA,CAAK,IAAM,EAAA,UAAA,EAAY,wBAAwB,EAAE,CAAA;AAAA,MACrD,IAAI,IAAA,CAAK,IAAM,EAAA,UAAA,EAAY,sBAAsB,EAAE,CAAA;AAAA,MACnD,MAAM,UAAY,EAAA,WAAA,IAAA,SAAA;AAAA,MAClB,MAAM,UAAY,EAAA,iBAAA,IAAA,MAAA;AAAA,MAClB,MAAA,EAAQ,YAAY,SAAa,IAAA;AAAA,KACrC;AAAA,GACH,CAAA;AACT;;;AC5CO,IAAM,QAAN,MAAY;AAAA,EACf,WAAA,CACW,EACA,EAAA,QAAA,EACA,KACA,EAAA,KAAA,EACA,MACA,WACA,EAAA,KAAA,EACA,KACA,EAAA,OAAA,EACA,eACV,EAAA;AAVU,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,eAAA,GAAA,eAAA;AAAA;AAEf;;;ACfO,IAAM,SAAN,MAAa;AAAA,EAChB,WACW,CAAA,EAAA,EACA,KACA,EAAA,SAAA,EACA,OACV,EAAA;AAJU,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA;AAEf;;;ACLO,IAAM,aAAN,MAAiB;AAAA,EACpB,WACW,CAAA,KAAA,EACA,UACA,EAAA,KAAA,EACA,KACV,EAAA;AAJU,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA;AAEf;;;ACNO,IAAM,UAAN,MAAc;AAAA,EACjB,WAAA,CACW,IACA,IACA,EAAA,WAAA,EACA,OACA,KACA,EAAA,OAAA,EACA,QACA,QACV,EAAA;AARU,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA;AAEf;;;ACQA,IAAMA,QAAU,GAAA,IAAI,WAAY,CAAA,QAAA,EAAU,CAAA;AAEnC,IAAM,iBAAoB,GAAA,OAC7B,MACA,EAAA,WAAA,EACA,SACA,QAC0B,KAAA;AAC1B,EAAA,MAAM,QAAW,GAAA,MAAMA,QAAQ,CAAA,GAAA,CAAkB,sBAAwB,EAAA;AAAA,IACrE,oBAAkC,EAAA,MAAA;AAAA,IAClC,SAAkC,EAAA,4DAAA;AAAA,IAClC,4BAAkC,EAAA,kEAAA;AAAA,IAClC,gBAAkC,EAAA,yBAAA;AAAA,IAClC,uBAAkC,EAAA,+CAAA;AAAA,IAClC,gCAAkC,EAAA;AAAA,GACnC,EAAA;AAAA,IACC,eAAA,EAAwB,UAAU,WAAW,CAAA,CAAA;AAAA,IAC7C,qBAAwB,EAAA,OAAA;AAAA,IACxB,sBAAwB,EAAA;AAAA,GAC3B,CAAA;AAED,EAAM,MAAA,WAAA,uBAAkB,GAAqB,EAAA;AAC7C,EAAA,KAAA,MAAW,IAAQ,IAAA,QAAA,CAAS,QAAY,IAAA,EAAI,EAAA;AACxC,IAAY,WAAA,CAAA,GAAA,CAAI,GAAG,IAAK,CAAA,IAAI,IAAI,IAAK,CAAA,EAAE,IAAI,IAAI,CAAA;AAAA;AAGnD,EAAM,MAAA,IAAA,GACF,KAAM,CAAA,OAAA,CAAQ,QAAS,CAAA,IAAI,IACpB,QAAS,CAAA,IAAA,CAAK,CAAC,CAAA,GACf,QAAS,CAAA,IAAA;AAEpB,EAAA,MAAM,UAAyB,oBAAqB,CAAA,IAAA,CAAK,cAAc,OAAO,CAAA,CAAE,IAAI,CAAU,MAAA,KAAA;AAC1F,IAAA,MAAM,gBAAgB,WAAY,CAAA,GAAA,CAAI,CAAU,OAAA,EAAA,MAAA,CAAO,EAAE,CAAE,CAAA,CAAA;AAC3D,IAAA,OAAO,IAAI,MAAA;AAAA,MACP,MAAO,CAAA,EAAA;AAAA,MACP,aAAA,CAAc,YAAY,KAAS,IAAA,EAAA;AAAA,MACnC,IAAI,IAAA,CAAK,aAAc,CAAA,UAAA,EAAY,aAAa,EAAE,CAAA;AAAA,MAClD,IAAI,IAAA,CAAK,aAAc,CAAA,UAAA,EAAY,WAAW,EAAE;AAAA,KACpD;AAAA,GACH,CAAA;AAED,EAAA,MAAM,mBAAsB,GAAA,iBAAA,CAAkB,IAAK,CAAA,aAAA,CAAc,OAAO,CAAA;AACxE,EAAA,MAAM,gBAAgB,OAAO,mBAAA,EAAqB,EAAO,KAAA,QAAA,GAAW,oBAAoB,EAAK,GAAA,EAAA;AAC7F,EAAA,MAAM,sBAAsB,aAAgB,GAAA,WAAA,CAAY,IAAI,CAAiB,cAAA,EAAA,aAAa,EAAE,CAAsB,GAAA,MAAA;AAClH,EAAM,MAAA,WAAA,GAAiC,qBAAqB,UAAY,EAAA,sBAAA,GAClE,oBAAoB,UAAW,CAAA,sBAAA,CAAuB,IAAI,CAAc,UAAA,KAAA;AACtE,IAAA,MAAM,aAAgB,GAAA,iBAAA,CAAkB,mBAAoB,CAAA,aAAA,EAAe,sBAAsB,CAAA;AACjG,IAAA,MAAM,UAAU,OAAO,aAAA,EAAe,EAAO,KAAA,QAAA,GAAW,cAAc,EAAK,GAAA,EAAA;AAC3E,IAAA,MAAM,SAAS,OAAU,GAAA,WAAA,CAAY,IAAI,CAA0B,uBAAA,EAAA,OAAO,EAAE,CAA2B,GAAA,MAAA;AACvG,IAAM,MAAA,KAAA,GAAQ,QAAQ,UAAY,EAAA,kBAAA,CAAmB,KAAK,CAAO,GAAA,KAAA,GAAA,CAAI,KAAU,KAAA,UAAA,CAAW,KAAK,CAAA;AAC/F,IAAO,OAAA,IAAI,WAAW,UAAW,CAAA,KAAA,EAAO,WAAW,UAAY,EAAA,UAAA,CAAW,KAAO,EAAA,KAAA,EAAO,KAAK,CAAA;AAAA,GAChG,IACC,EAAC;AAEP,EAAO,OAAA;AAAA,IACH,sBAAA,EAA6B,IAAM,EAAA,UAAA,EAAY,sBAA0B,IAAA,KAAA;AAAA,IACzE,aAAA,EAA6B,IAAM,EAAA,UAAA,EAAY,aAAiB,IAAA,KAAA;AAAA,IAChE,2BAAA,EAA6B,IAAM,EAAA,UAAA,EAAY,2BAA+B,IAAA,KAAA;AAAA,IAC9E,OAAA;AAAA,IACA;AAAA,GACJ;AACJ;AAEa,IAAA,aAAA,GAAgB,OACzB,MACA,EAAA,WAAA,EACA,SACA,QACA,EAAA,KAAA,GAAQ,EACR,EAAA,MAAA,GAAS,CACe,KAAA;AACxB,EAAA,MAAM,QAAW,GAAA,MAAMA,QAAQ,CAAA,GAAA,CAAkB,kBAAoB,EAAA;AAAA,IACjE,aAAoC,EAAA,KAAA;AAAA,IACpC,cAAoC,EAAA,MAAA;AAAA,IACpC,oBAAoC,EAAA,MAAA;AAAA,IACpC,SAAoC,EAAA,4JAAA;AAAA,IACpC,0BAAoC,EAAA,8DAAA;AAAA,IACpC,kCAAoC,EAAA,OAAA;AAAA,IACpC,oBAAoC,EAAA,yDAAA;AAAA,IACpC,oBAAoC,EAAA,OAAA;AAAA,IACpC,2BAAoC,EAAA,SAAA;AAAA,IACpC,iBAAoC,EAAA;AAAA,GACrC,EAAA;AAAA,IACC,eAAA,EAAwB,UAAU,WAAW,CAAA,CAAA;AAAA,IAC7C,qBAAwB,EAAA,OAAA;AAAA,IACxB,sBAAwB,EAAA;AAAA,GAC3B,CAAA;AAED,EAAM,MAAA,WAAA,uBAAkB,GAAqB,EAAA;AAC7C,EAAA,KAAA,MAAW,IAAQ,IAAA,QAAA,CAAS,QAAY,IAAA,EAAI,EAAA;AACxC,IAAY,WAAA,CAAA,GAAA,CAAI,GAAG,IAAK,CAAA,IAAI,IAAI,IAAK,CAAA,EAAE,IAAI,IAAI,CAAA;AAAA;AAGnD,EAAA,OAAA,CAAQ,MAAM,OAAQ,CAAA,QAAA,CAAS,IAAI,CAAA,GAAI,SAAS,IAAO,GAAA,EAClD,EAAA,MAAA,CAAO,CAAC,IAAyE,KAAA,IAAA,CAAK,SAAS,kBAAkB,CAAA,CACjH,IAAI,CAAS,KAAA,KAAA;AACV,IAAA,MAAM,YAAe,GAAA,iBAAA,CAAkB,KAAM,CAAA,aAAA,CAAc,UAAU,CAAA;AACrE,IAAA,MAAM,gBAAgB,OAAO,YAAA,EAAc,EAAO,KAAA,QAAA,GAAW,aAAa,EAAK,GAAA,EAAA;AAC/E,IAAA,MAAM,iBAAoB,GAAA,WAAA,CAAY,GAAI,CAAA,CAAA,WAAA,EAAc,aAAa,CAAE,CAAA,CAAA;AACvE,IAAA,MAAM,mBAAsB,GAAA,iBAAA,CAAkB,iBAAkB,CAAA,aAAA,CAAe,iBAAiB,CAAA;AAChG,IAAA,MAAM,uBAAuB,mBAAuB,IAAA,OAAO,oBAAoB,EAAO,KAAA,QAAA,GAAW,oBAAoB,EAAK,GAAA,EAAA;AAC1H,IAAA,MAAM,yBAA4B,GAAA,WAAA,CAAY,GAAI,CAAA,CAAA,kBAAA,EAAqB,oBAAoB,CAAE,CAAA,CAAA;AAC7F,IAAA,MAAM,SAAY,GAAA,iBAAA,CAAkB,yBAA2B,EAAA,aAAA,EAAe,OAAO,CAAA;AACrF,IAAA,MAAM,aAAa,OAAO,SAAA,EAAW,EAAO,KAAA,QAAA,GAAW,UAAU,EAAK,GAAA,EAAA;AACtE,IAAA,MAAM,WAAc,GAAA,WAAA,CAAY,GAAI,CAAA,CAAA,QAAA,EAAW,UAAU,CAAE,CAAA,CAAA;AAC3D,IAAQ,OAAA,CAAA,GAAA,CAAI,SAAW,EAAA,UAAA,EAAY,WAAW,CAAA;AAE9C,IAAA,OAAO,IAAI,KAAA;AAAA,MACP,KAAM,CAAA,EAAA;AAAA,MACN,KAAA,CAAM,UAAY,EAAA,mBAAA,GAAsB,KAAQ,GAAA,IAAA;AAAA,MAChD,KAAA,CAAM,YAAY,IAAQ,IAAA,EAAA;AAAA,MAC1B,iBAAA,CAAkB,YAAY,KAAS,IAAA,CAAA;AAAA,MACvC,IAAI,IAAA,CAAK,iBAAkB,CAAA,UAAA,EAAY,YAAY,EAAE,CAAA;AAAA,MACrD,iBAAA,CAAkB,YAAY,WAAe,IAAA,CAAA;AAAA,MAC7C,iBAAA,CAAkB,YAAY,KAAS,IAAA,EAAA;AAAA,MACvC,iBAAA,CAAkB,YAAY,KAAS,IAAA,EAAA;AAAA,MACvC;AAAA,QACI,EAAO,EAAA,UAAA;AAAA,QACP,KAAA,EAAO,WAAa,EAAA,UAAA,EAAY,KAAS,IAAA,EAAA;AAAA,QACzC,KAAA,EAAO,WAAa,EAAA,UAAA,EAAY,KAAS,IAAA;AAAA,OAC7C;AAAA,MACA,KAAA,CAAM,YAAY,mBAAuB,IAAA;AAAA,KAC7C;AAAA,GACH,CAAA;AACT;AAEO,IAAM,qBAAqB,OAC9B,MAAA,EACA,WACA,EAAA,OAAA,EACA,UACA,MAC0B,KAAA;AAC1B,EAAA,MAAM,QAAW,GAAA,MAAMA,QAAQ,CAAA,GAAA,CAAkB,eAAiB,EAAA;AAAA,IAC9D,oBAAoC,EAAA,MAAA;AAAA,IACpC,mBAAoC,EAAA,MAAA;AAAA,IACpC,SAAoC,EAAA,0MAAA;AAAA,IACpC,2BAAoC,EAAA,0CAAA;AAAA,IACpC,iBAAoC,EAAA,aAAA;AAAA,IACpC,oBAAoC,EAAA,+DAAA;AAAA,IACpC,0BAAoC,EAAA,qDAAA;AAAA,IACpC,kCAAoC,EAAA,gBAAA;AAAA,IACpC,iBAAoC,EAAA,0BAAA;AAAA,IACpC,kBAAoC,EAAA;AAAA,GACrC,EAAA;AAAA,IACC,eAAA,EAAwB,UAAU,WAAW,CAAA,CAAA;AAAA,IAC7C,qBAAwB,EAAA,OAAA;AAAA,IACxB,sBAAwB,EAAA;AAAA,GAC3B,CAAA;AAED,EAAM,MAAA,WAAA,uBAAkB,GAAqB,EAAA;AAC7C,EAAA,KAAA,MAAW,IAAQ,IAAA,QAAA,CAAS,QAAY,IAAA,EAAI,EAAA;AACxC,IAAY,WAAA,CAAA,GAAA,CAAI,GAAG,IAAK,CAAA,IAAI,IAAI,IAAK,CAAA,EAAE,IAAI,IAAI,CAAA;AAAA;AAGnD,EAAA,OAAA,CAAQ,MAAM,OAAQ,CAAA,QAAA,CAAS,IAAI,CAAA,GAAI,SAAS,IAAO,GAAA,EAClD,EAAA,MAAA,CAAO,CAAC,IAAgF,KAAA,IAAA,CAAK,SAAS,mBAAmB,CAAA,CACzH,IAAI,CAAW,OAAA,KAAA;AACZ,IAAA,MAAM,WAA2B,EAAC;AAClC,IAAA,MAAM,UAAa,GAAA,oBAAA,CAAqB,OAAQ,CAAA,aAAA,CAAc,QAAQ,CAAA;AACtE,IAAA,KAAA,MAAW,WAAW,UAAY,EAAA;AAC9B,MAAA,MAAM,cAAc,WAAY,CAAA,GAAA,CAAI,CAAW,QAAA,EAAA,OAAA,CAAQ,EAAE,CAAE,CAAA,CAAA;AAC3D,MAAA,QAAA,CAAS,IAAK,CAAA;AAAA,QACV,IAAW,OAAQ,CAAA,EAAA;AAAA,QACnB,SAAA,EAAW,WAAY,CAAA,UAAA,EAAY,SAAa,IAAA,EAAA;AAAA,QAChD,QAAA,EAAW,WAAY,CAAA,UAAA,EAAY,QAAY,IAAA,EAAA;AAAA,QAC/C,QAAA,EAAW,WAAY,CAAA,UAAA,EAAY,QAAY,IAAA,EAAA;AAAA,QAC/C,KAAA,EAAW,WAAY,CAAA,UAAA,EAAY,KAAS,IAAA;AAAA,OAC/C,CAAA;AAAA;AAGL,IAAA,MAAM,SAAuB,EAAC;AAC9B,IAAA,MAAM,QAAW,GAAA,oBAAA,CAAqB,OAAQ,CAAA,aAAA,CAAc,WAAW,CAAA;AACvE,IAAA,KAAA,MAAW,SAAS,QAAU,EAAA;AAC1B,MAAA,MAAM,YAAY,WAAY,CAAA,GAAA,CAAI,CAAc,WAAA,EAAA,KAAA,CAAM,EAAE,CAAE,CAAA,CAAA;AAC1D,MAAA,MAAM,aAAgB,GAAA,iBAAA,CAAkB,SAAU,CAAA,aAAA,EAAe,gBAAgB,CAAG,EAAA,EAAA;AACpF,MAAA,MAAM,cAAc,aAAgB,GAAA,WAAA,CAAY,IAAI,CAAoB,iBAAA,EAAA,aAAa,EAAE,CAA2B,GAAA,MAAA;AAClH,MAAA,MAAA,CAAO,KAAK,IAAI,KAAA;AAAA,QACZ,KAAM,CAAA,EAAA;AAAA,QACN,WAAA,EAAa,UAAY,EAAA,mBAAA,GAAsB,KAAQ,GAAA,IAAA;AAAA,QACvD,WAAA,EAAa,YAAY,IAAQ,IAAA,CAAA;AAAA,QACjC,SAAA,CAAU,YAAY,KAAS,IAAA,EAAA;AAAA,QAC/B,IAAI,IAAA,CAAK,SAAU,CAAA,UAAA,EAAY,YAAY,EAAE,CAAA;AAAA,QAC7C,SAAA,CAAU,YAAY,WAAe,IAAA,CAAA;AAAA,QACrC,MAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACH,CAAA;AAAA;AAEL,IAAA,MAAM,SAAY,GAAA,iBAAA,CAAkB,OAAQ,CAAA,aAAA,CAAc,OAAO,CAAA;AACjE,IAAA,MAAM,aAAa,OAAO,SAAA,EAAW,EAAO,KAAA,QAAA,GAAW,UAAU,EAAK,GAAA,EAAA;AACtE,IAAA,MAAM,WAAc,GAAA,WAAA,CAAY,GAAI,CAAA,CAAA,QAAA,EAAW,UAAU,CAAE,CAAA,CAAA;AAC3D,IAAA,OAAO,IAAI,OAAA;AAAA,MACP,OAAQ,CAAA,EAAA;AAAA,MACR,WAAA,CAAY,YAAY,KAAS,IAAA,EAAA;AAAA,MACjC,OAAA,CAAQ,YAAY,WAAe,IAAA,CAAA;AAAA,MACnC,OAAA,CAAQ,YAAY,cAAkB,IAAA,EAAA;AAAA,MACtC,OAAA,CAAQ,YAAY,KAAS,IAAA,EAAA;AAAA,MAC7B,OAAA,CAAQ,YAAY,OAAW,IAAA,EAAA;AAAA,MAC/B,MAAA;AAAA,MACA;AAAA,KACJ;AAAA,GACH,CAAA;AACT;;;AC7NO,IAAM,OAAN,MAAW;AAAA,EACd,WACY,CAAA,OAAA,EACA,WACD,EAAA,EAAA,EACA,OACA,EAAA,QAAA,EACA,YACA,EAAA,IAAA,EACA,IACA,EAAA,OAAA,EACA,MACA,EAAA,iBAAA,EACA,sBACA,mBACV,EAAA;AAbW,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACD,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,iBAAA,GAAA,iBAAA;AACA,IAAA,IAAA,CAAA,oBAAA,GAAA,oBAAA;AACA,IAAA,IAAA,CAAA,mBAAA,GAAA,mBAAA;AAAA;AACT,EAEF,MAAM,WAAuC,GAAA;AACzC,IAAA,OAAO,oBAAoB,IAAK,CAAA,EAAA,EAAI,IAAK,CAAA,OAAA,EAAS,KAAK,WAAW,CAAA;AAAA;AAE1E;;;ACrBO,IAAM,UAAN,MAAc;AAAA,EACjB,YACW,EACA,EAAA,IAAA,EACA,OACA,EAAA,IAAA,EACA,aACA,MACV,EAAA;AANU,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA;AAEf;;;ACUA,IAAMA,QAAU,GAAA,IAAI,WAAY,CAAA,QAAA,EAAU,CAAA;AAEnC,IAAM,eAAkB,GAAA,OAAO,MAAgB,EAAA,OAAA,EAAiB,WAA+C,KAAA;AAClH,EAAA,MAAM,WAAW,MAAMA,QAAAA,CAAQ,GAAkB,CAAA,aAAA,CAAc,MAAM,CAAG,EAAA;AAAA,IACpE,SAA2B,EAAA,mFAAA;AAAA,IAC3B,yBAA2B,EAAA,+DAAA;AAAA,IAC3B,mBAA2B,EAAA,SAAA;AAAA,IAC3B,gBAA2B,EAAA;AAAA,GAC5B,EAAA;AAAA,IACC,eAAA,EAAuB,UAAU,WAAW,CAAA,CAAA;AAAA,IAC5C,qBAAuB,EAAA;AAAA,GAC1B,CAAA;AAED,EAAM,MAAA,WAAA,uBAAkB,GAAqB,EAAA;AAC7C,EAAA,KAAA,MAAW,IAAQ,IAAA,QAAA,CAAS,QAAY,IAAA,EAAI,EAAA;AACxC,IAAY,WAAA,CAAA,GAAA,CAAI,GAAG,IAAK,CAAA,IAAI,IAAI,IAAK,CAAA,EAAE,IAAI,IAAI,CAAA;AAAA;AAGnD,EAAA,MAAM,OAAO,QAAS,CAAA,IAAA;AACtB,EAAA,MAAM,YAAe,GAAA,iBAAA,CAAkB,IAAK,CAAA,aAAA,CAAc,SAAS,CAAA;AACnE,EAAA,MAAM,UAAa,GAAA,oBAAA,CAAqB,IAAK,CAAA,aAAA,CAAc,OAAO,CAAA;AAElE,EAAA,MAAM,YAAY,WAAY,CAAA,GAAA,CAAI,aAAa,YAAc,EAAA,EAAA,IAAM,EAAE,CAAE,CAAA,CAAA;AACvE,EAAM,MAAA,OAAA,GAA6B,UAAW,CAAA,GAAA,CAAI,CAAkB,cAAA,KAAA;AAChE,IAAA,MAAM,aAAa,WAAY,CAAA,GAAA,CAAI,CAAU,OAAA,EAAA,cAAA,CAAe,EAAE,CAAE,CAAA,CAAA;AAChE,IAAO,OAAA;AAAA,MACH,IAAU,cAAe,CAAA,EAAA;AAAA,MACzB,IAAA,EAAU,UAAW,CAAA,UAAA,EAAY,IAAQ,IAAA,EAAA;AAAA,MACzC,QAAA,EAAU,UAAW,CAAA,UAAA,EAAY,QAAY,IAAA,CAAA;AAAA,MAC7C,IAAA,EAAU,WAAW,UAAY,EAAA,IAAA,IAAA,UAAA;AAAA,KACrC;AAAA,GACH,CAAA;AAED,EAAA,MAAM,aAAgB,GAAA,oBAAA,CAAqB,IAAK,CAAA,aAAA,CAAc,QAAQ,CAAA;AACtE,EAAM,MAAA,UAAA,GAAgC,aAAc,CAAA,GAAA,CAAI,CAAc,SAAA,MAAA;AAAA,IAClE,IAAM,SAAU,CAAA,EAAA;AAAA,IAChB,MAAM,SAAU,CAAA;AAAA,GAClB,CAAA,CAAA;AAEF,EAAO,OAAA;AAAA,IACH,8BAAA,EAAgC,IAAK,CAAA,UAAA,EAAY,8BAAkC,IAAA,CAAA;AAAA,IACnF,8BAAA,EAAgC,IAAK,CAAA,UAAA,EAAY,8BAAkC,IAAA,CAAA;AAAA,IACnF,SAAA,EAAgC,SAAU,CAAA,UAAA,EAAY,OAAW,IAAA,EAAA;AAAA,IACjE,OAAA;AAAA,IACA;AAAA,GACJ;AACJ;AAEO,IAAM,qBAAqB,OAAO,QAAA,EAAkB,KAAe,EAAA,MAAA,EAAgB,SAAiB,WAA8C,KAAA;AACrJ,EAAA,MAAM,QAAW,GAAA,MAAMA,QAAQ,CAAA,GAAA,CAAkB,MAAQ,EAAA;AAAA,IACrD,oBAA6B,EAAA,QAAA;AAAA,IAC7B,SAA6B,EAAA,mHAAA;AAAA,IAC7B,uBAA6B,EAAA,kIAAA;AAAA,IAC7B,uBAA6B,EAAA,yBAAA;AAAA,IAC7B,2BAA6B,EAAA,sBAAA;AAAA,IAC7B,gBAA6B,EAAA,6BAAA;AAAA,IAC7B,uBAA6B,EAAA,OAAA;AAAA,IAC7B,aAA6B,EAAA,KAAA;AAAA,IAC7B,cAA6B,EAAA;AAAA,GAC9B,EAAA;AAAA,IACC,eAAA,EAAuB,UAAU,WAAW,CAAA,CAAA;AAAA,IAC5C,qBAAuB,EAAA;AAAA,GAC1B,CAAA;AAED,EAAM,MAAA,WAAA,uBAAkB,GAAqB,EAAA;AAC7C,EAAA,KAAA,MAAW,IAAQ,IAAA,QAAA,CAAS,QAAY,IAAA,EAAI,EAAA;AACxC,IAAY,WAAA,CAAA,GAAA,CAAI,GAAG,IAAK,CAAA,IAAI,IAAI,IAAK,CAAA,EAAE,IAAI,IAAI,CAAA;AAAA;AAGnD,EAAA,OAAA,CAAQ,MAAM,OAAQ,CAAA,QAAA,CAAS,IAAI,CAAA,GAAI,SAAS,IAAO,GAAA,EAClD,EAAA,MAAA,CAAO,CAAC,IAA6E,KAAA,IAAA,CAAK,SAAS,eAAe,CAAA,CAClH,IAAI,CAAQ,IAAA,KAAA;AACT,IAAA,MAAM,aAAa,IAAK,CAAA,UAAA,EAAY,iBAAkB,CAAA,KAAA,CAAM,mCAAmC,CAAG,EAAA,GAAA;AAAA,MAAI,CAClG,CAAA,KAAA,CAAA,CAAE,UAAW,CAAA,UAAA,EAAY,EAAE;AAAA,KAC/B;AAEA,IAAA,MAAM,MAAS,GAAA,iBAAA,CAAkB,IAAK,CAAA,aAAA,CAAc,iBAAiB,CAAA;AACrE,IAAA,MAAM,WAAW,WAAY,CAAA,GAAA,CAAI,iBAAiB,MAAQ,EAAA,EAAA,IAAM,EAAE,CAAE,CAAA,CAAA;AACpE,IAAA,MAAM,MAAS,GAAA,iBAAA,CAAkB,QAAS,CAAA,aAAA,EAAe,MAAM,CAAA;AAC/D,IAAA,MAAM,aAAa,WAAY,CAAA,GAAA,CAAI,qBAAqB,MAAQ,EAAA,EAAA,IAAM,EAAE,CAAE,CAAA,CAAA;AAC1E,IAAA,MAAM,UAAa,GAAA,UAAA,CAAW,aAAe,EAAA,aAAA,CAAc,IAAO,GAAA,iBAAA,CAAkB,UAAW,CAAA,aAAA,EAAe,aAAa,CAAA,GAAI,iBAAkB,CAAA,UAAA,CAAW,eAAe,MAAM,CAAA;AACjL,IAAM,MAAA,cAAA,GAAiB,UAAc,IAAA,UAAA,CAAW,IAAS,KAAA,eAAA,GAAkB,WAAY,CAAA,GAAA,CAAI,CAAG,EAAA,UAAA,EAAY,IAAI,CAAA,CAAA,EAAI,UAAY,EAAA,EAAA,IAAM,EAAE,CAAE,CAAA,CAAA,GAA+B,WAAY,CAAA,GAAA,CAAI,CAAG,EAAA,UAAA,EAAY,IAAQ,IAAA,EAAE,CAAI,CAAA,EAAA,UAAA,EAAY,EAAM,IAAA,EAAE,CAAE,CAAA,CAAA;AAE1O,IAAA,OAAO,IAAI,IAAA;AAAA,MACP,OAAA;AAAA,MACA,WAAA;AAAA,MACA,IAAK,CAAA,EAAA;AAAA,MACL,IAAA,CAAK,YAAY,OAAW,IAAA,EAAA;AAAA,MAC5B,IAAA,CAAK,YAAY,oBAAwB,IAAA,CAAA;AAAA,MACzC,cAAc,EAAC;AAAA,MACf,IAAA,CAAK,YAAY,IAAQ,IAAA,KAAA;AAAA,MACzB,IAAI,IAAA,CAAK,QAAS,CAAA,UAAA,EAAY,YAAY,EAAE,CAAA;AAAA,MAC5C,QAAA,CAAS,YAAY,OAAW,IAAA,EAAA;AAAA,MAChC;AAAA,QACI,EAAA,EAAM,YAAY,EAAM,IAAA,EAAA;AAAA,QACxB,IAAM,EAAA,UAAA,EAAY,IAAS,KAAA,eAAA,GACpB,kBAAkB,YAAgB,IAAA,cAAA,IAAkB,cAAe,CAAA,UAAA,IAAc,WAAW,cAAe,CAAA,UAAA,GACxG,cAAe,CAAA,UAAA,CAAW,QAC1B,EACH,GAAA,cAAA,IAAkB,YAAgB,IAAA,cAAA,IAAkB,eAAe,UAAc,IAAA,WAAA,IAAe,cAAe,CAAA,UAAA,IAAc,cAAc,cAAe,CAAA,UAAA,GACvJ,CAAG,EAAA,cAAA,CAAe,WAAW,SAAS,CAAA,CAAA,EAAI,cAAe,CAAA,UAAA,CAAW,QAAQ,CAC5E,CAAA,GAAA;AAAA,OACd;AAAA,MACA,IAAA,CAAK,YAAY,iBAAqB,IAAA,KAAA;AAAA,MACtC,IAAA,CAAK,YAAY,oBAAwB,IAAA,KAAA;AAAA,MACzC,IAAA,CAAK,YAAY,mBAAuB,IAAA;AAAA,KAC5C;AAAA,GACH,CAAA;AACT;AAEO,IAAM,mBAAsB,GAAA,OAAO,MAAgB,EAAA,OAAA,EAAiB,WAAiD,KAAA;AACxH,EAAA,MAAM,WAAW,MAAMA,QAAAA,CAAQ,GAAkB,CAAA,mBAAA,CAAoB,MAAM,CAAG,EAAA;AAAA,IAC1E,SAA6B,EAAA,uDAAA;AAAA,IAC7B,uBAA6B,EAAA,8BAAA;AAAA,IAC7B,2BAA6B,EAAA,qCAAA;AAAA,IAC7B,gBAA6B,EAAA,mCAAA;AAAA,IAC7B,uBAA6B,EAAA,OAAA;AAAA,IAC7B,oBAA6B,EAAA;AAAA,GAC9B,EAAA;AAAA,IACC,eAAA,EAAuB,UAAU,WAAW,CAAA,CAAA;AAAA,IAC5C,qBAAuB,EAAA;AAAA,GAC1B,CAAA;AAED,EAAM,MAAA,WAAA,uBAAkB,GAAqB,EAAA;AAC7C,EAAA,KAAA,MAAW,IAAQ,IAAA,QAAA,CAAS,QAAY,IAAA,EAAI,EAAA;AACxC,IAAY,WAAA,CAAA,GAAA,CAAI,GAAG,IAAK,CAAA,IAAI,IAAI,IAAK,CAAA,EAAE,IAAI,IAAI,CAAA;AAAA;AAGnD,EAAA,OAAA,CAAQ,MAAM,OAAQ,CAAA,QAAA,CAAS,IAAI,CAAA,GAAI,SAAS,IAAO,GAAA,EAClD,EAAA,MAAA,CAAO,CAAC,IAA6E,KAAA,IAAA,CAAK,SAAS,eAAe,CAAA,CAClH,IAAI,CAAW,OAAA,KAAA;AACZ,IAAA,MAAM,cAAiB,GAAA,oBAAA,CAAqB,OAAQ,CAAA,aAAA,CAAc,WAAW,CAAA;AAC7E,IAAM,MAAA,WAAA,GAAiC,cAAe,CAAA,GAAA,CAAI,CAAc,UAAA,KAAA;AACpE,MAAA,MAAM,OAAO,WAAY,CAAA,GAAA,CAAI,CAAc,WAAA,EAAA,UAAA,CAAW,EAAE,CAAE,CAAA,CAAA;AAC1D,MAAA,OAAO,IAAI,UAAA;AAAA,QACP,WAAA;AAAA,QACA,UAAW,CAAA,EAAA;AAAA,QACX,KAAK,UAAY,CAAA,GAAA;AAAA,QACjB,KAAK,UAAY,CAAA,IAAA;AAAA,QACjB,KAAK,UAAY,CAAA,QAAA;AAAA,QACjB,KAAK,UAAY,CAAA,aAAA;AAAA,QACjB,KAAK,UAAY,CAAA;AAAA,OACrB;AAAA,KACH,CAAA;AAED,IAAA,MAAM,MAAS,GAAA,iBAAA,CAAkB,OAAQ,CAAA,aAAA,EAAe,MAAM,CAAA;AAC9D,IAAA,MAAM,aAAa,WAAY,CAAA,GAAA,CAAI,qBAAqB,MAAQ,EAAA,EAAA,IAAM,EAAE,CAAE,CAAA,CAAA;AAC1E,IAAA,MAAM,UAAa,GAAA,UAAA,CAAW,aAAe,EAAA,aAAA,CAAc,IAAO,GAAA,iBAAA,CAAkB,UAAW,CAAA,aAAA,EAAe,aAAa,CAAA,GAAI,iBAAkB,CAAA,UAAA,CAAW,eAAe,MAAM,CAAA;AACjL,IAAM,MAAA,cAAA,GAAiB,UAAc,IAAA,UAAA,CAAW,IAAS,KAAA,eAAA,GAAkB,WAAY,CAAA,GAAA,CAAI,CAAG,EAAA,UAAA,EAAY,IAAI,CAAA,CAAA,EAAI,UAAY,EAAA,EAAA,IAAM,EAAE,CAAE,CAAA,CAAA,GAA+B,WAAY,CAAA,GAAA,CAAI,CAAG,EAAA,UAAA,EAAY,IAAQ,IAAA,EAAE,CAAI,CAAA,EAAA,UAAA,EAAY,EAAM,IAAA,EAAE,CAAE,CAAA,CAAA;AAC1O,IAAA,OAAO,IAAI,OAAA;AAAA,MACP,OAAQ,CAAA,EAAA;AAAA,MACR,IAAI,IAAA,CAAK,OAAQ,CAAA,UAAA,EAAY,YAAY,EAAE,CAAA;AAAA,MAC3C,OAAA,CAAQ,YAAY,OAAW,IAAA,EAAA;AAAA,MAC/B,OAAA,CAAQ,YAAY,IAAQ,IAAA,KAAA;AAAA,MAC5B,WAAA;AAAA,MACA;AAAA,QACI,EAAA,EAAM,YAAY,EAAM,IAAA,EAAA;AAAA,QACxB,IAAM,EAAA,UAAA,EAAY,IAAS,KAAA,eAAA,GACpB,kBAAkB,YAAgB,IAAA,cAAA,IAAkB,cAAe,CAAA,UAAA,IAAc,WAAW,cAAe,CAAA,UAAA,GACxG,cAAe,CAAA,UAAA,CAAW,QAC1B,EACH,GAAA,cAAA,IAAkB,YAAgB,IAAA,cAAA,IAAkB,eAAe,UAAc,IAAA,WAAA,IAAe,cAAe,CAAA,UAAA,IAAc,cAAc,cAAe,CAAA,UAAA,GACvJ,CAAG,EAAA,cAAA,CAAe,WAAW,SAAS,CAAA,CAAA,EAAI,cAAe,CAAA,UAAA,CAAW,QAAQ,CAC5E,CAAA,GAAA;AAAA;AACd,KACJ;AAAA,GACH,CAAA;AACT;AAEO,IAAM,QAAW,GAAA,OACpB,OACA,EAAA,OAAA,EACA,aAAgC,EAAC,EACjC,EAAwB,GAAA,EACxB,EAAA,GAAA,GAAyB,EAAC,EAC1B,aACA,OACgB,KAAA;AAChB,EAAM,MAAA,QAAA,GAAW,MAAMA,QAAQ,CAAA,IAAA;AAAA,IAC3B,IAAK,EAAA;AAAA,IACL;AAAA,MACI,IAAM,EAAA;AAAA,QACF,IAAY,EAAA,eAAA;AAAA,QACZ,UAAY,EAAA;AAAA,UACR,OAAA;AAAA,UACA,yBAA2B,EAAA;AAAA,SAC/B;AAAA,QACA,aAAe,EAAA;AAAA,UACX,YAAc,EAAA;AAAA,YACV,IAAM,EAAA;AAAA,WACV;AAAA,UACA,YAAc,EAAA;AAAA,YACV,IAAM,EAAA;AAAA,WACV;AAAA,UACA,aAAe,EAAA;AAAA,YACX,IAAM,EAAA;AAAA;AACV;AACJ;AACJ,KACJ;AAAA,IACA,EAAC;AAAA,IACD;AAAA,MACI,OAAS,EAAA;AAAA,QACL,eAAA,EAAuB,UAAU,WAAW,CAAA,CAAA;AAAA,QAC5C,qBAAuB,EAAA;AAAA;AAC3B;AACJ,GACJ;AAEA,EAAM,MAAA,MAAA,GAAU,SAAS,IAA+E,CAAA,EAAA;AAExG,EAAA,OAAO,IAAI,IAAA;AAAA,IACP,OAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,CAAA;AAAA,IACA,CAAC,GAAG,UAAW,CAAA,GAAA,CAAI,OAAK,CAAE,CAAA,EAAE,GAAG,GAAG,EAAA,CAAG,IAAI,CAAK,CAAA,KAAA,CAAA,CAAE,EAAE,CAAG,EAAA,GAAG,IAAI,GAAI,CAAA,CAAA,CAAA,KAAK,CAAE,CAAA,EAAE,CAAC,CAAA;AAAA,IAC1E,KAAA;AAAA,wBACI,IAAK,EAAA;AAAA,IACT;AAAA,GACJ;AACJ;;;ACpPa,IAAA,cAAA,GAAiB,CAAC,GAAkC,KAAA;AAC7D,EAAM,MAAA,KAAA,GAAQ,GAAI,CAAA,KAAA,CAAM,GAAG,CAAA;AAC3B,EAAA,MAAM,UAAU,KAAM,CAAA,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AAC1C,EAAA,MAAM,OAAO,KAAM,CAAA,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AACpC,EAAO,OAAA,CAAC,SAAS,IAAI,CAAA;AACzB;;;ACAa,IAAA,gBAAA,GAAmB,OAAO,GAA+C,KAAA;AAClF,EAAA,MAAM,CAAC,IAAA,EAAM,IAAI,CAAA,GAAI,eAAe,GAAG,CAAA;AACvC,EAAMA,MAAAA,QAAAA,GAAU,IAAI,WAAA,CAAY,IAAI,CAAA;AACpC,EAAA,MAAM,QAAW,GAAA,MAAMA,QAAQ,CAAA,GAAA,CAA0B,IAAI,CAAA;AAE7D,EAAA,IACI,QAAS,CAAA,QAAA,IACT,QAAS,CAAA,sBAAA,IACT,SAAS,cACX,EAAA;AACE,IAAO,OAAA,QAAA;AAAA;AAGX,EAAM,MAAA,IAAI,MAAM,gCAAgC,CAAA;AACpD;AAEa,IAAA,WAAA,GAAc,OAAO,GAA+B,KAAA;AAC7D,EAAA,MAAM,CAAC,IAAA,EAAM,IAAI,CAAA,GAAI,eAAe,GAAG,CAAA;AACvC,EAAMA,MAAAA,QAAAA,GAAU,IAAI,WAAA,CAAY,IAAI,CAAA;AACpC,EAAA,MAAM,QAAW,GAAA,MAAMA,QAAQ,CAAA,GAAA,CAAU,IAAI,CAAA;AAE7C,EAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,QAAS,CAAA,IAAI,CAAG,EAAA;AAC9B,IAAO,OAAA,QAAA;AAAA;AAGX,EAAM,MAAA,IAAI,MAAM,aAAa,CAAA;AACjC;AAEO,IAAM,mBAAsB,GAAA,OAAO,GAAa,EAAA,IAAA,EAAc,QAA+C,KAAA;AAChH,EAAA,MAAM,CAAC,IAAA,EAAM,IAAI,CAAA,GAAI,eAAe,GAAG,CAAA;AACvC,EAAMA,MAAAA,QAAAA,GAAU,IAAI,WAAA,CAAY,IAAI,CAAA;AACpC,EAAM,MAAA,MAAA,GAAS,IAAI,eAAgB,CAAA;AAAA,IAC/B,SAAe,EAAA,cAAA;AAAA,IACf,aAAe,EAAA,kBAAA;AAAA,IACf,IAAA;AAAA,IACA,aAAe,EAAA,QAAA;AAAA,IACf,UAAe,EAAA,oBAAA;AAAA,IACf,YAAe,EAAA;AAAA,GAClB,CAAA;AAED,EAAOA,OAAAA,QAAAA,CAAQ,GAAqB,CAAA,IAAA,EAAM,MAAM,CAAA;AACpD;AAEa,IAAA,WAAA,GAAc,OAAO,GAAA,EAAa,YAAmD,KAAA;AAC9F,EAAA,MAAM,CAAC,IAAA,EAAM,IAAI,CAAA,GAAI,eAAe,GAAG,CAAA;AACvC,EAAMA,MAAAA,QAAAA,GAAU,IAAI,WAAA,CAAY,IAAI,CAAA;AACpC,EAAM,MAAA,MAAA,GAAS,IAAI,eAAgB,CAAA;AAAA,IAC/B,UAAe,EAAA,eAAA;AAAA,IACf,aAAe,EAAA,YAAA;AAAA,IACf,SAAe,EAAA,cAAA;AAAA,IACf,aAAe,EAAA,kBAAA;AAAA,IACf,KAAe,EAAA;AAAA,GAClB,CAAA;AAED,EAAOA,OAAAA,QAAAA,CAAQ,IAAsB,CAAA,IAAA,EAAM,MAAM,CAAA;AACrD;;;ACtDO,IAAM,OAAN,MAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWd,WAAA,CACW,IACA,mBACA,EAAA,KAAA,EACA,cACA,OACA,EAAA,MAAA,EACA,kBACA,YACT,EAAA;AARS,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,mBAAA,GAAA,mBAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAAA;AAEf;;;AC3BO,SAAS,kBAAA,CAAmB,SAAS,EAAY,EAAA;AACpD,EAAA,MAAM,OAAU,GAAA,oEAAA;AAChB,EAAA,IAAI,MAAS,GAAA,EAAA;AACb,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,MAAA,EAAQ,CAAK,EAAA,EAAA;AAC7B,IAAA,MAAM,cAAc,IAAK,CAAA,KAAA,CAAM,KAAK,MAAO,EAAA,GAAI,QAAQ,MAAM,CAAA;AAC7D,IAAA,MAAA,IAAU,QAAQ,WAAW,CAAA;AAAA;AAEjC,EAAO,OAAA,MAAA;AACX;;;ACaa,IAAA,QAAA,GAAN,MAAM,SAAS,CAAA;AAAA,EAClB,WACc,CAAA,WAAA,EACH,YACE,EAAA,UAAA,EACC,gBACH,MACA,EAAA,SAAA,EACA,QACA,EAAA,SAAA,EACA,aACA,WACA,EAAA,MAAA,EACA,IACA,EAAA,WAAA,EACA,QACA,IACV,EAAA;AAfa,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACH,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACE,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACC,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AACH,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA;AACT,EAEF,MAAM,WAAA,CAAY,cAAiB,GAAA,EAAA,EAAI,SAAS,CAA+B,EAAA;AAC3E,IAAA,MAAM,KAAK,kBAAmB,EAAA;AAC9B,IAAA,MAAM,OAA8B,GAAA,CAAA,MAAM,IAAK,CAAA,eAAA,EAAmB,EAAA,OAAA;AAClE,IAAA,KAAA,MAAW,UAAU,OAAS,EAAA;AAC1B,MAAM,MAAA,KAAA,GAAqB,MAAM,kBAAA,CAAmB,MAAO,CAAA,EAAA,EAAI,cAAgB,EAAA,MAAA,EAAQ,IAAK,CAAA,MAAA,CAAO,OAAS,EAAA,IAAA,CAAK,WAAW,CAAA;AAC5H,MAAA,IAAI,CAAC,MAAA,CAAO,KAAO,EAAA,MAAA,CAAO,QAAQ,EAAC;AACnC,MAAO,MAAA,CAAA,KAAA,EAAO,IAAK,CAAA,GAAG,KAAK,CAAA;AAAA;AAE/B,IAAO,OAAA,OAAA;AAAA;AACX,EACA,MAAM,cAAe,CAAA,WAAA,EAAoB,SAA8C,EAAA;AACnF,IAAA,MAAM,KAAK,kBAAmB,EAAA;AAC9B,IAAA,OAAO,cAAe,CAAA,IAAA,CAAK,MAAQ,EAAA,IAAA,CAAK,WAAa,EAAA,IAAA,CAAK,MAAO,CAAA,OAAA,EAAS,IAAK,CAAA,MAAA,CAAO,EAAI,EAAA,WAAA,EAAa,SAAS,CAAA;AAAA;AACpH,EACA,MAAM,kBAAqD,GAAA;AACvD,IAAA,MAAM,KAAK,kBAAmB,EAAA;AAC9B,IAAO,OAAA,kBAAA,CAAmB,IAAK,CAAA,MAAA,EAAQ,IAAK,CAAA,MAAA,CAAO,IAAI,IAAK,CAAA,MAAA,CAAO,OAAS,EAAA,IAAA,CAAK,WAAW,CAAA;AAAA;AAChG,EACA,MAAM,mBAAmB,MAA0C,EAAA;AAC/D,IAAA,MAAM,KAAK,kBAAmB,EAAA;AAC9B,IAAA,MAAM,UAAU,EAAC;AACjB,IAAA,IAAI,CAAC,MAAQ,EAAA;AACT,MAAA,OAAA,CAAQ,KAAK,GAAI,CAAA,MAAM,IAAK,CAAA,iBAAA,IAAqB,OAAO,CAAA;AACxD,MAAA,IAAI,CAAC,OAAQ,CAAA,CAAC,GAAS,MAAA,IAAI,MAAM,oCAAoC,CAAA;AAAA;AAEzE,IAAA,OAAO,kBAAmB,CAAA,IAAA,CAAK,MAAQ,EAAA,IAAA,CAAK,aAAa,IAAK,CAAA,MAAA,CAAO,OAAS,EAAA,IAAA,CAAK,OAAO,EAAI,EAAA,MAAA,IAAU,OAAQ,CAAA,CAAC,EAAE,EAAE,CAAA;AAAA;AACzH,EACA,MAAM,iBAA6C,GAAA;AAC/C,IAAA,MAAM,KAAK,kBAAmB,EAAA;AAC9B,IAAO,OAAA,iBAAA,CAAkB,IAAK,CAAA,MAAA,EAAQ,IAAK,CAAA,WAAA,EAAa,KAAK,MAAO,CAAA,OAAA,EAAS,IAAK,CAAA,MAAA,CAAO,EAAE,CAAA;AAAA;AAC/F,EACA,MAAM,aAAc,CAAA,KAAA,EAAgB,MAAwC,EAAA;AACxE,IAAA,MAAM,KAAK,kBAAmB,EAAA;AAC9B,IAAA,OAAO,aAAc,CAAA,IAAA,CAAK,MAAQ,EAAA,IAAA,CAAK,WAAa,EAAA,IAAA,CAAK,MAAO,CAAA,OAAA,EAAS,IAAK,CAAA,MAAA,CAAO,EAAI,EAAA,KAAA,EAAO,MAAM,CAAA;AAAA;AAC1G,EACA,MAAM,iBAAA,CAAkB,QAAkB,EAAA,KAAA,EAAe,MAAsC,EAAA;AAC3F,IAAA,MAAM,KAAK,kBAAmB,EAAA;AAC9B,IAAO,OAAA,kBAAA,CAAmB,UAAU,KAAO,EAAA,MAAA,EAAQ,KAAK,MAAO,CAAA,OAAA,EAAS,KAAK,WAAW,CAAA;AAAA;AAC5F,EACA,MAAM,eAAyC,GAAA;AAC3C,IAAA,MAAM,KAAK,kBAAmB,EAAA;AAC9B,IAAA,OAAO,gBAAgB,IAAK,CAAA,MAAA,EAAQ,KAAK,MAAO,CAAA,OAAA,EAAS,KAAK,WAAW,CAAA;AAAA;AAC7E,EACA,MAAM,OAAgC,GAAA;AAClC,IAAA,MAAM,KAAK,kBAAmB,EAAA;AAC9B,IAAA,OAAO,aAAc,CAAA,IAAA,CAAK,WAAa,EAAA,IAAA,CAAK,OAAO,OAAO,CAAA;AAAA;AAC9D,EACA,MAAM,YAAa,CAAA,WAAA,EAAoB,SAAgD,EAAA;AACnF,IAAA,MAAM,KAAK,kBAAmB,EAAA;AAC9B,IAAA,OAAO,sBAAuB,CAAA,IAAA,CAAK,MAAQ,EAAA,IAAA,CAAK,MAAO,CAAA,EAAA,EAAI,IAAK,CAAA,MAAA,CAAO,OAAS,EAAA,IAAA,CAAK,WAAa,EAAA,WAAA,EAAa,SAAS,CAAA;AAAA;AAC5H,EACA,MAAM,SAAS,IAAqC,EAAA;AAChD,IAAA,IAAI,KAAK,IAAsB,KAAA,CAAA,eAAA;AAC3B,MAAA,IAAA,CAAK,IAAO,GAAA,IAAA,CAAK,GAAI,CAAA,CAAA,GAAA,KAAO,IAAI,SAAA;AAAA,QAC5B,IAAK,CAAA,WAAA;AAAA,QACL,IAAK,CAAA,YAAA;AAAA,QACL,IAAK,CAAA,UAAA;AAAA,QACL,IAAK,CAAA,cAAA;AAAA,QACL,GAAI,CAAA,EAAA;AAAA,QACJ,GAAI,CAAA,SAAA;AAAA,QACJ,GAAI,CAAA,QAAA;AAAA,QACJ,GAAI,CAAA,SAAA;AAAA,QACJ,EAAA;AAAA,QACA,IAAI,IAAK,CAAA,GAAA,CAAI,WAAW,CAAA;AAAA,QACxB,GAAI,CAAA,MAAA;AAAA,QAAA,CAAA;AAAA,QAEJ,EAAC;AAAA,QACD,IAAK,CAAA;AAAA,OACR,CAAA;AAAA;AACL;AACJ,EAGA,MAAM,kBAAuC,GAAA;AACzC,IAAI,IAAA,CAAC,KAAK,YAAc,EAAA;AACpB,MAAM,MAAA,IAAI,MAAM,wDAAwD,CAAA;AAAA;AAE5E,IAAA,IAAI,IAAK,CAAA,GAAA,EAAS,IAAA,IAAA,CAAK,cAAgB,EAAA;AACnC,MAAA,MAAM,WAAW,MAAM,WAAA,CAAY,IAAK,CAAA,UAAA,EAAY,KAAK,YAAY,CAAA;AACrE,MAAA,IAAA,CAAK,cAAc,QAAS,CAAA,YAAA;AAC5B,MAAA,IAAA,CAAK,eAAe,QAAS,CAAA,aAAA;AAC7B,MAAO,OAAA,IAAA;AAAA;AAEX,IAAO,OAAA,KAAA;AAAA;AACX,EAGA,MAAM,QAAS,CAAA,OAAA,EAAiB,OAAiB,EAAA,UAAA,EAAgC,IAAwB,GAAwC,EAAA;AAC7I,IAAA,MAAM,KAAK,kBAAmB,EAAA;AAC9B,IAAO,OAAA,QAAA,CAAS,OAAS,EAAA,OAAA,EAAS,UAAY,EAAA,EAAA,EAAI,KAAK,IAAK,CAAA,MAAA,CAAO,OAAS,EAAA,IAAA,CAAK,WAAW,CAAA;AAAA;AAIpG;;;ACpIa,IAAA,aAAA,GAAgB,CAAC,KAA2C,KAAA;AACrE,EAAA,MAAM,OAAU,GAAA,KAAA,CAAM,KAAM,CAAA,GAAG,EAAE,CAAC,CAAA;AAClC,EAAA,MAAM,iBAAiB,MAAO,CAAA,IAAA,CAAK,SAAS,QAAQ,CAAA,CAAE,SAAS,MAAM,CAAA;AACrE,EAAO,OAAA,IAAA,CAAK,MAAM,cAAc,CAAA;AACpC;;;ACOA,IAAMA,QAAU,GAAA,IAAI,WAAY,CAAA,QAAA,EAAU,CAAA;AAEnC,IAAM,cAAc,OACvB,WAAA,EACA,YACA,EAAA,YAAA,EACA,YACA,OACoB,KAAA;AACpB,EAAM,MAAA,OAAA,GAAU,cAAc,WAAW,CAAA;AAEzC,EAAA,MAAM,OAAU,GAAA;AAAA,IACZ,eAAA,EAAuB,UAAU,WAAW,CAAA,CAAA;AAAA,IAC5C,qBAAuB,EAAA;AAAA,GAC3B;AAEA,EAAA,MAAM,KAAQ,GAAA;AAAA,IACV,SAAW,EAAA,wDAAA;AAAA,IACX,kBACF,EAAA,6EAAA;AAAA,IACE,gBACF,EAAA,uEAAA;AAAA,IACE,qCACF,EAAA,+CAAA;AAAA,IACE,yBAAuC,EAAA,qCAAA;AAAA,IACvC,yBAAuC,EAAA,wBAAA;AAAA,IACvC,qCAAuC,EAAA,wBAAA;AAAA,IACvC,kCAAuC,EAAA,wBAAA;AAAA,IACvC,6BAAuC,EAAA,wBAAA;AAAA,IACvC,iBACF,EAAA;AAAA,GACF;AAEA,EAAM,MAAA,QAAA,GAAW,MAAMA,QAAQ,CAAA,GAAA,CAAkB,UAAU,OAAQ,CAAA,GAAG,CAAG,EAAA,KAAA,EAAO,OAAO,CAAA;AAEvF,EAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,QAAS,CAAA,IAAI,CAAG,EAAA;AAC9B,IAAM,MAAA,IAAI,UAAU,iDAAiD,CAAA;AAAA;AAGzE,EAAA,MAAM,WAAW,QAAS,CAAA,IAAA;AAC1B,EAAA,MAAM,aAAa,QAAS,CAAA,UAAA;AAC5B,EAAM,MAAA,IAAA,GAAO,oBAAqB,CAAA,QAAA,CAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,OAAuB,EAAC;AAC9B,EAAA,IAAI,QAAW,GAAA,EAAA;AAEf,EAAA,IAAI,IAAuB,KAAA,CAAA,gBAAA;AACvB,IAAA,QAAA,GAAW,iBAAkB,CAAA,QAAA,CAAS,aAAc,CAAA,MAAM,GAAG,EAAM,IAAA,EAAA;AAAA;AAGvE,EAAA,IAAI,IAAsB,KAAA,CAAA,eAAA;AACtB,IAAA,MAAM,KAAQ,GAAA,oBAAA,CAAqB,QAAS,CAAA,aAAA,CAAc,QAAQ,CAAA;AAClE,IAAI,IAAA,KAAA,CAAM,WAAW,CAAG,EAAA;AACpB,MAAM,MAAA,IAAI,MAAM,gCAAgC,CAAA;AAAA;AAGpD,IAAM,MAAA,OAAA,GAAU,SAAS,QAAS,CAAA,IAAA;AAAA,MAC9B,CAAA,IAAA,KAAQ,KAAK,EAAO,KAAA,KAAA,CAAM,CAAC,CAAE,CAAA,EAAA,IAAM,KAAK,IAAS,KAAA;AAAA,KACrD;AAEA,IAAA,QAAA,GAAW,iBAAkB,CAAA,OAAA,CAAQ,aAAe,EAAA,MAAM,GAAG,EAAM,IAAA,EAAA;AAEnE,IAAA,KAAA,MAAW,OAAO,KAAO,EAAA;AACrB,MAAM,MAAA,OAAA,GAAU,SAAS,QAAS,CAAA,IAAA;AAAA,QAC9B,UAAQ,IAAK,CAAA,EAAA,KAAO,GAAI,CAAA,EAAA,IAAM,KAAK,IAAS,KAAA;AAAA,OAChD;AAEA,MAAA,IAAI,CAAC,OAAS,EAAA;AACV,QAAA,MAAM,IAAI,KAAA,CAAM,CAAe,YAAA,EAAA,GAAA,CAAI,EAAE,CAAyB,uBAAA,CAAA,CAAA;AAAA;AAGlE,MAAA,IAAA,CAAK,IAAK,CAAA;AAAA,QACN,IAAa,OAAQ,CAAA,EAAA;AAAA,QACrB,QAAA,EAAa,OAAQ,CAAA,UAAA,EAAY,QAAY,IAAA,EAAA;AAAA,QAC7C,SAAA,EAAa,OAAQ,CAAA,UAAA,EAAY,SAAa,IAAA,EAAA;AAAA,QAC9C,QAAA,EAAa,OAAQ,CAAA,UAAA,EAAY,QAAY,IAAA,EAAA;AAAA,QAC7C,SAAA,EAAa,OAAQ,CAAA,UAAA,EAAY,SAAa,IAAA,EAAA;AAAA,QAC9C,aAAa,IAAI,IAAA,CAAK,OAAQ,CAAA,UAAA,EAAY,eAAe,EAAE,CAAA;AAAA,QAC3D,MAAA,EAAa,OAAQ,CAAA,UAAA,EAAY,MAAU,IAAA;AAAA,OAC9C,CAAA;AAAA;AACL;AAGJ,EAAM,MAAA,MAAA,GAAS,SAAS,QAAS,CAAA,IAAA;AAAA,IAC7B,CAAA,IAAA,KAAQ,KAAK,EAAO,KAAA;AAAA,GACxB;AACA,EAAA,MAAM,aAAa,MAAQ,EAAA,UAAA;AAE3B,EAAA,MAAM,iBAAiB,IAAI,MAAA;AAAA,IACvB,QAAQ,EAAM,IAAA,EAAA;AAAA,IACd,YAAY,IAAQ,IAAA,EAAA;AAAA,IACpB,OAAA;AAAA,IACA,YAAA;AAAA,IACA,EAAE,IAAA,EAAM,UAAY,EAAA,IAAA,IAAQ,EAAG,EAAA;AAAA,IAC/B,MAAA;AAAA,IACA,UAAY,EAAA,gBAAA;AAAA,IACZ,UAAY,EAAA;AAAA,GAChB;AACA,EAAA,MAAM,SAAS,IAAI,QAAA;AAAA,IACf,WAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACC,CAAA,OAAA,CAAQ,MAAM,GAAO,IAAA,GAAA;AAAA,IACtB,QAAS,CAAA,EAAA;AAAA,IACT,UAAW,CAAA,SAAA;AAAA,IACX,UAAW,CAAA,QAAA;AAAA,IACX,UAAW,CAAA,SAAA;AAAA,IACX,UAAW,CAAA,WAAA;AAAA,IACX,IAAI,IAAK,CAAA,UAAA,CAAW,WAAW,CAAA;AAAA,IAC/B,UAAW,CAAA,MAAA;AAAA,IACX,IAAA;AAAA,IACA,UAAW,CAAA,WAAA,CAAY,OAAQ,CAAA,CAAA,CAAA,KAAK,EAAE,mBAAmB,CAAA;AAAA,IACzD;AAAA,GACJ;AAEA,EAAM,MAAA,MAAA,CAAO,SAAS,IAAI,CAAA;AAC1B,EAAO,OAAA,MAAA;AACX;AAEA,SAAS,qBAAqB,IAAoB,EAAA;AAC9C,EAAA,QAAQ,IAAM;AAAA,IACV,KAAK,6BAA+B,EAAA;AAChC,MAAA,OAAA,CAAA;AAAA;AACJ,IACA,SAAS;AACL,MAAA,OAAA,CAAA;AAAA;AACJ;AAER;AC7HO,IAAM,WAAN,MAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAelB,WACW,CAAA,eAAA,EACA,SACA,EAAA,QAAA,EACA,MACA,MACV,EAAA;AALU,IAAA,IAAA,CAAA,eAAA,GAAA,eAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAlBX;AAAA,IAAA,IAAA,CAAQ,WAAW,kBAAmB,EAAA;AAEtC;AAAA,IAAA,IAAA,CAAQ,QAAQ,kBAAmB,EAAA;AAkB/B,IAAA,IAAA,CAAK,YAAY,IAAK,CAAA,iBAAA,CAAkB,IAAK,CAAA,QAAA,EAAU,KAAK,eAAe,CAAA;AAAA;AAC/E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,iBAAA,CAAkB,UAAkB,MAAiC,EAAA;AACzE,IAAA,IAAI,MAAiC,KAAA,MAAA,aAAA;AACjC,MAAA,OAAO,SAAU,CAAA,MAAA,CAAO,MAAO,CAAA,MAAA,EAAS,CAAA,MAAA,CAAO,QAAQ,CAAA,CAAE,MAAO,EAAC,CAAE,CAAA,KAAA,CAAM,GAAG,EAAE,CAAA;AAAA;AAElF,IAAO,OAAA,QAAA;AAAA;AACX;AAAA;AAAA;AAAA,EAKA,IAAI,QAAmB,GAAA;AACnB,IAAM,MAAA,MAAA,GAAS,IAAI,eAAgB,CAAA;AAAA,MAC/B,SAAuB,EAAA,cAAA;AAAA,MACvB,aAAuB,EAAA,kBAAA;AAAA,MACvB,gBAAuB,IAAK,CAAA,SAAA;AAAA,MAC5B,uBAAuB,IAAK,CAAA,eAAA;AAAA,MAC5B,aAAuB,EAAA,MAAA;AAAA,MACvB,KAAuB,EAAA,QAAA;AAAA,MACvB,UAAuB,IAAK,CAAA,QAAA;AAAA,MAC5B,OAAuB,IAAK,CAAA,KAAA;AAAA,MAC5B,YAAuB,EAAA;AAAA,KAC1B,CAAA;AAED,IAAA,MAAM,GAAM,GAAA,IAAI,GAAI,CAAA,IAAA,CAAK,UAAU,qBAAqB,CAAA;AACxD,IAAI,GAAA,CAAA,MAAA,GAAS,OAAO,QAAS,EAAA;AAC7B,IAAA,OAAO,IAAI,QAAS,EAAA;AAAA;AACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,aAAc,CAAA,IAAA,EAAc,KAAkC,EAAA;AAChE,IAAM,MAAA,YAAA,GAAe,mBAAmB,KAAK,CAAA;AAC7C,IAAI,IAAA,YAAA,KAAiB,KAAK,KAAO,EAAA;AAC7B,MAAA,MAAM,IAAI,KAAM,CAAA,CAAA,yBAAA,EAA4B,YAAY,CAAgB,aAAA,EAAA,IAAA,CAAK,KAAK,CAAG,CAAA,CAAA,CAAA;AAAA;AAGzF,IAAA,MAAM,SAAS,MAAM,mBAAA;AAAA,MACjB,KAAK,SAAU,CAAA,aAAA;AAAA,MACf,IAAA;AAAA,MACA,IAAK,CAAA;AAAA,KACT;AAEA,IAAO,OAAA,WAAA;AAAA,MACH,MAAO,CAAA,YAAA;AAAA,MACP,MAAO,CAAA,aAAA;AAAA,MACP,KAAK,SAAU,CAAA,SAAA;AAAA,MACf,KAAK,SAAU,CAAA,aAAA;AAAA,MACf,KAAK,MAAO,CAAA;AAAA,KAChB;AAAA;AAER;;;AC5FO,IAAS,SAAT,MAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWnB,WAAA,CACW,IACA,IACA,EAAA,OAAA,EACA,eACA,QACA,EAAA,QAAA,EACA,KACA,kBACT,EAAA;AARS,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AACA,IAAA,IAAA,CAAA,kBAAA,GAAA,kBAAA;AAAA;AACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAOH,MAAM,gBAAgB,eAA4E,GAAA,MAAA,aAAA;AAC9F,IAAA,MAAM,QAAW,GAAA,MAAM,gBAAiB,CAAA,IAAA,CAAK,aAAa,CAAA;AAC1D,IAAA,MAAM,IAAO,GAAA,MAAM,WAAY,CAAA,QAAA,CAAS,QAAQ,CAAA;AAEhD,IAAA,OAAO,IAAI,QAAA;AAAA,MACP,eAAA;AAAA,MACA;AAAA,QACI,WAAuB,IAAK,CAAA,aAAA;AAAA,QAC5B,uBAAuB,QAAS,CAAA,sBAAA;AAAA,QAChC,eAAuB,QAAS,CAAA,cAAA;AAAA,QAChC,gBAAuB,QAAS,CAAA;AAAA,OACpC;AAAA,MACA,IAAK,CAAA,EAAA;AAAA,MACL,IAAA;AAAA,MACA;AAAA,KACJ;AAAA;AAER;;;AC1CA,IAAMA,QAAU,GAAA,IAAI,WAAY,CAAA,QAAA,EAAU,CAAA;AAEnC,IAAM,gBAAgB,OAAO,KAAA,EAAe,KAAQ,GAAA,EAAA,EAAI,SAAS,CAA8B,KAAA;AAClG,EAAA,MAAM,QAAW,GAAA,MAAMA,QAAQ,CAAA,GAAA,CAAkB,gBAAkB,EAAA;AAAA,IAC/D,cAAgB,EAAA,KAAA;AAAA,IAChB,aAAgB,EAAA,KAAA;AAAA,IAChB,cAAgB,EAAA;AAAA,GACnB,CAAA;AAED,EAAA,OAAA,CAAQ,MAAM,OAAQ,CAAA,QAAA,CAAS,IAAI,CAAI,GAAA,QAAA,CAAS,OAAO,EAAC,EACnD,MAAO,CAAA,CAAC,SAAgE,IAAK,CAAA,IAAA,KAAS,QAAQ,CAC9F,CAAA,GAAA,CAAI,YAAU,IAAI,MAAA;AAAA,IACf,MAAO,CAAA,EAAA;AAAA,IACP,MAAA,CAAO,YAAY,IAAQ,IAAA,EAAA;AAAA,IAC3B,MAAA,CAAO,YAAY,OAAW,IAAA,EAAA;AAAA,IAC9B,MAAA,CAAO,YAAY,mBAAuB,IAAA,EAAA;AAAA,IAC1C;AAAA,MACI,IAAA,EAAa,MAAO,CAAA,UAAA,EAAY,IAAQ,IAAA,EAAA;AAAA,MACxC,OAAA,EAAa,MAAO,CAAA,UAAA,EAAY,OAAW,IAAA,EAAA;AAAA,MAC3C,WAAa,EAAA;AAAA,QACT,MAAA,CAAO,YAAY,YAAgB,IAAA,EAAA;AAAA,QACnC,MAAA,CAAO,YAAY,YAAgB,IAAA,EAAA;AAAA,QACnC,MAAA,CAAO,YAAY,YAAgB,IAAA;AAAA,OACvC,CAAE,OAAO,CAAC,IAAA,KAAyB,SAAS,IAAI,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,MAC3D,OAAA,EAAS,MAAO,CAAA,UAAA,EAAY,OAAW,IAAA;AAAA,KAC3C;AAAA,IACA,MAAA,CAAO,YAAY,WAAe,IAAA;AAAA,GACrC,CAAA;AACT;AAEa,IAAA,aAAA,GAAgB,OAAO,WAAA,EAAqB,OAA0C,KAAA;AAC/F,EAAA,MAAM,QAAW,GAAA,MAAMA,QAAQ,CAAA,GAAA,CAAkB,aAAe,EAAA;AAAA,IAC5D,SAAmC,EAAA,+DAAA;AAAA,IACnC,oBAAmC,EAAA,4FAAA;AAAA,IACnC,sBAAmC,EAAA,OAAA;AAAA,IACnC,wBAAmC,EAAA,qBAAA;AAAA,IACnC,gBAAmC,EAAA,MAAA;AAAA,IACnC,0BAAmC,EAAA,qCAAA;AAAA,IACnC,gBAAmC,EAAA,mCAAA;AAAA,IACnC,iCAAmC,EAAA,eAAA;AAAA,IACnC,aAAmC,EAAA;AAAA,GACpC,EAAA;AAAA,IACC,eAAA,EAAuB,UAAU,WAAW,CAAA,CAAA;AAAA,IAC5C,qBAAuB,EAAA;AAAA,GAC1B,CAAA;AAED,EAAM,MAAA,WAAA,uBAAkB,GAAqB,EAAA;AAC7C,EAAA,KAAA,MAAW,IAAQ,IAAA,QAAA,CAAS,QAAY,IAAA,EAAI,EAAA;AACxC,IAAY,WAAA,CAAA,GAAA,CAAI,GAAG,IAAK,CAAA,IAAI,IAAI,IAAK,CAAA,EAAE,IAAI,IAAI,CAAA;AAAA;AAGnD,EAAA,OAAA,CAAQ,MAAM,OAAQ,CAAA,QAAA,CAAS,IAAI,CAAA,GAAI,SAAS,IAAO,GAAA,EAClD,EAAA,MAAA,CAAO,CAAC,IAA2D,KAAA,IAAA,CAAK,SAAS,MAAM,CAAA,CACvF,IAAI,CAAQ,IAAA,KAAA;AACT,IAAM,MAAA,EAAE,aAAe,EAAA,UAAA,EAAe,GAAA,IAAA;AAEtC,IAAA,MAAM,cAAiB,GAAA,iBAAA,CAAkB,aAAc,CAAA,YAAY,CAAG,EAAA,EAAA;AACtE,IAAM,MAAA,UAAA,GAAa,iBAAkB,CAAA,aAAA,CAAc,MAAM,CAAA;AAEzD,IAAA,MAAM,eAAe,cACf,GAAA,WAAA,CAAY,IAAI,CAAkB,eAAA,EAAA,cAAc,EAAE,CAClD,GAAA,IAAA;AAEN,IAAM,MAAA,MAAA,GAAS,UACT,GAAA,WAAA,CAAY,GAAI,CAAA,CAAA,EAAG,UAAW,CAAA,IAAI,CAAI,CAAA,EAAA,UAAA,CAAW,EAAE,CAAA,CAAE,CACrD,GAAA,IAAA;AAEN,IAAA,OAAO,IAAI,IAAA;AAAA,MACP,IAAK,CAAA,EAAA;AAAA,MACL,IAAI,IAAA,CAAK,UAAY,EAAA,mBAAA,IAAuB,EAAE,CAAA;AAAA,MAC9C,YAAY,KAAS,IAAA,EAAA;AAAA,MACrB,YAAY,YAAgB,IAAA,EAAA;AAAA,MAC5B,YAAY,OAAW,IAAA,EAAA;AAAA,MACvB;AAAA,QACI,EAAA,EAAM,YAAY,EAAM,IAAA,EAAA;AAAA,QACxB,IAAA,EAAM,MAAQ,EAAA,UAAA,EAAY,IAAQ,IAAA;AAAA,OACtC;AAAA,MACA,YAAY,gBAAoB,IAAA,EAAA;AAAA,MAChC,IAAI,WAAW,WAAa,EAAA,YAAA,EAAc,MAAM,EAAI,EAAA,YAAA,EAAc,UAAY,EAAA,GAAA,IAAO,EAAE;AAAA,KAC3F;AAAA,GACH,CAAA;AACT;;;ACxFO,IAAM,aAAN,MAAiB;AAAA,EACpB,WACW,CAAA,EAAA,EACA,IACA,EAAA,QAAA,EACA,MACA,KACV,EAAA;AALU,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA;AAEf;;;ACPA,eAAsB,cAAe,CAAA,GAAA,EAAa,YAAsB,EAAA,SAAA,EAAmB,eAAuB,OAAoC,EAAA;AACpJ,EAAA,MAAM,MAAS,GAAA,MAAM,WAAY,CAAA,GAAA,EAAK,YAAY,CAAA;AAClD,EAAO,OAAA,WAAA;AAAA,IACH,MAAO,CAAA,YAAA;AAAA,IACP,MAAO,CAAA,aAAA;AAAA,IACP,SAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACJ;AACF","file":"index.mjs","sourcesContent":["/** REST/Endpoints */\nexport const BASE_URL = () => \"https://api.skolengo.com/api/v1/bff-sko-app\";\n\nexport const SEARCH_SCHOOLS = () => \"schools\";\nexport const SCHOOL_NEWS = () => \"schools-info\";\n\nexport const USER_INFO = (userId: string) => \"users-info/\" + userId;\nexport const USER_ASSIGNMENTS = () => \"homework-assignments\";\nexport const USER_ASSIGNMENT = (id: string) => \"homework-assignments/\" + id;\nexport const USER_AGENDA = () => \"agendas\";\nexport const USER_GRADES_SETTINGS = () => \"evaluations-settings\";\nexport const USER_LAST_GRADES = () => \"evaluations-results\";\nexport const USER_SERVICES = () => \"evaluation-services\"\n\nexport const ATTENDANCE_FILES = () => \"absence-files\";\n\nexport const MAIL = () => \"communications\";\nexport const MAIL_PARTICIPATIONS = (mailId: string) => \"communications/\" + mailId + \"/participations\";\nexport const MAIL_SETTINGS = (userId: string) => \"users-mail-settings/\" + userId;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/** @module RESTManager */\nimport { RequestOptions } from \"../types/RequestHandler\";\n\nexport class RestManager {\n    private readonly baseURL: string;\n\n    constructor(baseURL: string) {\n        this.baseURL = baseURL;\n    }\n\n    private async sendRequest<T>(options: RequestOptions): Promise<T> {\n        const { method, path, body, headers } = options;\n        const url = `${this.baseURL}/${path}`;\n\n        let requestBody: unknown = undefined;\n        let requestHeaders: Record<string, string> = {\n          \"User-Agent\": \"@raphckrman/skolengo.js\",\n          ...headers,\n        };\n\n        if (body instanceof URLSearchParams) {\n          requestBody = body.toString();\n          requestHeaders[\"Content-Type\"] = \"application/x-www-form-urlencoded\";\n        } else if (body) {\n          requestBody = JSON.stringify(body);\n          requestHeaders[\"Content-Type\"] = \"application/json\";\n        }\n\n        const response = await fetch(url, {\n            method,\n            body: requestBody,\n            headers: requestHeaders\n        });\n\n        if (!response.ok) {\n            const responseData = await response.json();\n            throw new Error(`${response.status}: ${JSON.stringify(responseData)}`);\n        }\n\n        const responseData = await response.json();\n        return responseData as T;\n    }\n\n    async delete<T>(path: string, params?: Record<string, any>, options?: RequestOptions): Promise<T> {\n        const urlParams = new URLSearchParams(params).toString();\n        const urlPath = urlParams ? `${path}?${urlParams}` : path;\n        return this.sendRequest<T>({\n            method:  \"DELETE\",\n            path:    urlPath,\n            headers: options?.headers\n        });\n    }\n    async get<T>(path: string, params?: Record<string, any>, headers?: Record<string, string>): Promise<T> {\n        const urlParams = new URLSearchParams(params).toString();\n        const urlPath = urlParams ? `${path}?${urlParams}` : path;\n        return this.sendRequest<T>({\n            method: \"GET\",\n            path:   urlPath,\n            headers\n        });\n    }\n\n    async post<T>(path: string, body: any, params?: Record<string, any>, options?: RequestOptions): Promise<T> {\n        const urlParams = new URLSearchParams(params).toString();\n        const urlPath = urlParams ? `${path}?${urlParams}` : path;\n        return this.sendRequest<T>({\n            method:  \"POST\",\n            path: urlPath,\n            body,\n            headers: options?.headers\n        });\n    }\n\n    async put<T>(path: string, body: any, options?: RequestOptions): Promise<T> {\n        return this.sendRequest<T>({\n            method:  \"PUT\",\n            path,\n            body,\n            headers: options?.headers\n        });\n    }\n\n    async patch<T>(path: string, body: any, params?: Record<string, any>, options?: RequestOptions): Promise<T> {\n        const urlParams = new URLSearchParams(params).toString();\n        const urlPath = urlParams ? `${path}?${urlParams}` : path;\n        return this.sendRequest<T>({\n            method:  \"PATCH\",\n            path: urlPath,\n            body,\n            headers: options?.headers\n        });\n    }\n}\n","export const downloadAttachment = async(url: string, accessToken?: string): Promise<Buffer> => {\n    const response = await fetch(url, {\n        method:  \"GET\",\n        headers: accessToken ? { Authorization: `Bearer ${accessToken}` } : {}\n    });\n\n    if (!response.ok) {\n        throw new Error(`HTTP error! status: ${response.status}`);\n    }\n\n    const arrayBuffer = await response.arrayBuffer();\n    const buffer = Buffer.from(arrayBuffer);\n\n    return buffer;\n};\n","import { downloadAttachment } from \"../routes/Attachments\";\n\n/**\n * Represents an attachment that can be include in news, assignment or message.\n */\nexport class Attachment {\n    /**\n     *\n     * @param accessToken - Used to download the protected attachment.\n     * @param id - Unique ID for each attachment.\n     * @param fileName - Name of the file attached.\n     * @param type - MIME Type of the attachment (https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/MIME_types/Common_types).\n     * @param typeLabel - Label of the MIME Type (e.g., 'Document Word')\n     * @param size - Size of the document in bytes\n     * @param url - URL used to download this attachment.\n     */\n    constructor(\n        protected accessToken: string,\n        public id: string,\n        public url: string,\n        public fileName?: string,\n        public type?: string,\n        public typeLabel?: string,\n        public size?: number\n    ){}\n\n    /**\n     * Downloads the attachment and returns its raw binary content.\n     * @returns Raw binary content.\n     */\n    fetchAttachmentBuffer(): Promise<Buffer> {\n        return downloadAttachment(this.url, this.accessToken);\n    }\n}\n","import { RelationshipData } from \"../types/RequestHandler\";\n\ninterface SingleRelation<T extends string> { id: string; type: T; }\n\nexport function getSingleRelation<T extends string>(\n    rel?: RelationshipData<T>\n): SingleRelation<T> | undefined {\n    return rel && !Array.isArray(rel.data) ? rel.data : undefined;\n}\n\nexport const getMultipleRelations = <T extends string>(\n    rel?: RelationshipData<T>\n): Array<SingleRelation<T>> => rel && Array.isArray(rel.data) ? rel.data : [];\n","import { BASE_URL, USER_ASSIGNMENT, USER_ASSIGNMENTS } from \"../rest/endpoints\";\nimport { BaseDataResponse, BaseResponse } from \"../types/RequestHandler\";\nimport { Assignment } from \"../structures/Assignment\";\nimport { RestManager } from \"../rest/RESTManager\";\nimport { attachmentInclude, HomeworkAttributes, subjectIncluded, teacherIncluded } from \"../types/Assignment\";\nimport { Attachment } from \"../structures/Attachment\";\nimport { getSingleRelation } from \"../util/Relations\";\n\nconst manager = new RestManager(BASE_URL());\n\nexport const GetAssignments = async (\n    userId: string,\n    accessToken: string,\n    emsCode: string,\n    schoolId: string,\n    periodStart = new Date(),\n    periodEnd = new Date(new Date().setMonth(new Date().getMonth() + 1))\n): Promise<Array<Assignment>> => {\n    const formatDate = (date: Date): string =>\n        date.toISOString().slice(0, 10);\n\n    const response = await manager.get<BaseResponse>(USER_ASSIGNMENTS(), {\n        \"filter[student.id]\":  userId,\n        \"filter[dueDate][GE]\": formatDate(periodStart),\n        \"filter[dueDate][LE]\": formatDate(periodEnd),\n        \"include\":             \"subject,teacher,individualCorrectedWork,individualCorrectedWork.attachments,individualCorrectedWork.audio,commonCorrectedWork.attachments,commonCorrectedWork.audio,commonCorrectedWork.pedagogicContent\",\n        \"fields[homework]\":    \"title,html,deliverWorkOnline,onlineDeliveryUrl,done,dueDateTime\",\n        \"fields[subject]\":     \"label,color\"\n    }, {\n        \"Authorization\":        `Bearer ${accessToken}`,\n        \"x-skolengo-ems-code\":  emsCode,\n        \"x-skolengo-school-id\": schoolId\n    });\n\n    const includedMap = new Map<string, unknown>();\n    for (const item of response.included ?? []) {\n        includedMap.set(`${item.type}:${item.id}`, item);\n    }\n\n    return (Array.isArray(response.data) ? response.data : [])\n        .filter((item): item is BaseDataResponse<\"homework\", HomeworkAttributes> => item.type === \"homework\")\n        .map(assignment => {\n            const teacherId = getSingleRelation(assignment.relationships.teacher)?.id;\n            const teacher = teacherId ? includedMap.get(`teacher:${teacherId}`) as teacherIncluded : null;\n            const subjectId = getSingleRelation(assignment.relationships.subject)?.id;\n            const subject = subjectId ? includedMap.get(`subject:${subjectId}`) as subjectIncluded : null;\n\n            return new Assignment(\n                accessToken,\n                userId,\n                schoolId,\n                emsCode,\n                assignment.id,\n                assignment.attributes?.done ?? false,\n                assignment.attributes?.title ?? \"\",\n                assignment.attributes?.html ?? \"\",\n                new Date(assignment.attributes?.dueDateTime ?? \"\"),\n                assignment.attributes?.deliverWorkOnline ?? false,\n                assignment.attributes?.onlineDeliverUrl ?? \"\",\n                {\n                    id:    subjectId                   ?? \"\",\n                    label: subject?.attributes?.label  ?? \"\",\n                    color: subject?.attributes?.color  ?? \"\"\n                },\n                {\n                    id:        teacherId                      ?? \"\",\n                    title:     teacher?.attributes?.title     ?? \"\",\n                    firstName: teacher?.attributes?.firstName ?? \"\",\n                    lastName:  teacher?.attributes?.lastName  ?? \"\",\n                    photoUrl:  teacher?.attributes?.photoUrl  ?? \"\"\n                }\n            );\n        });\n};\n\nexport const GetAssignmentAttachments = async (assignmentId: string, userId: string, schoolId: string, accessToken: string, emsCode: string): Promise<Array<Attachment>> => {\n    const response = await manager.get<BaseResponse>(USER_ASSIGNMENT(assignmentId), {\n        \"filter[student.id]\": userId,\n        \"include\":            \"attachments\",\n        \"fields[attachment]\": \"name,mimeType,mimeTypeLabel,size,url\"\n    }, {\n        \"Authorization\":        `Bearer ${accessToken}`,\n        \"x-skolengo-ems-code\":  emsCode,\n        \"x-skolengo-school-id\": schoolId\n    });\n\n    const includedMap = new Map<string, unknown>();\n    for (const item of response.included ?? []) {\n        includedMap.set(`${item.type}:${item.id}`, item);\n    }\n\n    return Array.from(includedMap.entries())\n        .filter(([key]) => key.startsWith(\"attachment:\"))\n        .map(([, value]) => {\n            const attachment = value as attachmentInclude;\n            return new Attachment(\n                accessToken,\n                attachment.id,\n                attachment.attributes?.url ?? \"\",\n                attachment.attributes?.name ?? \"\",\n                attachment.attributes?.mimeType ?? \"\",\n                attachment.attributes?.mimeTypeLabel ?? \"\",\n                attachment.attributes?.size ?? 0\n            );\n        });\n};\n\nexport const SetAssignmentCompletion = async (\n    assignmentId: string,\n    userId: string,\n    completed: boolean,\n    schoolId: string,\n    accessToken: string,\n    emsCode: string\n): Promise<Assignment> => {\n    const response = await manager.patch<BaseResponse>(\n        USER_ASSIGNMENT(assignmentId),\n        { data: { type: \"homework\",id: assignmentId,attributes: { done: completed } } },\n        {\n            \"filter[student.id]\": userId,\n            \"include\":            \"attachments\",\n            \"fields[attachment]\": \"name,mimeType,mimeTypeLabel,size,url\"\n        },\n        {\n            headers: {\n                \"Authorization\":        `Bearer ${accessToken}`,\n                \"x-skolengo-ems-code\":  emsCode,\n                \"x-skolengo-school-id\": schoolId\n            }\n        }\n    );\n\n    const includedMap = new Map<string, unknown>();\n    for (const item of response.included ?? []) {\n        includedMap.set(`${item.type}:${item.id}`, item);\n    }\n    const data = response.data as BaseDataResponse<\"homework\", HomeworkAttributes>;\n    const subjectId = getSingleRelation(data.relationships.subject)?.id;\n    const teacherId = getSingleRelation(data.relationships.teacher)?.id;\n    const subject = subjectId ? includedMap.get(\"subject:\" + subjectId) as subjectIncluded : null;\n    const teacher = teacherId ? includedMap.get(\"teacher:\" + teacherId) as teacherIncluded : null;\n\n    return new Assignment(\n        accessToken,\n        userId,\n        schoolId,\n        emsCode,\n        assignmentId,\n        completed,\n        data.attributes?.title ?? \"\",\n        data.attributes?.html ?? \"\",\n        new Date(data.attributes?.dueDateTime ?? \"\"),\n        data.attributes?.deliverWorkOnline ?? false,\n        data.attributes?.onlineDeliverUrl ?? \"\",\n        {\n            id:    subject?.id                ?? \"\",\n            label: subject?.attributes?.label ?? \"\",\n            color: subject?.attributes?.color ?? \"\"\n        },\n        {\n            id:        teacher?.id                    ?? \"\",\n            title:     teacher?.attributes?.title     ?? \"\",\n            firstName: teacher?.attributes?.firstName ?? \"\",\n            lastName:  teacher?.attributes?.lastName  ?? \"\",\n            photoUrl:  teacher?.attributes?.photoUrl  ?? \"\"\n        }\n    );\n};\n","import { Attachment } from \"./Attachment\";\nimport { Subject, Teacher } from \"../types/Assignment\";\nimport { GetAssignmentAttachments, SetAssignmentCompletion } from \"../routes/Assignments\";\n\n/**\n * Represents a school assignment given to a student, including metadata, subject, teacher, and completion status.\n */\nexport class Assignment {\n    /**\n     * @param accessToken - Token required to fetch attachments or update completion status.\n     * @param userId - Unique student identifier (usually prefixed with \"ESKO-\").\n     * @param schoolId - Unique school identifier (usually prefixed with \"SKO-\").\n     * @param emsCode - EMS (Education Management Software) code for the school (e.g., 'gdest', 'rra').\n     * @param id - Unique assignment identifier.\n     * @param done - Whether the student has completed the assignment.\n     * @param title - Title of the assignment (e.g., \"Exercises\", \"Autres\").\n     * @param html - HTML-formatted content of the assignment.\n     * @param dueDateTime - Deadline for submitting the assignment.\n     * @param deliverWorkOnline - Whether the student must submit work through an online platform.\n     * @param onlineDeliverUrl - URL where the student can upload their work, if applicable.\n     * @param teacher optional - The teacher who assigned the work.\n     * @param subject - The school subject associated with this assignment.\n     */\n    constructor(\n        protected accessToken: string,\n        public userId: string,\n        public schoolId: string,\n        public emsCode: string,\n        public id: string,\n        public done: boolean,\n        public title: string,\n        public html: string,\n        public dueDateTime: Date,\n        public deliverWorkOnline: boolean,\n        public onlineDeliverUrl: string | null,\n        public subject: Subject,\n        public teacher?: Teacher\n    ) {}\n\n    /**\n     * Fetches the list of attachments associated with this assignment.\n     * @returns A promise resolving to an array of attachments.\n     */\n    async getAttachments(): Promise<Array<Attachment>> {\n        return GetAssignmentAttachments(\n            this.id,\n            this.userId,\n            this.schoolId,\n            this.accessToken,\n            this.emsCode\n        );\n    }\n\n    /**\n     * Updates the assignment's completion status for this student.\n     * @param completed - Optional. Whether the assignment is completed. Defaults to toggling the current value.\n     * @returns A promise resolving to the updated Assignment instance.\n     */\n    async setCompletion(completed?: boolean): Promise<Assignment> {\n        const newDoneState = completed ?? !this.done;\n        return SetAssignmentCompletion(\n            this.id,\n            this.userId,\n            newDoneState,\n            this.schoolId,\n            this.accessToken,\n            this.emsCode\n        );\n    }\n}\n","import { Subject, Teacher } from \"../types/Assignment\";\n\nexport class Lesson {\n    constructor(\n        public id: string,\n        public startDateTime: Date,\n        public endDateTime: Date,\n        public room: string,\n        public canceled: boolean,\n        public hasContent: boolean,\n        public hasHomeworkToDoForTheLesson: boolean,\n        public hasHomeworkToDoAfterTheLesson: boolean,\n        public subject: Subject,\n        public teacher: Array<Teacher>\n    ){}\n}\n","import { Assignment } from \"./Assignment\";\nimport { Lesson } from \"./Lesson\";\n\nexport class TimetableDay {\n    constructor(\n        public date: Date,\n        public lessons: Array<Lesson>,\n        public assignments: Array<Assignment>\n    ){}\n}\n","import { BASE_URL, USER_AGENDA } from \"../rest/endpoints\";\nimport { RestManager } from \"../rest/RESTManager\";\nimport { Assignment } from \"../structures/Assignment\";\nimport { Lesson } from \"../structures/Lesson\";\nimport { TimetableDay } from \"../structures/TimetableDay\";\nimport { AgendaAttributes, lessonIncluded } from \"../types/Agenda\";\nimport { homeworkIncluded, subjectIncluded, Teacher, teacherIncluded } from \"../types/Assignment\";\nimport { BaseDataResponse, BaseResponse } from \"../types/RequestHandler\";\nimport { getMultipleRelations, getSingleRelation } from \"../util/Relations\";\n\nconst manager = new RestManager(BASE_URL());\n\nexport const getTimetableForPeriods = async (userId: string, schoolId: string, emsCode: string, accessToken: string, periodStart = new Date(), periodEnd = new Date(new Date().setMonth(new Date().getMonth() + 1)), limit = 50): Promise<Array<TimetableDay>> => {\n    const formatDate = (date: Date): string =>\n        date.toISOString().slice(0, 10);\n\n    const response = await manager.get<BaseResponse>(USER_AGENDA(), {\n        \"filter[student.id]\":      userId,\n        \"filter[date][GE]\":        formatDate(periodStart),\n        \"filter[date][LE]\":        formatDate(periodEnd),\n        \"include\":                 \"lessons,lessons.subject,lessons.teachers,homeworkAssignments,homeworkAssignments.subject\",\n        \"fields[lesson]\":          \"title,startDateTime,endDateTime,location,canceled,anyContent,anyHomeworkToDoForTheLesson,anyHomeworkToDoAfterTheLesson,subject,teachers\",\n        \"fields[homework]\":        \"title,done,dueDateTime,subject,html,deliverWorkOnline, onlineDeliverUrl\",\n        \"fields[cateringService]\": \"title,startDateTime,endDateTime\",\n        \"fields[teacher]\":         \"firstName,lastName,title\",\n        \"fields[subject]\":         \"label,color\",\n        \"page[limit]\":             limit\n    }, {\n        \"Authorization\":        `Bearer ${accessToken}`,\n        \"x-skolengo-ems-code\":  emsCode,\n        \"x-skolengo-school-id\": schoolId\n    });\n\n    const includedMap = new Map<string, unknown>();\n    for (const item of response.included ?? []) {\n        includedMap.set(`${item.type}:${item.id}`, item);\n    }\n\n    const result: Array<TimetableDay> = [];\n    const days = response.data as Array<BaseDataResponse<\"agenda\", AgendaAttributes>>;\n\n    for (const day of days) {\n        const lessons: Array<Lesson> = [];\n        const rawLessons = getMultipleRelations(day.relationships.lessons);\n\n        const assignments: Array<Assignment> = [];\n        const assignmentsIds = getMultipleRelations(day.relationships.homeworkAssignments);\n\n        for (const assignment of assignmentsIds) {\n            const assignmentData = includedMap.get(\"homework:\" + assignment.id) as homeworkIncluded;\n            const assignmentSubjectId = getSingleRelation(assignmentData.relationships?.subject)?.id;\n            const assignmentSubject = assignmentSubjectId ? includedMap.get(\"subject:\" + assignmentSubjectId) as subjectIncluded : null;\n            assignments.push(new Assignment(\n                accessToken,\n                userId,\n                schoolId,\n                emsCode,\n                assignment.id,\n                assignmentData.attributes?.done ?? false,\n                assignmentData.attributes?.title ?? \"\",\n                assignmentData.attributes?.html ?? \"\",\n                new Date(assignmentData.attributes?.dueDateTime ?? \"\"),\n                assignmentData.attributes?.deliverWorkOnline ?? false,\n                assignmentData.attributes?.onlineDeliverUrl ?? \"\",\n                {\n                    id:    assignmentSubjectId ?? \"\",\n                    label: assignmentSubject?.attributes?.label ?? \"\",\n                    color: assignmentSubject?.attributes?.color ?? \"\"\n                }));\n        }\n        for (const rawLesson of rawLessons) {\n            const lesson = rawLesson.id ? includedMap.get(\"lesson:\" + rawLesson.id) as lessonIncluded : null;\n\n            const subjectId = getSingleRelation(lesson?.relationships?.subject)?.id;\n            const subject = subjectId ? includedMap.get(\"subject:\" + subjectId) as subjectIncluded : null;\n\n            const teachers: Array<Teacher> = [];\n            const teachersIds = getMultipleRelations(lesson?.relationships?.teachers);\n            for (const teacher of teachersIds) {\n                const teacherData = includedMap.get(\"teacher:\" + teacher.id) as teacherIncluded;\n                teachers.push({\n                    id:        teacher.id,\n                    title:     teacherData.attributes?.title ?? \"\",\n                    firstName: teacherData.attributes?.firstName ?? \"\",\n                    lastName:  teacherData.attributes?.lastName ?? \"\",\n                    photoUrl:  teacherData.attributes?.photoUrl ?? \"\"\n                });\n            }\n            lessons.push(new Lesson(\n                rawLesson.id,\n                new Date(lesson?.attributes?.startDateTime ?? \"\"),\n                new Date(lesson?.attributes?.endDateTime ?? \"\"),\n                lesson?.attributes?.location ?? \"\",\n                lesson?.attributes?.canceled ?? false,\n                lesson?.attributes?.anyContent ?? false,\n                lesson?.attributes?.anyHomeworkToDoForTheLesson ?? false,\n                lesson?.attributes?.anyHomeworkToDoAfterTheLesson ?? false,\n                {\n                    id:    subject?.id ?? \"\",\n                    label: subject?.attributes?.label ?? \"\",\n                    color: subject?.attributes?.color ?? \"\"\n                },\n                teachers\n            ));\n        }\n\n        result.push(new TimetableDay(\n            new Date(day.attributes?.date ?? \"\"),\n            lessons,\n            assignments\n        ));\n    }\n\n    return result;\n};\n","import { AttendanceItemState, AttendanceItemType } from \"../util/Constants\";\n\nexport class AttendanceItem {\n    constructor(\n        public id: string,\n        public creationDate: Date,\n        public startDate: Date,\n        public endDate: Date,\n        public type: AttendanceItemType,\n        public state: AttendanceItemState,\n        public reason: string\n    ){}\n}\n","export const OIDC_CLIENT_ID = \"SkoApp.Prod.0d349217-9a4e-41ec-9af9-df9e69e09494\";\nexport const OIDC_CLIENT_SECRET = \"7cb4d9a8-2580-4041-9ae8-d5803869183f\";\nexport const REDIRECT_URI = \"skoapp-prod://sign-in-callback\";\n\nexport enum Permissions {\n    READ_EVALUATIONS = \"READ_EVALUATIONS\",\n    READ_ABSENCE_FILES = \"READ_ABSENCE_FILES\",\n    READ_MESSAGES = \"READ_MESSAGES\",\n    WRITE_MESSAGES = \"WRITE_MESSAGES\",\n    READ_LESSONS = \"READ_LESSONS\",\n    READ_ASSIGNMENTS = \"READ_HOMEWORK_ASSIGNMENTS\",\n    MARK_ASSIGNMENT_AS_DONE = \"MARK_HOMEWORK_ASSIGNMENT_AS_DONE\"\n}\n\nexport enum Services {\n    MESSAGES = \"MSG\",\n    TIMETABLE = \"CDT\",\n    APP = \"SKOAPP\",\n    ABSENCES = \"ABS\",\n    ARTICLES = \"ART\",\n    HOMEWORK = \"TAF\",\n    EVALUATIONS = \"EVAL\",\n    COMMUNICATION = \"COMC\"\n}\n\nexport enum ChallengeMethod {\n    PLAIN = \"plain\",\n    S256 = \"S256\"\n}\n\nexport enum AttendanceItemType {\n    LATENESS = \"LATENESS\",\n    ABSENCE = \"ABSENCE\"\n}\n\nexport enum AttendanceItemState {\n    LOCKED = \"LOCKED\",\n    OPEN = \"OPEN\"\n}\n\nexport enum SkillLevels {\n    NONE = \"NONE\",\n    INSUFFICIENT_MASTERY = \"INSUFFICIENT_MASTERY\",\n    LOW_MASTERY = \"LOW_MASTERY\",\n    SATISFACTORY_MASTERY = \"SATISFACTORY_MASTERY\",\n    VERY_GOOD_MASTERY = \"VERY_GOOD_MASTERY\"\n}\n\nexport enum MailFolderType {\n    INBOX = \"INBOX\",\n    SENT = \"SENT\",\n    PERSONAL = \"PERSONAL\",\n    TRASH = \"TRASH\"\n}\n\nexport enum Kind {\n    STUDENT,\n    PARENT\n}\n","import { ATTENDANCE_FILES, BASE_URL } from \"../rest/endpoints\";\nimport { RestManager } from \"../rest/RESTManager\";\nimport { AttendanceItem } from \"../structures/AttendanceItem\";\nimport { absenceFileStateIncluded, absenceReasonIncluded } from \"../types/Attendance\";\nimport { BaseDataResponse, BaseResponse } from \"../types/RequestHandler\";\nimport { AttendanceItemState, AttendanceItemType } from \"../util/Constants\";\nimport { getSingleRelation } from \"../util/Relations\";\n\nconst manager = new RestManager(BASE_URL());\n\nexport const GetAttendanceItems = async (userId: string, schoolId: string, emsCode: string, accessToken: string): Promise<Array<AttendanceItem>> => {\n    const response = await manager.get<BaseResponse>(ATTENDANCE_FILES(), {\n        \"filter[student.id]\":               userId,\n        \"filter[currentState.absenceType]\": \"ABSENCE,CLATENESS\",\n        \"filter[absenceFile]\":              \"currentState\",\n        \"include\":                          \"currentState,currentState.absenceReason,currentState.absenceRecurrence\",\n        \"fields[absenceFileState]\":         \"creationDateTime,absenceStartDateTime,absenceEndDateTime,absenceType,absenceFileStatus,absenceReason,absenceRecurrence\",\n        \"fields[absenceReason]\":            \"code,longLabel\"\n    }, {\n        \"Authorization\":        `Bearer ${accessToken}`,\n        \"x-skolengo-ems-code\":  emsCode,\n        \"x-skolengo-school-id\": schoolId\n    });\n\n    const includedMap = new Map<string, unknown>();\n    for (const item of response.included ?? []) {\n        includedMap.set(`${item.type}:${item.id}`, item);\n    }\n\n    return (Array.isArray(response.data) ? response.data : [])\n        .filter((item): item is BaseDataResponse<\"absenceFile\"> => item.type === \"absenceFile\")\n        .map(absenceItem => {\n            const fileId = getSingleRelation(absenceItem.relationships.currentState)?.id;\n            const file = fileId ? includedMap.get(\"absenceFileState:\" + fileId) as absenceFileStateIncluded : null;\n            const reasonId = getSingleRelation(file?.relationships?.absenceReason)?.id;\n            const reason = reasonId ? includedMap.get(\"absenceReason:\" + reasonId) as absenceReasonIncluded : null;\n            return new AttendanceItem(\n                absenceItem.id,\n                new Date(file?.attributes?.creationDateTime ?? \"\"),\n                new Date(file?.attributes?.absenceStartDateTime ?? \"\"),\n                new Date(file?.attributes?.absenceEndDateTime ?? \"\"),\n                file?.attributes?.absenceType ?? AttendanceItemType.ABSENCE,\n                file?.attributes?.absenceFileStatus ?? AttendanceItemState.OPEN,\n                reason?.attributes?.longLabel ?? \"\"\n            );\n        });\n};\n","import { Subject } from \"../types/Assignment\";\n\nexport class Grade {\n    constructor(\n        public id: string,\n        public isGraded: boolean,\n        public value: number,\n        public outOf: number,\n        public date: Date,\n        public coefficient: number,\n        public title?: string,\n        public topic?: string,\n        public subject?: Subject,\n        public notGradedReason?: string\n    ){}\n}\n","export class Period {\n    constructor(\n        public id: string,\n        public label: string,\n        public startDate: Date,\n        public endDate: Date\n    ){}\n}\n","import { SkillLevels } from \"../util/Constants\";\n\nexport class SkillLevel {\n    constructor(\n        public label: string,\n        public shortLabel: string,\n        public level: SkillLevels,\n        public color?: string\n    ){}\n}\n","import { Grade } from \"./Grade\";\nimport { Teacher } from \"../types/Assignment\";\n\nexport class Subject {\n    constructor(\n        public id: string,\n        public name: string,\n        public coefficient: number,\n        public value: number,\n        public outOf: number,\n        public average: number,\n        public grades: Array<Grade>,\n        public teachers: Array<Teacher>\n    ){}\n}\n","import { BASE_URL, USER_ASSIGNMENTS, USER_GRADES_SETTINGS, USER_LAST_GRADES, USER_SERVICES } from \"../rest/endpoints\";\nimport { RestManager } from \"../rest/RESTManager\";\nimport { Grade } from \"../structures/Grade\";\nimport { Period } from \"../structures/Period\";\nimport { SkillLevel } from \"../structures/SkillLevel\";\nimport { Subject } from \"../structures/Subject\";\nimport { subjectIncluded, Teacher, teacherIncluded } from \"../types/Assignment\";\nimport {\n    gradeResultIncluded,\n    GradesAttributes,\n    gradesIncluded,\n    GradesServiceAttribute,\n    gradesServiceIncluded,\n    GradesSettings,\n    GradesSettingsAttributes,\n    periodIncluded,\n    skillColorsIncluded,\n    skillsIncluded\n} from \"../types/Grades\";\nimport { BaseDataResponse, BaseResponse } from \"../types/RequestHandler\";\nimport { getMultipleRelations, getSingleRelation } from \"../util/Relations\";\n\nconst manager = new RestManager(BASE_URL());\n\nexport const GetGradesSettings = async (\n    userId: string,\n    accessToken: string,\n    emsCode: string,\n    schoolId: string\n): Promise<GradesSettings> => {\n    const response = await manager.get<BaseResponse>(USER_GRADES_SETTINGS(), {\n        \"filter[student.id]\":             userId,\n        \"include\":                        \"periods,skillsSetting,skillsSetting.skillAcquisitionColors\",\n        \"fields[evaluationsSetting]\":     \"periodicReportsEnabled,skillsEnabled,evaluationsDetailsAvailable\",\n        \"fields[period]\":                 \"label,startDate,endDate\",\n        \"fields[skillsSetting]\":          \"skillAcquisitionLevels,skillAcquisitionColors\",\n        \"fields[skillAcquisitionColors]\": \"colorLevelMappings\"\n    }, {\n        \"Authorization\":        `Bearer ${accessToken}`,\n        \"x-skolengo-ems-code\":  emsCode,\n        \"x-skolengo-school-id\": schoolId\n    });\n\n    const includedMap = new Map<string, unknown>();\n    for (const item of response.included ?? []) {\n        includedMap.set(`${item.type}:${item.id}`, item);\n    }\n\n    const data: BaseDataResponse<\"evaluationsSetting\", GradesSettingsAttributes> | undefined =\n        Array.isArray(response.data)\n            ? (response.data[0] as unknown as BaseDataResponse<\"evaluationsSetting\", GradesSettingsAttributes>)\n            : (response.data as unknown as BaseDataResponse<\"evaluationsSetting\", GradesSettingsAttributes>);\n\n    const periods: Array<Period> = getMultipleRelations(data.relationships.periods).map(period => {\n        const periodInclude = includedMap.get(`period:${period.id}`) as periodIncluded;\n        return new Period(\n            period.id,\n            periodInclude.attributes?.label ?? \"\",\n            new Date(periodInclude.attributes?.startDate ?? \"\"),\n            new Date(periodInclude.attributes?.endDate ?? \"\")\n        );\n    });\n\n    const skillLevelsRelation = getSingleRelation(data.relationships.periods);\n    const skillLevelsId = typeof skillLevelsRelation?.id === \"string\" ? skillLevelsRelation.id : \"\";\n    const skillLevelsIncluded = skillLevelsId ? includedMap.get(`skillsSetting:${skillLevelsId}`) as skillsIncluded : undefined;\n    const skillLevels: Array<SkillLevel> = skillLevelsIncluded?.attributes?.skillAcquisitionLevels\n        ? skillLevelsIncluded.attributes.skillAcquisitionLevels.map(skillLevel => {\n            const colorRelation = getSingleRelation(skillLevelsIncluded.relationships?.skillAcquisitionColors);\n            const colorId = typeof colorRelation?.id === \"string\" ? colorRelation.id : \"\";\n            const colors = colorId ? includedMap.get(`skillAcquisitionColors:${colorId}`) as skillColorsIncluded : undefined;\n            const color = colors?.attributes?.colorLevelMappings.find(col => col.level === skillLevel.level);\n            return new SkillLevel(skillLevel.label, skillLevel.shortLabel, skillLevel.level, color?.color);\n        })\n        : [];\n\n    return {\n        periodicReportsEnabled:      data?.attributes?.periodicReportsEnabled ?? false,\n        skillsEnabled:               data?.attributes?.skillsEnabled ?? false,\n        evaluationsDetailsAvailable: data?.attributes?.evaluationsDetailsAvailable ?? false,\n        periods,\n        skillLevels\n    };\n};\n\nexport const GetLastGrades = async (\n    userId: string,\n    accessToken: string,\n    emsCode: string,\n    schoolId: string,\n    limit = 20,\n    offset = 0\n): Promise<Array<Grade>> => {\n    const response = await manager.get<BaseResponse>(USER_LAST_GRADES(), {\n        \"page[limit]\":                      limit,\n        \"page[offset]\":                     offset,\n        \"filter[student.id]\":               userId,\n        \"include\":                          \"evaluation,evaluation.evaluationService,evaluation.evaluationService,evaluation.subSubject,evaluation.evaluationService.subject,subSkillsEvaluationResults\",\n        \"fields[evaluationResult]\":         \"mark,nonEvaluationReason,evaluation,subSkillEvaluationResult\",\n        \"fields[subSkillEvaluationResult]\": \"level\",\n        \"fields[evaluation]\":               \"dateTime,topic,title,scale,evaluationService,subSubject\",\n        \"fields[subSubject]\":               \"label\",\n        \"fields[evaluationService]\":        \"subject\",\n        \"fields[subject]\":                  \"label,color\"\n    }, {\n        \"Authorization\":        `Bearer ${accessToken}`,\n        \"x-skolengo-ems-code\":  emsCode,\n        \"x-skolengo-school-id\": schoolId\n    });\n\n    const includedMap = new Map<string, unknown>();\n    for (const item of response.included ?? []) {\n        includedMap.set(`${item.type}:${item.id}`, item);\n    }\n\n    return (Array.isArray(response.data) ? response.data : [])\n        .filter((item): item is BaseDataResponse<\"evaluationResult\", GradesAttributes> => item.type === \"evaluationResult\")\n        .map(grade => {\n            const evaluationId = getSingleRelation(grade.relationships.evaluation);\n            const evaluationKey = typeof evaluationId?.id === \"string\" ? evaluationId.id : \"\";\n            const evaluationInclude = includedMap.get(`evaluation:${evaluationKey}`) as gradesIncluded;\n            const evaluationServiceId = getSingleRelation(evaluationInclude.relationships!.evaluationService);\n            const evaluationServiceKey = evaluationServiceId && typeof evaluationServiceId.id === \"string\" ? evaluationServiceId.id : \"\";\n            const evaluationServiceIncluded = includedMap.get(`evaluationService:${evaluationServiceKey}`) as gradesServiceIncluded;\n            const subjectId = getSingleRelation(evaluationServiceIncluded?.relationships?.subject);\n            const subjectKey = typeof subjectId?.id === \"string\" ? subjectId.id : \"\";\n            const subjectData = includedMap.get(`subject:${subjectKey}`) as subjectIncluded;\n            console.log(subjectId, subjectKey, subjectData);\n\n            return new Grade(\n                grade.id,\n                grade.attributes?.nonEvaluationReason ? false : true,\n                grade.attributes?.mark ?? 20,\n                evaluationInclude.attributes?.scale ?? 0,\n                new Date(evaluationInclude.attributes?.dateTime ?? \"\"),\n                evaluationInclude.attributes?.coefficient ?? 1,\n                evaluationInclude.attributes?.title ?? \"\",\n                evaluationInclude.attributes?.topic ?? \"\",\n                {\n                    id:    subjectKey,\n                    label: subjectData?.attributes?.label ?? \"\",\n                    color: subjectData?.attributes?.color ?? \"\"\n                },\n                grade.attributes?.nonEvaluationReason ?? undefined\n            );\n        });\n};\n\nexport const GetGradesForPeriod = async (\n    userId: string,\n    accessToken: string,\n    emsCode: string,\n    schoolId: string,\n    period: string\n): Promise<Array<Subject>> => {\n    const response = await manager.get<BaseResponse>(USER_SERVICES(), {\n        \"filter[student.id]\":               userId,\n        \"filter[period.id]\":                period,\n        \"include\":                          \"subject,evaluations,evaluations.evaluationResult,evaluations.evaluationResult.subSkillsEvaluationResults,evaluations.evaluationResult.subSkillsEvaluationResults.subSkill,evaluations.subSkills,teachers\",\n        \"fields[evaluationService]\":        \"coefficient,average,studentAverage,scale\",\n        \"fields[subject]\":                  \"label,color\",\n        \"fields[evaluation]\":               \"dateTime,coefficient,average,scale,evaluationResult,subSkills\",\n        \"fields[evaluationResult]\":         \"mark,nonEvaluationReason,subSkillsEvaluationResults\",\n        \"fields[subSkillEvaluationResult]\": \"level,subSkill\",\n        \"fields[teacher]\":                  \"firstName,lastName,title\",\n        \"fields[subSkill]\":                 \"shortLabel\"\n    }, {\n        \"Authorization\":        `Bearer ${accessToken}`,\n        \"x-skolengo-ems-code\":  emsCode,\n        \"x-skolengo-school-id\": schoolId\n    });\n\n    const includedMap = new Map<string, unknown>();\n    for (const item of response.included ?? []) {\n        includedMap.set(`${item.type}:${item.id}`, item);\n    }\n\n    return (Array.isArray(response.data) ? response.data : [])\n        .filter((item): item is BaseDataResponse<\"evaluationService\", GradesServiceAttribute> => item.type === \"evaluationService\")\n        .map(subject => {\n            const teachers: Array<Teacher> = [];\n            const teachersId = getMultipleRelations(subject.relationships.teachers);\n            for (const teacher of teachersId) {\n                const teacherData = includedMap.get(`teacher:${teacher.id}`) as teacherIncluded;\n                teachers.push({\n                    id:        teacher.id,\n                    firstName: teacherData.attributes?.firstName ?? \"\",\n                    lastName:  teacherData.attributes?.lastName ?? \"\",\n                    photoUrl:  teacherData.attributes?.photoUrl ?? \"\",\n                    title:     teacherData.attributes?.title ?? \"\"\n                });\n            }\n\n            const grades: Array<Grade> = [];\n            const gradesId = getMultipleRelations(subject.relationships.evaluations);\n            for (const grade of gradesId) {\n                const gradeData = includedMap.get(`evaluation:${grade.id}`) as gradesIncluded;\n                const gradeResultId = getSingleRelation(gradeData.relationships?.evaluationResult)?.id;\n                const gradeResult = gradeResultId ? includedMap.get(`evaluationResult:${gradeResultId}`) as gradeResultIncluded : undefined;\n                grades.push(new Grade(\n                    grade.id,\n                    gradeResult?.attributes?.nonEvaluationReason ? false : true,\n                    gradeResult?.attributes?.mark ?? 0,\n                    gradeData.attributes?.scale ?? 20,\n                    new Date(gradeData.attributes?.dateTime ?? \"\"),\n                    gradeData.attributes?.coefficient ?? 1,\n                    undefined,\n                    undefined,\n                    undefined\n                ));\n            }\n            const subjectId = getSingleRelation(subject.relationships.subject);\n            const subjectKey = typeof subjectId?.id === \"string\" ? subjectId.id : \"\";\n            const subjectData = includedMap.get(`subject:${subjectKey}`) as subjectIncluded;\n            return new Subject(\n                subject.id,\n                subjectData.attributes?.label ?? \"\",\n                subject.attributes?.coefficient ?? 1,\n                subject.attributes?.studentAverage ?? 10,\n                subject.attributes?.scale ?? 20,\n                subject.attributes?.average ?? 10,\n                grades,\n                teachers\n            );\n        });\n};\n","import { Message } from \"./Message\";\nimport { GetMessagesFromMail } from \"../routes/Mail\";\nimport { Author } from \"../types/News\";\n\nexport class Mail {\n    constructor(\n        private emsCode: string,\n        private accessToken: string,\n        public id: string,\n        public subject: string,\n        public messages: number,\n        public participants: Array<string>,\n        public read: boolean,\n        public date: Date,\n        public content: string,\n        public sender?: Author,\n        public replyToAllAllowed?: boolean,\n        public replyToSenderAllowed?: boolean,\n        public readTrackingEnabled?: boolean,\n    ){}\n\n    async getMessages(): Promise<Array<Message>> {\n        return GetMessagesFromMail(this.id, this.emsCode, this.accessToken);\n    }\n}\n","import { Attachment } from \"./Attachment\";\nimport { Author } from \"../types/News\";\n\nexport class Message {\n    constructor(\n        public id: string,\n        public date: Date,\n        public content: string,\n        public read: boolean,\n        public attachments: Array<Attachment>,\n        public author: Author\n    ){}\n}\n","import { BaseDataResponse, BaseResponse, MailFolderType, nonTeachingStaffIncluded } from \"..\";\nimport { BASE_URL, MAIL, MAIL_PARTICIPATIONS, MAIL_SETTINGS } from \"../rest/endpoints\";\nimport { RestManager } from \"../rest/RESTManager\";\nimport { Attachment } from \"../structures/Attachment\";\nimport { Mail } from \"../structures/Mail\";\nimport { MailFolder } from \"../structures/MailFolder\";\nimport { Message } from \"../structures/Message\";\nimport { attachmentInclude } from \"../types/Assignment\";\nimport {\n    CommunicationAttributes,\n    folderIncluded,\n    MailSettings,\n    ParticipationAttributes,\n    participationIncluded,\n    personParticipantIncluded,\n    Recipients,\n    signatureIncluded,\n    userMailSettingAttributes\n} from \"../types/Mail\";\nimport { schoolInfoTechnicalUser } from \"../types/News\";\nimport { getMultipleRelations, getSingleRelation } from \"../util/Relations\";\n\nconst manager = new RestManager(BASE_URL());\n\nexport const GetMailSettings = async (userId: string, emsCode: string, accessToken: string): Promise<MailSettings> => {\n    const response = await manager.get<BaseResponse>(MAIL_SETTINGS(userId), {\n        \"include\":                 \"contacts,contacts.person,contacts.personContacts,signature,folders,folders.parent\",\n        \"fields[userMailSetting]\": \"maxCharsInParticipationContent,maxCharsInCommunicationSubject\",\n        \"fields[signature]\":       \"content\",\n        \"fields[folder]\":          \"name,position,type,parent\"\n    }, {\n        \"Authorization\":       `Bearer ${accessToken}`,\n        \"x-skolengo-ems-code\": emsCode\n    });\n\n    const includedMap = new Map<string, unknown>();\n    for (const item of response.included ?? []) {\n        includedMap.set(`${item.type}:${item.id}`, item);\n    }\n\n    const data = response.data as BaseDataResponse<\"userMailSetting\", userMailSettingAttributes>;\n    const rawSignature = getSingleRelation(data.relationships.signature);\n    const rawFolders = getMultipleRelations(data.relationships.folders);\n\n    const signature = includedMap.get(`signature:${rawSignature?.id ?? \"\"}`) as signatureIncluded;\n    const folders: Array<MailFolder> = rawFolders.map(folderRelation => {\n        const folderData = includedMap.get(`folder:${folderRelation.id}`) as folderIncluded;\n        return {\n            id:       folderRelation.id,\n            name:     folderData.attributes?.name ?? \"\",\n            position: folderData.attributes?.position ?? 0,\n            type:     folderData.attributes?.type ?? MailFolderType.PERSONAL\n        };\n    });\n\n    const rawRecipients = getMultipleRelations(data.relationships.contacts);\n    const recipients: Array<Recipients> = rawRecipients.map(recipient => ({\n        id:   recipient.id,\n        type: recipient.type\n    }));\n\n    return {\n        maxCharsInCommunicationSubject: data.attributes?.maxCharsInCommunicationSubject ?? 0,\n        maxCharsInParticipationContent: data.attributes?.maxCharsInParticipationContent ?? 0,\n        signature:                      signature.attributes?.content ?? \"\",\n        folders,\n        recipients\n    };\n};\n\nexport const GetMailsFromFolder = async (folderId: string, limit: number, offset: number, emsCode: string, accessToken: string): Promise<Array<Mail>> => {\n    const response = await manager.get<BaseResponse>(MAIL(), {\n        \"filter[folders.id]\":        folderId,\n        \"include\":                   \"lastParticipation,lastParticipation.sender,lastParticipation.sender.person,lastParticipation.sender.technicalUser\",\n        \"fields[communication]\":     \"subject,participationsNumber,recipientsSummary,read,replyToAllAllowed,replyToSenderAllowed,readTrackingEnabled,lastParticipation\",\n        \"fields[participation]\":     \"dateTime,content,sender\",\n        \"fields[personParticipant]\": \"person,technicalUser\",\n        \"fields[person]\":            \"firstName,lastName,photoUrl\",\n        \"fields[technicalUser]\":     \"label\",\n        \"page[limit]\":               limit,\n        \"page[offset]\":              offset\n    }, {\n        \"Authorization\":       `Bearer ${accessToken}`,\n        \"x-skolengo-ems-code\": emsCode\n    });\n\n    const includedMap = new Map<string, unknown>();\n    for (const item of response.included ?? []) {\n        includedMap.set(`${item.type}:${item.id}`, item);\n    }\n\n    return (Array.isArray(response.data) ? response.data : [])\n        .filter((item): item is BaseDataResponse<\"communication\", CommunicationAttributes> => item.type === \"communication\")\n        .map(mail => {\n            const recipients = mail.attributes?.recipientsSummary.match(/<span(?:\\s+[^>]*)?>(.*?)<\\/span>/g)?.map(s =>\n                s.replaceAll(/<[^>]+>/g, \"\")\n            );\n\n            const partId = getSingleRelation(mail.relationships.lastParticipation);\n            const partData = includedMap.get(`participation:${partId?.id ?? \"\"}`) as participationIncluded;\n            const sender = getSingleRelation(partData.relationships?.sender);\n            const personData = includedMap.get(`personParticipant:${sender?.id ?? \"\"}`) as personParticipantIncluded;\n            const realSender = personData.relationships?.technicalUser.data ? getSingleRelation(personData.relationships?.technicalUser) : getSingleRelation(personData.relationships?.person);\n            const realSenderData = realSender && realSender.type === \"technicalUser\" ? includedMap.get(`${realSender?.type}:${realSender?.id ?? \"\"}`) as schoolInfoTechnicalUser : includedMap.get(`${realSender?.type ?? \"\"}:${realSender?.id ?? \"\"}`) as nonTeachingStaffIncluded;\n\n            return new Mail(\n                emsCode,\n                accessToken,\n                mail.id,\n                mail.attributes?.subject ?? \"\",\n                mail.attributes?.participationsNumber ?? 1,\n                recipients ?? [],\n                mail.attributes?.read ?? false,\n                new Date(partData.attributes?.dateTime ?? \"\"),\n                partData.attributes?.content ?? \"\",\n                {\n                    id:   realSender?.id ?? \"\",\n                    name: realSender?.type === \"technicalUser\"\n                        ? (realSenderData && \"attributes\" in realSenderData && realSenderData.attributes && \"label\" in realSenderData.attributes\n                            ? realSenderData.attributes.label\n                            : \"\")\n                        : (realSenderData && \"attributes\" in realSenderData && realSenderData.attributes && \"firstName\" in realSenderData.attributes && \"lastName\" in realSenderData.attributes\n                            ? `${realSenderData.attributes.firstName} ${realSenderData.attributes.lastName}`\n                            : \"\")\n                },\n                mail.attributes?.replyToAllAllowed ?? false,\n                mail.attributes?.replyToSenderAllowed ?? false,\n                mail.attributes?.readTrackingEnabled ?? false\n            );\n        });\n};\n\nexport const GetMessagesFromMail = async (mailId: string, emsCode: string, accessToken: string): Promise<Array<Message>> => {\n    const response = await manager.get<BaseResponse>(MAIL_PARTICIPATIONS(mailId), {\n        \"include\":                   \"sender,sender.person,sender.technicalUser,attachments\",\n        \"fields[participation]\":     \"dateTime,content,read,sender\",\n        \"fields[personParticipant]\": \"additionalInfo,person,technicalUser\",\n        \"fields[person]\":            \"firstName,lastName,title,photoUrl\",\n        \"fields[technicalUser]\":     \"label\",\n        \"fields[attachment]\":        \"name,mimeType,mimeTypeLabel,size,url\"\n    }, {\n        \"Authorization\":       `Bearer ${accessToken}`,\n        \"x-skolengo-ems-code\": emsCode\n    });\n\n    const includedMap = new Map<string, unknown>();\n    for (const item of response.included ?? []) {\n        includedMap.set(`${item.type}:${item.id}`, item);\n    }\n\n    return (Array.isArray(response.data) ? response.data : [])\n        .filter((item): item is BaseDataResponse<\"participation\", ParticipationAttributes> => item.type === \"participation\")\n        .map(message => {\n            const attachmentsIDs = getMultipleRelations(message.relationships.attachments);\n            const attachments: Array<Attachment> = attachmentsIDs.map(attachment => {\n                const data = includedMap.get(`attachment:${attachment.id}`) as attachmentInclude;\n                return new Attachment(\n                    accessToken,\n                    attachment.id,\n                    data.attributes!.url,\n                    data.attributes!.name,\n                    data.attributes!.mimeType,\n                    data.attributes!.mimeTypeLabel,\n                    data.attributes!.size\n                );\n            });\n\n            const sender = getSingleRelation(message.relationships?.sender);\n            const personData = includedMap.get(`personParticipant:${sender?.id ?? \"\"}`) as personParticipantIncluded;\n            const realSender = personData.relationships?.technicalUser.data ? getSingleRelation(personData.relationships?.technicalUser) : getSingleRelation(personData.relationships?.person);\n            const realSenderData = realSender && realSender.type === \"technicalUser\" ? includedMap.get(`${realSender?.type}:${realSender?.id ?? \"\"}`) as schoolInfoTechnicalUser : includedMap.get(`${realSender?.type ?? \"\"}:${realSender?.id ?? \"\"}`) as nonTeachingStaffIncluded;\n            return new Message(\n                message.id,\n                new Date(message.attributes?.dateTime ?? \"\"),\n                message.attributes?.content ?? \"\",\n                message.attributes?.read ?? false,\n                attachments,\n                {\n                    id:   realSender?.id ?? \"\",\n                    name: realSender?.type === \"technicalUser\"\n                        ? (realSenderData && \"attributes\" in realSenderData && realSenderData.attributes && \"label\" in realSenderData.attributes\n                            ? realSenderData.attributes.label\n                            : \"\")\n                        : (realSenderData && \"attributes\" in realSenderData && realSenderData.attributes && \"firstName\" in realSenderData.attributes && \"lastName\" in realSenderData.attributes\n                            ? `${realSenderData.attributes.firstName} ${realSenderData.attributes.lastName}`\n                            : \"\")\n                }\n            );\n        });\n};\n\nexport const SendMail = async (\n    subject: string,\n    content: string,\n    recipients: Array<Recipients> = [],\n    cc: Array<Recipients> = [],\n    bcc: Array<Recipients> = [],\n    accessToken: string,\n    emsCode: string\n): Promise<Mail> => {\n    const response = await manager.post<BaseResponse>(\n        MAIL(),\n        {\n            data: {\n                type:       \"communication\",\n                attributes: {\n                    subject,\n                    firstParticipationContent: content\n                },\n                relationships: {\n                    toRecipients: {\n                        data: recipients\n                    },\n                    ccRecipients: {\n                        data: recipients\n                    },\n                    bccRecipients: {\n                        data: recipients\n                    }\n                }\n            }\n        },\n        {},\n        {\n            headers: {\n                \"Authorization\":       `Bearer ${accessToken}`,\n                \"x-skolengo-ems-code\": emsCode\n            }\n        }\n    );\n\n    const mailId = (response.data as unknown as BaseDataResponse<\"communication\", CommunicationAttributes>).id;\n\n    return new Mail(\n        emsCode,\n        accessToken,\n        mailId,\n        subject,\n        1,\n        [...recipients.map(r => r.id), ...cc.map(r => r.id), ...bcc.map(r => r.id)],\n        false,\n        new Date(),\n        content\n    );\n};\n","export const extractBaseUrl = (url: string): [string, string] => {\n    const parts = url.split(\"/\");\n    const baseUrl = parts.slice(0, 3).join(\"/\");\n    const path = parts.slice(3).join(\"/\");\n    return [baseUrl, path];\n};\n","import { RestManager } from \"../rest/RESTManager\";\nimport { JWKS, OIDCAccessToken, OIDCProviderMetadata } from \"../types/OIDC\";\nimport { OIDC_CLIENT_ID, OIDC_CLIENT_SECRET, REDIRECT_URI } from \"../util/Constants\";\nimport { extractBaseUrl } from \"../util/URL\";\n\nexport const GetOIDCWellKnown = async (url: string): Promise<OIDCProviderMetadata> => {\n    const [base, path] = extractBaseUrl(url);\n    const manager = new RestManager(base);\n    const response = await manager.get<OIDCProviderMetadata>(path);\n\n    if (\n        response.jwks_uri &&\n        response.authorization_endpoint &&\n        response.token_endpoint\n    ) {\n        return response;\n    }\n\n    throw new Error(\"Invalid OIDC Provider Metadata\");\n};\n\nexport const GetOIDCJWKS = async (url: string): Promise<JWKS> => {\n    const [base, path] = extractBaseUrl(url);\n    const manager = new RestManager(base);\n    const response = await manager.get<JWKS>(path);\n\n    if (Array.isArray(response.keys)) {\n        return response;\n    }\n\n    throw new Error(\"Invalid JWK\");\n};\n\nexport const GetOIDCAccessTokens = async (url: string, code: string, verifier: string): Promise<OIDCAccessToken> => {\n    const [base, path] = extractBaseUrl(url);\n    const manager = new RestManager(base);\n    const params = new URLSearchParams({\n        client_id:     OIDC_CLIENT_ID,\n        client_secret: OIDC_CLIENT_SECRET,\n        code,\n        code_verifier: verifier,\n        grant_type:    \"authorization_code\",\n        redirect_uri:  REDIRECT_URI\n    });\n\n    return manager.get<OIDCAccessToken>(path, params);\n};\n\nexport const OIDCRefresh = async (url: string, refreshToken: string): Promise<OIDCAccessToken> => {\n    const [base, path] = extractBaseUrl(url);\n    const manager = new RestManager(base);\n    const params = new URLSearchParams({\n        grant_type:    \"refresh_token\",\n        refresh_token: refreshToken,\n        client_id:     OIDC_CLIENT_ID,\n        client_secret: OIDC_CLIENT_SECRET,\n        scope:         \"openid+profile\"\n    });\n\n    return manager.post<OIDCAccessToken>(path, params);\n};\n","import { Attachment } from \"./Attachment\";\nimport { Author } from \"../types/News\";\n\n/**\n * Represents a news article or announcement.\n */\nexport class News {\n    /**\n     * @param id - Unique identifier for the news article.\n     * @param publicationDateTime - The publication date and time.\n     * @param title - Title of the news.\n     * @param shortContent - Short preview of the content (summary or excerpt).\n     * @param content - Full content of the news.\n     * @param author - Author who created or published the news.\n     * @param illustrationURL - Optional image or media URL for illustration.\n     * @param linkedWebSiteUrl - Optional external website URL related to the news.\n     */\n    constructor(\n        public id: string,\n        public publicationDateTime: Date,\n        public title: string,\n        public shortContent: string,\n        public content: string,\n        public author: Author,\n        public linkedWebSiteUrl: string | null,\n        public illustration: Attachment\n    ) {}\n}\n","export function generateRandomCode(length = 43): string {\n    const charset = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~\";\n    let result = \"\";\n    for (let i = 0; i < length; i++) {\n        const randomIndex = Math.floor(Math.random() * charset.length);\n        result += charset[randomIndex];\n    }\n    return result;\n}\n","import { School } from \"./School\";\nimport { News } from \"./News\";\nimport { Assignment } from \"./Assignment\";\nimport { AttendanceItem } from \"./AttendanceItem\";\nimport { TimetableDay } from \"./TimetableDay\";\nimport { Grade } from \"./Grade\";\nimport { Subject } from \"./Subject\";\nimport { MailFolder } from \"./MailFolder\";\nimport { Mail } from \"./Mail\";\nimport { Kind, Permissions } from \"../util/Constants\";\nimport { GetSchoolNews } from \"../routes/School\";\nimport { GetAssignments } from \"../routes/Assignments\";\nimport { GetAttendanceItems } from \"../routes/Attendance\";\nimport { getTimetableForPeriods } from \"../routes/Agenda\";\nimport { GradesSettings } from \"../types/Grades\";\nimport { GetGradesForPeriod, GetGradesSettings, GetLastGrades } from \"../routes/Grades\";\nimport { MailSettings, Recipients } from \"../types/Mail\";\nimport { GetMailSettings, GetMailsFromFolder, SendMail } from \"../routes/Mail\";\nimport { OIDCRefresh } from \"../routes/OIDC\";\nimport { KidData } from \"../types/User\";\n\nexport class Skolengo {\n    constructor(\n        protected accessToken: string,\n        public refreshToken: string,\n        readonly refreshURL: string,\n        protected accessTokenTTL: number,\n        public userId: string,\n        public firstName: string,\n        public lastName: string,\n        public className: string,\n        public mobilePhone: string,\n        public dateOfBirth: Date,\n        public regime: string,\n        public kind: Kind,\n        public permissions: Array<Permissions>,\n        public school: School,\n        public kids?: Array<Skolengo>\n    ){}\n\n    async GetAllMails(limitPerFolder = 20, offset = 0): Promise<Array<MailFolder>> {\n        await this.refreshAccessToken();\n        const folders: Array<MailFolder> = (await this.GetMailSettings()).folders;\n        for (const folder of folders) {\n            const mails: Array<Mail> = await GetMailsFromFolder(folder.id, limitPerFolder, offset, this.school.emsCode, this.accessToken);\n            if (!folder.mails) folder.mails = [];\n            folder.mails?.push(...mails);\n        }\n        return folders;\n    }\n    async GetAssignments(periodStart?: Date, periodEnd?: Date): Promise<Array<Assignment>> {\n        await this.refreshAccessToken();\n        return GetAssignments(this.userId, this.accessToken, this.school.emsCode, this.school.id, periodStart, periodEnd);\n    }\n    async GetAttendanceItems(): Promise<Array<AttendanceItem>> {\n        await this.refreshAccessToken();\n        return GetAttendanceItems(this.userId, this.school.id, this.school.emsCode, this.accessToken);\n    }\n    async GetGradesForPeriod(period?: string): Promise<Array<Subject>> {\n        await this.refreshAccessToken();\n        const periods = [];\n        if (!period) {\n            periods.push(...(await this.GetGradesSettings()).periods);\n            if (!periods[0]) throw new Error(\"We are unable to find any periods.\");\n        }\n        return GetGradesForPeriod(this.userId, this.accessToken, this.school.emsCode, this.school.id, period ?? periods[0].id);\n    }\n    async GetGradesSettings(): Promise<GradesSettings> {\n        await this.refreshAccessToken();\n        return GetGradesSettings(this.userId, this.accessToken, this.school.emsCode, this.school.id);\n    }\n    async GetLastGrades(limit?: number, offset?: number): Promise<Array<Grade>> {\n        await this.refreshAccessToken();\n        return GetLastGrades(this.userId, this.accessToken, this.school.emsCode, this.school.id, limit, offset);\n    }\n    async GetMailFromFolder(folderId: string, limit: number, offset: number): Promise<Array<Mail>> {\n        await this.refreshAccessToken();\n        return GetMailsFromFolder(folderId, limit, offset, this.school.emsCode, this.accessToken);\n    }\n    async GetMailSettings(): Promise<MailSettings> {\n        await this.refreshAccessToken();\n        return GetMailSettings(this.userId, this.school.emsCode, this.accessToken);\n    }\n    async GetNews(): Promise<Array<News>> {\n        await this.refreshAccessToken();\n        return GetSchoolNews(this.accessToken, this.school.emsCode);\n    }\n    async GetTimetable(periodStart?: Date, periodEnd?: Date): Promise<Array<TimetableDay>> {\n        await this.refreshAccessToken();\n        return getTimetableForPeriods(this.userId, this.school.id, this.school.emsCode, this.accessToken, periodStart, periodEnd);\n    }\n    async initKids(kids: Array<KidData>): Promise<void> {\n        if (this.kind === Kind.PARENT) {\n            this.kids = kids.map(kid => new Skolengo(\n                this.accessToken,\n                this.refreshToken,\n                this.refreshURL,\n                this.accessTokenTTL,\n                kid.id,\n                kid.firstName,\n                kid.lastName,\n                kid.className,\n                \"\",\n                new Date(kid.dateOfBirth),\n                kid.regime,\n                Kind.STUDENT,\n                [],\n                this.school\n            ));\n        }\n    }\n\n\n    async refreshAccessToken(): Promise<boolean> {\n        if (!this.refreshToken) {\n            throw new Error(\"No refresh token available. Please authenticate again.\");\n        }\n        if (Date.now() >= this.accessTokenTTL) {\n            const response = await OIDCRefresh(this.refreshURL, this.refreshToken);\n            this.accessToken = response.access_token;\n            this.refreshToken = response.refresh_token;\n            return true;\n        }\n        return false;\n    }\n\n\n    async SendMail(subject: string, content: string, recipients?: Array<Recipients>, cc?: Array<Recipients>, bcc?: Array<Recipients>): Promise<Mail> {\n        await this.refreshAccessToken();\n        return SendMail(subject, content, recipients, cc, bcc, this.school.emsCode, this.accessToken);\n    }\n\n\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-return */\nexport const DecodePayload = (token: string): Record<string, unknown> => {\n    const payload = token.split(\".\")[1];\n    const decodedPayload = Buffer.from(payload, \"base64\").toString(\"utf8\");\n    return JSON.parse(decodedPayload);\n};\n","import { School } from \"../structures/School\";\nimport { BASE_URL, USER_INFO } from \"../rest/endpoints\";\nimport { RestManager } from \"../rest/RESTManager\";\nimport { Skolengo } from \"../structures/Skolengo\";\nimport { DecodePayload } from \"../util/JWT\";\nimport { JWTPayload } from \"../types/OIDC\";\nimport { Kind } from \"../util/Constants\";\nimport { BaseResponse } from \"../types/RequestHandler\";\nimport { schoolIncluded } from \"../types/School\";\nimport { KidData, studentIncluded, UserAttributes } from \"../types/User\";\nimport { getMultipleRelations, getSingleRelation } from \"../util/Relations\";\n\nconst manager = new RestManager(BASE_URL());\n\nexport const GetUserInfo = async (\n    accessToken: string,\n    refreshToken: string,\n    wellKnownURL: string,\n    refreshURL: string,\n    emsCode: string\n): Promise<Skolengo> => {\n    const payload = DecodePayload(accessToken) as unknown as JWTPayload;\n\n    const headers = {\n        \"Authorization\":       `Bearer ${accessToken}`,\n        \"x-skolengo-ems-code\": emsCode\n    };\n\n    const query = {\n        \"include\": \"school,students,students.school,schools,prioritySchool\",\n        \"fields[userInfo]\":\n      \"lastName,firstName,photoUrl,externalMail,mobilePhone,audienceId,permissions\",\n        \"fields[school]\":\n      \"name,timeZone,subscribedServices,city,schoolAudience,administrativeId\",\n        \"fields[legalRepresentativeUserInfo]\":\n      \"addressLines,postalCode,city,country,students\",\n        \"fields[studentUserInfo]\":             \"className,dateOfBirth,regime,school\",\n        \"fields[teacherUserInfo]\":             \"schools,prioritySchool\",\n        \"fields[localAuthorityStaffUserInfo]\": \"schools,prioritySchool\",\n        \"fields[nonTeachingStaffUserInfo]\":    \"schools,prioritySchool\",\n        \"fields[otherPersonUserInfo]\":         \"schools,prioritySchool\",\n        \"fields[student]\":\n      \"firstName,lastName,photoUrl,className,dateOfBirth,regime,school\"\n    };\n\n    const response = await manager.get<BaseResponse>(USER_INFO(payload.sub), query, headers);\n\n    if (Array.isArray(response.data)) {\n        throw new TypeError(\"Expected a single user object in response data.\");\n    }\n\n    const userInfo = response.data;\n    const attributes = userInfo.attributes as UserAttributes;\n    const kind = determineAccountKind(userInfo.type);\n    const kids: Array<KidData> = [];\n    let schoolId = \"\";\n\n    if (kind === Kind.STUDENT) {\n        schoolId = getSingleRelation(userInfo.relationships.school)?.id ?? \"\";\n    }\n\n    if (kind === Kind.PARENT) {\n        const kidId = getMultipleRelations(userInfo.relationships.students);\n        if (kidId.length === 0) {\n            throw new Error(\"No kids found for this parent.\");\n        }\n\n        const kidInfo = response.included.find(\n            item => item.id === kidId[0].id && item.type === \"student\"\n        ) as studentIncluded;\n\n        schoolId = getSingleRelation(kidInfo.relationships?.school)?.id ?? \"\";\n\n        for (const kid of kidId) {\n            const kidData = response.included.find(\n                item => item.id === kid.id && item.type === \"student\"\n            ) as studentIncluded;\n\n            if (!kidData) {\n                throw new Error(`Kid with ID ${kid.id} not found in response.`);\n            }\n\n            kids.push({\n                id:          kidData.id,\n                lastName:    kidData.attributes?.lastName ?? \"\",\n                firstName:   kidData.attributes?.firstName ?? \"\",\n                photoUrl:    kidData.attributes?.photoUrl ?? \"\",\n                className:   kidData.attributes?.className ?? \"\",\n                dateOfBirth: new Date(kidData.attributes?.dateOfBirth ?? \"\"),\n                regime:      kidData.attributes?.regime ?? \"\"\n            });\n        }\n    }\n\n    const school = response.included.find(\n        item => item.id === schoolId\n    ) as schoolIncluded;\n    const schoolAttr = school?.attributes;\n\n    const schoolInstance = new School(\n        school?.id ?? \"\",\n        schoolAttr?.name ?? \"\",\n        emsCode,\n        wellKnownURL,\n        { city: schoolAttr?.city ?? \"\" },\n        undefined,\n        schoolAttr?.administrativeId,\n        schoolAttr?.subscribedServices\n    );\n    const client = new Skolengo(\n        accessToken,\n        refreshToken,\n        refreshURL,\n        (payload.exp - 300) * 1000,\n        userInfo.id,\n        attributes.firstName,\n        attributes.lastName,\n        attributes.className,\n        attributes.mobilePhone,\n        new Date(attributes.dateOfBirth),\n        attributes.regime,\n        kind,\n        attributes.permissions.flatMap(p => p.permittedOperations),\n        schoolInstance\n    );\n\n    await client.initKids(kids);\n    return client;\n};\n\nfunction determineAccountKind(type: string): Kind {\n    switch (type) {\n        case \"legalRepresentativeUserInfo\": {\n            return Kind.PARENT;\n        }\n        default: {\n            return Kind.STUDENT;\n        }\n    }\n}\n","import { School } from \"./School\";\nimport { Skolengo } from \"./Skolengo\";\nimport { Endpoints, JWKS } from \"../types/OIDC\";\nimport { ChallengeMethod, OIDC_CLIENT_ID, OIDC_CLIENT_SECRET, REDIRECT_URI } from \"../util/Constants\";\nimport { generateRandomCode } from \"../util/Verifier\";\nimport { GetOIDCAccessTokens } from \"../routes/OIDC\";\nimport { GetUserInfo } from \"../routes/User\";\nimport { sha256 } from \"@noble/hashes/sha2.js\";\nimport { base64url } from \"@scure/base\";\n\n\n/**\n * Handles the OpenID Connect authentication flow for a given school.\n */\nexport class AuthFlow {\n    /* Randomly generated verifier used for PKCE (Proof Key for Code Exchange) */\n    private verifier = generateRandomCode();\n    /* Randomly generated state to protect against CSRF attacks */\n    private state = generateRandomCode();\n    private challenge: string;\n\n    /**\n     * Constructs a new instance of the AuthFlow.\n     * @param challengeMethod - The PKCE challenge method (e.g., 'S256' or 'plain'), SHA256 is recommended for security purpose.\n     * @param endpoints - The OIDC endpoints (authorization, token, well-known).\n     * @param schoolId - The unique identifier for the school (Provided by Skolengo).\n     * @param jwks - The JSON Web Key Set used to validate OIDC tokens.\n     * @param school - The School object with metadata such as EMS code.\n     */\n    constructor(\n        public challengeMethod: ChallengeMethod,\n        public endpoints: Endpoints,\n        public schoolId: string,\n        public jwks: JWKS,\n        public school: School\n    ){\n        this.challenge = this.generateChallenge(this.verifier, this.challengeMethod);\n    }\n\n    /**\n     * Generates a PKCE code challenge based on the provided method.\n     * @param verifier - The random verifier string.\n     * @param method - The challenge method (S256 or plain).\n     * @returns The resulting challenge string.\n     */\n    private generateChallenge(verifier: string, method: ChallengeMethod): string {\n        if (method === ChallengeMethod.S256) {\n            return base64url.encode(sha256.create().update(verifier).digest()).slice(0, -1);\n        }\n        return verifier;\n    }\n\n    /**\n     * Returns the login URL that the user should be redirected to in order to authenticate.\n     */\n    get loginURL(): string {\n        const params = new URLSearchParams({\n            client_id:             OIDC_CLIENT_ID,\n            client_secret:         OIDC_CLIENT_SECRET,\n            code_challenge:        this.challenge,\n            code_challenge_method: this.challengeMethod,\n            response_type:         \"code\",\n            scope:                 \"openid\",\n            schoolId:              this.schoolId,\n            state:                 this.state,\n            redirect_uri:          REDIRECT_URI\n        });\n\n        const url = new URL(this.endpoints.authorizationEndpoint);\n        url.search = params.toString();\n        return url.toString();\n    }\n\n    /**\n     * Finalizes the login process by exchanging the code for tokens\n     * and retrieving user information.\n     * @param code - The authorization code received from the provider.\n     * @param state - The state returned from the provider (must match the one we generated).\n     * @returns A promise resolving to the authenticated Skolengo user.\n     */\n    async finalizeLogin(code: string, state: string): Promise<Skolengo> {\n        const decodedState = decodeURIComponent(state);\n        if (decodedState !== this.state) {\n            throw new Error(`Invalid state: received \"${decodedState}\", expected \"${this.state}\"`);\n        }\n\n        const tokens = await GetOIDCAccessTokens(\n            this.endpoints.tokenEndpoint,\n            code,\n            this.verifier\n        );\n\n        return GetUserInfo(\n            tokens.access_token,\n            tokens.refresh_token,\n            this.endpoints.wellKnown,\n            this.endpoints.tokenEndpoint,\n            this.school.emsCode\n        );\n    }\n}\n","import { AuthFlow } from \"./OIDC\";\nimport { GetOIDCJWKS, GetOIDCWellKnown } from \"../routes/OIDC\";\nimport { Location } from \"../types/School\";\nimport { ChallengeMethod, Services } from \"../util/Constants\";\n\n/**\n * Represents a school entity with identity, location, and authentication details.\n */\nexport class    School {\n    /**\n     * @param id - Unique ID for each school, starting with \"SKO-E-\".\n     * @param name - Display name of the school.\n     * @param emsCode - EMS code used for internal identification.\n     * @param OIDCWellKnown - URL to the school's OIDC `.well-known` configuration.\n     * @param location - Geographical and postal location of the school.\n     * @param homepage - Optional CAS homepage (not for login initiation).\n     * @param UAI - Administrative identifier (Unité Administrative Immatriculée).\n     * @param subscribedServices - List of services the school is subscribed to.\n     */\n    constructor(\n        public id: string,\n        public name: string,\n        public emsCode: string,\n        public OIDCWellKnown: string,\n        public location: Location,\n        public homepage?: string,\n        public UAI?: string,\n        public subscribedServices?: Array<Services>\n    ) {}\n\n    /**\n     * Initializes the OIDC authentication flow for this school.\n     * @param challengeMethod - PKCE challenge method to use (default: S256).\n     * @returns An initialized AuthFlow ready to start the login process.\n     */\n    async initializeLogin(challengeMethod: ChallengeMethod = ChallengeMethod.S256): Promise<AuthFlow> {\n        const metadata = await GetOIDCWellKnown(this.OIDCWellKnown);\n        const jwks = await GetOIDCJWKS(metadata.jwks_uri);\n\n        return new AuthFlow(\n            challengeMethod,\n            {\n                wellKnown:             this.OIDCWellKnown,\n                authorizationEndpoint: metadata.authorization_endpoint,\n                tokenEndpoint:         metadata.token_endpoint,\n                revokeEndpoint:        metadata.revocation_endpoint\n            },\n            this.id,\n            jwks,\n            this\n        );\n    }\n}\n","import { BASE_URL, SCHOOL_NEWS, SEARCH_SCHOOLS } from \"../rest/endpoints\";\nimport { RestManager } from \"../rest/RESTManager\";\nimport { Attachment } from \"../structures/Attachment\";\nimport { News } from \"../structures/News\";\nimport { School } from \"../structures/School\";\nimport { NewsAttributes } from \"../types/News\";\nimport { BaseDataResponse, BaseResponse, fileIncluded } from \"../types/RequestHandler\";\nimport { SchoolAttributes, schoolIncluded } from \"../types/School\";\nimport { getSingleRelation } from \"../util/Relations\";\n\nconst manager = new RestManager(BASE_URL());\n\nexport const SearchSchools = async (query: string, limit = 10, offset = 0): Promise<Array<School>> => {\n    const response = await manager.get<BaseResponse>(SEARCH_SCHOOLS(), {\n        \"filter[text]\": query,\n        \"page[limit]\":  limit,\n        \"page[offset]\": offset\n    });\n\n    return (Array.isArray(response.data) ? response.data : [])\n        .filter((item): item is BaseDataResponse<\"school\", SchoolAttributes>  => item.type === \"school\")\n        .map(school => new School(\n            school.id,\n            school.attributes?.name ?? \"\",\n            school.attributes?.emsCode ?? \"\",\n            school.attributes?.emsOIDCWellKnownUrl ?? \"\",\n            {\n                city:        school.attributes?.city ?? \"\",\n                country:     school.attributes?.country ?? \"\",\n                addressLine: [\n                    school.attributes?.addressLine1 ?? \"\",\n                    school.attributes?.addressLine2 ?? \"\",\n                    school.attributes?.addressLine3 ?? \"\"\n                ].filter((line): line is string => line !== null).join(\", \"),\n                zipCode: school.attributes?.zipCode ?? \"\"\n            },\n            school.attributes?.homePageUrl ?? \"\"\n        ));\n};\n\nexport const GetSchoolNews = async (accessToken: string, emsCode: string): Promise<Array<News>> => {\n    const response = await manager.get<BaseResponse>(SCHOOL_NEWS(), {\n        \"include\":                         \"illustration,school,author,author.person,author.technicalUser\",\n        \"fields[schoolInfo]\":              \"illustration,school,author,publicationDateTime,title,shortContent,content,linkedWebSiteUrl\",\n        \"fields[announcement]\":            \"level\",\n        \"fields[schoolInfoFile]\":          \"url,alternativeText\",\n        \"fields[school]\":                  \"name\",\n        \"fields[schoolInfoAuthor]\":        \"person,technicalUser,additionalInfo\",\n        \"fields[person]\":                  \"firstName,lastName,title,photoUrl\",\n        \"fields[schoolInfoTechnicalUser]\": \"label,logoUrl\",\n        \"page[limit]\":                     50\n    }, {\n        \"Authorization\":       `Bearer ${accessToken}`,\n        \"x-skolengo-ems-code\": emsCode\n    });\n\n    const includedMap = new Map<string, unknown>();\n    for (const item of response.included ?? []) {\n        includedMap.set(`${item.type}:${item.id}`, item);\n    }\n\n    return (Array.isArray(response.data) ? response.data : [])\n        .filter((item): item is BaseDataResponse<\"news\", NewsAttributes> => item.type === \"news\")\n        .map(news => {\n            const { relationships, attributes } = news;\n\n            const illustrationId = getSingleRelation(relationships.illustration)?.id;\n            const authorData = getSingleRelation(relationships.school);\n\n            const illustration = illustrationId\n                ? includedMap.get(`schoolInfoFile:${illustrationId}`) as fileIncluded\n                : null;\n\n            const author = authorData\n                ? includedMap.get(`${authorData.type}:${authorData.id}`) as schoolIncluded\n                : null;\n\n            return new News(\n                news.id,\n                new Date(attributes?.publicationDateTime ?? \"\"),\n                attributes?.title ?? \"\",\n                attributes?.shortContent ?? \"\",\n                attributes?.content ?? \"\",\n                {\n                    id:   authorData?.id ?? \"\",\n                    name: author?.attributes?.name ?? \"\"\n                },\n                attributes?.linkedWebSiteUrl ?? \"\",\n                new Attachment(accessToken, illustration?.id ?? \"\", illustration?.attributes?.url ?? \"\")\n            );\n        });\n};\n","import { Mail } from \"./Mail\";\nimport { MailFolderType } from \"../util/Constants\";\n\nexport class MailFolder {\n    constructor(\n        public id: string,\n        public name: string,\n        public position: number,\n        public type: MailFolderType,\n        public mails?: Array<Mail>\n    ){}\n}\n","import { OIDCRefresh } from \"../routes/OIDC\";\nimport { GetUserInfo } from \"../routes/User\";\nimport { Skolengo } from \"../structures/Skolengo\";\n\nexport async function LoginWithToken(url: string, refreshToken: string, wellKnown: string, tokenEndpoint: string, emsCode: string): Promise<Skolengo> {\n  const tokens = await OIDCRefresh(url, refreshToken);\n  return GetUserInfo(\n      tokens.access_token,\n      tokens.refresh_token,\n      wellKnown,\n      tokenEndpoint,\n      emsCode\n  );\n}"]}