Файловый менеджер - Редактировать - /var/www/html/mediawiki-1.43.1/extensions/VisualEditor/lib/ve/lib/peerjs/peerjs.min.js.map
Ðазад
{"mappings":"8JAkBAA,EAGgBC,ECrBD,SAAAC,EAAiBC,GAE5B,OAAOA,GAAOA,EAAIC,cAAgBC,OAAS,gBAAkBF,CACjE,CDHA,IAAIG,EAAiB,CAAC,EACtBA,EAAeC,eAAiB,WAC9B,IAEE,OADA,IAAIC,KAAK,KACF,CACT,CAAE,MAAOC,GACP,OAAO,CACT,CACF,CAPgC,GAShCH,EAAeI,oBAAsBJ,EAAeC,gBAAkB,WACpE,IACE,OAAiD,IAA1C,IAAKC,KAAK,CAAC,IAAIG,WAAW,MAAOC,IAC1C,CAAE,MAAOH,GACP,OAAO,CACT,CACF,CANsE,GAQtET,EAAgCM,EAChC,IAAIO,EAAcZ,EAMlB,SAASa,IACPC,KAAKC,QAAU,GACfD,KAAKE,OAAS,EAChB,CARsB,oBAAXC,SACTL,EAAcZ,EAA6BiB,OAAOC,mBAChDD,OAAOE,gBAAkBF,OAAOG,eAAiBH,OAAOI,aAQ5DR,EAAcS,UAAUC,OAAS,SAAUC,GACrB,iBAATA,EACTV,KAAKC,QAAQU,KAAKD,IAElBV,KAAKY,QACLZ,KAAKE,OAAOS,KAAKD,GAErB,EAEAX,EAAcS,UAAUI,MAAQ,WAC9B,GAAIZ,KAAKC,QAAQY,OAAS,EAAG,CAC3B,IAAIC,EAAM,IAAIlB,WAAWI,KAAKC,SACzBV,EAAeI,qBAClBmB,EAAMA,EAAIC,QAEZf,KAAKE,OAAOS,KAAKG,GACjBd,KAAKC,QAAU,EACjB,CACF,EAEAF,EAAcS,UAAUQ,UAAY,WAElC,GADAhB,KAAKY,QACDrB,EAAeC,eAAgB,CAEjC,IADA,IAAIyB,EAAU,IAAInB,EACToB,EAAI,EAAGC,EAAKnB,KAAKE,OAAOW,OAAQK,EAAIC,EAAID,IAC/CD,EAAQR,OAAOT,KAAKE,OAAOgB,IAE7B,OAAOD,EAAQG,SACjB,CACE,OAAO,IAAI3B,KAAKO,KAAKE,OAEzB,E,MAE+BH,E,EE9D3Bd,EAiBJ,SAASoC,EAAUX,GAEjBV,KAAKsB,MAAQ,EACbtB,KAAKuB,WAAab,EAClBV,KAAKwB,SAAW,IAAI5B,WAAWI,KAAKuB,YACpCvB,KAAKa,OAASb,KAAKuB,WAAWE,UAChC,CAwPA,SAASC,IACP1B,KAAK2B,cAAgB,IAAAC,CACvB,CAmPA,SAASC,EAAcC,GACrB,IAAIC,EAAOD,EAAEE,YAAY,GAEzB,OAAID,GAAQ,KAAc,KACtBA,GAAQ,MAAe,MACvBA,GAAQ,QAAiB,OACzBA,GAAQ,SAAkB,QACvB,QACT,CC7gBe,SAAAE,EAA0C7C,EAAA8C,EAAAC,GAYvD,OAXID,KAAO9C,EACTgD,OAAOC,eAAejD,EAAK8C,EAAK,CAC9BC,MAAOA,EACPG,YAAY,EACZC,cAAc,EACdC,UAAU,IAGZpD,EAAI8C,GAAOC,EAGN/C,CACT,CDGAqD,EAbiB,CACfC,OAAQ,SAAUhC,GAEhB,OADe,IAAIW,EAASX,GACZgC,QAClB,EACAC,KAAM,SAAUjC,GACd,IAAIkC,EAAS,IAAIlB,EAGjB,OAFAkB,EAAOD,KAAKjC,GACCkC,EAAO5B,WAEtB,GAaFK,EAASb,UAAUkC,OAAS,WAC1B,IAOI7C,EAPAgD,EAAO7C,KAAK8C,eAChB,GAAID,EAAO,IACT,OAAOA,EACF,IAAY,IAAPA,GAAe,GACzB,OAAe,IAAPA,GAAe,GAIzB,IAAKhD,EAAc,IAAPgD,IAAgB,GAC1B,OAAO7C,KAAK+C,WAAWlD,GAClB,IAAKA,EAAc,IAAPgD,IAAgB,GACjC,OAAO7C,KAAKgD,cAAcnD,GACrB,IAAKA,EAAc,IAAPgD,IAAgB,GACjC,OAAO7C,KAAKiD,aAAapD,GACpB,IAAKA,EAAc,IAAPgD,IAAgB,GACjC,OAAO7C,KAAKkD,WAAWrD,GAGzB,OAAQgD,GACN,KAAK,IACH,OAAO,KACT,KAAK,IA0BL,KAAK,IAEL,KAAK,IAEL,KAAK,IAEL,KAAK,IACH,OA/BF,KAAK,IACH,OAAO,EACT,KAAK,IACH,OAAO,EACT,KAAK,IACH,OAAO7C,KAAKmD,eACd,KAAK,IACH,OAAOnD,KAAKoD,gBACd,KAAK,IACH,OAAOpD,KAAK8C,eACd,KAAK,IACH,OAAO9C,KAAKqD,gBACd,KAAK,IACH,OAAOrD,KAAKsD,gBACd,KAAK,IACH,OAAOtD,KAAKuD,gBACd,KAAK,IACH,OAAOvD,KAAKwD,cACd,KAAK,IACH,OAAOxD,KAAKyD,eACd,KAAK,IACH,OAAOzD,KAAK0D,eACd,KAAK,IACH,OAAO1D,KAAK2D,eASd,KAAK,IAEH,OADA9D,EAAOG,KAAKqD,gBACLrD,KAAKgD,cAAcnD,GAC5B,KAAK,IAEH,OADAA,EAAOG,KAAKsD,gBACLtD,KAAKgD,cAAcnD,GAC5B,KAAK,IAEH,OADAA,EAAOG,KAAKqD,gBACLrD,KAAK+C,WAAWlD,GACzB,KAAK,IAEH,OADAA,EAAOG,KAAKsD,gBACLtD,KAAK+C,WAAWlD,GACzB,KAAK,IAEH,OADAA,EAAOG,KAAKqD,gBACLrD,KAAKiD,aAAapD,GAC3B,KAAK,IAEH,OADAA,EAAOG,KAAKsD,gBACLtD,KAAKiD,aAAapD,GAC3B,KAAK,IAEH,OADAA,EAAOG,KAAKqD,gBACLrD,KAAKkD,WAAWrD,GACzB,KAAK,IAEH,OADAA,EAAOG,KAAKsD,gBACLtD,KAAKkD,WAAWrD,GAE7B,EAEAwB,EAASb,UAAUsC,aAAe,WAChC,IAAIc,EAAmC,IAA5B5D,KAAKwB,SAASxB,KAAKsB,OAE9B,OADAtB,KAAKsB,QACEsC,CACT,EAEAvC,EAASb,UAAU6C,cAAgB,WACjC,IAAIQ,EAAQ7D,KAAK8D,KAAK,GAClBC,EACmB,KAAR,IAAXF,EAAM,KAAgC,IAAXA,EAAM,IAErC,OADA7D,KAAKsB,OAAS,EACPyC,CACT,EAEA1C,EAASb,UAAU8C,cAAgB,WACjC,IAAIO,EAAQ7D,KAAK8D,KAAK,GAClBE,EAGY,KADA,KADD,IAAXH,EAAM,GACNA,EAAM,IACNA,EAAM,IACRA,EAAM,GAER,OADA7D,KAAKsB,OAAS,EACP0C,CACT,EAEA3C,EAASb,UAAU+C,cAAgB,WACjC,IAAIM,EAAQ7D,KAAK8D,KAAK,GAClBG,EAOY,KADA,KADA,KADA,KADA,KADA,KADG,IAAXJ,EAAM,GACVA,EAAM,IACNA,EAAM,IACNA,EAAM,IACNA,EAAM,IACNA,EAAM,IACNA,EAAM,IACRA,EAAM,GAER,OADA7D,KAAKsB,OAAS,EACP2C,CACT,EAEA5C,EAASb,UAAUgD,YAAc,WAC/B,IAAIU,EAAQlE,KAAK8C,eACjB,OAAOoB,EAAS,IAAQA,EAAQA,EAAS,GAC3C,EAEA7C,EAASb,UAAUiD,aAAe,WAChC,IAAIM,EAAS/D,KAAKqD,gBAClB,OAAOU,EAAU,MAAUA,EAASA,EAAU,KAChD,EAEA1C,EAASb,UAAUkD,aAAe,WAChC,IAAIM,EAAShE,KAAKsD,gBAClB,OAAOU,EAAUG,KAAKC,IAAI,EAAG,IAAOJ,EAChCA,EAASG,KAAKC,IAAI,EAAG,GAC3B,EAEA/C,EAASb,UAAUmD,aAAe,WAChC,IAAIM,EAASjE,KAAKuD,gBAClB,OAAOU,EAAUE,KAAKC,IAAI,EAAG,IAAOH,EAChCA,EAASE,KAAKC,IAAI,EAAG,GAC3B,EAEA/C,EAASb,UAAUuC,WAAa,SAAUlD,GACxC,GAAIG,KAAKa,OAASb,KAAKsB,MAAQzB,EAC7B,MAAM,IAAIwE,MAAM,4CACRrE,KAAKsB,MAAQ,IAAMzB,EAAO,IAAMG,KAAKa,QAE/C,IAAIC,EAAMd,KAAKuB,WAAW+C,MAAMtE,KAAKsB,MAAOtB,KAAKsB,MAAQzB,GAKzD,OAJAG,KAAKsB,OAASzB,EAIPiB,CACT,EAEAO,EAASb,UAAUwC,cAAgB,SAAUnD,GAO3C,IANA,IAGI0E,EACAxC,EAJA8B,EAAQ7D,KAAK8D,KAAKjE,GAClBqB,EAAI,EACJsD,EAAM,GAIHtD,EAAIrB,IACT0E,EAAIV,EAAM3C,IAOF,KAENa,EAAOwC,EACPrD,MACc,IAAJqD,GAAY,IAEtBxC,GAAa,GAAJwC,IAAa,EAAqB,GAAfV,EAAM3C,EAAI,GACtCA,GAAK,IACS,IAAJqD,GAAY,IAEtBxC,GAAa,GAAJwC,IAAa,IAAsB,GAAfV,EAAM3C,EAAI,KAAc,EACnC,GAAf2C,EAAM3C,EAAI,GACbA,GAAK,IAGLa,GAAa,EAAJwC,IAAa,IAAsB,GAAfV,EAAM3C,EAAI,KAAc,IACnC,GAAf2C,EAAM3C,EAAI,KAAc,EAAoB,GAAf2C,EAAM3C,EAAI,GAC1CA,GAAK,GAEPsD,GAAOC,OAAOC,cAAc3C,GAI9B,OADA/B,KAAKsB,OAASzB,EACP2E,CACT,EAEAnD,EAASb,UAAUyC,aAAe,SAAUpD,GAE1C,IADA,IAAI8E,EAAU,IAAIC,MAAM/E,GACfqB,EAAI,EAAGA,EAAIrB,EAAMqB,IACxByD,EAAQzD,GAAKlB,KAAK0C,SAEpB,OAAOiC,CACT,EAEAtD,EAASb,UAAU0C,WAAa,SAAUrD,GAExC,IADA,IAAIgF,EAAM,CAAC,EACF3D,EAAI,EAAGA,EAAIrB,EAAMqB,IAAK,CAC7B,IAAIgB,EAAMlC,KAAK0C,SACXP,EAAQnC,KAAK0C,SACjBmC,EAAI3C,GAAOC,CACb,CACA,OAAO0C,CACT,EAEAxD,EAASb,UAAU2C,aAAe,WAChC,IAAIa,EAAShE,KAAKsD,gBAEdwB,GAAOd,GAAW,GAAM,KAAQ,IAEpC,OAAiB,IAHNA,GAAU,GAGA,GAAI,IADA,QAAVA,EAAsB,SAExBG,KAAKC,IAAI,EAAGU,EAAM,GACjC,EAEAzD,EAASb,UAAU4C,cAAgB,WACjC,IAAI2B,EAAM/E,KAAKsD,gBACX0B,EAAMhF,KAAKsD,gBAEXwB,GAAOC,GAAQ,GAAM,MAAS,KAIlC,OAAiB,IALNA,GAAO,GAKG,GAAI,KAHN,QAAPA,EAAkB,SACXZ,KAAKC,IAAI,EAAGU,EAAM,IACnCE,EAAMb,KAAKC,IAAI,EAAGU,EAAM,IAE5B,EAEAzD,EAASb,UAAUsD,KAAO,SAAUjD,GAClC,IAAIoE,EAAIjF,KAAKsB,MACb,GAAI2D,EAAIpE,GAAUb,KAAKa,OACrB,OAAOb,KAAKwB,SAAS0D,SAASD,EAAGA,EAAIpE,GAErC,MAAM,IAAIwD,MAAM,6CAEpB,EAMA3C,EAAOlB,UAAUQ,UAAY,WAC3B,OAAOhB,KAAK2B,cAAcX,WAC5B,EAEAU,EAAOlB,UAAUmC,KAAO,SAAUR,GAChC,IAAIU,OAAe,IAAAV,EAAA,YAARhD,EAAQgD,GACnB,GAAa,WAATU,EACF7C,KAAKmF,YAAYhD,QACZ,GAAa,WAATU,EACLsB,KAAKiB,MAAMjD,KAAWA,EACxBnC,KAAKqF,aAAalD,GAElBnC,KAAKsF,YAAYnD,QAEd,GAAa,YAATU,GACK,IAAVV,EACFnC,KAAK2B,cAAclB,OAAO,MACP,IAAV0B,GACTnC,KAAK2B,cAAclB,OAAO,UAEvB,GAAa,cAAToC,EACT7C,KAAK2B,cAAclB,OAAO,SACrB,IAAa,WAAToC,EAgCT,MAAM,IAAIwB,MAAM,SAAWxB,EAAO,uBA/BlC,GAAc,OAAVV,EACFnC,KAAK2B,cAAclB,OAAO,SACrB,CACL,IAAIpB,EAAc8C,EAAM9C,YACxB,GAAIA,GAAeuF,MACjB5E,KAAKuF,WAAWpD,QACX,GAAI9C,GAAeI,MAAQJ,GAAemG,MAAQrD,aAAiB1C,MAAQ0C,aAAiBqD,KACjGxF,KAAKyF,SAAStD,QACT,GAAI9C,GAAeqG,YACpBC,EAAehG,mBACjBK,KAAKyF,SAAS,IAAI7F,WAAWuC,IAE7BnC,KAAKyF,SAAStD,QAEX,GAAI,sBAAuBA,EAC5BwD,EAAehG,mBACjBK,KAAKyF,SAAS,IAAI7F,WAAWuC,EAAMpB,SAEnCf,KAAKyF,SAAStD,EAAMpB,aAEjB,GAAI1B,GAAgB+C,QAAY/C,EAAYuG,WAAWC,WAAW,SACvE7F,KAAK8F,YAAY3D,QACZ,GAAI9C,GAAe0G,KACxB/F,KAAKmF,YAAYhD,EAAMyD,gBAClB,IAAkC,mBAAvBzD,EAAM6D,aAGtB,MAAM,IAAI3B,MAAM,SAAWhF,EAAYuG,WAAa,uBAFpD5F,KAAK2B,cAAclB,OAAO0B,EAAM6D,eAEoB,CAExD,CAEkC,CAEpChG,KAAK2B,cAAcf,OACrB,EAEAc,EAAOlB,UAAUiF,SAAW,SAAUQ,GACpC,IAAIpF,EAASoF,EAAKpF,QAAUoF,EAAKxE,YAAcwE,EAAKpG,KACpD,GAAIgB,GAAU,GACZb,KAAKkG,WAAW,IAAOrF,QAClB,GAAIA,GAAU,MACnBb,KAAK2B,cAAclB,OAAO,KAC1BT,KAAKmG,YAAYtF,OACZ,MAAIA,GAAU,YAInB,MAAM,IAAIwD,MAAM,kBAHhBrE,KAAK2B,cAAclB,OAAO,KAC1BT,KAAKoG,YAAYvF,EAED,CAElBb,KAAK2B,cAAclB,OAAOwF,EAC5B,EAEAvE,EAAOlB,UAAU2E,YAAc,SAAUX,GACvC,IAAI3D,EA+KN,SAAqB2D,GACnB,OAAIA,EAAI3D,OAAS,IAER,IAAKpB,KAAK,CAAC+E,IAAO3E,KAElB2E,EAAI6B,QAAQ,mDAAoDxE,GAAchB,MAEzF,CAtLeyF,CAAW9B,GAExB,GAAI3D,GAAU,GACZb,KAAKkG,WAAW,IAAOrF,QAClB,GAAIA,GAAU,MACnBb,KAAK2B,cAAclB,OAAO,KAC1BT,KAAKmG,YAAYtF,OACZ,MAAIA,GAAU,YAInB,MAAM,IAAIwD,MAAM,kBAHhBrE,KAAK2B,cAAclB,OAAO,KAC1BT,KAAKoG,YAAYvF,EAED,CAElBb,KAAK2B,cAAclB,OAAO+D,EAC5B,EAEA9C,EAAOlB,UAAU+E,WAAa,SAAUgB,GACtC,IAAI1F,EAAS0F,EAAI1F,OACjB,GAAIA,GAAU,GACZb,KAAKkG,WAAW,IAAOrF,QAClB,GAAIA,GAAU,MACnBb,KAAK2B,cAAclB,OAAO,KAC1BT,KAAKmG,YAAYtF,OACZ,MAAIA,GAAU,YAInB,MAAM,IAAIwD,MAAM,kBAHhBrE,KAAK2B,cAAclB,OAAO,KAC1BT,KAAKoG,YAAYvF,EAED,CAElB,IAAK,IAAIK,EAAI,EAAGA,EAAIL,EAAQK,IAC1BlB,KAAK2C,KAAK4D,EAAIrF,GAElB,EAEAQ,EAAOlB,UAAU6E,aAAe,SAAUmB,GACxC,GAAIA,IAAO,IAASA,GAAO,IACzBxG,KAAK2B,cAAclB,OAAa,IAAN+F,QACrB,GAAIA,GAAO,GAAQA,GAAO,IAC/BxG,KAAK2B,cAAclB,OAAO,KAC1BT,KAAKkG,WAAWM,QACX,GAAIA,IAAO,KAASA,GAAO,IAChCxG,KAAK2B,cAAclB,OAAO,KAC1BT,KAAKyG,UAAUD,QACV,GAAIA,GAAO,GAAUA,GAAO,MACjCxG,KAAK2B,cAAclB,OAAO,KAC1BT,KAAKmG,YAAYK,QACZ,GAAIA,IAAO,OAAWA,GAAO,MAClCxG,KAAK2B,cAAclB,OAAO,KAC1BT,KAAK0G,WAAWF,QACX,GAAIA,GAAO,GAAcA,GAAO,WACrCxG,KAAK2B,cAAclB,OAAO,KAC1BT,KAAKoG,YAAYI,QACZ,GAAIA,IAAO,YAAeA,GAAO,WACtCxG,KAAK2B,cAAclB,OAAO,KAC1BT,KAAK2G,WAAWH,QACX,GAAIA,IAAO,oBAAuBA,GAAO,mBAC9CxG,KAAK2B,cAAclB,OAAO,KAC1BT,KAAK4G,WAAWJ,OACX,MAAIA,GAAO,GAAsBA,GAAO,qBAI7C,MAAM,IAAInC,MAAM,mBAHhBrE,KAAK2B,cAAclB,OAAO,KAC1BT,KAAK6G,YAAYL,EAED,CAEpB,EAEA9E,EAAOlB,UAAU8E,YAAc,SAAUkB,GACvC,IAAIM,EAAO,EACPN,EAAM,IACRM,EAAO,EACPN,GAAOA,GAET,IAAI1B,EAAMX,KAAKiB,MAAMjB,KAAK4C,IAAIP,GAAOrC,KAAK6C,KACtCC,EAAQT,EAAMrC,KAAKC,IAAI,EAAGU,GAAO,EACjCoC,EAAQ/C,KAAKiB,MAAM6B,EAAQ9C,KAAKC,IAAI,EAAG,KACvC+C,EAAMhD,KAAKC,IAAI,EAAG,IAClBW,EAAM+B,GAAS,GAAOhC,EAAO,MAAS,GACxCoC,EAASC,EAAO,QACdnC,EAAMkC,EAAQC,EAClBnH,KAAK2B,cAAclB,OAAO,KAC1BT,KAAK2G,WAAW5B,GAChB/E,KAAK2G,WAAW3B,EAClB,EAEAtD,EAAOlB,UAAUsF,YAAc,SAAU1G,GACvC,IACIyB,EADOuB,OAAOgF,KAAKhI,GACLyB,OAClB,GAAIA,GAAU,GACZb,KAAKkG,WAAW,IAAOrF,QAClB,GAAIA,GAAU,MACnBb,KAAK2B,cAAclB,OAAO,KAC1BT,KAAKmG,YAAYtF,OACZ,MAAIA,GAAU,YAInB,MAAM,IAAIwD,MAAM,kBAHhBrE,KAAK2B,cAAclB,OAAO,KAC1BT,KAAKoG,YAAYvF,EAED,CAElB,IAAK,IAAIwG,KAAQjI,EACXA,EAAIkI,eAAeD,KACrBrH,KAAK2C,KAAK0E,GACVrH,KAAK2C,KAAKvD,EAAIiI,IAGpB,EAEA3F,EAAOlB,UAAU0F,WAAa,SAAUM,GACtCxG,KAAK2B,cAAclB,OAAO+F,EAC5B,EAEA9E,EAAOlB,UAAU2F,YAAc,SAAUK,GACvCxG,KAAK2B,cAAclB,OAAO+F,GAAO,GACjCxG,KAAK2B,cAAclB,OAAa,IAAN+F,EAC5B,EAEA9E,EAAOlB,UAAU4F,YAAc,SAAUI,GACvC,IAAIe,EAAU,WAANf,EACRxG,KAAK2B,cAAclB,QAAY,WAAJ8G,KAAoB,IAC/CvH,KAAK2B,cAAclB,QAAY,SAAJ8G,KAAoB,IAC/CvH,KAAK2B,cAAclB,QAAY,MAAJ8G,KAAoB,GAC/CvH,KAAK2B,cAAclB,OAAY,IAAJ8G,EAC7B,EAEA7F,EAAOlB,UAAUqG,YAAc,SAAUL,GACvC,IAAIgB,EAAOhB,EAAMrC,KAAKC,IAAI,EAAG,IACzBqD,EAAMjB,EAAMrC,KAAKC,IAAI,EAAG,IAC5BpE,KAAK2B,cAAclB,QAAe,WAAP+G,KAAuB,IAClDxH,KAAK2B,cAAclB,QAAe,SAAP+G,KAAuB,IAClDxH,KAAK2B,cAAclB,QAAe,MAAP+G,KAAuB,GAClDxH,KAAK2B,cAAclB,OAAe,IAAP+G,GAC3BxH,KAAK2B,cAAclB,QAAc,WAANgH,KAAsB,IACjDzH,KAAK2B,cAAclB,QAAc,SAANgH,KAAsB,IACjDzH,KAAK2B,cAAclB,QAAc,MAANgH,KAAsB,GACjDzH,KAAK2B,cAAclB,OAAc,IAANgH,EAC7B,EAEA/F,EAAOlB,UAAUiG,UAAY,SAAUD,GACrCxG,KAAK2B,cAAclB,OAAa,IAAN+F,EAC5B,EAEA9E,EAAOlB,UAAUkG,WAAa,SAAUF,GACtCxG,KAAK2B,cAAclB,QAAc,MAAN+F,IAAiB,GAC5CxG,KAAK2B,cAAclB,OAAa,IAAN+F,EAC5B,EAEA9E,EAAOlB,UAAUmG,WAAa,SAAUH,GACtCxG,KAAK2B,cAAclB,OAAO+F,IAAS,GAAM,KACzCxG,KAAK2B,cAAclB,QAAc,SAAN+F,KAAsB,IACjDxG,KAAK2B,cAAclB,QAAc,MAAN+F,KAAsB,GACjDxG,KAAK2B,cAAclB,OAAc,IAAN+F,EAC7B,EAEA9E,EAAOlB,UAAUoG,WAAa,SAAUJ,GACtC,IAAIgB,EAAOrD,KAAKiB,MAAMoB,EAAMrC,KAAKC,IAAI,EAAG,KACpCqD,EAAMjB,EAAMrC,KAAKC,IAAI,EAAG,IAC5BpE,KAAK2B,cAAclB,QAAe,WAAP+G,KAAuB,IAClDxH,KAAK2B,cAAclB,QAAe,SAAP+G,KAAuB,IAClDxH,KAAK2B,cAAclB,QAAe,MAAP+G,KAAuB,GAClDxH,KAAK2B,cAAclB,OAAe,IAAP+G,GAC3BxH,KAAK2B,cAAclB,QAAc,WAANgH,KAAsB,IACjDzH,KAAK2B,cAAclB,QAAc,SAANgH,KAAsB,IACjDzH,KAAK2B,cAAclB,QAAc,MAANgH,KAAsB,GACjDzH,KAAK2B,cAAclB,OAAc,IAANgH,EAC7B,EEzfA,IAAIC,GAAe,EACfC,GAAuB,EAUpB,SAASC,EAAeC,EAAUC,EAAMC,GAC7C,IAAMC,EAAQH,EAASG,MAAMF,GAC7B,OAAOE,GAASA,EAAMnH,QAAUkH,GAAOE,SAASD,EAAMD,GAAM,GAC9D,CAKO,SAASG,EAAwBC,EAAQC,EAAiBC,GAC/D,GAAKF,EAAOG,kBAAZ,CAGA,IAAMC,EAAQJ,EAAOG,kBAAkB9H,UACjCgI,EAAyBD,EAAME,iBACrCF,EAAME,iBAAmB,SAASC,EAAiBC,GACjD,GAAID,IAAoBN,EACtB,OAAOI,EAAuBI,MAAM5I,KAAM6I,WAE5C,IAAMC,EAAkB,SAACpJ,GACvB,IAAMqJ,EAAgBV,EAAQ3I,GAC1BqJ,IACEJ,EAAGK,YACLL,EAAGK,YAAYD,GAEfJ,EAAGI,GAGT,EAMA,OALA/I,KAAKiJ,UAAYjJ,KAAKiJ,WAAa,CAAC,EAC/BjJ,KAAKiJ,UAAUb,KAClBpI,KAAKiJ,UAAUb,GAAmB,IAAIc,KAExClJ,KAAKiJ,UAAUb,GAAiBe,IAAIR,EAAIG,GACjCN,EAAuBI,MAAM5I,KAAM,CAAC0I,EACzCI,GACJ,EAEA,IAAMM,EAA4Bb,EAAMc,oBACxCd,EAAMc,oBAAsB,SAASX,EAAiBC,GACpD,GAAID,IAAoBN,IAAoBpI,KAAKiJ,YACzCjJ,KAAKiJ,UAAUb,GACrB,OAAOgB,EAA0BR,MAAM5I,KAAM6I,WAE/C,IAAK7I,KAAKiJ,UAAUb,GAAiBkB,IAAIX,GACvC,OAAOS,EAA0BR,MAAM5I,KAAM6I,WAE/C,IAAMU,EAAcvJ,KAAKiJ,UAAUb,GAAiBoB,IAAIb,GAQxD,OAPA3I,KAAKiJ,UAAUb,GAAiB,OAAOO,GACM,IAAzC3I,KAAKiJ,UAAUb,GAAiBvI,aAC3BG,KAAKiJ,UAAUb,GAEmB,IAAvChG,OAAOgF,KAAKpH,KAAKiJ,WAAWpI,eACvBb,KAAKiJ,UAEPG,EAA0BR,MAAM5I,KAAM,CAAC0I,EAC5Ca,GACJ,EAEAnH,OAAOC,eAAekG,EAAO,KAAOH,EAAiB,CACnDoB,IAAA,WACE,OAAOxJ,KAAK,MAAQoI,EACtB,EACAe,IAAA,SAAIR,GACE3I,KAAK,MAAQoI,KACfpI,KAAKqJ,oBAAoBjB,EACvBpI,KAAK,MAAQoI,WACRpI,KAAK,MAAQoI,IAElBO,GACF3I,KAAKyI,iBAAiBL,EACpBpI,KAAK,MAAQoI,GAAmBO,EAEtC,EACArG,YAAY,EACZC,cAAc,GAhEd,CAkEJ,CAEO,SAASkH,EAAWC,GACzB,MAAoB,kBAATA,EACF,IAAIrF,MAAM,wBAA2B,IAAAqF,EAAA,YAAPvK,EAAOuK,IACxC,4BAENhC,EAAegC,EACRA,EAAS,8BACd,6BACJ,CAMO,SAASC,EAAgBD,GAC9B,MAAoB,kBAATA,EACF,IAAIrF,MAAM,wBAA2B,IAAAqF,EAAA,YAAPvK,EAAOuK,IACxC,4BAEN/B,GAAwB+B,EACjB,oCAAsCA,EAAO,WAAa,WACnE,CAEO,SAASE,IACd,GAAsB,iBAAXzJ,OAAqB,CAC9B,GAAIuH,EACF,OAEqB,oBAAZmC,SAAkD,mBAAhBA,QAAQ9C,KACnD8C,QAAQ9C,IAAI6B,MAAMiB,QAAShB,UAE/B,CACF,CAKO,SAASiB,EAAWC,EAAWC,GAC/BrC,GAGLkC,QAAQI,KAAKF,EAAY,8BAAgCC,EACrD,YACN,CAsDA,SAASE,EAASC,GAChB,MAA+C,oBAAxC/H,OAAO5B,UAAUoF,SAASwE,KAAKD,EACxC,CAOO,SAASE,EAAc3J,GAC5B,OAAKwJ,EAASxJ,GAIP0B,OAAOgF,KAAK1G,GAAM4J,QAAO,SAASC,EAAarI,GACpD,IAAMsI,EAAQN,EAASxJ,EAAKwB,IACtBC,EAAQqI,EAAQH,EAAc3J,EAAKwB,IAAQxB,EAAKwB,GAChDuI,EAAgBD,IAAUpI,OAAOgF,KAAKjF,GAAOtB,OACnD,YAAc6J,IAAVvI,GAAuBsI,EAClBF,EAEFnI,OAAOuI,OAAOJ,EAActI,EAAA,GAACC,EAAMC,GAC5C,GAAG,CAAC,GAXKzB,CAYX,CAGO,SAASkK,EAAUC,EAAOC,EAAMC,GAChCD,IAAQC,EAAUzB,IAAIwB,EAAKE,MAGhCD,EAAU5B,IAAI2B,EAAKE,GAAIF,GACvB1I,OAAOgF,KAAK0D,GAAMG,SAAQ,SAAAC,GACpBA,EAAKC,SAAS,MAChBP,EAAUC,EAAOA,EAAMrB,IAAIsB,EAAKI,IAAQH,GAC/BG,EAAKC,SAAS,QACvBL,EAAKI,GAAMD,SAAQ,SAAAD,GACjBJ,EAAUC,EAAOA,EAAMrB,IAAIwB,GAAKD,EAClC,GAEJ,IACF,CAGO,SAASK,EAAYC,EAAQC,EAAOC,GACzC,IAAMC,EAAkBD,EAAW,eAAiB,cAC9CE,EAAiB,IAAIvC,IAC3B,GAAc,OAAVoC,EACF,OAAOG,EAET,IAAMC,EAAa,GAcnB,OAbAL,EAAOJ,SAAQ,SAAA9I,GACM,UAAfA,EAAMU,MACNV,EAAMwJ,kBAAoBL,EAAMN,IAClCU,EAAW/K,KAAKwB,EAEpB,IACAuJ,EAAWT,SAAQ,SAAAW,GACjBP,EAAOJ,SAAQ,SAAAJ,GACTA,EAAMhI,OAAS2I,GAAmBX,EAAMgB,UAAYD,EAAUZ,IAChEJ,EAAUS,EAAQR,EAAOY,EAE7B,GACF,IACOA,CACT,C,SCpQe,SAAAK,EAAyBC,GACtC,GAAInH,MAAMoH,QAAQD,GAAM,OAAOA,CACjC,CCFe,SAAAE,EAA0BC,GACvC,GAAsB,oBAAX5M,QAAmD,MAAzB4M,EAAK5M,OAAO6M,WAA2C,MAAtBD,EAAK,cAAuB,OAAOtH,MAAMwH,KAAKF,EACtH,CCFe,SAAAG,IACb,MAAM,IAAIC,UAAU,6IACtB,CCFe,SAAAC,EAA2BR,EAAKS,IAClC,MAAPA,GAAeA,EAAMT,EAAIlL,UAAQ2L,EAAMT,EAAIlL,QAC/C,IAAK,IAAIK,EAAI,EAAGuL,EAAO,IAAI7H,MAAM4H,GAAMtL,EAAIsL,EAAKtL,IAAKuL,EAAKvL,GAAK6K,EAAI7K,GACnE,OAAOuL,CACT,CCFe,SAAAC,EAAqCC,EAAGC,GACrD,GAAKD,EAAL,CACA,GAAiB,iBAANA,EAAgB,OAAOJ,EAAkBI,EAAGC,GACvD,IAAIrF,EAAInF,OAAO5B,UAAUoF,SAASwE,KAAKuC,GAAGrI,MAAM,GAAG,GAEnD,MADU,WAANiD,GAAkBoF,EAAEtN,cAAakI,EAAIoF,EAAEtN,YAAY6L,MAC7C,QAAN3D,GAAqB,QAANA,EAAoB3C,MAAMwH,KAAK7E,GACxC,cAANA,GAAqB,2CAA2CsF,KAAKtF,GAChEgF,EAAkBI,EAAGC,QAD9B,CALQ,CAOV,CCLe,SAAAE,EAAwBf,EAAK7K,GAC1C,OAAO4K,EAAeC,IAAQE,EAAqBF,IAAWW,EAA2BX,EAAK7K,IAAMmL,GACtG,C,4iBCGA,IAAMU,EAAUnD,EAET,SAASoD,EAAiB7M,EAAQ8M,GACvC,IAAMC,EAAY/M,GAAUA,EAAO+M,UAEnC,GAAKA,EAAUC,aAAf,CAIA,IAAMC,EAAuB,SAAS7I,GACpC,GAAiB,iBAANA,GAAkBA,EAAE8I,WAAa9I,EAAE+I,SAC5C,OAAO/I,EAET,IAAMgJ,EAAK,CAAC,EA4CZ,OA3CAnL,OAAOgF,KAAK7C,GAAG0G,SAAQ,SAAA/I,GACrB,GAAY,YAARA,GAA6B,aAARA,GAA8B,gBAARA,EAA/C,CAGA,IAAMsL,EAAuB,iBAAXjJ,EAAErC,GAAqBqC,EAAErC,GAAO,CAACuL,MAAOlJ,EAAErC,SAC5CwI,IAAZ8C,EAAEE,OAA0C,iBAAZF,EAAEE,QACpCF,EAAEG,IAAMH,EAAEI,IAAMJ,EAAEE,OAEpB,IAAMG,EAAW,SAASC,EAAQ5C,GAChC,OAAI4C,EACKA,EAAS5C,EAAK6C,OAAO,GAAGC,cAAgB9C,EAAK5G,MAAM,GAE3C,aAAV4G,EAAwB,WAAaA,CAC9C,EACA,QAAgBR,IAAZ8C,EAAEC,MAAqB,CACzBF,EAAGD,SAAWC,EAAGD,UAAY,GAC7B,IAAIW,EAAK,CAAC,EACa,iBAAZT,EAAEC,OACXQ,EAAGJ,EAAS,MAAO3L,IAAQsL,EAAEC,MAC7BF,EAAGD,SAAS3M,KAAKsN,IACjBA,EAAK,CAAC,GACHJ,EAAS,MAAO3L,IAAQsL,EAAEC,MAC7BF,EAAGD,SAAS3M,KAAKsN,KAEjBA,EAAGJ,EAAS,GAAI3L,IAAQsL,EAAEC,MAC1BF,EAAGD,SAAS3M,KAAKsN,GAErB,MACgBvD,IAAZ8C,EAAEE,OAA0C,iBAAZF,EAAEE,OACpCH,EAAGF,UAAYE,EAAGF,WAAa,CAAC,EAChCE,EAAGF,UAAUQ,EAAS,GAAI3L,IAAQsL,EAAEE,OAEpC,CAAC,MAAO,OAAOzC,SAAQ,SAAAiD,QACNxD,IAAX8C,EAAEU,KACJX,EAAGF,UAAYE,EAAGF,WAAa,CAAC,EAChCE,EAAGF,UAAUQ,EAASK,EAAKhM,IAAQsL,EAAEU,GAEzC,GAnCA,CAqCJ,IACI3J,EAAE4J,WACJZ,EAAGD,UAAYC,EAAGD,UAAY,IAAIc,OAAO7J,EAAE4J,WAEtCZ,CACT,EAEMc,EAAmB,SAASC,EAAaC,GAC7C,GAAItB,EAAeuB,SAAW,GAC5B,OAAOD,EAAKD,GAGd,IADAA,EAAcG,KAAKC,MAAMD,KAAKE,UAAUL,MACQ,iBAAtBA,EAAYM,MAAoB,CACxD,IAAMC,EAAQ,SAASzP,EAAK0P,EAAGC,GACzBD,KAAK1P,KAAS2P,KAAK3P,KACrBA,EAAI2P,GAAK3P,EAAI0P,UACN1P,EAAI0P,GAEf,EAEAD,GADAP,EAAcG,KAAKC,MAAMD,KAAKE,UAAUL,KACtBM,MAAO,kBAAmB,uBAC5CC,EAAMP,EAAYM,MAAO,mBAAoB,wBAC7CN,EAAYM,MAAQxB,EAAqBkB,EAAYM,MACvD,CACA,GAAIN,GAA4C,iBAAtBA,EAAYU,MAAoB,CAExD,IAAIC,EAAOX,EAAYU,MAAME,WAC7BD,EAAOA,IAA0B,iBAATA,EAAqBA,EAAO,CAACxB,MAAOwB,IAC5D,IAQME,EARAC,EAA6BnC,EAAeuB,QAAU,GAE5D,GAAIS,IAAyB,SAAfA,EAAKvB,OAAmC,gBAAfuB,EAAKvB,OACf,SAAfuB,EAAKxB,OAAmC,gBAAfwB,EAAKxB,UACtCP,EAAUC,aAAakC,0BACvBnC,EAAUC,aAAakC,0BAA0BH,YAChDE,GAQL,UAPOd,EAAYU,MAAME,WAEN,gBAAfD,EAAKvB,OAA0C,gBAAfuB,EAAKxB,MACvC0B,EAAU,CAAC,OAAQ,QACK,SAAfF,EAAKvB,OAAmC,SAAfuB,EAAKxB,QACvC0B,EAAU,CAAC,UAETA,EAEF,OAAOjC,EAAUC,aAAamC,mBAC3BC,MAAK,SAAAC,GAEJ,IAAIC,GADJD,EAAUA,EAAQE,QAAO,SAAAC,G,MAAgB,eAAXA,EAAEC,I,KACdC,MAAK,SAAAF,G,OAAKR,EAAQW,MAAK,SAAA9H,G,OACvC2H,EAAEI,MAAMC,cAAcC,SAASjI,E,OAWjC,OAVKyH,GAAOD,EAAQ3O,QAAUsO,EAAQc,SAAS,UAC7CR,EAAMD,EAAQA,EAAQ3O,OAAS,IAE7B4O,IACFnB,EAAYU,MAAMkB,SAAWjB,EAAKvB,MAC9B,CAACA,MAAO+B,EAAIS,UACZ,CAACzC,MAAOgC,EAAIS,WAElB5B,EAAYU,MAAQ5B,EAAqBkB,EAAYU,OACrDjC,EAAQ,WAAa0B,KAAKE,UAAUL,IAC7BC,EAAKD,EACd,IAGNA,EAAYU,MAAQ5B,EAAqBkB,EAAYU,MACvD,CAEA,OADAjC,EAAQ,WAAa0B,KAAKE,UAAUL,IAC7BC,EAAKD,EACd,EAEM6B,EAAa,SAASzQ,GAC1B,OAAIuN,EAAeuB,SAAW,GACrB9O,EAEF,CACLwL,KAAM,CACJkF,sBAAuB,kBACvBC,yBAA0B,kBAC1BC,kBAAmB,kBACnBC,qBAAsB,gBACtBC,4BAA6B,uBAC7BC,gBAAiB,mBACjBC,+BAAgC,kBAChCC,wBAAyB,kBACzBC,gBAAiB,aACjBC,mBAAoB,aACpBC,mBAAoB,cACpBpR,EAAEwL,OAASxL,EAAEwL,KACf6F,QAASrR,EAAEqR,QACXC,WAAYtR,EAAEsR,YAActR,EAAEuR,eAC9BrL,SAAA,WACE,OAAO5F,KAAKkL,MAAQlL,KAAK+Q,SAAW,MAAQ/Q,KAAK+Q,OACnD,EAEJ,EAgBA,GALA7D,EAAUgE,aATY,SAAS5C,EAAa6C,EAAWC,GACrD/C,EAAiBC,GAAa,SAAA/J,GAC5B2I,EAAUmE,mBAAmB9M,EAAG4M,GAAW,SAAAzR,GACrC0R,GACFA,EAAQjB,EAAWzQ,GAEvB,GACF,GACF,EACuC4R,KAAKpE,GAKxCA,EAAUC,aAAa+D,aAAc,CACvC,IAAMK,EAAmBrE,EAAUC,aAAa+D,aAC9CI,KAAKpE,EAAUC,cACjBD,EAAUC,aAAa+D,aAAe,SAASM,GAC7C,OAAOnD,EAAiBmD,GAAI,SAAAjN,G,OAAKgN,EAAiBhN,GAAGgL,MAAK,SAAAkC,GACxD,GAAIlN,EAAEqK,QAAU6C,EAAOC,iBAAiB7Q,QACpC0D,EAAEyK,QAAUyC,EAAOE,iBAAiB9Q,OAItC,MAHA4Q,EAAOG,YAAY3G,SAAQ,SAAAK,GACzBA,EAAMuG,MACR,IACM,IAAIC,aAAa,GAAI,iBAE7B,OAAOL,CACT,IAAG,SAAA/R,G,OAAKqS,QAAQC,OAAO7B,EAAWzQ,G,MACpC,CACF,CA3KE,CA4KJ,CCnLO,SAASuS,EAAoB9R,EAAQ+R,GACtC/R,EAAO+M,UAAUC,cACnB,oBAAqBhN,EAAO+M,UAAUC,cAGlChN,EAAO+M,UAAUC,eAKI,mBAAhB+E,EAKX/R,EAAO+M,UAAUC,aAAagF,gBAC5B,SAAyB7D,GACvB,OAAO4D,EAAY5D,GAChBiB,MAAK,SAAA6C,GACJ,IAAMC,EAAiB/D,EAAYU,OAASV,EAAYU,MAAMsD,MACxDC,EAAkBjE,EAAYU,OAClCV,EAAYU,MAAMwD,OACdC,EAAqBnE,EAAYU,OACrCV,EAAYU,MAAM0D,UAcpB,OAbApE,EAAYU,MAAQ,CAClB3B,UAAW,CACTsF,kBAAmB,UACnBC,oBAAqBR,EACrBS,aAAcJ,GAAsB,IAGpCJ,IACF/D,EAAYU,MAAM3B,UAAUyF,SAAWT,GAErCE,IACFjE,EAAYU,MAAM3B,UAAU0F,UAAYR,GAEnCpS,EAAO+M,UAAUC,aAAa+D,aAAa5C,EACpD,GACJ,EA5BAzE,QAAQmJ,MAAM,+DA6BlB,CCnCO,SAASC,EAAgB9S,GAC9BA,EAAO+S,YAAc/S,EAAO+S,aAAe/S,EAAOgT,iBACpD,CAEO,SAASC,EAAYjT,GAC1B,GAAsB,iBAAXA,GAAuBA,EAAOmI,qBAAuB,YAC5DnI,EAAOmI,kBAAkB9H,WAAY,CACvC4B,OAAOC,eAAelC,EAAOmI,kBAAkB9H,UAAW,UAAW,CACnEgJ,IAAA,WACE,OAAOxJ,KAAKqT,QACd,EACAlK,IAAA,SAAImK,GACEtT,KAAKqT,UACPrT,KAAKqJ,oBAAoB,QAASrJ,KAAKqT,UAEzCrT,KAAKyI,iBAAiB,QAASzI,KAAKqT,SAAWC,EACjD,EACAhR,YAAY,EACZC,cAAc,IAEhB,IAAMgR,EACFpT,EAAOmI,kBAAkB9H,UAAUgT,qBACvCrT,EAAOmI,kBAAkB9H,UAAUgT,qBACjC,W,WAuCE,OAtCKxT,KAAKyT,eACRzT,KAAKyT,aAAe,SAAC/T,GAGnBA,EAAE+R,OAAOhJ,iBAAiB,YAAY,SAAAiL,GACpC,IAAIC,EAEFA,EADExT,EAAOmI,kBAAkB9H,UAAUoT,aAC1BC,EAAKD,eACb/D,MAAK,SAAArC,G,OAAKA,EAAElC,OAASkC,EAAElC,MAAMN,KAAO0I,EAAGpI,MAAMN,E,IAErC,CAACM,MAAOoI,EAAGpI,OAGxB,IAAMwI,EAAQ,IAAIC,MAAM,SACxBD,EAAMxI,MAAQoI,EAAGpI,MACjBwI,EAAMH,SAAWA,EACjBG,EAAME,YAAc,CAACL,YACrBG,EAAMG,QAAU,CAACvU,EAAE+R,QACnBoC,EAAKK,cAAcJ,EACrB,IACApU,EAAE+R,OAAOG,YAAY3G,SAAQ,SAAAK,GAC3B,IAAIqI,EAEFA,EADExT,EAAOmI,kBAAkB9H,UAAUoT,aAC1BC,EAAKD,eACb/D,MAAK,SAAArC,G,OAAKA,EAAElC,OAASkC,EAAElC,MAAMN,KAAOM,EAAMN,E,IAElC,CAACM,SAEd,IAAMwI,EAAQ,IAAIC,MAAM,SACxBD,EAAMxI,MAAQA,EACdwI,EAAMH,SAAWA,EACjBG,EAAME,YAAc,CAACL,YACrBG,EAAMG,QAAU,CAACvU,EAAE+R,QACnBoC,EAAKK,cAAcJ,EACrB,GACF,EACA9T,KAAKyI,iBAAiB,YAAazI,KAAKyT,eAEnCF,EAAyB3K,MAAM5I,KAAM6I,UAC9C,CACJ,MAIEX,EAA8B/H,EAAQ,SAAS,SAAAT,GAK7C,OAJKA,EAAEsU,aACL5R,OAAOC,eAAe3C,EAAG,cACvB,CAACyC,MAAO,CAACwR,SAAUjU,EAAEiU,YAElBjU,CACT,GAEJ,CAEO,SAASyU,EAAuBhU,GAErC,GAAsB,iBAAXA,GAAuBA,EAAOmI,qBACnC,eAAgBnI,EAAOmI,kBAAkB9H,YAC3C,qBAAsBL,EAAOmI,kBAAkB9H,UAAW,CAC5D,IAAM4T,EAAqB,SAASC,EAAI/I,GACtC,MAAO,CACLA,QACIgJ,WAQF,YAPmB5J,IAAf1K,KAAKuU,QACY,UAAfjJ,EAAMsE,KACR5P,KAAKuU,MAAQF,EAAGG,iBAAiBlJ,GAEjCtL,KAAKuU,MAAQ,MAGVvU,KAAKuU,KACd,EACAE,IAAKJ,EAET,EAGA,IAAKlU,EAAOmI,kBAAkB9H,UAAUkU,WAAY,CAClDvU,EAAOmI,kBAAkB9H,UAAUkU,WAAa,WAE9C,OADA1U,KAAK2U,SAAW3U,KAAK2U,UAAY,GAC1B3U,KAAK2U,SAASrQ,OACvB,EACA,IAAMsQ,EAAezU,EAAOmI,kBAAkB9H,UAAUqU,SACxD1U,EAAOmI,kBAAkB9H,UAAUqU,SACjC,SAAkBvJ,EAAOmG,GACvB,IAAIqD,EAASF,EAAahM,MAAM5I,KAAM6I,WAKtC,OAJKiM,IACHA,EAASV,EAAmBpU,KAAMsL,GAClCtL,KAAK2U,SAAShU,KAAKmU,IAEdA,CACT,EAEF,IAAMC,EAAkB5U,EAAOmI,kBAAkB9H,UAAUwU,YAC3D7U,EAAOmI,kBAAkB9H,UAAUwU,YACjC,SAAqBF,GACnBC,EAAgBnM,MAAM5I,KAAM6I,WAC5B,IAAMoM,EAAMjV,KAAK2U,SAASO,QAAQJ,IACtB,IAARG,GACFjV,KAAK2U,SAASQ,OAAOF,EAAK,EAE9B,CACJ,CACA,IAAMG,EAAgBjV,EAAOmI,kBAAkB9H,UAAU6U,UACzDlV,EAAOmI,kBAAkB9H,UAAU6U,UAAY,SAAmB5D,G,WAChEzR,KAAK2U,SAAW3U,KAAK2U,UAAY,GACjCS,EAAcxM,MAAM5I,KAAM,CAACyR,IAC3BA,EAAOG,YAAY3G,SAAQ,SAAAK,GACzBuI,EAAKc,SAAShU,KAAKyT,EAAAP,EAAyBvI,GAC9C,GACF,EAEA,IAAMgK,EAAmBnV,EAAOmI,kBAAkB9H,UAAU+U,aAC5DpV,EAAOmI,kBAAkB9H,UAAU+U,aACjC,SAAsB9D,G,WACpBzR,KAAK2U,SAAW3U,KAAK2U,UAAY,GACjCW,EAAiB1M,MAAM5I,KAAM,CAACyR,IAE9BA,EAAOG,YAAY3G,SAAQ,SAAAK,GACzB,IAAMwJ,EAASjB,EAAKc,SAAS9E,MAAK,SAAA2F,G,OAAKA,EAAElK,QAAUA,C,IAC/CwJ,GACFjB,EAAKc,SAASQ,OAAOtB,EAAKc,SAASO,QAAQJ,GAAS,EAExD,GACF,CACJ,MAAO,GAAsB,iBAAX3U,GAAuBA,EAAOmI,mBACrC,eAAgBnI,EAAOmI,kBAAkB9H,WACzC,qBAAsBL,EAAOmI,kBAAkB9H,WAC/CL,EAAOsV,gBACL,SAAUtV,EAAOsV,aAAajV,WAAY,CACrD,IAAMkV,EAAiBvV,EAAOmI,kBAAkB9H,UAAUkU,WAC1DvU,EAAOmI,kBAAkB9H,UAAUkU,WAAa,W,WACxCiB,EAAUD,EAAe9M,MAAM5I,KAAM,IAE3C,OADA2V,EAAQ1K,SAAQ,SAAA6J,G,OAAUA,EAAOL,IAAGZ,C,IAC7B8B,CACT,EAEAvT,OAAOC,eAAelC,EAAOsV,aAAajV,UAAW,OAAQ,CAC3DgJ,IAAA,WAQE,YAPmBkB,IAAf1K,KAAKuU,QACiB,UAApBvU,KAAKsL,MAAMsE,KACb5P,KAAKuU,MAAQvU,KAAKyU,IAAID,iBAAiBxU,KAAKsL,OAE5CtL,KAAKuU,MAAQ,MAGVvU,KAAKuU,KACd,GAEJ,CACF,CAEO,SAASqB,EAAazV,GAC3B,GAAKA,EAAOmI,kBAAZ,CAIA,IAAMuN,EAAe1V,EAAOmI,kBAAkB9H,UAAUsV,SACxD3V,EAAOmI,kBAAkB9H,UAAUsV,SAAW,W,WACVC,EAAAjJ,EAAAjE,UAAA,GAA3BmN,EAA2BD,EAAA,GAAjBE,EAAiBF,EAAA,GAATG,EAASH,EAAA,GAIlC,GAAIlN,UAAUhI,OAAS,GAAyB,mBAAbmV,EACjC,OAAOH,EAAajN,MAAM5I,KAAM6I,WAKlC,GAA4B,IAAxBgN,EAAahV,SAAsC,IAArBgI,UAAUhI,QACpB,mBAAbmV,GACT,OAAOH,EAAajN,MAAM5I,KAAM,IAGlC,IAAMmW,EAAkB,SAASC,GAC/B,IAAMC,EAAiB,CAAC,EAiBxB,OAhBgBD,EAAS/K,SACjBJ,SAAQ,SAAAqL,GACd,IAAMC,EAAgB,CACpBvL,GAAIsL,EAAOtL,GACXwL,UAAWF,EAAOE,UAClB3T,KAAM,CACJ4T,eAAgB,kBAChBC,gBAAiB,oBACjBJ,EAAOzT,OAASyT,EAAOzT,MAE3ByT,EAAOK,QAAQ1L,SAAQ,SAAAC,GACrBqL,EAAcrL,GAAQoL,EAAOM,KAAK1L,EACpC,IACAmL,EAAeE,EAAcvL,IAAMuL,CACrC,IAEOF,CACT,EAGMQ,EAAe,SAAShM,GAC5B,OAAO,IAAI3B,IAAI9G,OAAOgF,KAAKyD,GAAOhG,KAAI,SAAA3C,G,MAAO,CAACA,EAAK2I,EAAM3I,G,IAC3D,EAEA,GAAI2G,UAAUhI,QAAU,EAAG,CAKzB,OAAOgV,EAAajN,MAAM5I,KAAM,CAJA,SAASoW,GACvCH,EAAOY,EAAaV,EAAgBC,IACtC,EAGEJ,GACJ,CAGA,OAAO,IAAIjE,SAAQ,SAAC+E,EAAS9E,GAC3B6D,EAAajN,MAAKiL,EAAO,CACvB,SAASuC,GACPU,EAAQD,EAAaV,EAAgBC,IACvC,EAAGpE,GACP,IAAGzC,KAAK0G,EAAQC,EAClB,CA9DE,CA+DJ,CAEO,SAASa,EAA2B5W,GACzC,GAAwB,iBAAXA,GAAuBA,EAAOmI,mBACvCnI,EAAOsV,cAAgBtV,EAAO6W,eADlC,CAMA,KAAM,aAAc7W,EAAOsV,aAAajV,WAAY,CAClD,IAAMkV,EAAiBvV,EAAOmI,kBAAkB9H,UAAUkU,WACtDgB,IACFvV,EAAOmI,kBAAkB9H,UAAUkU,WAAa,W,WACxCiB,EAAUD,EAAe9M,MAAM5I,KAAM,IAE3C,OADA2V,EAAQ1K,SAAQ,SAAA6J,G,OAAUA,EAAOL,IAAGZ,C,IAC7B8B,CACT,GAGF,IAAMf,EAAezU,EAAOmI,kBAAkB9H,UAAUqU,SACpDD,IACFzU,EAAOmI,kBAAkB9H,UAAUqU,SAAW,WAC5C,IAAMC,EAASF,EAAahM,MAAM5I,KAAM6I,WAExC,OADAiM,EAAOL,IAAMzU,KACN8U,CACT,GAEF3U,EAAOsV,aAAajV,UAAUsV,SAAW,WACvC,IAAMhB,EAAS9U,KACf,OAAOA,KAAKyU,IAAIqB,WAAWvG,MAAK,SAAAlE,G,OAK9BD,EAAkBC,EAAQyJ,EAAOxJ,OAAO,E,GAC5C,CACF,CAGA,KAAM,aAAcnL,EAAO6W,eAAexW,WAAY,CACpD,IAAMyW,EAAmB9W,EAAOmI,kBAAkB9H,UAAUoT,aACxDqD,IACF9W,EAAOmI,kBAAkB9H,UAAUoT,aACjC,W,WACQsD,EAAYD,EAAiBrO,MAAM5I,KAAM,IAE/C,OADAkX,EAAUjM,SAAQ,SAAA0I,G,OAAYA,EAASc,IAAGZ,C,IACnCqD,CACT,GAEJhP,EAA8B/H,EAAQ,SAAS,SAAAT,GAE7C,OADAA,EAAEiU,SAASc,IAAM/U,EAAEyX,WACZzX,CACT,IACAS,EAAO6W,eAAexW,UAAUsV,SAAW,WACzC,IAAMnC,EAAW3T,KACjB,OAAOA,KAAKyU,IAAIqB,WAAWvG,MAAK,SAAAlE,G,OAC9BD,EAAkBC,EAAQsI,EAASrI,OAAO,E,GAC9C,CACF,CAEA,GAAM,aAAcnL,EAAOsV,aAAajV,WACpC,aAAcL,EAAO6W,eAAexW,UADxC,CAMA,IAAMqV,EAAe1V,EAAOmI,kBAAkB9H,UAAUsV,SACxD3V,EAAOmI,kBAAkB9H,UAAUsV,SAAW,WAC5C,GAAIjN,UAAUhI,OAAS,GACnBgI,UAAU,aAAc1I,EAAOiX,iBAAkB,CACnD,IACItC,EACAnB,EACA0D,EAHE/L,EAAQzC,UAAU,GAuBxB,OAnBA7I,KAAK0U,aAAazJ,SAAQ,SAAAuK,GACpBA,EAAElK,QAAUA,IACVwJ,EACFuC,GAAM,EAENvC,EAASU,EAGf,IACAxV,KAAK4T,eAAe3I,SAAQ,SAAAuC,GAQ1B,OAPIA,EAAElC,QAAUA,IACVqI,EACF0D,GAAM,EAEN1D,EAAWnG,GAGRA,EAAElC,QAAUA,CACrB,IACI+L,GAAQvC,GAAUnB,EACb5B,QAAQC,OAAO,IAAIF,aACxB,4DACA,uBACOgD,EACFA,EAAOgB,WACLnC,EACFA,EAASmC,WAEX/D,QAAQC,OAAO,IAAIF,aACxB,gDACA,sBACJ,CACA,OAAO+D,EAAajN,MAAM5I,KAAM6I,UAClC,CA7CE,CAzDA,CAuGJ,CAEO,SAASyO,EAAkCnX,GAIhDA,EAAOmI,kBAAkB9H,UAAU+W,gBACjC,W,WAEE,OADAvX,KAAKwX,qBAAuBxX,KAAKwX,sBAAwB,CAAC,EACnDpV,OAAOgF,KAAKpH,KAAKwX,sBACrB3S,KAAI,SAAA4S,G,OAAY5D,EAAK2D,qBAAqBC,GAAU,E,GACzD,EAEF,IAAM7C,EAAezU,EAAOmI,kBAAkB9H,UAAUqU,SACxD1U,EAAOmI,kBAAkB9H,UAAUqU,SACjC,SAAkBvJ,EAAOmG,GACvB,IAAKA,EACH,OAAOmD,EAAahM,MAAM5I,KAAM6I,WAElC7I,KAAKwX,qBAAuBxX,KAAKwX,sBAAwB,CAAC,EAE1D,IAAM1C,EAASF,EAAahM,MAAM5I,KAAM6I,WAMxC,OALK7I,KAAKwX,qBAAqB/F,EAAOzG,KAE8B,IAAzDhL,KAAKwX,qBAAqB/F,EAAOzG,IAAIkK,QAAQJ,IACtD9U,KAAKwX,qBAAqB/F,EAAOzG,IAAIrK,KAAKmU,GAF1C9U,KAAKwX,qBAAqB/F,EAAOzG,IAAM,CAACyG,EAAQqD,GAI3CA,CACT,EAEF,IAAMM,EAAgBjV,EAAOmI,kBAAkB9H,UAAU6U,UACzDlV,EAAOmI,kBAAkB9H,UAAU6U,UAAY,SAAmB5D,G,WAChEzR,KAAKwX,qBAAuBxX,KAAKwX,sBAAwB,CAAC,EAE1D/F,EAAOG,YAAY3G,SAAQ,SAAAK,GAEzB,GADsBuI,EAAKa,aAAa7E,MAAK,SAAA2F,G,OAAKA,EAAElK,QAAUA,C,IAE5D,MAAM,IAAIwG,aAAa,wBACrB,qBAEN,IACA,IAAM4F,EAAkB1X,KAAK0U,aAC7BU,EAAcxM,MAAM5I,KAAM6I,WAC1B,IAAM8O,EAAa3X,KAAK0U,aACrBhF,QAAO,SAAAkI,G,OAAoD,IAAvCF,EAAgBxC,QAAQ0C,E,IAC/C5X,KAAKwX,qBAAqB/F,EAAOzG,IAAM,CAACyG,GAAQrD,OAAOuJ,EACzD,EAEA,IAAMrC,EAAmBnV,EAAOmI,kBAAkB9H,UAAU+U,aAC5DpV,EAAOmI,kBAAkB9H,UAAU+U,aACjC,SAAsB9D,GAGpB,OAFAzR,KAAKwX,qBAAuBxX,KAAKwX,sBAAwB,CAAC,SACnDxX,KAAKwX,qBAAqB/F,EAAOzG,IACjCsK,EAAiB1M,MAAM5I,KAAM6I,UACtC,EAEF,IAAMkM,EAAkB5U,EAAOmI,kBAAkB9H,UAAUwU,YAC3D7U,EAAOmI,kBAAkB9H,UAAUwU,YACjC,SAAqBF,G,WAanB,OAZA9U,KAAKwX,qBAAuBxX,KAAKwX,sBAAwB,CAAC,EACtD1C,GACF1S,OAAOgF,KAAKpH,KAAKwX,sBAAsBvM,SAAQ,SAAAwM,GAC7C,IAAMxC,EAAMpB,EAAK2D,qBAAqBC,GAAUvC,QAAQJ,IAC5C,IAARG,GACFpB,EAAK2D,qBAAqBC,GAAUtC,OAAOF,EAAK,GAEC,IAA/CpB,EAAK2D,qBAAqBC,GAAU5W,eAC/BgT,EAAK2D,qBAAqBC,EAErC,IAEK1C,EAAgBnM,MAAM5I,KAAM6I,UACrC,CACJ,CAEO,SAASgP,EAAwB1X,EAAQ8M,G,IAyGrC6K,EAAT,SAAiCzD,EAAI0D,GACnC,IAAIC,EAAMD,EAAYC,IAOtB,OANA5V,OAAOgF,KAAKiN,EAAG4D,iBAAmB,IAAIhN,SAAQ,SAAAiN,GAC5C,IAAMC,EAAiB9D,EAAG4D,gBAAgBC,GACpCE,EAAiB/D,EAAGgE,SAASF,EAAenN,IAClDgN,EAAMA,EAAI3R,QAAQ,IAAIiS,OAAOF,EAAepN,GAAI,KAC9CmN,EAAenN,GACnB,IACO,IAAIuN,sBAAsB,CAC/B1V,KAAMkV,EAAYlV,KAClBmV,OAEJ,EACSQ,EAAT,SAAiCnE,EAAI0D,GACnC,IAAIC,EAAMD,EAAYC,IAOtB,OANA5V,OAAOgF,KAAKiN,EAAG4D,iBAAmB,IAAIhN,SAAQ,SAAAiN,GAC5C,IAAMC,EAAiB9D,EAAG4D,gBAAgBC,GACpCE,EAAiB/D,EAAGgE,SAASF,EAAenN,IAClDgN,EAAMA,EAAI3R,QAAQ,IAAIiS,OAAOH,EAAenN,GAAI,KAC9CoN,EAAepN,GACnB,IACO,IAAIuN,sBAAsB,CAC/B1V,KAAMkV,EAAYlV,KAClBmV,OAEJ,EAjIA,GAAK7X,EAAOmI,kBAAZ,CAIA,GAAInI,EAAOmI,kBAAkB9H,UAAUqU,UACnC5H,EAAeuB,SAAW,GAC5B,OAAO8I,EAAkCnX,GAK3C,IAAMsY,EAAsBtY,EAAOmI,kBAAkB9H,UAClD+W,gBACHpX,EAAOmI,kBAAkB9H,UAAU+W,gBACjC,W,WACQmB,EAAgBD,EAAoB7P,MAAM5I,MAEhD,OADAA,KAAKiY,gBAAkBjY,KAAKiY,iBAAmB,CAAC,EACzCS,EAAc7T,KAAI,SAAA4M,G,OAAUoC,EAAKoE,gBAAgBxG,EAAOzG,G,GACjE,EAEF,IAAMoK,EAAgBjV,EAAOmI,kBAAkB9H,UAAU6U,UACzDlV,EAAOmI,kBAAkB9H,UAAU6U,UAAY,SAAmB5D,G,WAahE,GAZAzR,KAAKqY,SAAWrY,KAAKqY,UAAY,CAAC,EAClCrY,KAAKiY,gBAAkBjY,KAAKiY,iBAAmB,CAAC,EAEhDxG,EAAOG,YAAY3G,SAAQ,SAAAK,GAEzB,GADsBuI,EAAKa,aAAa7E,MAAK,SAAA2F,G,OAAKA,EAAElK,QAAUA,C,IAE5D,MAAM,IAAIwG,aAAa,wBACrB,qBAEN,KAGK9R,KAAKiY,gBAAgBxG,EAAOzG,IAAK,CACpC,IAAM2N,EAAY,IAAIxY,EAAO+S,YAAYzB,EAAOG,aAChD5R,KAAKqY,SAAS5G,EAAOzG,IAAM2N,EAC3B3Y,KAAKiY,gBAAgBU,EAAU3N,IAAMyG,EACrCA,EAASkH,CACX,CACAvD,EAAcxM,MAAM5I,KAAM,CAACyR,GAC7B,EAEA,IAAM6D,EAAmBnV,EAAOmI,kBAAkB9H,UAAU+U,aAC5DpV,EAAOmI,kBAAkB9H,UAAU+U,aACjC,SAAsB9D,GACpBzR,KAAKqY,SAAWrY,KAAKqY,UAAY,CAAC,EAClCrY,KAAKiY,gBAAkBjY,KAAKiY,iBAAmB,CAAC,EAEhD3C,EAAiB1M,MAAM5I,KAAM,CAAEA,KAAKqY,SAAS5G,EAAOzG,KAAOyG,WACpDzR,KAAKiY,gBAAiBjY,KAAKqY,SAAS5G,EAAOzG,IAChDhL,KAAKqY,SAAS5G,EAAOzG,IAAIA,GAAKyG,EAAOzG,WAChChL,KAAKqY,SAAS5G,EAAOzG,GAC9B,EAEF7K,EAAOmI,kBAAkB9H,UAAUqU,SACjC,SAAkBvJ,EAAOmG,G,WACvB,GAA4B,WAAxBzR,KAAK4Y,eACP,MAAM,IAAI9G,aACR,sDACA,qBAEJ,IAAMmC,EAAU,GAAG3P,MAAM8F,KAAKvB,UAAW,GACzC,GAAuB,IAAnBoL,EAAQpT,SACPoT,EAAQ,GAAGrC,YAAY/B,MAAK,SAAAgJ,G,OAAKA,IAAMvN,C,IAG1C,MAAM,IAAIwG,aACR,gHAEA,qBAIJ,GADsB9R,KAAK0U,aAAa7E,MAAK,SAAA2F,G,OAAKA,EAAElK,QAAUA,C,IAE5D,MAAM,IAAIwG,aAAa,wBACrB,sBAGJ9R,KAAKqY,SAAWrY,KAAKqY,UAAY,CAAC,EAClCrY,KAAKiY,gBAAkBjY,KAAKiY,iBAAmB,CAAC,EAChD,IAAMa,EAAY9Y,KAAKqY,SAAS5G,EAAOzG,IACvC,GAAI8N,EAKFA,EAAUjE,SAASvJ,GAGnByG,QAAQ+E,UAAUvH,MAAK,WACrBsE,EAAKK,cAAc,IAAIH,MAAM,qBAC/B,QACK,CACL,IAAM4E,EAAY,IAAIxY,EAAO+S,YAAY,CAAC5H,IAC1CtL,KAAKqY,SAAS5G,EAAOzG,IAAM2N,EAC3B3Y,KAAKiY,gBAAgBU,EAAU3N,IAAMyG,EACrCzR,KAAKqV,UAAUsD,EACjB,CACA,OAAO3Y,KAAK0U,aAAa7E,MAAK,SAAA2F,G,OAAKA,EAAElK,QAAUA,C,GACjD,EA8BF,CAAC,cAAe,gBAAgBL,SAAQ,SAAS8N,GAC/C,IAAMC,EAAe7Y,EAAOmI,kBAAkB9H,UAAUuY,GAClDE,EAAahX,EAAA,GAAC8W,GAAD,W,WACXG,EAAOrQ,UAGb,OAFqBA,UAAUhI,QACH,mBAAjBgI,UAAU,GAEZmQ,EAAapQ,MAAM5I,KAAM,CAC9B,SAAC+X,GACC,IAAMoB,EAAOrB,EAAAjE,EAA8BkE,GAC3CmB,EAAK,GAAGtQ,MAAM,KAAM,CAACuQ,GACvB,EACA,SAAC9B,GACK6B,EAAK,IACPA,EAAK,GAAGtQ,MAAM,KAAMyO,EAExB,EAAGxO,UAAU,KAGVmQ,EAAapQ,MAAM5I,KAAM6I,WAC7B0G,MAAK,SAAAwI,G,OAAeD,EAAAjE,EAA8BkE,E,GACvD,IACA5X,EAAOmI,kBAAkB9H,UAAUuY,GAAUE,EAAUF,EACzD,IAEA,IAAMK,EACFjZ,EAAOmI,kBAAkB9H,UAAU6Y,oBACvClZ,EAAOmI,kBAAkB9H,UAAU6Y,oBACjC,WACE,OAAKxQ,UAAUhI,QAAWgI,UAAU,GAAGhG,MAGvCgG,UAAU,GAAK2P,EAAwBxY,KAAM6I,UAAU,IAChDuQ,EAAwBxQ,MAAM5I,KAAM6I,YAHlCuQ,EAAwBxQ,MAAM5I,KAAM6I,UAI/C,EAIF,IAAMyQ,EAAuBlX,OAAOmX,yBAClCpZ,EAAOmI,kBAAkB9H,UAAW,oBACtC4B,OAAOC,eAAelC,EAAOmI,kBAAkB9H,UAC7C,mBAAoB,CAClBgJ,IAAA,WACE,IAAMuO,EAAcuB,EAAqB9P,IAAIZ,MAAM5I,MACnD,MAAyB,KAArB+X,EAAYlV,KACPkV,EAEFD,EAAwB9X,KAAM+X,EACvC,IAGJ5X,EAAOmI,kBAAkB9H,UAAUwU,YACjC,SAAqBF,G,IAoBfrD,E,OAnBJ,GAA4B,WAAxBzR,KAAK4Y,eACP,MAAM,IAAI9G,aACR,sDACA,qBAIJ,IAAKgD,EAAOL,IACV,MAAM,IAAI3C,aAAa,yFAC2B,aAGpD,KADgBgD,EAAOL,MAAQzU,MAE7B,MAAM,IAAI8R,aAAa,6CACrB,sBAIJ9R,KAAKqY,SAAWrY,KAAKqY,UAAY,CAAC,EAElCjW,OAAOgF,KAAKpH,KAAKqY,UAAUpN,SAAQ,SAAAuO,GAChB3F,EAAKwE,SAASmB,GAAU5H,YACtC/B,MAAK,SAAAvE,G,OAASwJ,EAAOxJ,QAAUA,C,MAEhCmG,EAASoC,EAAKwE,SAASmB,GAE3B,IAEI/H,IACgC,IAA9BA,EAAOG,YAAY/Q,OAGrBb,KAAKuV,aAAavV,KAAKiY,gBAAgBxG,EAAOzG,KAG9CyG,EAAOuD,YAAYF,EAAOxJ,OAE5BtL,KAAKkU,cAAc,IAAIH,MAAM,sBAEjC,CA7NA,CA8NJ,CAEO,SAAS0F,EAAmBtZ,EAAQ8M,IACpC9M,EAAOmI,mBAAqBnI,EAAOuZ,0BAEtCvZ,EAAOmI,kBAAoBnI,EAAOuZ,yBAE/BvZ,EAAOmI,mBAKR2E,EAAeuB,QAAU,IAC3B,CAAC,sBAAuB,uBAAwB,mBAC7CvD,SAAQ,SAAS8N,GAChB,IAAMC,EAAe7Y,EAAOmI,kBAAkB9H,UAAUuY,GAClDE,EAAahX,EAAA,GAAC8W,GAAD,WAIjB,OAHAlQ,UAAU,GAAK,IAAiB,oBAAZkQ,EAClB5Y,EAAOwZ,gBACPxZ,EAAOoY,uBAAuB1P,UAAU,IACnCmQ,EAAapQ,MAAM5I,KAAM6I,UAClC,IACA1I,EAAOmI,kBAAkB9H,UAAUuY,GAAUE,EAAUF,EACzD,GAEN,CAGO,SAASa,EAAqBzZ,EAAQ8M,GAC3C/E,EAA8B/H,EAAQ,qBAAqB,SAAAT,GACzD,IAAM2U,EAAK3U,EAAEma,OACb,KAAI5M,EAAeuB,QAAU,IAAO6F,EAAGyF,kBACI,WAAvCzF,EAAGyF,mBAAmBC,eACE,WAAtB1F,EAAGuE,eAIT,OAAOlZ,CACT,GACF,C,SC3rBe,SAAAsa,EAA4BjO,GACzC,GAAInH,MAAMoH,QAAQD,GAAM,OAAOQ,EAAkBR,EACnD,CCJe,SAAAkO,IACb,MAAM,IAAI3N,UAAU,wIACtB,CCGe,SAAA4N,EAA4BnO,GACzC,OAAOiO,EAAkBjO,IAAQE,EAAgBF,IAAQW,EAA2BX,IAAQkO,GAC9F,CCKO,SAASE,EAAiBha,EAAQ8M,GACvC,IAAMC,EAAY/M,GAAUA,EAAO+M,UAC7BkK,EAAmBjX,GAAUA,EAAOiX,iBAS1C,GAPAlK,EAAUgE,aAAe,SAAS5C,EAAa6C,EAAWC,GAExDtH,EAAiB,yBACf,uCACFoD,EAAUC,aAAa+D,aAAa5C,GAAaiB,KAAK4B,EAAWC,EACnE,IAEMnE,EAAeuB,QAAU,IAC3B,oBAAqBtB,EAAUC,aAAakC,2BAA4B,CAC1E,IAAMR,EAAQ,SAASzP,EAAK0P,EAAGC,GACzBD,KAAK1P,KAAS2P,KAAK3P,KACrBA,EAAI2P,GAAK3P,EAAI0P,UACN1P,EAAI0P,GAEf,EAEMsL,EAAqBlN,EAAUC,aAAa+D,aAChDI,KAAKpE,EAAUC,cAUjB,GATAD,EAAUC,aAAa+D,aAAe,SAAS3M,GAM7C,MALiB,iBAANA,GAAqC,iBAAZA,EAAEqK,QACpCrK,EAAIkK,KAAKC,MAAMD,KAAKE,UAAUpK,IAC9BsK,EAAMtK,EAAEqK,MAAO,kBAAmB,sBAClCC,EAAMtK,EAAEqK,MAAO,mBAAoB,wBAE9BwL,EAAmB7V,EAC5B,EAEI6S,GAAoBA,EAAiB5W,UAAU6Z,YAAa,CAC9D,IAAMC,EAAoBlD,EAAiB5W,UAAU6Z,YACrDjD,EAAiB5W,UAAU6Z,YAAc,WACvC,IAAMjb,EAAMkb,EAAkB1R,MAAM5I,KAAM6I,WAG1C,OAFAgG,EAAMzP,EAAK,qBAAsB,mBACjCyP,EAAMzP,EAAK,sBAAuB,oBAC3BA,CACT,CACF,CAEA,GAAIgY,GAAoBA,EAAiB5W,UAAU+Z,iBAAkB,CACnE,IAAMC,EACJpD,EAAiB5W,UAAU+Z,iBAC7BnD,EAAiB5W,UAAU+Z,iBAAmB,SAAShW,GAMrD,MALkB,UAAdvE,KAAK4P,MAAiC,iBAANrL,IAClCA,EAAIkK,KAAKC,MAAMD,KAAKE,UAAUpK,IAC9BsK,EAAMtK,EAAG,kBAAmB,sBAC5BsK,EAAMtK,EAAG,mBAAoB,wBAExBiW,EAAuB5R,MAAM5I,KAAM,CAACuE,GAC7C,CACF,CACF,CACF,CCxDO,SAASkW,EAAoBta,EAAQua,GACtCva,EAAO+M,UAAUC,cACnB,oBAAqBhN,EAAO+M,UAAUC,cAGlChN,EAAO+M,UAAUC,eAGvBhN,EAAO+M,UAAUC,aAAagF,gBAC5B,SAAyB7D,GACvB,IAAMA,IAAeA,EAAYU,MAAQ,CACvC,IAAMqI,EAAM,IAAIvF,aAAa,0DAK7B,OAHAuF,EAAInM,KAAO,gBAEXmM,EAAItV,KAAO,EACJgQ,QAAQC,OAAOqF,EACxB,CAMA,OAL0B,IAAtB/I,EAAYU,MACdV,EAAYU,MAAQ,CAAC2L,YAAaD,GAElCpM,EAAYU,MAAM2L,YAAcD,EAE3Bva,EAAO+M,UAAUC,aAAa+D,aAAa5C,EACpD,EACJ,CCrBO,SAASsM,EAAYza,GACJ,iBAAXA,GAAuBA,EAAO0a,eACpC,aAAc1a,EAAO0a,cAAcra,aAClC,gBAAiBL,EAAO0a,cAAcra,YAC1C4B,OAAOC,eAAelC,EAAO0a,cAAcra,UAAW,cAAe,CACnEgJ,IAAA,WACE,MAAO,CAACmK,SAAU3T,KAAK2T,SACzB,GAGN,CAEO,SAASmH,EAAmB3a,EAAQ8M,GACzC,GAAsB,iBAAX9M,IACLA,EAAOmI,mBAAqBnI,EAAO4a,sBADzC,EAIK5a,EAAOmI,mBAAqBnI,EAAO4a,uBAEtC5a,EAAOmI,kBAAoBnI,EAAO4a,sBAGhC9N,EAAeuB,QAAU,IAE3B,CAAC,sBAAuB,uBAAwB,mBAC7CvD,SAAQ,SAAS8N,GAChB,IAAMC,EAAe7Y,EAAOmI,kBAAkB9H,UAAUuY,GAClDE,EAAahX,EAAA,GAAC8W,GAAD,WAIjB,OAHAlQ,UAAU,GAAK,IAAiB,oBAAZkQ,EAClB5Y,EAAOwZ,gBACPxZ,EAAOoY,uBAAuB1P,UAAU,IACnCmQ,EAAapQ,MAAM5I,KAAM6I,UAClC,IACA1I,EAAOmI,kBAAkB9H,UAAUuY,GAAUE,EAAUF,EACzD,IAGJ,IAAMiC,EAAmB,CACvBC,WAAY,cACZC,YAAa,eACbC,cAAe,iBACf1E,eAAgB,kBAChBC,gBAAiB,oBAGb0E,EAAiBjb,EAAOmI,kBAAkB9H,UAAUsV,SAC1D3V,EAAOmI,kBAAkB9H,UAAUsV,SAAW,WAC5C,IAAkCC,EAAAjJ,EAAAjE,UAAA,GAA3BmN,EAA2BD,EAAA,GAAjBE,EAAiBF,EAAA,GAATG,EAASH,EAAA,GAClC,OAAOqF,EAAexS,MAAM5I,KAAM,CAACgW,GAAY,OAC5CzG,MAAK,SAAA1E,GACJ,GAAIoC,EAAeuB,QAAU,KAAOyH,EAGlC,IACEpL,EAAMI,SAAQ,SAAA2L,GACZA,EAAK/T,KAAOmY,EAAiBpE,EAAK/T,OAAS+T,EAAK/T,IAClD,GACF,CAAE,MAAOnD,GACP,GAAe,cAAXA,EAAEwL,KACJ,MAAMxL,EAGRmL,EAAMI,SAAQ,SAAC2L,EAAM1V,GACnB2J,EAAM1B,IAAIjI,EAAGkB,OAAOuI,OAAO,CAAC,EAAGiM,EAAM,CACnC/T,KAAMmY,EAAiBpE,EAAK/T,OAAS+T,EAAK/T,OAE9C,GACF,CAEF,OAAOgI,CACT,IACC0E,KAAK0G,EAAQC,EAClB,CAzDE,CA0DJ,CAEO,SAASmF,GAAmBlb,GACjC,GAAwB,iBAAXA,GAAuBA,EAAOmI,mBACvCnI,EAAOsV,gBAGPtV,EAAOsV,gBAAgB,aAActV,EAAOsV,aAAajV,YAA7D,CAGA,IAAMkV,EAAiBvV,EAAOmI,kBAAkB9H,UAAUkU,WACtDgB,IACFvV,EAAOmI,kBAAkB9H,UAAUkU,WAAa,W,WACxCiB,EAAUD,EAAe9M,MAAM5I,KAAM,IAE3C,OADA2V,EAAQ1K,SAAQ,SAAA6J,G,OAAUA,EAAOL,IAAGZ,C,IAC7B8B,CACT,GAGF,IAAMf,EAAezU,EAAOmI,kBAAkB9H,UAAUqU,SACpDD,IACFzU,EAAOmI,kBAAkB9H,UAAUqU,SAAW,WAC5C,IAAMC,EAASF,EAAahM,MAAM5I,KAAM6I,WAExC,OADAiM,EAAOL,IAAMzU,KACN8U,CACT,GAEF3U,EAAOsV,aAAajV,UAAUsV,SAAW,WACvC,OAAO9V,KAAKsL,MAAQtL,KAAKyU,IAAIqB,SAAS9V,KAAKsL,OACzCyG,QAAQ+E,QAAQ,IAAI5N,IACxB,CAtBE,CAuBJ,CAEO,SAASoS,GAAqBnb,GACnC,GAAwB,iBAAXA,GAAuBA,EAAOmI,mBACvCnI,EAAOsV,gBAGPtV,EAAOsV,gBAAgB,aAActV,EAAO6W,eAAexW,YAA/D,CAGA,IAAMyW,EAAmB9W,EAAOmI,kBAAkB9H,UAAUoT,aACxDqD,IACF9W,EAAOmI,kBAAkB9H,UAAUoT,aAAe,W,WAC1CsD,EAAYD,EAAiBrO,MAAM5I,KAAM,IAE/C,OADAkX,EAAUjM,SAAQ,SAAA0I,G,OAAYA,EAASc,IAAGZ,C,IACnCqD,CACT,GAEFhP,EAA8B/H,EAAQ,SAAS,SAAAT,GAE7C,OADAA,EAAEiU,SAASc,IAAM/U,EAAEyX,WACZzX,CACT,IACAS,EAAO6W,eAAexW,UAAUsV,SAAW,WACzC,OAAO9V,KAAKyU,IAAIqB,SAAS9V,KAAKsL,MAChC,CAhBE,CAiBJ,CAEO,SAASiQ,GAAiBpb,GAC1BA,EAAOmI,qBACR,iBAAkBnI,EAAOmI,kBAAkB9H,aAG/CL,EAAOmI,kBAAkB9H,UAAU+U,aACjC,SAAsB9D,G,WACpB3H,EAAiB,eAAgB,eACjC9J,KAAK0U,aAAazJ,SAAQ,SAAA6J,GACpBA,EAAOxJ,OAASmG,EAAOG,YAAY3B,SAAS6E,EAAOxJ,QACrDuI,EAAKmB,YAAYF,EAErB,GACF,EACJ,CAEO,SAAS0G,GAAmBrb,GAG7BA,EAAOsb,cAAgBtb,EAAOub,iBAChCvb,EAAOub,eAAiBvb,EAAOsb,YAEnC,CAEO,SAASE,GAAmBxb,GAIjC,GAAwB,iBAAXA,GAAuBA,EAAOmI,kBAA3C,CAGA,IAAMsT,EAAqBzb,EAAOmI,kBAAkB9H,UAAUqb,eAC1DD,IACFzb,EAAOmI,kBAAkB9H,UAAUqb,eACjC,WACE7b,KAAK8b,sBAAwB,GAE7B,IAAIC,EAAgBlT,UAAU,IAAMA,UAAU,GAAGkT,mBAC3BrR,IAAlBqR,IACFA,EAAgB,IAGlB,IAAMC,GADND,EAAiB7B,EAAG6B,IACqBlb,OAAS,EAC9Cmb,GAEFD,EAAc9Q,SAAQ,SAACgR,GACrB,GAAI,QAASA,EAAe,CAE1B,IADiB,oBACHpP,KAAKoP,EAAcC,KAC/B,MAAM,IAAI5P,UAAU,8BAExB,CACA,GAAI,0BAA2B2P,KACvBE,WAAWF,EAAcG,wBAA0B,GACvD,MAAM,IAAIC,WAAW,2CAGzB,GAAI,iBAAkBJ,KACdE,WAAWF,EAAcK,eAAiB,GAC9C,MAAM,IAAID,WAAW,+BAG3B,IAEF,IAAMrI,EAAc4H,EAAmBhT,MAAM5I,KAAM6I,WACnD,GAAImT,EAAoB,CAQtB,IAAMlH,EAAWd,EAAVc,OACDyH,EAASzH,EAAO0H,mBAChB,cAAeD,IAEY,IAA5BA,EAAOE,UAAU5b,QAC2B,IAA5CuB,OAAOgF,KAAKmV,EAAOE,UAAU,IAAI5b,UACpC0b,EAAOE,UAAYV,EACnBjH,EAAOiH,cAAgBA,EACvB/b,KAAK8b,sBAAsBnb,KAAKmU,EAAO4H,cAAcH,GAClDhN,MAAK,kBACGuF,EAAOiH,aAChB,IAAG,OAAM,kBACAjH,EAAOiH,aAChB,KAGN,CACA,OAAO/H,CACT,EA9DF,CAgEJ,CAEO,SAAS2I,GAAkBxc,GAChC,GAAwB,iBAAXA,GAAuBA,EAAOsV,aAA3C,CAGA,IAAMmH,EAAoBzc,EAAOsV,aAAajV,UAAUgc,cACpDI,IACFzc,EAAOsV,aAAajV,UAAUgc,cAC5B,WACE,IAAMD,EAASK,EAAkBhU,MAAM5I,KAAM6I,WAI7C,MAHM,cAAe0T,IACnBA,EAAOE,UAAY,GAAGrO,OAAOpO,KAAK+b,eAAiB,CAAC,CAAC,KAEhDQ,CACT,EAXF,CAaJ,CAEO,SAASM,GAAgB1c,GAI9B,GAAwB,iBAAXA,GAAuBA,EAAOmI,kBAA3C,CAGA,IAAMwU,EAAkB3c,EAAOmI,kBAAkB9H,UAAUuc,YAC3D5c,EAAOmI,kBAAkB9H,UAAUuc,YAAc,W,WAC/C,OAAI/c,KAAK8b,uBAAyB9b,KAAK8b,sBAAsBjb,OACpDkR,QAAQiL,IAAIhd,KAAK8b,uBACrBvM,MAAK,WACJ,OAAOuN,EAAgBlU,MAAKiL,EAAOhL,UACrC,IACC,SAAQ,WACPgL,EAAKiI,sBAAwB,EAC/B,IAEGgB,EAAgBlU,MAAM5I,KAAM6I,UACrC,CAdE,CAeJ,CAEO,SAASoU,GAAiB9c,GAI/B,GAAwB,iBAAXA,GAAuBA,EAAOmI,kBAA3C,CAGA,IAAM4U,EAAmB/c,EAAOmI,kBAAkB9H,UAAU2c,aAC5Dhd,EAAOmI,kBAAkB9H,UAAU2c,aAAe,W,WAChD,OAAInd,KAAK8b,uBAAyB9b,KAAK8b,sBAAsBjb,OACpDkR,QAAQiL,IAAIhd,KAAK8b,uBACrBvM,MAAK,WACJ,OAAO2N,EAAiBtU,MAAKiL,EAAOhL,UACtC,IACC,SAAQ,WACPgL,EAAKiI,sBAAwB,EAC/B,IAEGoB,EAAiBtU,MAAM5I,KAAM6I,UACtC,CAdE,CAeJ,C,glBCjSO,SAASuU,GAAoBjd,GAClC,GAAsB,iBAAXA,GAAwBA,EAAOmI,kBAA1C,CAYA,GATM,oBAAqBnI,EAAOmI,kBAAkB9H,YAClDL,EAAOmI,kBAAkB9H,UAAU+W,gBACjC,WAIE,OAHKvX,KAAKqd,gBACRrd,KAAKqd,cAAgB,IAEhBrd,KAAKqd,aACd,KAEE,cAAeld,EAAOmI,kBAAkB9H,WAAY,CACxD,IAAM8c,EAAYnd,EAAOmI,kBAAkB9H,UAAUqU,SACrD1U,EAAOmI,kBAAkB9H,UAAU6U,UAAY,SAAmB5D,G,WAC3DzR,KAAKqd,gBACRrd,KAAKqd,cAAgB,IAElBrd,KAAKqd,cAAcpN,SAASwB,IAC/BzR,KAAKqd,cAAc1c,KAAK8Q,GAI1BA,EAAOC,iBAAiBzG,SAAQ,SAAAK,G,OAASgS,EAAUlT,KAAIyJ,EAAOvI,EAC5DmG,E,IACFA,EAAOE,iBAAiB1G,SAAQ,SAAAK,G,OAASgS,EAAUlT,KAAIyJ,EAAOvI,EAC5DmG,E,GACJ,EAEAtR,EAAOmI,kBAAkB9H,UAAUqU,SACjC,SAAkBvJ,GAAO,QAAAiS,EAAA1U,UAAAhI,OAAAoT,EAAA,IAAArP,MAAA2Y,EAAA,EAAAA,EAAA,KAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAGvJ,EAAHuJ,EAAA,GAAA3U,UAAA2U,G,WAUvB,OATIvJ,GACFA,EAAQhJ,SAAQ,SAACwG,GACVoC,EAAKwJ,cAEExJ,EAAKwJ,cAAcpN,SAASwB,IACtCoC,EAAKwJ,cAAc1c,KAAK8Q,GAFxBoC,EAAKwJ,cAAgB,CAAC5L,EAI1B,IAEK6L,EAAU1U,MAAM5I,KAAM6I,UAC/B,CACJ,CACM,iBAAkB1I,EAAOmI,kBAAkB9H,YAC/CL,EAAOmI,kBAAkB9H,UAAU+U,aACjC,SAAsB9D,G,WACfzR,KAAKqd,gBACRrd,KAAKqd,cAAgB,IAEvB,IAAM/b,EAAQtB,KAAKqd,cAAcnI,QAAQzD,GACzC,IAAc,IAAVnQ,EAAJ,CAGAtB,KAAKqd,cAAclI,OAAO7T,EAAO,GACjC,IAAMmc,EAAShM,EAAOG,YACtB5R,KAAK0U,aAAazJ,SAAQ,SAAA6J,GACpB2I,EAAOxN,SAAS6E,EAAOxJ,QACzBuI,EAAKmB,YAAYF,EAErB,GARE,CASJ,EA3DF,CA6DJ,CAEO,SAAS4I,GAAqBvd,GACnC,GAAsB,iBAAXA,GAAwBA,EAAOmI,oBAGpC,qBAAsBnI,EAAOmI,kBAAkB9H,YACnDL,EAAOmI,kBAAkB9H,UAAUmd,iBACjC,WACE,OAAO3d,KAAK4d,eAAiB5d,KAAK4d,eAAiB,EACrD,KAEE,gBAAiBzd,EAAOmI,kBAAkB9H,YAAY,CAC1D4B,OAAOC,eAAelC,EAAOmI,kBAAkB9H,UAAW,cAAe,CACvEgJ,IAAA,WACE,OAAOxJ,KAAK6d,YACd,EACA1U,IAAA,SAAImK,G,WACEtT,KAAK6d,eACP7d,KAAKqJ,oBAAoB,YAAarJ,KAAK6d,cAC3C7d,KAAKqJ,oBAAoB,QAASrJ,KAAK8d,mBAEzC9d,KAAKyI,iBAAiB,YAAazI,KAAK6d,aAAevK,GACvDtT,KAAKyI,iBAAiB,QAASzI,KAAK8d,iBAAmB,SAACpe,GACtDA,EAAEuU,QAAQhJ,SAAQ,SAAAwG,GAIhB,GAHKoC,EAAK+J,iBACR/J,EAAK+J,eAAiB,KAEpB/J,EAAK+J,eAAe3N,SAASwB,GAAjC,CAGAoC,EAAK+J,eAAejd,KAAK8Q,GACzB,IAAMqC,EAAQ,IAAIC,MAAM,aACxBD,EAAMrC,OAASA,EACfoC,EAAKK,cAAcJ,EALjB,CAMJ,GACF,EACF,IAEF,IAAMP,EACJpT,EAAOmI,kBAAkB9H,UAAUgT,qBACrCrT,EAAOmI,kBAAkB9H,UAAUgT,qBACjC,WACE,IAAMa,EAAKrU,KAiBX,OAhBKA,KAAK8d,kBACR9d,KAAKyI,iBAAiB,QAASzI,KAAK8d,iBAAmB,SAASpe,GAC9DA,EAAEuU,QAAQhJ,SAAQ,SAAAwG,GAIhB,GAHK4C,EAAGuJ,iBACNvJ,EAAGuJ,eAAiB,MAElBvJ,EAAGuJ,eAAe1I,QAAQzD,IAAW,GAAzC,CAGA4C,EAAGuJ,eAAejd,KAAK8Q,GACvB,IAAMqC,EAAQ,IAAIC,MAAM,aACxBD,EAAMrC,OAASA,EACf4C,EAAGH,cAAcJ,EALf,CAMJ,GACF,GAEKP,EAAyB3K,MAAMyL,EAAIxL,UAC5C,CACJ,CACF,CAEO,SAASkV,GAAiB5d,GAC/B,GAAsB,iBAAXA,GAAwBA,EAAOmI,kBAA1C,CAGA,IAAM9H,EAAYL,EAAOmI,kBAAkB9H,UACrCsc,EAAkBtc,EAAUuc,YAC5BG,EAAmB1c,EAAU2c,aAC7B9D,EAAsB7Y,EAAU6Y,oBAChC7F,EAAuBhT,EAAUgT,qBACjCwK,EAAkBxd,EAAUwd,gBAElCxd,EAAUuc,YACR,SAAqBkB,EAAiBC,GACpC,IAAMC,EAAUtV,UAAWhI,QAAU,EAAKgI,UAAU,GAAKA,UAAU,GAC7DuV,EAAUtB,EAAgBlU,MAAM5I,KAAM,CAACme,IAC7C,OAAKD,GAGLE,EAAQ7O,KAAK0O,EAAiBC,GACvBnM,QAAQ+E,WAHNsH,CAIX,EAEF5d,EAAU2c,aACR,SAAsBc,EAAiBC,GACrC,IAAMC,EAAUtV,UAAWhI,QAAU,EAAKgI,UAAU,GAAKA,UAAU,GAC7DuV,EAAUlB,EAAiBtU,MAAM5I,KAAM,CAACme,IAC9C,OAAKD,GAGLE,EAAQ7O,KAAK0O,EAAiBC,GACvBnM,QAAQ+E,WAHNsH,CAIX,EAEF,IAAIC,EAAe,SAAStG,EAAakG,EAAiBC,GACxD,IAAME,EAAU/E,EAAoBzQ,MAAM5I,KAAM,CAAC+X,IACjD,OAAKmG,GAGLE,EAAQ7O,KAAK0O,EAAiBC,GACvBnM,QAAQ+E,WAHNsH,CAIX,EACA5d,EAAU6Y,oBAAsBgF,EAEhCA,EAAe,SAAStG,EAAakG,EAAiBC,GACpD,IAAME,EAAU5K,EAAqB5K,MAAM5I,KAAM,CAAC+X,IAClD,OAAKmG,GAGLE,EAAQ7O,KAAK0O,EAAiBC,GACvBnM,QAAQ+E,WAHNsH,CAIX,EACA5d,EAAUgT,qBAAuB6K,EAEjCA,EAAe,SAASC,EAAWL,EAAiBC,GAClD,IAAME,EAAUJ,EAAgBpV,MAAM5I,KAAM,CAACse,IAC7C,OAAKJ,GAGLE,EAAQ7O,KAAK0O,EAAiBC,GACvBnM,QAAQ+E,WAHNsH,CAIX,EACA5d,EAAUwd,gBAAkBK,CA3D1B,CA4DJ,CAEO,SAASE,GAAiBpe,GAC/B,IAAM+M,EAAY/M,GAAUA,EAAO+M,UAEnC,GAAIA,EAAUC,cAAgBD,EAAUC,aAAa+D,aAAc,CAEjE,IAAM/D,EAAeD,EAAUC,aACzBqR,EAAgBrR,EAAa+D,aAAaI,KAAKnE,GACrDD,EAAUC,aAAa+D,aAAe,SAAC5C,GACrC,OAAOkQ,EAAcC,GAAgBnQ,GACvC,CACF,EAEKpB,EAAUgE,cAAgBhE,EAAUC,cACvCD,EAAUC,aAAa+D,eACvBhE,EAAUgE,aAAe,SAAsB5C,EAAa3F,EAAI+V,GAC9DxR,EAAUC,aAAa+D,aAAa5C,GACjCiB,KAAK5G,EAAI+V,EACd,EAAEpN,KAAKpE,GAEX,CAEO,SAASuR,GAAgBnQ,GAC9B,OAAIA,QAAqC5D,IAAtB4D,EAAYU,MACtB5M,OAAOuI,OAAO,CAAC,EACpB2D,EACA,CAACU,MAAO3E,EAAoBiE,EAAYU,SAIrCV,CACT,CAEO,SAASqQ,GAAqBxe,GACnC,GAAKA,EAAOmI,kBAAZ,CAIA,IAAMsW,EAAqBze,EAAOmI,kBAClCnI,EAAOmI,kBACL,SAA2BuW,EAAUC,GACnC,GAAID,GAAYA,EAASE,WAAY,CAEnC,IADA,IAAMC,EAAgB,GACb9d,EAAI,EAAGA,EAAI2d,EAASE,WAAWle,OAAQK,IAAK,CACnD,IAAI+d,EAASJ,EAASE,WAAW7d,QACbwJ,IAAhBuU,EAAOC,MAAsBD,EAAOE,KACtCrV,EAAiB,mBAAoB,sBACrCmV,EAASxQ,KAAKC,MAAMD,KAAKE,UAAUsQ,KAC5BC,KAAOD,EAAOE,WACdF,EAAOE,IACdH,EAAcre,KAAKse,IAEnBD,EAAcre,KAAKke,EAASE,WAAW7d,GAE3C,CACA2d,EAASE,WAAaC,CACxB,CACA,OAAO,IAAIJ,EAAmBC,EAAUC,EAC1C,EACF3e,EAAOmI,kBAAkB9H,UAAYoe,EAAmBpe,UAEpD,wBAAyBoe,GAC3Bxc,OAAOC,eAAelC,EAAOmI,kBAAmB,sBAAuB,CACrEkB,IAAA,WACE,OAAOoV,EAAmBQ,mBAC5B,GA9BF,CAiCJ,CAEO,SAASC,GAA0Blf,GAElB,iBAAXA,GAAuBA,EAAO0a,eACrC,aAAc1a,EAAO0a,cAAcra,aACjC,gBAAiBL,EAAO0a,cAAcra,YAC1C4B,OAAOC,eAAelC,EAAO0a,cAAcra,UAAW,cAAe,CACnEgJ,IAAA,WACE,MAAO,CAACmK,SAAU3T,KAAK2T,SACzB,GAGN,CAEO,SAAS2L,GAAsBnf,GACpC,IAAM2c,EAAkB3c,EAAOmI,kBAAkB9H,UAAUuc,YAC3D5c,EAAOmI,kBAAkB9H,UAAUuc,YACjC,SAAqBwC,GACnB,GAAIA,EAAc,MACgC,IAArCA,EAAaC,sBAEtBD,EAAaC,sBACTD,EAAaC,qBAEnB,IAAMC,EAAmBzf,KAAK0f,kBAAkB7P,MAAK,SAAAmE,G,MACf,UAApCA,EAAYL,SAASrI,MAAMsE,I,KACY,IAArC2P,EAAaC,qBAAiCC,EACb,aAA/BA,EAAiBE,UACfF,EAAiBG,aACnBH,EAAiBG,aAAa,YAE9BH,EAAiBE,UAAY,WAES,aAA/BF,EAAiBE,YACtBF,EAAiBG,aACnBH,EAAiBG,aAAa,YAE9BH,EAAiBE,UAAY,aAGa,IAArCJ,EAAaC,qBACnBC,GACHzf,KAAK6b,eAAe,QAAS,CAAC8D,UAAW,kBAGK,IAArCJ,EAAaM,sBAEtBN,EAAaM,sBACTN,EAAaM,qBAEnB,IAAMC,EAAmB9f,KAAK0f,kBAAkB7P,MAAK,SAAAmE,G,MACf,UAApCA,EAAYL,SAASrI,MAAMsE,I,KACY,IAArC2P,EAAaM,qBAAiCC,EACb,aAA/BA,EAAiBH,UACfG,EAAiBF,aACnBE,EAAiBF,aAAa,YAE9BE,EAAiBH,UAAY,WAES,aAA/BG,EAAiBH,YACtBG,EAAiBF,aACnBE,EAAiBF,aAAa,YAE9BE,EAAiBH,UAAY,aAGa,IAArCJ,EAAaM,qBACnBC,GACH9f,KAAK6b,eAAe,QAAS,CAAC8D,UAAW,YAE7C,CACA,OAAO7C,EAAgBlU,MAAM5I,KAAM6I,UACrC,CACJ,CAEO,SAASkX,GAAiB5f,GACT,iBAAXA,GAAuBA,EAAO6f,eAGzC7f,EAAO6f,aAAe7f,EAAO8f,mBAC/B,C,m7BC1VMC,GAAW,CAAC,ECSX,SAASC,GAAoBhgB,GAGlC,MAAKA,EAAOwZ,iBAAoBxZ,EAAOwZ,iBAAmB,eACtDxZ,EAAOwZ,gBAAgBnZ,WAD3B,CAKA,IAAM4f,EAAwBjgB,EAAOwZ,gBACrCxZ,EAAOwZ,gBAAkB,SAAyBT,GAQhD,GANoB,iBAATA,GAAqBA,EAAKoF,WACA,IAAjCpF,EAAKoF,UAAUpJ,QAAQ,SACzBgE,EAAOzK,KAAKC,MAAMD,KAAKE,UAAUuK,KAC5BoF,UAAYpF,EAAKoF,UAAU+B,UAAU,IAGxCnH,EAAKoF,WAAapF,EAAKoF,UAAUzd,OAAQ,CAE3C,IAAMyf,EAAkB,IAAIF,EAAsBlH,GAC5CqH,EAAkBC,EAAAC,IAASC,eAAexH,EAAKoF,WAC/CqC,EAAqBve,OAAOuI,OAAO2V,EACvCC,GAWF,OARAI,EAAmBC,OAAS,WAC1B,MAAO,CACLtC,UAAWqC,EAAmBrC,UAC9BuC,OAAQF,EAAmBE,OAC3BC,cAAeH,EAAmBG,cAClCC,iBAAkBJ,EAAmBI,iBAEzC,EACOJ,CACT,CACA,OAAO,IAAIP,EAAsBlH,EACnC,EACA/Y,EAAOwZ,gBAAgBnZ,UAAY4f,EAAsB5f,UAIzD0H,EAA8B/H,EAAQ,gBAAgB,SAAAT,GAOpD,OANIA,EAAE4e,WACJlc,OAAOC,eAAe3C,EAAG,YAAa,CACpCyC,MAAO,IAAIhC,EAAOwZ,gBAAgBja,EAAE4e,WACpC9b,SAAU,UAGP9C,CACT,GA5CE,CA6CJ,CAEO,SAASshB,GAAiC7gB,IAC1CA,EAAOwZ,iBAAoBxZ,EAAOwZ,iBAAmB,kBACtDxZ,EAAOwZ,gBAAgBnZ,WAM3B0H,EAA8B/H,EAAQ,gBAAgB,SAAAT,GACpD,GAAIA,EAAE4e,UAAW,CACf,IAAMiC,EAAkBC,EAAAC,IAASC,eAAehhB,EAAE4e,UAAUA,WAC/B,UAAzBiC,EAAgB1d,OAGlBnD,EAAE4e,UAAU2C,cAAgB,CAC1B,EAAG,MACH,EAAG,MACH,EAAG,OACHV,EAAgBW,UAAY,IAElC,CACA,OAAOxhB,CACT,GACF,CAEO,SAASyhB,GAAmBhhB,EAAQ8M,GACzC,GAAK9M,EAAOmI,kBAAZ,CAIM,SAAUnI,EAAOmI,kBAAkB9H,WACvC4B,OAAOC,eAAelC,EAAOmI,kBAAkB9H,UAAW,OAAQ,CAChEgJ,IAAA,WACE,YAA6B,IAAfxJ,KAAKohB,MAAwB,KAAOphB,KAAKohB,KACzD,IAIJ,IAAMC,EAAoB,SAAStJ,GACjC,IAAKA,IAAgBA,EAAYC,IAC/B,OAAO,EAET,IAAMsJ,EAAWd,EAAAC,IAASc,cAAcxJ,EAAYC,KAEpD,OADAsJ,EAASE,QACFF,EAASxR,MAAK,SAAA2R,GACnB,IAAMC,EAAQlB,EAAAC,IAASkB,WAAWF,GAClC,OAAOC,GAAwB,gBAAfA,EAAM9R,OACoB,IAAnC8R,EAAME,SAAS1M,QAAQ,OAChC,GACF,EAEM2M,EAA0B,SAAS9J,GAEvC,IAAM/P,EAAQ+P,EAAYC,IAAIhQ,MAAM,mCACpC,GAAc,OAAVA,GAAkBA,EAAMnH,OAAS,EACnC,OAAO,EAET,IAAM2N,EAAUvG,SAASD,EAAM,GAAI,IAEnC,OAAOwG,GAAYA,GAAU,EAAKA,CACpC,EAEMsT,EAA2B,SAASC,GAKxC,IAAIC,EAAwB,MAwB5B,MAvB+B,YAA3B/U,EAAegV,UAKbD,EAJA/U,EAAeuB,QAAU,IACH,IAApBuT,EAGsB,MAIA,WAEjB9U,EAAeuB,QAAU,GAML,KAA3BvB,EAAeuB,QAAiB,MAAQ,MAGlB,YAGrBwT,CACT,EAEME,EAAoB,SAASnK,EAAagK,GAG9C,IAAII,EAAiB,MAKU,YAA3BlV,EAAegV,SACgB,KAA3BhV,EAAeuB,UACrB2T,EAAiB,OAGnB,IAAMna,EAAQwY,EAAAC,IAAS2B,YAAYrK,EAAYC,IAC7C,uBAUF,OATIhQ,EAAMnH,OAAS,EACjBshB,EAAiBla,SAASD,EAAM,GAAGqY,UAAU,IAAK,IACd,YAA3BpT,EAAegV,UACM,IAApBF,IAIVI,EAAiB,YAEZA,CACT,EAEM5O,EACFpT,EAAOmI,kBAAkB9H,UAAUgT,qBACvCrT,EAAOmI,kBAAkB9H,UAAUgT,qBACjC,YACExT,KAAKohB,MAAQ,KAIkB,WAA3BnU,EAAegV,SAAwBhV,EAAeuB,SAAW,MAE9C,WADExO,KAAK8Z,mBAArBC,cAEL3X,OAAOC,eAAerC,KAAM,OAAQ,CAClCwJ,IAAA,WACE,YAA6B,IAAfxJ,KAAKohB,MAAwB,KAAOphB,KAAKohB,KACzD,EACA9e,YAAY,EACZC,cAAc,KAKpB,GAAI8e,EAAkBxY,UAAU,IAAK,CAEnC,IASIsZ,EATEE,EAAYR,EAAwBhZ,UAAU,IAG9CyZ,EAAaR,EAAyBO,GAGtCE,EAAYL,EAAkBrZ,UAAU,GAAIwZ,GAKhDF,EADiB,IAAfG,GAAkC,IAAdC,EACLC,OAAOC,kBACA,IAAfH,GAAkC,IAAdC,EACZpe,KAAKyJ,IAAI0U,EAAYC,GAErBpe,KAAKwJ,IAAI2U,EAAYC,GAKxC,IAAMG,EAAO,CAAC,EACdtgB,OAAOC,eAAeqgB,EAAM,iBAAkB,CAC5ClZ,IAAA,WACE,OAAO2Y,CACT,IAEFniB,KAAKohB,MAAQsB,CACf,CAEA,OAAOnP,EAAyB3K,MAAM5I,KAAM6I,UAC9C,CAnJA,CAoJJ,CAEO,SAAS8Z,GAAuBxiB,G,IAU5ByiB,EAAT,SAAoBC,EAAIxO,GACtB,IAAMyO,EAAsBD,EAAGE,KAC/BF,EAAGE,KAAO,WACR,IAAMriB,EAAOmI,UAAU,GACjBhI,EAASH,EAAKG,QAAUH,EAAKb,MAAQa,EAAKe,WAChD,GAAsB,SAAlBohB,EAAGG,YACH3O,EAAGqO,MAAQ7hB,EAASwT,EAAGqO,KAAKP,eAC9B,MAAM,IAAI7V,UAAU,4CAClB+H,EAAGqO,KAAKP,eAAiB,WAE7B,OAAOW,EAAoBla,MAAMia,EAAIha,UACvC,CACF,EArBA,GAAM1I,EAAOmI,mBACT,sBAAuBnI,EAAOmI,kBAAkB9H,UADpD,CAsBA,IAAMyiB,EACJ9iB,EAAOmI,kBAAkB9H,UAAU0iB,kBACrC/iB,EAAOmI,kBAAkB9H,UAAU0iB,kBACjC,WACE,IAAMC,EAAcF,EAAsBra,MAAM5I,KAAM6I,WAEtD,OADA+Z,EAAWO,EAAanjB,MACjBmjB,CACT,EACFjb,EAA8B/H,EAAQ,eAAe,SAAAT,GAEnD,OADAkjB,EAAWljB,EAAE0jB,QAAS1jB,EAAEma,QACjBna,CACT,GA/BE,CAgCJ,CAUO,SAAS2jB,GAAoBljB,GAClC,GAAKA,EAAOmI,qBACR,oBAAqBnI,EAAOmI,kBAAkB9H,WADlD,CAIA,IAAM+H,EAAQpI,EAAOmI,kBAAkB9H,UACvC4B,OAAOC,eAAekG,EAAO,kBAAmB,CAC9CiB,IAAA,WACE,MAAO,CACL8Z,UAAW,YACXC,SAAU,cACVvjB,KAAKwjB,qBAAuBxjB,KAAKwjB,kBACrC,EACAlhB,YAAY,EACZC,cAAc,IAEhBH,OAAOC,eAAekG,EAAO,0BAA2B,CACtDiB,IAAA,WACE,OAAOxJ,KAAKyjB,0BAA4B,IAC1C,EACAta,IAAA,SAAIR,GACE3I,KAAKyjB,2BACPzjB,KAAKqJ,oBAAoB,wBACvBrJ,KAAKyjB,iCACAzjB,KAAKyjB,0BAEV9a,GACF3I,KAAKyI,iBAAiB,wBACpBzI,KAAKyjB,yBAA2B9a,EAEtC,EACArG,YAAY,EACZC,cAAc,IAGhB,CAAC,sBAAuB,wBAAwB0I,SAAQ,SAAC8N,GACvD,IAAM2K,EAAanb,EAAMwQ,GACzBxQ,EAAMwQ,GAAU,WAcd,OAbK/Y,KAAK2jB,6BACR3jB,KAAK2jB,2BAA6B,SAAAjkB,GAChC,IAAM2U,EAAK3U,EAAEma,OACb,GAAIxF,EAAGuP,uBAAyBvP,EAAGwP,gBAAiB,CAClDxP,EAAGuP,qBAAuBvP,EAAGwP,gBAC7B,IAAMC,EAAW,IAAI/P,MAAM,wBAAyBrU,GACpD2U,EAAGH,cAAc4P,EACnB,CACA,OAAOpkB,CACT,EACAM,KAAKyI,iBAAiB,2BACpBzI,KAAK2jB,6BAEFD,EAAW9a,MAAM5I,KAAM6I,UAChC,CACF,GAlDE,CAmDJ,CAEO,SAASkb,GAAuB5jB,EAAQ8M,GAE7C,GAAK9M,EAAOmI,qBAGmB,WAA3B2E,EAAegV,SAAwBhV,EAAeuB,SAAW,IAGtC,WAA3BvB,EAAegV,SAAwBhV,EAAeuB,SAAW,KAArE,CAGA,IAAMwV,EAAY7jB,EAAOmI,kBAAkB9H,UAAUgT,qBACrDrT,EAAOmI,kBAAkB9H,UAAUgT,qBACnC,SAA8B2F,GAC5B,GAAIA,GAAQA,EAAKnB,MAAsD,IAA/CmB,EAAKnB,IAAI9C,QAAQ,0BAAkC,CACzE,IAAM8C,EAAMmB,EAAKnB,IAAIiM,MAAM,MAAMvU,QAAO,SAACwU,GACvC,MAAuB,yBAAhBA,EAAKC,MACd,IAAGC,KAAK,MAEJjkB,EAAOoY,uBACPY,aAAgBhZ,EAAOoY,sBACzB1P,UAAU,GAAK,IAAI1I,EAAOoY,sBAAsB,CAC9C1V,KAAMsW,EAAKtW,KACXmV,QAGFmB,EAAKnB,IAAMA,CAEf,CACA,OAAOgM,EAAUpb,MAAM5I,KAAM6I,UAC/B,CArBE,CAsBJ,CAEO,SAASwb,GAA+BlkB,EAAQ8M,GAKrD,GAAM9M,EAAOmI,mBAAqBnI,EAAOmI,kBAAkB9H,UAA3D,CAGA,IAAM8jB,EACFnkB,EAAOmI,kBAAkB9H,UAAUwd,gBAClCsG,GAA0D,IAAjCA,EAAsBzjB,SAGpDV,EAAOmI,kBAAkB9H,UAAUwd,gBACjC,WACE,OAAKnV,UAAU,IAWkB,WAA5BoE,EAAgBgV,SAAwBhV,EAAeuB,QAAU,IAClC,YAA3BvB,EAAegV,SACZhV,EAAeuB,QAAU,IACD,WAA3BvB,EAAegV,UACjBpZ,UAAU,IAAiC,KAA3BA,UAAU,GAAGyV,UAC3BvM,QAAQ+E,UAEVwN,EAAsB1b,MAAM5I,KAAM6I,YAjBnCA,UAAU,IACZA,UAAU,GAAGD,MAAM,MAEdmJ,QAAQ+E,UAenB,EA5BA,CA6BJ,CAIO,SAASyN,GAAqCpkB,EAAQ8M,GAC3D,GAAM9M,EAAOmI,mBAAqBnI,EAAOmI,kBAAkB9H,UAA3D,CAGA,IAAMgkB,EACFrkB,EAAOmI,kBAAkB9H,UAAU6Y,oBAClCmL,GAAkE,IAArCA,EAA0B3jB,SAG5DV,EAAOmI,kBAAkB9H,UAAU6Y,oBACjC,W,WACMF,EAAOtQ,UAAU,IAAM,CAAC,EAC5B,GAAoB,iBAATsQ,GAAsBA,EAAKtW,MAAQsW,EAAKnB,IACjD,OAAOwM,EAA0B5b,MAAM5I,KAAM6I,WAU/C,KADAsQ,EAAO,CAACtW,KAAMsW,EAAKtW,KAAMmV,IAAKmB,EAAKnB,MACzBnV,KACR,OAAQ7C,KAAK4Y,gBACX,IAAK,SACL,IAAK,mBACL,IAAK,uBACHO,EAAKtW,KAAO,QACZ,MACF,QACEsW,EAAKtW,KAAO,SAIlB,OAAIsW,EAAKnB,KAAsB,UAAdmB,EAAKtW,MAAkC,WAAdsW,EAAKtW,KACtC2hB,EAA0B5b,MAAM5I,KAAM,CAACmZ,KAErB,UAAdA,EAAKtW,KAAmB7C,KAAK+c,YAAc/c,KAAKmd,cACjDvU,MAAM5I,MACfuP,MAAK,SAAAI,G,OAAK6U,EAA0B5b,MAAKiL,EAAO,CAAClE,G,GACtD,EAvCA,CAwCJ,CDjcAuQ,GAASuE,mBAAqB,WAC5B,OAAOtgB,KAAKugB,SAAS9e,SAAS,IAAIya,UAAU,EAAG,GACjD,EAGAH,GAASyE,WAAazE,GAASuE,qBAG/BvE,GAAS0E,WAAa,SAAS3e,GAC7B,OAAOA,EAAKke,OAAOF,MAAM,MAAMpf,KAAI,SAAAqf,G,OAAQA,EAAKC,M,GAClD,EAEAjE,GAASqB,cAAgB,SAAStb,GAEhC,OADcA,EAAKge,MAAM,QACZpf,KAAI,SAACggB,EAAMvjB,G,OAAWA,EAAQ,EACzC,KAAOujB,EAAOA,GAAMV,OAAS,M,GACjC,EAGAjE,GAAS4E,eAAiB,SAAS7e,GACjC,IAAMqb,EAAWpB,GAASqB,cAActb,GACxC,OAAOqb,GAAYA,EAAS,EAC9B,EAGApB,GAAS6E,iBAAmB,SAAS9e,GACnC,IAAMqb,EAAWpB,GAASqB,cAActb,GAExC,OADAqb,EAASE,QACFF,CACT,EAGApB,GAASkC,YAAc,SAASnc,EAAM6H,GACpC,OAAOoS,GAAS0E,WAAW3e,GAAMyJ,QAAO,SAAAwU,G,OAAiC,IAAzBA,EAAKhP,QAAQpH,E,GAC/D,EAMAoS,GAASQ,eAAiB,SAASwD,GAqBjC,IApBA,IAAIc,EAQE1G,EAAY,CAChB2G,YANAD,EADmC,IAAjCd,EAAKhP,QAAQ,gBACPgP,EAAK7D,UAAU,IAAI4D,MAAM,KAEzBC,EAAK7D,UAAU,IAAI4D,MAAM,MAIf,GAClBiB,UAAW,CAAC,EAAG,MAAO,EAAG,QAAQF,EAAM,KAAOA,EAAM,GACpDpD,SAAUoD,EAAM,GAAGhV,cACnBkR,SAAUjZ,SAAS+c,EAAM,GAAI,IAC7BG,GAAIH,EAAM,GACVI,QAASJ,EAAM,GACfK,KAAMpd,SAAS+c,EAAM,GAAI,IAEzBniB,KAAMmiB,EAAM,IAGL9jB,EAAI,EAAGA,EAAI8jB,EAAMnkB,OAAQK,GAAK,EACrC,OAAQ8jB,EAAM9jB,IACZ,IAAK,QACHod,EAAUgH,eAAiBN,EAAM9jB,EAAI,GACrC,MACF,IAAK,QACHod,EAAUiH,YAActd,SAAS+c,EAAM9jB,EAAI,GAAI,IAC/C,MACF,IAAK,UACHod,EAAUkH,QAAUR,EAAM9jB,EAAI,GAC9B,MACF,IAAK,QACHod,EAAUmH,MAAQT,EAAM9jB,EAAI,GAC5Bod,EAAUyC,iBAAmBiE,EAAM9jB,EAAI,GACvC,MACF,aAC8BwJ,IAAxB4T,EAAU0G,EAAM9jB,MAClBod,EAAU0G,EAAM9jB,IAAM8jB,EAAM9jB,EAAI,IAKxC,OAAOod,CACT,EAIA4B,GAASwF,eAAiB,SAASpH,GACjC,IAAMtG,EAAM,GACZA,EAAIrX,KAAK2d,EAAU2G,YAEnB,IAAMC,EAAY5G,EAAU4G,UACV,QAAdA,EACFlN,EAAIrX,KAAK,GACc,SAAdukB,EACTlN,EAAIrX,KAAK,GAETqX,EAAIrX,KAAKukB,GAEXlN,EAAIrX,KAAK2d,EAAUsD,SAAS5T,eAC5BgK,EAAIrX,KAAK2d,EAAU4C,UACnBlJ,EAAIrX,KAAK2d,EAAU8G,SAAW9G,EAAU6G,IACxCnN,EAAIrX,KAAK2d,EAAU+G,MAEnB,IAAMxiB,EAAOyb,EAAUzb,KAkBvB,OAjBAmV,EAAIrX,KAAK,OACTqX,EAAIrX,KAAKkC,GACI,SAATA,GAAmByb,EAAUgH,gBAC7BhH,EAAUiH,cACZvN,EAAIrX,KAAK,SACTqX,EAAIrX,KAAK2d,EAAUgH,gBACnBtN,EAAIrX,KAAK,SACTqX,EAAIrX,KAAK2d,EAAUiH,cAEjBjH,EAAUkH,SAAgD,QAArClH,EAAUsD,SAAS5R,gBAC1CgI,EAAIrX,KAAK,WACTqX,EAAIrX,KAAK2d,EAAUkH,WAEjBlH,EAAUyC,kBAAoBzC,EAAUmH,SAC1CzN,EAAIrX,KAAK,SACTqX,EAAIrX,KAAK2d,EAAUyC,kBAAoBzC,EAAUmH,QAE5C,aAAezN,EAAIoM,KAAK,IACjC,EAKAlE,GAASyF,gBAAkB,SAASzB,GAClC,OAAOA,EAAK7D,UAAU,IAAI4D,MAAM,IAClC,EAIA/D,GAAS0F,YAAc,SAAS1B,GAC9B,IAAIc,EAAQd,EAAK7D,UAAU,GAAG4D,MAAM,KAC9B4B,EAAS,CACbC,YAAa7d,SAAS+c,EAAMxD,QAAS,KAUvC,OAPAwD,EAAQA,EAAM,GAAGf,MAAM,KAEvB4B,EAAO3a,KAAO8Z,EAAM,GACpBa,EAAOE,UAAY9d,SAAS+c,EAAM,GAAI,IACtCa,EAAOG,SAA4B,IAAjBhB,EAAMnkB,OAAeoH,SAAS+c,EAAM,GAAI,IAAM,EAEhEa,EAAOI,YAAcJ,EAAOG,SACrBH,CACT,EAIA3F,GAASgG,YAAc,SAASC,GAC9B,IAAIC,EAAKD,EAAML,iBACoBpb,IAA/Byb,EAAME,uBACRD,EAAKD,EAAME,sBAEb,IAAML,EAAWG,EAAMH,UAAYG,EAAMF,aAAe,EACxD,MAAO,YAAcG,EAAK,IAAMD,EAAMjb,KAAO,IAAMib,EAAMJ,WACvC,IAAbC,EAAiB,IAAMA,EAAW,IAAM,MAC/C,EAKA9F,GAASoG,YAAc,SAASpC,GAC9B,IAAMc,EAAQd,EAAK7D,UAAU,GAAG4D,MAAM,KACtC,MAAO,CACLjZ,GAAI/C,SAAS+c,EAAM,GAAI,IACvBrF,UAAWqF,EAAM,GAAG9P,QAAQ,KAAO,EAAI8P,EAAM,GAAGf,MAAM,KAAK,GAAK,WAChEsC,IAAKvB,EAAM,GACXwB,WAAYxB,EAAM1gB,MAAM,GAAG8f,KAAK,KAEpC,EAIAlE,GAASuG,YAAc,SAASC,GAC9B,MAAO,aAAeA,EAAgB1b,IAAM0b,EAAgBC,cACvDD,EAAgB/G,WAA2C,aAA9B+G,EAAgB/G,UAC1C,IAAM+G,EAAgB/G,UACtB,IACJ,IAAM+G,EAAgBH,KACrBG,EAAgBF,WAAa,IAAME,EAAgBF,WAAa,IACjE,MACN,EAKAtG,GAAS0G,UAAY,SAAS1C,GAI5B,IAHA,IACI2C,EADEhB,EAAS,CAAC,EAEVb,EAAQd,EAAK7D,UAAU6D,EAAKhP,QAAQ,KAAO,GAAG+O,MAAM,KACjDhf,EAAI,EAAGA,EAAI+f,EAAMnkB,OAAQoE,IAEhC4gB,GADAgB,EAAK7B,EAAM/f,GAAGkf,OAAOF,MAAM,MACjB,GAAGE,QAAU0C,EAAG,GAE5B,OAAOhB,CACT,EAGA3F,GAAS4G,UAAY,SAASX,GAC5B,IAAIjC,EAAO,GACPkC,EAAKD,EAAML,YAIf,QAHmCpb,IAA/Byb,EAAME,uBACRD,EAAKD,EAAME,sBAETF,EAAMY,YAAc3kB,OAAOgF,KAAK+e,EAAMY,YAAYlmB,OAAQ,CAC5D,IAAM0b,EAAS,GACfna,OAAOgF,KAAK+e,EAAMY,YAAY9b,SAAQ,SAAA+b,QACJtc,IAA5Byb,EAAMY,WAAWC,GACnBzK,EAAO5b,KAAKqmB,EAAQ,IAAMb,EAAMY,WAAWC,IAE3CzK,EAAO5b,KAAKqmB,EAEhB,IACA9C,GAAQ,UAAYkC,EAAK,IAAM7J,EAAO6H,KAAK,KAAO,MACpD,CACA,OAAOF,CACT,EAIAhE,GAAS+G,YAAc,SAAS/C,GAC9B,IAAMc,EAAQd,EAAK7D,UAAU6D,EAAKhP,QAAQ,KAAO,GAAG+O,MAAM,KAC1D,MAAO,CACLphB,KAAMmiB,EAAMxD,QACZ0F,UAAWlC,EAAMZ,KAAK,KAE1B,EAGAlE,GAASiH,YAAc,SAAShB,GAC9B,IAAIiB,EAAQ,GACRhB,EAAKD,EAAML,YAYf,YAXmCpb,IAA/Byb,EAAME,uBACRD,EAAKD,EAAME,sBAETF,EAAMkB,cAAgBlB,EAAMkB,aAAaxmB,QAE3CslB,EAAMkB,aAAapc,SAAQ,SAAAqc,GACzBF,GAAS,aAAehB,EAAK,IAAMkB,EAAGzkB,MACrCykB,EAAGJ,WAAaI,EAAGJ,UAAUrmB,OAAS,IAAMymB,EAAGJ,UAAY,IACxD,MACN,IAEKE,CACT,EAIAlH,GAASqH,eAAiB,SAASrD,GACjC,IAAMsD,EAAKtD,EAAKhP,QAAQ,KAClB8P,EAAQ,CACZyC,KAAMxf,SAASic,EAAK7D,UAAU,EAAGmH,GAAK,KAElCE,EAAQxD,EAAKhP,QAAQ,IAAKsS,GAOhC,OANIE,GAAQ,GACV1C,EAAM2C,UAAYzD,EAAK7D,UAAUmH,EAAK,EAAGE,GACzC1C,EAAM7iB,MAAQ+hB,EAAK7D,UAAUqH,EAAQ,IAErC1C,EAAM2C,UAAYzD,EAAK7D,UAAUmH,EAAK,GAEjCxC,CACT,EAIA9E,GAAS0H,eAAiB,SAAS1D,GACjC,IAAMc,EAAQd,EAAK7D,UAAU,IAAI4D,MAAM,KACvC,MAAO,CACL4D,UAAW7C,EAAMxD,QACjBsG,MAAO9C,EAAMngB,KAAI,SAAA4iB,G,OAAQxf,SAASwf,EAAM,G,IAE5C,EAIAvH,GAAS6H,OAAS,SAAStG,GACzB,IAAMuG,EAAM9H,GAASkC,YAAYX,EAAc,UAAU,GACzD,GAAIuG,EACF,OAAOA,EAAI3H,UAAU,EAEzB,EAGAH,GAAS+H,iBAAmB,SAAS/D,GACnC,IAAMc,EAAQd,EAAK7D,UAAU,IAAI4D,MAAM,KACvC,MAAO,CACLiE,UAAWlD,EAAM,GAAGhV,cACpB7N,MAAO6iB,EAAM,GAAGhX,cAEpB,EAKAkS,GAASiI,kBAAoB,SAAS1G,EAAc2G,GAIlD,MAAO,CACLC,KAAM,OACNC,aALYpI,GAASkC,YAAYX,EAAe2G,EAChD,kBAIoBvjB,IAAIqb,GAAS+H,kBAErC,EAGA/H,GAASqI,oBAAsB,SAAShM,EAAQiM,GAC9C,IAAIxQ,EAAM,WAAawQ,EAAY,OAInC,OAHAjM,EAAO+L,aAAard,SAAQ,SAAAwd,GAC1BzQ,GAAO,iBAAmByQ,EAAGP,UAAY,IAAMO,EAAGtmB,MAAQ,MAC5D,IACO6V,CACT,EAIAkI,GAASwI,gBAAkB,SAASxE,GAClC,IAAMc,EAAQd,EAAK7D,UAAU,GAAG4D,MAAM,KACtC,MAAO,CACL0E,IAAK1gB,SAAS+c,EAAM,GAAI,IACxB4D,YAAa5D,EAAM,GACnB6D,UAAW7D,EAAM,GACjB8D,cAAe9D,EAAM1gB,MAAM,GAE/B,EAEA4b,GAAS6I,gBAAkB,SAAShC,GAClC,MAAO,YAAcA,EAAW4B,IAAM,IACpC5B,EAAW6B,YAAc,KACQ,iBAAzB7B,EAAW8B,UACf3I,GAAS8I,qBAAqBjC,EAAW8B,WACzC9B,EAAW8B,YACd9B,EAAW+B,cAAgB,IAAM/B,EAAW+B,cAAc1E,KAAK,KAAO,IACvE,MACJ,EAIAlE,GAAS+I,qBAAuB,SAASJ,GACvC,GAAqC,IAAjCA,EAAU3T,QAAQ,WACpB,OAAO,KAET,IAAM8P,EAAQ6D,EAAUxI,UAAU,GAAG4D,MAAM,KAC3C,MAAO,CACLiF,UAAW,SACXC,QAASnE,EAAM,GACfoE,SAAUpE,EAAM,GAChBqE,SAAUrE,EAAM,GAAKA,EAAM,GAAGf,MAAM,KAAK,QAAKvZ,EAC9C4e,UAAWtE,EAAM,GAAKA,EAAM,GAAGf,MAAM,KAAK,QAAKvZ,EAEnD,EAEAwV,GAAS8I,qBAAuB,SAASH,GACvC,OAAOA,EAAUK,UAAY,IACzBL,EAAUM,SACXN,EAAUO,SAAW,IAAMP,EAAUO,SAAW,KAChDP,EAAUQ,UAAYR,EAAUS,UAC7B,IAAMT,EAAUQ,SAAW,IAAMR,EAAUS,UAC3C,GACR,EAGApJ,GAASqJ,oBAAsB,SAAS9H,EAAc2G,GAGpD,OAFclI,GAASkC,YAAYX,EAAe2G,EAChD,aACWvjB,IAAIqb,GAASwI,gBAC5B,EAKAxI,GAASsJ,iBAAmB,SAAS/H,EAAc2G,GACjD,IAAM3C,EAAQvF,GAASkC,YAAYX,EAAe2G,EAChD,gBAAgB,GACZqB,EAAMvJ,GAASkC,YAAYX,EAAe2G,EAC9C,cAAc,GAChB,OAAM3C,GAASgE,EAGR,CACL1I,iBAAkB0E,EAAMpF,UAAU,IAClCqJ,SAAUD,EAAIpJ,UAAU,KAJjB,IAMX,EAGAH,GAASyJ,mBAAqB,SAASpN,GACrC,IAAIvE,EAAM,eAAiBuE,EAAOwE,iBAAxB,iBACSxE,EAAOmN,SAAW,OAIrC,OAHInN,EAAOqN,UACT5R,GAAO,kBAEFA,CACT,EAGAkI,GAAS2J,mBAAqB,SAASpI,GACrC,IAAM1J,EAAc,CAClB+R,OAAQ,GACRC,iBAAkB,GAClBC,cAAe,GACfC,KAAM,IAGFC,EADQhK,GAAS0E,WAAWnD,GACd,GAAGwC,MAAM,KAC7BlM,EAAYoS,QAAUD,EAAM,GAC5B,IAAK,IAAIhpB,EAAI,EAAGA,EAAIgpB,EAAMrpB,OAAQK,IAAK,CACrC,IAAMklB,EAAK8D,EAAMhpB,GACXkpB,EAAalK,GAASkC,YAC1BX,EAAc,YAAc2E,EAAK,KAAK,GACxC,GAAIgE,EAAY,CACd,IAAMjE,EAAQjG,GAAS0F,YAAYwE,GAC7BC,EAAQnK,GAASkC,YACrBX,EAAc,UAAY2E,EAAK,KAQjC,OANAD,EAAMY,WAAasD,EAAMxpB,OAASqf,GAAS0G,UAAUyD,EAAM,IAAM,CAAC,EAClElE,EAAMkB,aAAenH,GAASkC,YAC5BX,EAAc,aAAe2E,EAAK,KACjCvhB,IAAIqb,GAAS+G,aAChBlP,EAAY+R,OAAOnpB,KAAKwlB,GAEhBA,EAAMjb,KAAK8C,eACjB,IAAK,MACL,IAAK,SACH+J,EAAYiS,cAAcrpB,KAAKwlB,EAAMjb,KAAK8C,eAKhD,CACF,CACAkS,GAASkC,YAAYX,EAAc,aAAaxW,SAAQ,SAAAiZ,GACtDnM,EAAYgS,iBAAiBppB,KAAKuf,GAASoG,YAAYpC,GACzD,IACA,IAAMoG,EAAiBpK,GAASkC,YAAYX,EAAc,gBACvD5c,IAAIqb,GAAS+G,aAahB,OAZAlP,EAAY+R,OAAO7e,SAAQ,SAAAkb,GACzBmE,EAAerf,SAAQ,SAAAqc,GACHnB,EAAMkB,aAAaxX,MAAK,SAAA0a,GACxC,OAAOA,EAAiB1nB,OAASykB,EAAGzkB,MAClC0nB,EAAiBrD,YAAcI,EAAGJ,SACtC,KAEEf,EAAMkB,aAAa1mB,KAAK2mB,EAE5B,GACF,IAEOvP,CACT,EAIAmI,GAASsK,oBAAsB,SAAS5a,EAAM6a,GAC5C,IAAIzS,EAAM,GAGVA,GAAO,KAAOpI,EAAO,IACrBoI,GAAOyS,EAAKX,OAAOjpB,OAAS,EAAI,IAAM,IACtCmX,GAAO,KAAOyS,EAAKN,SAAW,qBAAuB,IACrDnS,GAAOyS,EAAKX,OAAOjlB,KAAI,SAAAshB,GACrB,YAAmCzb,IAA/Byb,EAAME,qBACDF,EAAME,qBAERF,EAAML,WACf,IAAG1B,KAAK,KAAO,OAEfpM,GAAO,uBACPA,GAAO,8BAGPyS,EAAKX,OAAO7e,SAAQ,SAAAkb,GAClBnO,GAAOkI,GAASgG,YAAYC,GAC5BnO,GAAOkI,GAAS4G,UAAUX,GAC1BnO,GAAOkI,GAASiH,YAAYhB,EAC9B,IACA,IAAIuE,EAAW,EAgBf,OAfAD,EAAKX,OAAO7e,SAAQ,SAAAkb,GACdA,EAAMuE,SAAWA,IACnBA,EAAWvE,EAAMuE,SAErB,IACIA,EAAW,IACb1S,GAAO,cAAgB0S,EAAW,QAGhCD,EAAKV,kBACPU,EAAKV,iBAAiB9e,SAAQ,SAAA0f,GAC5B3S,GAAOkI,GAASuG,YAAYkE,EAC9B,IAGK3S,CACT,EAIAkI,GAAS0K,2BAA6B,SAASnJ,GAC7C,IAUIoJ,EAVEC,EAAqB,GACrB/S,EAAcmI,GAAS2J,mBAAmBpI,GAC1CsJ,GAAsD,IAA7ChT,EAAYiS,cAAc9U,QAAQ,OAC3C8V,GAA4D,IAAhDjT,EAAYiS,cAAc9U,QAAQ,UAG9C4S,EAAQ5H,GAASkC,YAAYX,EAAc,WAC9C5c,KAAI,SAAAqf,G,OAAQhE,GAASqH,eAAerD,E,IACpCxU,QAAO,SAAAsV,G,MAA6B,UAApBA,EAAM2C,S,IACnBsD,EAAcnD,EAAMjnB,OAAS,GAAKinB,EAAM,GAAGL,KAG3CyD,EAAQhL,GAASkC,YAAYX,EAAc,oBAC9C5c,KAAI,SAAAqf,GAEH,OADcA,EAAK7D,UAAU,IAAI4D,MAAM,KAC1Bpf,KAAI,SAAAggB,G,OAAQ5c,SAAS4c,EAAM,G,GAC1C,IACEqG,EAAMrqB,OAAS,GAAKqqB,EAAM,GAAGrqB,OAAS,GAAKqqB,EAAM,GAAG,KAAOD,IAC7DJ,EAAgBK,EAAM,GAAG,IAG3BnT,EAAY+R,OAAO7e,SAAQ,SAAAkb,GACzB,GAAiC,QAA7BA,EAAMjb,KAAK8C,eAA2BmY,EAAMY,WAAWoE,IAAK,CAC9D,IAAIC,EAAW,CACb3D,KAAMwD,EACNI,iBAAkBpjB,SAASke,EAAMY,WAAWoE,IAAK,KAE/CF,GAAeJ,IACjBO,EAASE,IAAM,CAAC7D,KAAMoD,IAExBC,EAAmBnqB,KAAKyqB,GACpBL,KACFK,EAAW3c,KAAKC,MAAMD,KAAKE,UAAUyc,KAC5BG,IAAM,CACb9D,KAAMwD,EACNO,UAAWR,EAAY,aAAe,OAExCF,EAAmBnqB,KAAKyqB,GAE5B,CACF,IACkC,IAA9BN,EAAmBjqB,QAAgBoqB,GACrCH,EAAmBnqB,KAAK,CACtB8mB,KAAMwD,IAKV,IAAIQ,EAAYvL,GAASkC,YAAYX,EAAc,MAenD,OAdIgK,EAAU5qB,SAEV4qB,EADsC,IAApCA,EAAU,GAAGvW,QAAQ,WACXjN,SAASwjB,EAAU,GAAGpL,UAAU,GAAI,IACL,IAAlCoL,EAAU,GAAGvW,QAAQ,SAElB,IAAAjN,SAASwjB,EAAU,GAAGpL,UAAU,GAAI,IACzC,UAEK3V,EAEdogB,EAAmB7f,SAAQ,SAAAsR,GACzBA,EAAOmP,WAAaD,CACtB,KAEKX,CACT,EAGA5K,GAASyL,oBAAsB,SAASlK,GACtC,IAAMmK,EAAiB,CAAC,EAIlBC,EAAa3L,GAASkC,YAAYX,EAAc,WACnD5c,KAAI,SAAAqf,G,OAAQhE,GAASqH,eAAerD,E,IACpCxU,QAAO,SAAAtQ,G,MAAyB,UAAlBA,EAAIuoB,S,IAAuB,GACxCkE,IACFD,EAAeE,MAAQD,EAAW1pB,MAClCypB,EAAenE,KAAOoE,EAAWpE,MAKnC,IAAMsE,EAAQ7L,GAASkC,YAAYX,EAAc,gBACjDmK,EAAeI,YAAcD,EAAMlrB,OAAS,EAC5C+qB,EAAeK,SAA4B,IAAjBF,EAAMlrB,OAIhC,IAAMqrB,EAAMhM,GAASkC,YAAYX,EAAc,cAG/C,OAFAmK,EAAeM,IAAMA,EAAIrrB,OAAS,EAE3B+qB,CACT,EAEA1L,GAASiM,oBAAsB,SAASP,GACtC,IAAI5T,EAAM,GAWV,OAVI4T,EAAeI,cACjBhU,GAAO,oBAEL4T,EAAeM,MACjBlU,GAAO,uBAEmBtN,IAAxBkhB,EAAenE,MAAsBmE,EAAeE,QACtD9T,GAAO,UAAY4T,EAAenE,KAChC,UAAYmE,EAAeE,MAAQ,QAEhC9T,CACT,EAKAkI,GAASkM,UAAY,SAAS3K,GAC5B,IAAIuD,EACEqH,EAAOnM,GAASkC,YAAYX,EAAc,WAChD,GAAoB,IAAhB4K,EAAKxrB,OAEP,MAAO,CAAC4Q,QADRuT,EAAQqH,EAAK,GAAGhM,UAAU,GAAG4D,MAAM,MACb,GAAI3Y,MAAO0Z,EAAM,IAEzC,IAAMsH,EAAQpM,GAASkC,YAAYX,EAAc,WAC9C5c,KAAI,SAAAqf,G,OAAQhE,GAASqH,eAAerD,E,IACpCxU,QAAO,SAAA6c,G,MAAqC,SAAxBA,EAAU5E,S,IACjC,OAAI2E,EAAMzrB,OAAS,EAEV,CAAC4Q,QADRuT,EAAQsH,EAAM,GAAGnqB,MAAM8hB,MAAM,MACP,GAAI3Y,MAAO0Z,EAAM,SAFzC,CAIF,EAKA9E,GAASsM,qBAAuB,SAAS/K,GACvC,IAEIU,EAFE+H,EAAQhK,GAASyB,WAAWF,GAC5BgL,EAAcvM,GAASkC,YAAYX,EAAc,uBAEnDgL,EAAY5rB,OAAS,IACvBshB,EAAiBla,SAASwkB,EAAY,GAAGpM,UAAU,IAAK,KAEtDqM,MAAMvK,KACRA,EAAiB,OAEnB,IAAMwK,EAAWzM,GAASkC,YAAYX,EAAc,gBACpD,GAAIkL,EAAS9rB,OAAS,EACpB,MAAO,CACLwkB,KAAMpd,SAAS0kB,EAAS,GAAGtM,UAAU,IAAK,IAC1CuB,SAAUsI,EAAM0C,IAChBzK,kBAGJ,IAAM0K,EAAe3M,GAASkC,YAAYX,EAAc,cACxD,GAAIoL,EAAahsB,OAAS,EAAG,CAC3B,IAAMmkB,EAAQ6H,EAAa,GACxBxM,UAAU,IACV4D,MAAM,KACT,MAAO,CACLoB,KAAMpd,SAAS+c,EAAM,GAAI,IACzBpD,SAAUoD,EAAM,GAChB7C,iBAEJ,CACF,EAOAjC,GAAS4M,qBAAuB,SAASC,EAAOrK,GAC9C,IAAIsK,EAAS,GAiBb,OAfEA,EADqB,cAAnBD,EAAMnL,SACC,CACP,KAAOmL,EAAMnd,KAAO,MAAQmd,EAAMnL,SAAW,IAAMc,EAAKd,SAAW,OACnE,uBACA,eAAiBc,EAAK2C,KAAO,QAGtB,CACP,KAAO0H,EAAMnd,KAAO,MAAQmd,EAAMnL,SAAW,IAAMc,EAAK2C,KAAO,OAC/D,uBACA,aAAe3C,EAAK2C,KAAO,IAAM3C,EAAKd,SAAW,mBAGzBlX,IAAxBgY,EAAKP,gBACP6K,EAAOrsB,KAAK,sBAAwB+hB,EAAKP,eAAiB,QAErD6K,EAAO5I,KAAK,GACrB,EAMAlE,GAAS+M,kBAAoB,WAC3B,OAAO9oB,KAAKugB,SAAS9e,WAAWsnB,OAAO,EAAG,GAC5C,EAOAhN,GAASiN,wBAA0B,SAASC,EAAQC,EAASC,GAC3D,IACM9e,OAAsB9D,IAAZ2iB,EAAwBA,EAAU,EAQlD,MAAO,aAFMC,GAAY,qBAGP,KARdF,GAGUlN,GAAS+M,qBAKa,IAAMze,EADnC,uCAKT,EAGA0R,GAASqN,aAAe,SAAS9L,EAAc2G,GAG7C,IADA,IAAMhB,EAAQlH,GAAS0E,WAAWnD,GACzBvgB,EAAI,EAAGA,EAAIkmB,EAAMvmB,OAAQK,IAChC,OAAQkmB,EAAMlmB,IACZ,IAAK,aACL,IAAK,aACL,IAAK,aACL,IAAK,aACH,OAAOkmB,EAAMlmB,GAAGmf,UAAU,GAKhC,OAAI+H,EACKlI,GAASqN,aAAanF,GAExB,UACT,EAEAlI,GAASsN,QAAU,SAAS/L,GAG1B,OAFcvB,GAAS0E,WAAWnD,GACd,GAAGwC,MAAM,KAChB,GAAG5D,UAAU,EAC5B,EAEAH,GAASuN,WAAa,SAAShM,GAC7B,MAAyC,MAAlCA,EAAawC,MAAM,IAAK,GAAG,EACpC,EAEA/D,GAASyB,WAAa,SAASF,GAC7B,IACMuD,EADQ9E,GAAS0E,WAAWnD,GACd,GAAGpB,UAAU,GAAG4D,MAAM,KAC1C,MAAO,CACLrU,KAAMoV,EAAM,GACZK,KAAMpd,SAAS+c,EAAM,GAAI,IACzBpD,SAAUoD,EAAM,GAChB4H,IAAK5H,EAAM1gB,MAAM,GAAG8f,KAAK,KAE7B,EAEAlE,GAASwN,WAAa,SAASjM,GAC7B,IACMuD,EADO9E,GAASkC,YAAYX,EAAc,MAAM,GACnCpB,UAAU,GAAG4D,MAAM,KACtC,MAAO,CACL0J,SAAU3I,EAAM,GAChB4I,UAAW5I,EAAM,GACjB6I,eAAgB5lB,SAAS+c,EAAM,GAAI,IACnC8I,QAAS9I,EAAM,GACf+I,YAAa/I,EAAM,GACnBI,QAASJ,EAAM,GAEnB,EAGA9E,GAAS8N,WAAa,SAAS/nB,GAC7B,GAAoB,iBAATA,GAAqC,IAAhBA,EAAKpF,OACnC,OAAO,EAGT,IADA,IAAMumB,EAAQlH,GAAS0E,WAAW3e,GACzB/E,EAAI,EAAGA,EAAIkmB,EAAMvmB,OAAQK,IAChC,GAAIkmB,EAAMlmB,GAAGL,OAAS,GAA4B,MAAvBumB,EAAMlmB,GAAG6M,OAAO,GACzC,OAAO,EAIX,OAAO,CACT,EAIE0S,GAAiBP,GEnxBnB,ICP6B+N,GC2C7BC,GFpCMC,GGIC,W,IAAwBhuB,GAAA0I,UAAAhI,OAAA,YAAAgI,UAAA,GAAAA,UAAA,GAAW,CAAC,GAAX1I,OAAcge,EAAAtV,UAAAhI,OAAA,YAAAgI,UAAA,GAAAA,UAAA,GAAU,CACtDulB,YAAY,EACZC,aAAa,EACbC,YAAY,GAGNC,EAAU3kB,EACVqD,EtB8HD,SAAuB9E,GAE5B,IAAMkD,EAAS,CAAC4W,QAAS,KAAMzT,QAAS,MAGxC,QAAsB,IAAXrG,IAA2BA,EAAO+E,UAE3C,OADA7B,EAAO4W,QAAU,iBACV5W,EAGT,IAAM6B,EAAc/E,EAAb+E,UAEP,GAAIA,EAAUshB,gBACZnjB,EAAO4W,QAAU,UACjB5W,EAAOmD,QAAU5G,EAAesF,EAAUuhB,UACxC,mBAAoB,QACjB,GAAIvhB,EAAUmE,qBACW,IAA3BlJ,EAAOumB,iBAA6BvmB,EAAOuR,wBAK9CrO,EAAO4W,QAAU,SACjB5W,EAAOmD,QAAU5G,EAAesF,EAAUuhB,UACxC,wBAAyB,OACtB,KAAItmB,EAAOG,oBACd4E,EAAUuhB,UAAUzmB,MAAM,wBAQ5B,OADAqD,EAAO4W,QAAU,2BACV5W,EAPPA,EAAO4W,QAAU,SACjB5W,EAAOmD,QAAU5G,EAAesF,EAAUuhB,UACxC,uBAAwB,GAC1BpjB,EAAOsjB,oBAAsBxmB,EAAOymB,mBAChC,qBAAsBzmB,EAAOymB,kBAAkBpuB,SAIrD,CAEA,OAAO6K,CACT,CsBpKyBwjB,CAAoB1uB,GAErC2uB,EAAU,CACd7hB,iBACA8hB,WAAAC,GACAC,eAAgBrnB,EAChBsnB,WAAYzlB,EACZ0lB,gBAAiBxlB,EAEjBqO,IAAAyI,IAIF,OAAQxT,EAAegV,SACrB,IAAK,SACH,IAAKmN,IAAeA,EAAWC,qBAC1BlR,EAAQiQ,WAEX,OADAG,EAAQ,wDACDO,EAET,GAA+B,OAA3B7hB,EAAeuB,QAEjB,OADA+f,EAAQ,wDACDO,EAETP,EAAQ,+BAERO,EAAQQ,YAAcF,EAGtBJ,GAAWO,+BAA+BpvB,EAAQ8M,GAClD+hB,GAAWQ,qCAAqCrvB,EAAQ8M,GAExDmiB,EAAWK,iBAAiBtvB,EAAQ8M,GACpCmiB,EAAWM,gBAAgBvvB,EAAQ8M,GACnCmiB,EAAWC,mBAAmBlvB,EAAQ8M,GACtCmiB,EAAWO,YAAYxvB,EAAQ8M,GAC/BmiB,EAAWQ,wBAAwBzvB,EAAQ8M,GAC3CmiB,EAAWS,uBAAuB1vB,EAAQ8M,GAC1CmiB,EAAWU,aAAa3vB,EAAQ8M,GAChCmiB,EAAWW,2BAA2B5vB,EAAQ8M,GAC9CmiB,EAAWY,qBAAqB7vB,EAAQ8M,GAExC+hB,GAAWiB,oBAAoB9vB,EAAQ8M,GACvC+hB,GAAWkB,iCAAiC/vB,EAAQ8M,GACpD+hB,GAAWmB,oBAAoBhwB,EAAQ8M,GACvC+hB,GAAWoB,mBAAmBjwB,EAAQ8M,GACtC+hB,GAAWqB,uBAAuBlwB,EAAQ8M,GAC1C+hB,GAAWsB,uBAAuBnwB,EAAQ8M,GAC1C,MACF,IAAK,UACH,IAAKsjB,IAAgBA,EAAYlB,qBAC5BlR,EAAQkQ,YAEX,OADAE,EAAQ,yDACDO,EAETP,EAAQ,gCAERO,EAAQQ,YAAciB,EAGtBvB,GAAWO,+BAA+BpvB,EAAQ8M,GAClD+hB,GAAWQ,qCAAqCrvB,EAAQ8M,GAExDsjB,EAAYd,iBAAiBtvB,EAAQ8M,GACrCsjB,EAAYlB,mBAAmBlvB,EAAQ8M,GACvCsjB,EAAYZ,YAAYxvB,EAAQ8M,GAChCsjB,EAAYC,iBAAiBrwB,EAAQ8M,GACrCsjB,EAAYE,mBAAmBtwB,EAAQ8M,GACvCsjB,EAAYG,qBAAqBvwB,EAAQ8M,GACzCsjB,EAAYI,mBAAmBxwB,EAAQ8M,GACvCsjB,EAAYK,mBAAmBzwB,EAAQ8M,GACvCsjB,EAAYM,kBAAkB1wB,EAAQ8M,GACtCsjB,EAAYO,gBAAgB3wB,EAAQ8M,GACpCsjB,EAAYQ,iBAAiB5wB,EAAQ8M,GAErC+hB,GAAWiB,oBAAoB9vB,EAAQ8M,GACvC+hB,GAAWmB,oBAAoBhwB,EAAQ8M,GACvC+hB,GAAWoB,mBAAmBjwB,EAAQ8M,GACtC+hB,GAAWqB,uBAAuBlwB,EAAQ8M,GAC1C,MACF,IAAK,SACH,IAAK+jB,KAAe7S,EAAQmQ,WAE1B,OADAC,EAAQ,wDACDO,EAETP,EAAQ,+BAERO,EAAQQ,YAAc0B,GAGtBhC,GAAWO,+BAA+BpvB,EAAQ8M,GAClD+hB,GAAWQ,qCAAqCrvB,EAAQ8M,GAExD+jB,GAAWC,qBAAqB9wB,EAAQ8M,GACxC+jB,GAAWE,sBAAsB/wB,EAAQ8M,GACzC+jB,GAAWG,iBAAiBhxB,EAAQ8M,GACpC+jB,GAAWI,oBAAoBjxB,EAAQ8M,GACvC+jB,GAAWK,qBAAqBlxB,EAAQ8M,GACxC+jB,GAAWM,0BAA0BnxB,EAAQ8M,GAC7C+jB,GAAWvB,iBAAiBtvB,EAAQ8M,GACpC+jB,GAAWO,iBAAiBpxB,EAAQ8M,GAEpC+hB,GAAWiB,oBAAoB9vB,EAAQ8M,GACvC+hB,GAAWkB,iCAAiC/vB,EAAQ8M,GACpD+hB,GAAWoB,mBAAmBjwB,EAAQ8M,GACtC+hB,GAAWqB,uBAAuBlwB,EAAQ8M,GAC1C+hB,GAAWsB,uBAAuBnwB,EAAQ8M,GAC1C,MACF,QACEshB,EAAQ,wBAIZ,OAAOO,CACT,CH5HE,CAAe,CAAC3uB,OAA0B,oBAAXA,YAAyBuK,EAAYvK,SACtEqxB,GAAerD,GCbTsD,GAELD,GAAqB,SAAWA,GAEpBE,GAAW,KAAKzD,GAAA,WACnBjuB,KAAA2xB,MAAQ,CAAC,OAAQ,SAAU,QAAQ1hB,SAAS/C,UAAU0kB,UACtD5xB,KAAA6xB,kBAAoB,CAAC,UAAW,SAAU,UAE1C7xB,KAAA8xB,kBAAoB,GACpB9xB,KAAA+xB,iBAAmB,GACnB/xB,KAAAgyB,iBAAmB,GAoE7B,GAlECxxB,UAAAyxB,kBAAA,WACC,MAAoC,oBAAtB3pB,iBACf,EAEA2lB,GAAAztB,UAAA0xB,mBAAA,WACC,IAAMjQ,EAAUjiB,KAAKmyB,aACf3jB,EAAUxO,KAAKoyB,aAIrB,QAFqBpyB,KAAK6xB,kBAAkB5hB,SAASgS,KAIrC,WAAZA,EAA6BzT,GAAWxO,KAAK+xB,iBACjC,YAAZ9P,EAA8BzT,GAAWxO,KAAK8xB,kBAClC,WAAZ7P,IACKjiB,KAAK2xB,OAASnjB,GAAWxO,KAAKgyB,iBAGxC,EAEA/D,GAAAztB,UAAA2xB,WAAA,WACC,OAAOV,GAAcxkB,eAAegV,OACrC,EAEAgM,GAAAztB,UAAA4xB,WAAA,WACC,OAAOX,GAAcxkB,eAAeuB,SAAW,CAChD,EAEAyf,GAAAztB,UAAA6xB,uBAAA,WACC,IAWIC,EAXErQ,EAAUjiB,KAAKmyB,aACf3jB,EAAUijB,GAAcxkB,eAAeuB,SAAW,EAExD,GAAgB,WAAZyT,GAAwBzT,EAAUxO,KAAK+xB,iBAAkB,OAAO,EACpE,GAAgB,YAAZ9P,GAAyBzT,GAAWxO,KAAK8xB,kBAAmB,OAAO,EACvE,IACE3xB,OAAOyuB,qBACN,qBAAsBA,kBAAkBpuB,WAE1C,OAAO,EAGR,IAAI+xB,GAAY,EAEhB,KACCD,EAAS,IAAIhqB,mBACNuT,eAAe,SACtB0W,GAAY,CACZ,CAAC,MAAO7yB,GACR,SACI4yB,GACHA,EAAOE,OAER,CAED,OAAOD,CACR,EAEAtE,GAAAztB,UAAAoF,SAAA,WACC,MAAO,0BAAAwI,OACKpO,KAAKmyB,aAAY,kBAAA/jB,OACjBpO,KAAKoyB,aAAY,gBAAAhkB,OACnBpO,KAAK2xB,MAAK,4BAAAvjB,OACEpO,KAAKiyB,oBAAmB,6BAAA7jB,OACvBpO,KAAKkyB,qBAAoB,iCAAA9jB,OACrBpO,KAAKqyB,yBACjC,EACDpE,IC9CMwE,GAAiB,CACtB1T,WAAY,CACX,CAAEG,KAAM,gCACR,CACCA,KAAM,CACL,iCACA,kCAEDyO,SAAU,SACV+E,WAAY,YAGd3Y,aAAc,gBAmKF4Y,GAAO,KAhKpBzE,GAAA,WAGUluB,KAAA4yB,WAAa,eACb5yB,KAAA6yB,WAAa,IAGb7yB,KAAA8yB,gBAAkB,CAAEC,OAAQ,EAAGC,OAAQ,GACvChzB,KAAAizB,WAAa,MAGbjzB,KAAAkzB,cAAgBT,GAEhBzyB,KAAAiiB,QAAUyP,GAASS,aACnBnyB,KAAAmzB,eAAiBzB,GAASU,aAS1BpyB,KAAAozB,SAAW,WACnB,IAWI/e,EAXEke,EAA6B,CAClCtQ,QAASyP,GAASQ,qBAClBmB,OAAQ3B,GAASO,oBACjBqB,YAAY,EACZ5yB,MAAM,EACN6yB,YAAY,EACZC,UAAU,GAGX,IAAKjB,EAAUc,OAAQ,OAAOd,EAI9B,IACCle,EAAK,IAAI/L,kBAAkBmqB,IAE3BF,EAAUe,YAAa,EAEvB,IAAIzQ,OAAE,EAEN,IACCA,EAAKxO,EAAG6O,kBAAkB,cAAe,CAAEuQ,SAAS,IACpDlB,EAAU7xB,MAAO,EACjB6xB,EAAUiB,WAAa3Q,EAAG4Q,QAG1B,IACC5Q,EAAG6Q,WAAa,OAChBnB,EAAUgB,YAAc7B,GAASC,KACjC,CAAC,MAAOjyB,GAAG,CACZ,CAAC,MAAOA,GACR,SACImjB,GACHA,EAAG2P,OAEJ,CACD,CAAC,MAAO9yB,GACR,SACI2U,GACHA,EAAGme,OAEJ,CAED,OAAOD,CACR,CA7CoB,GAqDpBvyB,KAAA2C,KAAOF,EAAAE,KACP3C,KAAA0C,OAASD,EAAAC,OAID1C,KAAA2zB,WAAqB,CAoE9B,GApJCnzB,UAAAozB,KAAA,WAAc,EAsEd1F,GAAA1tB,UAAAqzB,WAAA,SAAW7oB,GAEV,OAAQA,GAAM,uCAAuC6B,KAAK7B,EAC3D,EASAkjB,GAAA1tB,UAAAszB,MAAA,SACC7tB,GASA,IAPA,IAAM8tB,EAAS,GACTl0B,EAAOoG,EAAKpG,KACZm0B,EAAQ7vB,KAAK8vB,KAAKp0B,EAAO8yB,GAAKM,YAEhC3xB,EAAQ,EACR4yB,EAAQ,EAELA,EAAQr0B,GAAM,CACpB,IAAMs0B,EAAMhwB,KAAKwJ,IAAI9N,EAAMq0B,EAAQvB,GAAKM,YAClClkB,EAAI9I,EAAK3B,MAAM4vB,EAAOC,GAEtBL,EAAQ,CACbM,WAAYp0B,KAAK2zB,WACjBpsB,EAAGjG,EACHZ,KAAMqO,EACNilB,MAAKA,GAGND,EAAOpzB,KAAKmzB,GAEZI,EAAQC,EACR7yB,GACA,CAID,OAFAtB,KAAK2zB,aAEEI,CACR,EAEA7F,GAAA1tB,UAAA6zB,kBAAA,SACCpuB,EACA0C,GAEA,IAAM2rB,EAAK,IAAIC,WAUf,OARAD,EAAGE,OAAS,SAAUC,GACjBA,EAAI5a,QACPlR,EAAG8rB,EAAI5a,OAAOxO,OAEhB,EAEAipB,EAAGI,kBAAkBzuB,GAEdquB,CACR,EAEApG,GAAA1tB,UAAAm0B,0BAAA,SAA0BC,GAGzB,IAFA,IAAMC,EAAY,IAAIj1B,WAAWg1B,EAAO/zB,QAE/BK,EAAI,EAAGA,EAAI0zB,EAAO/zB,OAAQK,IAClC2zB,EAAU3zB,GAA4B,IAAvB0zB,EAAOE,WAAW5zB,GAGlC,OAAO2zB,EAAU9zB,MAClB,EAEAmtB,GAAA1tB,UAAAu0B,YAAA,WACC,OAAO5wB,KAAKugB,SAAS9e,SAAS,IAAItB,MAAM,EACzC,EAEA4pB,GAAA1tB,UAAAw0B,SAAA,WACC,MAA6B,WAAtBC,SAASrT,QACjB,EACDsM,I,6EEpMIgH,GAAM9yB,OAAO5B,UAAU8G,eACvB6tB,GAAS,IASb,SAASC,KAAU,CA4BnB,SAASC,GAAGC,EAAIC,EAASC,GACvBx1B,KAAKs1B,GAAKA,EACVt1B,KAAKu1B,QAAUA,EACfv1B,KAAKw1B,KAAOA,IAAQ,CACtB,CAaA,SAASC,GAAYC,EAAS5hB,EAAOwhB,EAAIC,EAASC,GAChD,GAAkB,mBAAPF,EACT,MAAM,IAAIhpB,UAAU,mCAGtB,IAAIqpB,EAAW,IAAIN,GAAGC,EAAIC,GAAWG,EAASF,GAC1Cf,EAAMU,GAASA,GAASrhB,EAAQA,EAMpC,OAJK4hB,EAAQE,QAAQnB,GACXiB,EAAQE,QAAQnB,GAAKa,GAC1BI,EAAQE,QAAQnB,GAAO,CAACiB,EAAQE,QAAQnB,GAAMkB,GADhBD,EAAQE,QAAQnB,GAAK9zB,KAAKg1B,IADlCD,EAAQE,QAAQnB,GAAOkB,EAAUD,EAAQG,gBAI7DH,CACT,CASA,SAASI,GAAWJ,EAASjB,GACI,KAAzBiB,EAAQG,aAAoBH,EAAQE,QAAU,IAAIR,UAC5CM,EAAQE,QAAQnB,EAC9B,CASA,SAASsB,KACP/1B,KAAK41B,QAAU,IAAIR,GACnBp1B,KAAK61B,aAAe,CACtB,CAzEIzzB,OAAO4zB,SACTZ,GAAO50B,UAAY4B,OAAO4zB,OAAO,OAM5B,IAAIZ,IAASa,YAAWd,IAAS,IA2ExCY,GAAav1B,UAAU01B,WAAa,WAClC,IACIC,EACAjrB,EAFAyL,EAAQ,GAIZ,GAA0B,IAAtB3W,KAAK61B,aAAoB,OAAOlf,EAEpC,IAAKzL,KAASirB,EAASn2B,KAAK41B,QACtBV,GAAI9qB,KAAK+rB,EAAQjrB,IAAOyL,EAAMhW,KAAKw0B,GAASjqB,EAAK5G,MAAM,GAAK4G,GAGlE,OAAI9I,OAAOg0B,sBACFzf,EAAMvI,OAAOhM,OAAOg0B,sBAAsBD,IAG5Cxf,CACT,EASAof,GAAav1B,UAAU61B,UAAY,SAAmBviB,GACpD,IAAI2gB,EAAMU,GAASA,GAASrhB,EAAQA,EAChCwiB,EAAWt2B,KAAK41B,QAAQnB,GAE5B,IAAK6B,EAAU,MAAO,GACtB,GAAIA,EAAShB,GAAI,MAAO,CAACgB,EAAShB,IAElC,IAAK,IAAIp0B,EAAI,EAAGq1B,EAAID,EAASz1B,OAAQ21B,EAAK,IAAI5xB,MAAM2xB,GAAIr1B,EAAIq1B,EAAGr1B,IAC7Ds1B,EAAGt1B,GAAKo1B,EAASp1B,GAAGo0B,GAGtB,OAAOkB,CACT,EASAT,GAAav1B,UAAUi2B,cAAgB,SAAuB3iB,GAC5D,IAAI2gB,EAAMU,GAASA,GAASrhB,EAAQA,EAChCuiB,EAAYr2B,KAAK41B,QAAQnB,GAE7B,OAAK4B,EACDA,EAAUf,GAAW,EAClBe,EAAUx1B,OAFM,CAGzB,EASAk1B,GAAav1B,UAAUk2B,KAAO,SAAc5iB,EAAO6iB,EAAIC,EAAIC,EAAIC,EAAIC,GACjE,IAAItC,EAAMU,GAASA,GAASrhB,EAAQA,EAEpC,IAAK9T,KAAK41B,QAAQnB,GAAM,OAAO,EAE/B,IAEIvb,EACAhY,EAHAm1B,EAAYr2B,KAAK41B,QAAQnB,GACzBjoB,EAAM3D,UAAUhI,OAIpB,GAAIw1B,EAAUf,GAAI,CAGhB,OAFIe,EAAUb,MAAMx1B,KAAKg3B,eAAeljB,EAAOuiB,EAAUf,QAAI5qB,GAAW,GAEhE8B,GACN,KAAK,EAAG,OAAO6pB,EAAUf,GAAGlrB,KAAKisB,EAAUd,UAAU,EACrD,KAAK,EAAG,OAAOc,EAAUf,GAAGlrB,KAAKisB,EAAUd,QAASoB,IAAK,EACzD,KAAK,EAAG,OAAON,EAAUf,GAAGlrB,KAAKisB,EAAUd,QAASoB,EAAIC,IAAK,EAC7D,KAAK,EAAG,OAAOP,EAAUf,GAAGlrB,KAAKisB,EAAUd,QAASoB,EAAIC,EAAIC,IAAK,EACjE,KAAK,EAAG,OAAOR,EAAUf,GAAGlrB,KAAKisB,EAAUd,QAASoB,EAAIC,EAAIC,EAAIC,IAAK,EACrE,KAAK,EAAG,OAAOT,EAAUf,GAAGlrB,KAAKisB,EAAUd,QAASoB,EAAIC,EAAIC,EAAIC,EAAIC,IAAK,EAG3E,IAAK71B,EAAI,EAAGgY,EAAO,IAAItU,MAAM4H,EAAK,GAAItL,EAAIsL,EAAKtL,IAC7CgY,EAAKhY,EAAI,GAAK2H,UAAU3H,GAG1Bm1B,EAAUf,GAAG1sB,MAAMytB,EAAUd,QAASrc,EACxC,KAAO,CACL,IACIjU,EADApE,EAASw1B,EAAUx1B,OAGvB,IAAKK,EAAI,EAAGA,EAAIL,EAAQK,IAGtB,OAFIm1B,EAAUn1B,GAAGs0B,MAAMx1B,KAAKg3B,eAAeljB,EAAOuiB,EAAUn1B,GAAGo0B,QAAI5qB,GAAW,GAEtE8B,GACN,KAAK,EAAG6pB,EAAUn1B,GAAGo0B,GAAGlrB,KAAKisB,EAAUn1B,GAAGq0B,SAAU,MACpD,KAAK,EAAGc,EAAUn1B,GAAGo0B,GAAGlrB,KAAKisB,EAAUn1B,GAAGq0B,QAASoB,GAAK,MACxD,KAAK,EAAGN,EAAUn1B,GAAGo0B,GAAGlrB,KAAKisB,EAAUn1B,GAAGq0B,QAASoB,EAAIC,GAAK,MAC5D,KAAK,EAAGP,EAAUn1B,GAAGo0B,GAAGlrB,KAAKisB,EAAUn1B,GAAGq0B,QAASoB,EAAIC,EAAIC,GAAK,MAChE,QACE,IAAK3d,EAAM,IAAKjU,EAAI,EAAGiU,EAAO,IAAItU,MAAM4H,EAAK,GAAIvH,EAAIuH,EAAKvH,IACxDiU,EAAKjU,EAAI,GAAK4D,UAAU5D,GAG1BoxB,EAAUn1B,GAAGo0B,GAAG1sB,MAAMytB,EAAUn1B,GAAGq0B,QAASrc,GAGpD,CAEA,OAAO,CACT,EAWA6c,GAAav1B,UAAUy2B,GAAK,SAAYnjB,EAAOwhB,EAAIC,GACjD,OAAOE,GAAYz1B,KAAM8T,EAAOwhB,EAAIC,GAAS,EAC/C,EAWAQ,GAAav1B,UAAUg1B,KAAO,SAAc1hB,EAAOwhB,EAAIC,GACrD,OAAOE,GAAYz1B,KAAM8T,EAAOwhB,EAAIC,GAAS,EAC/C,EAYAQ,GAAav1B,UAAUw2B,eAAiB,SAAwBljB,EAAOwhB,EAAIC,EAASC,GAClF,IAAIf,EAAMU,GAASA,GAASrhB,EAAQA,EAEpC,IAAK9T,KAAK41B,QAAQnB,GAAM,OAAOz0B,KAC/B,IAAKs1B,EAEH,OADAQ,GAAW91B,KAAMy0B,GACVz0B,KAGT,IAAIq2B,EAAYr2B,KAAK41B,QAAQnB,GAE7B,GAAI4B,EAAUf,GAEVe,EAAUf,KAAOA,GACfE,IAAQa,EAAUb,MAClBD,GAAWc,EAAUd,UAAYA,GAEnCO,GAAW91B,KAAMy0B,OAEd,CACL,IAAK,IAAIvzB,EAAI,EAAGi1B,EAAS,GAAIt1B,EAASw1B,EAAUx1B,OAAQK,EAAIL,EAAQK,KAEhEm1B,EAAUn1B,GAAGo0B,KAAOA,GACnBE,IAASa,EAAUn1B,GAAGs0B,MACtBD,GAAWc,EAAUn1B,GAAGq0B,UAAYA,IAErCY,EAAOx1B,KAAK01B,EAAUn1B,IAOtBi1B,EAAOt1B,OAAQb,KAAK41B,QAAQnB,GAAyB,IAAlB0B,EAAOt1B,OAAes1B,EAAO,GAAKA,EACpEL,GAAW91B,KAAMy0B,EACxB,CAEA,OAAOz0B,IACT,EASA+1B,GAAav1B,UAAU02B,mBAAqB,SAA4BpjB,GACtE,IAAI2gB,EAUJ,OARI3gB,GACF2gB,EAAMU,GAASA,GAASrhB,EAAQA,EAC5B9T,KAAK41B,QAAQnB,IAAMqB,GAAW91B,KAAMy0B,KAExCz0B,KAAK41B,QAAU,IAAIR,GACnBp1B,KAAK61B,aAAe,GAGf71B,IACT,EAKA+1B,GAAav1B,UAAU22B,IAAMpB,GAAav1B,UAAUw2B,eACpDjB,GAAav1B,UAAU42B,YAAcrB,GAAav1B,UAAUy2B,GAK5DlB,GAAasB,SAAWlC,GAKxBY,GAAauB,aAAevB,GAM1BwB,GAAiBxB,G,qJCrUPyB,GAAAC,G,8dATNC,GAAa,YASPD,GAAAD,QAAQ,KAInBC,GAAA,uBAIAA,MAAA,mBAIAA,MAAA,uBAIAA,MAAA,aAGD,IAAAE,GC5BYC,GAAAC,GAKAC,GAAAC,GAyDAC,GAAAC,GAMAC,GAAAC,GAOAC,GAAAC,GD/CZC,IAAAX,GAAA,WACS33B,KAAAu4B,UAAYf,GAASgB,QAiD9B,EA/CCp2B,OAAAC,eAAIs1B,GAAAn3B,UAAA,WAAJ,CAAAgJ,IAAA,WACC,OAAOxJ,KAAKu4B,SACb,EAEApvB,IAAA,SAAasvB,GACZz4B,KAAKu4B,UAAYE,CAClB,E,gCAEAd,GAAAn3B,UAAAuG,IAAA,WAAI,QAAAmS,EAAA,GAAAwf,EAAA,EAAAA,EAAA7vB,UAAAhI,OAAA63B,IAAAxf,EAAAwf,GAAA7vB,UAAA6vB,GACC14B,KAAKu4B,WAAaf,GAASmB,KAC9B34B,KAAK44B,OAAMhwB,MAAX5I,KAAI64B,GAAA,CAAQrB,GAASmB,KAAGG,GAAK5f,IAAI,GAEnC,EAEAye,GAAAn3B,UAAAyJ,KAAA,WAAK,QAAAiP,EAAA,GAAAwf,EAAA,EAAAA,EAAA7vB,UAAAhI,OAAA63B,IAAAxf,EAAAwf,GAAA7vB,UAAA6vB,GACA14B,KAAKu4B,WAAaf,GAASuB,UAC9B/4B,KAAK44B,OAAMhwB,MAAX5I,KAAI64B,GAAA,CAAQrB,GAASuB,UAAQD,GAAK5f,IAAI,GAExC,EAEAye,GAAAn3B,UAAAwS,MAAA,WAAM,QAAAkG,EAAA,GAAAwf,EAAA,EAAAA,EAAA7vB,UAAAhI,OAAA63B,IAAAxf,EAAAwf,GAAA7vB,UAAA6vB,GACD14B,KAAKu4B,WAAaf,GAASwB,QAC9Bh5B,KAAK44B,OAAMhwB,MAAX5I,KAAI64B,GAAA,CAAQrB,GAASwB,QAAMF,GAAK5f,IAAI,GAEtC,EAEAye,GAAAn3B,UAAAy4B,eAAA,SAAe3D,GACdt1B,KAAK44B,OAAStD,CACf,EAEQqC,GAAAn3B,UAAAo4B,OAAR,SAAeH,GAAoB,QAAAS,EAAA,GAAAR,EAAA,EAAAA,EAAA7vB,UAAAhI,OAAA63B,IAAAQ,EAAAR,EAAA,GAAA7vB,UAAA6vB,GAClC,IAAMS,EAAIN,GAAA,CAAInB,IAAUoB,GAAKI,IAAI,GAEjC,IAAK,IAAMh4B,KAAKi4B,EACXA,EAAKj4B,aAAcmD,QACtB80B,EAAKj4B,GAAK,IAAMi4B,EAAKj4B,GAAGgK,KAAO,KAAOiuB,EAAKj4B,GAAG6P,SAI5C0nB,GAAYjB,GAASmB,IACxB9uB,QAAQ9C,IAAG6B,MAAXiB,QAAOgvB,GAAA,GAAAC,GAAQK,IAAI,IACTV,GAAYjB,GAASuB,SAC/BlvB,QAAQI,KAAIrB,MAAZiB,QAAOgvB,GAAA,CAAM,WAASC,GAAKK,IAAI,IACrBV,GAAYjB,GAASwB,QAC/BnvB,QAAQmJ,MAAKpK,MAAbiB,QAAOgvB,GAAA,CAAO,SAAOC,GAAKK,IAAI,GAEhC,EACDxB,IAEAyB,GAAe,IAAId,G,yEChFPT,GAAAD,QAAc,KACzB,YACAC,GAAA,eAGWE,GAAAD,QAAa,KAIxB,2CAIAC,GAAA,4BAIAA,GAAA,uBAIAA,GAAA,yBAIAA,GAAA,kBAIAA,GAAA,mCAIAA,GAAA,iCAIAA,GAAA,2BAIAA,GAAA,2BAIAA,GAAA,6BAUAA,GAAA,+BAIAA,GAAA,iBAGWE,GAAAD,QAAiB,KAC5B,gBACAC,GAAA,yBACAA,GAAA,aAGWE,GAAAD,QAAe,KAC1B,kBACAC,GAAA,4BACAA,GAAA,cACAA,GAAA,eAGWE,GAAAD,QAAiB,KAC5B,sBACAC,GAAA,sBACAA,GAAA,cACAA,GAAA,gBACAA,GAAA,YACAA,GAAA,cACAA,GAAA,mBACAA,GAAA,yBACAA,GAAA,cACAA,GAAA,gB,OCrFDgB,GAAiB5qB,KAAKC,MAAM,49J,OCS5B4qB,GAQCC,G,wtCARDC,IAAAF,GAA4B/B,GAAAD,aAAAmC,GAQ3BF,GAAA,SACCG,EACAC,EACAtU,EACAuU,EACA13B,EACiB23B,QAAA,IAAAA,MAAA,KANlB,IAAAhmB,EAQCylB,GAAAlvB,KAAApK,OAAOA,KAFU6T,EAAAgmB,eAbVhmB,EAAAimB,eAAyB,EAEzBjmB,EAAAkmB,eAAgC,GAevC,IAAMC,EAAaN,EAAS,SAAW,Q,OAEvC7lB,EAAKomB,SAAWD,EAAaL,EAAO,IAAMtU,EAAOuU,EAAO,cAAgB13B,E,CACzE,EArB2Bo3B,IAuB3BC,GAAA/4B,UAAA0zB,MAAA,SAAMlpB,EAAYkvB,GAAlB,IAAArmB,EAAA7T,KACCA,KAAKm6B,IAAMnvB,EAEX,IAAMovB,EAAQ,GAAAhsB,OAAGpO,KAAKi6B,SAAQ,QAAA7rB,OAAOpD,EAAE,WAAAoD,OAAU8rB,IAE3Cl6B,KAAKq6B,SAAYr6B,KAAK85B,gBAI5B95B,KAAKq6B,QAAU,IAAIC,UAAUF,EAAQ,YAAcf,GAAA7qB,SACnDxO,KAAK85B,eAAgB,EAErB95B,KAAKq6B,QAAQE,UAAY,SAACzmB,GACzB,IAAIpT,EAEJ,IACCA,EAAO+N,KAAKC,MAAMoF,EAAMpT,MACxB85B,GAAAC,QAAO1zB,IAAI,2BAA4BrG,EACvC,CAAC,MAAOhB,GAER,YADA86B,GAAAC,QAAO1zB,IAAI,yBAA0B+M,EAAMpT,KAE3C,CAEDmT,EAAK6iB,KAAKwB,GAAgBwC,QAASh6B,EACpC,EAEAV,KAAKq6B,QAAQM,QAAU,SAAC7mB,GACnBD,EAAKimB,gBAITU,GAAAC,QAAO1zB,IAAI,iBAAkB+M,GAE7BD,EAAK+mB,WACL/mB,EAAKimB,eAAgB,EAErBjmB,EAAK6iB,KAAKwB,GAAgB2C,cAC3B,EAIA76B,KAAKq6B,QAAQS,OAAS,WACjBjnB,EAAKimB,gBAITjmB,EAAKknB,sBAELP,GAAAC,QAAO1zB,IAAI,eAEX8M,EAAKmnB,qBACN,EACD,EAEQzB,GAAA/4B,UAAAw6B,mBAAR,eAAAnnB,EAAA7T,KACCA,KAAKi7B,aAAeC,YAAW,WAC9BrnB,EAAKsnB,gBACN,GAAGn7B,KAAK65B,aACT,EAEQN,GAAA/4B,UAAA26B,eAAR,WACC,GAAKn7B,KAAKo7B,UAAV,CAKA,IAAMrqB,EAAUtC,KAAKE,UAAU,CAAE9L,KAAMu1B,GAAkBiD,YAEzDr7B,KAAKq6B,QAAStX,KAAKhS,GAEnB/Q,KAAKg7B,oBANJ,MAFAR,GAAAC,QAAO1zB,IAAI,+CASb,EAGQwyB,GAAA/4B,UAAA46B,QAAR,WACC,QAASp7B,KAAKq6B,SAAuC,IAA5Br6B,KAAKq6B,QAAQrX,UACvC,EAGQuW,GAAA/4B,UAAAu6B,oBAAR,W,QAGOO,EAAWC,GAAA,GAAAC,GAAOx7B,KAAK+5B,iBAAc,GAC3C/5B,KAAK+5B,eAAiB,G,IAEtB,IAAsB,IAAA0B,EAAAC,GAAAJ,GAAWK,EAAAF,EAAAG,QAAAD,EAAAE,KAAAF,EAAAF,EAAAG,OAAE,CAA9B,IAAM7qB,EAAO4qB,EAAAx5B,MACjBnC,KAAK+iB,KAAKhS,EACV,C,kGACF,EAGAwoB,GAAA/4B,UAAAuiB,KAAA,SAAKriB,GACJ,IAAIV,KAAK85B,cAMT,GAAK95B,KAAKm6B,IAKV,GAAKz5B,EAAKmC,MAKV,GAAK7C,KAAKo7B,UAAV,CAIA,IAAMrqB,EAAUtC,KAAKE,UAAUjO,GAE/BV,KAAKq6B,QAAStX,KAAKhS,EALlB,OALA/Q,KAAK02B,KAAKwB,GAAgB7zB,MAAO,wBALjCrE,KAAK+5B,eAAep5B,KAAKD,EAgB3B,EAEA64B,GAAA/4B,UAAAgyB,MAAA,WACKxyB,KAAK85B,gBAIT95B,KAAK46B,WAEL56B,KAAK85B,eAAgB,EACtB,EAEQP,GAAA/4B,UAAAo6B,SAAR,WACK56B,KAAKq6B,UACRr6B,KAAKq6B,QAAQS,OACZ96B,KAAKq6B,QAAQE,UACbv6B,KAAKq6B,QAAQM,QACZ,KACF36B,KAAKq6B,QAAQ7H,QACbxyB,KAAKq6B,aAAU3vB,GAGhBoxB,aAAa97B,KAAKi7B,aACnB,EACD1B,I,qKC5JCwC,G,kkDAJDC,KAICD,GAAA,SAAqBE,GAAAj8B,KAAAi8B,YAAgB,GAGrCz7B,UAAA07B,gBAAA,SAAgB/d,GACf,IAAMge,EAAiBn8B,KAAKo8B,uBAU5B,GAPAp8B,KAAKi8B,WAAWE,eAAiBA,EAE7Bn8B,KAAKi8B,WAAWp5B,OAAS+0B,GAAeyE,OAASle,EAAQme,SAC5Dt8B,KAAKu8B,uBAAuBpe,EAAQme,QAASH,GAI1Che,EAAQqe,WAAY,CACvB,GAAIx8B,KAAKi8B,WAAWp5B,OAAS+0B,GAAe6E,KAAM,CACjD,IAAMC,EAA2C18B,KAAKi8B,WAEhDU,EAA6B,CAAElJ,UAAWtV,EAAQqV,UAElDrQ,EAAcgZ,EAAejZ,kBAClCwZ,EAAe3sB,MACf4sB,GAEDD,EAAeE,WAAWzZ,EAC1B,CAEDnjB,KAAK68B,YACL,MACA78B,KAAK88B,UAAU,QAAS3e,EAAQnG,IAElC,EAGQ+jB,GAAAv7B,UAAA47B,qBAAR,WACC5B,GAAAC,QAAO1zB,IAAI,+BAEX,IAAMo1B,EAAiB,IAAI7zB,kBAC1BtI,KAAKi8B,WAAWc,SAAS5e,QAAQwe,QAKlC,OAFA38B,KAAKg9B,gBAAgBb,GAEdA,CACR,EAGQJ,GAAAv7B,UAAAw8B,gBAAR,SAAwBb,GAAxB,IAAAtoB,EAAA7T,KACOi9B,EAASj9B,KAAKi8B,WAAWiB,KACzBC,EAAen9B,KAAKi8B,WAAWkB,aAC/BC,EAAiBp9B,KAAKi8B,WAAWp5B,KACjCk6B,EAAW/8B,KAAKi8B,WAAWc,SAGjCvC,GAAAC,QAAO1zB,IAAI,iCAEXo1B,EAAekB,eAAiB,SAAC5I,GAC3BA,EAAInW,WAAcmW,EAAInW,UAAUA,YAErCkc,GAAAC,QAAO1zB,IAAI,+BAAAqH,OAA+B6uB,EAAM,KAAKxI,EAAInW,WAEzDye,EAASO,OAAOva,KAAK,CACpBlgB,KAAMu1B,GAAkBmF,UACxBC,QAAS,CACRlf,UAAWmW,EAAInW,UACfzb,KAAMu6B,EACND,aAAcA,GAEfM,IAAKR,IAEP,EAEAd,EAAeuB,2BAA6B,WAC3C,OAAQvB,EAAe3Y,oBACtB,IAAK,SACJgX,GAAAC,QAAO1zB,IACN,wDAA0Dk2B,GAE3DppB,EAAKooB,WAAWvF,KACf,QACA,IAAIryB,MAAM,gCAAkC44B,EAAS,aAEtDppB,EAAKooB,WAAWzJ,QAChB,MACD,IAAK,SACJgI,GAAAC,QAAO1zB,IACN,wDAA0Dk2B,GAE3DppB,EAAKooB,WAAWvF,KACf,QACA,IAAIryB,MAAM,iBAAmB44B,EAAS,aAEvCppB,EAAKooB,WAAWzJ,QAChB,MACD,IAAK,eACJgI,GAAAC,QAAO1zB,IACN,qEACCk2B,GAEF,MACD,IAAK,YACJd,EAAekB,eAAiB1K,GAAKiB,KAIvC/f,EAAKooB,WAAWvF,KACf,kBACAyF,EAAe3Y,mBAEjB,EAGAgX,GAAAC,QAAO1zB,IAAI,8BAGXo1B,EAAewB,cAAgB,SAAClJ,GAC/B+F,GAAAC,QAAO1zB,IAAI,yBAEX,IAAMoc,EAAcsR,EAAIrR,QAEvB2Z,EAASa,cAAcX,EAAQE,GAGrBP,WAAWzZ,EACvB,EAGAqX,GAAAC,QAAO1zB,IAAI,+BAEXo1B,EAAe0B,QAAU,SAACpJ,GACzB+F,GAAAC,QAAO1zB,IAAI,0BAEX,IAAM0K,EAASgjB,EAAIxgB,QAAQ,GACrBgoB,EAAac,EAASa,cAAcX,EAAQE,GAElD,GAAIlB,EAAWp5B,OAAS+0B,GAAeyE,MAAO,CAC7C,IAAMyB,EAAmC7B,EAEzCpoB,EAAKkqB,4BAA4BtsB,EAAQqsB,EACzC,CACF,CACD,EAEA/B,GAAAv7B,UAAAw9B,QAAA,WACCxD,GAAAC,QAAO1zB,IAAI,iCAAmC/G,KAAKi8B,WAAWiB,MAE9D,IAAMf,EAAiBn8B,KAAKi8B,WAAWE,eAEvC,GAAKA,EAAL,CAIAn8B,KAAKi8B,WAAWE,eAAiB,KAGjCA,EAAekB,eACdlB,EAAeuB,2BACfvB,EAAewB,cACfxB,EAAe0B,QACd,WAAO,EAET,IAAMI,EAA4D,WAAlC9B,EAAevjB,eAC3CslB,GAAuB,EAE3B,GAAIl+B,KAAKi8B,WAAWp5B,OAAS+0B,GAAe6E,KAAM,CACjD,IACMtZ,EAD2CnjB,KAAKi8B,WACnB9Y,YAE/BA,IACH+a,IACG/a,EAAYH,YAAyC,WAA3BG,EAAYH,WAE1C,EAEGib,GAA2BC,IAC9B/B,EAAe3J,OA1Bf,CA4BF,EAEcuJ,GAAAv7B,UAAAq8B,WAAd,WAA4B,OAAAsB,GAAAn+B,UAAA,EAAA+R,SAAA,W,qEACrBoqB,EAAiBn8B,KAAKi8B,WAAWE,eACjCY,EAAW/8B,KAAKi8B,WAAWc,S,iBAGlB,O,sBAAA,GAAMZ,EAAepf,YAClC/c,KAAKi8B,WAAW9d,QAAQ7P,c,OADnB8vB,EAAQC,EAAAC,OAId9D,GAAAC,QAAO1zB,IAAI,kBAGV/G,KAAKi8B,WAAW9d,QAAQogB,cACwB,mBAAzCv+B,KAAKi8B,WAAW9d,QAAQogB,eAE/BH,EAAMpmB,IACLhY,KAAKi8B,WAAW9d,QAAQogB,aAAaH,EAAMpmB,MAAQomB,EAAMpmB,K,iBAI1D,O,sBAAA,GAAMmkB,EAAe9iB,oBAAoB+kB,I,cAAzCC,EAAAC,OAEA9D,GAAAC,QAAO1zB,IACN,wBACAq3B,EACA,OAAAhwB,OAAOpO,KAAKi8B,WAAWiB,OAGpBM,EAAe,CAClBxlB,IAAKomB,EACLv7B,KAAM7C,KAAKi8B,WAAWp5B,KACtBs6B,aAAcn9B,KAAKi8B,WAAWkB,aAC9BqB,SAAUx+B,KAAKi8B,WAAWuC,SAC1Bvc,QAAS0Q,GAAK1Q,SAGXjiB,KAAKi8B,WAAWp5B,OAAS+0B,GAAe6E,OACrCC,EAA2C18B,KAAKi8B,WAEtDuB,EAAOiB,MAAA,GACHjB,GAAO,CACVztB,MAAO2sB,EAAe3sB,MACtByjB,SAAUkJ,EAAelJ,SACzBkL,cAAehC,EAAegC,iBAIhC3B,EAASO,OAAOva,KAAK,CACpBlgB,KAAMu1B,GAAkBuG,MACxBnB,QAAOA,EACPC,IAAKz9B,KAAKi8B,WAAWiB,O,mBAMrB,2F,cAEAH,EAAS6B,UAAU9G,GAAc+G,OAAQC,GACzCtE,GAAAC,QAAO1zB,IAAI,kCAAmC+3B,I,kDAIhD/B,EAAS6B,UAAU9G,GAAc+G,OAAQE,GACzCvE,GAAAC,QAAO1zB,IAAI,0BAA2Bg4B,G,6BAEvC,EAEahD,GAAAv7B,UAAAw+B,YAAd,WAA6B,OAAAb,GAAAn+B,UAAA,EAAA+R,SAAA,W,iEACtBoqB,EAAiBn8B,KAAKi8B,WAAWE,eACjCY,EAAW/8B,KAAKi8B,WAAWc,S,iBAGjB,O,sBAAA,GAAMZ,EAAehf,gB,OAA9B8hB,EAASZ,EAAAC,OACf9D,GAAAC,QAAO1zB,IAAI,mBAGV/G,KAAKi8B,WAAW9d,QAAQogB,cACwB,mBAAzCv+B,KAAKi8B,WAAW9d,QAAQogB,eAE/BU,EAAOjnB,IACNhY,KAAKi8B,WAAW9d,QAAQogB,aAAaU,EAAOjnB,MAAQinB,EAAOjnB,K,iBAI5D,O,sBAAA,GAAMmkB,EAAe9iB,oBAAoB4lB,I,cAAzCZ,EAAAC,OAEA9D,GAAAC,QAAO1zB,IACN,wBACAk4B,EACA,OAAA7wB,OAAOpO,KAAKi8B,WAAWiB,OAGxBH,EAASO,OAAOva,KAAK,CACpBlgB,KAAMu1B,GAAkB8G,OACxB1B,QAAS,CACRxlB,IAAKinB,EACLp8B,KAAM7C,KAAKi8B,WAAWp5B,KACtBs6B,aAAcn9B,KAAKi8B,WAAWkB,aAC9Blb,QAAS0Q,GAAK1Q,SAEfwb,IAAKz9B,KAAKi8B,WAAWiB,O,+BAGtBH,EAAS6B,UAAU9G,GAAc+G,OAAQM,GACzC3E,GAAAC,QAAO1zB,IAAI,kCAAmCo4B,G,kDAG/CpC,EAAS6B,UAAU9G,GAAc+G,OAAQO,GACzC5E,GAAAC,QAAO1zB,IAAI,4BAA6Bq4B,G,6BAEzC,EAGKrD,GAAAv7B,UAAAs8B,UAAN,SAAgBj6B,EAAcmV,GAAW,OAAAmmB,GAAAn+B,UAAA,EAAA+R,SAAA,W,+DACxCiG,EAAM,IAAIO,sBAAsBP,GAC1BmkB,EAAiBn8B,KAAKi8B,WAAWE,eACjCY,EAAW/8B,KAAKi8B,WAAWc,SAEjCvC,GAAAC,QAAO1zB,IAAI,6BAA8BiR,GAEnCqnB,EAAOr/B,K,iBAGZ,O,sBAAA,GAAMm8B,EAAe3oB,qBAAqBwE,I,OAEtC,OAFJqmB,EAAAC,OACA9D,GAAAC,QAAO1zB,IAAI,yBAAAqH,OAAyBvL,EAAI,SAAAuL,OAAQpO,KAAKi8B,WAAWiB,OACnD,UAATr6B,EAAA,MACH,GAAMw8B,EAAKL,e,OAAXX,EAAAC,O,sDAGDvB,EAAS6B,UAAU9G,GAAc+G,OAAQS,GACzC9E,GAAAC,QAAO1zB,IAAI,mCAAoCu4B,G,6BAEhD,EAGKvD,GAAAv7B,UAAA++B,gBAAN,SAAsBC,GAAW,OAAArB,GAAAn+B,UAAA,EAAA+R,SAAA,W,mEAChCyoB,GAAAC,QAAO1zB,IAAI,mBAAoBy4B,GAEzBlhB,EAAYkhB,EAAIlhB,UAChBwC,EAAgB0e,EAAI1e,cACpBD,EAAS2e,EAAI3e,OACbsb,EAAiBn8B,KAAKi8B,WAAWE,eACjCY,EAAW/8B,KAAKi8B,WAAWc,S,iBAGhC,O,sBAAA,GAAMZ,EAAene,gBACpB,IAAIrE,gBAAgB,CACnBkH,OAAQA,EACRC,cAAeA,EACfxC,UAAWA,M,cAJb+f,EAAAC,OAOA9D,GAAAC,QAAO1zB,IAAI,2BAAAqH,OAA2BpO,KAAKi8B,WAAWiB,O,+BAEtDH,EAAS6B,UAAU9G,GAAc+G,OAAQY,GACzCjF,GAAAC,QAAO1zB,IAAI,8BAA+B04B,G,6BAE3C,EAEO1D,GAAAv7B,UAAA+7B,uBAAR,SACC9qB,EACA0qB,GAIA,GAFA3B,GAAAC,QAAO1zB,IAAI,0BAAAqH,OAA0BqD,EAAOzG,GAAE,yBAEzCmxB,EAAetnB,SACnB,OAAO2lB,GAAAC,QAAOznB,MACb,oEAIFvB,EAAOG,YAAY3G,SAAQ,SAACK,GAC3B6wB,EAAetnB,SAASvJ,EAAOmG,EAChC,GACD,EAEQsqB,GAAAv7B,UAAAu9B,4BAAR,SACCtsB,EACAqsB,GAEAtD,GAAAC,QAAO1zB,IACN,cAAAqH,OAAcqD,EAAOzG,GAAE,yBAAAoD,OAAwB0vB,EAAgBX,eAGhEW,EAAgBzoB,UAAU5D,EAC3B,EACDsqB,I,ojBCtWA2D,GAAA,SAAApG,G,IAwBCqG,EAAA,SAIUzC,EACFH,EACE5e,GANV,IAAAtK,EAQCylB,EAAAlvB,KAAApK,OAAOA,K,OAJE6T,EAAAqpB,OACFrpB,EAAAkpB,WACElpB,EAAAsK,UA3BAtK,EAAA+rB,OAAQ,EA+BjB/rB,EAAK2qB,SAAWrgB,EAAQqgB,S,CACzB,EAQD,OAzCUqB,GAAAF,EAAArG,GAkBTl3B,OAAAC,eAAIs9B,EAAAn/B,UAAA,OAAJ,CAAAgJ,IAAA,WACC,OAAOxJ,KAAK4/B,KACb,E,gCAqBDD,CAAA,CA3CA,CAEUpI,GAAAD,c,g+BCDVwI,GAAA,SAAAxG,GAqBC,SAAAyG,EAAY9C,EAAgBF,EAAgB5e,GAA5C,IAAAtK,EACCylB,EAAAlvB,KAAApK,KAAMi9B,EAAQF,EAAU5e,IAAQne,K,OAEhC6T,EAAKmsB,aAAensB,EAAKsK,QAAQme,QACjCzoB,EAAKspB,aACJtpB,EAAKsK,QAAQgf,cACb4C,EAAgBE,UAAYtN,GAAKoC,cAElClhB,EAAKqsB,YAAc,IAAI,EAAAC,GAAApE,YAAWloB,GAE9BA,EAAKmsB,cACRnsB,EAAKqsB,YAAYhE,gBAAgB,CAChCI,QAASzoB,EAAKmsB,aACdxD,YAAY,I,CAGf,CAuGD,OA5IqC4D,GAAAL,EAAAzG,GAUpCl3B,OAAAC,eAAI09B,EAAAv/B,UAAA,OAAJ,CAAAgJ,IAAA,WACC,OAAOouB,GAAeyE,KACvB,E,gCAEAj6B,OAAAC,eAAI09B,EAAAv/B,UAAA,cAAJ,CAAAgJ,IAAA,WACC,OAAOxJ,KAAKggC,YACb,E,gCACA59B,OAAAC,eAAI09B,EAAAv/B,UAAA,eAAJ,CAAAgJ,IAAA,WACC,OAAOxJ,KAAKqgC,aACb,E,gCAoBAN,EAAAv/B,UAAA6U,UAAA,SAAUirB,GACT9F,GAAAC,QAAO1zB,IAAI,mBAAoBu5B,GAE/BtgC,KAAKqgC,cAAgBC,EACrBhH,EAAA94B,UAAMk2B,KAAItsB,KAAApK,KAAC,SAAUsgC,EACtB,EAKAP,EAAAv/B,UAAA+/B,cAAA,SAAcxvB,GACb,IAAMlO,EAAOkO,EAAQlO,KACf26B,EAAUzsB,EAAQysB,QAExB,OAAQzsB,EAAQlO,MACf,KAAKu1B,GAAkB8G,OAEtBl/B,KAAKkgC,YAAYpD,UAAUj6B,EAAM26B,EAAQxlB,KACzChY,KAAK4/B,OAAQ,EACb,MACD,KAAKxH,GAAkBmF,UACtBv9B,KAAKkgC,YAAYX,gBAAgB/B,EAAQlf,WACzC,MACD,QACCkc,GAAAC,QAAOxwB,KAAK,6BAAAmE,OAA6BvL,EAAI,eAAAuL,OAAcpO,KAAKk9B,OAGnE,EAYA6C,EAAAv/B,UAAAy+B,OAAA,SAAOxtB,EAAsB0M,G,QAC5B,QAD4B,IAAAA,MAAA,IACxBne,KAAKggC,aACRxF,GAAAC,QAAOxwB,KACN,4FAFF,CAOAjK,KAAKggC,aAAevuB,EAEhB0M,GAAWA,EAAQogB,eACtBv+B,KAAKme,QAAQogB,aAAepgB,EAAQogB,cAGrCv+B,KAAKkgC,YAAYhE,gBAAesE,MAAA,GAC5BxgC,KAAKme,QAAQsiB,UAAQ,CACxBnE,QAAS7qB,KAGV,IAAMivB,EAAW1gC,KAAK+8B,SAAS4D,aAAa3gC,KAAKm9B,c,IAEjD,IAAsB,IAAAyD,EAAAC,GAAAH,GAAQI,EAAAF,EAAAhF,QAAAkF,EAAAjF,KAAAiF,EAAAF,EAAAhF,OAAE,CAA3B,IAAM7qB,EAAO+vB,EAAA3+B,MACjBnC,KAAKugC,cAAcxvB,EACnB,C,kGAED/Q,KAAK4/B,OAAQ,CAnBZ,CAoBF,EASAG,EAAAv/B,UAAAgyB,MAAA,WACKxyB,KAAKkgC,cACRlgC,KAAKkgC,YAAYlC,UACjBh+B,KAAKkgC,YAAc,MAGpBlgC,KAAKggC,aAAe,KACpBhgC,KAAKqgC,cAAgB,KAEjBrgC,KAAK+8B,WACR/8B,KAAK+8B,SAASgE,kBAAkB/gC,MAEhCA,KAAK+8B,SAAW,MAGb/8B,KAAKme,SAAWne,KAAKme,QAAQme,UAChCt8B,KAAKme,QAAQme,QAAU,MAGnBt8B,KAAKghC,OAIVhhC,KAAK4/B,OAAQ,EAEbtG,EAAA94B,UAAMk2B,KAAItsB,KAAApK,KAAC,SACZ,EA1IwB+/B,EAAAE,UAAY,MA2IrCF,CAAC,CA5ID,CAAqCkB,GAAAtB,gB,uoBCrBrCuB,GAAA,SAAA5H,G,IAMC6H,EAAA,eAAAttB,EACCylB,EAAAlvB,KAAApK,OAAOA,K,OANC6T,EAAAutB,WAAyB,IAAI7M,WAE9B1gB,EAAAwtB,OAAiB,GACjBxtB,EAAAytB,aAAuB,EAK9BztB,EAAKutB,WAAW5M,OAAS,SAACC,GACzB5gB,EAAKytB,aAAc,EAEf7M,EAAI5a,QACPhG,EAAK6iB,KAAK,OAAQjC,EAAI5a,OAAOxO,QAG9BwI,EAAK0tB,YACN,EAEA1tB,EAAKutB,WAAWI,QAAU,SAAC/M,GAC1B+F,GAAAC,QAAOznB,MAAM,uBAAwByhB,GACrC5gB,EAAKytB,aAAc,EACnBztB,EAAK4tB,UACL5tB,EAAK6iB,KAAK,QAASjC,EACpB,E,CACD,EAmCD,OA5DmCiN,GAAAP,EAAA7H,GA2BlCl3B,OAAAC,eAAI8+B,EAAA3gC,UAAA,QAAJ,CAAAgJ,IAAA,WACC,OAAOxJ,KAAKqhC,MACb,E,gCAEAj/B,OAAAC,eAAI8+B,EAAA3gC,UAAA,OAAJ,CAAAgJ,IAAA,WACC,OAAOxJ,KAAK2hC,MAAM9gC,MACnB,E,gCAEAuB,OAAAC,eAAI8+B,EAAA3gC,UAAA,aAAJ,CAAAgJ,IAAA,WACC,OAAOxJ,KAAKshC,WACb,E,gCAEAH,EAAA3gC,UAAAohC,MAAA,SAAM37B,GACLjG,KAAK2hC,MAAMhhC,KAAKsF,GAEZjG,KAAK6hC,YAET7hC,KAAKuhC,YACN,EAEAJ,EAAA3gC,UAAAihC,QAAA,WACCzhC,KAAKohC,WAAWU,QAChB9hC,KAAKqhC,OAAS,EACf,EAEQF,EAAA3gC,UAAA+gC,WAAR,WACmB,IAAdvhC,KAAKH,OACLG,KAAK6hC,aAET7hC,KAAKshC,aAAc,EAEnBthC,KAAKohC,WAAW1M,kBAAkB10B,KAAK2hC,MAAMngB,UAC9C,EACD2f,CAAA,CA5DA,CAAmC5J,GAAAD,c,6wBC8BnCyK,GAAA,SAAAzI,GAwDC,SAAA0I,EAAY/E,EAAgBF,EAAgB5e,GAA5C,IAAAtK,EACCylB,EAAAlvB,KAAApK,KAAMi9B,EAAQF,EAAU5e,IAAQne,K,OApCjC6T,EAAAlF,UAAmCF,KAAKE,UACxCkF,EAAAnF,MAA+BD,KAAKC,MAM5BmF,EAAAouB,QAAiB,GAIjBpuB,EAAAquB,YAAc,EACdruB,EAAAsuB,YAAa,EACbtuB,EAAAuuB,aAMJ,GAGIvuB,EAAAwuB,eAAiB,IAAI,EAAAC,GAAAnB,eAgB5BttB,EAAKspB,aACJtpB,EAAKsK,QAAQgf,cACb6E,EAAe/B,UAAYtN,GAAKoC,cAEjClhB,EAAK9D,MAAQ8D,EAAKsK,QAAQpO,OAAS8D,EAAKspB,aACxCtpB,EAAK6qB,cAAgB7qB,EAAKsK,QAAQugB,eAAiB1G,GAAkBuK,OACrE1uB,EAAK2f,WAAa3f,EAAKsK,QAAQqV,SAE/B3f,EAAKwuB,eAAepL,GAAG,QAAQ,SAACuL,GAC/B3uB,EAAK4uB,cAAcD,EACpB,IAEA3uB,EAAKwuB,eAAepL,GAAG,SAAS,WAC/BuD,GAAAC,QAAOznB,MACN,MAAA5E,OAAMyF,EAAKspB,aAAY,mEAExBtpB,EAAK2e,OACN,IAEA3e,EAAKqsB,YAAc,IAAI,EAAAC,GAAApE,YAAWloB,GAElCA,EAAKqsB,YAAYhE,gBAChBroB,EAAKsK,QAAQsiB,UAAY,CACxBjE,YAAY,I,CAGf,CAgRD,OApWSkG,GAAAV,EAAA1I,GAuBRl3B,OAAAC,eAAI2/B,EAAAxhC,UAAA,OAAJ,CAAAgJ,IAAA,WACC,OAAOouB,GAAe6E,IACvB,E,gCAsBAr6B,OAAAC,eAAI2/B,EAAAxhC,UAAA,cAAJ,CAAAgJ,IAAA,WACC,OAAOxJ,KAAK2iC,GACb,E,gCAEAvgC,OAAAC,eAAI2/B,EAAAxhC,UAAA,aAAJ,CAAAgJ,IAAA,WACC,OAAOxJ,KAAKkiC,WACb,E,gCAkCAF,EAAAxhC,UAAAo8B,WAAA,SAAW/Z,GACV7iB,KAAK2iC,IAAM9f,EACX7iB,KAAK4iC,uBACN,EAEQZ,EAAAxhC,UAAAoiC,sBAAR,eAAA/uB,EAAA7T,KACM2yB,GAAKS,SAASG,aAAcZ,GAAKS,SAASI,WAC9CxzB,KAAKmjB,YAAYuQ,WAAa,eAG/B1zB,KAAKmjB,YAAY2X,OAAS,WACzBN,GAAAC,QAAO1zB,IAAI,MAAAqH,OAAMyF,EAAKspB,aAAY,2BAClCtpB,EAAK+rB,OAAQ,EACb/rB,EAAK6iB,KAAK,OACX,EAEA12B,KAAKmjB,YAAYoX,UAAY,SAAC76B,GAC7B86B,GAAAC,QAAO1zB,IAAI,MAAAqH,OAAMyF,EAAKspB,aAAY,kBAAkBz9B,EAAEgB,MACtDmT,EAAKgvB,mBAAmBnjC,EACzB,EAEAM,KAAKmjB,YAAYwX,QAAU,WAC1BH,GAAAC,QAAO1zB,IAAI,MAAAqH,OAAMyF,EAAKspB,aAAY,mBAAmBtpB,EAAKqpB,MAC1DrpB,EAAK2e,OACN,CACD,EAGQwP,EAAAxhC,UAAAqiC,mBAAR,SAA2BxE,GAA3B,IAAAxqB,EAAA7T,KACCU,EAAI29B,EAAA39B,KAIEoiC,EAAWpiC,EAAKrB,YAMlB0jC,EAAwBriC,EAE5B,GALCV,KAAK0+B,gBAAkB1G,GAAkBuK,QACzCviC,KAAK0+B,gBAAkB1G,GAAkBgL,WAIf,CAC1B,GAAIF,IAAarjC,KAMhB,YAJAkzB,GAAK0B,kBAAkB3zB,GAAc,SAAC8hC,GACrC,IAAMS,EAAetQ,GAAKjwB,OAAO8/B,GACjC3uB,EAAK6iB,KAAK,OAAQuM,EACnB,IAEM,GAAIH,IAAap9B,YACvBq9B,EAAmBpQ,GAAKjwB,OAAOhC,QACzB,GAAIoiC,IAAar+B,OAAQ,CAE/B,IAAM+9B,EAAK7P,GAAKgC,0BAA0Bj0B,GAC1CqiC,EAAmBpQ,GAAKjwB,OAAO8/B,EAC/B,CACD,MAAUxiC,KAAK0+B,gBAAkB1G,GAAkBvpB,OACnDs0B,EAAmB/iC,KAAK0O,MAAMhO,IAK3BqiC,EAAiB3O,WACpBp0B,KAAKkjC,aAAaH,GAInBzJ,EAAA94B,UAAMk2B,KAAItsB,KAAApK,KAAC,OAAQ+iC,EACpB,EAEQf,EAAAxhC,UAAA0iC,aAAR,SAAqBxiC,GAMpB,IAAMsK,EAAKtK,EAAK0zB,WACV+O,EAAYnjC,KAAKoiC,aAAap3B,IAAO,CAC1CtK,KAAM,GACN0iC,MAAO,EACPpP,MAAOtzB,EAAKszB,OAOb,GAJAmP,EAAUziC,KAAKA,EAAK6G,GAAK7G,EAAKA,KAC9ByiC,EAAUC,QACVpjC,KAAKoiC,aAAap3B,GAAMm4B,EAEpBA,EAAUnP,QAAUmP,EAAUC,MAAO,QAEjCpjC,KAAKoiC,aAAap3B,GAGzB,IAAMq4B,EAAO,IAAI5jC,KAAK0jC,EAAUziC,MAChCV,KAAK6iC,mBAAmB,CAAEniC,KAAI2iC,GAC9B,CACF,EAOArB,EAAAxhC,UAAAgyB,MAAA,WACCxyB,KAAKiiC,QAAU,GACfjiC,KAAKkiC,YAAc,EACnBliC,KAAKoiC,aAAe,GAEhBpiC,KAAKkgC,cACRlgC,KAAKkgC,YAAYlC,UACjBh+B,KAAKkgC,YAAc,MAGhBlgC,KAAK+8B,WACR/8B,KAAK+8B,SAASgE,kBAAkB/gC,MAEhCA,KAAK+8B,SAAW,MAGb/8B,KAAKmjB,cACRnjB,KAAKmjB,YAAY2X,OAAS,KAC1B96B,KAAKmjB,YAAYoX,UAAY,KAC7Bv6B,KAAKmjB,YAAYwX,QAAU,KAC3B36B,KAAK2iC,IAAM,MAGR3iC,KAAKqiC,iBACRriC,KAAKqiC,eAAeZ,UACpBzhC,KAAKqiC,eAAenL,qBACpBl3B,KAAKqiC,eAAiB,MAGlBriC,KAAKghC,OAIVhhC,KAAK4/B,OAAQ,EAEbtG,EAAA94B,UAAMk2B,KAAItsB,KAAApK,KAAC,SACZ,EAOAgiC,EAAAxhC,UAAAuiB,KAAA,SAAKriB,EAAW4iC,GACf,GAAKtjC,KAAKghC,KAUV,GAAIhhC,KAAK0+B,gBAAkB1G,GAAkBvpB,KAC5CzO,KAAKyiC,cAAcziC,KAAK2O,UAAUjO,SAC5B,GACNV,KAAK0+B,gBAAkB1G,GAAkBuK,QACzCviC,KAAK0+B,gBAAkB1G,GAAkBgL,WACxC,CACD,IAAM/8B,EAAO0sB,GAAKhwB,KAAKjC,GAEvB,IAAK4iC,GAAWr9B,EAAKpG,KAAO8yB,GAAKM,WAEhC,YADAjzB,KAAKujC,YAAYt9B,GAIb0sB,GAAKS,SAASG,WAKlBvzB,KAAKyiC,cAAcx8B,GAFnBjG,KAAKqiC,eAAeT,MAAM37B,EAI3B,MACAjG,KAAKyiC,cAAc/hC,QA9BnB44B,EAAA94B,UAAMk2B,KAAItsB,KAAApK,KACT,QACA,IAAIqE,MACH,2FA6BJ,EAEQ29B,EAAAxhC,UAAAiiC,cAAR,SAAsBe,IACjBxjC,KAAKmiC,YAAeniC,KAAKyjC,SAASD,KACrCxjC,KAAKiiC,QAAQthC,KAAK6iC,GAClBxjC,KAAKkiC,YAAcliC,KAAKiiC,QAAQphC,OAElC,EAGQmhC,EAAAxhC,UAAAijC,SAAR,SAAiBD,GAAjB,IAAA3vB,EAAA7T,KACC,IAAKA,KAAKghC,KACT,OAAO,EAGR,GAAIhhC,KAAKmjB,YAAYugB,eAAiB1B,EAAe2B,oBAOpD,OANA3jC,KAAKmiC,YAAa,EAClBjH,YAAW,WACVrnB,EAAKsuB,YAAa,EAClBtuB,EAAK+vB,YACN,GAAG,KAEI,EAGR,IACC5jC,KAAKmjB,YAAYJ,KAAKygB,EACtB,CAAC,MAAO9jC,GAMR,OALA86B,GAAAC,QAAOznB,MAAM,OAAA5E,OAAOpO,KAAKm9B,aAAY,wBAAwBz9B,GAC7DM,KAAKmiC,YAAa,EAElBniC,KAAKwyB,SAEE,CACP,CAED,OAAO,CACR,EAGQwP,EAAAxhC,UAAAojC,WAAR,WACC,GAAK5jC,KAAKghC,MAIkB,IAAxBhhC,KAAKiiC,QAAQphC,OAAjB,CAIA,IAAM2iC,EAAMxjC,KAAKiiC,QAAQ,GAErBjiC,KAAKyjC,SAASD,KACjBxjC,KAAKiiC,QAAQzgB,QACbxhB,KAAKkiC,YAAcliC,KAAKiiC,QAAQphC,OAChCb,KAAK4jC,aARL,CAUF,EAEQ5B,EAAAxhC,UAAA+iC,YAAR,SAAoBt9B,G,QACb49B,EAAQlR,GAAKmB,MAAM7tB,GACzBu0B,GAAAC,QAAO1zB,IAAI,MAAAqH,OAAMpO,KAAKm9B,aAAY,iBAAA/uB,OAAgBy1B,EAAMhjC,OAAM,e,IAE9D,IAAmB,IAAAijC,EAAAC,GAAAF,GAAKG,EAAAF,EAAAlI,QAAAoI,EAAAnI,KAAAmI,EAAAF,EAAAlI,OAAE,CAArB,IAAMqI,EAAID,EAAA7hC,MACdnC,KAAK+iB,KAAKkhB,GAAM,EAChB,C,kGACF,EAKAjC,EAAAxhC,UAAA+/B,cAAA,SAAcxvB,GACb,IAAMysB,EAAUzsB,EAAQysB,QAExB,OAAQzsB,EAAQlO,MACf,KAAKu1B,GAAkB8G,OACtBl/B,KAAKkgC,YAAYpD,UAAU/rB,EAAQlO,KAAM26B,EAAQxlB,KACjD,MACD,KAAKogB,GAAkBmF,UACtBv9B,KAAKkgC,YAAYX,gBAAgB/B,EAAQlf,WACzC,MACD,QACCkc,GAAAC,QAAOxwB,KACN,6BACA8G,EAAQlO,KACR,aACA7C,KAAKk9B,MAIT,EAhWwB8E,EAAA/B,UAAY,MACZ+B,EAAA2B,oBAAsB,QAgW/C3B,CAAC,CArWD,CACSf,GAAAtB,gB,yEC5BRuE,G,+2CADDC,KACCD,GAAA,SAA6BE,GAAApkC,KAAAokC,UAAyB,GAE9C5jC,UAAA6jC,cAAR,SAAsBtrB,GACrB,IAAM6I,EAAW5hB,KAAKokC,SAAS1K,OAAS,QAAU,OAC5C2E,EAA4Br+B,KAAKokC,SAA/BzK,EAAI0E,EAAA1E,KAAEtU,EAAIgZ,EAAAhZ,KAAEuU,EAAIyE,EAAAzE,KAAE13B,EAAGm8B,EAAAn8B,IACvBid,EAAM,IAAImlB,IAAI,GAAAl2B,OAAGwT,EAAQ,OAAAxT,OAAMurB,EAAI,KAAAvrB,OAAIiX,GAAIjX,OAAGwrB,GAAIxrB,OAAGlM,EAAG,KAAAkM,OAAI2K,IAIlE,OAFAoG,EAAIolB,aAAap7B,IAAI,KAAM,GAAAiF,OAAGrI,KAAKy+B,OAAKp2B,OAAGjK,KAAKugB,WAChDvF,EAAIolB,aAAap7B,IAAI,UAAWkwB,GAAA7qB,SACzBi2B,MAAMtlB,EAAIulB,KAAM,CACtBC,eAAgB3kC,KAAKokC,SAASO,gBAEhC,EAGMT,GAAA1jC,UAAAokC,WAAN,WAAoB,OAAAC,GAAA7kC,UAAA,EAAA+R,SAAA,W,6DAED,O,sBAAA,GAAM/R,KAAKqkC,cAAc,O,OAE1C,GAAwB,OAFlBjuB,EAAWioB,EAAAC,QAEJwG,OACZ,MAAM,IAAIzgC,MAAM,iBAAA+J,OAAiBgI,EAAS0uB,SAG3C,SAAO1uB,EAAS2uB,Q,OAgBhB,M,WAdAvK,GAAAC,QAAOznB,MAAM,sBAAuBgyB,GAEhCC,EAAY,GAGQ,MAAvBjlC,KAAKokC,SAASxK,MACd55B,KAAKokC,SAASzK,OAAShH,GAAKC,aAE5BqS,EACC,mIAKI,IAAI5gC,MAAM,uCAAyC4gC,G,uBAE1D,EAGKf,GAAA1jC,UAAA0kC,aAAN,WAAsB,OAAAL,GAAA7kC,UAAA,EAAA+R,SAAA,W,6DAEH,O,sBAAA,GAAM/R,KAAKqkC,cAAc,U,OAE1C,GAAwB,OAFlBjuB,EAAWioB,EAAAC,QAEJwG,OAAgB,CAC5B,GAAwB,MAApB1uB,EAAS0uB,OAaZ,MAZIK,EAAe,GAGlBA,EADGnlC,KAAKokC,SAASzK,OAAShH,GAAKC,WAE9B,sHAIA,2FAII,IAAIvuB,MACT,+DACC8gC,GAIH,MAAM,IAAI9gC,MAAM,iBAAA+J,OAAiBgI,EAAS0uB,QAC1C,CAED,SAAO1uB,EAASgvB,Q,OAIhB,M,WAFA5K,GAAAC,QAAOznB,MAAM,8BAA+BqyB,GAEtC,IAAIhhC,MAAM,4CAA8CghC,G,uBAE/D,EACFnB,I,2vCCpBAoB,GAAA,SAAAhM,G,IACCiM,EAAA,SAAY1iC,EAAqBwU,GAAjC,IAAAxD,EAAA7T,K,MACoB,iBAARqX,EACVxD,EAAAylB,EAAAlvB,KAAApK,KAAMqX,IAAIrX,MAEV6T,EAAAylB,EAAAlvB,KAAApK,OAAOA,KACPoC,OAAOuI,OAAOkJ,EAAMwD,IAGrBxD,EAAKhR,KAAOA,E,CACb,EAGD,OAbwB2iC,GAAAD,EAAAjM,GAaxBiM,CAAA,CAbA,CAAwBlhC,OAiDxBohC,GAAA,SAAAnM,GA4FC,SAAAoM,EAAY16B,EAA2BmT,GAAvC,IAGKwnB,EAHL9xB,EACCylB,EAAAlvB,KAAApK,OAAOA,KA6DP,OAnJO6T,EAAAsmB,IAAqB,KACrBtmB,EAAA+xB,cAA+B,KAG/B/xB,EAAAgyB,YAAa,EACbhyB,EAAAimB,eAAgB,EAChBjmB,EAAA+rB,OAAQ,EACC/rB,EAAAiyB,aAGb,IAAI58B,IACS2K,EAAAkyB,cAA8C,IAAI78B,IAgF9D8B,GAAMA,EAAG3L,aAAe+C,OAC3B+b,EAAUnT,EACAA,IACV26B,EAAS36B,EAAGpF,YAIbuY,EAAO6nB,GAAA,CACNC,MAAO,EACPtM,KAAMhH,GAAKC,WACXvN,KAAMsN,GAAKE,WACX+G,KAAM,IACN13B,IAAKwjC,EAAKQ,YACVhM,MAAOvH,GAAKoC,cACZ4H,OAAQhK,GAAKO,cACbyR,eAAgB,mCACbxmB,GAEJtK,EAAKuwB,SAAWjmB,EAGW,MAAvBtK,EAAKuwB,SAASzK,OACjB9lB,EAAKuwB,SAASzK,KAAOx5B,OAAO80B,SAASkR,UAIlCtyB,EAAKuwB,SAASxK,OACa,MAA1B/lB,EAAKuwB,SAASxK,KAAK,KACtB/lB,EAAKuwB,SAASxK,KAAO,IAAM/lB,EAAKuwB,SAASxK,MAEgB,MAAtD/lB,EAAKuwB,SAASxK,KAAK/lB,EAAKuwB,SAASxK,KAAK/4B,OAAS,KAClDgT,EAAKuwB,SAASxK,MAAQ,WAMElvB,IAAzBmJ,EAAKuwB,SAAS1K,QACd7lB,EAAKuwB,SAASzK,OAAShH,GAAKC,WAE5B/e,EAAKuwB,SAAS1K,OAAS/G,GAAKqC,WAClBnhB,EAAKuwB,SAASzK,MAAQhH,GAAKC,aACrC/e,EAAKuwB,SAAS1K,QAAS,GAGpB7lB,EAAKuwB,SAASgC,aACjB5L,GAAAC,QAAOxB,eAAeplB,EAAKuwB,SAASgC,aAGrC5L,GAAAC,QAAOhC,SAAW5kB,EAAKuwB,SAAS6B,OAAS,EAEzCpyB,EAAKwyB,KAAO,IAAI,EAAAC,GAAApC,KAAI/lB,GACpBtK,EAAKwmB,QAAUxmB,EAAK0yB,0BAIf5T,GAAKS,SAASE,YAAeX,GAAKS,SAAS1yB,KAS1CilC,IAAWhT,GAAKkB,WAAW8R,IAChC9xB,EAAK2yB,cAAc1O,GAAc2O,UAAW,OAAAr4B,OAAOu3B,EAAM,iB,IAItDA,EACH9xB,EAAK6yB,YAAYf,GAEjB9xB,EAAKwyB,KACHzB,aACAr1B,MAAK,SAACvE,GAAO,OAAA6I,EAAK6yB,YAAY17B,EAAjB,IACb,OAAM,SAACgI,GAAU,OAAAa,EAAK8yB,OAAO7O,GAAc8O,YAAa5zB,EAAvC,I,IAnBnBa,EAAK2yB,cACJ1O,GAAc+O,oBACd,+C,EAmBH,CAubD,OAvmB0BrB,GAAAE,EAAApM,GAyBzBl3B,OAAAC,eAAIqjC,EAAAllC,UAAA,KAAJ,CAAAgJ,IAAA,WACC,OAAOxJ,KAAKm6B,GACb,E,gCAEA/3B,OAAAC,eAAIqjC,EAAAllC,UAAA,UAAJ,CAAAgJ,IAAA,WACC,OAAOxJ,KAAKokC,QACb,E,gCAEAhiC,OAAAC,eAAIqjC,EAAAllC,UAAA,OAAJ,CAAAgJ,IAAA,WACC,OAAOxJ,KAAK4/B,KACb,E,gCAKAx9B,OAAAC,eAAIqjC,EAAAllC,UAAA,SAAJ,CAAAgJ,IAAA,WACC,OAAOxJ,KAAKq6B,OACb,E,gCAOAj4B,OAAAC,eAAIqjC,EAAAllC,UAAA,cAAJ,CAAAgJ,IAAA,W,QACOs9B,EAAmB1kC,OAAO4zB,OAAO,M,IAEvC,IAAqB,IAAA+Q,EAAAC,GAAAhnC,KAAK8lC,cAAYmB,EAAAF,EAAAnL,QAAAqL,EAAApL,KAAAoL,EAAAF,EAAAnL,OAAE,CAA7B,IAAAsL,EAAAC,GAAAF,EAAA9kC,MAAA,GAACilC,EAACF,EAAA,GAAEG,EAACH,EAAA,GACfJ,EAAiBM,GAAKC,CACtB,C,kGAED,OAAOP,CACR,E,gCAKA1kC,OAAAC,eAAIqjC,EAAAllC,UAAA,YAAJ,CAAAgJ,IAAA,WACC,OAAOxJ,KAAK6lC,UACb,E,gCAIAzjC,OAAAC,eAAIqjC,EAAAllC,UAAA,eAAJ,CAAAgJ,IAAA,WACC,OAAOxJ,KAAK85B,aACb,E,gCA4GQ4L,EAAAllC,UAAA+lC,wBAAR,eAAA1yB,EAAA7T,KACOs9B,EAAS,IAAI,EAAAgK,GAAA/N,QAClBv5B,KAAKokC,SAAS1K,OACd15B,KAAKokC,SAASzK,KACd35B,KAAKokC,SAAS/e,KACdrlB,KAAKokC,SAASxK,KACd55B,KAAKokC,SAASliC,IACdlC,KAAKokC,SAASvK,cA+Bf,OA5BAyD,EAAOrG,GAAGiB,GAAgBwC,SAAS,SAACh6B,GACnCmT,EAAK0zB,eAAe7mC,EACrB,IAEA48B,EAAOrG,GAAGiB,GAAgB7zB,OAAO,SAAC2O,GACjCa,EAAK8yB,OAAO7O,GAAc0P,YAAax0B,EACxC,IAEAsqB,EAAOrG,GAAGiB,GAAgB2C,cAAc,WACnChnB,EAAK4zB,eAIT5zB,EAAK+qB,UAAU9G,GAAc4P,QAAS,8BACtC7zB,EAAK8zB,aACN,IAEArK,EAAOrG,GAAGiB,GAAgB0P,OAAO,WAC5B/zB,EAAK4zB,cAIT5zB,EAAK8yB,OACJ7O,GAAc+P,aACd,uCAEF,IAEOvK,CACR,EAGQoI,EAAAllC,UAAAkmC,YAAR,SAAoB17B,GACnBhL,KAAKm6B,IAAMnvB,EACXhL,KAAKs9B,OAAOpJ,MAAMlpB,EAAIhL,KAAKokC,SAASlK,MACrC,EAGQwL,EAAAllC,UAAA+mC,eAAR,SAAuBx2B,G,QAChBlO,EAAOkO,EAAQlO,KACf26B,EAAUzsB,EAAQysB,QAClBP,EAASlsB,EAAQ+2B,IAEvB,OAAQjlC,GACP,KAAKu1B,GAAkB2P,KACtB/nC,KAAK4lC,cAAgB5lC,KAAKgL,GAC1BhL,KAAK4/B,OAAQ,EACb5/B,KAAK02B,KAAK,OAAQ12B,KAAKgL,IACvB,MACD,KAAKotB,GAAkB/zB,MACtBrE,KAAK2mC,OAAO7O,GAAc8O,YAAapJ,EAAQgG,KAC/C,MACD,KAAKpL,GAAkB4P,QACtBhoC,KAAK2mC,OAAO7O,GAAcmQ,cAAe,OAAA75B,OAAOpO,KAAKgL,GAAE,eACvD,MACD,KAAKotB,GAAkB8P,WACtBloC,KAAK2mC,OACJ7O,GAAcoQ,WACd,YAAA95B,OAAYpO,KAAKokC,SAASliC,IAAG,iBAE9B,MACD,KAAKk2B,GAAkB+P,MACtB3N,GAAAC,QAAO1zB,IAAI,+BAAAqH,OAA+B6uB,IAC1Cj9B,KAAKooC,aAAanL,GAClBj9B,KAAK8lC,aAAa,OAAO7I,GACzB,MACD,KAAK7E,GAAkBiQ,OACtBroC,KAAK4+B,UACJ9G,GAAcwQ,gBACd,6BAAAl6B,OAA6B6uB,IAE9B,MACD,KAAK7E,GAAkBuG,MAEtB,IAAMxB,EAAeK,EAAQL,aAW7B,IAVIlB,EAAaj8B,KAAK49B,cAAcX,EAAQE,MAG3ClB,EAAWzJ,QACXgI,GAAAC,QAAOxwB,KACN,6CAAAmE,OAA6C+uB,KAK3CK,EAAQ36B,OAAS+0B,GAAeyE,MAAO,CAC1C,IAAMyB,EAAkB,IAAI,EAAAyK,GAAAxI,iBAAgB9C,EAAQj9B,KAAM,CACzDm9B,aAAcA,EACdsD,SAAUjD,EACVgB,SAAUhB,EAAQgB,WAEnBvC,EAAa6B,EACb99B,KAAKwoC,eAAevL,EAAQhB,GAC5Bj8B,KAAK02B,KAAK,OAAQoH,EAClB,KAAM,IAAIN,EAAQ36B,OAAS+0B,GAAe6E,KAc1C,YADAjC,GAAAC,QAAOxwB,KAAK,sCAAAmE,OAAsCovB,EAAQ36B,OAZ1D,IAAM65B,EAAiB,IAAI,EAAA+L,GAAAzG,gBAAe/E,EAAQj9B,KAAM,CACvDm9B,aAAcA,EACdsD,SAAUjD,EACVgB,SAAUhB,EAAQgB,SAClBzuB,MAAOytB,EAAQztB,MACf2uB,cAAelB,EAAQkB,cACvBlL,SAAUgK,EAAQhK,WAEnByI,EAAaS,EACb18B,KAAKwoC,eAAevL,EAAQhB,GAC5Bj8B,KAAK02B,KAAK,aAAcgG,EAIxB,CAGD,IAAMgE,EAAW1gC,KAAK2gC,aAAaxD,G,IACnC,IAAsB,IAAAyD,EAAAoG,GAAAtG,GAAQI,EAAAF,EAAAhF,QAAAkF,EAAAjF,KAAAiF,EAAAF,EAAAhF,OAAE,CAA3B,IAAM8M,EAAO5H,EAAA3+B,MACjB85B,EAAWsE,cAAcmI,EACzB,C,kGAED,MAED,QACC,IAAKlL,EAIJ,YAHAhD,GAAAC,QAAOxwB,KACN,yCAAAmE,OAAyC6uB,EAAM,aAAA7uB,OAAYvL,IAK7D,IACMo5B,EADAkB,EAAeK,EAAQL,cACvBlB,EAAaj8B,KAAK49B,cAAcX,EAAQE,KAE5BlB,EAAWE,eAE5BF,EAAWsE,cAAcxvB,GACfosB,EAEVn9B,KAAK2oC,cAAcxL,EAAcpsB,GAEjCypB,GAAAC,QAAOxwB,KAAK,wCAAyC8G,GAKzD,EAGQ20B,EAAAllC,UAAAmoC,cAAR,SAAsBxL,EAAsBpsB,GACtC/Q,KAAK+lC,cAAcz8B,IAAI6zB,IAC3Bn9B,KAAK+lC,cAAc58B,IAAIg0B,EAAc,IAGtCn9B,KAAK+lC,cAAcv8B,IAAI2zB,GAAcx8B,KAAKoQ,EAC3C,EAOO20B,EAAAllC,UAAAmgC,aAAP,SAAoBxD,GACnB,IAAMuD,EAAW1gC,KAAK+lC,cAAcv8B,IAAI2zB,GAExC,OAAIuD,GACH1gC,KAAK+lC,cAAc,OAAO5I,GACnBuD,GAGD,EACR,EAOAgF,EAAAllC,UAAAooC,QAAA,SAAQ1L,EAAc/e,GACrB,QADqB,IAAAA,MAAA,IACjBne,KAAKynC,aAWR,OAVAjN,GAAAC,QAAOxwB,KACN,sPAKDjK,KAAK4+B,UACJ9G,GAAc+C,aACd,+DAKF,IAAM6B,EAAiB,IAAI,EAAA+L,GAAAzG,gBAAe9E,EAAMl9B,KAAMme,GAEtD,OADAne,KAAKwoC,eAAetL,EAAMR,GACnBA,CACR,EAQAgJ,EAAAllC,UAAA4J,KAAA,SACC8yB,EACAzrB,EACA0M,GAEA,QAFA,IAAAA,MAAA,IAEIne,KAAKynC,aAUR,OATAjN,GAAAC,QAAOxwB,KACN,0KAIDjK,KAAK4+B,UACJ9G,GAAc+C,aACd,+DAKF,GAAKppB,EAAL,CAOA,IAAMqsB,EAAkB,IAAI,EAAAyK,GAAAxI,iBAAgB7C,EAAMl9B,KAAIgmC,MAAA,GAClD7nB,GAAO,CACVme,QAAS7qB,KAGV,OADAzR,KAAKwoC,eAAetL,EAAMY,GACnBA,CAPN,CAJAtD,GAAAC,QAAOznB,MACN,gFAWH,EAGQ0yB,EAAAllC,UAAAgoC,eAAR,SACCvL,EACAhB,GAEAzB,GAAAC,QAAO1zB,IACN,kBAAAqH,OAAkB6tB,EAAWp5B,KAAI,KAAAuL,OAAI6tB,EAAWkB,aAAY,eAAA/uB,OAAc6uB,IAGtEj9B,KAAK8lC,aAAax8B,IAAI2zB,IAC1Bj9B,KAAK8lC,aAAa38B,IAAI8zB,EAAQ,IAE/Bj9B,KAAK8lC,aAAat8B,IAAIyzB,GAAQt8B,KAAKs7B,EACpC,EAGAyJ,EAAAllC,UAAAugC,kBAAA,SAAkB9E,GACjB,IAAM4M,EAAc7oC,KAAK8lC,aAAat8B,IAAIyyB,EAAWiB,MAErD,GAAI2L,EAAa,CAChB,IAAMvnC,EAAQunC,EAAY3zB,QAAQ+mB,IAEpB,IAAV36B,GACHunC,EAAY1zB,OAAO7T,EAAO,EAE3B,CAGDtB,KAAK+lC,cAAc,OAAO9J,EAAWkB,aACtC,EAGAuI,EAAAllC,UAAAo9B,cAAA,SACCX,EACAE,G,QAEM0L,EAAc7oC,KAAK8lC,aAAat8B,IAAIyzB,GAC1C,IAAK4L,EACJ,OAAO,K,IAGR,IAAyB,IAAAC,EAAA9B,GAAA6B,GAAWE,EAAAD,EAAAlN,QAAAmN,EAAAlN,KAAAkN,EAAAD,EAAAlN,OAAE,CAAjC,IAAMK,EAAU8M,EAAA5mC,MACpB,GAAI85B,EAAWkB,eAAiBA,EAC/B,OAAOlB,CAER,C,kGAED,OAAO,IACR,EAEQyJ,EAAAllC,UAAAgmC,cAAR,SAAsB3jC,EAAqBkO,GAA3C,IAAA8C,EAAA7T,KACCk7B,YAAW,WACVrnB,EAAK8yB,OAAO9jC,EAAMkO,EACnB,GAAG,EACJ,EAOQ20B,EAAAllC,UAAAmmC,OAAR,SAAe9jC,EAAqBkO,GACnCypB,GAAAC,QAAOznB,MAAM,aAEbhT,KAAK4+B,UAAU/7B,EAAMkO,GAEhB/Q,KAAK4lC,cAGT5lC,KAAK2nC,aAFL3nC,KAAKyhC,SAIP,EAGAiE,EAAAllC,UAAAo+B,UAAA,SAAU/7B,EAAqBwU,GAC9BmjB,GAAAC,QAAOznB,MAAM,SAAUqE,GAEvBrX,KAAK02B,KAAK,QAAS,IAAI4O,GAAUziC,EAAMwU,GACxC,EAYAquB,EAAAllC,UAAAihC,QAAA,WACKzhC,KAAKgpC,YAITxO,GAAAC,QAAO1zB,IAAI,wBAAAqH,OAAwBpO,KAAKgL,KAExChL,KAAK2nC,aACL3nC,KAAK46B,WAEL56B,KAAK6lC,YAAa,EAElB7lC,KAAK02B,KAAK,SACX,EAGQgP,EAAAllC,UAAAo6B,SAAR,W,YACC,IAAqB,IAAAmM,EAAAC,GAAAhnC,KAAK8lC,aAAa1+B,QAAM6/B,EAAAF,EAAAnL,QAAAqL,EAAApL,KAAAoL,EAAAF,EAAAnL,OAAE,CAA1C,IAAMqB,EAAMgK,EAAA9kC,MAChBnC,KAAKooC,aAAanL,GAClBj9B,KAAK8lC,aAAa,OAAO7I,EACzB,C,kGAEDj9B,KAAKs9B,OAAOpG,oBACb,EAGQwO,EAAAllC,UAAA4nC,aAAR,SAAqBnL,G,QACd4L,EAAc7oC,KAAK8lC,aAAat8B,IAAIyzB,GAE1C,GAAK4L,E,IAEL,IAAyB,IAAAI,EAAAjC,GAAA6B,GAAWK,EAAAD,EAAArN,QAAAsN,EAAArN,KAAAqN,EAAAD,EAAArN,OAAE,CAAjBsN,EAAA/mC,MACTqwB,OACX,C,kGACF,EAQAkT,EAAAllC,UAAAmnC,WAAA,WACC,IAAI3nC,KAAKynC,aAAT,CAIA,IAAM0B,EAAYnpC,KAAKgL,GAEvBwvB,GAAAC,QAAO1zB,IAAI,2BAAAqH,OAA2B+6B,IAEtCnpC,KAAK85B,eAAgB,EACrB95B,KAAK4/B,OAAQ,EAEb5/B,KAAKs9B,OAAO9K,QAEZxyB,KAAK4lC,cAAgBuD,EACrBnpC,KAAKm6B,IAAM,KAEXn6B,KAAK02B,KAAK,eAAgByS,EAfzB,CAgBF,EASAzD,EAAAllC,UAAA4oC,UAAA,WACC,GAAIppC,KAAKynC,eAAiBznC,KAAKgpC,UAC9BxO,GAAAC,QAAO1zB,IACN,6CAAAqH,OAA6CpO,KAAK4lC,gBAEnD5lC,KAAK85B,eAAgB,EACrB95B,KAAK0mC,YAAY1mC,KAAK4lC,mBAChB,IAAI5lC,KAAKgpC,UACf,MAAM,IAAI3kC,MACT,4EAEK,GAAKrE,KAAKynC,cAAiBznC,KAAKghC,KAMtC,MAAM,IAAI38B,MACT,QAAA+J,OAAQpO,KAAKgL,GAAE,sEALhBwvB,GAAAC,QAAOznB,MACN,iEAIe,CAGlB,EAQA0yB,EAAAllC,UAAA0kC,aAAA,SAAav8B,GAAb,IAAAkL,EAAA7T,UAAa,IAAA2I,MAAA,SAAM0gC,GAAc,GAChCrpC,KAAKqmC,KACHnB,eACA31B,MAAK,SAAC+5B,GAAU,OAAA3gC,EAAG2gC,EAAH,IAChB,OAAM,SAACt2B,GAAU,OAAAa,EAAK8yB,OAAO7O,GAAc8O,YAAa5zB,EAAvC,GACpB,EArmBwB0yB,EAAAQ,YAAc,SAsmBvCR,CAAC,CAvmBD,CAA0BnO,GAAAD,cC9GpBn3B,OAAQopC,OAAS,CACtB7D,KAAI8D,GAAA9D,KACJ+D,KAAI9W,IAGCxyB,OAAQulC,KAAO8D,GAAA9D,I","sources":["node_modules/peerjs-js-binarypack/lib/bufferbuilder.js","node_modules/@swc/helpers/src/_type_of.mjs","node_modules/peerjs-js-binarypack/lib/binarypack.js","node_modules/@swc/helpers/src/_define_property.mjs","node_modules/webrtc-adapter/src/js/utils.js","node_modules/@swc/helpers/src/_array_with_holes.mjs","node_modules/@swc/helpers/src/_iterable_to_array.mjs","node_modules/@swc/helpers/src/_non_iterable_rest.mjs","node_modules/@swc/helpers/src/_array_like_to_array.mjs","node_modules/@swc/helpers/src/_unsupported_iterable_to_array.mjs","node_modules/@swc/helpers/src/_sliced_to_array.mjs","node_modules/webrtc-adapter/src/js/chrome/getusermedia.js","node_modules/webrtc-adapter/src/js/chrome/getdisplaymedia.js","node_modules/webrtc-adapter/src/js/chrome/chrome_shim.js","node_modules/@swc/helpers/src/_array_without_holes.mjs","node_modules/@swc/helpers/src/_non_iterable_spread.mjs","node_modules/@swc/helpers/src/_to_consumable_array.mjs","node_modules/webrtc-adapter/src/js/firefox/getusermedia.js","node_modules/webrtc-adapter/src/js/firefox/getdisplaymedia.js","node_modules/webrtc-adapter/src/js/firefox/firefox_shim.js","node_modules/webrtc-adapter/src/js/safari/safari_shim.js","node_modules/sdp/sdp.js","node_modules/webrtc-adapter/src/js/common_shim.js","node_modules/webrtc-adapter/src/js/adapter_core.js","lib/supports.ts","lib/util.ts","node_modules/webrtc-adapter/src/js/adapter_factory.js","node_modules/eventemitter3/index.js","lib/logger.ts","lib/enums.ts","package.json","lib/socket.ts","lib/negotiator.ts","lib/baseconnection.ts","lib/mediaconnection.ts","lib/encodingQueue.ts","lib/dataconnection.ts","lib/api.ts","lib/peer.ts","lib/global.ts"],"sourcesContent":["var binaryFeatures = {};\r\nbinaryFeatures.useBlobBuilder = (function () {\r\n try {\r\n new Blob([]);\r\n return false;\r\n } catch (e) {\r\n return true;\r\n }\r\n})();\r\n\r\nbinaryFeatures.useArrayBufferView = !binaryFeatures.useBlobBuilder && (function () {\r\n try {\r\n return (new Blob([new Uint8Array([])])).size === 0;\r\n } catch (e) {\r\n return true;\r\n }\r\n})();\r\n\r\nmodule.exports.binaryFeatures = binaryFeatures;\r\nvar BlobBuilder = module.exports.BlobBuilder;\r\nif (typeof window !== 'undefined') {\r\n BlobBuilder = module.exports.BlobBuilder = window.WebKitBlobBuilder ||\r\n window.MozBlobBuilder || window.MSBlobBuilder || window.BlobBuilder;\r\n}\r\n\r\nfunction BufferBuilder () {\r\n this._pieces = [];\r\n this._parts = [];\r\n}\r\n\r\nBufferBuilder.prototype.append = function (data) {\r\n if (typeof data === 'number') {\r\n this._pieces.push(data);\r\n } else {\r\n this.flush();\r\n this._parts.push(data);\r\n }\r\n};\r\n\r\nBufferBuilder.prototype.flush = function () {\r\n if (this._pieces.length > 0) {\r\n var buf = new Uint8Array(this._pieces);\r\n if (!binaryFeatures.useArrayBufferView) {\r\n buf = buf.buffer;\r\n }\r\n this._parts.push(buf);\r\n this._pieces = [];\r\n }\r\n};\r\n\r\nBufferBuilder.prototype.getBuffer = function () {\r\n this.flush();\r\n if (binaryFeatures.useBlobBuilder) {\r\n var builder = new BlobBuilder();\r\n for (var i = 0, ii = this._parts.length; i < ii; i++) {\r\n builder.append(this._parts[i]);\r\n }\r\n return builder.getBlob();\r\n } else {\r\n return new Blob(this._parts);\r\n }\r\n};\r\n\r\nmodule.exports.BufferBuilder = BufferBuilder;\r\n","export default function _typeof(obj) {\n \"@swc/helpers - typeof\";\n return obj && obj.constructor === Symbol ? \"symbol\" : typeof obj;\n};\n","var BufferBuilder = require('./bufferbuilder').BufferBuilder;\r\nvar binaryFeatures = require('./bufferbuilder').binaryFeatures;\r\n\r\nvar BinaryPack = {\r\n unpack: function (data) {\r\n var unpacker = new Unpacker(data);\r\n return unpacker.unpack();\r\n },\r\n pack: function (data) {\r\n var packer = new Packer();\r\n packer.pack(data);\r\n var buffer = packer.getBuffer();\r\n return buffer;\r\n }\r\n};\r\n\r\nmodule.exports = BinaryPack;\r\n\r\nfunction Unpacker (data) {\r\n // Data is ArrayBuffer\r\n this.index = 0;\r\n this.dataBuffer = data;\r\n this.dataView = new Uint8Array(this.dataBuffer);\r\n this.length = this.dataBuffer.byteLength;\r\n}\r\n\r\nUnpacker.prototype.unpack = function () {\r\n var type = this.unpack_uint8();\r\n if (type < 0x80) {\r\n return type;\r\n } else if ((type ^ 0xe0) < 0x20) {\r\n return (type ^ 0xe0) - 0x20;\r\n }\r\n\r\n var size;\r\n if ((size = type ^ 0xa0) <= 0x0f) {\r\n return this.unpack_raw(size);\r\n } else if ((size = type ^ 0xb0) <= 0x0f) {\r\n return this.unpack_string(size);\r\n } else if ((size = type ^ 0x90) <= 0x0f) {\r\n return this.unpack_array(size);\r\n } else if ((size = type ^ 0x80) <= 0x0f) {\r\n return this.unpack_map(size);\r\n }\r\n\r\n switch (type) {\r\n case 0xc0:\r\n return null;\r\n case 0xc1:\r\n return undefined;\r\n case 0xc2:\r\n return false;\r\n case 0xc3:\r\n return true;\r\n case 0xca:\r\n return this.unpack_float();\r\n case 0xcb:\r\n return this.unpack_double();\r\n case 0xcc:\r\n return this.unpack_uint8();\r\n case 0xcd:\r\n return this.unpack_uint16();\r\n case 0xce:\r\n return this.unpack_uint32();\r\n case 0xcf:\r\n return this.unpack_uint64();\r\n case 0xd0:\r\n return this.unpack_int8();\r\n case 0xd1:\r\n return this.unpack_int16();\r\n case 0xd2:\r\n return this.unpack_int32();\r\n case 0xd3:\r\n return this.unpack_int64();\r\n case 0xd4:\r\n return undefined;\r\n case 0xd5:\r\n return undefined;\r\n case 0xd6:\r\n return undefined;\r\n case 0xd7:\r\n return undefined;\r\n case 0xd8:\r\n size = this.unpack_uint16();\r\n return this.unpack_string(size);\r\n case 0xd9:\r\n size = this.unpack_uint32();\r\n return this.unpack_string(size);\r\n case 0xda:\r\n size = this.unpack_uint16();\r\n return this.unpack_raw(size);\r\n case 0xdb:\r\n size = this.unpack_uint32();\r\n return this.unpack_raw(size);\r\n case 0xdc:\r\n size = this.unpack_uint16();\r\n return this.unpack_array(size);\r\n case 0xdd:\r\n size = this.unpack_uint32();\r\n return this.unpack_array(size);\r\n case 0xde:\r\n size = this.unpack_uint16();\r\n return this.unpack_map(size);\r\n case 0xdf:\r\n size = this.unpack_uint32();\r\n return this.unpack_map(size);\r\n }\r\n};\r\n\r\nUnpacker.prototype.unpack_uint8 = function () {\r\n var byte = this.dataView[this.index] & 0xff;\r\n this.index++;\r\n return byte;\r\n};\r\n\r\nUnpacker.prototype.unpack_uint16 = function () {\r\n var bytes = this.read(2);\r\n var uint16 =\r\n ((bytes[0] & 0xff) * 256) + (bytes[1] & 0xff);\r\n this.index += 2;\r\n return uint16;\r\n};\r\n\r\nUnpacker.prototype.unpack_uint32 = function () {\r\n var bytes = this.read(4);\r\n var uint32 =\r\n ((bytes[0] * 256 +\r\n bytes[1]) * 256 +\r\n bytes[2]) * 256 +\r\n bytes[3];\r\n this.index += 4;\r\n return uint32;\r\n};\r\n\r\nUnpacker.prototype.unpack_uint64 = function () {\r\n var bytes = this.read(8);\r\n var uint64 =\r\n ((((((bytes[0] * 256 +\r\n bytes[1]) * 256 +\r\n bytes[2]) * 256 +\r\n bytes[3]) * 256 +\r\n bytes[4]) * 256 +\r\n bytes[5]) * 256 +\r\n bytes[6]) * 256 +\r\n bytes[7];\r\n this.index += 8;\r\n return uint64;\r\n};\r\n\r\nUnpacker.prototype.unpack_int8 = function () {\r\n var uint8 = this.unpack_uint8();\r\n return (uint8 < 0x80) ? uint8 : uint8 - (1 << 8);\r\n};\r\n\r\nUnpacker.prototype.unpack_int16 = function () {\r\n var uint16 = this.unpack_uint16();\r\n return (uint16 < 0x8000) ? uint16 : uint16 - (1 << 16);\r\n};\r\n\r\nUnpacker.prototype.unpack_int32 = function () {\r\n var uint32 = this.unpack_uint32();\r\n return (uint32 < Math.pow(2, 31)) ? uint32\r\n : uint32 - Math.pow(2, 32);\r\n};\r\n\r\nUnpacker.prototype.unpack_int64 = function () {\r\n var uint64 = this.unpack_uint64();\r\n return (uint64 < Math.pow(2, 63)) ? uint64\r\n : uint64 - Math.pow(2, 64);\r\n};\r\n\r\nUnpacker.prototype.unpack_raw = function (size) {\r\n if (this.length < this.index + size) {\r\n throw new Error('BinaryPackFailure: index is out of range' +\r\n ' ' + this.index + ' ' + size + ' ' + this.length);\r\n }\r\n var buf = this.dataBuffer.slice(this.index, this.index + size);\r\n this.index += size;\r\n\r\n // buf = util.bufferToString(buf);\r\n\r\n return buf;\r\n};\r\n\r\nUnpacker.prototype.unpack_string = function (size) {\r\n var bytes = this.read(size);\r\n var i = 0;\r\n var str = '';\r\n var c;\r\n var code;\r\n\r\n while (i < size) {\r\n c = bytes[i];\r\n // The length of a UTF-8 sequence is specified in the first byte:\r\n // 0xxxxxxx means length 1,\r\n // 110xxxxx means length 2,\r\n // 1110xxxx means length 3,\r\n // 11110xxx means length 4.\r\n // 10xxxxxx is for non-initial bytes.\r\n if (c < 0xa0) {\r\n // One-byte sequence: bits 0xxxxxxx\r\n code = c;\r\n i++;\r\n } else if ((c ^ 0xc0) < 0x20) {\r\n // Two-byte sequence: bits 110xxxxx 10xxxxxx\r\n code = ((c & 0x1f) << 6) | (bytes[i + 1] & 0x3f);\r\n i += 2;\r\n } else if ((c ^ 0xe0) < 0x10) {\r\n // Three-byte sequence: bits 1110xxxx 10xxxxxx 10xxxxxx\r\n code = ((c & 0x0f) << 12) | (bytes[i + 1] & 0x3f) << 6 |\r\n (bytes[i + 2] & 0x3f);\r\n i += 3;\r\n } else {\r\n // Four-byte sequence: bits 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\r\n code = ((c & 0x07) << 18) | (bytes[i + 1] & 0x3f) << 12 |\r\n (bytes[i + 2] & 0x3f) << 6 | (bytes[i + 3] & 0x3f);\r\n i += 4;\r\n }\r\n str += String.fromCodePoint(code);\r\n }\r\n\r\n this.index += size;\r\n return str;\r\n};\r\n\r\nUnpacker.prototype.unpack_array = function (size) {\r\n var objects = new Array(size);\r\n for (var i = 0; i < size; i++) {\r\n objects[i] = this.unpack();\r\n }\r\n return objects;\r\n};\r\n\r\nUnpacker.prototype.unpack_map = function (size) {\r\n var map = {};\r\n for (var i = 0; i < size; i++) {\r\n var key = this.unpack();\r\n var value = this.unpack();\r\n map[key] = value;\r\n }\r\n return map;\r\n};\r\n\r\nUnpacker.prototype.unpack_float = function () {\r\n var uint32 = this.unpack_uint32();\r\n var sign = uint32 >> 31;\r\n var exp = ((uint32 >> 23) & 0xff) - 127;\r\n var fraction = (uint32 & 0x7fffff) | 0x800000;\r\n return (sign === 0 ? 1 : -1) *\r\n fraction * Math.pow(2, exp - 23);\r\n};\r\n\r\nUnpacker.prototype.unpack_double = function () {\r\n var h32 = this.unpack_uint32();\r\n var l32 = this.unpack_uint32();\r\n var sign = h32 >> 31;\r\n var exp = ((h32 >> 20) & 0x7ff) - 1023;\r\n var hfrac = (h32 & 0xfffff) | 0x100000;\r\n var frac = hfrac * Math.pow(2, exp - 20) +\r\n l32 * Math.pow(2, exp - 52);\r\n return (sign === 0 ? 1 : -1) * frac;\r\n};\r\n\r\nUnpacker.prototype.read = function (length) {\r\n var j = this.index;\r\n if (j + length <= this.length) {\r\n return this.dataView.subarray(j, j + length);\r\n } else {\r\n throw new Error('BinaryPackFailure: read index out of range');\r\n }\r\n};\r\n\r\nfunction Packer () {\r\n this.bufferBuilder = new BufferBuilder();\r\n}\r\n\r\nPacker.prototype.getBuffer = function () {\r\n return this.bufferBuilder.getBuffer();\r\n};\r\n\r\nPacker.prototype.pack = function (value) {\r\n var type = typeof (value);\r\n if (type === 'string') {\r\n this.pack_string(value);\r\n } else if (type === 'number') {\r\n if (Math.floor(value) === value) {\r\n this.pack_integer(value);\r\n } else {\r\n this.pack_double(value);\r\n }\r\n } else if (type === 'boolean') {\r\n if (value === true) {\r\n this.bufferBuilder.append(0xc3);\r\n } else if (value === false) {\r\n this.bufferBuilder.append(0xc2);\r\n }\r\n } else if (type === 'undefined') {\r\n this.bufferBuilder.append(0xc0);\r\n } else if (type === 'object') {\r\n if (value === null) {\r\n this.bufferBuilder.append(0xc0);\r\n } else {\r\n var constructor = value.constructor;\r\n if (constructor == Array) {\r\n this.pack_array(value);\r\n } else if (constructor == Blob || constructor == File || value instanceof Blob || value instanceof File) {\r\n this.pack_bin(value);\r\n } else if (constructor == ArrayBuffer) {\r\n if (binaryFeatures.useArrayBufferView) {\r\n this.pack_bin(new Uint8Array(value));\r\n } else {\r\n this.pack_bin(value);\r\n }\r\n } else if ('BYTES_PER_ELEMENT' in value) {\r\n if (binaryFeatures.useArrayBufferView) {\r\n this.pack_bin(new Uint8Array(value.buffer));\r\n } else {\r\n this.pack_bin(value.buffer);\r\n }\r\n } else if ((constructor == Object) || (constructor.toString().startsWith('class'))) {\r\n this.pack_object(value);\r\n } else if (constructor == Date) {\r\n this.pack_string(value.toString());\r\n } else if (typeof value.toBinaryPack === 'function') {\r\n this.bufferBuilder.append(value.toBinaryPack());\r\n } else {\r\n throw new Error('Type \"' + constructor.toString() + '\" not yet supported');\r\n }\r\n }\r\n } else {\r\n throw new Error('Type \"' + type + '\" not yet supported');\r\n }\r\n this.bufferBuilder.flush();\r\n};\r\n\r\nPacker.prototype.pack_bin = function (blob) {\r\n var length = blob.length || blob.byteLength || blob.size;\r\n if (length <= 0x0f) {\r\n this.pack_uint8(0xa0 + length);\r\n } else if (length <= 0xffff) {\r\n this.bufferBuilder.append(0xda);\r\n this.pack_uint16(length);\r\n } else if (length <= 0xffffffff) {\r\n this.bufferBuilder.append(0xdb);\r\n this.pack_uint32(length);\r\n } else {\r\n throw new Error('Invalid length');\r\n }\r\n this.bufferBuilder.append(blob);\r\n};\r\n\r\nPacker.prototype.pack_string = function (str) {\r\n var length = utf8Length(str);\r\n\r\n if (length <= 0x0f) {\r\n this.pack_uint8(0xb0 + length);\r\n } else if (length <= 0xffff) {\r\n this.bufferBuilder.append(0xd8);\r\n this.pack_uint16(length);\r\n } else if (length <= 0xffffffff) {\r\n this.bufferBuilder.append(0xd9);\r\n this.pack_uint32(length);\r\n } else {\r\n throw new Error('Invalid length');\r\n }\r\n this.bufferBuilder.append(str);\r\n};\r\n\r\nPacker.prototype.pack_array = function (ary) {\r\n var length = ary.length;\r\n if (length <= 0x0f) {\r\n this.pack_uint8(0x90 + length);\r\n } else if (length <= 0xffff) {\r\n this.bufferBuilder.append(0xdc);\r\n this.pack_uint16(length);\r\n } else if (length <= 0xffffffff) {\r\n this.bufferBuilder.append(0xdd);\r\n this.pack_uint32(length);\r\n } else {\r\n throw new Error('Invalid length');\r\n }\r\n for (var i = 0; i < length; i++) {\r\n this.pack(ary[i]);\r\n }\r\n};\r\n\r\nPacker.prototype.pack_integer = function (num) {\r\n if (num >= -0x20 && num <= 0x7f) {\r\n this.bufferBuilder.append(num & 0xff);\r\n } else if (num >= 0x00 && num <= 0xff) {\r\n this.bufferBuilder.append(0xcc);\r\n this.pack_uint8(num);\r\n } else if (num >= -0x80 && num <= 0x7f) {\r\n this.bufferBuilder.append(0xd0);\r\n this.pack_int8(num);\r\n } else if (num >= 0x0000 && num <= 0xffff) {\r\n this.bufferBuilder.append(0xcd);\r\n this.pack_uint16(num);\r\n } else if (num >= -0x8000 && num <= 0x7fff) {\r\n this.bufferBuilder.append(0xd1);\r\n this.pack_int16(num);\r\n } else if (num >= 0x00000000 && num <= 0xffffffff) {\r\n this.bufferBuilder.append(0xce);\r\n this.pack_uint32(num);\r\n } else if (num >= -0x80000000 && num <= 0x7fffffff) {\r\n this.bufferBuilder.append(0xd2);\r\n this.pack_int32(num);\r\n } else if (num >= -0x8000000000000000 && num <= 0x7FFFFFFFFFFFFFFF) {\r\n this.bufferBuilder.append(0xd3);\r\n this.pack_int64(num);\r\n } else if (num >= 0x0000000000000000 && num <= 0xFFFFFFFFFFFFFFFF) {\r\n this.bufferBuilder.append(0xcf);\r\n this.pack_uint64(num);\r\n } else {\r\n throw new Error('Invalid integer');\r\n }\r\n};\r\n\r\nPacker.prototype.pack_double = function (num) {\r\n var sign = 0;\r\n if (num < 0) {\r\n sign = 1;\r\n num = -num;\r\n }\r\n var exp = Math.floor(Math.log(num) / Math.LN2);\r\n var frac0 = num / Math.pow(2, exp) - 1;\r\n var frac1 = Math.floor(frac0 * Math.pow(2, 52));\r\n var b32 = Math.pow(2, 32);\r\n var h32 = (sign << 31) | ((exp + 1023) << 20) |\r\n (frac1 / b32) & 0x0fffff;\r\n var l32 = frac1 % b32;\r\n this.bufferBuilder.append(0xcb);\r\n this.pack_int32(h32);\r\n this.pack_int32(l32);\r\n};\r\n\r\nPacker.prototype.pack_object = function (obj) {\r\n var keys = Object.keys(obj);\r\n var length = keys.length;\r\n if (length <= 0x0f) {\r\n this.pack_uint8(0x80 + length);\r\n } else if (length <= 0xffff) {\r\n this.bufferBuilder.append(0xde);\r\n this.pack_uint16(length);\r\n } else if (length <= 0xffffffff) {\r\n this.bufferBuilder.append(0xdf);\r\n this.pack_uint32(length);\r\n } else {\r\n throw new Error('Invalid length');\r\n }\r\n for (var prop in obj) {\r\n if (obj.hasOwnProperty(prop)) {\r\n this.pack(prop);\r\n this.pack(obj[prop]);\r\n }\r\n }\r\n};\r\n\r\nPacker.prototype.pack_uint8 = function (num) {\r\n this.bufferBuilder.append(num);\r\n};\r\n\r\nPacker.prototype.pack_uint16 = function (num) {\r\n this.bufferBuilder.append(num >> 8);\r\n this.bufferBuilder.append(num & 0xff);\r\n};\r\n\r\nPacker.prototype.pack_uint32 = function (num) {\r\n var n = num & 0xffffffff;\r\n this.bufferBuilder.append((n & 0xff000000) >>> 24);\r\n this.bufferBuilder.append((n & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((n & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((n & 0x000000ff));\r\n};\r\n\r\nPacker.prototype.pack_uint64 = function (num) {\r\n var high = num / Math.pow(2, 32);\r\n var low = num % Math.pow(2, 32);\r\n this.bufferBuilder.append((high & 0xff000000) >>> 24);\r\n this.bufferBuilder.append((high & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((high & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((high & 0x000000ff));\r\n this.bufferBuilder.append((low & 0xff000000) >>> 24);\r\n this.bufferBuilder.append((low & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((low & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((low & 0x000000ff));\r\n};\r\n\r\nPacker.prototype.pack_int8 = function (num) {\r\n this.bufferBuilder.append(num & 0xff);\r\n};\r\n\r\nPacker.prototype.pack_int16 = function (num) {\r\n this.bufferBuilder.append((num & 0xff00) >> 8);\r\n this.bufferBuilder.append(num & 0xff);\r\n};\r\n\r\nPacker.prototype.pack_int32 = function (num) {\r\n this.bufferBuilder.append((num >>> 24) & 0xff);\r\n this.bufferBuilder.append((num & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((num & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((num & 0x000000ff));\r\n};\r\n\r\nPacker.prototype.pack_int64 = function (num) {\r\n var high = Math.floor(num / Math.pow(2, 32));\r\n var low = num % Math.pow(2, 32);\r\n this.bufferBuilder.append((high & 0xff000000) >>> 24);\r\n this.bufferBuilder.append((high & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((high & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((high & 0x000000ff));\r\n this.bufferBuilder.append((low & 0xff000000) >>> 24);\r\n this.bufferBuilder.append((low & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((low & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((low & 0x000000ff));\r\n};\r\n\r\nfunction _utf8Replace (m) {\r\n var code = m.codePointAt(0);\r\n\r\n if (code <= 0x7ff) return '00';\r\n if (code <= 0xffff) return '000';\r\n if (code <= 0x1fffff) return '0000';\r\n if (code <= 0x3ffffff) return '00000';\r\n return '000000';\r\n}\r\n\r\nfunction utf8Length (str) {\r\n if (str.length > 600) {\r\n // Blob method faster for large strings\r\n return (new Blob([str])).size;\r\n } else {\r\n return str.replace(/[\\ud800-\\udbff][\\udc00-\\udfff]|[^\\u0000-\\u007f]/g, _utf8Replace).length;\r\n }\r\n}\r\n","export default function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nlet logDisabled_ = true;\nlet deprecationWarnings_ = true;\n\n/**\n * Extract browser version out of the provided user agent string.\n *\n * @param {!string} uastring userAgent string.\n * @param {!string} expr Regular expression used as match criteria.\n * @param {!number} pos position in the version string to be returned.\n * @return {!number} browser version.\n */\nexport function extractVersion(uastring, expr, pos) {\n const match = uastring.match(expr);\n return match && match.length >= pos && parseInt(match[pos], 10);\n}\n\n// Wraps the peerconnection event eventNameToWrap in a function\n// which returns the modified event object (or false to prevent\n// the event).\nexport function wrapPeerConnectionEvent(window, eventNameToWrap, wrapper) {\n if (!window.RTCPeerConnection) {\n return;\n }\n const proto = window.RTCPeerConnection.prototype;\n const nativeAddEventListener = proto.addEventListener;\n proto.addEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap) {\n return nativeAddEventListener.apply(this, arguments);\n }\n const wrappedCallback = (e) => {\n const modifiedEvent = wrapper(e);\n if (modifiedEvent) {\n if (cb.handleEvent) {\n cb.handleEvent(modifiedEvent);\n } else {\n cb(modifiedEvent);\n }\n }\n };\n this._eventMap = this._eventMap || {};\n if (!this._eventMap[eventNameToWrap]) {\n this._eventMap[eventNameToWrap] = new Map();\n }\n this._eventMap[eventNameToWrap].set(cb, wrappedCallback);\n return nativeAddEventListener.apply(this, [nativeEventName,\n wrappedCallback]);\n };\n\n const nativeRemoveEventListener = proto.removeEventListener;\n proto.removeEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap || !this._eventMap\n || !this._eventMap[eventNameToWrap]) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n if (!this._eventMap[eventNameToWrap].has(cb)) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n const unwrappedCb = this._eventMap[eventNameToWrap].get(cb);\n this._eventMap[eventNameToWrap].delete(cb);\n if (this._eventMap[eventNameToWrap].size === 0) {\n delete this._eventMap[eventNameToWrap];\n }\n if (Object.keys(this._eventMap).length === 0) {\n delete this._eventMap;\n }\n return nativeRemoveEventListener.apply(this, [nativeEventName,\n unwrappedCb]);\n };\n\n Object.defineProperty(proto, 'on' + eventNameToWrap, {\n get() {\n return this['_on' + eventNameToWrap];\n },\n set(cb) {\n if (this['_on' + eventNameToWrap]) {\n this.removeEventListener(eventNameToWrap,\n this['_on' + eventNameToWrap]);\n delete this['_on' + eventNameToWrap];\n }\n if (cb) {\n this.addEventListener(eventNameToWrap,\n this['_on' + eventNameToWrap] = cb);\n }\n },\n enumerable: true,\n configurable: true\n });\n}\n\nexport function disableLog(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool +\n '. Please use a boolean.');\n }\n logDisabled_ = bool;\n return (bool) ? 'adapter.js logging disabled' :\n 'adapter.js logging enabled';\n}\n\n/**\n * Disable or enable deprecation warnings\n * @param {!boolean} bool set to true to disable warnings.\n */\nexport function disableWarnings(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool +\n '. Please use a boolean.');\n }\n deprecationWarnings_ = !bool;\n return 'adapter.js deprecation warnings ' + (bool ? 'disabled' : 'enabled');\n}\n\nexport function log() {\n if (typeof window === 'object') {\n if (logDisabled_) {\n return;\n }\n if (typeof console !== 'undefined' && typeof console.log === 'function') {\n console.log.apply(console, arguments);\n }\n }\n}\n\n/**\n * Shows a deprecation warning suggesting the modern and spec-compatible API.\n */\nexport function deprecated(oldMethod, newMethod) {\n if (!deprecationWarnings_) {\n return;\n }\n console.warn(oldMethod + ' is deprecated, please use ' + newMethod +\n ' instead.');\n}\n\n/**\n * Browser detector.\n *\n * @return {object} result containing browser and version\n * properties.\n */\nexport function detectBrowser(window) {\n // Returned result object.\n const result = {browser: null, version: null};\n\n // Fail early if it's not a browser\n if (typeof window === 'undefined' || !window.navigator) {\n result.browser = 'Not a browser.';\n return result;\n }\n\n const {navigator} = window;\n\n if (navigator.mozGetUserMedia) { // Firefox.\n result.browser = 'firefox';\n result.version = extractVersion(navigator.userAgent,\n /Firefox\\/(\\d+)\\./, 1);\n } else if (navigator.webkitGetUserMedia ||\n (window.isSecureContext === false && window.webkitRTCPeerConnection)) {\n // Chrome, Chromium, Webview, Opera.\n // Version matches Chrome/WebRTC version.\n // Chrome 74 removed webkitGetUserMedia on http as well so we need the\n // more complicated fallback to webkitRTCPeerConnection.\n result.browser = 'chrome';\n result.version = extractVersion(navigator.userAgent,\n /Chrom(e|ium)\\/(\\d+)\\./, 2);\n } else if (window.RTCPeerConnection &&\n navigator.userAgent.match(/AppleWebKit\\/(\\d+)\\./)) { // Safari.\n result.browser = 'safari';\n result.version = extractVersion(navigator.userAgent,\n /AppleWebKit\\/(\\d+)\\./, 1);\n result.supportsUnifiedPlan = window.RTCRtpTransceiver &&\n 'currentDirection' in window.RTCRtpTransceiver.prototype;\n } else { // Default fallthrough: not supported.\n result.browser = 'Not a supported browser.';\n return result;\n }\n\n return result;\n}\n\n/**\n * Checks if something is an object.\n *\n * @param {*} val The something you want to check.\n * @return true if val is an object, false otherwise.\n */\nfunction isObject(val) {\n return Object.prototype.toString.call(val) === '[object Object]';\n}\n\n/**\n * Remove all empty objects and undefined values\n * from a nested object -- an enhanced and vanilla version\n * of Lodash's `compact`.\n */\nexport function compactObject(data) {\n if (!isObject(data)) {\n return data;\n }\n\n return Object.keys(data).reduce(function(accumulator, key) {\n const isObj = isObject(data[key]);\n const value = isObj ? compactObject(data[key]) : data[key];\n const isEmptyObject = isObj && !Object.keys(value).length;\n if (value === undefined || isEmptyObject) {\n return accumulator;\n }\n return Object.assign(accumulator, {[key]: value});\n }, {});\n}\n\n/* iterates the stats graph recursively. */\nexport function walkStats(stats, base, resultSet) {\n if (!base || resultSet.has(base.id)) {\n return;\n }\n resultSet.set(base.id, base);\n Object.keys(base).forEach(name => {\n if (name.endsWith('Id')) {\n walkStats(stats, stats.get(base[name]), resultSet);\n } else if (name.endsWith('Ids')) {\n base[name].forEach(id => {\n walkStats(stats, stats.get(id), resultSet);\n });\n }\n });\n}\n\n/* filter getStats for a sender/receiver track. */\nexport function filterStats(result, track, outbound) {\n const streamStatsType = outbound ? 'outbound-rtp' : 'inbound-rtp';\n const filteredResult = new Map();\n if (track === null) {\n return filteredResult;\n }\n const trackStats = [];\n result.forEach(value => {\n if (value.type === 'track' &&\n value.trackIdentifier === track.id) {\n trackStats.push(value);\n }\n });\n trackStats.forEach(trackStat => {\n result.forEach(stats => {\n if (stats.type === streamStatsType && stats.trackId === trackStat.id) {\n walkStats(result, stats, filteredResult);\n }\n });\n });\n return filteredResult;\n}\n\n","export default function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n","export default function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\n","export default function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}\n","import _arrayLikeToArray from './_array_like_to_array.mjs';\n\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(n);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))\n return _arrayLikeToArray(o, minLen);\n}\n","import arrayWithHoles from './_array_with_holes.mjs';\nimport iterableToArrayLimit from './_iterable_to_array.mjs';\nimport nonIterableRest from './_non_iterable_rest.mjs';\nimport unsupportedIterableToArray from './_unsupported_iterable_to_array.mjs';\n\nexport default function _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\nimport * as utils from '../utils.js';\nconst logging = utils.log;\n\nexport function shimGetUserMedia(window, browserDetails) {\n const navigator = window && window.navigator;\n\n if (!navigator.mediaDevices) {\n return;\n }\n\n const constraintsToChrome_ = function(c) {\n if (typeof c !== 'object' || c.mandatory || c.optional) {\n return c;\n }\n const cc = {};\n Object.keys(c).forEach(key => {\n if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n return;\n }\n const r = (typeof c[key] === 'object') ? c[key] : {ideal: c[key]};\n if (r.exact !== undefined && typeof r.exact === 'number') {\n r.min = r.max = r.exact;\n }\n const oldname_ = function(prefix, name) {\n if (prefix) {\n return prefix + name.charAt(0).toUpperCase() + name.slice(1);\n }\n return (name === 'deviceId') ? 'sourceId' : name;\n };\n if (r.ideal !== undefined) {\n cc.optional = cc.optional || [];\n let oc = {};\n if (typeof r.ideal === 'number') {\n oc[oldname_('min', key)] = r.ideal;\n cc.optional.push(oc);\n oc = {};\n oc[oldname_('max', key)] = r.ideal;\n cc.optional.push(oc);\n } else {\n oc[oldname_('', key)] = r.ideal;\n cc.optional.push(oc);\n }\n }\n if (r.exact !== undefined && typeof r.exact !== 'number') {\n cc.mandatory = cc.mandatory || {};\n cc.mandatory[oldname_('', key)] = r.exact;\n } else {\n ['min', 'max'].forEach(mix => {\n if (r[mix] !== undefined) {\n cc.mandatory = cc.mandatory || {};\n cc.mandatory[oldname_(mix, key)] = r[mix];\n }\n });\n }\n });\n if (c.advanced) {\n cc.optional = (cc.optional || []).concat(c.advanced);\n }\n return cc;\n };\n\n const shimConstraints_ = function(constraints, func) {\n if (browserDetails.version >= 61) {\n return func(constraints);\n }\n constraints = JSON.parse(JSON.stringify(constraints));\n if (constraints && typeof constraints.audio === 'object') {\n const remap = function(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n constraints = JSON.parse(JSON.stringify(constraints));\n remap(constraints.audio, 'autoGainControl', 'googAutoGainControl');\n remap(constraints.audio, 'noiseSuppression', 'googNoiseSuppression');\n constraints.audio = constraintsToChrome_(constraints.audio);\n }\n if (constraints && typeof constraints.video === 'object') {\n // Shim facingMode for mobile & surface pro.\n let face = constraints.video.facingMode;\n face = face && ((typeof face === 'object') ? face : {ideal: face});\n const getSupportedFacingModeLies = browserDetails.version < 66;\n\n if ((face && (face.exact === 'user' || face.exact === 'environment' ||\n face.ideal === 'user' || face.ideal === 'environment')) &&\n !(navigator.mediaDevices.getSupportedConstraints &&\n navigator.mediaDevices.getSupportedConstraints().facingMode &&\n !getSupportedFacingModeLies)) {\n delete constraints.video.facingMode;\n let matches;\n if (face.exact === 'environment' || face.ideal === 'environment') {\n matches = ['back', 'rear'];\n } else if (face.exact === 'user' || face.ideal === 'user') {\n matches = ['front'];\n }\n if (matches) {\n // Look for matches in label, or use last cam for back (typical).\n return navigator.mediaDevices.enumerateDevices()\n .then(devices => {\n devices = devices.filter(d => d.kind === 'videoinput');\n let dev = devices.find(d => matches.some(match =>\n d.label.toLowerCase().includes(match)));\n if (!dev && devices.length && matches.includes('back')) {\n dev = devices[devices.length - 1]; // more likely the back cam\n }\n if (dev) {\n constraints.video.deviceId = face.exact\n ? {exact: dev.deviceId}\n : {ideal: dev.deviceId};\n }\n constraints.video = constraintsToChrome_(constraints.video);\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n });\n }\n }\n constraints.video = constraintsToChrome_(constraints.video);\n }\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n };\n\n const shimError_ = function(e) {\n if (browserDetails.version >= 64) {\n return e;\n }\n return {\n name: {\n PermissionDeniedError: 'NotAllowedError',\n PermissionDismissedError: 'NotAllowedError',\n InvalidStateError: 'NotAllowedError',\n DevicesNotFoundError: 'NotFoundError',\n ConstraintNotSatisfiedError: 'OverconstrainedError',\n TrackStartError: 'NotReadableError',\n MediaDeviceFailedDueToShutdown: 'NotAllowedError',\n MediaDeviceKillSwitchOn: 'NotAllowedError',\n TabCaptureError: 'AbortError',\n ScreenCaptureError: 'AbortError',\n DeviceCaptureError: 'AbortError'\n }[e.name] || e.name,\n message: e.message,\n constraint: e.constraint || e.constraintName,\n toString() {\n return this.name + (this.message && ': ') + this.message;\n }\n };\n };\n\n const getUserMedia_ = function(constraints, onSuccess, onError) {\n shimConstraints_(constraints, c => {\n navigator.webkitGetUserMedia(c, onSuccess, e => {\n if (onError) {\n onError(shimError_(e));\n }\n });\n });\n };\n navigator.getUserMedia = getUserMedia_.bind(navigator);\n\n // Even though Chrome 45 has navigator.mediaDevices and a getUserMedia\n // function which returns a Promise, it does not accept spec-style\n // constraints.\n if (navigator.mediaDevices.getUserMedia) {\n const origGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(cs) {\n return shimConstraints_(cs, c => origGetUserMedia(c).then(stream => {\n if (c.audio && !stream.getAudioTracks().length ||\n c.video && !stream.getVideoTracks().length) {\n stream.getTracks().forEach(track => {\n track.stop();\n });\n throw new DOMException('', 'NotFoundError');\n }\n return stream;\n }, e => Promise.reject(shimError_(e))));\n };\n }\n}\n","/*\n * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\nexport function shimGetDisplayMedia(window, getSourceId) {\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n // getSourceId is a function that returns a promise resolving with\n // the sourceId of the screen/window/tab to be shared.\n if (typeof getSourceId !== 'function') {\n console.error('shimGetDisplayMedia: getSourceId argument is not ' +\n 'a function');\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n function getDisplayMedia(constraints) {\n return getSourceId(constraints)\n .then(sourceId => {\n const widthSpecified = constraints.video && constraints.video.width;\n const heightSpecified = constraints.video &&\n constraints.video.height;\n const frameRateSpecified = constraints.video &&\n constraints.video.frameRate;\n constraints.video = {\n mandatory: {\n chromeMediaSource: 'desktop',\n chromeMediaSourceId: sourceId,\n maxFrameRate: frameRateSpecified || 3\n }\n };\n if (widthSpecified) {\n constraints.video.mandatory.maxWidth = widthSpecified;\n }\n if (heightSpecified) {\n constraints.video.mandatory.maxHeight = heightSpecified;\n }\n return window.navigator.mediaDevices.getUserMedia(constraints);\n });\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\nimport * as utils from '../utils.js';\n\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimMediaStream(window) {\n window.MediaStream = window.MediaStream || window.webkitMediaStream;\n}\n\nexport function shimOnTrack(window) {\n if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n get() {\n return this._ontrack;\n },\n set(f) {\n if (this._ontrack) {\n this.removeEventListener('track', this._ontrack);\n }\n this.addEventListener('track', this._ontrack = f);\n },\n enumerable: true,\n configurable: true\n });\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n if (!this._ontrackpoly) {\n this._ontrackpoly = (e) => {\n // onaddstream does not fire when a track is added to an existing\n // stream. But stream.onaddtrack is implemented so we use that.\n e.stream.addEventListener('addtrack', te => {\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = this.getReceivers()\n .find(r => r.track && r.track.id === te.track.id);\n } else {\n receiver = {track: te.track};\n }\n\n const event = new Event('track');\n event.track = te.track;\n event.receiver = receiver;\n event.transceiver = {receiver};\n event.streams = [e.stream];\n this.dispatchEvent(event);\n });\n e.stream.getTracks().forEach(track => {\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = this.getReceivers()\n .find(r => r.track && r.track.id === track.id);\n } else {\n receiver = {track};\n }\n const event = new Event('track');\n event.track = track;\n event.receiver = receiver;\n event.transceiver = {receiver};\n event.streams = [e.stream];\n this.dispatchEvent(event);\n });\n };\n this.addEventListener('addstream', this._ontrackpoly);\n }\n return origSetRemoteDescription.apply(this, arguments);\n };\n } else {\n // even if RTCRtpTransceiver is in window, it is only used and\n // emitted in unified-plan. Unfortunately this means we need\n // to unconditionally wrap the event.\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n if (!e.transceiver) {\n Object.defineProperty(e, 'transceiver',\n {value: {receiver: e.receiver}});\n }\n return e;\n });\n }\n}\n\nexport function shimGetSendersWithDtmf(window) {\n // Overrides addTrack/removeTrack, depends on shimAddTrackRemoveTrack.\n if (typeof window === 'object' && window.RTCPeerConnection &&\n !('getSenders' in window.RTCPeerConnection.prototype) &&\n 'createDTMFSender' in window.RTCPeerConnection.prototype) {\n const shimSenderWithDtmf = function(pc, track) {\n return {\n track,\n get dtmf() {\n if (this._dtmf === undefined) {\n if (track.kind === 'audio') {\n this._dtmf = pc.createDTMFSender(track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n },\n _pc: pc\n };\n };\n\n // augment addTrack when getSenders is not available.\n if (!window.RTCPeerConnection.prototype.getSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n this._senders = this._senders || [];\n return this._senders.slice(); // return a copy of the internal state.\n };\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n let sender = origAddTrack.apply(this, arguments);\n if (!sender) {\n sender = shimSenderWithDtmf(this, track);\n this._senders.push(sender);\n }\n return sender;\n };\n\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n origRemoveTrack.apply(this, arguments);\n const idx = this._senders.indexOf(sender);\n if (idx !== -1) {\n this._senders.splice(idx, 1);\n }\n };\n }\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._senders = this._senders || [];\n origAddStream.apply(this, [stream]);\n stream.getTracks().forEach(track => {\n this._senders.push(shimSenderWithDtmf(this, track));\n });\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._senders = this._senders || [];\n origRemoveStream.apply(this, [stream]);\n\n stream.getTracks().forEach(track => {\n const sender = this._senders.find(s => s.track === track);\n if (sender) { // remove sender\n this._senders.splice(this._senders.indexOf(sender), 1);\n }\n });\n };\n } else if (typeof window === 'object' && window.RTCPeerConnection &&\n 'getSenders' in window.RTCPeerConnection.prototype &&\n 'createDTMFSender' in window.RTCPeerConnection.prototype &&\n window.RTCRtpSender &&\n !('dtmf' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n\n Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n get() {\n if (this._dtmf === undefined) {\n if (this.track.kind === 'audio') {\n this._dtmf = this._pc.createDTMFSender(this.track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n }\n });\n }\n}\n\nexport function shimGetStats(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n\n const origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n const [selector, onSucc, onErr] = arguments;\n\n // If selector is a function then we are in the old style stats so just\n // pass back the original getStats format to avoid breaking old users.\n if (arguments.length > 0 && typeof selector === 'function') {\n return origGetStats.apply(this, arguments);\n }\n\n // When spec-style getStats is supported, return those when called with\n // either no arguments or the selector argument is null.\n if (origGetStats.length === 0 && (arguments.length === 0 ||\n typeof selector !== 'function')) {\n return origGetStats.apply(this, []);\n }\n\n const fixChromeStats_ = function(response) {\n const standardReport = {};\n const reports = response.result();\n reports.forEach(report => {\n const standardStats = {\n id: report.id,\n timestamp: report.timestamp,\n type: {\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n }[report.type] || report.type\n };\n report.names().forEach(name => {\n standardStats[name] = report.stat(name);\n });\n standardReport[standardStats.id] = standardStats;\n });\n\n return standardReport;\n };\n\n // shim getStats with maplike support\n const makeMapStats = function(stats) {\n return new Map(Object.keys(stats).map(key => [key, stats[key]]));\n };\n\n if (arguments.length >= 2) {\n const successCallbackWrapper_ = function(response) {\n onSucc(makeMapStats(fixChromeStats_(response)));\n };\n\n return origGetStats.apply(this, [successCallbackWrapper_,\n selector]);\n }\n\n // promise-support\n return new Promise((resolve, reject) => {\n origGetStats.apply(this, [\n function(response) {\n resolve(makeMapStats(fixChromeStats_(response)));\n }, reject]);\n }).then(onSucc, onErr);\n };\n}\n\nexport function shimSenderReceiverGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender && window.RTCRtpReceiver)) {\n return;\n }\n\n // shim sender stats.\n if (!('getStats' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n }\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n const sender = this;\n return this._pc.getStats().then(result =>\n /* Note: this will include stats of all senders that\n * send a track with the same id as sender.track as\n * it is not possible to identify the RTCRtpSender.\n */\n utils.filterStats(result, sender.track, true));\n };\n }\n\n // shim receiver stats.\n if (!('getStats' in window.RTCRtpReceiver.prototype)) {\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers =\n function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach(receiver => receiver._pc = this);\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n const receiver = this;\n return this._pc.getStats().then(result =>\n utils.filterStats(result, receiver.track, false));\n };\n }\n\n if (!('getStats' in window.RTCRtpSender.prototype &&\n 'getStats' in window.RTCRtpReceiver.prototype)) {\n return;\n }\n\n // shim RTCPeerConnection.getStats(track).\n const origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n if (arguments.length > 0 &&\n arguments[0] instanceof window.MediaStreamTrack) {\n const track = arguments[0];\n let sender;\n let receiver;\n let err;\n this.getSenders().forEach(s => {\n if (s.track === track) {\n if (sender) {\n err = true;\n } else {\n sender = s;\n }\n }\n });\n this.getReceivers().forEach(r => {\n if (r.track === track) {\n if (receiver) {\n err = true;\n } else {\n receiver = r;\n }\n }\n return r.track === track;\n });\n if (err || (sender && receiver)) {\n return Promise.reject(new DOMException(\n 'There are more than one sender or receiver for the track.',\n 'InvalidAccessError'));\n } else if (sender) {\n return sender.getStats();\n } else if (receiver) {\n return receiver.getStats();\n }\n return Promise.reject(new DOMException(\n 'There is no sender or receiver for the track.',\n 'InvalidAccessError'));\n }\n return origGetStats.apply(this, arguments);\n };\n}\n\nexport function shimAddTrackRemoveTrackWithNative(window) {\n // shim addTrack/removeTrack with native variants in order to make\n // the interactions with legacy getLocalStreams behave as in other browsers.\n // Keeps a mapping stream.id => [stream, rtpsenders...]\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n return Object.keys(this._shimmedLocalStreams)\n .map(streamId => this._shimmedLocalStreams[streamId][0]);\n };\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n if (!stream) {\n return origAddTrack.apply(this, arguments);\n }\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n const sender = origAddTrack.apply(this, arguments);\n if (!this._shimmedLocalStreams[stream.id]) {\n this._shimmedLocalStreams[stream.id] = [stream, sender];\n } else if (this._shimmedLocalStreams[stream.id].indexOf(sender) === -1) {\n this._shimmedLocalStreams[stream.id].push(sender);\n }\n return sender;\n };\n\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n stream.getTracks().forEach(track => {\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n const existingSenders = this.getSenders();\n origAddStream.apply(this, arguments);\n const newSenders = this.getSenders()\n .filter(newSender => existingSenders.indexOf(newSender) === -1);\n this._shimmedLocalStreams[stream.id] = [stream].concat(newSenders);\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n delete this._shimmedLocalStreams[stream.id];\n return origRemoveStream.apply(this, arguments);\n };\n\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n if (sender) {\n Object.keys(this._shimmedLocalStreams).forEach(streamId => {\n const idx = this._shimmedLocalStreams[streamId].indexOf(sender);\n if (idx !== -1) {\n this._shimmedLocalStreams[streamId].splice(idx, 1);\n }\n if (this._shimmedLocalStreams[streamId].length === 1) {\n delete this._shimmedLocalStreams[streamId];\n }\n });\n }\n return origRemoveTrack.apply(this, arguments);\n };\n}\n\nexport function shimAddTrackRemoveTrack(window, browserDetails) {\n if (!window.RTCPeerConnection) {\n return;\n }\n // shim addTrack and removeTrack.\n if (window.RTCPeerConnection.prototype.addTrack &&\n browserDetails.version >= 65) {\n return shimAddTrackRemoveTrackWithNative(window);\n }\n\n // also shim pc.getLocalStreams when addTrack is shimmed\n // to return the original streams.\n const origGetLocalStreams = window.RTCPeerConnection.prototype\n .getLocalStreams;\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n const nativeStreams = origGetLocalStreams.apply(this);\n this._reverseStreams = this._reverseStreams || {};\n return nativeStreams.map(stream => this._reverseStreams[stream.id]);\n };\n\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n stream.getTracks().forEach(track => {\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n // Add identity mapping for consistency with addTrack.\n // Unless this is being used with a stream from addTrack.\n if (!this._reverseStreams[stream.id]) {\n const newStream = new window.MediaStream(stream.getTracks());\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n stream = newStream;\n }\n origAddStream.apply(this, [stream]);\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n origRemoveStream.apply(this, [(this._streams[stream.id] || stream)]);\n delete this._reverseStreams[(this._streams[stream.id] ?\n this._streams[stream.id].id : stream.id)];\n delete this._streams[stream.id];\n };\n\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n if (this.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n const streams = [].slice.call(arguments, 1);\n if (streams.length !== 1 ||\n !streams[0].getTracks().find(t => t === track)) {\n // this is not fully correct but all we can manage without\n // [[associated MediaStreams]] internal slot.\n throw new DOMException(\n 'The adapter.js addTrack polyfill only supports a single ' +\n ' stream which is associated with the specified track.',\n 'NotSupportedError');\n }\n\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n const oldStream = this._streams[stream.id];\n if (oldStream) {\n // this is using odd Chrome behaviour, use with caution:\n // https://bugs.chromium.org/p/webrtc/issues/detail?id=7815\n // Note: we rely on the high-level addTrack/dtmf shim to\n // create the sender with a dtmf sender.\n oldStream.addTrack(track);\n\n // Trigger ONN async.\n Promise.resolve().then(() => {\n this.dispatchEvent(new Event('negotiationneeded'));\n });\n } else {\n const newStream = new window.MediaStream([track]);\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n this.addStream(newStream);\n }\n return this.getSenders().find(s => s.track === track);\n };\n\n // replace the internal stream id with the external one and\n // vice versa.\n function replaceInternalStreamId(pc, description) {\n let sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(internalId => {\n const externalStream = pc._reverseStreams[internalId];\n const internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(internalStream.id, 'g'),\n externalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp\n });\n }\n function replaceExternalStreamId(pc, description) {\n let sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(internalId => {\n const externalStream = pc._reverseStreams[internalId];\n const internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(externalStream.id, 'g'),\n internalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp\n });\n }\n ['createOffer', 'createAnswer'].forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n const args = arguments;\n const isLegacyCall = arguments.length &&\n typeof arguments[0] === 'function';\n if (isLegacyCall) {\n return nativeMethod.apply(this, [\n (description) => {\n const desc = replaceInternalStreamId(this, description);\n args[0].apply(null, [desc]);\n },\n (err) => {\n if (args[1]) {\n args[1].apply(null, err);\n }\n }, arguments[2]\n ]);\n }\n return nativeMethod.apply(this, arguments)\n .then(description => replaceInternalStreamId(this, description));\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n\n const origSetLocalDescription =\n window.RTCPeerConnection.prototype.setLocalDescription;\n window.RTCPeerConnection.prototype.setLocalDescription =\n function setLocalDescription() {\n if (!arguments.length || !arguments[0].type) {\n return origSetLocalDescription.apply(this, arguments);\n }\n arguments[0] = replaceExternalStreamId(this, arguments[0]);\n return origSetLocalDescription.apply(this, arguments);\n };\n\n // TODO: mangle getStats: https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats-streamidentifier\n\n const origLocalDescription = Object.getOwnPropertyDescriptor(\n window.RTCPeerConnection.prototype, 'localDescription');\n Object.defineProperty(window.RTCPeerConnection.prototype,\n 'localDescription', {\n get() {\n const description = origLocalDescription.get.apply(this);\n if (description.type === '') {\n return description;\n }\n return replaceInternalStreamId(this, description);\n }\n });\n\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n if (this.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n // We can not yet check for sender instanceof RTCRtpSender\n // since we shim RTPSender. So we check if sender._pc is set.\n if (!sender._pc) {\n throw new DOMException('Argument 1 of RTCPeerConnection.removeTrack ' +\n 'does not implement interface RTCRtpSender.', 'TypeError');\n }\n const isLocal = sender._pc === this;\n if (!isLocal) {\n throw new DOMException('Sender was not created by this connection.',\n 'InvalidAccessError');\n }\n\n // Search for the native stream the senders track belongs to.\n this._streams = this._streams || {};\n let stream;\n Object.keys(this._streams).forEach(streamid => {\n const hasTrack = this._streams[streamid].getTracks()\n .find(track => sender.track === track);\n if (hasTrack) {\n stream = this._streams[streamid];\n }\n });\n\n if (stream) {\n if (stream.getTracks().length === 1) {\n // if this is the last track of the stream, remove the stream. This\n // takes care of any shimmed _senders.\n this.removeStream(this._reverseStreams[stream.id]);\n } else {\n // relying on the same odd chrome behaviour as above.\n stream.removeTrack(sender.track);\n }\n this.dispatchEvent(new Event('negotiationneeded'));\n }\n };\n}\n\nexport function shimPeerConnection(window, browserDetails) {\n if (!window.RTCPeerConnection && window.webkitRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.webkitRTCPeerConnection;\n }\n if (!window.RTCPeerConnection) {\n return;\n }\n\n // shim implicit creation of RTCSessionDescription/RTCIceCandidate\n if (browserDetails.version < 53) {\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n}\n\n// Attempt to fix ONN in plan-b mode.\nexport function fixNegotiationNeeded(window, browserDetails) {\n utils.wrapPeerConnectionEvent(window, 'negotiationneeded', e => {\n const pc = e.target;\n if (browserDetails.version < 72 || (pc.getConfiguration &&\n pc.getConfiguration().sdpSemantics === 'plan-b')) {\n if (pc.signalingState !== 'stable') {\n return;\n }\n }\n return e;\n });\n}\n","import _arrayLikeToArray from './_array_like_to_array.mjs';\n\nexport default function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\n","export default function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n","import arrayWithoutHoles from './_array_without_holes.mjs';\nimport iterableToArray from './_iterable_to_array.mjs';\nimport nonIterableSpread from './_non_iterable_spread.mjs';\nimport unsupportedIterableToArray from './_unsupported_iterable_to_array.mjs';\n\nexport default function _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\n\nexport function shimGetUserMedia(window, browserDetails) {\n const navigator = window && window.navigator;\n const MediaStreamTrack = window && window.MediaStreamTrack;\n\n navigator.getUserMedia = function(constraints, onSuccess, onError) {\n // Replace Firefox 44+'s deprecation warning with unprefixed version.\n utils.deprecated('navigator.getUserMedia',\n 'navigator.mediaDevices.getUserMedia');\n navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);\n };\n\n if (!(browserDetails.version > 55 &&\n 'autoGainControl' in navigator.mediaDevices.getSupportedConstraints())) {\n const remap = function(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n\n const nativeGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(c) {\n if (typeof c === 'object' && typeof c.audio === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c.audio, 'autoGainControl', 'mozAutoGainControl');\n remap(c.audio, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeGetUserMedia(c);\n };\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.getSettings) {\n const nativeGetSettings = MediaStreamTrack.prototype.getSettings;\n MediaStreamTrack.prototype.getSettings = function() {\n const obj = nativeGetSettings.apply(this, arguments);\n remap(obj, 'mozAutoGainControl', 'autoGainControl');\n remap(obj, 'mozNoiseSuppression', 'noiseSuppression');\n return obj;\n };\n }\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.applyConstraints) {\n const nativeApplyConstraints =\n MediaStreamTrack.prototype.applyConstraints;\n MediaStreamTrack.prototype.applyConstraints = function(c) {\n if (this.kind === 'audio' && typeof c === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c, 'autoGainControl', 'mozAutoGainControl');\n remap(c, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeApplyConstraints.apply(this, [c]);\n };\n }\n }\n}\n","/*\n * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nexport function shimGetDisplayMedia(window, preferredMediaSource) {\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n function getDisplayMedia(constraints) {\n if (!(constraints && constraints.video)) {\n const err = new DOMException('getDisplayMedia without video ' +\n 'constraints is undefined');\n err.name = 'NotFoundError';\n // from https://heycam.github.io/webidl/#idl-DOMException-error-names\n err.code = 8;\n return Promise.reject(err);\n }\n if (constraints.video === true) {\n constraints.video = {mediaSource: preferredMediaSource};\n } else {\n constraints.video.mediaSource = preferredMediaSource;\n }\n return window.navigator.mediaDevices.getUserMedia(constraints);\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimOnTrack(window) {\n if (typeof window === 'object' && window.RTCTrackEvent &&\n ('receiver' in window.RTCTrackEvent.prototype) &&\n !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get() {\n return {receiver: this.receiver};\n }\n });\n }\n}\n\nexport function shimPeerConnection(window, browserDetails) {\n if (typeof window !== 'object' ||\n !(window.RTCPeerConnection || window.mozRTCPeerConnection)) {\n return; // probably media.peerconnection.enabled=false in about:config\n }\n if (!window.RTCPeerConnection && window.mozRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.mozRTCPeerConnection;\n }\n\n if (browserDetails.version < 53) {\n // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n\n const modernStatsTypes = {\n inboundrtp: 'inbound-rtp',\n outboundrtp: 'outbound-rtp',\n candidatepair: 'candidate-pair',\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n };\n\n const nativeGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n const [selector, onSucc, onErr] = arguments;\n return nativeGetStats.apply(this, [selector || null])\n .then(stats => {\n if (browserDetails.version < 53 && !onSucc) {\n // Shim only promise getStats with spec-hyphens in type names\n // Leave callback version alone; misc old uses of forEach before Map\n try {\n stats.forEach(stat => {\n stat.type = modernStatsTypes[stat.type] || stat.type;\n });\n } catch (e) {\n if (e.name !== 'TypeError') {\n throw e;\n }\n // Avoid TypeError: \"type\" is read-only, in old versions. 34-43ish\n stats.forEach((stat, i) => {\n stats.set(i, Object.assign({}, stat, {\n type: modernStatsTypes[stat.type] || stat.type\n }));\n });\n }\n }\n return stats;\n })\n .then(onSucc, onErr);\n };\n}\n\nexport function shimSenderGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpSender.prototype) {\n return;\n }\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n }\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n return this.track ? this._pc.getStats(this.track) :\n Promise.resolve(new Map());\n };\n}\n\nexport function shimReceiverGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpReceiver.prototype) {\n return;\n }\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers = function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach(receiver => receiver._pc = this);\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n return this._pc.getStats(this.track);\n };\n}\n\nexport function shimRemoveStream(window) {\n if (!window.RTCPeerConnection ||\n 'removeStream' in window.RTCPeerConnection.prototype) {\n return;\n }\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n utils.deprecated('removeStream', 'removeTrack');\n this.getSenders().forEach(sender => {\n if (sender.track && stream.getTracks().includes(sender.track)) {\n this.removeTrack(sender);\n }\n });\n };\n}\n\nexport function shimRTCDataChannel(window) {\n // rename DataChannel to RTCDataChannel (native fix in FF60):\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1173851\n if (window.DataChannel && !window.RTCDataChannel) {\n window.RTCDataChannel = window.DataChannel;\n }\n}\n\nexport function shimAddTransceiver(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origAddTransceiver = window.RTCPeerConnection.prototype.addTransceiver;\n if (origAddTransceiver) {\n window.RTCPeerConnection.prototype.addTransceiver =\n function addTransceiver() {\n this.setParametersPromises = [];\n // WebIDL input coercion and validation\n let sendEncodings = arguments[1] && arguments[1].sendEncodings;\n if (sendEncodings === undefined) {\n sendEncodings = [];\n }\n sendEncodings = [...sendEncodings];\n const shouldPerformCheck = sendEncodings.length > 0;\n if (shouldPerformCheck) {\n // If sendEncodings params are provided, validate grammar\n sendEncodings.forEach((encodingParam) => {\n if ('rid' in encodingParam) {\n const ridRegex = /^[a-z0-9]{0,16}$/i;\n if (!ridRegex.test(encodingParam.rid)) {\n throw new TypeError('Invalid RID value provided.');\n }\n }\n if ('scaleResolutionDownBy' in encodingParam) {\n if (!(parseFloat(encodingParam.scaleResolutionDownBy) >= 1.0)) {\n throw new RangeError('scale_resolution_down_by must be >= 1.0');\n }\n }\n if ('maxFramerate' in encodingParam) {\n if (!(parseFloat(encodingParam.maxFramerate) >= 0)) {\n throw new RangeError('max_framerate must be >= 0.0');\n }\n }\n });\n }\n const transceiver = origAddTransceiver.apply(this, arguments);\n if (shouldPerformCheck) {\n // Check if the init options were applied. If not we do this in an\n // asynchronous way and save the promise reference in a global object.\n // This is an ugly hack, but at the same time is way more robust than\n // checking the sender parameters before and after the createOffer\n // Also note that after the createoffer we are not 100% sure that\n // the params were asynchronously applied so we might miss the\n // opportunity to recreate offer.\n const {sender} = transceiver;\n const params = sender.getParameters();\n if (!('encodings' in params) ||\n // Avoid being fooled by patched getParameters() below.\n (params.encodings.length === 1 &&\n Object.keys(params.encodings[0]).length === 0)) {\n params.encodings = sendEncodings;\n sender.sendEncodings = sendEncodings;\n this.setParametersPromises.push(sender.setParameters(params)\n .then(() => {\n delete sender.sendEncodings;\n }).catch(() => {\n delete sender.sendEncodings;\n })\n );\n }\n }\n return transceiver;\n };\n }\n}\n\nexport function shimGetParameters(window) {\n if (!(typeof window === 'object' && window.RTCRtpSender)) {\n return;\n }\n const origGetParameters = window.RTCRtpSender.prototype.getParameters;\n if (origGetParameters) {\n window.RTCRtpSender.prototype.getParameters =\n function getParameters() {\n const params = origGetParameters.apply(this, arguments);\n if (!('encodings' in params)) {\n params.encodings = [].concat(this.sendEncodings || [{}]);\n }\n return params;\n };\n }\n}\n\nexport function shimCreateOffer(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer = function createOffer() {\n if (this.setParametersPromises && this.setParametersPromises.length) {\n return Promise.all(this.setParametersPromises)\n .then(() => {\n return origCreateOffer.apply(this, arguments);\n })\n .finally(() => {\n this.setParametersPromises = [];\n });\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\n\nexport function shimCreateAnswer(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origCreateAnswer = window.RTCPeerConnection.prototype.createAnswer;\n window.RTCPeerConnection.prototype.createAnswer = function createAnswer() {\n if (this.setParametersPromises && this.setParametersPromises.length) {\n return Promise.all(this.setParametersPromises)\n .then(() => {\n return origCreateAnswer.apply(this, arguments);\n })\n .finally(() => {\n this.setParametersPromises = [];\n });\n }\n return origCreateAnswer.apply(this, arguments);\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n'use strict';\nimport * as utils from '../utils';\n\nexport function shimLocalStreamsAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getLocalStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n return this._localStreams;\n };\n }\n if (!('addStream' in window.RTCPeerConnection.prototype)) {\n const _addTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n if (!this._localStreams.includes(stream)) {\n this._localStreams.push(stream);\n }\n // Try to emulate Chrome's behaviour of adding in audio-video order.\n // Safari orders by track id.\n stream.getAudioTracks().forEach(track => _addTrack.call(this, track,\n stream));\n stream.getVideoTracks().forEach(track => _addTrack.call(this, track,\n stream));\n };\n\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, ...streams) {\n if (streams) {\n streams.forEach((stream) => {\n if (!this._localStreams) {\n this._localStreams = [stream];\n } else if (!this._localStreams.includes(stream)) {\n this._localStreams.push(stream);\n }\n });\n }\n return _addTrack.apply(this, arguments);\n };\n }\n if (!('removeStream' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n const index = this._localStreams.indexOf(stream);\n if (index === -1) {\n return;\n }\n this._localStreams.splice(index, 1);\n const tracks = stream.getTracks();\n this.getSenders().forEach(sender => {\n if (tracks.includes(sender.track)) {\n this.removeTrack(sender);\n }\n });\n };\n }\n}\n\nexport function shimRemoteStreamsAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getRemoteStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getRemoteStreams =\n function getRemoteStreams() {\n return this._remoteStreams ? this._remoteStreams : [];\n };\n }\n if (!('onaddstream' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'onaddstream', {\n get() {\n return this._onaddstream;\n },\n set(f) {\n if (this._onaddstream) {\n this.removeEventListener('addstream', this._onaddstream);\n this.removeEventListener('track', this._onaddstreampoly);\n }\n this.addEventListener('addstream', this._onaddstream = f);\n this.addEventListener('track', this._onaddstreampoly = (e) => {\n e.streams.forEach(stream => {\n if (!this._remoteStreams) {\n this._remoteStreams = [];\n }\n if (this._remoteStreams.includes(stream)) {\n return;\n }\n this._remoteStreams.push(stream);\n const event = new Event('addstream');\n event.stream = stream;\n this.dispatchEvent(event);\n });\n });\n }\n });\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n const pc = this;\n if (!this._onaddstreampoly) {\n this.addEventListener('track', this._onaddstreampoly = function(e) {\n e.streams.forEach(stream => {\n if (!pc._remoteStreams) {\n pc._remoteStreams = [];\n }\n if (pc._remoteStreams.indexOf(stream) >= 0) {\n return;\n }\n pc._remoteStreams.push(stream);\n const event = new Event('addstream');\n event.stream = stream;\n pc.dispatchEvent(event);\n });\n });\n }\n return origSetRemoteDescription.apply(pc, arguments);\n };\n }\n}\n\nexport function shimCallbacksAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n const prototype = window.RTCPeerConnection.prototype;\n const origCreateOffer = prototype.createOffer;\n const origCreateAnswer = prototype.createAnswer;\n const setLocalDescription = prototype.setLocalDescription;\n const setRemoteDescription = prototype.setRemoteDescription;\n const addIceCandidate = prototype.addIceCandidate;\n\n prototype.createOffer =\n function createOffer(successCallback, failureCallback) {\n const options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n const promise = origCreateOffer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n prototype.createAnswer =\n function createAnswer(successCallback, failureCallback) {\n const options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n const promise = origCreateAnswer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n let withCallback = function(description, successCallback, failureCallback) {\n const promise = setLocalDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setLocalDescription = withCallback;\n\n withCallback = function(description, successCallback, failureCallback) {\n const promise = setRemoteDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setRemoteDescription = withCallback;\n\n withCallback = function(candidate, successCallback, failureCallback) {\n const promise = addIceCandidate.apply(this, [candidate]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.addIceCandidate = withCallback;\n}\n\nexport function shimGetUserMedia(window) {\n const navigator = window && window.navigator;\n\n if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {\n // shim not needed in Safari 12.1\n const mediaDevices = navigator.mediaDevices;\n const _getUserMedia = mediaDevices.getUserMedia.bind(mediaDevices);\n navigator.mediaDevices.getUserMedia = (constraints) => {\n return _getUserMedia(shimConstraints(constraints));\n };\n }\n\n if (!navigator.getUserMedia && navigator.mediaDevices &&\n navigator.mediaDevices.getUserMedia) {\n navigator.getUserMedia = function getUserMedia(constraints, cb, errcb) {\n navigator.mediaDevices.getUserMedia(constraints)\n .then(cb, errcb);\n }.bind(navigator);\n }\n}\n\nexport function shimConstraints(constraints) {\n if (constraints && constraints.video !== undefined) {\n return Object.assign({},\n constraints,\n {video: utils.compactObject(constraints.video)}\n );\n }\n\n return constraints;\n}\n\nexport function shimRTCIceServerUrls(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n // migrate from non-spec RTCIceServer.url to RTCIceServer.urls\n const OrigPeerConnection = window.RTCPeerConnection;\n window.RTCPeerConnection =\n function RTCPeerConnection(pcConfig, pcConstraints) {\n if (pcConfig && pcConfig.iceServers) {\n const newIceServers = [];\n for (let i = 0; i < pcConfig.iceServers.length; i++) {\n let server = pcConfig.iceServers[i];\n if (server.urls === undefined && server.url) {\n utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n server = JSON.parse(JSON.stringify(server));\n server.urls = server.url;\n delete server.url;\n newIceServers.push(server);\n } else {\n newIceServers.push(pcConfig.iceServers[i]);\n }\n }\n pcConfig.iceServers = newIceServers;\n }\n return new OrigPeerConnection(pcConfig, pcConstraints);\n };\n window.RTCPeerConnection.prototype = OrigPeerConnection.prototype;\n // wrap static methods. Currently just generateCertificate.\n if ('generateCertificate' in OrigPeerConnection) {\n Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n get() {\n return OrigPeerConnection.generateCertificate;\n }\n });\n }\n}\n\nexport function shimTrackEventTransceiver(window) {\n // Add event.transceiver member over deprecated event.receiver\n if (typeof window === 'object' && window.RTCTrackEvent &&\n 'receiver' in window.RTCTrackEvent.prototype &&\n !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get() {\n return {receiver: this.receiver};\n }\n });\n }\n}\n\nexport function shimCreateOfferLegacy(window) {\n const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer =\n function createOffer(offerOptions) {\n if (offerOptions) {\n if (typeof offerOptions.offerToReceiveAudio !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveAudio =\n !!offerOptions.offerToReceiveAudio;\n }\n const audioTransceiver = this.getTransceivers().find(transceiver =>\n transceiver.receiver.track.kind === 'audio');\n if (offerOptions.offerToReceiveAudio === false && audioTransceiver) {\n if (audioTransceiver.direction === 'sendrecv') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('sendonly');\n } else {\n audioTransceiver.direction = 'sendonly';\n }\n } else if (audioTransceiver.direction === 'recvonly') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('inactive');\n } else {\n audioTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveAudio === true &&\n !audioTransceiver) {\n this.addTransceiver('audio', {direction: 'recvonly'});\n }\n\n if (typeof offerOptions.offerToReceiveVideo !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveVideo =\n !!offerOptions.offerToReceiveVideo;\n }\n const videoTransceiver = this.getTransceivers().find(transceiver =>\n transceiver.receiver.track.kind === 'video');\n if (offerOptions.offerToReceiveVideo === false && videoTransceiver) {\n if (videoTransceiver.direction === 'sendrecv') {\n if (videoTransceiver.setDirection) {\n videoTransceiver.setDirection('sendonly');\n } else {\n videoTransceiver.direction = 'sendonly';\n }\n } else if (videoTransceiver.direction === 'recvonly') {\n if (videoTransceiver.setDirection) {\n videoTransceiver.setDirection('inactive');\n } else {\n videoTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveVideo === true &&\n !videoTransceiver) {\n this.addTransceiver('video', {direction: 'recvonly'});\n }\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\n\nexport function shimAudioContext(window) {\n if (typeof window !== 'object' || window.AudioContext) {\n return;\n }\n window.AudioContext = window.webkitAudioContext;\n}\n\n","/* eslint-env node */\n'use strict';\n\n// SDP helpers.\nconst SDPUtils = {};\n\n// Generate an alphanumeric identifier for cname or mids.\n// TODO: use UUIDs instead? https://gist.github.com/jed/982883\nSDPUtils.generateIdentifier = function() {\n return Math.random().toString(36).substring(2, 12);\n};\n\n// The RTCP CNAME used by all peerconnections from the same JS.\nSDPUtils.localCName = SDPUtils.generateIdentifier();\n\n// Splits SDP into lines, dealing with both CRLF and LF.\nSDPUtils.splitLines = function(blob) {\n return blob.trim().split('\\n').map(line => line.trim());\n};\n// Splits SDP into sessionpart and mediasections. Ensures CRLF.\nSDPUtils.splitSections = function(blob) {\n const parts = blob.split('\\nm=');\n return parts.map((part, index) => (index > 0 ?\n 'm=' + part : part).trim() + '\\r\\n');\n};\n\n// Returns the session description.\nSDPUtils.getDescription = function(blob) {\n const sections = SDPUtils.splitSections(blob);\n return sections && sections[0];\n};\n\n// Returns the individual media sections.\nSDPUtils.getMediaSections = function(blob) {\n const sections = SDPUtils.splitSections(blob);\n sections.shift();\n return sections;\n};\n\n// Returns lines that start with a certain prefix.\nSDPUtils.matchPrefix = function(blob, prefix) {\n return SDPUtils.splitLines(blob).filter(line => line.indexOf(prefix) === 0);\n};\n\n// Parses an ICE candidate line. Sample input:\n// candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8\n// rport 55996\"\n// Input can be prefixed with a=.\nSDPUtils.parseCandidate = function(line) {\n let parts;\n // Parse both variants.\n if (line.indexOf('a=candidate:') === 0) {\n parts = line.substring(12).split(' ');\n } else {\n parts = line.substring(10).split(' ');\n }\n\n const candidate = {\n foundation: parts[0],\n component: {1: 'rtp', 2: 'rtcp'}[parts[1]] || parts[1],\n protocol: parts[2].toLowerCase(),\n priority: parseInt(parts[3], 10),\n ip: parts[4],\n address: parts[4], // address is an alias for ip.\n port: parseInt(parts[5], 10),\n // skip parts[6] == 'typ'\n type: parts[7],\n };\n\n for (let i = 8; i < parts.length; i += 2) {\n switch (parts[i]) {\n case 'raddr':\n candidate.relatedAddress = parts[i + 1];\n break;\n case 'rport':\n candidate.relatedPort = parseInt(parts[i + 1], 10);\n break;\n case 'tcptype':\n candidate.tcpType = parts[i + 1];\n break;\n case 'ufrag':\n candidate.ufrag = parts[i + 1]; // for backward compatibility.\n candidate.usernameFragment = parts[i + 1];\n break;\n default: // extension handling, in particular ufrag. Don't overwrite.\n if (candidate[parts[i]] === undefined) {\n candidate[parts[i]] = parts[i + 1];\n }\n break;\n }\n }\n return candidate;\n};\n\n// Translates a candidate object into SDP candidate attribute.\n// This does not include the a= prefix!\nSDPUtils.writeCandidate = function(candidate) {\n const sdp = [];\n sdp.push(candidate.foundation);\n\n const component = candidate.component;\n if (component === 'rtp') {\n sdp.push(1);\n } else if (component === 'rtcp') {\n sdp.push(2);\n } else {\n sdp.push(component);\n }\n sdp.push(candidate.protocol.toUpperCase());\n sdp.push(candidate.priority);\n sdp.push(candidate.address || candidate.ip);\n sdp.push(candidate.port);\n\n const type = candidate.type;\n sdp.push('typ');\n sdp.push(type);\n if (type !== 'host' && candidate.relatedAddress &&\n candidate.relatedPort) {\n sdp.push('raddr');\n sdp.push(candidate.relatedAddress);\n sdp.push('rport');\n sdp.push(candidate.relatedPort);\n }\n if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') {\n sdp.push('tcptype');\n sdp.push(candidate.tcpType);\n }\n if (candidate.usernameFragment || candidate.ufrag) {\n sdp.push('ufrag');\n sdp.push(candidate.usernameFragment || candidate.ufrag);\n }\n return 'candidate:' + sdp.join(' ');\n};\n\n// Parses an ice-options line, returns an array of option tags.\n// Sample input:\n// a=ice-options:foo bar\nSDPUtils.parseIceOptions = function(line) {\n return line.substring(14).split(' ');\n};\n\n// Parses a rtpmap line, returns RTCRtpCoddecParameters. Sample input:\n// a=rtpmap:111 opus/48000/2\nSDPUtils.parseRtpMap = function(line) {\n let parts = line.substring(9).split(' ');\n const parsed = {\n payloadType: parseInt(parts.shift(), 10), // was: id\n };\n\n parts = parts[0].split('/');\n\n parsed.name = parts[0];\n parsed.clockRate = parseInt(parts[1], 10); // was: clockrate\n parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1;\n // legacy alias, got renamed back to channels in ORTC.\n parsed.numChannels = parsed.channels;\n return parsed;\n};\n\n// Generates a rtpmap line from RTCRtpCodecCapability or\n// RTCRtpCodecParameters.\nSDPUtils.writeRtpMap = function(codec) {\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n const channels = codec.channels || codec.numChannels || 1;\n return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate +\n (channels !== 1 ? '/' + channels : '') + '\\r\\n';\n};\n\n// Parses a extmap line (headerextension from RFC 5285). Sample input:\n// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\n// a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset\nSDPUtils.parseExtmap = function(line) {\n const parts = line.substring(9).split(' ');\n return {\n id: parseInt(parts[0], 10),\n direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv',\n uri: parts[1],\n attributes: parts.slice(2).join(' '),\n };\n};\n\n// Generates an extmap line from RTCRtpHeaderExtensionParameters or\n// RTCRtpHeaderExtension.\nSDPUtils.writeExtmap = function(headerExtension) {\n return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) +\n (headerExtension.direction && headerExtension.direction !== 'sendrecv'\n ? '/' + headerExtension.direction\n : '') +\n ' ' + headerExtension.uri +\n (headerExtension.attributes ? ' ' + headerExtension.attributes : '') +\n '\\r\\n';\n};\n\n// Parses a fmtp line, returns dictionary. Sample input:\n// a=fmtp:96 vbr=on;cng=on\n// Also deals with vbr=on; cng=on\nSDPUtils.parseFmtp = function(line) {\n const parsed = {};\n let kv;\n const parts = line.substring(line.indexOf(' ') + 1).split(';');\n for (let j = 0; j < parts.length; j++) {\n kv = parts[j].trim().split('=');\n parsed[kv[0].trim()] = kv[1];\n }\n return parsed;\n};\n\n// Generates a fmtp line from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeFmtp = function(codec) {\n let line = '';\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.parameters && Object.keys(codec.parameters).length) {\n const params = [];\n Object.keys(codec.parameters).forEach(param => {\n if (codec.parameters[param] !== undefined) {\n params.push(param + '=' + codec.parameters[param]);\n } else {\n params.push(param);\n }\n });\n line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\\r\\n';\n }\n return line;\n};\n\n// Parses a rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:\n// a=rtcp-fb:98 nack rpsi\nSDPUtils.parseRtcpFb = function(line) {\n const parts = line.substring(line.indexOf(' ') + 1).split(' ');\n return {\n type: parts.shift(),\n parameter: parts.join(' '),\n };\n};\n\n// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeRtcpFb = function(codec) {\n let lines = '';\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.rtcpFeedback && codec.rtcpFeedback.length) {\n // FIXME: special handling for trr-int?\n codec.rtcpFeedback.forEach(fb => {\n lines += 'a=rtcp-fb:' + pt + ' ' + fb.type +\n (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') +\n '\\r\\n';\n });\n }\n return lines;\n};\n\n// Parses a RFC 5576 ssrc media attribute. Sample input:\n// a=ssrc:3735928559 cname:something\nSDPUtils.parseSsrcMedia = function(line) {\n const sp = line.indexOf(' ');\n const parts = {\n ssrc: parseInt(line.substring(7, sp), 10),\n };\n const colon = line.indexOf(':', sp);\n if (colon > -1) {\n parts.attribute = line.substring(sp + 1, colon);\n parts.value = line.substring(colon + 1);\n } else {\n parts.attribute = line.substring(sp + 1);\n }\n return parts;\n};\n\n// Parse a ssrc-group line (see RFC 5576). Sample input:\n// a=ssrc-group:semantics 12 34\nSDPUtils.parseSsrcGroup = function(line) {\n const parts = line.substring(13).split(' ');\n return {\n semantics: parts.shift(),\n ssrcs: parts.map(ssrc => parseInt(ssrc, 10)),\n };\n};\n\n// Extracts the MID (RFC 5888) from a media section.\n// Returns the MID or undefined if no mid line was found.\nSDPUtils.getMid = function(mediaSection) {\n const mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];\n if (mid) {\n return mid.substring(6);\n }\n};\n\n// Parses a fingerprint line for DTLS-SRTP.\nSDPUtils.parseFingerprint = function(line) {\n const parts = line.substring(14).split(' ');\n return {\n algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge.\n value: parts[1].toUpperCase(), // the definition is upper-case in RFC 4572.\n };\n};\n\n// Extracts DTLS parameters from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the fingerprint line as input. See also getIceParameters.\nSDPUtils.getDtlsParameters = function(mediaSection, sessionpart) {\n const lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=fingerprint:');\n // Note: a=setup line is ignored since we use the 'auto' role in Edge.\n return {\n role: 'auto',\n fingerprints: lines.map(SDPUtils.parseFingerprint),\n };\n};\n\n// Serializes DTLS parameters to SDP.\nSDPUtils.writeDtlsParameters = function(params, setupType) {\n let sdp = 'a=setup:' + setupType + '\\r\\n';\n params.fingerprints.forEach(fp => {\n sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\\r\\n';\n });\n return sdp;\n};\n\n// Parses a=crypto lines into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#dictionary-rtcsrtpsdesparameters-members\nSDPUtils.parseCryptoLine = function(line) {\n const parts = line.substring(9).split(' ');\n return {\n tag: parseInt(parts[0], 10),\n cryptoSuite: parts[1],\n keyParams: parts[2],\n sessionParams: parts.slice(3),\n };\n};\n\nSDPUtils.writeCryptoLine = function(parameters) {\n return 'a=crypto:' + parameters.tag + ' ' +\n parameters.cryptoSuite + ' ' +\n (typeof parameters.keyParams === 'object'\n ? SDPUtils.writeCryptoKeyParams(parameters.keyParams)\n : parameters.keyParams) +\n (parameters.sessionParams ? ' ' + parameters.sessionParams.join(' ') : '') +\n '\\r\\n';\n};\n\n// Parses the crypto key parameters into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#rtcsrtpkeyparam*\nSDPUtils.parseCryptoKeyParams = function(keyParams) {\n if (keyParams.indexOf('inline:') !== 0) {\n return null;\n }\n const parts = keyParams.substring(7).split('|');\n return {\n keyMethod: 'inline',\n keySalt: parts[0],\n lifeTime: parts[1],\n mkiValue: parts[2] ? parts[2].split(':')[0] : undefined,\n mkiLength: parts[2] ? parts[2].split(':')[1] : undefined,\n };\n};\n\nSDPUtils.writeCryptoKeyParams = function(keyParams) {\n return keyParams.keyMethod + ':'\n + keyParams.keySalt +\n (keyParams.lifeTime ? '|' + keyParams.lifeTime : '') +\n (keyParams.mkiValue && keyParams.mkiLength\n ? '|' + keyParams.mkiValue + ':' + keyParams.mkiLength\n : '');\n};\n\n// Extracts all SDES parameters.\nSDPUtils.getCryptoParameters = function(mediaSection, sessionpart) {\n const lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=crypto:');\n return lines.map(SDPUtils.parseCryptoLine);\n};\n\n// Parses ICE information from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the ice-ufrag and ice-pwd lines as input.\nSDPUtils.getIceParameters = function(mediaSection, sessionpart) {\n const ufrag = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-ufrag:')[0];\n const pwd = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-pwd:')[0];\n if (!(ufrag && pwd)) {\n return null;\n }\n return {\n usernameFragment: ufrag.substring(12),\n password: pwd.substring(10),\n };\n};\n\n// Serializes ICE parameters to SDP.\nSDPUtils.writeIceParameters = function(params) {\n let sdp = 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' +\n 'a=ice-pwd:' + params.password + '\\r\\n';\n if (params.iceLite) {\n sdp += 'a=ice-lite\\r\\n';\n }\n return sdp;\n};\n\n// Parses the SDP media section and returns RTCRtpParameters.\nSDPUtils.parseRtpParameters = function(mediaSection) {\n const description = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: [],\n rtcp: [],\n };\n const lines = SDPUtils.splitLines(mediaSection);\n const mline = lines[0].split(' ');\n description.profile = mline[2];\n for (let i = 3; i < mline.length; i++) { // find all codecs from mline[3..]\n const pt = mline[i];\n const rtpmapline = SDPUtils.matchPrefix(\n mediaSection, 'a=rtpmap:' + pt + ' ')[0];\n if (rtpmapline) {\n const codec = SDPUtils.parseRtpMap(rtpmapline);\n const fmtps = SDPUtils.matchPrefix(\n mediaSection, 'a=fmtp:' + pt + ' ');\n // Only the first a=fmtp:<pt> is considered.\n codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};\n codec.rtcpFeedback = SDPUtils.matchPrefix(\n mediaSection, 'a=rtcp-fb:' + pt + ' ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.push(codec);\n // parse FEC mechanisms from rtpmap lines.\n switch (codec.name.toUpperCase()) {\n case 'RED':\n case 'ULPFEC':\n description.fecMechanisms.push(codec.name.toUpperCase());\n break;\n default: // only RED and ULPFEC are recognized as FEC mechanisms.\n break;\n }\n }\n }\n SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(line => {\n description.headerExtensions.push(SDPUtils.parseExtmap(line));\n });\n const wildcardRtcpFb = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-fb:* ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.forEach(codec => {\n wildcardRtcpFb.forEach(fb=> {\n const duplicate = codec.rtcpFeedback.find(existingFeedback => {\n return existingFeedback.type === fb.type &&\n existingFeedback.parameter === fb.parameter;\n });\n if (!duplicate) {\n codec.rtcpFeedback.push(fb);\n }\n });\n });\n // FIXME: parse rtcp.\n return description;\n};\n\n// Generates parts of the SDP media section describing the capabilities /\n// parameters.\nSDPUtils.writeRtpDescription = function(kind, caps) {\n let sdp = '';\n\n // Build the mline.\n sdp += 'm=' + kind + ' ';\n sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.\n sdp += ' ' + (caps.profile || 'UDP/TLS/RTP/SAVPF') + ' ';\n sdp += caps.codecs.map(codec => {\n if (codec.preferredPayloadType !== undefined) {\n return codec.preferredPayloadType;\n }\n return codec.payloadType;\n }).join(' ') + '\\r\\n';\n\n sdp += 'c=IN IP4 0.0.0.0\\r\\n';\n sdp += 'a=rtcp:9 IN IP4 0.0.0.0\\r\\n';\n\n // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.\n caps.codecs.forEach(codec => {\n sdp += SDPUtils.writeRtpMap(codec);\n sdp += SDPUtils.writeFmtp(codec);\n sdp += SDPUtils.writeRtcpFb(codec);\n });\n let maxptime = 0;\n caps.codecs.forEach(codec => {\n if (codec.maxptime > maxptime) {\n maxptime = codec.maxptime;\n }\n });\n if (maxptime > 0) {\n sdp += 'a=maxptime:' + maxptime + '\\r\\n';\n }\n\n if (caps.headerExtensions) {\n caps.headerExtensions.forEach(extension => {\n sdp += SDPUtils.writeExtmap(extension);\n });\n }\n // FIXME: write fecMechanisms.\n return sdp;\n};\n\n// Parses the SDP media section and returns an array of\n// RTCRtpEncodingParameters.\nSDPUtils.parseRtpEncodingParameters = function(mediaSection) {\n const encodingParameters = [];\n const description = SDPUtils.parseRtpParameters(mediaSection);\n const hasRed = description.fecMechanisms.indexOf('RED') !== -1;\n const hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;\n\n // filter a=ssrc:... cname:, ignore PlanB-msid\n const ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(parts => parts.attribute === 'cname');\n const primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;\n let secondarySsrc;\n\n const flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID')\n .map(line => {\n const parts = line.substring(17).split(' ');\n return parts.map(part => parseInt(part, 10));\n });\n if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) {\n secondarySsrc = flows[0][1];\n }\n\n description.codecs.forEach(codec => {\n if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {\n let encParam = {\n ssrc: primarySsrc,\n codecPayloadType: parseInt(codec.parameters.apt, 10),\n };\n if (primarySsrc && secondarySsrc) {\n encParam.rtx = {ssrc: secondarySsrc};\n }\n encodingParameters.push(encParam);\n if (hasRed) {\n encParam = JSON.parse(JSON.stringify(encParam));\n encParam.fec = {\n ssrc: primarySsrc,\n mechanism: hasUlpfec ? 'red+ulpfec' : 'red',\n };\n encodingParameters.push(encParam);\n }\n }\n });\n if (encodingParameters.length === 0 && primarySsrc) {\n encodingParameters.push({\n ssrc: primarySsrc,\n });\n }\n\n // we support both b=AS and b=TIAS but interpret AS as TIAS.\n let bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');\n if (bandwidth.length) {\n if (bandwidth[0].indexOf('b=TIAS:') === 0) {\n bandwidth = parseInt(bandwidth[0].substring(7), 10);\n } else if (bandwidth[0].indexOf('b=AS:') === 0) {\n // use formula from JSEP to convert b=AS to TIAS value.\n bandwidth = parseInt(bandwidth[0].substring(5), 10) * 1000 * 0.95\n - (50 * 40 * 8);\n } else {\n bandwidth = undefined;\n }\n encodingParameters.forEach(params => {\n params.maxBitrate = bandwidth;\n });\n }\n return encodingParameters;\n};\n\n// parses http://draft.ortc.org/#rtcrtcpparameters*\nSDPUtils.parseRtcpParameters = function(mediaSection) {\n const rtcpParameters = {};\n\n // Gets the first SSRC. Note that with RTX there might be multiple\n // SSRCs.\n const remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(obj => obj.attribute === 'cname')[0];\n if (remoteSsrc) {\n rtcpParameters.cname = remoteSsrc.value;\n rtcpParameters.ssrc = remoteSsrc.ssrc;\n }\n\n // Edge uses the compound attribute instead of reducedSize\n // compound is !reducedSize\n const rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize');\n rtcpParameters.reducedSize = rsize.length > 0;\n rtcpParameters.compound = rsize.length === 0;\n\n // parses the rtcp-mux attrіbute.\n // Note that Edge does not support unmuxed RTCP.\n const mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');\n rtcpParameters.mux = mux.length > 0;\n\n return rtcpParameters;\n};\n\nSDPUtils.writeRtcpParameters = function(rtcpParameters) {\n let sdp = '';\n if (rtcpParameters.reducedSize) {\n sdp += 'a=rtcp-rsize\\r\\n';\n }\n if (rtcpParameters.mux) {\n sdp += 'a=rtcp-mux\\r\\n';\n }\n if (rtcpParameters.ssrc !== undefined && rtcpParameters.cname) {\n sdp += 'a=ssrc:' + rtcpParameters.ssrc +\n ' cname:' + rtcpParameters.cname + '\\r\\n';\n }\n return sdp;\n};\n\n\n// parses either a=msid: or a=ssrc:... msid lines and returns\n// the id of the MediaStream and MediaStreamTrack.\nSDPUtils.parseMsid = function(mediaSection) {\n let parts;\n const spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');\n if (spec.length === 1) {\n parts = spec[0].substring(7).split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n const planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(msidParts => msidParts.attribute === 'msid');\n if (planB.length > 0) {\n parts = planB[0].value.split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n};\n\n// SCTP\n// parses draft-ietf-mmusic-sctp-sdp-26 first and falls back\n// to draft-ietf-mmusic-sctp-sdp-05\nSDPUtils.parseSctpDescription = function(mediaSection) {\n const mline = SDPUtils.parseMLine(mediaSection);\n const maxSizeLine = SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:');\n let maxMessageSize;\n if (maxSizeLine.length > 0) {\n maxMessageSize = parseInt(maxSizeLine[0].substring(19), 10);\n }\n if (isNaN(maxMessageSize)) {\n maxMessageSize = 65536;\n }\n const sctpPort = SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:');\n if (sctpPort.length > 0) {\n return {\n port: parseInt(sctpPort[0].substring(12), 10),\n protocol: mline.fmt,\n maxMessageSize,\n };\n }\n const sctpMapLines = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:');\n if (sctpMapLines.length > 0) {\n const parts = sctpMapLines[0]\n .substring(10)\n .split(' ');\n return {\n port: parseInt(parts[0], 10),\n protocol: parts[1],\n maxMessageSize,\n };\n }\n};\n\n// SCTP\n// outputs the draft-ietf-mmusic-sctp-sdp-26 version that all browsers\n// support by now receiving in this format, unless we originally parsed\n// as the draft-ietf-mmusic-sctp-sdp-05 format (indicated by the m-line\n// protocol of DTLS/SCTP -- without UDP/ or TCP/)\nSDPUtils.writeSctpDescription = function(media, sctp) {\n let output = [];\n if (media.protocol !== 'DTLS/SCTP') {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.protocol + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctp-port:' + sctp.port + '\\r\\n',\n ];\n } else {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.port + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctpmap:' + sctp.port + ' ' + sctp.protocol + ' 65535\\r\\n',\n ];\n }\n if (sctp.maxMessageSize !== undefined) {\n output.push('a=max-message-size:' + sctp.maxMessageSize + '\\r\\n');\n }\n return output.join('');\n};\n\n// Generate a session ID for SDP.\n// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1\n// recommends using a cryptographically random +ve 64-bit value\n// but right now this should be acceptable and within the right range\nSDPUtils.generateSessionId = function() {\n return Math.random().toString().substr(2, 22);\n};\n\n// Write boiler plate for start of SDP\n// sessId argument is optional - if not supplied it will\n// be generated randomly\n// sessVersion is optional and defaults to 2\n// sessUser is optional and defaults to 'thisisadapterortc'\nSDPUtils.writeSessionBoilerplate = function(sessId, sessVer, sessUser) {\n let sessionId;\n const version = sessVer !== undefined ? sessVer : 2;\n if (sessId) {\n sessionId = sessId;\n } else {\n sessionId = SDPUtils.generateSessionId();\n }\n const user = sessUser || 'thisisadapterortc';\n // FIXME: sess-id should be an NTP timestamp.\n return 'v=0\\r\\n' +\n 'o=' + user + ' ' + sessionId + ' ' + version +\n ' IN IP4 127.0.0.1\\r\\n' +\n 's=-\\r\\n' +\n 't=0 0\\r\\n';\n};\n\n// Gets the direction from the mediaSection or the sessionpart.\nSDPUtils.getDirection = function(mediaSection, sessionpart) {\n // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.\n const lines = SDPUtils.splitLines(mediaSection);\n for (let i = 0; i < lines.length; i++) {\n switch (lines[i]) {\n case 'a=sendrecv':\n case 'a=sendonly':\n case 'a=recvonly':\n case 'a=inactive':\n return lines[i].substring(2);\n default:\n // FIXME: What should happen here?\n }\n }\n if (sessionpart) {\n return SDPUtils.getDirection(sessionpart);\n }\n return 'sendrecv';\n};\n\nSDPUtils.getKind = function(mediaSection) {\n const lines = SDPUtils.splitLines(mediaSection);\n const mline = lines[0].split(' ');\n return mline[0].substring(2);\n};\n\nSDPUtils.isRejected = function(mediaSection) {\n return mediaSection.split(' ', 2)[1] === '0';\n};\n\nSDPUtils.parseMLine = function(mediaSection) {\n const lines = SDPUtils.splitLines(mediaSection);\n const parts = lines[0].substring(2).split(' ');\n return {\n kind: parts[0],\n port: parseInt(parts[1], 10),\n protocol: parts[2],\n fmt: parts.slice(3).join(' '),\n };\n};\n\nSDPUtils.parseOLine = function(mediaSection) {\n const line = SDPUtils.matchPrefix(mediaSection, 'o=')[0];\n const parts = line.substring(2).split(' ');\n return {\n username: parts[0],\n sessionId: parts[1],\n sessionVersion: parseInt(parts[2], 10),\n netType: parts[3],\n addressType: parts[4],\n address: parts[5],\n };\n};\n\n// a very naive interpretation of a valid SDP.\nSDPUtils.isValidSDP = function(blob) {\n if (typeof blob !== 'string' || blob.length === 0) {\n return false;\n }\n const lines = SDPUtils.splitLines(blob);\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].length < 2 || lines[i].charAt(1) !== '=') {\n return false;\n }\n // TODO: check the modifier a bit more.\n }\n return true;\n};\n\n// Expose public methods.\nif (typeof module === 'object') {\n module.exports = SDPUtils;\n}\n","/*\n * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport SDPUtils from 'sdp';\nimport * as utils from './utils';\n\nexport function shimRTCIceCandidate(window) {\n // foundation is arbitrarily chosen as an indicator for full support for\n // https://w3c.github.io/webrtc-pc/#rtcicecandidate-interface\n if (!window.RTCIceCandidate || (window.RTCIceCandidate && 'foundation' in\n window.RTCIceCandidate.prototype)) {\n return;\n }\n\n const NativeRTCIceCandidate = window.RTCIceCandidate;\n window.RTCIceCandidate = function RTCIceCandidate(args) {\n // Remove the a= which shouldn't be part of the candidate string.\n if (typeof args === 'object' && args.candidate &&\n args.candidate.indexOf('a=') === 0) {\n args = JSON.parse(JSON.stringify(args));\n args.candidate = args.candidate.substring(2);\n }\n\n if (args.candidate && args.candidate.length) {\n // Augment the native candidate with the parsed fields.\n const nativeCandidate = new NativeRTCIceCandidate(args);\n const parsedCandidate = SDPUtils.parseCandidate(args.candidate);\n const augmentedCandidate = Object.assign(nativeCandidate,\n parsedCandidate);\n\n // Add a serializer that does not serialize the extra attributes.\n augmentedCandidate.toJSON = function toJSON() {\n return {\n candidate: augmentedCandidate.candidate,\n sdpMid: augmentedCandidate.sdpMid,\n sdpMLineIndex: augmentedCandidate.sdpMLineIndex,\n usernameFragment: augmentedCandidate.usernameFragment,\n };\n };\n return augmentedCandidate;\n }\n return new NativeRTCIceCandidate(args);\n };\n window.RTCIceCandidate.prototype = NativeRTCIceCandidate.prototype;\n\n // Hook up the augmented candidate in onicecandidate and\n // addEventListener('icecandidate', ...)\n utils.wrapPeerConnectionEvent(window, 'icecandidate', e => {\n if (e.candidate) {\n Object.defineProperty(e, 'candidate', {\n value: new window.RTCIceCandidate(e.candidate),\n writable: 'false'\n });\n }\n return e;\n });\n}\n\nexport function shimRTCIceCandidateRelayProtocol(window) {\n if (!window.RTCIceCandidate || (window.RTCIceCandidate && 'relayProtocol' in\n window.RTCIceCandidate.prototype)) {\n return;\n }\n\n // Hook up the augmented candidate in onicecandidate and\n // addEventListener('icecandidate', ...)\n utils.wrapPeerConnectionEvent(window, 'icecandidate', e => {\n if (e.candidate) {\n const parsedCandidate = SDPUtils.parseCandidate(e.candidate.candidate);\n if (parsedCandidate.type === 'relay') {\n // This is a libwebrtc-specific mapping of local type preference\n // to relayProtocol.\n e.candidate.relayProtocol = {\n 0: 'tls',\n 1: 'tcp',\n 2: 'udp',\n }[parsedCandidate.priority >> 24];\n }\n }\n return e;\n });\n}\n\nexport function shimMaxMessageSize(window, browserDetails) {\n if (!window.RTCPeerConnection) {\n return;\n }\n\n if (!('sctp' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'sctp', {\n get() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n }\n });\n }\n\n const sctpInDescription = function(description) {\n if (!description || !description.sdp) {\n return false;\n }\n const sections = SDPUtils.splitSections(description.sdp);\n sections.shift();\n return sections.some(mediaSection => {\n const mLine = SDPUtils.parseMLine(mediaSection);\n return mLine && mLine.kind === 'application'\n && mLine.protocol.indexOf('SCTP') !== -1;\n });\n };\n\n const getRemoteFirefoxVersion = function(description) {\n // TODO: Is there a better solution for detecting Firefox?\n const match = description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\\d+)/);\n if (match === null || match.length < 2) {\n return -1;\n }\n const version = parseInt(match[1], 10);\n // Test for NaN (yes, this is ugly)\n return version !== version ? -1 : version;\n };\n\n const getCanSendMaxMessageSize = function(remoteIsFirefox) {\n // Every implementation we know can send at least 64 KiB.\n // Note: Although Chrome is technically able to send up to 256 KiB, the\n // data does not reach the other peer reliably.\n // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=8419\n let canSendMaxMessageSize = 65536;\n if (browserDetails.browser === 'firefox') {\n if (browserDetails.version < 57) {\n if (remoteIsFirefox === -1) {\n // FF < 57 will send in 16 KiB chunks using the deprecated PPID\n // fragmentation.\n canSendMaxMessageSize = 16384;\n } else {\n // However, other FF (and RAWRTC) can reassemble PPID-fragmented\n // messages. Thus, supporting ~2 GiB when sending.\n canSendMaxMessageSize = 2147483637;\n }\n } else if (browserDetails.version < 60) {\n // Currently, all FF >= 57 will reset the remote maximum message size\n // to the default value when a data channel is created at a later\n // stage. :(\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n canSendMaxMessageSize =\n browserDetails.version === 57 ? 65535 : 65536;\n } else {\n // FF >= 60 supports sending ~2 GiB\n canSendMaxMessageSize = 2147483637;\n }\n }\n return canSendMaxMessageSize;\n };\n\n const getMaxMessageSize = function(description, remoteIsFirefox) {\n // Note: 65536 bytes is the default value from the SDP spec. Also,\n // every implementation we know supports receiving 65536 bytes.\n let maxMessageSize = 65536;\n\n // FF 57 has a slightly incorrect default remote max message size, so\n // we need to adjust it here to avoid a failure when sending.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1425697\n if (browserDetails.browser === 'firefox'\n && browserDetails.version === 57) {\n maxMessageSize = 65535;\n }\n\n const match = SDPUtils.matchPrefix(description.sdp,\n 'a=max-message-size:');\n if (match.length > 0) {\n maxMessageSize = parseInt(match[0].substring(19), 10);\n } else if (browserDetails.browser === 'firefox' &&\n remoteIsFirefox !== -1) {\n // If the maximum message size is not present in the remote SDP and\n // both local and remote are Firefox, the remote peer can receive\n // ~2 GiB.\n maxMessageSize = 2147483637;\n }\n return maxMessageSize;\n };\n\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n this._sctp = null;\n // Chrome decided to not expose .sctp in plan-b mode.\n // As usual, adapter.js has to do an 'ugly worakaround'\n // to cover up the mess.\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 76) {\n const {sdpSemantics} = this.getConfiguration();\n if (sdpSemantics === 'plan-b') {\n Object.defineProperty(this, 'sctp', {\n get() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n },\n enumerable: true,\n configurable: true,\n });\n }\n }\n\n if (sctpInDescription(arguments[0])) {\n // Check if the remote is FF.\n const isFirefox = getRemoteFirefoxVersion(arguments[0]);\n\n // Get the maximum message size the local peer is capable of sending\n const canSendMMS = getCanSendMaxMessageSize(isFirefox);\n\n // Get the maximum message size of the remote peer.\n const remoteMMS = getMaxMessageSize(arguments[0], isFirefox);\n\n // Determine final maximum message size\n let maxMessageSize;\n if (canSendMMS === 0 && remoteMMS === 0) {\n maxMessageSize = Number.POSITIVE_INFINITY;\n } else if (canSendMMS === 0 || remoteMMS === 0) {\n maxMessageSize = Math.max(canSendMMS, remoteMMS);\n } else {\n maxMessageSize = Math.min(canSendMMS, remoteMMS);\n }\n\n // Create a dummy RTCSctpTransport object and the 'maxMessageSize'\n // attribute.\n const sctp = {};\n Object.defineProperty(sctp, 'maxMessageSize', {\n get() {\n return maxMessageSize;\n }\n });\n this._sctp = sctp;\n }\n\n return origSetRemoteDescription.apply(this, arguments);\n };\n}\n\nexport function shimSendThrowTypeError(window) {\n if (!(window.RTCPeerConnection &&\n 'createDataChannel' in window.RTCPeerConnection.prototype)) {\n return;\n }\n\n // Note: Although Firefox >= 57 has a native implementation, the maximum\n // message size can be reset for all data channels at a later stage.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n\n function wrapDcSend(dc, pc) {\n const origDataChannelSend = dc.send;\n dc.send = function send() {\n const data = arguments[0];\n const length = data.length || data.size || data.byteLength;\n if (dc.readyState === 'open' &&\n pc.sctp && length > pc.sctp.maxMessageSize) {\n throw new TypeError('Message too large (can send a maximum of ' +\n pc.sctp.maxMessageSize + ' bytes)');\n }\n return origDataChannelSend.apply(dc, arguments);\n };\n }\n const origCreateDataChannel =\n window.RTCPeerConnection.prototype.createDataChannel;\n window.RTCPeerConnection.prototype.createDataChannel =\n function createDataChannel() {\n const dataChannel = origCreateDataChannel.apply(this, arguments);\n wrapDcSend(dataChannel, this);\n return dataChannel;\n };\n utils.wrapPeerConnectionEvent(window, 'datachannel', e => {\n wrapDcSend(e.channel, e.target);\n return e;\n });\n}\n\n\n/* shims RTCConnectionState by pretending it is the same as iceConnectionState.\n * See https://bugs.chromium.org/p/webrtc/issues/detail?id=6145#c12\n * for why this is a valid hack in Chrome. In Firefox it is slightly incorrect\n * since DTLS failures would be hidden. See\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1265827\n * for the Firefox tracking bug.\n */\nexport function shimConnectionState(window) {\n if (!window.RTCPeerConnection ||\n 'connectionState' in window.RTCPeerConnection.prototype) {\n return;\n }\n const proto = window.RTCPeerConnection.prototype;\n Object.defineProperty(proto, 'connectionState', {\n get() {\n return {\n completed: 'connected',\n checking: 'connecting'\n }[this.iceConnectionState] || this.iceConnectionState;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(proto, 'onconnectionstatechange', {\n get() {\n return this._onconnectionstatechange || null;\n },\n set(cb) {\n if (this._onconnectionstatechange) {\n this.removeEventListener('connectionstatechange',\n this._onconnectionstatechange);\n delete this._onconnectionstatechange;\n }\n if (cb) {\n this.addEventListener('connectionstatechange',\n this._onconnectionstatechange = cb);\n }\n },\n enumerable: true,\n configurable: true\n });\n\n ['setLocalDescription', 'setRemoteDescription'].forEach((method) => {\n const origMethod = proto[method];\n proto[method] = function() {\n if (!this._connectionstatechangepoly) {\n this._connectionstatechangepoly = e => {\n const pc = e.target;\n if (pc._lastConnectionState !== pc.connectionState) {\n pc._lastConnectionState = pc.connectionState;\n const newEvent = new Event('connectionstatechange', e);\n pc.dispatchEvent(newEvent);\n }\n return e;\n };\n this.addEventListener('iceconnectionstatechange',\n this._connectionstatechangepoly);\n }\n return origMethod.apply(this, arguments);\n };\n });\n}\n\nexport function removeExtmapAllowMixed(window, browserDetails) {\n /* remove a=extmap-allow-mixed for webrtc.org < M71 */\n if (!window.RTCPeerConnection) {\n return;\n }\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 71) {\n return;\n }\n if (browserDetails.browser === 'safari' && browserDetails.version >= 605) {\n return;\n }\n const nativeSRD = window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription(desc) {\n if (desc && desc.sdp && desc.sdp.indexOf('\\na=extmap-allow-mixed') !== -1) {\n const sdp = desc.sdp.split('\\n').filter((line) => {\n return line.trim() !== 'a=extmap-allow-mixed';\n }).join('\\n');\n // Safari enforces read-only-ness of RTCSessionDescription fields.\n if (window.RTCSessionDescription &&\n desc instanceof window.RTCSessionDescription) {\n arguments[0] = new window.RTCSessionDescription({\n type: desc.type,\n sdp,\n });\n } else {\n desc.sdp = sdp;\n }\n }\n return nativeSRD.apply(this, arguments);\n };\n}\n\nexport function shimAddIceCandidateNullOrEmpty(window, browserDetails) {\n // Support for addIceCandidate(null or undefined)\n // as well as addIceCandidate({candidate: \"\", ...})\n // https://bugs.chromium.org/p/chromium/issues/detail?id=978582\n // Note: must be called before other polyfills which change the signature.\n if (!(window.RTCPeerConnection && window.RTCPeerConnection.prototype)) {\n return;\n }\n const nativeAddIceCandidate =\n window.RTCPeerConnection.prototype.addIceCandidate;\n if (!nativeAddIceCandidate || nativeAddIceCandidate.length === 0) {\n return;\n }\n window.RTCPeerConnection.prototype.addIceCandidate =\n function addIceCandidate() {\n if (!arguments[0]) {\n if (arguments[1]) {\n arguments[1].apply(null);\n }\n return Promise.resolve();\n }\n // Firefox 68+ emits and processes {candidate: \"\", ...}, ignore\n // in older versions.\n // Native support for ignoring exists for Chrome M77+.\n // Safari ignores as well, exact version unknown but works in the same\n // version that also ignores addIceCandidate(null).\n if (((browserDetails.browser === 'chrome' && browserDetails.version < 78)\n || (browserDetails.browser === 'firefox'\n && browserDetails.version < 68)\n || (browserDetails.browser === 'safari'))\n && arguments[0] && arguments[0].candidate === '') {\n return Promise.resolve();\n }\n return nativeAddIceCandidate.apply(this, arguments);\n };\n}\n\n// Note: Make sure to call this ahead of APIs that modify\n// setLocalDescription.length\nexport function shimParameterlessSetLocalDescription(window, browserDetails) {\n if (!(window.RTCPeerConnection && window.RTCPeerConnection.prototype)) {\n return;\n }\n const nativeSetLocalDescription =\n window.RTCPeerConnection.prototype.setLocalDescription;\n if (!nativeSetLocalDescription || nativeSetLocalDescription.length === 0) {\n return;\n }\n window.RTCPeerConnection.prototype.setLocalDescription =\n function setLocalDescription() {\n let desc = arguments[0] || {};\n if (typeof desc !== 'object' || (desc.type && desc.sdp)) {\n return nativeSetLocalDescription.apply(this, arguments);\n }\n // The remaining steps should technically happen when SLD comes off the\n // RTCPeerConnection's operations chain (not ahead of going on it), but\n // this is too difficult to shim. Instead, this shim only covers the\n // common case where the operations chain is empty. This is imperfect, but\n // should cover many cases. Rationale: Even if we can't reduce the glare\n // window to zero on imperfect implementations, there's value in tapping\n // into the perfect negotiation pattern that several browsers support.\n desc = {type: desc.type, sdp: desc.sdp};\n if (!desc.type) {\n switch (this.signalingState) {\n case 'stable':\n case 'have-local-offer':\n case 'have-remote-pranswer':\n desc.type = 'offer';\n break;\n default:\n desc.type = 'answer';\n break;\n }\n }\n if (desc.sdp || (desc.type !== 'offer' && desc.type !== 'answer')) {\n return nativeSetLocalDescription.apply(this, [desc]);\n }\n const func = desc.type === 'offer' ? this.createOffer : this.createAnswer;\n return func.apply(this)\n .then(d => nativeSetLocalDescription.apply(this, [d]));\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n\n'use strict';\n\nimport {adapterFactory} from './adapter_factory.js';\n\nconst adapter =\n adapterFactory({window: typeof window === 'undefined' ? undefined : window});\nexport default adapter;\n","import webRTCAdapter_import from \"webrtc-adapter\";\n\nconst webRTCAdapter: typeof webRTCAdapter_import =\n\t//@ts-ignore\n\twebRTCAdapter_import.default || webRTCAdapter_import;\n\nexport const Supports = new (class {\n\treadonly isIOS = [\"iPad\", \"iPhone\", \"iPod\"].includes(navigator.platform);\n\treadonly supportedBrowsers = [\"firefox\", \"chrome\", \"safari\"];\n\n\treadonly minFirefoxVersion = 59;\n\treadonly minChromeVersion = 72;\n\treadonly minSafariVersion = 605;\n\n\tisWebRTCSupported(): boolean {\n\t\treturn typeof RTCPeerConnection !== \"undefined\";\n\t}\n\n\tisBrowserSupported(): boolean {\n\t\tconst browser = this.getBrowser();\n\t\tconst version = this.getVersion();\n\n\t\tconst validBrowser = this.supportedBrowsers.includes(browser);\n\n\t\tif (!validBrowser) return false;\n\n\t\tif (browser === \"chrome\") return version >= this.minChromeVersion;\n\t\tif (browser === \"firefox\") return version >= this.minFirefoxVersion;\n\t\tif (browser === \"safari\")\n\t\t\treturn !this.isIOS && version >= this.minSafariVersion;\n\n\t\treturn false;\n\t}\n\n\tgetBrowser(): string {\n\t\treturn webRTCAdapter.browserDetails.browser;\n\t}\n\n\tgetVersion(): number {\n\t\treturn webRTCAdapter.browserDetails.version || 0;\n\t}\n\n\tisUnifiedPlanSupported(): boolean {\n\t\tconst browser = this.getBrowser();\n\t\tconst version = webRTCAdapter.browserDetails.version || 0;\n\n\t\tif (browser === \"chrome\" && version < this.minChromeVersion) return false;\n\t\tif (browser === \"firefox\" && version >= this.minFirefoxVersion) return true;\n\t\tif (\n\t\t\t!window.RTCRtpTransceiver ||\n\t\t\t!(\"currentDirection\" in RTCRtpTransceiver.prototype)\n\t\t)\n\t\t\treturn false;\n\n\t\tlet tempPc: RTCPeerConnection;\n\t\tlet supported = false;\n\n\t\ttry {\n\t\t\ttempPc = new RTCPeerConnection();\n\t\t\ttempPc.addTransceiver(\"audio\");\n\t\t\tsupported = true;\n\t\t} catch (e) {\n\t\t} finally {\n\t\t\tif (tempPc) {\n\t\t\t\ttempPc.close();\n\t\t\t}\n\t\t}\n\n\t\treturn supported;\n\t}\n\n\ttoString(): string {\n\t\treturn `Supports:\n browser:${this.getBrowser()}\n version:${this.getVersion()}\n isIOS:${this.isIOS}\n isWebRTCSupported:${this.isWebRTCSupported()}\n isBrowserSupported:${this.isBrowserSupported()}\n isUnifiedPlanSupported:${this.isUnifiedPlanSupported()}`;\n\t}\n})();\n","import * as BinaryPack from \"peerjs-js-binarypack\";\nimport { Supports } from \"./supports\";\n\nexport interface UtilSupportsObj {\n\t/**\n\t * The current browser.\n\t * This property can be useful in determining whether two peers can connect.\n\t *\n\t * ```ts\n\t * if (util.browser === 'firefox') {\n\t * // OK to peer with Firefox peers.\n\t * }\n\t * ```\n\t *\n\t * `util.browser` can currently have the values\n\t * `'firefox', 'chrome', 'safari', 'edge', 'Not a supported browser.', 'Not a browser.' (unknown WebRTC-compatible agent).\n\t */\n\tbrowser: boolean;\n\twebRTC: boolean;\n\t/**\n\t * True if the current browser supports media streams and PeerConnection.\n\t */\n\taudioVideo: boolean;\n\t/**\n\t * True if the current browser supports DataChannel and PeerConnection.\n\t */\n\tdata: boolean;\n\tbinaryBlob: boolean;\n\t/**\n\t * True if the current browser supports reliable DataChannels.\n\t */\n\treliable: boolean;\n}\n\nconst DEFAULT_CONFIG = {\n\ticeServers: [\n\t\t{ urls: \"stun:stun.l.google.com:19302\" },\n\t\t{\n\t\t\turls: [\n\t\t\t\t\"turn:eu-0.turn.peerjs.com:3478\",\n\t\t\t\t\"turn:us-0.turn.peerjs.com:3478\",\n\t\t\t],\n\t\t\tusername: \"peerjs\",\n\t\t\tcredential: \"peerjsp\",\n\t\t},\n\t],\n\tsdpSemantics: \"unified-plan\",\n};\n\nexport class Util {\n\tnoop(): void {}\n\n\treadonly CLOUD_HOST = \"0.peerjs.com\";\n\treadonly CLOUD_PORT = 443;\n\n\t// Browsers that need chunking:\n\treadonly chunkedBrowsers = { Chrome: 1, chrome: 1 };\n\treadonly chunkedMTU = 16300; // The original 60000 bytes setting does not work when sending data from Firefox to Chrome, which is \"cut off\" after 16384 bytes and delivered individually.\n\n\t// Returns browser-agnostic default config\n\treadonly defaultConfig = DEFAULT_CONFIG;\n\n\treadonly browser = Supports.getBrowser();\n\treadonly browserVersion = Supports.getVersion();\n\n\t/**\n\t * A hash of WebRTC features mapped to booleans that correspond to whether the feature is supported by the current browser.\n\t *\n\t * :::caution\n\t * Only the properties documented here are guaranteed to be present on `util.supports`\n\t * :::\n\t */\n\treadonly supports = (function () {\n\t\tconst supported: UtilSupportsObj = {\n\t\t\tbrowser: Supports.isBrowserSupported(),\n\t\t\twebRTC: Supports.isWebRTCSupported(),\n\t\t\taudioVideo: false,\n\t\t\tdata: false,\n\t\t\tbinaryBlob: false,\n\t\t\treliable: false,\n\t\t};\n\n\t\tif (!supported.webRTC) return supported;\n\n\t\tlet pc: RTCPeerConnection;\n\n\t\ttry {\n\t\t\tpc = new RTCPeerConnection(DEFAULT_CONFIG);\n\n\t\t\tsupported.audioVideo = true;\n\n\t\t\tlet dc: RTCDataChannel;\n\n\t\t\ttry {\n\t\t\t\tdc = pc.createDataChannel(\"_PEERJSTEST\", { ordered: true });\n\t\t\t\tsupported.data = true;\n\t\t\t\tsupported.reliable = !!dc.ordered;\n\n\t\t\t\t// Binary test\n\t\t\t\ttry {\n\t\t\t\t\tdc.binaryType = \"blob\";\n\t\t\t\t\tsupported.binaryBlob = !Supports.isIOS;\n\t\t\t\t} catch (e) {}\n\t\t\t} catch (e) {\n\t\t\t} finally {\n\t\t\t\tif (dc) {\n\t\t\t\t\tdc.close();\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t} finally {\n\t\t\tif (pc) {\n\t\t\t\tpc.close();\n\t\t\t}\n\t\t}\n\n\t\treturn supported;\n\t})();\n\n\t// Ensure alphanumeric ids\n\tvalidateId(id: string): boolean {\n\t\t// Allow empty ids\n\t\treturn !id || /^[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*$/.test(id);\n\t}\n\n\tpack = BinaryPack.pack;\n\tunpack = BinaryPack.unpack;\n\n\t// Binary stuff\n\n\tprivate _dataCount: number = 1;\n\n\tchunk(\n\t\tblob: Blob,\n\t): { __peerData: number; n: number; total: number; data: Blob }[] {\n\t\tconst chunks = [];\n\t\tconst size = blob.size;\n\t\tconst total = Math.ceil(size / util.chunkedMTU);\n\n\t\tlet index = 0;\n\t\tlet start = 0;\n\n\t\twhile (start < size) {\n\t\t\tconst end = Math.min(size, start + util.chunkedMTU);\n\t\t\tconst b = blob.slice(start, end);\n\n\t\t\tconst chunk = {\n\t\t\t\t__peerData: this._dataCount,\n\t\t\t\tn: index,\n\t\t\t\tdata: b,\n\t\t\t\ttotal,\n\t\t\t};\n\n\t\t\tchunks.push(chunk);\n\n\t\t\tstart = end;\n\t\t\tindex++;\n\t\t}\n\n\t\tthis._dataCount++;\n\n\t\treturn chunks;\n\t}\n\n\tblobToArrayBuffer(\n\t\tblob: Blob,\n\t\tcb: (arg: ArrayBuffer | null) => void,\n\t): FileReader {\n\t\tconst fr = new FileReader();\n\n\t\tfr.onload = function (evt) {\n\t\t\tif (evt.target) {\n\t\t\t\tcb(evt.target.result as ArrayBuffer);\n\t\t\t}\n\t\t};\n\n\t\tfr.readAsArrayBuffer(blob);\n\n\t\treturn fr;\n\t}\n\n\tbinaryStringToArrayBuffer(binary: string): ArrayBuffer | SharedArrayBuffer {\n\t\tconst byteArray = new Uint8Array(binary.length);\n\n\t\tfor (let i = 0; i < binary.length; i++) {\n\t\t\tbyteArray[i] = binary.charCodeAt(i) & 0xff;\n\t\t}\n\n\t\treturn byteArray.buffer;\n\t}\n\n\trandomToken(): string {\n\t\treturn Math.random().toString(36).slice(2);\n\t}\n\n\tisSecure(): boolean {\n\t\treturn location.protocol === \"https:\";\n\t}\n}\n\n/**\n * Provides a variety of helpful utilities.\n *\n * :::caution\n * Only the utilities documented here are guaranteed to be present on `util`.\n * Undocumented utilities can be removed without warning.\n * We don't consider these to be breaking changes.\n * :::\n */\nexport const util = new Util();\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\nimport * as utils from './utils';\n\n// Browser shims.\nimport * as chromeShim from './chrome/chrome_shim';\nimport * as firefoxShim from './firefox/firefox_shim';\nimport * as safariShim from './safari/safari_shim';\nimport * as commonShim from './common_shim';\nimport * as sdp from 'sdp';\n\n// Shimming starts here.\nexport function adapterFactory({window} = {}, options = {\n shimChrome: true,\n shimFirefox: true,\n shimSafari: true,\n}) {\n // Utils.\n const logging = utils.log;\n const browserDetails = utils.detectBrowser(window);\n\n const adapter = {\n browserDetails,\n commonShim,\n extractVersion: utils.extractVersion,\n disableLog: utils.disableLog,\n disableWarnings: utils.disableWarnings,\n // Expose sdp as a convenience. For production apps include directly.\n sdp,\n };\n\n // Shim browser if found.\n switch (browserDetails.browser) {\n case 'chrome':\n if (!chromeShim || !chromeShim.shimPeerConnection ||\n !options.shimChrome) {\n logging('Chrome shim is not included in this adapter release.');\n return adapter;\n }\n if (browserDetails.version === null) {\n logging('Chrome shim can not determine version, not shimming.');\n return adapter;\n }\n logging('adapter.js shimming chrome.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = chromeShim;\n\n // Must be called before shimPeerConnection.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n commonShim.shimParameterlessSetLocalDescription(window, browserDetails);\n\n chromeShim.shimGetUserMedia(window, browserDetails);\n chromeShim.shimMediaStream(window, browserDetails);\n chromeShim.shimPeerConnection(window, browserDetails);\n chromeShim.shimOnTrack(window, browserDetails);\n chromeShim.shimAddTrackRemoveTrack(window, browserDetails);\n chromeShim.shimGetSendersWithDtmf(window, browserDetails);\n chromeShim.shimGetStats(window, browserDetails);\n chromeShim.shimSenderReceiverGetStats(window, browserDetails);\n chromeShim.fixNegotiationNeeded(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimRTCIceCandidateRelayProtocol(window, browserDetails);\n commonShim.shimConnectionState(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n commonShim.removeExtmapAllowMixed(window, browserDetails);\n break;\n case 'firefox':\n if (!firefoxShim || !firefoxShim.shimPeerConnection ||\n !options.shimFirefox) {\n logging('Firefox shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming firefox.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = firefoxShim;\n\n // Must be called before shimPeerConnection.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n commonShim.shimParameterlessSetLocalDescription(window, browserDetails);\n\n firefoxShim.shimGetUserMedia(window, browserDetails);\n firefoxShim.shimPeerConnection(window, browserDetails);\n firefoxShim.shimOnTrack(window, browserDetails);\n firefoxShim.shimRemoveStream(window, browserDetails);\n firefoxShim.shimSenderGetStats(window, browserDetails);\n firefoxShim.shimReceiverGetStats(window, browserDetails);\n firefoxShim.shimRTCDataChannel(window, browserDetails);\n firefoxShim.shimAddTransceiver(window, browserDetails);\n firefoxShim.shimGetParameters(window, browserDetails);\n firefoxShim.shimCreateOffer(window, browserDetails);\n firefoxShim.shimCreateAnswer(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimConnectionState(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n break;\n case 'safari':\n if (!safariShim || !options.shimSafari) {\n logging('Safari shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming safari.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = safariShim;\n\n // Must be called before shimCallbackAPI.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n commonShim.shimParameterlessSetLocalDescription(window, browserDetails);\n\n safariShim.shimRTCIceServerUrls(window, browserDetails);\n safariShim.shimCreateOfferLegacy(window, browserDetails);\n safariShim.shimCallbacksAPI(window, browserDetails);\n safariShim.shimLocalStreamsAPI(window, browserDetails);\n safariShim.shimRemoteStreamsAPI(window, browserDetails);\n safariShim.shimTrackEventTransceiver(window, browserDetails);\n safariShim.shimGetUserMedia(window, browserDetails);\n safariShim.shimAudioContext(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimRTCIceCandidateRelayProtocol(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n commonShim.removeExtmapAllowMixed(window, browserDetails);\n break;\n default:\n logging('Unsupported browser!');\n break;\n }\n\n return adapter;\n}\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","const LOG_PREFIX = \"PeerJS: \";\n\n/*\nPrints log messages depending on the debug level passed in. Defaults to 0.\n0 Prints no logs.\n1 Prints only errors.\n2 Prints errors and warnings.\n3 Prints all logs.\n*/\nexport enum LogLevel {\n\t/**\n\t * Prints no logs.\n\t */\n\tDisabled,\n\t/**\n\t * Prints only errors.\n\t */\n\tErrors,\n\t/**\n\t * Prints errors and warnings.\n\t */\n\tWarnings,\n\t/**\n\t * Prints all logs.\n\t */\n\tAll,\n}\n\nclass Logger {\n\tprivate _logLevel = LogLevel.Disabled;\n\n\tget logLevel(): LogLevel {\n\t\treturn this._logLevel;\n\t}\n\n\tset logLevel(logLevel: LogLevel) {\n\t\tthis._logLevel = logLevel;\n\t}\n\n\tlog(...args: any[]) {\n\t\tif (this._logLevel >= LogLevel.All) {\n\t\t\tthis._print(LogLevel.All, ...args);\n\t\t}\n\t}\n\n\twarn(...args: any[]) {\n\t\tif (this._logLevel >= LogLevel.Warnings) {\n\t\t\tthis._print(LogLevel.Warnings, ...args);\n\t\t}\n\t}\n\n\terror(...args: any[]) {\n\t\tif (this._logLevel >= LogLevel.Errors) {\n\t\t\tthis._print(LogLevel.Errors, ...args);\n\t\t}\n\t}\n\n\tsetLogFunction(fn: (logLevel: LogLevel, ..._: any[]) => void): void {\n\t\tthis._print = fn;\n\t}\n\n\tprivate _print(logLevel: LogLevel, ...rest: any[]): void {\n\t\tconst copy = [LOG_PREFIX, ...rest];\n\n\t\tfor (const i in copy) {\n\t\t\tif (copy[i] instanceof Error) {\n\t\t\t\tcopy[i] = \"(\" + copy[i].name + \") \" + copy[i].message;\n\t\t\t}\n\t\t}\n\n\t\tif (logLevel >= LogLevel.All) {\n\t\t\tconsole.log(...copy);\n\t\t} else if (logLevel >= LogLevel.Warnings) {\n\t\t\tconsole.warn(\"WARNING\", ...copy);\n\t\t} else if (logLevel >= LogLevel.Errors) {\n\t\t\tconsole.error(\"ERROR\", ...copy);\n\t\t}\n\t}\n}\n\nexport default new Logger();\n","export enum ConnectionType {\n\tData = \"data\",\n\tMedia = \"media\",\n}\n\nexport enum PeerErrorType {\n\t/**\n\t * The client's browser does not support some or all WebRTC features that you are trying to use.\n\t */\n\tBrowserIncompatible = \"browser-incompatible\",\n\t/**\n\t * You've already disconnected this peer from the server and can no longer make any new connections on it.\n\t */\n\tDisconnected = \"disconnected\",\n\t/**\n\t * The ID passed into the Peer constructor contains illegal characters.\n\t */\n\tInvalidID = \"invalid-id\",\n\t/**\n\t * The API key passed into the Peer constructor contains illegal characters or is not in the system (cloud server only).\n\t */\n\tInvalidKey = \"invalid-key\",\n\t/**\n\t * Lost or cannot establish a connection to the signalling server.\n\t */\n\tNetwork = \"network\",\n\t/**\n\t * The peer you're trying to connect to does not exist.\n\t */\n\tPeerUnavailable = \"peer-unavailable\",\n\t/**\n\t * PeerJS is being used securely, but the cloud server does not support SSL. Use a custom PeerServer.\n\t */\n\tSslUnavailable = \"ssl-unavailable\",\n\t/**\n\t * Unable to reach the server.\n\t */\n\tServerError = \"server-error\",\n\t/**\n\t * An error from the underlying socket.\n\t */\n\tSocketError = \"socket-error\",\n\t/**\n\t * The underlying socket closed unexpectedly.\n\t */\n\tSocketClosed = \"socket-closed\",\n\t/**\n\t * The ID passed into the Peer constructor is already taken.\n\t *\n\t * :::caution\n\t * This error is not fatal if your peer has open peer-to-peer connections.\n\t * This can happen if you attempt to {@apilink Peer.reconnect} a peer that has been disconnected from the server,\n\t * but its old ID has now been taken.\n\t * :::\n\t */\n\tUnavailableID = \"unavailable-id\",\n\t/**\n\t * Native WebRTC errors.\n\t */\n\tWebRTC = \"webrtc\",\n}\n\nexport enum SerializationType {\n\tBinary = \"binary\",\n\tBinaryUTF8 = \"binary-utf8\",\n\tJSON = \"json\",\n}\n\nexport enum SocketEventType {\n\tMessage = \"message\",\n\tDisconnected = \"disconnected\",\n\tError = \"error\",\n\tClose = \"close\",\n}\n\nexport enum ServerMessageType {\n\tHeartbeat = \"HEARTBEAT\",\n\tCandidate = \"CANDIDATE\",\n\tOffer = \"OFFER\",\n\tAnswer = \"ANSWER\",\n\tOpen = \"OPEN\", // The connection to the server is open.\n\tError = \"ERROR\", // Server error.\n\tIdTaken = \"ID-TAKEN\", // The selected ID is taken.\n\tInvalidKey = \"INVALID-KEY\", // The given API key cannot be found.\n\tLeave = \"LEAVE\", // Another peer has closed its connection to this peer.\n\tExpire = \"EXPIRE\", // The offer sent to a peer has expired without response.\n}\n","{\n\t\"name\": \"peerjs\",\n\t\"version\": \"1.4.7\",\n\t\"keywords\": [\n\t\t\"peerjs\",\n\t\t\"webrtc\",\n\t\t\"p2p\",\n\t\t\"rtc\"\n\t],\n\t\"description\": \"PeerJS client\",\n\t\"homepage\": \"https://peerjs.com\",\n\t\"bugs\": {\n\t\t\"url\": \"https://github.com/peers/peerjs/issues\"\n\t},\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"https://github.com/peers/peerjs\"\n\t},\n\t\"license\": \"MIT\",\n\t\"contributors\": [\n\t\t\"Michelle Bu <michelle@michellebu.com>\",\n\t\t\"afrokick <devbyru@gmail.com>\",\n\t\t\"ericz <really.ez@gmail.com>\",\n\t\t\"Jairo <kidandcat@gmail.com>\",\n\t\t\"Jonas Gloning <34194370+jonasgloning@users.noreply.github.com>\",\n\t\t\"Jairo Caro-Accino Viciana <jairo@galax.be>\",\n\t\t\"Carlos Caballero <carlos.caballero.gonzalez@gmail.com>\",\n\t\t\"hc <hheennrryy@gmail.com>\",\n\t\t\"Muhammad Asif <capripio@gmail.com>\",\n\t\t\"PrashoonB <prashoonbhattacharjee@gmail.com>\",\n\t\t\"Harsh Bardhan Mishra <47351025+HarshCasper@users.noreply.github.com>\",\n\t\t\"akotynski <aleksanderkotbury@gmail.com>\",\n\t\t\"lmb <i@lmb.io>\",\n\t\t\"Jairooo <jairocaro@msn.com>\",\n\t\t\"Moritz Stückler <moritz.stueckler@gmail.com>\",\n\t\t\"Simon <crydotsnakegithub@gmail.com>\",\n\t\t\"Denis Lukov <denismassters@gmail.com>\",\n\t\t\"Philipp Hancke <fippo@andyet.net>\",\n\t\t\"Hans Oksendahl <hansoksendahl@gmail.com>\",\n\t\t\"Jess <jessachandler@gmail.com>\",\n\t\t\"khankuan <khankuan@gmail.com>\",\n\t\t\"DUODVK <kurmanov.work@gmail.com>\",\n\t\t\"XiZhao <kwang1imsa@gmail.com>\",\n\t\t\"Matthias Lohr <matthias@lohr.me>\",\n\t\t\"=frank tree <=frnktrb@googlemail.com>\",\n\t\t\"Andre Eckardt <aeckardt@outlook.com>\",\n\t\t\"Chris Cowan <agentme49@gmail.com>\",\n\t\t\"Alex Chuev <alex@chuev.com>\",\n\t\t\"alxnull <alxnull@e.mail.de>\",\n\t\t\"Yemel Jardi <angel.jardi@gmail.com>\",\n\t\t\"Ben Parnell <benjaminparnell.94@gmail.com>\",\n\t\t\"Benny Lichtner <bennlich@gmail.com>\",\n\t\t\"fresheneesz <bitetrudpublic@gmail.com>\",\n\t\t\"bob.barstead@exaptive.com <bob.barstead@exaptive.com>\",\n\t\t\"chandika <chandika@gmail.com>\",\n\t\t\"emersion <contact@emersion.fr>\",\n\t\t\"Christopher Van <cvan@users.noreply.github.com>\",\n\t\t\"eddieherm <edhermoso@gmail.com>\",\n\t\t\"Eduardo Pinho <enet4mikeenet@gmail.com>\",\n\t\t\"Evandro Zanatta <ezanatta@tray.net.br>\",\n\t\t\"Gardner Bickford <gardner@users.noreply.github.com>\",\n\t\t\"Gian Luca <gianluca.cecchi@cynny.com>\",\n\t\t\"PatrickJS <github@gdi2290.com>\",\n\t\t\"jonnyf <github@jonathanfoss.co.uk>\",\n\t\t\"Hizkia Felix <hizkifw@gmail.com>\",\n\t\t\"Hristo Oskov <hristo.oskov@gmail.com>\",\n\t\t\"Isaac Madwed <i.madwed@gmail.com>\",\n\t\t\"Ilya Konanykhin <ilya.konanykhin@gmail.com>\",\n\t\t\"jasonbarry <jasbarry@me.com>\",\n\t\t\"Jonathan Burke <jonathan.burke.1311@googlemail.com>\",\n\t\t\"Josh Hamit <josh.hamit@gmail.com>\",\n\t\t\"Jordan Austin <jrax86@gmail.com>\",\n\t\t\"Joel Wetzell <jwetzell@yahoo.com>\",\n\t\t\"xizhao <kevin.wang@cloudera.com>\",\n\t\t\"Alberto Torres <kungfoobar@gmail.com>\",\n\t\t\"Jonathan Mayol <mayoljonathan@gmail.com>\",\n\t\t\"Jefferson Felix <me@jsfelix.dev>\",\n\t\t\"Rolf Erik Lekang <me@rolflekang.com>\",\n\t\t\"Kevin Mai-Husan Chia <mhchia@users.noreply.github.com>\",\n\t\t\"Pepijn de Vos <pepijndevos@gmail.com>\",\n\t\t\"JooYoung <qkdlql@naver.com>\",\n\t\t\"Tobias Speicher <rootcommander@gmail.com>\",\n\t\t\"Steve Blaurock <sblaurock@gmail.com>\",\n\t\t\"Kyrylo Shegeda <shegeda@ualberta.ca>\",\n\t\t\"Diwank Singh Tomer <singh@diwank.name>\",\n\t\t\"Sören Balko <Soeren.Balko@gmail.com>\",\n\t\t\"Arpit Solanki <solankiarpit1997@gmail.com>\",\n\t\t\"Yuki Ito <yuki@gnnk.net>\",\n\t\t\"Artur Zayats <zag2art@gmail.com>\"\n\t],\n\t\"funding\": {\n\t\t\"type\": \"opencollective\",\n\t\t\"url\": \"https://opencollective.com/peer\"\n\t},\n\t\"collective\": {\n\t\t\"type\": \"opencollective\",\n\t\t\"url\": \"https://opencollective.com/peer\"\n\t},\n\t\"files\": [\n\t\t\"dist/*\"\n\t],\n\t\"sideEffects\": [\n\t\t\"lib/global.ts\",\n\t\t\"lib/supports.ts\"\n\t],\n\t\"main\": \"dist/bundler.cjs\",\n\t\"module\": \"dist/bundler.mjs\",\n\t\"browser-minified\": \"dist/peerjs.min.js\",\n\t\"browser-unminified\": \"dist/peerjs.js\",\n\t\"types\": \"dist/types.d.ts\",\n\t\"engines\": {\n\t\t\"node\": \">= 10\"\n\t},\n\t\"targets\": {\n\t\t\"types\": {\n\t\t\t\"source\": \"lib/exports.ts\"\n\t\t},\n\t\t\"main\": {\n\t\t\t\"source\": \"lib/exports.ts\",\n\t\t\t\"sourceMap\": {\n\t\t\t\t\"inlineSources\": true\n\t\t\t}\n\t\t},\n\t\t\"module\": {\n\t\t\t\"source\": \"lib/exports.ts\",\n\t\t\t\"includeNodeModules\": [\n\t\t\t\t\"eventemitter3\"\n\t\t\t],\n\t\t\t\"sourceMap\": {\n\t\t\t\t\"inlineSources\": true\n\t\t\t}\n\t\t},\n\t\t\"browser-minified\": {\n\t\t\t\"context\": \"browser\",\n\t\t\t\"outputFormat\": \"global\",\n\t\t\t\"optimize\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"browsers\": \"cover 99%, not dead\"\n\t\t\t},\n\t\t\t\"source\": \"lib/global.ts\"\n\t\t},\n\t\t\"browser-unminified\": {\n\t\t\t\"context\": \"browser\",\n\t\t\t\"outputFormat\": \"global\",\n\t\t\t\"optimize\": false,\n\t\t\t\"engines\": {\n\t\t\t\t\"browsers\": \"cover 99%, not dead\"\n\t\t\t},\n\t\t\t\"source\": \"lib/global.ts\"\n\t\t}\n\t},\n\t\"scripts\": {\n\t\t\"contributors\": \"git-authors-cli --print=false && prettier --write package.json && git add package.json package-lock.json && git commit -m \\\"chore(contributors): update and sort contributors list\\\"\",\n\t\t\"check\": \"tsc --noEmit\",\n\t\t\"watch\": \"parcel watch\",\n\t\t\"build\": \"rm -rf dist && parcel build\",\n\t\t\"prepublishOnly\": \"npm run build\",\n\t\t\"test\": \"jest\",\n\t\t\"test:watch\": \"jest --watch\",\n\t\t\"coverage\": \"jest --coverage --collectCoverageFrom=\\\"./lib/**\\\"\",\n\t\t\"format\": \"prettier --write .\",\n\t\t\"semantic-release\": \"semantic-release\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@parcel/config-default\": \"^2.8.1\",\n\t\t\"@parcel/packager-ts\": \"^2.8.1\",\n\t\t\"@parcel/transformer-typescript-tsc\": \"^2.8.1\",\n\t\t\"@parcel/transformer-typescript-types\": \"^2.8.1\",\n\t\t\"@semantic-release/changelog\": \"^6.0.1\",\n\t\t\"@semantic-release/git\": \"^10.0.1\",\n\t\t\"@swc/core\": \"^1.3.27\",\n\t\t\"@swc/jest\": \"^0.2.24\",\n\t\t\"jest\": \"^29.3.1\",\n\t\t\"jest-environment-jsdom\": \"^29.3.1\",\n\t\t\"mock-socket\": \"^9.0.0\",\n\t\t\"parcel\": \"^2.8.1\",\n\t\t\"parcel-transformer-tsc-sourcemaps\": \"^1.0.2\",\n\t\t\"prettier\": \"^2.6.2\",\n\t\t\"semantic-release\": \"^20.0.0\",\n\t\t\"typescript\": \"^4.5.5\"\n\t},\n\t\"dependencies\": {\n\t\t\"@swc/helpers\": \"^0.4.0\",\n\t\t\"eventemitter3\": \"^4.0.7\",\n\t\t\"peerjs-js-binarypack\": \"1.0.2\",\n\t\t\"webrtc-adapter\": \"^8.0.0\"\n\t}\n}\n","import { EventEmitter } from \"eventemitter3\";\nimport logger from \"./logger\";\nimport { SocketEventType, ServerMessageType } from \"./enums\";\nimport { version } from \"../package.json\";\n\n/**\n * An abstraction on top of WebSockets to provide fastest\n * possible connection for peers.\n */\nexport class Socket extends EventEmitter {\n\tprivate _disconnected: boolean = true;\n\tprivate _id?: string;\n\tprivate _messagesQueue: Array<object> = [];\n\tprivate _socket?: WebSocket;\n\tprivate _wsPingTimer?: any;\n\tprivate readonly _baseUrl: string;\n\n\tconstructor(\n\t\tsecure: any,\n\t\thost: string,\n\t\tport: number,\n\t\tpath: string,\n\t\tkey: string,\n\t\tprivate readonly pingInterval: number = 5000,\n\t) {\n\t\tsuper();\n\n\t\tconst wsProtocol = secure ? \"wss://\" : \"ws://\";\n\n\t\tthis._baseUrl = wsProtocol + host + \":\" + port + path + \"peerjs?key=\" + key;\n\t}\n\n\tstart(id: string, token: string): void {\n\t\tthis._id = id;\n\n\t\tconst wsUrl = `${this._baseUrl}&id=${id}&token=${token}`;\n\n\t\tif (!!this._socket || !this._disconnected) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._socket = new WebSocket(wsUrl + \"&version=\" + version);\n\t\tthis._disconnected = false;\n\n\t\tthis._socket.onmessage = (event) => {\n\t\t\tlet data;\n\n\t\t\ttry {\n\t\t\t\tdata = JSON.parse(event.data);\n\t\t\t\tlogger.log(\"Server message received:\", data);\n\t\t\t} catch (e) {\n\t\t\t\tlogger.log(\"Invalid server message\", event.data);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.emit(SocketEventType.Message, data);\n\t\t};\n\n\t\tthis._socket.onclose = (event) => {\n\t\t\tif (this._disconnected) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlogger.log(\"Socket closed.\", event);\n\n\t\t\tthis._cleanup();\n\t\t\tthis._disconnected = true;\n\n\t\t\tthis.emit(SocketEventType.Disconnected);\n\t\t};\n\n\t\t// Take care of the queue of connections if necessary and make sure Peer knows\n\t\t// socket is open.\n\t\tthis._socket.onopen = () => {\n\t\t\tif (this._disconnected) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._sendQueuedMessages();\n\n\t\t\tlogger.log(\"Socket open\");\n\n\t\t\tthis._scheduleHeartbeat();\n\t\t};\n\t}\n\n\tprivate _scheduleHeartbeat(): void {\n\t\tthis._wsPingTimer = setTimeout(() => {\n\t\t\tthis._sendHeartbeat();\n\t\t}, this.pingInterval);\n\t}\n\n\tprivate _sendHeartbeat(): void {\n\t\tif (!this._wsOpen()) {\n\t\t\tlogger.log(`Cannot send heartbeat, because socket closed`);\n\t\t\treturn;\n\t\t}\n\n\t\tconst message = JSON.stringify({ type: ServerMessageType.Heartbeat });\n\n\t\tthis._socket!.send(message);\n\n\t\tthis._scheduleHeartbeat();\n\t}\n\n\t/** Is the websocket currently open? */\n\tprivate _wsOpen(): boolean {\n\t\treturn !!this._socket && this._socket.readyState === 1;\n\t}\n\n\t/** Send queued messages. */\n\tprivate _sendQueuedMessages(): void {\n\t\t//Create copy of queue and clear it,\n\t\t//because send method push the message back to queue if smth will go wrong\n\t\tconst copiedQueue = [...this._messagesQueue];\n\t\tthis._messagesQueue = [];\n\n\t\tfor (const message of copiedQueue) {\n\t\t\tthis.send(message);\n\t\t}\n\t}\n\n\t/** Exposed send for DC & Peer. */\n\tsend(data: any): void {\n\t\tif (this._disconnected) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If we didn't get an ID yet, we can't yet send anything so we should queue\n\t\t// up these messages.\n\t\tif (!this._id) {\n\t\t\tthis._messagesQueue.push(data);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!data.type) {\n\t\t\tthis.emit(SocketEventType.Error, \"Invalid message\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this._wsOpen()) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst message = JSON.stringify(data);\n\n\t\tthis._socket!.send(message);\n\t}\n\n\tclose(): void {\n\t\tif (this._disconnected) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._cleanup();\n\n\t\tthis._disconnected = true;\n\t}\n\n\tprivate _cleanup(): void {\n\t\tif (this._socket) {\n\t\t\tthis._socket.onopen =\n\t\t\t\tthis._socket.onmessage =\n\t\t\t\tthis._socket.onclose =\n\t\t\t\t\tnull;\n\t\t\tthis._socket.close();\n\t\t\tthis._socket = undefined;\n\t\t}\n\n\t\tclearTimeout(this._wsPingTimer!);\n\t}\n}\n","import { util } from \"./util\";\nimport logger from \"./logger\";\nimport { MediaConnection } from \"./mediaconnection\";\nimport { DataConnection } from \"./dataconnection\";\nimport { ConnectionType, PeerErrorType, ServerMessageType } from \"./enums\";\nimport { BaseConnection, BaseConnectionEvents } from \"./baseconnection\";\nimport { ValidEventTypes } from \"eventemitter3\";\n\n/**\n * Manages all negotiations between Peers.\n */\nexport class Negotiator<\n\tA extends ValidEventTypes,\n\tT extends BaseConnection<A | BaseConnectionEvents>,\n> {\n\tconstructor(readonly connection: T) {}\n\n\t/** Returns a PeerConnection object set up correctly (for data, media). */\n\tstartConnection(options: any) {\n\t\tconst peerConnection = this._startPeerConnection();\n\n\t\t// Set the connection's PC.\n\t\tthis.connection.peerConnection = peerConnection;\n\n\t\tif (this.connection.type === ConnectionType.Media && options._stream) {\n\t\t\tthis._addTracksToConnection(options._stream, peerConnection);\n\t\t}\n\n\t\t// What do we need to do now?\n\t\tif (options.originator) {\n\t\t\tif (this.connection.type === ConnectionType.Data) {\n\t\t\t\tconst dataConnection = <DataConnection>(<unknown>this.connection);\n\n\t\t\t\tconst config: RTCDataChannelInit = { ordered: !!options.reliable };\n\n\t\t\t\tconst dataChannel = peerConnection.createDataChannel(\n\t\t\t\t\tdataConnection.label,\n\t\t\t\t\tconfig,\n\t\t\t\t);\n\t\t\t\tdataConnection.initialize(dataChannel);\n\t\t\t}\n\n\t\t\tthis._makeOffer();\n\t\t} else {\n\t\t\tthis.handleSDP(\"OFFER\", options.sdp);\n\t\t}\n\t}\n\n\t/** Start a PC. */\n\tprivate _startPeerConnection(): RTCPeerConnection {\n\t\tlogger.log(\"Creating RTCPeerConnection.\");\n\n\t\tconst peerConnection = new RTCPeerConnection(\n\t\t\tthis.connection.provider.options.config,\n\t\t);\n\n\t\tthis._setupListeners(peerConnection);\n\n\t\treturn peerConnection;\n\t}\n\n\t/** Set up various WebRTC listeners. */\n\tprivate _setupListeners(peerConnection: RTCPeerConnection) {\n\t\tconst peerId = this.connection.peer;\n\t\tconst connectionId = this.connection.connectionId;\n\t\tconst connectionType = this.connection.type;\n\t\tconst provider = this.connection.provider;\n\n\t\t// ICE CANDIDATES.\n\t\tlogger.log(\"Listening for ICE candidates.\");\n\n\t\tpeerConnection.onicecandidate = (evt) => {\n\t\t\tif (!evt.candidate || !evt.candidate.candidate) return;\n\n\t\t\tlogger.log(`Received ICE candidates for ${peerId}:`, evt.candidate);\n\n\t\t\tprovider.socket.send({\n\t\t\t\ttype: ServerMessageType.Candidate,\n\t\t\t\tpayload: {\n\t\t\t\t\tcandidate: evt.candidate,\n\t\t\t\t\ttype: connectionType,\n\t\t\t\t\tconnectionId: connectionId,\n\t\t\t\t},\n\t\t\t\tdst: peerId,\n\t\t\t});\n\t\t};\n\n\t\tpeerConnection.oniceconnectionstatechange = () => {\n\t\t\tswitch (peerConnection.iceConnectionState) {\n\t\t\t\tcase \"failed\":\n\t\t\t\t\tlogger.log(\n\t\t\t\t\t\t\"iceConnectionState is failed, closing connections to \" + peerId,\n\t\t\t\t\t);\n\t\t\t\t\tthis.connection.emit(\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\tnew Error(\"Negotiation of connection to \" + peerId + \" failed.\"),\n\t\t\t\t\t);\n\t\t\t\t\tthis.connection.close();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"closed\":\n\t\t\t\t\tlogger.log(\n\t\t\t\t\t\t\"iceConnectionState is closed, closing connections to \" + peerId,\n\t\t\t\t\t);\n\t\t\t\t\tthis.connection.emit(\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\tnew Error(\"Connection to \" + peerId + \" closed.\"),\n\t\t\t\t\t);\n\t\t\t\t\tthis.connection.close();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"disconnected\":\n\t\t\t\t\tlogger.log(\n\t\t\t\t\t\t\"iceConnectionState changed to disconnected on the connection with \" +\n\t\t\t\t\t\t\tpeerId,\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"completed\":\n\t\t\t\t\tpeerConnection.onicecandidate = util.noop;\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthis.connection.emit(\n\t\t\t\t\"iceStateChanged\",\n\t\t\t\tpeerConnection.iceConnectionState,\n\t\t\t);\n\t\t};\n\n\t\t// DATACONNECTION.\n\t\tlogger.log(\"Listening for data channel\");\n\t\t// Fired between offer and answer, so options should already be saved\n\t\t// in the options hash.\n\t\tpeerConnection.ondatachannel = (evt) => {\n\t\t\tlogger.log(\"Received data channel\");\n\n\t\t\tconst dataChannel = evt.channel;\n\t\t\tconst connection = <DataConnection>(\n\t\t\t\tprovider.getConnection(peerId, connectionId)\n\t\t\t);\n\n\t\t\tconnection.initialize(dataChannel);\n\t\t};\n\n\t\t// MEDIACONNECTION.\n\t\tlogger.log(\"Listening for remote stream\");\n\n\t\tpeerConnection.ontrack = (evt) => {\n\t\t\tlogger.log(\"Received remote stream\");\n\n\t\t\tconst stream = evt.streams[0];\n\t\t\tconst connection = provider.getConnection(peerId, connectionId);\n\n\t\t\tif (connection.type === ConnectionType.Media) {\n\t\t\t\tconst mediaConnection = <MediaConnection>connection;\n\n\t\t\t\tthis._addStreamToMediaConnection(stream, mediaConnection);\n\t\t\t}\n\t\t};\n\t}\n\n\tcleanup(): void {\n\t\tlogger.log(\"Cleaning up PeerConnection to \" + this.connection.peer);\n\n\t\tconst peerConnection = this.connection.peerConnection;\n\n\t\tif (!peerConnection) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.connection.peerConnection = null;\n\n\t\t//unsubscribe from all PeerConnection's events\n\t\tpeerConnection.onicecandidate =\n\t\t\tpeerConnection.oniceconnectionstatechange =\n\t\t\tpeerConnection.ondatachannel =\n\t\t\tpeerConnection.ontrack =\n\t\t\t\t() => {};\n\n\t\tconst peerConnectionNotClosed = peerConnection.signalingState !== \"closed\";\n\t\tlet dataChannelNotClosed = false;\n\n\t\tif (this.connection.type === ConnectionType.Data) {\n\t\t\tconst dataConnection = <DataConnection>(<unknown>this.connection);\n\t\t\tconst dataChannel = dataConnection.dataChannel;\n\n\t\t\tif (dataChannel) {\n\t\t\t\tdataChannelNotClosed =\n\t\t\t\t\t!!dataChannel.readyState && dataChannel.readyState !== \"closed\";\n\t\t\t}\n\t\t}\n\n\t\tif (peerConnectionNotClosed || dataChannelNotClosed) {\n\t\t\tpeerConnection.close();\n\t\t}\n\t}\n\n\tprivate async _makeOffer(): Promise<void> {\n\t\tconst peerConnection = this.connection.peerConnection;\n\t\tconst provider = this.connection.provider;\n\n\t\ttry {\n\t\t\tconst offer = await peerConnection.createOffer(\n\t\t\t\tthis.connection.options.constraints,\n\t\t\t);\n\n\t\t\tlogger.log(\"Created offer.\");\n\n\t\t\tif (\n\t\t\t\tthis.connection.options.sdpTransform &&\n\t\t\t\ttypeof this.connection.options.sdpTransform === \"function\"\n\t\t\t) {\n\t\t\t\toffer.sdp =\n\t\t\t\t\tthis.connection.options.sdpTransform(offer.sdp) || offer.sdp;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tawait peerConnection.setLocalDescription(offer);\n\n\t\t\t\tlogger.log(\n\t\t\t\t\t\"Set localDescription:\",\n\t\t\t\t\toffer,\n\t\t\t\t\t`for:${this.connection.peer}`,\n\t\t\t\t);\n\n\t\t\t\tlet payload: any = {\n\t\t\t\t\tsdp: offer,\n\t\t\t\t\ttype: this.connection.type,\n\t\t\t\t\tconnectionId: this.connection.connectionId,\n\t\t\t\t\tmetadata: this.connection.metadata,\n\t\t\t\t\tbrowser: util.browser,\n\t\t\t\t};\n\n\t\t\t\tif (this.connection.type === ConnectionType.Data) {\n\t\t\t\t\tconst dataConnection = <DataConnection>(<unknown>this.connection);\n\n\t\t\t\t\tpayload = {\n\t\t\t\t\t\t...payload,\n\t\t\t\t\t\tlabel: dataConnection.label,\n\t\t\t\t\t\treliable: dataConnection.reliable,\n\t\t\t\t\t\tserialization: dataConnection.serialization,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tprovider.socket.send({\n\t\t\t\t\ttype: ServerMessageType.Offer,\n\t\t\t\t\tpayload,\n\t\t\t\t\tdst: this.connection.peer,\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\t// TODO: investigate why _makeOffer is being called from the answer\n\t\t\t\tif (\n\t\t\t\t\terr !=\n\t\t\t\t\t\"OperationError: Failed to set local offer sdp: Called in wrong state: kHaveRemoteOffer\"\n\t\t\t\t) {\n\t\t\t\t\tprovider.emitError(PeerErrorType.WebRTC, err);\n\t\t\t\t\tlogger.log(\"Failed to setLocalDescription, \", err);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err_1) {\n\t\t\tprovider.emitError(PeerErrorType.WebRTC, err_1);\n\t\t\tlogger.log(\"Failed to createOffer, \", err_1);\n\t\t}\n\t}\n\n\tprivate async _makeAnswer(): Promise<void> {\n\t\tconst peerConnection = this.connection.peerConnection;\n\t\tconst provider = this.connection.provider;\n\n\t\ttry {\n\t\t\tconst answer = await peerConnection.createAnswer();\n\t\t\tlogger.log(\"Created answer.\");\n\n\t\t\tif (\n\t\t\t\tthis.connection.options.sdpTransform &&\n\t\t\t\ttypeof this.connection.options.sdpTransform === \"function\"\n\t\t\t) {\n\t\t\t\tanswer.sdp =\n\t\t\t\t\tthis.connection.options.sdpTransform(answer.sdp) || answer.sdp;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tawait peerConnection.setLocalDescription(answer);\n\n\t\t\t\tlogger.log(\n\t\t\t\t\t`Set localDescription:`,\n\t\t\t\t\tanswer,\n\t\t\t\t\t`for:${this.connection.peer}`,\n\t\t\t\t);\n\n\t\t\t\tprovider.socket.send({\n\t\t\t\t\ttype: ServerMessageType.Answer,\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\tsdp: answer,\n\t\t\t\t\t\ttype: this.connection.type,\n\t\t\t\t\t\tconnectionId: this.connection.connectionId,\n\t\t\t\t\t\tbrowser: util.browser,\n\t\t\t\t\t},\n\t\t\t\t\tdst: this.connection.peer,\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\tprovider.emitError(PeerErrorType.WebRTC, err);\n\t\t\t\tlogger.log(\"Failed to setLocalDescription, \", err);\n\t\t\t}\n\t\t} catch (err_1) {\n\t\t\tprovider.emitError(PeerErrorType.WebRTC, err_1);\n\t\t\tlogger.log(\"Failed to create answer, \", err_1);\n\t\t}\n\t}\n\n\t/** Handle an SDP. */\n\tasync handleSDP(type: string, sdp: any): Promise<void> {\n\t\tsdp = new RTCSessionDescription(sdp);\n\t\tconst peerConnection = this.connection.peerConnection;\n\t\tconst provider = this.connection.provider;\n\n\t\tlogger.log(\"Setting remote description\", sdp);\n\n\t\tconst self = this;\n\n\t\ttry {\n\t\t\tawait peerConnection.setRemoteDescription(sdp);\n\t\t\tlogger.log(`Set remoteDescription:${type} for:${this.connection.peer}`);\n\t\t\tif (type === \"OFFER\") {\n\t\t\t\tawait self._makeAnswer();\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tprovider.emitError(PeerErrorType.WebRTC, err);\n\t\t\tlogger.log(\"Failed to setRemoteDescription, \", err);\n\t\t}\n\t}\n\n\t/** Handle a candidate. */\n\tasync handleCandidate(ice: any): Promise<void> {\n\t\tlogger.log(`handleCandidate:`, ice);\n\n\t\tconst candidate = ice.candidate;\n\t\tconst sdpMLineIndex = ice.sdpMLineIndex;\n\t\tconst sdpMid = ice.sdpMid;\n\t\tconst peerConnection = this.connection.peerConnection;\n\t\tconst provider = this.connection.provider;\n\n\t\ttry {\n\t\t\tawait peerConnection.addIceCandidate(\n\t\t\t\tnew RTCIceCandidate({\n\t\t\t\t\tsdpMid: sdpMid,\n\t\t\t\t\tsdpMLineIndex: sdpMLineIndex,\n\t\t\t\t\tcandidate: candidate,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tlogger.log(`Added ICE candidate for:${this.connection.peer}`);\n\t\t} catch (err) {\n\t\t\tprovider.emitError(PeerErrorType.WebRTC, err);\n\t\t\tlogger.log(\"Failed to handleCandidate, \", err);\n\t\t}\n\t}\n\n\tprivate _addTracksToConnection(\n\t\tstream: MediaStream,\n\t\tpeerConnection: RTCPeerConnection,\n\t): void {\n\t\tlogger.log(`add tracks from stream ${stream.id} to peer connection`);\n\n\t\tif (!peerConnection.addTrack) {\n\t\t\treturn logger.error(\n\t\t\t\t`Your browser does't support RTCPeerConnection#addTrack. Ignored.`,\n\t\t\t);\n\t\t}\n\n\t\tstream.getTracks().forEach((track) => {\n\t\t\tpeerConnection.addTrack(track, stream);\n\t\t});\n\t}\n\n\tprivate _addStreamToMediaConnection(\n\t\tstream: MediaStream,\n\t\tmediaConnection: MediaConnection,\n\t): void {\n\t\tlogger.log(\n\t\t\t`add stream ${stream.id} to media connection ${mediaConnection.connectionId}`,\n\t\t);\n\n\t\tmediaConnection.addStream(stream);\n\t}\n}\n","import { EventEmitter, ValidEventTypes } from \"eventemitter3\";\nimport { Peer } from \"./peer\";\nimport { ServerMessage } from \"./servermessage\";\nimport { ConnectionType } from \"./enums\";\n\nexport type BaseConnectionEvents = {\n\t/**\n\t * Emitted when either you or the remote peer closes the connection.\n\t *\n\t * ```ts\n\t * connection.on('close', () => { ... });\n\t * ```\n\t */\n\tclose: () => void;\n\t/**\n\t * ```ts\n\t * connection.on('error', (error) => { ... });\n\t * ```\n\t */\n\terror: (error: Error) => void;\n\ticeStateChanged: (state: RTCIceConnectionState) => void;\n};\n\nexport abstract class BaseConnection<\n\tT extends ValidEventTypes,\n> extends EventEmitter<T & BaseConnectionEvents> {\n\tprotected _open = false;\n\n\t/**\n\t * Any type of metadata associated with the connection,\n\t * passed in by whoever initiated the connection.\n\t */\n\treadonly metadata: any;\n\tconnectionId: string;\n\n\tpeerConnection: RTCPeerConnection;\n\n\tabstract get type(): ConnectionType;\n\n\t/**\n\t * Whether the media connection is active (e.g. your call has been answered).\n\t * You can check this if you want to set a maximum wait time for a one-sided call.\n\t */\n\tget open() {\n\t\treturn this._open;\n\t}\n\n\tconstructor(\n\t\t/**\n\t\t * The ID of the peer on the other end of this connection.\n\t\t */\n\t\treadonly peer: string,\n\t\tpublic provider: Peer,\n\t\treadonly options: any,\n\t) {\n\t\tsuper();\n\n\t\tthis.metadata = options.metadata;\n\t}\n\n\tabstract close(): void;\n\n\t/**\n\t * @internal\n\t */\n\tabstract handleMessage(message: ServerMessage): void;\n}\n","import { util } from \"./util\";\nimport logger from \"./logger\";\nimport { Negotiator } from \"./negotiator\";\nimport { ConnectionType, ServerMessageType } from \"./enums\";\nimport { Peer } from \"./peer\";\nimport { BaseConnection } from \"./baseconnection\";\nimport { ServerMessage } from \"./servermessage\";\nimport type { AnswerOption } from \"./optionInterfaces\";\n\nexport type MediaConnectionEvents = {\n\t/**\n\t * Emitted when a connection to the PeerServer is established.\n\t *\n\t * ```ts\n\t * mediaConnection.on('stream', (stream) => { ... });\n\t * ```\n\t */\n\tstream: (stream: MediaStream) => void;\n};\n\n/**\n * Wraps WebRTC's media streams.\n * To get one, use {@apilink Peer.call} or listen for the {@apilink PeerEvents | `call`} event.\n */\nexport class MediaConnection extends BaseConnection<MediaConnectionEvents> {\n\tprivate static readonly ID_PREFIX = \"mc_\";\n\n\tprivate _negotiator: Negotiator<MediaConnectionEvents, MediaConnection>;\n\tprivate _localStream: MediaStream;\n\tprivate _remoteStream: MediaStream;\n\n\t/**\n\t * For media connections, this is always 'media'.\n\t */\n\tget type() {\n\t\treturn ConnectionType.Media;\n\t}\n\n\tget localStream(): MediaStream {\n\t\treturn this._localStream;\n\t}\n\tget remoteStream(): MediaStream {\n\t\treturn this._remoteStream;\n\t}\n\n\tconstructor(peerId: string, provider: Peer, options: any) {\n\t\tsuper(peerId, provider, options);\n\n\t\tthis._localStream = this.options._stream;\n\t\tthis.connectionId =\n\t\t\tthis.options.connectionId ||\n\t\t\tMediaConnection.ID_PREFIX + util.randomToken();\n\n\t\tthis._negotiator = new Negotiator(this);\n\n\t\tif (this._localStream) {\n\t\t\tthis._negotiator.startConnection({\n\t\t\t\t_stream: this._localStream,\n\t\t\t\toriginator: true,\n\t\t\t});\n\t\t}\n\t}\n\n\taddStream(remoteStream) {\n\t\tlogger.log(\"Receiving stream\", remoteStream);\n\n\t\tthis._remoteStream = remoteStream;\n\t\tsuper.emit(\"stream\", remoteStream); // Should we call this `open`?\n\t}\n\n\t/**\n\t * @internal\n\t */\n\thandleMessage(message: ServerMessage): void {\n\t\tconst type = message.type;\n\t\tconst payload = message.payload;\n\n\t\tswitch (message.type) {\n\t\t\tcase ServerMessageType.Answer:\n\t\t\t\t// Forward to negotiator\n\t\t\t\tthis._negotiator.handleSDP(type, payload.sdp);\n\t\t\t\tthis._open = true;\n\t\t\t\tbreak;\n\t\t\tcase ServerMessageType.Candidate:\n\t\t\t\tthis._negotiator.handleCandidate(payload.candidate);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tlogger.warn(`Unrecognized message type:${type} from peer:${this.peer}`);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * When receiving a {@apilink PeerEvents | `call`} event on a peer, you can call\n\t * `answer` on the media connection provided by the callback to accept the call\n\t * and optionally send your own media stream.\n\n\t *\n\t * @param stream A WebRTC media stream.\n\t * @param options\n\t * @returns\n\t */\n\tanswer(stream?: MediaStream, options: AnswerOption = {}): void {\n\t\tif (this._localStream) {\n\t\t\tlogger.warn(\n\t\t\t\t\"Local stream already exists on this MediaConnection. Are you answering a call twice?\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tthis._localStream = stream;\n\n\t\tif (options && options.sdpTransform) {\n\t\t\tthis.options.sdpTransform = options.sdpTransform;\n\t\t}\n\n\t\tthis._negotiator.startConnection({\n\t\t\t...this.options._payload,\n\t\t\t_stream: stream,\n\t\t});\n\t\t// Retrieve lost messages stored because PeerConnection not set up.\n\t\tconst messages = this.provider._getMessages(this.connectionId);\n\n\t\tfor (const message of messages) {\n\t\t\tthis.handleMessage(message);\n\t\t}\n\n\t\tthis._open = true;\n\t}\n\n\t/**\n\t * Exposed functionality for users.\n\t */\n\n\t/**\n\t * Closes the media connection.\n\t */\n\tclose(): void {\n\t\tif (this._negotiator) {\n\t\t\tthis._negotiator.cleanup();\n\t\t\tthis._negotiator = null;\n\t\t}\n\n\t\tthis._localStream = null;\n\t\tthis._remoteStream = null;\n\n\t\tif (this.provider) {\n\t\t\tthis.provider._removeConnection(this);\n\n\t\t\tthis.provider = null;\n\t\t}\n\n\t\tif (this.options && this.options._stream) {\n\t\t\tthis.options._stream = null;\n\t\t}\n\n\t\tif (!this.open) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._open = false;\n\n\t\tsuper.emit(\"close\");\n\t}\n}\n","import { EventEmitter } from \"eventemitter3\";\nimport logger from \"./logger\";\n\nexport class EncodingQueue extends EventEmitter {\n\treadonly fileReader: FileReader = new FileReader();\n\n\tprivate _queue: Blob[] = [];\n\tprivate _processing: boolean = false;\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.fileReader.onload = (evt) => {\n\t\t\tthis._processing = false;\n\n\t\t\tif (evt.target) {\n\t\t\t\tthis.emit(\"done\", evt.target.result as ArrayBuffer);\n\t\t\t}\n\n\t\t\tthis.doNextTask();\n\t\t};\n\n\t\tthis.fileReader.onerror = (evt) => {\n\t\t\tlogger.error(`EncodingQueue error:`, evt);\n\t\t\tthis._processing = false;\n\t\t\tthis.destroy();\n\t\t\tthis.emit(\"error\", evt);\n\t\t};\n\t}\n\n\tget queue(): Blob[] {\n\t\treturn this._queue;\n\t}\n\n\tget size(): number {\n\t\treturn this.queue.length;\n\t}\n\n\tget processing(): boolean {\n\t\treturn this._processing;\n\t}\n\n\tenque(blob: Blob): void {\n\t\tthis.queue.push(blob);\n\n\t\tif (this.processing) return;\n\n\t\tthis.doNextTask();\n\t}\n\n\tdestroy(): void {\n\t\tthis.fileReader.abort();\n\t\tthis._queue = [];\n\t}\n\n\tprivate doNextTask(): void {\n\t\tif (this.size === 0) return;\n\t\tif (this.processing) return;\n\n\t\tthis._processing = true;\n\n\t\tthis.fileReader.readAsArrayBuffer(this.queue.shift());\n\t}\n}\n","import { util } from \"./util\";\nimport logger from \"./logger\";\nimport { Negotiator } from \"./negotiator\";\nimport { ConnectionType, SerializationType, ServerMessageType } from \"./enums\";\nimport { Peer } from \"./peer\";\nimport { BaseConnection } from \"./baseconnection\";\nimport { ServerMessage } from \"./servermessage\";\nimport { EncodingQueue } from \"./encodingQueue\";\nimport type { DataConnection as IDataConnection } from \"./dataconnection\";\n\nexport type DataConnectionEvents = {\n\t/**\n\t * Emitted when data is received from the remote peer.\n\t *\n\t * ```ts\n\t * dataConnection.on('data', (data) => { ... });\n\t * ```\n\t */\n\tdata: (data: unknown) => void;\n\t/**\n\t * Emitted when the connection is established and ready-to-use.\n\t *\n\t * ```ts\n\t * dataConnection.on('open', () => { ... });\n\t * ```\n\t */\n\topen: () => void;\n};\n\n/**\n * Wraps WebRTC's DataChannel.\n * To get one, use {@apilink Peer.connect} or listen for the {@apilink PeerEvents | `connect`} event.\n */\nexport class DataConnection\n\textends BaseConnection<DataConnectionEvents>\n\timplements IDataConnection\n{\n\tprivate static readonly ID_PREFIX = \"dc_\";\n\tprivate static readonly MAX_BUFFERED_AMOUNT = 8 * 1024 * 1024;\n\n\tprivate _negotiator: Negotiator<DataConnectionEvents, DataConnection>;\n\t/**\n\t * The optional label passed in or assigned by PeerJS when the connection was initiated.\n\t */\n\treadonly label: string;\n\t/**\n\t * The serialization format of the data sent over the connection.\n\t * {@apilink SerializationType | possible values}\n\t */\n\treadonly serialization: SerializationType;\n\t/**\n\t * Whether the underlying data channels are reliable; defined when the connection was initiated.\n\t */\n\treadonly reliable: boolean;\n\tstringify: (data: any) => string = JSON.stringify;\n\tparse: (data: string) => any = JSON.parse;\n\n\tget type() {\n\t\treturn ConnectionType.Data;\n\t}\n\n\tprivate _buffer: any[] = [];\n\t/**\n\t * The number of messages queued to be sent once the browser buffer is no longer full.\n\t */\n\tprivate _bufferSize = 0;\n\tprivate _buffering = false;\n\tprivate _chunkedData: {\n\t\t[id: number]: {\n\t\t\tdata: Blob[];\n\t\t\tcount: number;\n\t\t\ttotal: number;\n\t\t};\n\t} = {};\n\n\tprivate _dc: RTCDataChannel;\n\tprivate _encodingQueue = new EncodingQueue();\n\n\t/**\n\t * A reference to the RTCDataChannel object associated with the connection.\n\t */\n\tget dataChannel(): RTCDataChannel {\n\t\treturn this._dc;\n\t}\n\n\tget bufferSize(): number {\n\t\treturn this._bufferSize;\n\t}\n\n\tconstructor(peerId: string, provider: Peer, options: any) {\n\t\tsuper(peerId, provider, options);\n\n\t\tthis.connectionId =\n\t\t\tthis.options.connectionId ||\n\t\t\tDataConnection.ID_PREFIX + util.randomToken();\n\n\t\tthis.label = this.options.label || this.connectionId;\n\t\tthis.serialization = this.options.serialization || SerializationType.Binary;\n\t\tthis.reliable = !!this.options.reliable;\n\n\t\tthis._encodingQueue.on(\"done\", (ab: ArrayBuffer) => {\n\t\t\tthis._bufferedSend(ab);\n\t\t});\n\n\t\tthis._encodingQueue.on(\"error\", () => {\n\t\t\tlogger.error(\n\t\t\t\t`DC#${this.connectionId}: Error occured in encoding from blob to arraybuffer, close DC`,\n\t\t\t);\n\t\t\tthis.close();\n\t\t});\n\n\t\tthis._negotiator = new Negotiator(this);\n\n\t\tthis._negotiator.startConnection(\n\t\t\tthis.options._payload || {\n\t\t\t\toriginator: true,\n\t\t\t},\n\t\t);\n\t}\n\n\t/** Called by the Negotiator when the DataChannel is ready. */\n\tinitialize(dc: RTCDataChannel): void {\n\t\tthis._dc = dc;\n\t\tthis._configureDataChannel();\n\t}\n\n\tprivate _configureDataChannel(): void {\n\t\tif (!util.supports.binaryBlob || util.supports.reliable) {\n\t\t\tthis.dataChannel.binaryType = \"arraybuffer\";\n\t\t}\n\n\t\tthis.dataChannel.onopen = () => {\n\t\t\tlogger.log(`DC#${this.connectionId} dc connection success`);\n\t\t\tthis._open = true;\n\t\t\tthis.emit(\"open\");\n\t\t};\n\n\t\tthis.dataChannel.onmessage = (e) => {\n\t\t\tlogger.log(`DC#${this.connectionId} dc onmessage:`, e.data);\n\t\t\tthis._handleDataMessage(e);\n\t\t};\n\n\t\tthis.dataChannel.onclose = () => {\n\t\t\tlogger.log(`DC#${this.connectionId} dc closed for:`, this.peer);\n\t\t\tthis.close();\n\t\t};\n\t}\n\n\t// Handles a DataChannel message.\n\tprivate _handleDataMessage({\n\t\tdata,\n\t}: {\n\t\tdata: Blob | ArrayBuffer | string;\n\t}): void {\n\t\tconst datatype = data.constructor;\n\n\t\tconst isBinarySerialization =\n\t\t\tthis.serialization === SerializationType.Binary ||\n\t\t\tthis.serialization === SerializationType.BinaryUTF8;\n\n\t\tlet deserializedData: any = data;\n\n\t\tif (isBinarySerialization) {\n\t\t\tif (datatype === Blob) {\n\t\t\t\t// Datatype should never be blob\n\t\t\t\tutil.blobToArrayBuffer(data as Blob, (ab) => {\n\t\t\t\t\tconst unpackedData = util.unpack(ab);\n\t\t\t\t\tthis.emit(\"data\", unpackedData);\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t} else if (datatype === ArrayBuffer) {\n\t\t\t\tdeserializedData = util.unpack(data as ArrayBuffer);\n\t\t\t} else if (datatype === String) {\n\t\t\t\t// String fallback for binary data for browsers that don't support binary yet\n\t\t\t\tconst ab = util.binaryStringToArrayBuffer(data as string);\n\t\t\t\tdeserializedData = util.unpack(ab);\n\t\t\t}\n\t\t} else if (this.serialization === SerializationType.JSON) {\n\t\t\tdeserializedData = this.parse(data as string);\n\t\t}\n\n\t\t// Check if we've chunked--if so, piece things back together.\n\t\t// We're guaranteed that this isn't 0.\n\t\tif (deserializedData.__peerData) {\n\t\t\tthis._handleChunk(deserializedData);\n\t\t\treturn;\n\t\t}\n\n\t\tsuper.emit(\"data\", deserializedData);\n\t}\n\n\tprivate _handleChunk(data: {\n\t\t__peerData: number;\n\t\tn: number;\n\t\ttotal: number;\n\t\tdata: Blob;\n\t}): void {\n\t\tconst id = data.__peerData;\n\t\tconst chunkInfo = this._chunkedData[id] || {\n\t\t\tdata: [],\n\t\t\tcount: 0,\n\t\t\ttotal: data.total,\n\t\t};\n\n\t\tchunkInfo.data[data.n] = data.data;\n\t\tchunkInfo.count++;\n\t\tthis._chunkedData[id] = chunkInfo;\n\n\t\tif (chunkInfo.total === chunkInfo.count) {\n\t\t\t// Clean up before making the recursive call to `_handleDataMessage`.\n\t\t\tdelete this._chunkedData[id];\n\n\t\t\t// We've received all the chunks--time to construct the complete data.\n\t\t\tconst data = new Blob(chunkInfo.data);\n\t\t\tthis._handleDataMessage({ data });\n\t\t}\n\t}\n\n\t/**\n\t * Exposed functionality for users.\n\t */\n\n\t/** Allows user to close connection. */\n\tclose(): void {\n\t\tthis._buffer = [];\n\t\tthis._bufferSize = 0;\n\t\tthis._chunkedData = {};\n\n\t\tif (this._negotiator) {\n\t\t\tthis._negotiator.cleanup();\n\t\t\tthis._negotiator = null;\n\t\t}\n\n\t\tif (this.provider) {\n\t\t\tthis.provider._removeConnection(this);\n\n\t\t\tthis.provider = null;\n\t\t}\n\n\t\tif (this.dataChannel) {\n\t\t\tthis.dataChannel.onopen = null;\n\t\t\tthis.dataChannel.onmessage = null;\n\t\t\tthis.dataChannel.onclose = null;\n\t\t\tthis._dc = null;\n\t\t}\n\n\t\tif (this._encodingQueue) {\n\t\t\tthis._encodingQueue.destroy();\n\t\t\tthis._encodingQueue.removeAllListeners();\n\t\t\tthis._encodingQueue = null;\n\t\t}\n\n\t\tif (!this.open) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._open = false;\n\n\t\tsuper.emit(\"close\");\n\t}\n\n\t/**\n\t * `data` is serialized and sent to the remote peer.\n\t * @param data You can send any type of data, including objects, strings, and blobs.\n\t * @returns\n\t */\n\tsend(data: any, chunked?: boolean): void {\n\t\tif (!this.open) {\n\t\t\tsuper.emit(\n\t\t\t\t\"error\",\n\t\t\t\tnew Error(\n\t\t\t\t\t\"Connection is not open. You should listen for the `open` event before sending messages.\",\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.serialization === SerializationType.JSON) {\n\t\t\tthis._bufferedSend(this.stringify(data));\n\t\t} else if (\n\t\t\tthis.serialization === SerializationType.Binary ||\n\t\t\tthis.serialization === SerializationType.BinaryUTF8\n\t\t) {\n\t\t\tconst blob = util.pack(data);\n\n\t\t\tif (!chunked && blob.size > util.chunkedMTU) {\n\t\t\t\tthis._sendChunks(blob);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!util.supports.binaryBlob) {\n\t\t\t\t// We only do this if we really need to (e.g. blobs are not supported),\n\t\t\t\t// because this conversion is costly.\n\t\t\t\tthis._encodingQueue.enque(blob);\n\t\t\t} else {\n\t\t\t\tthis._bufferedSend(blob);\n\t\t\t}\n\t\t} else {\n\t\t\tthis._bufferedSend(data);\n\t\t}\n\t}\n\n\tprivate _bufferedSend(msg: any): void {\n\t\tif (this._buffering || !this._trySend(msg)) {\n\t\t\tthis._buffer.push(msg);\n\t\t\tthis._bufferSize = this._buffer.length;\n\t\t}\n\t}\n\n\t// Returns true if the send succeeds.\n\tprivate _trySend(msg: any): boolean {\n\t\tif (!this.open) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (this.dataChannel.bufferedAmount > DataConnection.MAX_BUFFERED_AMOUNT) {\n\t\t\tthis._buffering = true;\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis._buffering = false;\n\t\t\t\tthis._tryBuffer();\n\t\t\t}, 50);\n\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\tthis.dataChannel.send(msg);\n\t\t} catch (e) {\n\t\t\tlogger.error(`DC#:${this.connectionId} Error when sending:`, e);\n\t\t\tthis._buffering = true;\n\n\t\t\tthis.close();\n\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t// Try to send the first message in the buffer.\n\tprivate _tryBuffer(): void {\n\t\tif (!this.open) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._buffer.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst msg = this._buffer[0];\n\n\t\tif (this._trySend(msg)) {\n\t\t\tthis._buffer.shift();\n\t\t\tthis._bufferSize = this._buffer.length;\n\t\t\tthis._tryBuffer();\n\t\t}\n\t}\n\n\tprivate _sendChunks(blob: Blob): void {\n\t\tconst blobs = util.chunk(blob);\n\t\tlogger.log(`DC#${this.connectionId} Try to send ${blobs.length} chunks...`);\n\n\t\tfor (const blob of blobs) {\n\t\t\tthis.send(blob, true);\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t */\n\thandleMessage(message: ServerMessage): void {\n\t\tconst payload = message.payload;\n\n\t\tswitch (message.type) {\n\t\t\tcase ServerMessageType.Answer:\n\t\t\t\tthis._negotiator.handleSDP(message.type, payload.sdp);\n\t\t\t\tbreak;\n\t\t\tcase ServerMessageType.Candidate:\n\t\t\t\tthis._negotiator.handleCandidate(payload.candidate);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tlogger.warn(\n\t\t\t\t\t\"Unrecognized message type:\",\n\t\t\t\t\tmessage.type,\n\t\t\t\t\t\"from peer:\",\n\t\t\t\t\tthis.peer,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n","import { util } from \"./util\";\nimport logger from \"./logger\";\nimport { PeerJSOption } from \"./optionInterfaces\";\nimport { version } from \"../package.json\";\n\nexport class API {\n\tconstructor(private readonly _options: PeerJSOption) {}\n\n\tprivate _buildRequest(method: string): Promise<Response> {\n\t\tconst protocol = this._options.secure ? \"https\" : \"http\";\n\t\tconst { host, port, path, key } = this._options;\n\t\tconst url = new URL(`${protocol}://${host}:${port}${path}${key}/${method}`);\n\t\t// TODO: Why timestamp, why random?\n\t\turl.searchParams.set(\"ts\", `${Date.now()}${Math.random()}`);\n\t\turl.searchParams.set(\"version\", version);\n\t\treturn fetch(url.href, {\n\t\t\treferrerPolicy: this._options.referrerPolicy,\n\t\t});\n\t}\n\n\t/** Get a unique ID from the server via XHR and initialize with it. */\n\tasync retrieveId(): Promise<string> {\n\t\ttry {\n\t\t\tconst response = await this._buildRequest(\"id\");\n\n\t\t\tif (response.status !== 200) {\n\t\t\t\tthrow new Error(`Error. Status:${response.status}`);\n\t\t\t}\n\n\t\t\treturn response.text();\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Error retrieving ID\", error);\n\n\t\t\tlet pathError = \"\";\n\n\t\t\tif (\n\t\t\t\tthis._options.path === \"/\" &&\n\t\t\t\tthis._options.host !== util.CLOUD_HOST\n\t\t\t) {\n\t\t\t\tpathError =\n\t\t\t\t\t\" If you passed in a `path` to your self-hosted PeerServer, \" +\n\t\t\t\t\t\"you'll also need to pass in that same path when creating a new \" +\n\t\t\t\t\t\"Peer.\";\n\t\t\t}\n\n\t\t\tthrow new Error(\"Could not get an ID from the server.\" + pathError);\n\t\t}\n\t}\n\n\t/** @deprecated */\n\tasync listAllPeers(): Promise<any[]> {\n\t\ttry {\n\t\t\tconst response = await this._buildRequest(\"peers\");\n\n\t\t\tif (response.status !== 200) {\n\t\t\t\tif (response.status === 401) {\n\t\t\t\t\tlet helpfulError = \"\";\n\n\t\t\t\t\tif (this._options.host === util.CLOUD_HOST) {\n\t\t\t\t\t\thelpfulError =\n\t\t\t\t\t\t\t\"It looks like you're using the cloud server. You can email \" +\n\t\t\t\t\t\t\t\"team@peerjs.com to enable peer listing for your API key.\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\thelpfulError =\n\t\t\t\t\t\t\t\"You need to enable `allow_discovery` on your self-hosted \" +\n\t\t\t\t\t\t\t\"PeerServer to use this feature.\";\n\t\t\t\t\t}\n\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"It doesn't look like you have permission to list peers IDs. \" +\n\t\t\t\t\t\t\thelpfulError,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tthrow new Error(`Error. Status:${response.status}`);\n\t\t\t}\n\n\t\t\treturn response.json();\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Error retrieving list peers\", error);\n\n\t\t\tthrow new Error(\"Could not get list peers from the server.\" + error);\n\t\t}\n\t}\n}\n","import { EventEmitter } from \"eventemitter3\";\nimport { util } from \"./util\";\nimport logger, { LogLevel } from \"./logger\";\nimport { Socket } from \"./socket\";\nimport { MediaConnection } from \"./mediaconnection\";\nimport { DataConnection } from \"./dataconnection\";\nimport {\n\tConnectionType,\n\tPeerErrorType,\n\tSocketEventType,\n\tServerMessageType,\n} from \"./enums\";\nimport { ServerMessage } from \"./servermessage\";\nimport { API } from \"./api\";\nimport type {\n\tPeerConnectOption,\n\tPeerJSOption,\n\tCallOption,\n} from \"./optionInterfaces\";\n\nclass PeerOptions implements PeerJSOption {\n\t/**\n\t * Prints log messages depending on the debug level passed in.\n\t */\n\tdebug?: LogLevel;\n\t/**\n\t * Server host. Defaults to `0.peerjs.com`.\n\t * Also accepts `'/'` to signify relative hostname.\n\t */\n\thost?: string;\n\t/**\n\t * Server port. Defaults to `443`.\n\t */\n\tport?: number;\n\t/**\n\t * The path where your self-hosted PeerServer is running. Defaults to `'/'`\n\t */\n\tpath?: string;\n\t/**\n\t * API key for the PeerServer.\n\t * This is not used anymore.\n\t * @deprecated\n\t */\n\tkey?: string;\n\ttoken?: string;\n\t/**\n\t * Configuration hash passed to RTCPeerConnection.\n\t * This hash contains any custom ICE/TURN server configuration.\n\t *\n\t * Defaults to {@apilink util.defaultConfig}\n\t */\n\tconfig?: any;\n\t/**\n\t * Set to true `true` if you're using TLS.\n\t * :::danger\n\t * If possible *always use TLS*\n\t * :::\n\t */\n\tsecure?: boolean;\n\tpingInterval?: number;\n\treferrerPolicy?: ReferrerPolicy;\n\tlogFunction?: (logLevel: LogLevel, ...rest: any[]) => void;\n}\n\nclass PeerError extends Error {\n\tconstructor(type: PeerErrorType, err: Error | string) {\n\t\tif (typeof err === \"string\") {\n\t\t\tsuper(err);\n\t\t} else {\n\t\t\tsuper();\n\t\t\tObject.assign(this, err);\n\t\t}\n\n\t\tthis.type = type;\n\t}\n\n\ttype: PeerErrorType;\n}\nexport type { PeerError, PeerOptions };\n\nexport type PeerEvents = {\n\t/**\n\t * Emitted when a connection to the PeerServer is established.\n\t *\n\t * You may use the peer before this is emitted, but messages to the server will be queued. <code>id</code> is the brokering ID of the peer (which was either provided in the constructor or assigned by the server).<span class='tip'>You should not wait for this event before connecting to other peers if connection speed is important.</span>\n\t */\n\topen: (id: string) => void;\n\t/**\n\t * Emitted when a new data connection is established from a remote peer.\n\t */\n\tconnection: (dataConnection: DataConnection) => void;\n\t/**\n\t * Emitted when a remote peer attempts to call you.\n\t */\n\tcall: (mediaConnection: MediaConnection) => void;\n\t/**\n\t * Emitted when the peer is destroyed and can no longer accept or create any new connections.\n\t */\n\tclose: () => void;\n\t/**\n\t * Emitted when the peer is disconnected from the signalling server\n\t */\n\tdisconnected: (currentId: string) => void;\n\t/**\n\t * Errors on the peer are almost always fatal and will destroy the peer.\n\t *\n\t * Errors from the underlying socket and PeerConnections are forwarded here.\n\t */\n\terror: (error: PeerError) => void;\n};\n/**\n * A peer who can initiate connections with other peers.\n */\nexport class Peer extends EventEmitter<PeerEvents> {\n\tprivate static readonly DEFAULT_KEY = \"peerjs\";\n\n\tprivate readonly _options: PeerOptions;\n\tprivate readonly _api: API;\n\tprivate readonly _socket: Socket;\n\n\tprivate _id: string | null = null;\n\tprivate _lastServerId: string | null = null;\n\n\t// States.\n\tprivate _destroyed = false; // Connections have been killed\n\tprivate _disconnected = false; // Connection to PeerServer killed but P2P connections still active\n\tprivate _open = false; // Sockets and such are not yet open.\n\tprivate readonly _connections: Map<\n\t\tstring,\n\t\t(DataConnection | MediaConnection)[]\n\t> = new Map(); // All connections for this peer.\n\tprivate readonly _lostMessages: Map<string, ServerMessage[]> = new Map(); // src => [list of messages]\n\t/**\n\t * The brokering ID of this peer\n\t *\n\t * If no ID was specified in {@apilink Peer | the constructor},\n\t * this will be `undefined` until the {@apilink PeerEvents | `open`} event is emitted.\n\t */\n\tget id() {\n\t\treturn this._id;\n\t}\n\n\tget options() {\n\t\treturn this._options;\n\t}\n\n\tget open() {\n\t\treturn this._open;\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tget socket() {\n\t\treturn this._socket;\n\t}\n\n\t/**\n\t * A hash of all connections associated with this peer, keyed by the remote peer's ID.\n\t * @deprecated\n\t * Return type will change from Object to Map<string,[]>\n\t */\n\tget connections(): Object {\n\t\tconst plainConnections = Object.create(null);\n\n\t\tfor (const [k, v] of this._connections) {\n\t\t\tplainConnections[k] = v;\n\t\t}\n\n\t\treturn plainConnections;\n\t}\n\n\t/**\n\t * true if this peer and all of its connections can no longer be used.\n\t */\n\tget destroyed() {\n\t\treturn this._destroyed;\n\t}\n\t/**\n\t * false if there is an active connection to the PeerServer.\n\t */\n\tget disconnected() {\n\t\treturn this._disconnected;\n\t}\n\n\t/**\n\t * A peer can connect to other peers and listen for connections.\n\t */\n\tconstructor();\n\n\t/**\n\t * A peer can connect to other peers and listen for connections.\n\t * @param options for specifying details about PeerServer\n\t */\n\tconstructor(options: PeerOptions);\n\n\t/**\n\t * A peer can connect to other peers and listen for connections.\n\t * @param id Other peers can connect to this peer using the provided ID.\n\t * If no ID is given, one will be generated by the brokering server.\n\t * The ID must start and end with an alphanumeric character (lower or upper case character or a digit). In the middle of the ID spaces, dashes (-) and underscores (_) are allowed. Use {@apilink PeerOptions.metadata } to send identifying information.\n\t * @param options for specifying details about PeerServer\n\t */\n\tconstructor(id: string, options?: PeerOptions);\n\n\tconstructor(id?: string | PeerOptions, options?: PeerOptions) {\n\t\tsuper();\n\n\t\tlet userId: string | undefined;\n\n\t\t// Deal with overloading\n\t\tif (id && id.constructor == Object) {\n\t\t\toptions = id as PeerOptions;\n\t\t} else if (id) {\n\t\t\tuserId = id.toString();\n\t\t}\n\n\t\t// Configurize options\n\t\toptions = {\n\t\t\tdebug: 0, // 1: Errors, 2: Warnings, 3: All logs\n\t\t\thost: util.CLOUD_HOST,\n\t\t\tport: util.CLOUD_PORT,\n\t\t\tpath: \"/\",\n\t\t\tkey: Peer.DEFAULT_KEY,\n\t\t\ttoken: util.randomToken(),\n\t\t\tconfig: util.defaultConfig,\n\t\t\treferrerPolicy: \"strict-origin-when-cross-origin\",\n\t\t\t...options,\n\t\t};\n\t\tthis._options = options;\n\n\t\t// Detect relative URL host.\n\t\tif (this._options.host === \"/\") {\n\t\t\tthis._options.host = window.location.hostname;\n\t\t}\n\n\t\t// Set path correctly.\n\t\tif (this._options.path) {\n\t\t\tif (this._options.path[0] !== \"/\") {\n\t\t\t\tthis._options.path = \"/\" + this._options.path;\n\t\t\t}\n\t\t\tif (this._options.path[this._options.path.length - 1] !== \"/\") {\n\t\t\t\tthis._options.path += \"/\";\n\t\t\t}\n\t\t}\n\n\t\t// Set whether we use SSL to same as current host\n\t\tif (\n\t\t\tthis._options.secure === undefined &&\n\t\t\tthis._options.host !== util.CLOUD_HOST\n\t\t) {\n\t\t\tthis._options.secure = util.isSecure();\n\t\t} else if (this._options.host == util.CLOUD_HOST) {\n\t\t\tthis._options.secure = true;\n\t\t}\n\t\t// Set a custom log function if present\n\t\tif (this._options.logFunction) {\n\t\t\tlogger.setLogFunction(this._options.logFunction);\n\t\t}\n\n\t\tlogger.logLevel = this._options.debug || 0;\n\n\t\tthis._api = new API(options);\n\t\tthis._socket = this._createServerConnection();\n\n\t\t// Sanity checks\n\t\t// Ensure WebRTC supported\n\t\tif (!util.supports.audioVideo && !util.supports.data) {\n\t\t\tthis._delayedAbort(\n\t\t\t\tPeerErrorType.BrowserIncompatible,\n\t\t\t\t\"The current browser does not support WebRTC\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Ensure alphanumeric id\n\t\tif (!!userId && !util.validateId(userId)) {\n\t\t\tthis._delayedAbort(PeerErrorType.InvalidID, `ID \"${userId}\" is invalid`);\n\t\t\treturn;\n\t\t}\n\n\t\tif (userId) {\n\t\t\tthis._initialize(userId);\n\t\t} else {\n\t\t\tthis._api\n\t\t\t\t.retrieveId()\n\t\t\t\t.then((id) => this._initialize(id))\n\t\t\t\t.catch((error) => this._abort(PeerErrorType.ServerError, error));\n\t\t}\n\t}\n\n\tprivate _createServerConnection(): Socket {\n\t\tconst socket = new Socket(\n\t\t\tthis._options.secure,\n\t\t\tthis._options.host!,\n\t\t\tthis._options.port!,\n\t\t\tthis._options.path!,\n\t\t\tthis._options.key!,\n\t\t\tthis._options.pingInterval,\n\t\t);\n\n\t\tsocket.on(SocketEventType.Message, (data: ServerMessage) => {\n\t\t\tthis._handleMessage(data);\n\t\t});\n\n\t\tsocket.on(SocketEventType.Error, (error: string) => {\n\t\t\tthis._abort(PeerErrorType.SocketError, error);\n\t\t});\n\n\t\tsocket.on(SocketEventType.Disconnected, () => {\n\t\t\tif (this.disconnected) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.emitError(PeerErrorType.Network, \"Lost connection to server.\");\n\t\t\tthis.disconnect();\n\t\t});\n\n\t\tsocket.on(SocketEventType.Close, () => {\n\t\t\tif (this.disconnected) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._abort(\n\t\t\t\tPeerErrorType.SocketClosed,\n\t\t\t\t\"Underlying socket is already closed.\",\n\t\t\t);\n\t\t});\n\n\t\treturn socket;\n\t}\n\n\t/** Initialize a connection with the server. */\n\tprivate _initialize(id: string): void {\n\t\tthis._id = id;\n\t\tthis.socket.start(id, this._options.token!);\n\t}\n\n\t/** Handles messages from the server. */\n\tprivate _handleMessage(message: ServerMessage): void {\n\t\tconst type = message.type;\n\t\tconst payload = message.payload;\n\t\tconst peerId = message.src;\n\n\t\tswitch (type) {\n\t\t\tcase ServerMessageType.Open: // The connection to the server is open.\n\t\t\t\tthis._lastServerId = this.id;\n\t\t\t\tthis._open = true;\n\t\t\t\tthis.emit(\"open\", this.id);\n\t\t\t\tbreak;\n\t\t\tcase ServerMessageType.Error: // Server error.\n\t\t\t\tthis._abort(PeerErrorType.ServerError, payload.msg);\n\t\t\t\tbreak;\n\t\t\tcase ServerMessageType.IdTaken: // The selected ID is taken.\n\t\t\t\tthis._abort(PeerErrorType.UnavailableID, `ID \"${this.id}\" is taken`);\n\t\t\t\tbreak;\n\t\t\tcase ServerMessageType.InvalidKey: // The given API key cannot be found.\n\t\t\t\tthis._abort(\n\t\t\t\t\tPeerErrorType.InvalidKey,\n\t\t\t\t\t`API KEY \"${this._options.key}\" is invalid`,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase ServerMessageType.Leave: // Another peer has closed its connection to this peer.\n\t\t\t\tlogger.log(`Received leave message from ${peerId}`);\n\t\t\t\tthis._cleanupPeer(peerId);\n\t\t\t\tthis._connections.delete(peerId);\n\t\t\t\tbreak;\n\t\t\tcase ServerMessageType.Expire: // The offer sent to a peer has expired without response.\n\t\t\t\tthis.emitError(\n\t\t\t\t\tPeerErrorType.PeerUnavailable,\n\t\t\t\t\t`Could not connect to peer ${peerId}`,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase ServerMessageType.Offer: {\n\t\t\t\t// we should consider switching this to CALL/CONNECT, but this is the least breaking option.\n\t\t\t\tconst connectionId = payload.connectionId;\n\t\t\t\tlet connection = this.getConnection(peerId, connectionId);\n\n\t\t\t\tif (connection) {\n\t\t\t\t\tconnection.close();\n\t\t\t\t\tlogger.warn(\n\t\t\t\t\t\t`Offer received for existing Connection ID:${connectionId}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Create a new connection.\n\t\t\t\tif (payload.type === ConnectionType.Media) {\n\t\t\t\t\tconst mediaConnection = new MediaConnection(peerId, this, {\n\t\t\t\t\t\tconnectionId: connectionId,\n\t\t\t\t\t\t_payload: payload,\n\t\t\t\t\t\tmetadata: payload.metadata,\n\t\t\t\t\t});\n\t\t\t\t\tconnection = mediaConnection;\n\t\t\t\t\tthis._addConnection(peerId, connection);\n\t\t\t\t\tthis.emit(\"call\", mediaConnection);\n\t\t\t\t} else if (payload.type === ConnectionType.Data) {\n\t\t\t\t\tconst dataConnection = new DataConnection(peerId, this, {\n\t\t\t\t\t\tconnectionId: connectionId,\n\t\t\t\t\t\t_payload: payload,\n\t\t\t\t\t\tmetadata: payload.metadata,\n\t\t\t\t\t\tlabel: payload.label,\n\t\t\t\t\t\tserialization: payload.serialization,\n\t\t\t\t\t\treliable: payload.reliable,\n\t\t\t\t\t});\n\t\t\t\t\tconnection = dataConnection;\n\t\t\t\t\tthis._addConnection(peerId, connection);\n\t\t\t\t\tthis.emit(\"connection\", dataConnection);\n\t\t\t\t} else {\n\t\t\t\t\tlogger.warn(`Received malformed connection type:${payload.type}`);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Find messages.\n\t\t\t\tconst messages = this._getMessages(connectionId);\n\t\t\t\tfor (const message of messages) {\n\t\t\t\t\tconnection.handleMessage(message);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tif (!payload) {\n\t\t\t\t\tlogger.warn(\n\t\t\t\t\t\t`You received a malformed message from ${peerId} of type ${type}`,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst connectionId = payload.connectionId;\n\t\t\t\tconst connection = this.getConnection(peerId, connectionId);\n\n\t\t\t\tif (connection && connection.peerConnection) {\n\t\t\t\t\t// Pass it on.\n\t\t\t\t\tconnection.handleMessage(message);\n\t\t\t\t} else if (connectionId) {\n\t\t\t\t\t// Store for possible later use\n\t\t\t\t\tthis._storeMessage(connectionId, message);\n\t\t\t\t} else {\n\t\t\t\t\tlogger.warn(\"You received an unrecognized message:\", message);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Stores messages without a set up connection, to be claimed later. */\n\tprivate _storeMessage(connectionId: string, message: ServerMessage): void {\n\t\tif (!this._lostMessages.has(connectionId)) {\n\t\t\tthis._lostMessages.set(connectionId, []);\n\t\t}\n\n\t\tthis._lostMessages.get(connectionId).push(message);\n\t}\n\n\t/**\n\t * Retrieve messages from lost message store\n\t * @internal\n\t */\n\t//TODO Change it to private\n\tpublic _getMessages(connectionId: string): ServerMessage[] {\n\t\tconst messages = this._lostMessages.get(connectionId);\n\n\t\tif (messages) {\n\t\t\tthis._lostMessages.delete(connectionId);\n\t\t\treturn messages;\n\t\t}\n\n\t\treturn [];\n\t}\n\n\t/**\n\t * Connects to the remote peer specified by id and returns a data connection.\n\t * @param peer The brokering ID of the remote peer (their {@apilink Peer.id}).\n\t * @param options for specifying details about Peer Connection\n\t */\n\tconnect(peer: string, options: PeerConnectOption = {}): DataConnection {\n\t\tif (this.disconnected) {\n\t\t\tlogger.warn(\n\t\t\t\t\"You cannot connect to a new Peer because you called \" +\n\t\t\t\t\t\".disconnect() on this Peer and ended your connection with the \" +\n\t\t\t\t\t\"server. You can create a new Peer to reconnect, or call reconnect \" +\n\t\t\t\t\t\"on this peer if you believe its ID to still be available.\",\n\t\t\t);\n\t\t\tthis.emitError(\n\t\t\t\tPeerErrorType.Disconnected,\n\t\t\t\t\"Cannot connect to new Peer after disconnecting from server.\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst dataConnection = new DataConnection(peer, this, options);\n\t\tthis._addConnection(peer, dataConnection);\n\t\treturn dataConnection;\n\t}\n\n\t/**\n\t * Calls the remote peer specified by id and returns a media connection.\n\t * @param peer The brokering ID of the remote peer (their peer.id).\n\t * @param stream The caller's media stream\n\t * @param options Metadata associated with the connection, passed in by whoever initiated the connection.\n\t */\n\tcall(\n\t\tpeer: string,\n\t\tstream: MediaStream,\n\t\toptions: CallOption = {},\n\t): MediaConnection {\n\t\tif (this.disconnected) {\n\t\t\tlogger.warn(\n\t\t\t\t\"You cannot connect to a new Peer because you called \" +\n\t\t\t\t\t\".disconnect() on this Peer and ended your connection with the \" +\n\t\t\t\t\t\"server. You can create a new Peer to reconnect.\",\n\t\t\t);\n\t\t\tthis.emitError(\n\t\t\t\tPeerErrorType.Disconnected,\n\t\t\t\t\"Cannot connect to new Peer after disconnecting from server.\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!stream) {\n\t\t\tlogger.error(\n\t\t\t\t\"To call a peer, you must provide a stream from your browser's `getUserMedia`.\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst mediaConnection = new MediaConnection(peer, this, {\n\t\t\t...options,\n\t\t\t_stream: stream,\n\t\t});\n\t\tthis._addConnection(peer, mediaConnection);\n\t\treturn mediaConnection;\n\t}\n\n\t/** Add a data/media connection to this peer. */\n\tprivate _addConnection(\n\t\tpeerId: string,\n\t\tconnection: MediaConnection | DataConnection,\n\t): void {\n\t\tlogger.log(\n\t\t\t`add connection ${connection.type}:${connection.connectionId} to peerId:${peerId}`,\n\t\t);\n\n\t\tif (!this._connections.has(peerId)) {\n\t\t\tthis._connections.set(peerId, []);\n\t\t}\n\t\tthis._connections.get(peerId).push(connection);\n\t}\n\n\t//TODO should be private\n\t_removeConnection(connection: DataConnection | MediaConnection): void {\n\t\tconst connections = this._connections.get(connection.peer);\n\n\t\tif (connections) {\n\t\t\tconst index = connections.indexOf(connection);\n\n\t\t\tif (index !== -1) {\n\t\t\t\tconnections.splice(index, 1);\n\t\t\t}\n\t\t}\n\n\t\t//remove from lost messages\n\t\tthis._lostMessages.delete(connection.connectionId);\n\t}\n\n\t/** Retrieve a data/media connection for this peer. */\n\tgetConnection(\n\t\tpeerId: string,\n\t\tconnectionId: string,\n\t): null | DataConnection | MediaConnection {\n\t\tconst connections = this._connections.get(peerId);\n\t\tif (!connections) {\n\t\t\treturn null;\n\t\t}\n\n\t\tfor (const connection of connections) {\n\t\t\tif (connection.connectionId === connectionId) {\n\t\t\t\treturn connection;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate _delayedAbort(type: PeerErrorType, message: string | Error): void {\n\t\tsetTimeout(() => {\n\t\t\tthis._abort(type, message);\n\t\t}, 0);\n\t}\n\n\t/**\n\t * Emits an error message and destroys the Peer.\n\t * The Peer is not destroyed if it's in a disconnected state, in which case\n\t * it retains its disconnected state and its existing connections.\n\t */\n\tprivate _abort(type: PeerErrorType, message: string | Error): void {\n\t\tlogger.error(\"Aborting!\");\n\n\t\tthis.emitError(type, message);\n\n\t\tif (!this._lastServerId) {\n\t\t\tthis.destroy();\n\t\t} else {\n\t\t\tthis.disconnect();\n\t\t}\n\t}\n\n\t/** Emits a typed error message. */\n\temitError(type: PeerErrorType, err: string | Error): void {\n\t\tlogger.error(\"Error:\", err);\n\n\t\tthis.emit(\"error\", new PeerError(type, err));\n\t}\n\n\t/**\n\t * Destroys the Peer: closes all active connections as well as the connection\n\t * to the server.\n\t *\n\t * :::caution\n\t * This cannot be undone; the respective peer object will no longer be able\n\t * to create or receive any connections, its ID will be forfeited on the server,\n\t * and all of its data and media connections will be closed.\n\t * :::\n\t */\n\tdestroy(): void {\n\t\tif (this.destroyed) {\n\t\t\treturn;\n\t\t}\n\n\t\tlogger.log(`Destroy peer with ID:${this.id}`);\n\n\t\tthis.disconnect();\n\t\tthis._cleanup();\n\n\t\tthis._destroyed = true;\n\n\t\tthis.emit(\"close\");\n\t}\n\n\t/** Disconnects every connection on this peer. */\n\tprivate _cleanup(): void {\n\t\tfor (const peerId of this._connections.keys()) {\n\t\t\tthis._cleanupPeer(peerId);\n\t\t\tthis._connections.delete(peerId);\n\t\t}\n\n\t\tthis.socket.removeAllListeners();\n\t}\n\n\t/** Closes all connections to this peer. */\n\tprivate _cleanupPeer(peerId: string): void {\n\t\tconst connections = this._connections.get(peerId);\n\n\t\tif (!connections) return;\n\n\t\tfor (const connection of connections) {\n\t\t\tconnection.close();\n\t\t}\n\t}\n\n\t/**\n\t * Disconnects the Peer's connection to the PeerServer. Does not close any\n\t * active connections.\n\t * Warning: The peer can no longer create or accept connections after being\n\t * disconnected. It also cannot reconnect to the server.\n\t */\n\tdisconnect(): void {\n\t\tif (this.disconnected) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentId = this.id;\n\n\t\tlogger.log(`Disconnect peer with ID:${currentId}`);\n\n\t\tthis._disconnected = true;\n\t\tthis._open = false;\n\n\t\tthis.socket.close();\n\n\t\tthis._lastServerId = currentId;\n\t\tthis._id = null;\n\n\t\tthis.emit(\"disconnected\", currentId);\n\t}\n\n\t/** Attempts to reconnect with the same ID.\n\t *\n\t * Only {@apilink Peer.disconnect | disconnected peers} can be reconnected.\n\t * Destroyed peers cannot be reconnected.\n\t * If the connection fails (as an example, if the peer's old ID is now taken),\n\t * the peer's existing connections will not close, but any associated errors events will fire.\n\t */\n\treconnect(): void {\n\t\tif (this.disconnected && !this.destroyed) {\n\t\t\tlogger.log(\n\t\t\t\t`Attempting reconnection to server with ID ${this._lastServerId}`,\n\t\t\t);\n\t\t\tthis._disconnected = false;\n\t\t\tthis._initialize(this._lastServerId!);\n\t\t} else if (this.destroyed) {\n\t\t\tthrow new Error(\n\t\t\t\t\"This peer cannot reconnect to the server. It has already been destroyed.\",\n\t\t\t);\n\t\t} else if (!this.disconnected && !this.open) {\n\t\t\t// Do nothing. We're still connecting the first time.\n\t\t\tlogger.error(\n\t\t\t\t\"In a hurry? We're still trying to make the initial connection!\",\n\t\t\t);\n\t\t} else {\n\t\t\tthrow new Error(\n\t\t\t\t`Peer ${this.id} cannot reconnect because it is not disconnected from the server!`,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Get a list of available peer IDs. If you're running your own server, you'll\n\t * want to set allow_discovery: true in the PeerServer options. If you're using\n\t * the cloud server, email team@peerjs.com to get the functionality enabled for\n\t * your key.\n\t */\n\tlistAllPeers(cb = (_: any[]) => {}): void {\n\t\tthis._api\n\t\t\t.listAllPeers()\n\t\t\t.then((peers) => cb(peers))\n\t\t\t.catch((error) => this._abort(PeerErrorType.ServerError, error));\n\t}\n}\n","import { util } from \"./util\";\nimport { Peer } from \"./peer\";\n\n(<any>window).peerjs = {\n\tPeer,\n\tutil,\n};\n/** @deprecated Should use peerjs namespace */\n(<any>window).Peer = Peer;\n"],"names":["$c515e01f1e58cfc5$export$509f631d27be0664","$c515e01f1e58cfc5$export$562ca14a3ed92113","$cad70b812f66c965$export$2e2bcd8739ae039","obj","constructor","Symbol","$c515e01f1e58cfc5$var$binaryFeatures","useBlobBuilder","Blob","e","useArrayBufferView","Uint8Array","size","$c515e01f1e58cfc5$var$BlobBuilder","$c515e01f1e58cfc5$var$BufferBuilder","this","_pieces","_parts","window","WebKitBlobBuilder","MozBlobBuilder","MSBlobBuilder","BlobBuilder","prototype","append","data","push","flush","length","buf","buffer","getBuffer","builder","i","ii","getBlob","$14909bd5edcbef98$var$Unpacker","index","dataBuffer","dataView","byteLength","$14909bd5edcbef98$var$Packer","bufferBuilder","$14909bd5edcbef98$require$BufferBuilder","$14909bd5edcbef98$var$_utf8Replace","m","code","codePointAt","$f45b8b391889f698$export$2e2bcd8739ae039","key","value","Object","defineProperty","enumerable","configurable","writable","$14909bd5edcbef98$exports","unpack","pack","packer","type","unpack_uint8","unpack_raw","unpack_string","unpack_array","unpack_map","unpack_float","unpack_double","unpack_uint16","unpack_uint32","unpack_uint64","unpack_int8","unpack_int16","unpack_int32","unpack_int64","_byte","bytes","read","uint16","uint32","uint64","uint8","Math","pow","Error","slice","c","str","String","fromCodePoint","objects","Array","map","exp","h32","l32","j","subarray","pack_string","floor","pack_integer","pack_double","pack_array","File","pack_bin","ArrayBuffer","$14909bd5edcbef98$require$binaryFeatures","toString","startsWith","pack_object","Date","toBinaryPack","blob","pack_uint8","pack_uint16","pack_uint32","replace","$14909bd5edcbef98$var$utf8Length","ary","num","pack_int8","pack_int16","pack_int32","pack_int64","pack_uint64","sign","log","LN2","frac0","frac1","b32","keys","prop","hasOwnProperty","n","high","low","$3ad24411f40effab$var$logDisabled_","$3ad24411f40effab$var$deprecationWarnings_","$3ad24411f40effab$export$e3c02be309be1f23","uastring","expr","pos","match","parseInt","$3ad24411f40effab$export$1f48841962b828b1","window1","eventNameToWrap","wrapper","RTCPeerConnection","proto","nativeAddEventListener","addEventListener","nativeEventName","cb","apply","arguments","wrappedCallback","modifiedEvent","handleEvent","_eventMap","Map","set","nativeRemoveEventListener","removeEventListener","has","unwrappedCb","get","$3ad24411f40effab$export$afbfee8cc06fd3e4","bool","$3ad24411f40effab$export$51516be4b019e41e","$3ad24411f40effab$export$bef1f36f5486a6a3","console","$3ad24411f40effab$export$cdd73fc4100a6ef4","oldMethod","newMethod","warn","$3ad24411f40effab$var$isObject","val","call","$3ad24411f40effab$export$15384eac40dc88c8","reduce","accumulator","isObj","isEmptyObject","undefined","assign","$3ad24411f40effab$export$571b373e75babb58","stats","base","resultSet","id","forEach","name","endsWith","$3ad24411f40effab$export$93439ffc3f787d51","result","track","outbound","streamStatsType","filteredResult","trackStats","trackIdentifier","trackStat","trackId","$54bd48c052a5912b$export$2e2bcd8739ae039","arr","isArray","$222d9e604fb85e89$export$2e2bcd8739ae039","iter","iterator","from","$2327522034b424cf$export$2e2bcd8739ae039","TypeError","$392d44f3d76cb68d$export$2e2bcd8739ae039","len","arr2","$3b3df927e895a103$export$2e2bcd8739ae039","o","minLen","test","$868b7bbd05aba6a5$export$2e2bcd8739ae039","$44d724c26ac3bf00$var$logging","$44d724c26ac3bf00$export$1ed4910f4d37dc5e","browserDetails","navigator","mediaDevices","constraintsToChrome_","mandatory","optional","cc","r","ideal","exact","min","max","oldname_","prefix","charAt","toUpperCase","oc","mix","advanced","concat","shimConstraints_","constraints","func","version","JSON","parse","stringify","audio","remap","a","b","video","face","facingMode","matches","getSupportedFacingModeLies","getSupportedConstraints","enumerateDevices","then","devices","dev","filter","d","kind","find","some","label","toLowerCase","includes","deviceId","shimError_","PermissionDeniedError","PermissionDismissedError","InvalidStateError","DevicesNotFoundError","ConstraintNotSatisfiedError","TrackStartError","MediaDeviceFailedDueToShutdown","MediaDeviceKillSwitchOn","TabCaptureError","ScreenCaptureError","DeviceCaptureError","message","constraint","constraintName","getUserMedia","onSuccess","onError","webkitGetUserMedia","bind","origGetUserMedia","cs","stream","getAudioTracks","getVideoTracks","getTracks","stop","DOMException","Promise","reject","$780004c22528a281$export$97270b87351d9c04","getSourceId","getDisplayMedia","sourceId","widthSpecified","width","heightSpecified","height","frameRateSpecified","frameRate","chromeMediaSource","chromeMediaSourceId","maxFrameRate","maxWidth","maxHeight","error","$5bbc2afa3b7f8fdc$export$33ee24e7a300bcd1","MediaStream","webkitMediaStream","$5bbc2afa3b7f8fdc$export$f358708f68ab068","_ontrack","f","origSetRemoteDescription","setRemoteDescription","_ontrackpoly","te","receiver","getReceivers","_this","event","Event","transceiver","streams","dispatchEvent","$5bbc2afa3b7f8fdc$export$a41a030a2842f5d6","shimSenderWithDtmf","pc","dtmf","_dtmf","createDTMFSender","_pc","getSenders","_senders","origAddTrack","addTrack","sender","origRemoveTrack","removeTrack","idx","indexOf","splice","origAddStream","addStream","origRemoveStream","removeStream","s","RTCRtpSender","origGetSenders","senders","$5bbc2afa3b7f8fdc$export$90608323826f0b17","origGetStats","getStats","_arguments","selector","onSucc","onErr","fixChromeStats_","response","standardReport","report","standardStats","timestamp","localcandidate","remotecandidate","names","stat","makeMapStats","resolve","$5bbc2afa3b7f8fdc$export$f2f0f2338114eb4b","RTCRtpReceiver","origGetReceivers","receivers","srcElement","MediaStreamTrack","err","$5bbc2afa3b7f8fdc$export$30e3cdd46f8d5100","getLocalStreams","_shimmedLocalStreams","streamId","existingSenders","newSenders","newSender","$5bbc2afa3b7f8fdc$export$9588259fcf4ebc91","replaceInternalStreamId","description","sdp","_reverseStreams","internalId","externalStream","internalStream","_streams","RegExp","RTCSessionDescription","replaceExternalStreamId","origGetLocalStreams","nativeStreams","newStream","signalingState","t","oldStream","method","nativeMethod","methodObj","args","desc","origSetLocalDescription","setLocalDescription","origLocalDescription","getOwnPropertyDescriptor","streamid","$5bbc2afa3b7f8fdc$export$852a08dda9a55ea7","webkitRTCPeerConnection","RTCIceCandidate","$5bbc2afa3b7f8fdc$export$341293bbeaae37cb","target","getConfiguration","sdpSemantics","$e18b9fd686d955b6$export$2e2bcd8739ae039","$32ebd230187cdc07$export$2e2bcd8739ae039","$d9e2d283d71d31cd$export$2e2bcd8739ae039","$617de8ce5e656e6a$export$1ed4910f4d37dc5e","nativeGetUserMedia","getSettings","nativeGetSettings","applyConstraints","nativeApplyConstraints","$d450e45a0fa9ff70$export$97270b87351d9c04","preferredMediaSource","mediaSource","$748ea3f175d41f0d$export$f358708f68ab068","RTCTrackEvent","$748ea3f175d41f0d$export$852a08dda9a55ea7","mozRTCPeerConnection","modernStatsTypes","inboundrtp","outboundrtp","candidatepair","nativeGetStats","$748ea3f175d41f0d$export$f0525502095c04ef","$748ea3f175d41f0d$export$83d69126527b1171","$748ea3f175d41f0d$export$825e523ef749bd8c","$748ea3f175d41f0d$export$ff9cb3bc8990e8f7","DataChannel","RTCDataChannel","$748ea3f175d41f0d$export$70c77533b6e9908d","origAddTransceiver","addTransceiver","setParametersPromises","sendEncodings","shouldPerformCheck","encodingParam","rid","parseFloat","scaleResolutionDownBy","RangeError","maxFramerate","params","getParameters","encodings","setParameters","$748ea3f175d41f0d$export$66238223c298fbaa","origGetParameters","$748ea3f175d41f0d$export$51beccf0e777b843","origCreateOffer","createOffer","all","$748ea3f175d41f0d$export$df0b46e7cef08150","origCreateAnswer","createAnswer","$b6191fc5d41a5274$export$8df41282f4fdcea2","_localStreams","_addTrack","_len","_key","tracks","$b6191fc5d41a5274$export$762aa4cbb4f2f857","getRemoteStreams","_remoteStreams","_onaddstream","_onaddstreampoly","$b6191fc5d41a5274$export$da31df245debdd3","addIceCandidate","successCallback","failureCallback","options","promise","withCallback","candidate","$b6191fc5d41a5274$export$1ed4910f4d37dc5e","_getUserMedia","$b6191fc5d41a5274$export$494a01ac68ba81ac","errcb","$b6191fc5d41a5274$export$671a8b47b41b6f41","OrigPeerConnection","pcConfig","pcConstraints","iceServers","newIceServers","server","urls","url","generateCertificate","$b6191fc5d41a5274$export$85d53da088cb1b14","$b6191fc5d41a5274$export$d444266503fdd2d4","offerOptions","offerToReceiveAudio","audioTransceiver","getTransceivers","direction","setDirection","offerToReceiveVideo","videoTransceiver","$b6191fc5d41a5274$export$857cd739a7b795d2","AudioContext","webkitAudioContext","$8107c97ca10aeebe$var$SDPUtils","$b89b79134adc8918$export$cf133661e444ccfe","NativeRTCIceCandidate","substring","nativeCandidate","parsedCandidate","$parcel$interopDefault","$8107c97ca10aeebe$exports","parseCandidate","augmentedCandidate","toJSON","sdpMid","sdpMLineIndex","usernameFragment","$b89b79134adc8918$export$fdafb8d8280e29b5","relayProtocol","priority","$b89b79134adc8918$export$a99147c78a56edc4","_sctp","sctpInDescription","sections","splitSections","shift","mediaSection","mLine","parseMLine","protocol","getRemoteFirefoxVersion","getCanSendMaxMessageSize","remoteIsFirefox","canSendMaxMessageSize","browser","getMaxMessageSize","maxMessageSize","matchPrefix","isFirefox","canSendMMS","remoteMMS","Number","POSITIVE_INFINITY","sctp","$b89b79134adc8918$export$d461c8d5c5db5da7","wrapDcSend","dc","origDataChannelSend","send","readyState","origCreateDataChannel","createDataChannel","dataChannel","channel","$b89b79134adc8918$export$63bb816cc75460","completed","checking","iceConnectionState","_onconnectionstatechange","origMethod","_connectionstatechangepoly","_lastConnectionState","connectionState","newEvent","$b89b79134adc8918$export$a57d114344295149","nativeSRD","split","line","trim","join","$b89b79134adc8918$export$51d5e40b48c771c7","nativeAddIceCandidate","$b89b79134adc8918$export$7170d04e59f9d553","nativeSetLocalDescription","generateIdentifier","random","localCName","splitLines","part","getDescription","getMediaSections","parts","foundation","component","ip","address","port","relatedAddress","relatedPort","tcpType","ufrag","writeCandidate","parseIceOptions","parseRtpMap","parsed","payloadType","clockRate","channels","numChannels","writeRtpMap","codec","pt","preferredPayloadType","parseExtmap","uri","attributes","writeExtmap","headerExtension","preferredId","parseFmtp","kv","writeFmtp","parameters","param","parseRtcpFb","parameter","writeRtcpFb","lines","rtcpFeedback","fb","parseSsrcMedia","sp","ssrc","colon","attribute","parseSsrcGroup","semantics","ssrcs","getMid","mid","parseFingerprint","algorithm","getDtlsParameters","sessionpart","role","fingerprints","writeDtlsParameters","setupType","fp","parseCryptoLine","tag","cryptoSuite","keyParams","sessionParams","writeCryptoLine","writeCryptoKeyParams","parseCryptoKeyParams","keyMethod","keySalt","lifeTime","mkiValue","mkiLength","getCryptoParameters","getIceParameters","pwd","password","writeIceParameters","iceLite","parseRtpParameters","codecs","headerExtensions","fecMechanisms","rtcp","mline","profile","rtpmapline","fmtps","wildcardRtcpFb","existingFeedback","writeRtpDescription","caps","maxptime","extension","parseRtpEncodingParameters","secondarySsrc","encodingParameters","hasRed","hasUlpfec","primarySsrc","flows","apt","encParam","codecPayloadType","rtx","fec","mechanism","bandwidth","maxBitrate","parseRtcpParameters","rtcpParameters","remoteSsrc","cname","rsize","reducedSize","compound","mux","writeRtcpParameters","parseMsid","spec","planB","msidParts","parseSctpDescription","maxSizeLine","isNaN","sctpPort","fmt","sctpMapLines","writeSctpDescription","media","output","generateSessionId","substr","writeSessionBoilerplate","sessId","sessVer","sessUser","getDirection","getKind","isRejected","parseOLine","username","sessionId","sessionVersion","netType","addressType","isValidSDP","class_1","Util","$fbdf9bd273a82fe8$var$adapter","shimChrome","shimFirefox","shimSafari","logging","mozGetUserMedia","userAgent","isSecureContext","supportsUnifiedPlan","RTCRtpTransceiver","$3ad24411f40effab$export$2d31490a0c05f094","adapter","commonShim","$b89b79134adc8918$exports","extractVersion","disableLog","disableWarnings","$5bbc2afa3b7f8fdc$exports","shimPeerConnection","browserShim","shimAddIceCandidateNullOrEmpty","shimParameterlessSetLocalDescription","shimGetUserMedia","shimMediaStream","shimOnTrack","shimAddTrackRemoveTrack","shimGetSendersWithDtmf","shimGetStats","shimSenderReceiverGetStats","fixNegotiationNeeded","shimRTCIceCandidate","shimRTCIceCandidateRelayProtocol","shimConnectionState","shimMaxMessageSize","shimSendThrowTypeError","removeExtmapAllowMixed","$748ea3f175d41f0d$exports","shimRemoveStream","shimSenderGetStats","shimReceiverGetStats","shimRTCDataChannel","shimAddTransceiver","shimGetParameters","shimCreateOffer","shimCreateAnswer","$b6191fc5d41a5274$exports","shimRTCIceServerUrls","shimCreateOfferLegacy","shimCallbacksAPI","shimLocalStreamsAPI","shimRemoteStreamsAPI","shimTrackEventTransceiver","shimAudioContext","$fbdf9bd273a82fe8$export$2e2bcd8739ae039","$f841a8b87fb6ac24$var$webRTCAdapter","$f841a8b87fb6ac24$export$25be9502477c137d","isIOS","platform","supportedBrowsers","minFirefoxVersion","minChromeVersion","minSafariVersion","isWebRTCSupported","isBrowserSupported","getBrowser","getVersion","isUnifiedPlanSupported","tempPc","supported","close","$f757f3c8d0165d99$var$DEFAULT_CONFIG","credential","$f757f3c8d0165d99$export$7debb50ef11d5e0b","CLOUD_HOST","CLOUD_PORT","chunkedBrowsers","Chrome","chrome","chunkedMTU","defaultConfig","browserVersion","supports","webRTC","audioVideo","binaryBlob","reliable","ordered","binaryType","_dataCount","noop","validateId","chunk","chunks","total","ceil","start","end","__peerData","blobToArrayBuffer","fr","FileReader","onload","evt","readAsArrayBuffer","binaryStringToArrayBuffer","binary","byteArray","charCodeAt","randomToken","isSecure","location","$3de168c90676f763$var$has","$3de168c90676f763$var$prefix","$3de168c90676f763$var$Events","$3de168c90676f763$var$EE","fn","context","once","$3de168c90676f763$var$addListener","emitter","listener","_events","_eventsCount","$3de168c90676f763$var$clearEvent","$3de168c90676f763$var$EventEmitter","create","__proto__","eventNames","events","getOwnPropertySymbols","listeners","handlers","l","ee","listenerCount","emit","a1","a2","a3","a4","a5","removeListener","on","removeAllListeners","off","addListener","prefixed","EventEmitter","$3de168c90676f763$exports","$9bbf2ea0cc6b205f$export$243e62d78d3b544d","LogLevel","$9bbf2ea0cc6b205f$var$LOG_PREFIX","Logger","$d6c2a8209e782f8f$export$3157d57b4135e3bc","ConnectionType","$d6c2a8209e782f8f$export$9547aaa2e39030ff","PeerErrorType","$d6c2a8209e782f8f$export$89f507cf986a947","SerializationType","$d6c2a8209e782f8f$export$3b5c4a4b6354f023","SocketEventType","$d6c2a8209e782f8f$export$adb4a1754da6f10d","ServerMessageType","$9bbf2ea0cc6b205f$var$Logger","_logLevel","Disabled","logLevel","_i","All","_print","$9bbf2ea0cc6b205f$var$__spreadArray","$9bbf2ea0cc6b205f$var$__read","Warnings","Errors","setLogFunction","rest","copy","$9bbf2ea0cc6b205f$export$2e2bcd8739ae039","$705e5a186df75920$exports","_super","Socket","$58b7c29ff2b02b44$export$4798917dbf149b79","$58b7c29ff2b02b44$var$__extends","secure","host","path","pingInterval","_disconnected","_messagesQueue","wsProtocol","_baseUrl","token","_id","wsUrl","_socket","WebSocket","onmessage","$9bbf2ea0cc6b205f$exports","default","Message","onclose","_cleanup","Disconnected","onopen","_sendQueuedMessages","_scheduleHeartbeat","_wsPingTimer","setTimeout","_sendHeartbeat","_wsOpen","Heartbeat","copiedQueue","$58b7c29ff2b02b44$var$__spreadArray","$58b7c29ff2b02b44$var$__read","copiedQueue_1","$58b7c29ff2b02b44$var$__values","copiedQueue_1_1","next","done","clearTimeout","Negotiator","$888ebbf5208563e2$export$89e6bb5ad64bf4a","connection","startConnection","peerConnection","_startPeerConnection","Media","_stream","_addTracksToConnection","originator","Data","dataConnection","config","initialize","_makeOffer","handleSDP","provider","_setupListeners","peerId","peer","connectionId","connectionType","onicecandidate","socket","Candidate","payload","dst","oniceconnectionstatechange","ondatachannel","getConnection","ontrack","mediaConnection","_addStreamToMediaConnection","cleanup","peerConnectionNotClosed","dataChannelNotClosed","$888ebbf5208563e2$var$__awaiter","offer","_a","sent","sdpTransform","metadata","$888ebbf5208563e2$var$__assign","serialization","Offer","emitError","WebRTC","err_2","err_1_1","_makeAnswer","answer","Answer","err_3","err_1_2","self","err_4","handleCandidate","ice","err_5","$578c14b9a71d815a$export$23a2a68283c24d80","BaseConnection","_open","$578c14b9a71d815a$var$__extends","$dd23edf1e672497b$export$4a84e95a2324ac29","MediaConnection","_localStream","ID_PREFIX","_negotiator","$888ebbf5208563e2$exports","$dd23edf1e672497b$var$__extends","_remoteStream","remoteStream","handleMessage","$dd23edf1e672497b$var$__assign","_payload","messages","_getMessages","messages_1","$dd23edf1e672497b$var$__values","messages_1_1","_removeConnection","open","$578c14b9a71d815a$exports","$04c92a1ce8c305f5$export$c6913ae0ed687038","EncodingQueue","fileReader","_queue","_processing","doNextTask","onerror","destroy","$04c92a1ce8c305f5$var$__extends","queue","enque","processing","abort","$b35592229fc9f4e5$export$d365f7ad9d7df9c9","DataConnection","_buffer","_bufferSize","_buffering","_chunkedData","_encodingQueue","$04c92a1ce8c305f5$exports","Binary","ab","_bufferedSend","$b35592229fc9f4e5$var$__extends","_dc","_configureDataChannel","_handleDataMessage","datatype","deserializedData","BinaryUTF8","unpackedData","_handleChunk","chunkInfo","count","data_1","chunked","_sendChunks","msg","_trySend","bufferedAmount","MAX_BUFFERED_AMOUNT","_tryBuffer","blobs","blobs_1","$b35592229fc9f4e5$var$__values","blobs_1_1","blob_1","API","$52d4a8cd1c0c728c$export$2c4e825dc9120f87","_options","_buildRequest","URL","searchParams","now","fetch","href","referrerPolicy","retrieveId","$52d4a8cd1c0c728c$var$__awaiter","status","text","error_1","pathError","listAllPeers","helpfulError","json","error_2","$6e08d7a90aed3896$var$PeerError","PeerError","$6e08d7a90aed3896$var$__extends","$6e08d7a90aed3896$export$ecd1fc136c422448","Peer","userId","_lastServerId","_destroyed","_connections","_lostMessages","$6e08d7a90aed3896$var$__assign","debug","DEFAULT_KEY","hostname","logFunction","_api","$52d4a8cd1c0c728c$exports","_createServerConnection","_delayedAbort","InvalidID","_initialize","_abort","ServerError","BrowserIncompatible","plainConnections","_b","$6e08d7a90aed3896$var$__values","_c","_d","$6e08d7a90aed3896$var$__read","k","v","$58b7c29ff2b02b44$exports","_handleMessage","SocketError","disconnected","Network","disconnect","Close","SocketClosed","src","Open","IdTaken","UnavailableID","InvalidKey","Leave","_cleanupPeer","Expire","PeerUnavailable","$dd23edf1e672497b$exports","_addConnection","$b35592229fc9f4e5$exports","message_1","_storeMessage","connect","connections","connections_1","connections_1_1","destroyed","connections_2","connections_2_1","currentId","reconnect","_","peers","peerjs","$6e08d7a90aed3896$exports","util"],"version":3,"file":"peerjs.min.js.map"}
| ver. 1.1 | |
.
| PHP 8.4.18 | Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ñтраницы: 0.03 |
proxy
|
phpinfo
|
ÐаÑтройка